找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: sicky111

[求助] 如何用对话框来控制四边形倒角

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-13 23:20:18 | 显示全部楼层
sicky111 发表于 2013-5-13 23:16
非常感谢,但是测试还是有问题。错误: 参数类型错误: lselsetp nil
只有新开图档第一次默认倒左上角的R ...

程序开发中,点的“排序”是很重要的,给你个思路,你要自己写个函数,就是不管什么情况,你能保证你需要的点是按固定要求排序好的。

比如你的四边形,你要找到X最小,Y最小的点 作为表的第一个点,然后把多边形的点从这个点开始逆时针排序。

这样以后应用的时候,你就知道哪个点是什么位置了,比如上面,第一个点就是左下点(你认为的),第二个就是右下点。。。。
给你个我的函数库里面的函数,里面有XDRX_API的函数,不过是排序函数,你可以根据思路,用VL-SORT替代它。

[pcode=lisp,true]
;|
   返回点表的X最小,Y最小
|;
(defun $XDLSP_Points_MinX->MinY (pts / ptl box n disy disx old new ptl)
  (setq box (apply
              'xdrx_pointsbox
              pts
            )
  )
  (if (not (xdrx_iswcs))
    (setq box ($XDLSP_Points_ucs2wcs ($XDLSP_Points_AddZ box 0.0)))
  )
  (foreach n pts
    (setq disy (abs (xdrx_p2ldist n (car box) (cadr box)))
          disx (abs (xdrx_p2ldist n (car box) (last box)))
          disx (atof (rtos disx 2 3))
          disy (atof (rtos disy 2 3))
    )
    (if (setq old (assoc disx ptl))
      (progn
        (setq new (list disx (cons (list disy n) (cadr old)))
              ptl (subst
                    new
                    old
                    ptl
                  )
        )
      )
      (progn
        (setq ptl (cons (list disx (list (list disy n))) ptl))
      )
    )
  )
  (cadar (apply
           'xdrx_rlistsort2
           (cadar (apply
                    'xdrx_rlistsort2
                    ptl
                  )
           )
         )
  )
)

[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-14 00:07:34 | 显示全部楼层
sicky111 发表于 2013-5-13 23:05
G版您好,我现在只考虑水平的四边形,不考虑带斜度的,如果有带斜度,可以先将四边形转正,倒完角后再旋 ...

四边形即使是倾斜的,13楼已给出判断的明示!

点评

是的,可以那样理解。  发表于 2013-5-14 00:51
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-14 00:39:50 | 显示全部楼层
[pcode=lisp,true](defun Pts:Minxy (pts)
  (car (vl-sort        pts
                '(lambda (e1 e2)
                   (if (equal (car e1) (car e2) 1e-10)
                     (< (cadr e1) (cadr e2))
                     (< (car e1) (car e2))
                   )
                 )
       )
  )
)[/pcode]

点评

谢谢您。  发表于 2013-5-14 00:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-14 08:11:49 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-5-14 08:15 编辑

对旋转的或者多边形,好像这个更符合题意(Y最小、X最小),楼上的函数是获取点集最左侧的点
  1. (defun Pts:MinXY (pts / miny)
  2.   (setq        miny (apply 'min (mapcar 'cadr pts))
  3.         pts  (vl-remove-if '(lambda (x) (/= (cadr x) miny)) pts) ;_Points of MinY
  4.   )
  5.   (if (= (length pts) 1)
  6.     (car pts)
  7.     (car (vl-sort pts (lambda (a b) (< (car a) (car b))))) ;_MinX+MinY
  8.   )
  9. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-25 14:35 , Processed in 0.408226 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表