Text AutoLISP:选择闭合多段线内的文字,并使用该文字定义块边界

Text AutoLISP:选择闭合多段线内的文字,并使用该文字定义块边界,text,lisp,block,autocad,autolisp,Text,Lisp,Block,Autocad,Autolisp,我有一个楼层平面图,其中有几个房间由封闭的多段线定义。每个多段线(房间号、房间名称等)内都有多个文字注释。 如何制作一个例程来扫描图形,构建一个选择集来查找每个多段线(位于特定图层上),并插入一个具有与这些注释对应的属性的块(房间戳)。 例如,对于每个房间,它将在多段线内插入块“room_stamp”,抓住属于图层“room_name”的多段线内的文本,并更改块内的属性“room_name”以匹配它 任何帮助都是非常宝贵的,因为我刚刚开始使用LIPS例程第一步是获得目标层上所有闭合多段线的选择集

我有一个楼层平面图,其中有几个房间由封闭的多段线定义。每个多段线(房间号、房间名称等)内都有多个文字注释。 如何制作一个例程来扫描图形,构建一个选择集来查找每个多段线(位于特定图层上),并插入一个具有与这些注释对应的属性的块(房间戳)。 例如,对于每个房间,它将在多段线内插入块“room_stamp”,抓住属于图层“room_name”的多段线内的文本,并更改块内的属性“room_name”以匹配它


任何帮助都是非常宝贵的,因为我刚刚开始使用LIPS例程

第一步是获得目标层上所有闭合多段线的选择集-为此,您将使用
ssget
函数和
X
模式字符串参数(无需用户输入即可扫描整个图形数据库),以及图元类型(DXF组0)和图层(DXF组8)上的过滤器列表参数过滤器,以及位编码DXF组70上的可选过滤器,以将选择仅限于闭合多段线-您可能希望参考my以帮助构造此表达式

获取目标图层上的多段线选择集后,您将在该集上进行迭代(有多种方法可以执行此操作),对于每条多段线,您有两个选项之一:

  • 通过向
    ssget
    函数提供
    WP
    CP
    模式字符串、多段线顶点坐标集和适当的过滤器列表,获取所有文本的窗口多边形/交叉多边形选择集(可能限于目标层)

  • 获取活动布局/视口中所有候选文本对象的选择集,并使用光线投射算法或类似算法测试每个文本对象的插入点是否位于多段线的边界内

  • 方法(1)是最简单的,但也可能是最不可靠的,因为<代码> SSGET < /C>函数的图形选择方法只考虑在功能评估时在绘图区域内可见的对象——因此,为了更高精度,在获取多段线所包含对象的选择之前,首先需要缩放到每个多段线,然后恢复上一个视图

    方法(2)更可靠,因为它独立于AutoCAD中图形显示的状态,但速度较慢,因为它需要对整个候选文本对象集进行更多的计算和迭代(除非您通过巧妙地使用预排序来实现分治技术)

    在获取位于多段线内的文本对象集后,您将需要某种方法来区分集中的每个文本对象,以便使用适当的值填充每个属性。这将完全取决于您的数据,例如,每个数据项是否位于其自己的图层上(例如,是否所有房间号都位于其自己的图层上,而所有房间名都位于另一个图层上?),或者您是否可以使用文本内容上的模式匹配从房间名和其他信息中识别房间号


    在确定了适当的值后,插入新的属性块参照(可能在多段线的质心处,或在现有文字对象之一的插入点处)相对简单并使用从文本中获取的值填充块属性-有许多现有的示例。

    非常感谢Lee Mac!按照您的提示找到解决方案。欢迎@user14693180!如果我的答案充分回答了您的问题,请将其标记为解决方案,以便其他查看该网站的人可以看到该问题已解决。