乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 72|回复: 19

[编程交流] 更改文本LISP例程

[复制链接]

2

主题

8

帖子

6

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 06:25:42 | 显示全部楼层 |阅读模式
大家好!!
我编写了一个LISP例程来更改某些文本。然而如果我想要更改的项目之一在图形中不存在,lisp例程将不起作用。有人能告诉我哪里出了错吗?
 
我的工作电脑不允许我添加文件,所以这是文件的一部分。。。。
 
  1. (defun C:GHJ ; = Text Replace for Complete text/mtext strings, pre-defined content
  2. (/ tss tdata)
  3. (setq tss (ssget "X" (list (cons 1 "*0*VERTICAL BEND"))))
  4. (repeat (sslength tss)
  5.    (setq
  6.      tdata (entget (ssname tss 0))
  7.      tdata (subst (cons 1 "JOINT DEFLECTION") (assoc 1 tdata) tdata)
  8.    ); end setq
  9.    (entmod tdata)
  10.    (ssdel (ssname tss 0) tss)
  11. ); end repeat
  12. (setq tss (ssget "X" (list (cons 1 "*4*VERTICAL BEND"))))
  13. (repeat (sslength tss)
  14.    (setq
  15.      tdata (entget (ssname tss 0))
  16.      tdata (subst (cons 1 "2 JOINT DEFLECTIONs") (assoc 1 tdata) tdata)
  17.    ); end setq
  18.    (entmod tdata)
  19.    (ssdel (ssname tss 0) tss)
  20. ); end repeat
  21. ); end defun

 
如果第一个例子不成立,第二个例子就行不通。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 06:31:18 | 显示全部楼层
 
这是因为您没有使用任何代码逻辑来评估在处理之前是否满足了依赖条件。。。考虑这个例子:
  1. (defun c:FOO (/ ss i eData asso)
  2. (if (setq ss (ssget "_x" '((1 . "*0*VERTICAL BEND,*4*VERTICAL BEND"))))
  3.    (repeat (setq i (sslength ss))
  4.      (entmod
  5.        (subst (cons 1
  6.                     (if (wcmatch (strcase (cdr (setq asso (assoc 1
  7.                                                                  (setq eData
  8.                                                                         (entget (ssname ss (setq i (1- i)))
  9.                                                                         )
  10.                                                                  )
  11.                                                           )
  12.                                                )
  13.                                           )
  14.                                  )
  15.                                  "*0*VERTICAL BEND"
  16.                         )
  17.                       "JOINT DEFLECTION"
  18.                       "2 JOINT DEFLECTIONs"
  19.                     )
  20.               )
  21.               asso
  22.               eData
  23.        )
  24.      )
  25.    )
  26. )
  27. (princ)
  28. )

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

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:33:36 | 显示全部楼层
除了BlackBox的建议外,我还建议:
  1. ([color=BLUE]defun[/color] c:ghj ( [color=BLUE]/[/color] enx idx sel str )
  2.    ([color=BLUE]if[/color] ([color=BLUE]setq[/color] sel ([color=BLUE]ssget[/color] [color=MAROON]"_X"[/color] '((0 . [color=MAROON]"TEXT,MTEXT"[/color]) (1 . [color=MAROON]"*[04]*VERTICAL BEND"[/color]))))
  3.        ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] idx ([color=BLUE]sslength[/color] sel))
  4.            ([color=BLUE]setq[/color] enx ([color=BLUE]entget[/color] ([color=BLUE]ssname[/color] sel ([color=BLUE]setq[/color] idx ([color=BLUE]1-[/color] idx))))
  5.                  str ([color=BLUE]assoc[/color] 1 enx)
  6.            )
  7.            ([color=BLUE]entmod[/color]
  8.                ([color=BLUE]subst[/color]
  9.                    ([color=BLUE]if[/color] ([color=BLUE]wcmatch[/color] ([color=BLUE]strcase[/color] ([color=BLUE]cdr[/color] str)) [color=MAROON]"*0*"[/color])
  10.                       '(1 . [color=MAROON]"JOINT DEFLECTION"[/color])
  11.                       '(1 . [color=MAROON]"2 JOINT DEFLECTIONs"[/color])
  12.                    )
  13.                    str enx
  14.                )
  15.            )
  16.        )
  17.    )
  18.    ([color=BLUE]princ[/color])
  19. )
回复

使用道具 举报

2

主题

8

帖子

6

银币

初来乍到

Rank: 1

铜币
10
发表于 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)
); 结束重复
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 06:41:23 | 显示全部楼层
 
啊!。。。我忘记了[]。
 
此外,为什么不:
  1.            (entmod
  2.                (subst
  3.                  (cons 1
  4.                        (if (wcmatch (cdr str) "*0*")
  5.                          "JOINT DEFLECTION"
  6.                          "2 JOINT DEFLECTIONs"
  7.                        )
  8.                  )
  9.                  str
  10.                  enx
  11.                )
  12.            )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 06:44:11 | 显示全部楼层
“1”后面的字符是什么
“1*垂直弯曲”
 
您意识到,在区分这两者时,wcmatch会有复杂的问题。
 
“1*垂直弯曲”
“15*垂直弯曲”
 
当然,除非我们从最高数字开始[在本例中为16]
 
  1. (defun c:ghj  (/ enx idx sel str [color="blue"]f n _Str[/color])
  2.      (if (setq sel (ssget "_X"
  3.                           '((0 . "TEXT,MTEXT")
  4.                             (1 . "*VERTICAL BEND"))))
  5.            (repeat (setq idx (sslength sel))
  6.                  (setq enx  (entget (ssname sel (setq idx (1- idx))))
  7.                        str  (assoc 1 enx)
  8.                       [color="blue"] _str (Cdr str)[/color])
  9.                 [color="blue"] (setq f nil
  10.                        n 16)
  11.                  (while (and (not f) (> n -1))
  12.                        (setq f    (vl-some
  13.                                         '(lambda (k)
  14.                                                (if   (wcmatch
  15.                                                            _str
  16.                                                            (strcat
  17.                                                                  k
  18.                                                                  "*VERTICAL BEND"))
  19.                                                           (atoi k)))
  20.                                         (list (itoa n)
  21.                                               (if (zerop n)
  22.                                                     "-0"
  23.                                                     (itoa (- n))))))
  24.                        (setq n (1- n))
  25.                        )
  26.                  (if (setq nstr
  27.                                 (cond
  28.                                       ((or (<= 0 f 6)
  29.                                            (<= -6 f -1))
  30.                                        "2 JOINT DEFLECTIONS")
  31.                                       ((or (<= 7 f 16)
  32.                                            (<= -16 f -7))
  33.                                        "11.25%%D VERTICAL BEND")))[/color]
  34.                        (entmod
  35.                              (subst
  36.                                    (cons 1 nstr)
  37.                                    str enx
  38.                                     
  39.                                    )
  40.                              )
  41.                        )
  42.                  )
  43.            )
  44.      (princ)
  45.      )

 
我注意到你从29跳到38?为什么?如果应该包括它,那么新的字符串是什么?
 
编辑:
[code](定义c:ghj(/enx idx sel str f n U str)(if(setq sel(ssget“_X”)((0。“TEXT,MTEXT”)(1.*垂直弯曲[color=“blue”],*水平弯曲[color]))(重复(setq idx(sslength sel))(setq enx(entget(ssname sel(setq idx(1-idx)))str(assoc 1 enx)U str(Cdr str))(setq f nil n[color=“blue”]51)[color=“blue”](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((或(
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 06:46:53 | 显示全部楼层
谢谢pBe,
为了使它正常工作,我最终做了以下几点。
[code](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(
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 06:50:11 | 显示全部楼层
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 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.
回复

使用道具 举报

4

主题

2143

帖子

2197

银币

限制会员

铜币
-24
发表于 2022-7-6 06:54:57 | 显示全部楼层
Please read the Code posting guidelines and edit your post to include the Code in Code Tags.
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 18:31 , Processed in 1.032027 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表