明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5089|回复: 23

图元怎么按照从左到右的位置关系排序?

  [复制链接]
发表于 2004-2-3 19:56:00 | 显示全部楼层 |阅读模式
图元怎么按照从左到右的位置关系排序?
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2004-2-3 20:02:00 | 显示全部楼层
在选择集中排序还是在图形中?
 楼主| 发表于 2004-2-3 22:28:00 | 显示全部楼层
在选择集合中排序!!
 楼主| 发表于 2004-2-4 13:19:00 | 显示全部楼层
下面是我用lisp 写了一个线段的排序程序,与、由于我知道的函数很少,可能走了很多弯路,肯望希望高手门多多指教,本人不胜感激!! ;=====================================
;本程序主要用于线段的图元排序,由无序的ss转换成有序的fs
;本程序运行时坐标系必须是世界坐标系。
;编程 LJC 2004.2.4 唐山
;=====================================
(defun c:stpx( / )
(setq ss0 (ssget '((0 . "line")) ))
(pnb ss0)
(px mxb)
(fs pb lt)
) ;****************构造表生成************
(defun pnb( ss / n pnb q zd md mdx mdy mdz )
(setq n 0)
(setq pnb nil)
(setq mxb nil)
(setq pb nil)
;(setq ss(ssget))
(setq n (sslength ss))
(repeat n
(setq n (- n 1))

(setq name(ssname ss n))
(setq q(entget name))
(setq qd (cdr(assoc 10 q)))
(setq qdx (car qd))
(setq qdy (cadr qd))
(setq qdz(caddr qd))
(setq zd (cdr(assoc 11 q)))
(setq zdx (car zd))
(setq zdy (cadr zd))
(setq zdz(caddr zd)) (setq mdx(+ (/ (- zdx qdx) 2) qdx))
(setq mdy(+ (/ (- zdy qdy) 2) qdy))
(setq mdz(+ (/ (- zdz qdz) 2) qdz))

(setq md(list mdx mdy mdz))
(setq pnb (list mdx name))
( setq pb (cons pnb pb) ) ; (中点x 坐标 图元名)表
(setq mxb (cons mdx mxb)) ; 中点x 坐标表
) )
;***********************中点x坐标排序*******
(defun px( l / lmin lmax )

(setq lt nil)
(setq n(length l))

(repeat n
(setq lmin(apply ' min l))
(setq lmax (apply 'max l))
(setq l(subst lmin lmax l) )
(setq lt(cons lmax lt) )
)

(print lt)
(print) )
;***********************图元排序****************
(defun fs (pb lt / fs a n mdx name )
(setq fs (ssadd))
(setq a 0)
(setq n (length lt))
(repeat n
(print a)
(setq mdx(nth a lt))
(print mdx)
(setq name (cdr (assoc mdx pb)))
(print name)
(setq name (car name))
(print name)
(ssadd name fs)
(setq a (+ a 1))
)
(setq fs0 fs)
(print a)
(print fs)
)
发表于 2004-2-4 14:14:00 | 显示全部楼层
  1. ;|(xss-softx ss) = 选集按dxf10坐标x从小到大排序-------------------------无痕.2004.1
  2.   返回排序后的实体名列表.
  3. ;(xss-sortx (ssget))
  4. ;(vl-cmdf ".move" (nth 3 (xss-sortx (ssget))) "")
  5. |;
  6. (defun xss-sortx (ss / enlst)
  7.    (repeat (setq n (sslength ss))
  8.        (setq enlst (cons (cdr (assoc -1 (entget (ssname ss (setq n (1- n)))))) enlst))
  9.    )
  10.    (vl-sort enlst '(lambda (x y) (< (car (cdr(assoc 10 (entget x)))) (car (cdr(assoc 10 (entget y)))))))
  11. )
 楼主| 发表于 2004-2-4 18:13:00 | 显示全部楼层
1.dxf10是什么意思?我不懂,能帮我解释一下吗?


2. 我希望的是按照图形在屏幕上的位置从左到右排序,


                         但是我用你的程序好象不是我的意思!?
 楼主| 发表于 2004-2-4 18:19:00 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2004-2-4 22:59:00 | 显示全部楼层
  1. ;|(xss-sortbox ss) = 选集按实体box从左到右排序-------------------------无痕.2004.1
  2.   返回排序后的实体名列表.
  3. ;(xss-sortbox (ssget))
  4. ;(vl-cmdf ".move" (nth 3 (xss-sortbox (ssget))) "")
  5. |;
  6. (defun xss-sortbox (ss / enlst)
  7.    (repeat (setq n (sslength ss))
  8.        (setq enlst (cons (cdr (assoc -1 (entget (ssname ss (setq n (1- n)))))) enlst))
  9.    )
  10.    (vl-sort enlst '(lambda (x y) (< (car (xboxcen x)) (car (xboxcen y)))))
  11. )
  12. ;
  13. (defun xboxcen (e)
  14.    (setq eobj (vlax-ename->vla-object e))
  15.    (vla-GetBoundingBox eobj 'minpt 'maxpt)
  16.    (mapcar '(lambda (x y) (/ (+ x y) 2)) (vlax-safearray->list minpt) (vlax-safearray->list maxpt))
  17. )
发表于 2004-2-5 11:37:00 | 显示全部楼层
無痕您好 冒號: 是這樣的. 我也用到排序的程序如下. 由於我的要求也是很簡單的排序, 這個程序對目前的工作剛好達到要求. 我想再加以改進. 就是按實體的長度排序. 由短排到長, 我不知如何完善. 還望您可以在百忙之中抽出寶貴的時間看看. 謝謝. (defun computer0101(/ ss i ssd ssl sone slen ssda ssla)
(setq ss (ssget "x" '((8 . "0"))))
(setq i 0)
(setq ssd (ssadd))
(setq ssl (ssadd))
(repeat (sslength ss)
(setq sone (ssname ss i))
(setq slen(vlax-curve-getdistatparam
(setq env (vlax-ename->vla-object sone)); 取圖素的長度.
(vlax-curve-getendparam env)))
(if (< slen 20)
(setq ssd (ssadd sone ssd))
(setq ssl (ssadd sone ssl)))
(setq i (1+ i))
)
(setq i 0)
(repeat (sslength ssd)
(setq ssda(ssname ssd i))
(entmake (entget ssda))
(entdel ssda)
(setq i (1+ i)))
(setq i 0)
(repeat (sslength ssl)
(setq ssla (ssname ssl i))
(entmake (entget ssla))
(entdel ssla)
(setq i (1+ i)))
(princ))
发表于 2004-2-5 12:49:00 | 显示全部楼层
就是按實體的長度排序. 由短排到長 (defun C:TT (/ SS N LEN_LIST)
(setq SS (ssget '((0 . "*LINE")))
N 0
)
(repeat (sslength SS)
(setq
LEN_LIST (cons (list (setq ENT (ssname SS N))
(vlax-curve-getdistatparam
(setq ENT (vlax-ename->vla-object ENT))
(vlax-curve-getendparam ENT)
)
)
LEN_LIST
)
)
(setq N (1+ N))
)
(vl-sort LEN_LIST
(function (lambda (P1 P2) (< (cadr P1) (cadr P2))))
)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-27 17:51 , Processed in 0.202899 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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