CAD_Noob 发表于 2022-7-5 16:03:03

多行文字到属性

有没有更快的方法将格式化的多行文字转换为属性?
 
 
从Revit导出的图形中的房间标记显示为多行文字,我们需要将其转换为标准房间标记属性,其中它将遵循多行文字到属性的任何格式。
 
 
例子:
在多行文字中,它在宋体中高度为500,在属性中也将相同。
 
 
我附上了一个样本文件,虽然属性中文本的高度可能会有所不同。
样品图纸

rlx 发表于 2022-7-5 16:07:07

大家好,欢迎来到这个论坛,
 
 
因为工作,我没有太多时间,无论是“家”还是“这里”都是工作,所以我不能点击一下就完成这一步,但也许其他人可以。我这样做的方式是(Q)选择所有多行文字并分解它们,将所有块放在文字附近,然后使用我的VT实用程序中的行到行功能,它在这个论坛的某个地方,只需搜索我的用户名“RLX”。但它仍然是半手动的,所以如果其他人有更多或完全自动化的例程。。。甚至更好。
 
 
gr.Rlx
 
 
另外,我脑海中有一个链接可以修改以完成这项工作,现在我记得它:
 
 
http://www.cadtutor.net/forum/showthread.php?101120-Help-with-lisp-to-move-text-to-specific-locations-w-a-better-叙事
 
 
它可以自动看到哪些文本属于一个组,因此唯一需要改变的是,不是移动对象,而是将它们的值放在一个块中。也许如果你问作者真的很好。。。我认为这是一个相当精彩的节目!

devitg 发表于 2022-7-5 16:12:16

你好,卡德·努布,你怎么看每组mtex都可以被选中。
我想有很多。
如果你能展示至少4到5个区域,也许会有所帮助。
我认为这样的多行文字,都在同一层,必须在一条多段线内。
如果是这样,可以从每个房间中选择
 
我开始做第一个defun,把文本作为att

devitg 发表于 2022-7-5 16:13:15

我发现一个问题,多行文字没有按顺序绘制。
它是窗口设置的选择中的列表。
 
("XXXX.XX m²" "ROOM NAME" "XX-XXXX" "(XXX)")
 
你可以看到没有自然顺序,向下,也没有向上
 
 
 
 
你做了什么改变吗?

CAD_Noob 发表于 2022-7-5 16:18:44

是的,所有都可以是同一层。我们只需要字体样式和字体高度完全匹配
目前,我正在使用一个我在某处下载的复制文本,在其中,你选择多行文字,然后选择属性,它将匹配多行文字的内容和属性,但它不会匹配样式和高度。
谢谢你的欢迎。我会查一下这个,看看是否有帮助。

CAD_Noob 发表于 2022-7-5 16:21:45

是的,我就是这么看的。不过我可以孤立他们。
是否可以打开选定多行文字的窗口,并在打开窗口后输入块名(我认为最好是在Autocad支持路径中)
我更喜欢房间,然后是(xxx),然后是数字,然后是面积,如果不是太多的要求。

devitg 发表于 2022-7-5 16:23:34

当然,这是一种方法,但正如我所看到的,它们不是一个自然顺序,向下,所以它必须按Y值排序。
 
再次,请给我一个真实的dwg示例,至少4个多行文字组区域中的4个。
 
我想我只需要2到3个用户选择、面积多边形、一个多行文字和样例blk参考就可以做到。然后lisp将完成所有任务。

rlx 发表于 2022-7-5 16:25:21

只是快速:
 
 

(defun c:RoomTag ( / ss tl ip bn)
(vl-load-com)
(princ "\n<<< Select Mtexts >>> ")
(if (and (setq ss (ssget '((0 . "MTEXT")))) (setq ss (sss ss))
   (tblsearch "block" (setq bn "Room_Tag")))
   (progn
   (setq tl (mapcar '(lambda (x) (cdr (assoc 1 (entget x)))) ss)
    ip (cdr (assoc 10 (entget (car ss)))))
   (setvar "ATTREQ" 0)(command-s "-insert" bn ip 1 1 0)
   (mapcar '(lambda (att val) (wai bn att val)) '("RM_TAG" "RM_VENT" "RM_NO." "RM_AREA") tl)
   (mapcar 'entdel ss)
   )
)
)

(defun sss ( %ss )
(vl-sort
   (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
'(lambda (x y) (> (caddr (assoc 10 (entget x))) (caddr (assoc 10 (entget y)))))
)
)
(defun wai (b a v)
(setq a (strcase a) b (ent->vla b))
(vl-some '(lambda (x)(if (= a (strcase (vla-get-tagstring x)))(progn (vla-put-textstring x v) v)))
       (vlax-invoke b 'getattributes)))
(defun ent->vla ( e )
(cond ((= (type e) 'VLA-OBJECT) e)
((= (type e) 'ENAME)(vlax-ename->vla-object e))
((and (= (type e) 'STR) (tblsearch "block" e))
(ent->vla (ssname (ssget "x" (list (cons 0 "INSERT")(cons 2 e))) 0)))
(t nil)
)
)

 
 
我知道,它还有改进的空间。。。
 
 
gr.RLX

CAD_Noob 发表于 2022-7-5 16:29:34

我附上了一个简单的示例计划。
 
 
我试过rlx lisp,但不起作用。但是谢谢你的努力。
非常感谢。
样本。图纸

CAD_Noob 发表于 2022-7-5 16:33:44

@RLX我收到了这个错误:
 
 
 
 
命令:ROOMTAG
>>
选择对象:找到1个
选择对象:找到1个,共2个
选择对象:找到1个,共3个
选择对象:找到1个,共4个
选择对象:
; 错误:无函数定义:WAI
页: [1] 2
查看完整版本: 多行文字到属性