denverado 发表于 2022-7-6 06:25:42

更改文本LISP例程

大家好!!
我编写了一个LISP例程来更改某些文本。然而如果我想要更改的项目之一在图形中不存在,lisp例程将不起作用。有人能告诉我哪里出了错吗?
 
我的工作电脑不允许我添加文件,所以这是文件的一部分。。。。
 

(defun C:GHJ ; = Text Replace for Complete text/mtext strings, pre-defined content
(/ tss tdata)
(setq tss (ssget "X" (list (cons 1 "*0*VERTICAL BEND"))))
(repeat (sslength tss)
   (setq
   tdata (entget (ssname tss 0))
   tdata (subst (cons 1 "JOINT DEFLECTION") (assoc 1 tdata) tdata)
   ); end setq
   (entmod tdata)
   (ssdel (ssname tss 0) tss)
); end repeat
(setq tss (ssget "X" (list (cons 1 "*4*VERTICAL BEND"))))
(repeat (sslength tss)
   (setq
   tdata (entget (ssname tss 0))
   tdata (subst (cons 1 "2 JOINT DEFLECTIONs") (assoc 1 tdata) tdata)
   ); end setq
   (entmod tdata)
   (ssdel (ssname tss 0) tss)
); end repeat
); end defun
 
如果第一个例子不成立,第二个例子就行不通。

BlackBox 发表于 2022-7-6 06:31:18

 
这是因为您没有使用任何代码逻辑来评估在处理之前是否满足了依赖条件。。。考虑这个例子:

(defun c:FOO (/ ss i eData asso)
(if (setq ss (ssget "_x" '((1 . "*0*VERTICAL BEND,*4*VERTICAL BEND"))))
   (repeat (setq i (sslength ss))
   (entmod
       (subst (cons 1
                  (if (wcmatch (strcase (cdr (setq asso (assoc 1
                                                               (setq eData
                                                                        (entget (ssname ss (setq i (1- i)))
                                                                        )
                                                               )
                                                          )
                                             )
                                          )
                                 )
                                 "*0*VERTICAL BEND"
                        )
                      "JOINT DEFLECTION"
                      "2 JOINT DEFLECTIONs"
                  )
            )
            asso
            eData
       )
   )
   )
)
(princ)
)

 
同样值得注意的是,DXF 1区分大小写,所以一定要考虑到这一点。

Lee Mac 发表于 2022-7-6 06:33:36

除了BlackBox的建议外,我还建议:

(defun c:ghj ( / enx idx sel str )
   (if (setq sel (ssget "_X" '((0 . "TEXT,MTEXT") (1 . "**VERTICAL BEND"))))
       (repeat (setq idx (sslength sel))
         (setq enx (entget (ssname sel (setq idx (1- idx))))
               str (assoc 1 enx)
         )
         (entmod
               (subst
                   (if (wcmatch (strcase (cdr str)) "*0*")
                      '(1 . "JOINT DEFLECTION")
                      '(1 . "2 JOINT DEFLECTIONs")
                   )
                   str enx
               )
         )
       )
   )
   (princ)
)

denverado 发表于 2022-7-6 06:35:36

谢谢大家,效果很好。
我需要为更多实例添加额外的if命令吗?
例如
“0*垂直弯曲”=>“关节偏转”
“-0*垂直弯曲”=>“接头挠度”
“1*垂直弯曲”=>“关节偏转”
“-1*垂直弯曲”=>“接头挠度”
“2*垂直弯曲”=>“接头挠度”
“-2*垂直弯曲”=>“接头挠度”
“3*垂直弯曲”=>“接头挠度”
“-3*垂直弯曲”=>“接头挠度”
“4*垂直弯曲”=>“2个关节偏转”
“-4*垂直弯曲”=>“2个接头挠度”
“5*垂直弯曲”=>“2个关节偏转”
“-5*垂直弯曲”=>“2个接头挠度”
“6*垂直弯曲”=>“2个关节偏转”
“-6*垂直弯曲”=>“2个接头挠度”
“7*垂直弯曲”=>“11.25%%D垂直弯曲”
“-7*垂直弯曲”=>“11.25%%D垂直弯曲”
“8*垂直弯曲”=>“11.25%%D垂直弯曲”
“-8*垂直弯曲”=>“11.25%%D垂直弯曲”
“9*垂直弯曲”=>“11.25%%D垂直弯曲”
“-9*垂直弯曲”=>“11.25%%D垂直弯曲”
“10*垂直弯曲”=>“11.25%%D垂直弯曲”
“-10*垂直弯曲”=>“11.25%%D垂直弯曲”
“11*垂直弯曲”=>“11.25%%D垂直弯曲”
“-11*垂直弯曲”=>“11.25%%D垂直弯曲”
“12*垂直弯曲”=>“11.25%%D垂直弯曲”
“-12*垂直弯曲”=>“11.25%%D垂直弯曲”
“13*垂直弯曲”=>“11.25%%D垂直弯曲”
“-13*垂直弯曲”=>“11.25%%D垂直弯曲”
“14*垂直弯曲”=>“11.25%%D垂直弯曲”
“-14*垂直弯曲”=>“11.25%%D垂直弯曲”
“15*垂直弯曲”=>“11.25%%D垂直弯曲”
“-15*垂直弯曲”=>“11.25%%D垂直弯曲”
“16*垂直弯曲”=>“11.25%%D垂直弯曲”
“-16*垂直弯曲”=>“11.25%%D垂直弯曲”
 
在lisp例程结束时,我可以通过以下操作更改“11.25%%D垂直弯曲”的颜色。
 
(setq tss(ssget“X”(列表(cons 1“11.25%%D垂直弯管)))
(重复(sslength tss)
(命令“chprop”tss““c”“6”)
(entmod tdata)
(ssdel(ssname tss 0)tss)
); 结束重复

BlackBox 发表于 2022-7-6 06:41:23

 
啊!。。。我忘记了[]。
 
此外,为什么不:

         (entmod
               (subst
               (cons 1
                     (if (wcmatch (cdr str) "*0*")
                         "JOINT DEFLECTION"
                         "2 JOINT DEFLECTIONs"
                     )
               )
               str
               enx
               )
         )

pBe 发表于 2022-7-6 06:44:11

“1”后面的字符是什么
“1*垂直弯曲”
 
您意识到,在区分这两者时,wcmatch会有复杂的问题。
 
“1*垂直弯曲”
“15*垂直弯曲”
 
当然,除非我们从最高数字开始[在本例中为16]
 

(defun c:ghj(/ enx idx sel str f n _Str)
   (if (setq sel (ssget "_X"
                        '((0 . "TEXT,MTEXT")
                            (1 . "*VERTICAL BEND"))))
         (repeat (setq idx (sslength sel))
               (setq enx(entget (ssname sel (setq idx (1- idx))))
                     str(assoc 1 enx)
                      _str (Cdr str))
                (setq f nil
                     n 16)
               (while (and (not f) (> n -1))
                     (setq f    (vl-some
                                        '(lambda (k)
                                             (if   (wcmatch
                                                         _str
                                                         (strcat
                                                               k
                                                               "*VERTICAL BEND"))
                                                          (atoi k)))
                                        (list (itoa n)
                                              (if (zerop n)
                                                    "-0"
                                                    (itoa (- n))))))
                     (setq n (1- n))
                     )
               (if (setq nstr
                              (cond
                                    ((or (<= 0 f 6)
                                           (<= -6 f -1))
                                       "2 JOINT DEFLECTIONS")
                                    ((or (<= 7 f 16)
                                           (<= -16 f -7))
                                       "11.25%%D VERTICAL BEND")))
                     (entmod
                           (subst
                                 (cons 1 nstr)
                                 str enx
                                    
                                 )
                           )
                     )
               )
         )
   (princ)
   )

 
我注意到你从29跳到38?为什么?如果应该包括它,那么新的字符串是什么?
 
编辑:
(定义c:ghj(/enx idx sel str f n U str)(if(setq sel(ssget“_X”)((0。“TEXT,MTEXT”)(1.*垂直弯曲,*水平弯曲))(重复(setq idx(sslength sel))(setq enx(entget(ssname sel(setq idx(1-idx)))str(assoc 1 enx)U str(Cdr str))(setq f nil n51)(if(wcmatch str“*水平弯曲”)(entmod(append enx(list(cons 8“Defpoints”)))(progn(while(and(not f)(>n-1))(setq f(vl some’(lambda(k)(if(wcmatch _str(strcat k“*垂直弯曲”)(atoi k)))(列表(itoa n)(if(zerop n)“-0”(itoa(-n 107;)а))(setq n(1-n)))(if(和f(setq nstr(cond((或(

Lee Mac 发表于 2022-7-6 06:46:53

谢谢pBe,
为了使它正常工作,我最终做了以下几点。
(defun c:ghj(/enx idx sel str f n _str)(if(setq sel(ssget“_X”)((0。“TEXT,MTEXT”)(1“*垂直弯曲”))(repeat(setq idx(sslength sel))(setq enx(entget(ssname sel(setq idx(1-idx)))str(assoc 1 enx)_str(Cdr str))(setq f nil n 92)(while(and(not f)(>n-1))(setq f(vl some’(lambda(k)(if(wcmatch _str(strcat k“*垂直弯曲”)(atoi k))(列表(itoa n)(如果(zerop n)”-0“(itoa(-n 1070;)Ю)(setq n(1-n))(if(setq nstr(cond((or(

BlackBox 发表于 2022-7-6 06:50:11

Lee Mac 发表于 2022-7-6 06:51:37

 
True - the strcase is indeed unnecessary for this case.
 
 
Only one of the quoted pairs will be evaluated depending on result of the test expression.

SLW210 发表于 2022-7-6 06:54:57

Please read the Code posting guidelines and edit your post to include the Code in Code Tags.
页: [1] 2
查看完整版本: 更改文本LISP例程