乐筑天下

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

[编程交流] 复制并替换objec文本

[复制链接]

9

主题

47

帖子

38

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 08:53:56 | 显示全部楼层 |阅读模式
这仅用于插入块的多行文字和文字。我遇到的问题是,如果该项是文本,那么它将只替换最后一个对象的文本,因为im使用(setq ss1(ssget“L”))也有(entlast),但它只会创建最后一个实体。有没有一种方法可以在不必选择复制文本的情况下获取所有这些文本。然后一个while循环来编辑每一个。
 
谢谢
 
Lisp文件:
 
  1. (defun sVars()
  2. (setq text_edit(get_tile "text_edit"))
  3. (princ))
  4. (defun edit ()
  5. (setq dcl_id (load_dialog "copy_blk.dcl"))
  6. (if (not (new_dialog "copy_blk" dcl_id) ) (exit))
  7. (set_tile "text_edit" temp1)
  8. (mode_tile "text_edit" 3)
  9. (action_tile "cancel" "(setq ddiag 1)(done_dialog 0)")
  10. (action_tile "accept" "(setq ddiag 2)(sVars)(done_dialog 1)")
  11. (start_dialog)
  12. (unload_dialog dcl_id)
  13. (if (= ddiag 1)
  14.    (progn
  15.    (setq newval temp1)
  16.    (princ "\n Command cancelled\n") (exit)))
  17.    (if (= ddiag 2)
  18.    (progn
  19.    (setq newval text_edit)
  20.    (princ "\n Text Changed\n")))
  21.    (princ))
  22.            
  23. (defun C:Copy_blk (/ blkType INDEX COUNT en2 enlist temp temp1 enlist2 ins newblk newblk2 newent newent2 newval ss en newentlist2 ss1 INDEX1)
  24. (vl-load-com)
  25. (setq acadObject (vlax-get-acad-object))
  26. (defun *Error* (Msg)
  27. (cond ((member Msg '("Function cancelled" "quit / exit abort")))
  28. ((princ (strcat "Error: " Msg))
  29. (princ "\nRestoring System Variables ")
  30. (terpri)))
  31. (princ))
  32. (if (setq ss(ssget "_:L" '((0 . "INSERT,TEXT,MTEXT"))))                                
  33. (progn
  34. (setq INDEX1 -1)
  35. (setq en (ssname ss (setq INDEX1 (1+ INDEX1))))                              
  36. (setq enlist(entget en))
  37. (setq ins(cdr(assoc 10 enlist)))                                          
  38. (command "copy" ss "" ins pause)
  39. (setq ss1 (ssget "L"))
  40. (setq INDEX -1 COUNT 0)
  41. (while (setq en1 (ssname ss1 (setq INDEX (1+ INDEX))))
  42. (setq enlist1(entget en1))
  43. (setq blkType(cdr(assoc 0 enlist)))                                             
  44. (if (= blkType "INSERT")                                                      
  45. (progn
  46.    (if(= (cdr(assoc 66 enlist)) 1)                                                
  47.    (progn
  48.        (setq en2(entnext en1))                                                      
  49.        (setq enlist2(entget en2))
  50.        (setq temp1 (cdr (assoc 1 enlist2)))
  51.        (edit)
  52.        (setq enlist2 (subst (cons 1 newval)(assoc 1 enlist2)enlist2))
  53.        (entmod enlist2)))))
  54.      
  55. (if (or(= blkType "TEXT")(= blkType "MTEXT"))
  56. (progn
  57.    (setq temp1 (cdr (assoc 1 enlist1)))
  58.    (edit)
  59.    (setq enlist1 (subst (cons 1 newval)(assoc 1 enlist1)enlist1))
  60.    (entmod enlist1))))))
  61. (princ))

 
DCL文件:
 
  1. copy_blk : dialog {
  2.    label = "Edit value of object";
  3.    initial_focus = "text_edit";
  4.        :column{
  5.        spacer;
  6.        : edit_box
  7.        {
  8.        label = "Enter value:";
  9.        key = "text_edit";
  10.        edit_width = 75;
  11.        edit_limit = 256;
  12.        alignment = centered;
  13.        allow_accept = true;
  14.        }
  15.        spacer;
  16.       
  17.            :row{
  18.            : button{
  19.            key = "accept";
  20.            label = "Ok";
  21.            is_default = true;
  22.            edit_width = 1;
  23.            alignment = centered;
  24.            }
  25.            :button{
  26.            key = "cancel";
  27.            label = "Cancel";
  28.            is_default = false;
  29.            is_cancel = true;
  30.            edit_width = 1;
  31.            alignment = centered;
  32.            }
  33.        }
  34.        }
  35.        }
  36.       
  37.       
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 08:59:54 | 显示全部楼层
欢迎来到CADTutor!
 
为了澄清:
 
在ssget语句中使用“L”作为sel方法将创建添加到数据库的最后一个可见对象的选择集。
 
使用“_:L”作为sel方法,将提示用户选择解锁层的对象。
 
也许您会受益于vla copy方法,而不是重复(命令“\u copy”…调用。此外,考虑使用cond语句代替多个if语句。
 
HTH公司
回复

使用道具 举报

9

主题

47

帖子

38

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 09:02:45 | 显示全部楼层
我认为自己是LISP的初学者,我发现自己总是使用IF语句。使用cond有什么好处。此外,我不知道任何关于视觉Lisp。当我需要它的时候,我读了一些关于它的东西,但我什么都不记得了。我会看看vla副本。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:04:18 | 显示全部楼层
 
当您需要测试多个条件(恰当地命名)时,Cond非常好。
 
举个简单的例子:
 
  1. (defun c:FOO ( / opt)
  2. (if (and (not (initget 1 "This tHat Other"))
  3.           (setq opt (strcase (getkword "\nEnter an option [This/tHat/Other]: "))))
  4.    (prompt
  5.      (strcat
  6.        "\nYou entered: "
  7.        (cond ((= "THIS" opt) "THIS ")
  8.              ((= "THAT" opt) "THAT ")
  9.              ((= "OTHER" opt) "OTHER ")))))
  10. (terpri)
  11. (princ))

 
编辑:注意,在这个示例中,我故意使用显式文本“THIS”、“that”或“OTHER”,通常如果使用具有所述值的变量,您只需使用该变量。
 
有关更多信息,请参阅开发人员文档。
 
 
别担心;稍后我们将重新访问Visual LISP。。。我花了一些时间来学习vl*函数,然后我就喜欢上了。
回复

使用道具 举报

9

主题

47

帖子

38

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 09:08:40 | 显示全部楼层
酷,在我弄清楚如何自动添加复制到实体或选择集的新对象后,我将研究cond。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:11:45 | 显示全部楼层
 
考虑ssadd函数:
 
  1. (setq newSS (ssadd (entlast)))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:14:50 | 显示全部楼层
与多个非嵌套IF语句相比,COND的另一个优点是,在测试条件返回非nil值时,不会不必要地评估其他测试条件。
 
例如:
 
  1. (defun c:test ( / num )
  2.    (if (setq num (getint "\nEnter a Number: "))
  3.        (cond
  4.            (   (minusp num)
  5.                (princ "\nYou Entered a Negative Number.")
  6.            )
  7.            (   (zerop num)
  8.                (princ "\nYou Entered Zero.")
  9.            )
  10.            (   (= 3 num)
  11.                (princ "\nYou Entered the Number 3.")
  12.            )
  13.            (   t
  14.                (princ "\nYou Enter a Positive Non-zero Number not equal to 3.")
  15.            )
  16.        )
  17.    )
  18.    (princ)
  19. )
而不是:
 
由于只有一个条件可以返回T,因此在测试条件返回T后评估任何其他条件都没有意义。
 
COND的求值顺序与一组嵌套的IF语句相同,即您在其他语言中可能看到的“IF/Else-IF”结构(在其他语言中找到的“switch”语句也类似):
 
但是我认为你会同意COND语句更具可读性。
 
回复

使用道具 举报

9

主题

47

帖子

38

银币

初来乍到

Rank: 1

铜币
45
发表于 2022-7-6 09:18:47 | 显示全部楼层
我确实同意cond声明更容易阅读。它还使您的程序不必计算每个if语句。让它跑得更快一点。
 
如果我使用
  1. (setq newSS (ssadd (entlast)))

它只获取放入数据库的最后一个对象。
我想使用多行dtext,那么它只会选择一行
的行(始终放在最后)。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:21:26 | 显示全部楼层
也许这个例子可以澄清:
 
  1. (defun c:FOO ( / ss e ss2)
  2. (if (setq ss (ssget "_:L"))
  3.    (progn
  4.      [color=blue](setq e (entlast))[/color]
  5.      [color=red](command "._copy" ss "" '(0 0 0) '(0 0 0))[/color]
  6.      (while (/= nil [color=seagreen](setq e (entnext e))[/color])
  7.        (setq
  8.          ss2 (ssadd e
  9.                       (cond (ss2)
  10.                             ((setq ss2 (ssadd (entnext e))))))))
  11.      (sssetfirst nil ss2))
  12.    (prompt "\n** Nothing selected ** "))
  13. (princ))

 
注意entlast的顺序、复制操作,然后是后续的entnext调用。
 
下面是另一种对声明较少的变量执行相同操作的方法:
 
  1. 9

 
HTH公司
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:22:46 | 显示全部楼层
我会补充说,虽然已经重新阅读了你的一些代码。。。而不是生成结果复制项的选择集,然后逐步通过二级选择集。。。只需在while循环本身期间对实体执行操作。更少的迭代。
 
我稍后将发布一个示例。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 06:28 , Processed in 0.470075 second(s), 72 queries .

© 2020-2025 乐筑天下

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