基于多段线分割块
大家好,经过近一个月的搜索、阅读和编码,我有点放弃了,刚刚注册了一个帐户,在这里寻求帮助,任何建议都将不胜感激!!我一直在尝试的是根据内部的小多段线矩形分割块,闭合的多段线/矩形具有相同的大小。一个矩形中包含的任何属性标记都应在同一位置创建为一个块。最后,一些较小的区块将取代旧的单个区块。
例如,我想将这个单个块(附加)转换为6个具有属性的单独块,每个块的标记都会更新:
图纸1.dwg
最初,我的想法是根据内部实体将它们分开,我尝试使用nentsel、entnext、burst、insert编写一些lisp,但效果并不好,因为我有数千个这样的块,有时6个组合成一个,有时3个组合在一起,实体并不总是在数据库中从上到下创建。这就是为什么我开始研究“多段线”,但不知道如何使其工作,因为我只是autolisp的初学者
请帮忙! 使用此
(setq obj (vlax-ename->vla-object (car (entsel))))
(vla-GetBoundingBox obj 'minpoint 'maxpoint)
(setq minpt (vlax-safearray->listminpoint))
(setq maxpt (vlax-safearray->listmaxpoint))
这样可以找到块的角。然后冲破障碍。使用co-ords可以创建多段线的选择集,然后找到其中的文本。
现在,用文本作为属性(如tag1 tag2等)制作一个pline块,并将属性值填充到文本值中。
唷!
中间需要很多代码。
一个开始。
(setq sspl (ssget "CP" (list minpt maxpt)))
; Text in polygons
; By Alan H may 2013
(vl-load-com)
(defun getcoords (ent)
(vlax-safearray->list
(vlax-variant-value
(vlax-get-property
(vlax-ename->vla-object ent)
"Coordinates"
)
)
)
)
(defun co-ords2xy ()
; convert now to a list of xy as co-ords are x y x y x y if 3d x y z x y z
(setq numb (/ (length co-ords) 2))
(setq I 0)
(repeat numb
(setq xy (list (nth I co-ords)(nth (+ I 1) co-ords) ))
(setq coordsxy (cons xy coordsxy))
(setq I (+ I 2))
) ; end repeat
) ; end defun
; program starts here
; choose output file change acdatemp to what you want
(setq fname (strcat "c:/alan/" (getstring "\nEnter file name ")))
(setq fout (open fname "w"))
(setq plobjs (ssget (list (cons 0 "lwpolyline"))))
(setq numb1 (sslength plobjs))
(setq x numb1)
(repeat numb1
(setq obj (ssname plobjs (setq x (- x 1))))
(setq co-ords (getcoords obj))
(co-ords2xy)
; write pline co-ords here
(setq numb3 (length co-ords))
(setq z numb3)
(setq ansco-ords "")
(repeat numb3
(setq ansco-ords (strcat ansco-ords (rtos (nth (setq z (- z 1)) co-ords) 2 3 ) " " ))
)
(setq ans (strcat "Pline " ansco-ords))
(write-line ans fout)
(setq ansco-ords "")
(setq ss (ssget "WP" coordsxy (list (cons 0 "Text,Mtext")))) ; selection set of text within polygon
(if (= ss nil)
(princ "\nnothing inside")
(progn
(setq coordsxy nil) ; reset for next time
(setq numb2 (sslength ss))
(setq y numb2)
(repeat numb2
(setq anstext (vlax-get-property (vlax-ename->vla-object (ssname ss (setq y (- y 1)))) "Textstring"))
(princ anstext) ; change to write text to file
(write-line (strcat "text " anstext) fout)
(princ "\n")
) ; end repeat2
(setq ss nil) ; reset for next poly
)
)
) ; end repeat1
(close fout)
(princ)
嗨,比格尔,谢谢你的回复
但我尝试了vla GetBoundingBox并返回“nil”
有什么想法吗? 在所附的DWG中,小的多段线矩形位于块内,这意味着通常我们必须打开块编辑器才能选择它们,对我来说困难的是获得这些矩形,然后选择由每个矩形绑定的属性并创建一个新块。 拾取块。我测试了你的图纸。然后使用burst。重读我帖子中的步骤。 NOSCC公司
附上最终结果示例。 如果块中的矩形始终相同,并且每个矩形的属性数固定,则算法可能会简单得多。
根据名称和/或图层过滤器选择所有插入。
迭代选择集。
对于每个现有插入:
[列表]
[*]收集列表中的属性值。
[*]根据该列表插入一个或多个新的标准块并填写属性。
[*]擦除原始插入。
[/列表] 嗨,马拉托维奇,这里附上一个示例结果
示例结果。图纸 嗨,罗伊
问题是我们如何收集由块内每个矩形绑定的属性?
请参见此处的示例结果示例。图纸
我手动使用了一些代码,首先我选择了大的组合块,然后我引爆了它,然后我再次使用下面的代码,我手动窗口选择了第一个矩形和属性,将这些文本转换为属性。然后我再次选择这些属性并键入命令“block”来创建一个新块。我们如何为图形中的5000个组合块自动执行此操作?
(默认c:txt2att(/el i ss st bk)(vl负载com)
;(setq bk(ssget’((0。“插入”)))
;(c:突发)
(if(setq ss(ssget“_:L”'((0。“TEXT”))));“:L”拒绝锁定层上的实体
(重复(setq i(sslength ss))
(setq el(entget(ssname ss(setq i(1-i)))
st(vl字符串翻译“”(cdr(assoc 1 el)))
) ;setq结束
(if(and(equal(strlen st)11)(vl字符串搜索“-”st))
(setq st“SOR”)
(setq st“数量”)
) ; if结束
(entmakex)
(附加'((0。“ATTDEF”))
(vl-remove if’(lambda(pair)(member(car pair)’(0 100 73)))el);vl re结束
(列表
(cons 70 0)
(cons 74(cdr(assoc 73 el)))
(cons 2 st)
(cons 3 st)
)
)
) ; entmakex结束
(entdel(cdr(assoc-1 el));这一行的末尾
) ; 重复结束
) ;if结束
(普林斯)
) 马拉托维奇查看第1张post图纸和最终图纸。
看看这张图片,我想解释一下序列。
页:
[1]
2