明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2383|回复: 10

求助,关于图元排序

[复制链接]
发表于 2004-10-24 19:55:00 | 显示全部楼层 |阅读模式
;各位大侠帮帮忙,看看能否简化一下本程序,
;在不一一取得子表的情况下得到所需要的图元表
;以下是程序
(defun c:test()
(setq n1 10 n2 45 n3 95 n4 115 n5 130 n6 145 n7 160 n8 180)
(setq p1(getpoint"\n请输入明细栏的第一角点:"))
(setq p2(getpoint"\n请输入明细栏的第二角点:"))
(setq x0 (if (< (car p1) (car p2)) (car p1) (car p2)));确定输入点坐标中最小的X坐标值
(setq x1 (+ x0 n1) x2 (+ x0 n2) x3 (+ x0 n3) x4 (+ x0 n4) x5 (+ x0 n5)
x6 (+ x0 n6) x7 (+ x0 n7) x8 (+ x0 n8))
(setq ss (ssget "C" p1 p2 '((0 . "TEXT"))))
(SETQ SSL (SSLENGTH SS) N 0)
(setq el '()
n 0
)
(while (< n ssl)
(setq e (ssname ss n))
(setq el (append el (list e)))
(setq n (+ n 1))
)
;|(setq el (vl-sort el
'(lambda (e1 e2)
(< (cadr (assoc 10 (entget e1)))
(cadr (assoc 10 (entget e2)))
)
)
)
)将图元按X坐标排序
先前的一段代码,后来发现是多此一举|;
(setq en '() en1 '() en2 '() en3 '() en4 '() en5 '() en6 '() en7 '() en8 '() n 0)
(REPEAT SSL
(SETQ E (ENTGET (nth n el)))
(setq alist (textbox e))
(setq l (* 0.5 (abs (- (car (car alist)) (car (cadr alist))))));文字长度的一半
(setq pt (list (+ (car temp) l) (cadr temp) 0));文字的中点
(setq x (car pt));取得文字中点的X值,以便下一步中与栏线X坐标值进行比较,判断该文本中心点落在哪一列中
(formatmain);获取各列图元表的子程序
(SETQ N (+ N 1))
)
(setq en (list en1 en2 ……));需要的按列排序的表
(PRINC)
)
(defun formatmain()
(if (and (> x x0) (< x x1))
(setq en1 (append en1 (list (nth n el))))
)
(if (and (> x x1) (< x x2))
(setq en2 (append en2 (list (nth n e2))))
)
……
省略的部分指的是第三,四……列的文本图元名的表
)
这样做可以达到要求,但如果列数修改的话就要修改程序,很麻烦 我想用MAPCAR函数应该可以在不一一取得子表的情况下得到所需要的图元表 但怎么想也想不出来,大侠们看看如何简化,多谢了! 下面是图例
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2004-10-24 20:01:00 | 显示全部楼层
图片怎么不能上传?再试试


       

本帖子中包含更多资源

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

x
发表于 2004-10-25 08:32:00 | 显示全部楼层
多此一举的那句为什么去掉?那就是最好的方法啊...你想怎么排序????
 楼主| 发表于 2004-10-25 12:41:00 | 显示全部楼层
我要取得的是每一列的图元表的表


如:((第一列图元表)(第二列图元表)……)


所以按x坐标排序没有意义,因为在程序中已经判断了文字中点在哪一列,本身就达到了要求


飞哥,你可能没有看完我的用意
发表于 2004-10-25 14:09:00 | 显示全部楼层
问题是之前的就可以了,后面的就不需要了......


如果你表中一个格中的文字是一个对象,取得所有对象后,先按Y坐标排列,在按X坐标排列,最后的结果就是第一个数字表示列,第二个数字表示行)


(11 12 13 14 ...


         21 22 23 24 ...


         ...


)
 楼主| 发表于 2004-10-25 19:54:00 | 显示全部楼层
飞哥,你说的我有点不懂,我要的表是诸如 如下的:


((a b c) (d        e        f g)……)


其中的字母是图元名,如果第一列中有3个图元,则第一个子表中有3个元素,


如果第二列中有4个图元,则第二个子表中有4个元素


这些子表是按从左到右第一、二……列的顺序来排列的


用我上面的土办法是可以实现的,但如果有十几列,几十列的话,就很麻烦


操作性很差,所以请大家来帮帮忙看看


飞哥,不是我没动脑筋,呵呵,实在能力不及啊
发表于 2004-10-26 08:39:00 | 显示全部楼层
不明白你哪儿不懂...你按我说的做做看,然后看看排好顺序的对象是一种什么样的情况...虽然与你要求的表的形式有些不同,但顺序是完全满足要求的
发表于 2004-10-26 10:03:00 | 显示全部楼层
要求不够明确
 楼主| 发表于 2004-10-26 12:32:00 | 显示全部楼层
不错,按照X排序后,图元顺序是我所要求的,那我怎么知道文字中心的X坐标落在第一列的有几个,第二列的有几个……,那我还是要判断这个对吧,那先前的X排列也就多此一举了,不知你是否明白我的意思?我所需要的表是如((a b c) (d        e        f g)……)这样的每列的图元名构成一个子表,然后所有的子表组成一个总表。


虽然与你要求的表的形式有些不同我说的就是这个,如果是简单排序,也就不会那么复杂了,飞哥可能已经懂了我的意思,无痕大侠你再看看
发表于 2004-10-26 13:17:00 | 显示全部楼层
最后进行一下表处理都不会吗?我的结果是11 12 13 14 ... 21 22 23 24 ... ...)你要的结果(11 12 13 14 ...) (21 22 23 24...) ...)你只要将我的表再遍历一次,过程中跟踪X坐标,如果X坐标发生变化,则重新组表...因为按我说的排列后的对象已经是按顺序一次排好的,所以你需要的在一个子表中的内容是连续的,你不需要判断X坐标是多少,只需要判断有没有变化,有变化后把程序给你写了,你仔细看看吧...(defun com(e1 e2 f p)
   (cond
       ((= f '=) (if (equal e1 e2 p) t nil))
       (t (if (equal e1 e2 p) nil ((eval f) e1 e2)))
   )
);如有错误,用上面的函数代替> < 和=,这个函数允许一定精度控制;用法(com 300.3 300 '> 0.5),返回nil
  1. (defun c:test( / ss ssl i n el el2 elt x)
  2.    (setq ss (ssget   '((0 . "TEXT"))))
  3.    (SETQ SSL (SSLENGTH SS) N 0)
  4.    (setq el '()
  5.   n   0
  6.    )
  7.    (while (< n ssl)
  8.        (setq e (ssname ss n))
  9.        (setq el (append el (list e)))
  10.        (setq n (+ n 1))
  11.    )
  12.    (setq el (vl-sort el '(lambda (e1 e2) (< (caddr (assoc 10 (entget e1)))
  13.                (caddr (assoc 10 (entget e2)))))))
  14.    (setq el (vl-sort el '(lambda (e1 e2) (< (cadr (assoc 10 (entget e1)))
  15.                (cadr (assoc 10 (entget e2)))))))
  16.    (setq i 0 elt nil el2 nil x nil)
  17.    (repeat (length el)
  18.        (setq e (nth i el))
  19.        (if (equal x (cadr (assoc 10 (entget e))) 0.001)
  20.            (setq elt (append elt (list e)))
  21.            (progn
  22.   (if elt (setq el2 (append el2 (list elt))))
  23.   (setq elt (list e)
  24.              x (cadr (assoc 10 (entget e))))
  25.            )
  26.        )
  27.        (setq i (1+ i))
  28.    )
  29.    (setq el2 (append el2 (list elt)))
  30. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-30 08:37 , Processed in 0.181724 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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