明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4141|回复: 7

[讨论] 请教个选择集排序的问题

[复制链接]
发表于 2013-10-5 20:53 | 显示全部楼层 |阅读模式
本帖最后由 vlisp2012 于 2013-10-9 16:27 编辑

通过ssget获得的选择集的排序,无法很好的控制,每次下面材的时候,都是通过fence,画线选择板块,很繁琐。
我想编辑一个程序,通过x坐标和y坐标来对面材(封闭多段线)排序后,进行板块的编号,得到排序后的选择集如下:
(((434613.0 -21571.4) <图元名: 7ef56e68>) ((441013.0 -21571.4) <图元名: 7ef56e78>) ((433388.0 -21571.4) <图元名: 7ef56e70>) ((441013.0 -19151.4) <图元名: 7ef56e80>) ((439413.0 -19151.4) <图元名: 7ef56e88>) ((436213.0 -19151.4) <图元名: 7ef56e98>) ((434613.0 -19151.4) <图元名: 7ef56ea0>) ((433388.0 -19151.4) <图元名: 7ef56ea8>) ((437813.0 -19151.4) <图元名: 7ef56e90>) ((441013.0 -16711.4) <图元名: 7ef56eb0>) ((439413.0 -16711.4) <图元名: 7ef56eb8>) ((437813.0 -16711.4) <图元名: 7ef56ec0>) ((436213.0 -16711.4) <图元名: 7ef56ec8>) ((434613.0 -16711.4) <图元名: 7ef56ed0>) ((433388.0 -16711.4) <图元名: 7ef56ed8>) ((433388.0 -14031.4) <图元名: 7ef56f08>) ((434613.0 -14031.4) <图元名: 7ef56f00>) ((436213.0 -14031.4) <图元名: 7ef56ef8>) ((437813.0 -14031.4) <图元名: 7ef56ef0>) ((439413.0 -14031.4) <图元名: 7ef56ee8>) ((441013.0 -14031.4) <图元名: 7ef56ee0>))
我想问大家的是,怎样将上表中,为排序而采用的坐标删掉呢?
我想要的表如下:
((<图元名: 7ef56e68>) (<图元名: 7ef56e78>) (<图元名: 7ef56e70>) ( <图元名: 7ef56e80>) ( <图元名: 7ef56e88>) ( <图元名: 7ef56e98>)…… )

程序如下:(defun c:tt ()
    (command "undo" "be")
  (princ "\n 选择四边形:")
  (setq no (getint "\n起始编号<0>:"))
  (if (null no) (setq no 0))
  (setq no_ban (getstring "\n板块编号<1B>:"))
  (if (= no_ban "") (setq no_ban "1B"))
    (princ "\n请选择要排序的实体...")
    (if (setq ss (ssget '((0  .  "LWPOLYLINE"))))
(progn
     ;; 1、获取点位表
     (setq lst '()
    i   0
    lst0 '()
     )
     (repeat (sslength ss)
  (setq en  (ssname ss i))
;;;        ent (entget en)
;;;        pt  (cdr (assoc 10 ent))
                      (setq obj (vlax-ename->vla-object en))
;; 得到包围框   
(setq avc (vla-GetBoundingBox Obj 'minpt 'maxpt))
(setq minPt (vlax-safearray->list minPt)
      maxPt (vlax-safearray->list maxPt)
      PtCen (list (/ (+ (car minpt) (car maxpt)) 2)
    (/ (+ (cadr minpt) (cadr maxpt)) 2)))
(setq lst0 (list PtCen en))
      
      
        
     (setq    lst (cons lst0 lst)
        i   (1+ i)
  )
     )
     ;; 2、排序
     (setq
  lst (vl-sort
   lst
   (function
       (lambda (e1 e2)
    (if (equal (cadr e1) (cadr e2) 50)
        (< (caar e1) (caar e2))
        (< (cadar e1) (cadar e2))
    )
       )
   )
      )
     )
   
)
     
      (bh lst no no_ban)
    )
  
    (princ)
)

请各位大侠帮忙!!!


本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-10-6 08:14 | 显示全部楼层
(mapcar 'cadr lst)
 楼主| 发表于 2013-10-6 13:28 | 显示全部楼层
多谢楼上的,我回家后,试一下。
 楼主| 发表于 2013-10-7 10:34 | 显示全部楼层
本帖最后由 vlisp2012 于 2013-10-11 05:41 编辑

大侠ll_j :我想要的已经达到了,
(<图元名: 7ef56e68> <图元名: 7ef56e78> <图元名: 7ef56e70>  <图元名: 7ef56e80>  <图元名: 7ef56e88>  <图元名: 7ef56e98>…… )
可是怎样把这些图元名的属性按照目前的顺序提出来,得到如下dxf呢:
((-1 . <图元名: 7ef089a0>) (0 . "LWPOLYLINE") (330 . <图元名: 7ef04cf8>) (5 .
"8CC") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "la") (62 . 6) (100 .
"AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 -215.726
-287.372) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 -290.726 -287.372) (40
. 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 -290.726 -387.528) (40 . 0.0) (41 .
0.0) (42 . 0.0) (91 . 0) (10 -215.726 -382.924) (40 . 0.0) (41 . 0.0) (42 .
0.0) (91 . 0) (210 0.0 0.0 1.0))
 楼主| 发表于 2013-10-7 11:17 | 显示全部楼层
成功了。多谢ll_j .
;;1 [功能] 图元列表->选择集 By caiqs
(defun lst->ss (lst / SS X)
    (setq ss (ssadd))
    (last (mapcar '(lambda (x) (ssadd x ss)) lst))
  )
发表于 2013-10-7 12:28 | 显示全部楼层
vlisp2012 发表于 2013-10-7 11:17
成功了。多谢ll_j .
;;1 [功能] 图元列表->选择集 By caiqs
(defun lst->ss (lst / SS X)

这一步最好不要,可以直接对列表中的实体名进行操作,不必再转换为选择集。
转换为选择集有两个缺点,第一是操作不是太方便,毕竟对普通表的操作函数比选择集要多。第二个缺点是选择集中的次序有自己的排列方式,虽然这样顺序进入时顺序是一定的,但一定操作后,顺序可能会发生改变,而这些又是很难发现的。

关于实体名,有一点需要提醒一下,就是实体名实际上是中间含有一个空格的两个字符串,在图中包含这个实体时,这是一个完整的实体名,如果只是照葫芦画瓢地书写出来的实体名,图中并没有,这将是两个单元,用car等操作可能不正确。这种情况在调试程序部分代码时要注意。
 楼主| 发表于 2013-10-7 13:18 | 显示全部楼层
果真被你言重了。如下图:

本帖子中包含更多资源

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

x
发表于 2013-12-20 18:27 | 显示全部楼层
楼上是什么意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-25 17:43 , Processed in 0.309463 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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