Cylis0509 发表于 2022-7-5 16:23:56

在所有类型的文本中搜索f

大家好,
 
我需要一些帮助来修改我找到的lisp。我需要打开一个区域,让它找到所有多行文字、多重引线和维度,并查找强制文字颜色。如果它发现任何强制文本,只需将强制文本更改为另一种颜色。
 
下面的代码对于多行文字和多重引线非常有效,但我需要修改两件事:
 
[列表=1]
[*]我需要能够打开一个区域,目前我必须单独选择每个项目。我知道我需要从entsel到ssget,但无论如何设置ssget,我总是会遇到选择错误。
 
 
[*]我还需要在例程中包含维度文本。它目前不适用于维度。
[/列表]
 
任何帮助都将不胜感激。
 
非常感谢。
 

(defun c:test2        (/ en_ename en_obj en_txt)

(vl-load-com)

(if (and (setq en_ename (car (entsel "\nSelect Objects: ")))

(setq en_obj (vlax-ename->vla-object en_ename))

)

(progn (setq en_txt (vla-get-TextString en_obj))

(while (vl-string-search "\\C1;" en_txt) (setq en_txt (vl-string-subst "\\C3;" "\\C1;" en_txt)))

(vla-put-textstring en_obj en_txt)

)

)

(princ)

)

BIGAL 发表于 2022-7-5 16:37:12

一些提示,未经测试!
 

(setq ss (ssget (list (cons 0 "Mtext,Leader,dimension"))))
(repeat (setq x (sslength ss))
(setq en_obj (vlax-ename->vla-object (ssname ss (setq x (- x 1)))))
(setq en_txt (vla-get-TextString en_obj))
   (if ( = (vl-string-search "\\C1;" en_txt) T)
   (progn
   (setq en_txt (vl-string-subst "\\C3;" "\\C1;" en_txt))
   (vla-put-textstring en_obj en_txt)
   )
   )
) ; end repeat

Cylis0509 发表于 2022-7-5 16:42:32

比加尔,
 
非常感谢您提供的信息,有两件事。。。如果我将维度保留在:
 
(setq ss(ssget(列表(cons 0“多行文字,引线,维度”)))
 
我得到:选择对象:;错误:ActiveX服务器返回错误:未知名称:TextString
 
如果我移除并离开:
 
(setq ss(ssget(列表(cons 0“多行文字,前导”)))
 
我没有收到错误,但它不起作用。。。。我在命令提示符下什么也没有得到。我会继续玩它,但任何帮助都将不胜感激。
 
截至目前的代码:

(defun c:test7        (/ en_ename en_obj en_txt)

(vl-load-com)

(setq ss (ssget (list (cons 0 "Mtext,multiLeader"))))

(repeat (setq x (sslength ss))

        (setq en_obj (vlax-ename->vla-object (ssname ss (setq x (- x 1)))))
        (setq en_txt (vla-get-TextString en_obj))
   
                (if ( = (vl-string-search "\\C1;" en_txt) T)

                        (progn
                        (setq en_txt (vl-string-subst "\\C3;" "\\C1;" en_txt))
                        (vla-put-textstring en_obj en_txt)
                        )

                )

)

(princ)

)

Cylis0509 发表于 2022-7-5 16:47:03

比加尔,
 
好的,所以我发得有点快。很抱歉。通过将你的代码和我的代码结合起来,我解决了第二个问题。但我仍然需要一些尺寸方面的帮助。我认为这必须以不同的方式处理,因为我不确定维度中的文本是否被视为文本字符串。不过我只是在猜测。
 

(defun c:test7        (/ en_ename en_obj en_txt)

(vl-load-com)

(setq ss (ssget (list (cons 0 "Mtext,multiLeader"))))

(repeat (setq x (sslength ss))

        (setq en_obj (vlax-ename->vla-object (ssname ss (setq x (- x 1)))))
        (setq en_txt (vla-get-TextString en_obj))
   

                (progn
                       
                        (setq en_txt (vla-get-TextString en_obj))
                       
                        (while (vl-string-search "\\C1;" en_txt)
                                (setq en_txt (vl-string-subst "\\C3;" "\\C1;" en_txt)))

                        (vla-put-textstring en_obj en_txt)

                )

)

(princ)

)

Cylis0509 发表于 2022-7-5 16:54:54

好吧,那么。。。这是我到目前为止所拥有的,它是有效的!!!某种程度上。
 
我得到一个错误:;错误:错误的参数类型:VLA-OBJECT
 
我能拼凑起来可能是因为我的选择集。我对选择集很陌生,我知道我这样做是不对的。我似乎不知道该怎么做才对。
 
由于我需要处理不同于多行文字和多重引线的维度,如何通过窗口执行一个选择并设置两个单独的参数。
 
现在,LiSP将要求我执行一个选择,然后执行另一个选择。
 

(defun c:test11        (/ ss_mm ss_dm mm_obj mm_txt)

(vl-load-com)

(setq ss_mm (ssget (list (cons 0 "MTEXT,MULTILEADER"))))
(setq ss_dm (ssget (list (cons 0 "DIMENSION"))))


(repeat (setq x_mm (sslength ss_mm))

        (setq mm_obj (vlax-ename->vla-object (ssname ss_mm (setq x_mm (- x_mm 1)))))
        (setq mm_txt (vla-get-TextString mm_obj))
       
                (progn
                       
                        (while (vl-string-search "\\C1;" mm_txt)
                                (setq mm_txt (vl-string-subst "\\C3;" "\\C1;" mm_txt)))

                        (vla-put-textstring mm_obj mm_txt)

                )
)

(repeat (setq x_dm (sslength ss_dm))

        (setq dm_obj (vlax-ename->vla-object (ssname ss_dm (setq x_dm (- x_dm 1)))))
        (setq dm_txt (vla-get-textoverride dm_obj))
   
                (progn
                                                       
                        (while (vl-string-search "\\C1;" dm_txt)
                                (setq dm_txt (vl-string-subst "\\C3;" "\\C1;" dm_txt)))

                        (vla-put-textoverride dm_obj dm_txt)

                )
   
)

(vla-delete ss_dm)
(vla-delete ss_mm)

(princ)

)

Grrr 发表于 2022-7-5 17:06:22


(defun C:test11        ( / fBIGAL SS i o s )

; (fBIGAL s "\\C1;" "\\C3;")
(defun fBIGAL ( s sr su ) (while (vl-string-search sr s) (setq s (vl-string-subst su sr s)) ) )

(if (setq SS (ssget "_:L-I" (list (cons 0 "MTEXT,MULTILEADER,DIMENSION"))))
   (repeat (setq i (sslength SS))
   (if (setq o (vlax-ename->vla-object (ssname SS (setq i (1- i)))))
       (or
         (and
         (vlax-property-available-p o 'TextString)
         (setq s (fBIGAL (vla-get-TextString o) "\\C1;" "\\C3;"))
         (vla-put-TextString o s)
         )
         (and
         (vlax-property-available-p o 'TextOverride)
         (setq s (fBIGAL (vla-get-TextOverride o) "\\C1;" "\\C3;"))
         (vla-put-TextOverride o s)
         )
       ); or
   ); if
   ); repeat
); if SS
(princ)
) (vl-load-com) (princ)

Cylis0509 发表于 2022-7-5 17:11:33

吼叫声
 
非常感谢!!我已经玩了好几天了。它工作得很好。这个周末我会仔细分析一下,看看你是怎么做到的。再次感谢!!

BIGAL 发表于 2022-7-5 17:22:57

Cylis0509当您试图找到正确的名称以及在顶层可以直接访问哪些属性时,这个lisp是您最好的朋友。在某些情况下,当您沿着对象数据树向下时,可以继续转储。还可以查看SSGET提供的一些选项,如X W F和http://www.lee-mac.com有一个关于各种其他选项的很好的教程,比如“L-I”
 
重新剖析(ssname SS(setq i(1-i k)а)])项目编号从总数中减去1的原因是选择集从零开始,而不是从1开始。
 

;;; Dump all methods and properties for selected objects            ;
;;;===================================================================;
;;; DumpIt                                                            ;
;;;-------------------------------------------------------------------;
;;;===================================================================;
(defun C:DumpIt ( / ent)
(while (setq ent (entsel))
   (vlax-Dump-Object
   (vlax-Ename->Vla-Object (car ent)) T
   )
)
(textpage)
(princ)
)

Cylis0509 发表于 2022-7-5 17:27:31

比加尔,
 
非常感谢!这Lisp程序是无价之宝。非常感谢。
页: [1]
查看完整版本: 在所有类型的文本中搜索f