vlisp2012 发表于 2013-10-5 20:53:57

请教个选择集排序的问题

本帖最后由 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)
)

请各位大侠帮忙!!!


ll_j 发表于 2013-10-6 08:14:11

(mapcar 'cadr lst)

vlisp2012 发表于 2013-10-6 13:28:06

多谢楼上的,我回家后,试一下。

vlisp2012 发表于 2013-10-7 10:34:55

本帖最后由 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))

vlisp2012 发表于 2013-10-7 11:17:36

成功了。多谢ll_j .
;;1 [功能] 图元列表->选择集 By caiqs
(defun lst->ss (lst / SS X)
    (setq ss (ssadd))
    (last (mapcar '(lambda (x) (ssadd x ss)) lst))
)

ll_j 发表于 2013-10-7 12:28:45

vlisp2012 发表于 2013-10-7 11:17 static/image/common/back.gif
成功了。多谢ll_j .
;;1 [功能] 图元列表->选择集 By caiqs
(defun lst->ss (lst / SS X)


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

关于实体名,有一点需要提醒一下,就是实体名实际上是中间含有一个空格的两个字符串,在图中包含这个实体时,这是一个完整的实体名,如果只是照葫芦画瓢地书写出来的实体名,图中并没有,这将是两个单元,用car等操作可能不正确。这种情况在调试程序部分代码时要注意。

vlisp2012 发表于 2013-10-7 13:18:24

果真被你言重了。如下图:

junkegg 发表于 2013-12-20 18:27:46

楼上是什么意思
页: [1]
查看完整版本: 请教个选择集排序的问题