rmr jam 发表于 2022-7-5 18:28:24

插入具有属性a的块

我被要求想出一种方法,将仪器气泡(用3行单独的文本圈)替换为一个在一大组图形上具有属性的块。图纸上可能有20个不同的仪器气泡。我希望能够在每个位置插入新块,当它要求第一个属性值时,选择一个现有的文本字符串来填充该值。然后提示输入第二个值,然后是第三个值。然后,我可以将新块放置在旧圆圈/文本的位置。然后我想删除旧的线/圆。我搜索了一个现有的lsp例程,它可能会做一些类似的事情。
这是我到目前为止提出的。从我在这里找到的一个文件开始。我意识到这可能不是做这件事的最佳方式,任何帮助或建议都将不胜感激。
 
这正是我想要的,但我有几个问题。我正在选择一个围绕旧圆圈/文本的擦除窗口。当它到达lsp的那个部分时,它允许我为我的窗口选择2个点,但我在做时看不到选择框。有没有更好的方法可以看到选择框?

rmr jam 发表于 2022-7-5 18:33:49

;定义函数-instbub,用ibblk激活
(定义c:ibb()
;定义picktext以供以后在脚本中使用
(defun picktext()(setq en1(car(entsel“\n选择文本:”)))(setq el1(entget en1))
(如果(=(cdr(assoc 0 el1))“文本”)
(setq ans(assoc 1 el1))
)
) ;结束defun
(命令“osnap”“cen”)
;将pt标识为instbub的插入点
(while(setq pt(getpoint“\n点击插入点:”))
;从文本元素获取单元名称
(picktext)
(setq unitname ans)
;从文本元素获取仪器类型
(picktext)
(setq INST ans型)
;从文本元素获取仪器编号
(picktext)
(setq INSTNUM ans)
; 根据上面存储的信息插入仪器气泡
(命令“attdia”“0”)
(命令“-insert”“instrub.DWG”“\u NON”pt“1”“1”“0”(cdr unitname)(cdr insttype)(cdr instnumb))
(命令“osnap”“off”)
(命令“ERASE”“w”(getpoint)(getpoint)“R”“L”)
(命令“redraw”)
)
(普林斯)
)

Lt Dan's l 发表于 2022-7-5 18:36:51

你有gif录音机吗?文本字符串(其内容)是什么?文字在圆圈内吗?
 
 
 
 
:编辑(修复错误)
 
(defun c:test ( / *error* rb:insertblock rb:put_attributes ss->lst ss blckname )
(defun *error* ( msg )
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ)
)
(defun rb:insertblock ( activespace blockname layer insertionpoint scale rotation vla-object / block )
(if
   (setq block
   (vla-insertblock activespace
       (vlax-3d-point insertionpoint)
       blockname scale scale scale rotation
   )
   )
   (progn
   (and (tblsearch "layer" layer)
       (vla-put-layer block layer)
   )
   (if vla-object
       block
       (handent (vla-get-handle block))
   )
   )
)
)
(defun ss->lst ( ss flag / id lst )
(if (eq 'PICKSET (type ss))
   (repeat (setq id (sslength ss))
   (
       (lambda ( name )
         (setq lst
         (cons
             (if flag (vlax-ename->vla-object name)
               name
             )lst
         )
         )
       )(ssname ss (setq id (1- id)))
   )
   )
)
)
(defun rb:put_attributes ( block lst )
(and (vlax-method-applicable-p block 'getattributes)
   (foreach x (vlax-invoke block 'getattributes)
   (foreach a lst
       (if
         (eq (strcase (car a))
         (strcase (vla-get-tagstring x))
         ) (vlax-put x 'textstring (cdr a))
       )
   )
   )
)
)
(if
   (and
   (or
       (and (tblsearch "block" "instrbub") (setq blckname "instrbub"))
       (findfile "instrbub.DWG")
       (alert "Block \"instrbub\" is missing!")
   )
   (setq ss (ss->lst (ssget '((0 . "circle"))) t))
   )
   (progn
   (foreach x ss
       (rb:put_attributes
         (rb:insertblock
         (vla-get-modelspace
             (vla-get-activedocument (vlax-get-acad-object))
         )
         (setq blckname
             (cond ( blckname "wallball2" )
               ( (findfile "wallball2") )
             )
         )
         (getvar 'clayer)   ;layer
         (vlax-get x 'Center) ;location
            1.                  ;scale
            0.                  ;rotation
            t                   ;return vla-object
         )
         (list
         (cons "tagname1"                               ;attribute tag
               "text to add to \"tagname1\" attribute";text for attribute
         )
         (cons
             "tagname2"                               ;attribute tag
             "text to add to \"tagname2\" attribute";text for attribute
         )
         )
       ) (vla-delete x)
   )
   )
) (princ)
)

rmr jam 发表于 2022-7-5 18:41:07

我没有gif录音机。我想做的是用一个块替换图形上的一个符号,这个符号是一个圆圈,里面有3行文字,其中3行是属性(instrub.dwg)。每个图形上可能会出现50个不同的符号,我有大约1000个图形要做。我已经得到了lisp,我一直在努力工作,它是相当好的工作,但如果有一个更有效的方法,我愿意使用它。我正在查看你发布的代码,但我需要一段时间来整理你在那里做了什么。谢谢你的帮助。
 
 
以下是我的最新迭代:
 
 
;定义函数-instbub,用ibb激活
(定义c:ibb()
;定义picktext以供以后在脚本中使用
(defun picktext()(setq en1(car(entsel“\n选择单元文本:”))(setq el1(entget en1))
(如果(=(cdr(assoc 0 el1))“文本”)
(setq ans(assoc 1 el1))
)
) ;结束defun
(defun picktext2()(setq en1(car(entsel“\n选择类型文本:”)))(setq el1(entget en1))
(如果(=(cdr(assoc 0 el1))“文本”)
(setq ans(assoc 1 el1))
)
) ;结束defun
(defun picktext3()(setq en1(car(entsel“\n选择Numb text:)))(setq el1(entget en1))
(如果(=(cdr(assoc 0 el1))“文本”)
(setq ans(assoc 1 el1))
)
) ;结束defun
(命令“osnap”“cen”)
;将pt标识为instbub的插入点
(while(setq pt(getpoint“\n点击插入点:”))
;从文本元素获取单元名称
(picktext)
(setq unitname ans)
;从文本元素获取仪器类型
(picktext2)
(setq INST ans型)
;从文本元素获取仪器编号
(picktext3)
(setq INSTNUM ans)
; 根据上面存储的信息插入仪器气泡
(命令“attdia”“0”)
(命令“-insert”“instrub.DWG”“\u NON”pt“1”“1”“0”(cdr unitname)(cdr insttype)(cdr instnumb))
(命令“osnap”“off”)
(setq old(ssget))
(命令“ERASE”old“R”“L”)
(命令“osnap”“cen”)
(命令“redraw”)
)
(普林斯)
)

rmr jam 发表于 2022-7-5 18:42:05

我附上一个示例图纸。底部的4个圆圈是我试图修复的。它们被画成一个圆圈和文字。我希望它们与上面的圆形相同,具有文本的属性值。希望这能澄清我想做什么。
实例图纸

BIGAL 发表于 2022-7-5 18:44:48

您应该只能在文本位于内部时拾取圆,这样ssget就会找到,y插入值上的排序将确定其正确顺序,因为您有对象只需对所有对象使用erase,所以它们就消失了,当您拾取时,您设置了一个变量obj1 obj2 obj3,实体名称为erase obj1 obj2 obj3 OBJ4。与圆心相同,其检索为assoc 10,而不是使用osnap。
 
正如上面的帖子所指出的那样,先选择文本,然后插入,或者现在你有了值,就更新属性。
 
我个人一次性完成所有更改!选择一个圆,返回图层名,或根据您的图纸选择revcloud和hydrogen,建立图层名列表,然后一切都会完成,而不是五分钟的代码抱歉。
 
我相信ssget不能使用圆作为内部选择,任何人请纠正我,所以你需要一个方面的搜索来使用ssget“WP”查找文本对象。正好有一个弧面lisp,我可以改变。
 
最后,周末可能会下雨,所以我可能有一些时间。但其他人请站出来。

BIGAL 发表于 2022-7-5 18:47:36

对于任何感兴趣的人
 
来自帮助
(ssget“WP”pt\U列表)创建由pt\U列表定义的多边形内所有实体的选择集
 

; converts an arc to a series of straights
; next version circles
(vl-load-com)
(setq oldsnap (getvar "osmode"))
(setvar "osmode" 0)
(setq oldecho (getvar "cmdecho"))
(setvar "cmdecho" 0)

(while (setq ent (entsel "\nPick arc: "))
(setq obj (vlax-ename->vla-object (car ent)))
(if (= div nil) (setq div (getint "\nEnter number of chords: ")))
   
(setqendpt (vlax-curve-getEndPoint obj)
    totlen (vlax-curve-getDistAtPoint obj endpt)
    arclen (/ totlen div)
    chrdpt (vlax-curve-getStartPoint obj)
    num 1   
)

(repeat div
(setq newpt (vlax-curve-getPointatDist obj (* arclen num)))
(command "line" chrdpt newpt "")
(setq num (+ num 1))   
(setq chrdpt newpt)
) ;repeat
(setq objlst (cons obj objlst))
) ; end while

;(vlax-for objdel objlst (vlax-deleteobjdel))

(setvar "cmdecho" oldecho)

(setvar "osmode" oldsnap)

(princ)

ttray33y 发表于 2022-7-5 18:53:48

 
所以你试图用红色气球的currnet仪器标签来替换所有红色的仪器符号/气泡,即BLRCL-&BLDIS-,以Instrub“蓝色”代替,对吗?
 
我确实遇到过这种情况,特别是对于新的起草者,在我的项目中进行p&id。。

ttray33y 发表于 2022-7-5 18:54:13

使用的Lisp:
Ricky Medley的变形
块替换器
 
命令:
嬗变
cg公司
移动“文字/多行文字”
 
请参阅随附的gif。
我很乐意随时帮你清理那些图纸,只要给我买杯啤酒,顺便说一句,我也做p&ID。
文本到att block bubs。拉链
 
此处显示GIF演示

rmr jam 发表于 2022-7-5 18:59:33

 
 
 
不完全是这样。在过去的20年里,我有1000张由多人制作/修改的图纸,但这个符号没有标准。一些是BLRCL,或者BLDIS,包含3个文本字符串,一些只是一个包含文本的圆,其他的是一个具有不同名称的块。没有太多的一致性。我也许可以使用你发送的文件。非常感谢。
页: [1] 2
查看完整版本: 插入具有属性a的块