乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 47|回复: 7

[编程交流] 帮助排序不同的高度

[复制链接]

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:49:27 | 显示全部楼层 |阅读模式
嗨,我想写一个程序,返回一个特定级别的所有实体的列表。我所拥有的是文本的级别(可能有4个级别高),每个级别都在列中,尽管它们之间的距离不同。请参阅随附的jpeg以了解想法。
 
在每列中,文本居中,具有相同的对齐X坐标(即在DXF组码11中),Y坐标的间距相等。文本列在X或Y方向上彼此之间没有公共距离。
 
因此,我希望我能得到帮助的是,返回一个特定级别上所有实体的列表(即jpeg中的颜色编码)的代码,该列表依赖于开始时设置的级别变量。例如,如果我将这个变量设置为1,它将返回jpeg中黄色的实体(最好按X坐标排序)。变量设置为3将返回绿色实体。(注意,我正在处理的文本不像jpeg那样进行颜色编码)
 
如果没有其他东西,我甚至欢迎伪代码。我目前的想法是:
-创建具有公共X坐标的实体列表。(虽然如果有数百条这样的文本,我不知道该如何存储它们)
-然后按Y坐标对这些列表进行排序,并根据级别变量返回实体。如果级别变量设置为4,并且实体不存在,则它将跳过该列/列表。
 
谢谢你的帮助
 
 
注:我认为这不是很有帮助(我更希望有全新的代码),但这里是我写的。此代码不考虑级别变量,只返回最高文本实体的列表。它变得太乱了,无法再添加任何其他内容。
  1. [color=DimGray][color=Black](defun txtlst (ss / ssLst topEnt highestPoleTextLst)[/color]
  2. [color=Black] (setq ssLst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
  3.      (foreach e1 ssLst
  4.    (setq lst (cons e1 lst))
  5.    (foreach e2 ssLst
  6.      (If (= (cadr (assoc 11 (entget e1))) (cadr (assoc 11 (entget e2))))
  7.        (setq lst (cons e2 lst))))
  8.    (foreach en lst
  9.      (If topEnt
  10.        (If (< (caddr (assoc 11 (entget topEnt))) (caddr (assoc 11 (entget en))))
  11.          (setq topEnt en))
  12.        (setq topEnt en)))
  13.    (If highestPoleTextLst
  14.      (foreach en highestPoleTextLst
  15.        (If (eq topEnt en)
  16.          (If (< (caddr (assoc 11 (entget topEnt))) (caddr (assoc 11 (entget en))))
  17.        (subst en topEnt highestPoleTextLst)
  18.        (setq topEnt nil)))))
  19.    (If topEnt (setq highestPoleTextLst (cons topEnt highestPoleTextLst)))
  20.    (setq lst nil)
  21.    )
  22. highestPoleTextLst[/color]  
  23. [color=Black])[/color][/color]   

134927w7jw6t201xf02tx8.jpg
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:04:50 | 显示全部楼层
Steve-快速提示:查看vl排序函数
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:12:02 | 显示全部楼层
您想要完成的任务的一个类似示例是在这个线程中,将圆排序为行:
 
http://www.cadtutor.net/forum/showthread.php?t=36284
回复

使用道具 举报

2

主题

60

帖子

65

银币

初来乍到

Rank: 1

铜币
7
发表于 2022-7-6 13:19:17 | 显示全部楼层
你好
 
一个例子
 
  1. (defun trier_xy(/ add ele lst tab txt x)
  2. (defun add()
  3.    (setq ele (vl-sort ele '(lambda(a b)(< (cadr (vlax-get a 'insertionpoint))(cadr (vlax-get b 'insertionpoint))))))
  4.    (if tab
  5.      (setq tab (cons ele tab))
  6.      (setq tab (list ele))
  7.    )
  8. )
  9. (if (ssget (list (cons 0 "TEXT,MTEXT")))
  10.    (progn
  11.      (vlax-for txt (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
  12.    (setq lst (cons txt lst))
  13.      )
  14.      (vla-delete sel)
  15.      (foreach txt (vl-sort lst '(lambda(a b)(< (car (vlax-get a 'insertionpoint))(car (vlax-get b 'insertionpoint)))))
  16.    (if (eq (car (vlax-get txt 'insertionpoint)) x)
  17.      (setq ele (cons txt ele))
  18.      (progn
  19.        (add)
  20.        (setq x (car (vlax-get txt 'insertionpoint))
  21.          ele (list txt)
  22.        )
  23.      )
  24.    )
  25.      )
  26.      (add)
  27.    )
  28. )
  29. (reverse tab)
  30. )

+
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:25:36 | 显示全部楼层
嘿,谢谢,你们总是帮我渡过难关。
 
我试着用你的例子,帕特里克。编辑:效果很好!再次感谢。
 
李,谢谢你的提示;关于vl排序,我认为这是不可能的,但可以肯定的是,不能有一个vl排序函数同时按X和Y排序?
我知道使用两个vl排序函数(我应该使用)按一个排序,然后按另一个排序;当使用第二个vl排序函数时,第一个vl排序函数的顺序是否有可能被否定?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:33:10 | 显示全部楼层
我只需要使用一个vl排序,并使用一个选择集来收集与某些文本具有相同x坐标的所有文本进行比较,例如:
 
  1. (if (setq ss (ssget "_X" '((0 . "TEXT,MTEXT"))))
  2. (while (not (zerop (sslength ss)))
  3.    (setq tEnt (ssname ss 0))
  4.    (if (setq nss (ssget "_X" (list '(0 . "TEXT,MTEXT")
  5.                                    '(-4 . "=,*,*") (assoc 11 (entget tEnt)))))
  6.      (progn
  7.        (setq sorted (vl-sort
  8.                       (mapcar 'cadr (ssnamex nss))
  9.                         (function
  10.                           (lambda (a b)
  11.                             (< (caddr (entget a)) (caddr (entget b)))))))
  12.        (mapcar
  13.          (function
  14.            (lambda (x)
  15.              (ssdel x ss))) sorted)
  16.        )
  17.      )
  18.    )
  19. )
  20.                   
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:48:12 | 显示全部楼层
我不知道ssget过滤器可以这样使用。这很有帮助,谢谢。
 
问题是,如果我想手动选择选择集(即删除“_X”)并只选择一次,该怎么办?
 
此外,线路:
如果其他人使用你的代码,你的意思是:
  1. 4
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:52:44 | 显示全部楼层
 
这将稍微困难一些,因为第二个选择集检索数据库中满足要求的所有文本,因此如果用户不再次选择文本,则很难对其进行过滤。
 
另一种方法是使用“_X”方法获取实体列表,然后提示用户进行选择,并删除列表中不在用户选择集中的实体:眨眼:
 
 
是的,对不起-我写得很快。。。似乎太快了。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 03:21 , Processed in 1.485422 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表