设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 529|回复: 1

[研讨] 所有的点按照顺时针方向排序

[复制链接]

点击这里给我发消息

已领礼包: 715个

财富等级: 财运亨通

发表于 2018-4-6 11:22:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 ngc 于 2018-4-6 11:26 编辑

代码产生背景:
       在建筑模型绘图中,由于打灯光的需要,在建筑模型框架的内部需要做,万家灯火的框架,做成蜂窝状,每家窗户都有一个灯,模拟现实的灯光效果,通常是做成层层跑动的灯光,两路或者3路不同颜色变换的灯光,为了达到这种灯光效果,就需要CAD绘图员画出带灯孔的板和带凹槽的卡板,所以这个代码就出现了。对建筑模型行业了解的绘图员,都明白,灯孔板和卡板都是有规律的,所以用代码实现肯定能省不少时间,减少加班时间。
引用猫老师的话:“珍惜生命,提高工作效率”。
下图为:自动画万家灯火的灯孔板和带凹槽的卡板
万家灯火第三版.gif 春婵工具-画卡条.gif
代码的功能:点按照顺时针方向排序
万家灯火第二版【非常重要的一步】.gif

下面是源代码:
(defun ssinters        (sss / i num obj1 obj2 j interpts ptlist)
  (setq        i   0
        num (sslength sss)
  )
  (while (< i (1- num))
    (setq obj1 (ssname sss i)
          obj1 (vlax-ename->vla-object obj1)
          j    (1+ i)
    )
    (while (< j num)
      (setq obj2     (ssname sss j)
            obj2     (vlax-ename->vla-object obj2)
            interpts (vla-intersectwith
                       obj1
                       obj2
                       0
                     )
            interpts (vlax-variant-value interpts)
      )
      (if (> (vlax-safearray-get-u-bound interpts 1) 0)
        (progn
          (setq        interpts
                 (vlax-safearray->list interpts)
          )
          (while (> (length interpts) 0)
            (setq ptlist (cons (list (car interpts)
                                     (cadr interpts)
                                     (caddr interpts)
                               )
                               ptlist
                         )
            )
            (setq interpts (cdddr interpts))
          )
        )
      )
      (setq j (1+ j))
    )
    (setq i (1+ i))
  )
  ptlist
)


(defun HH:ssPts:Sort (ssPts KEY FUZZ / E EN FUN LST N);By 自贡黄明儒
  ;;1 点列表排序
  (defun sortpts (PTS FUN xyz FUZZ)
    (vl-sort pts
      '(lambda (a b)
  (if (not (equal (xyz a) (xyz b) fuzz))
    (fun (xyz a) (xyz b))
  )
       )
    )
  )
  ;;2 排序先后
  (defun sortpts1 (PTS KEY FUZZ)
    (setq Key (vl-string->list Key))
    (foreach xyz (reverse Key)
      (cond ((< xyz 100)
      (setq fun >)
      (setq xyz (nth (- xyz 88) (list car cadr caddr)))
     )
     (T
      (setq fun <)
      (setq xyz (nth (- xyz 120) (list car cadr caddr)))
     )
      )
      (setq Pts (sortpts Pts fun xyz fuzz))
    )
  )
  ;;3 本程序主程序
  (cond
    ((= (type ssPts) 'PICKSET)
     (repeat (setq n (sslength ssPts))
       (if (and (setq e (ssname ssPts (setq n (1- n))))
  (setq en (entget e))
    )
  (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
       )
     )
     (mapcar 'last (sortpts1 lst KEY FUZZ))
    )
    ((Listp ssPts)
      (cond
((vl-consp (car ssPts)) (sortpts1 ssPts KEY FUZZ))
((= (type (car ssPts)) 'ENAME)
  (foreach e ssPts
    (if (setq en (entget e))
      (setq lst (cons (append (cdr (assoc 10 en)) (list e)) lst))
    )
  )
  (mapcar 'last (sortpts1 lst KEY FUZZ))
)
(T
  (cond ((equal key "X") (vl-sort ssPts '>))
        ((equal key "x") (vl-sort ssPts '<))
  )
)
      )
    )
  )
)

;; Clockwise-p  -  Lee Mac
;; Returns T if p1,p2,p3 are clockwise oriented

(defun LM:Clockwise-p ( p1 p2 p3 )
    ((lambda ( n ) (< (car (trans p2 0 n)) (car (trans p1 0 n)))) (mapcar '- p1 p3))
)

;;164.3 [功能] 多段线端点列表 By 自贡黄明儒
;;示例(HH:PtLists (car (entsel)))
(defun HH:PtLists (en)
  (mapcar 'cdr
          (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget en))
  )
)


;(/ osmode_bak clayer_bak ss ss7 ss2 en pts n);猫老师编辑器变量自动生成
(defun c:tt (/ osmode_bak clayer_bak ss ss7 ss2   p1 pts p2 p3 en n ss1  sss ptx lst pt)
;----开始系统变量备份----
(command "undo" "be")
(setvar "cmdecho" 0);_关闭命令提示
(setq osmode_bak (getvar "osmode"));_记录捕捉
(setvar "osmode" 0);_关闭捕捉
(setq clayer_bak (getvar "clayer"));_记录当前图层
;----;----;----;----;----;----;----;----;----
;按照图层分选择集,为了求2个图层对象的交点
(setq ss (ssget))

  (command "select" ss  "")
  (setq ss7 (ssget "p" '((8 . "ngc7"))))

  (command "select" ss "")
  (setq ss2 (ssget "p" '((8 . "ngc2"))))


(setq en (ssname ss7 0))
(setq pts (HH:PtLists en));HH:PtLists多段线端点列表 By 自贡黄明儒
(setq n 0)

(if (< (fix(vlax-curve-getEndParam en)) 2)
    (progn
    (dengg);一条线的时候
        )
)
(if (> (fix(vlax-curve-getEndParam en)) 1)
    (progn
    (deng);多条线的时候
        )
        )


;----结束系统变量还原----
(setvar "osmode" osmode_bak);_还原捕捉
(setvar "clayer" clayer_bak);_还原图层
(setvar "cmdecho" 1);_打开命令提示
(command "undo" "e")
(princ);_关闭程序返回值
  )



;(/ p1 pts p2 p3 en n ss1 ss2 sss ptx lst pt)
(defun deng ()
(setq p1 (nth 0 pts)
      p2 (nth 1 pts)
      p3 (nth 2 pts)
)
(if (= (LM:Clockwise-p p1 p2 p3) nil); 判断顺时针和逆时针Clockwise-p  -  Lee Mac
    (progn (setq pts(reverse pts)))
)
;重复动作
(repeat
   (fix(vlax-curve-getEndParam en))
(command "line" (nth n pts) (nth (1+ n) pts) "")
(setq ss1 (entlast))
(command "select" ss1 ss2 "")
(setq sss (ssget "p" ))
(setq ptx (ssinters sss));ssinters求交点,明经论坛里面的
(command "erase" ss1 "")

(setq lst (append (list  (nth n pts) (nth (1+ n) pts))  ptx))
;下面就是判断线的方向,根据方向,重新排序点
(if (and(= (car(nth n pts)) (car(nth (1+ n) pts)))
        (< (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "y" 0.1)));点排序 HH:ssPts:Sort  By 自贡黄明儒
)
(if (and(= (car(nth n pts)) (car(nth (1+ n) pts)))
        (> (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "Y" 0.1)))
)
(if (and(= (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
        (< (car(nth n pts)) (car(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "x" 0.1)))
)
(if (and(= (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
        (> (car(nth n pts)) (car(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "X" 0.1)))
)
(if (and(< (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
        (< (car(nth n pts)) (car(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "xy" 0.1)))
)
(if (and(> (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
        (> (car(nth n pts)) (car(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "XY" 0.1)))
)
(if (and(> (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
        (< (car(nth n pts)) (car(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "Yx" 0.1)))
)
(if (and(< (cadr(nth n pts)) (cadr(nth (1+ n) pts)))
        (> (car(nth n pts)) (car(nth (1+ n) pts)))
     )
         (progn(setq lst (HH:ssPts:Sort lst "Xy" 0.1)))
)

(command "-layer" "s" "ngc1" "")

(entmake (append    (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)))
      (mapcar '(lambda (pt)(cons 10 pt)) lst ))
  )
  (setq n (1+ n))
)
)


请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:按照顺时针自动画线.lsp 
下载次数:108  文件大小:5.94 KB  售价:10D豆 [记录]
下载权限: 不限 以上  [免费赚D豆]


下载的源代码和上面的一样需要增加图层:ngc1  ngc2   ngc7

希望能得到前辈的指点,上面就是判断线的方向的源代码,根据方向,重新排序点,应该有更加简单的办法,里面函数的出处我都标明了。


春婵模型绘图工具--自动画体块墙面.gif

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 技术引导讨论和指点奖!

查看全部评分

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-4-6 16:24:09 | 显示全部楼层
固定多段线起点和多段线方向就和排序一样,对程序的作用很大。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-11-25 22:07 , Processed in 0.135986 second(s), 34 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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