乐筑天下

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

[编程交流] 从DCL bu运行函数

[复制链接]

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:52:53 | 显示全部楼层 |阅读模式
*免责声明*我不确定这段代码来自哪里,它可能是从几个论坛帖子中散列出来的。
 
我正在修改这个层重命名器,但效果不太好。我已经设置好了对话框,工作正常。我有层重命名功能设置和工作良好。问题是,当我试图从对话框中执行层重命名功能时,它崩溃了。
 
 
我认为它陷入了一个循环中,因为VLIDE被卡住了,直到我关闭AutoCAD绘图并打开一个新的。为了简洁起见,我简化了代码。如果有人能看一下并提出一些建议,我将不胜感激。提前感谢!
 
  1. ;|------BEGIN---LAYER RENAMER DIALOG BOX---------------------------------------------------------------|;
  2. (defun C:layerRenamer (/ dcl_id fn fname)
  3. (vl-load-com)
  4. (create_dialog)
  5. (setq dcl_id (load_dialog fname))
  6. (if (not (new_dialog "layerRenamer" dcl_id))
  7.    (exit)
  8. )                                        ;if
  9. (action_tile ;This action tile causes a crash when using the UnitLayer function.  It works fine when using the testFunction.
  10.    "btnUnit"
  11.    "(c:unitLayer)"
  12. )
  13. (start_dialog)
  14. (unload_dialog dcl_id)
  15. (vl-file-delete fname)
  16. (princ)
  17. )
  18. (defun create_dialog ()
  19. (setq fname (vl-filename-mktemp "dcl.dcl"))
  20. (setq fn (open fname "w"))
  21. (write-line
  22.    "layerRenamer : dialog {
  23.          label = "Automated Layer Renaming - V06-08-15";
  24.          : column {
  25.            : boxed_column {
  26.              : button {
  27.                key = "btnUnit";
  28.                label = "Fix Standard Unit Layers";
  29.                is_default = false;
  30.              }
  31.            }
  32.            : boxed_row {
  33.              : button {
  34.                key = "cancel";
  35.                label = "Close";
  36.                is_default = true;
  37.                is_cancel = true;
  38.              }
  39.            }   
  40.          }
  41. }"  fn
  42. )
  43. (close fn)
  44. )
  45. ;|------END-----LAYER RENAMER DIALOG BOX---------------------------------------------------------------|;
  46. ;|------BEGIN---BASIC RENAMING FUNCTION----------------------------------------------------------------|;
  47. (defun c:renameLayer ( oldLayer newLayer / ss i ent )
  48. (cond ((and (tblsearch "layer" oldLayer) (not (tblsearch "layer" newLayer)))
  49. (command "._rename" "la" oldLayer newLayer)
  50. )
  51. ((and (tblsearch "layer" oldLayer)(tblsearch "layer" newLayer))
  52.   (setq ss (ssget "x" (list (cons 8 oldLayer))))
  53.   (setq i -1)
  54.    (repeat (sslength ss)
  55.       (setq ent (entget (ssname ss (setq i (1+ i))))
  56.             ent (subst (cons 8 newLayer) (cons 8 (cdr (assoc 8 ent))) ent)
  57.       )   
  58.       (entmod ent)
  59.           )
  60. )
  61. ((not (tblsearch "layer" oldLayer))
  62.   (prompt (strcat "\nLayer " oldLayer " not found. "))
  63.        )
  64. )
  65. (princ)
  66. )
  67. ;|------END-----BASIC RENAMING FUNCTION----------------------------------------------------------------|;
  68. ;|------BEGIN---DRAWING SPECIFIC RENAMING FUNCTIONS----------------------------------------------------|;
  69. (defun c:unitLayer ( / newLayer ) ;This function runs perfectly when run from the command line but crashes when run from dialog box.
  70. (setq newLayer "1_ANSI")
  71. (foreach oldLayer '("ANSI" "_ANSI" "F.H." "1_F.H.") (renameLayer oldLayer newLayer))
  72. (command "._purge" "la" "" "n")
  73. )
  74. ;|------END-----DRAWING SPECIFIC RENAMING FUNCTIONS----------------------------------------------------|;
  75. (defun c:testFunction ()
  76. (print "Test Function Ran")
  77. (princ)
  78. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 19:02:55 | 显示全部楼层
从程序c:Rename层中删除c:Rename层,然后重试。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:08:57 | 显示全部楼层
删除renameLayer函数中的c:后,仍然会出现相同的错误。谢谢你捕捉到了这一点,我没有注意到它仍然被设置为一个命令函数。
回复

使用道具 举报

24

主题

1265

帖子

1028

银币

后起之秀

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

铜币
362
发表于 2022-7-5 19:12:48 | 显示全部楼层
当DCL对话框处于活动状态时,不能调用(命令)函数。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 19:17:36 | 显示全部楼层
试试这个快速修改。
  1. (defun c:Test (/ *error* echo dc fn fname prg)
  2. (defun *error* (msg)
  3.    (if (and fname (findfile fname))
  4.      (vl-file-delete fname)
  5.    )
  6.    (if echo
  7.      (setvar 'CMDECHO echo)
  8.    )
  9.    (if (and msg
  10.             (not (wcmatch (strcase msg) "*CANCEL*,*BREAK*,*EXIT*"))
  11.        )
  12.      (princ (strcat "\nError =>: " msg "..."))
  13.    )
  14.    (princ)
  15. )
  16. (if
  17.    (and
  18.      (setq fname (vl-filename-mktemp "dcl.dcl"))
  19.      (setq fn (open fname "w"))
  20.      (write-line
  21.        "tmp : dialog { label = "Automated Layer Renaming - V06-08-15";
  22.          : column {
  23.          : boxed_column { : button { key = "btnUnit"; label = "Fix Standard Unit Layers"; is_default = false;}}
  24.          : boxed_row { : button { key = "cancel"; label = "Close"; is_default = true; is_cancel = true;}}}}"
  25.        fn
  26.      )
  27.      (not (close fn))
  28.    )
  29.     (progn
  30.       (if (and (<= 0 (setq dc (load_dialog fname)))
  31.                (new_dialog "tmp" dc)
  32.           )
  33.         (progn (action_tile
  34.                  "btnUnit"
  35.                  "(unitLayer)(setq prg t)(done_dialog)"
  36.                )
  37.                (start_dialog)
  38.                (unload_dialog dc)
  39.                (vl-file-delete fname)
  40.                (if prg
  41.                  (progn
  42.                    (setq echo (getvar 'CMDECHO))
  43.                    (setvar 'CMDECHO 0)
  44.                    (command "._-purge" "la" "" "n")
  45.                    (setvar 'CMDECHO echo)
  46.                  )
  47.                )
  48.         )
  49.         (progn (if (>= dc 0)
  50.                  (unload_dialog dc)
  51.                )
  52.                (if (and fname (setq fname (findfile fname)))
  53.                  (vl-file-delete fname)
  54.                )
  55.         )
  56.       )
  57.     )
  58. )
  59. (princ)
  60. )
  61. (defun unitLayer (/ layers newLayer ss i ent)
  62. (setq layers   (vla-get-layers
  63.                   (vla-get-activedocument (vlax-get-acad-object))
  64.                 )
  65.        newLayer "1_ANSI"
  66. )
  67. (foreach oldLayer '("ANSI" "_ANSI" "F.H." "1_F.H.")
  68.    (cond ((and (tblsearch "layer" oldLayer)
  69.                (not (tblsearch "layer" newLayer))
  70.           )
  71.           (vla-put-name (vla-item layers oldLayer) newLayer)
  72.          )
  73.          ((and (tblsearch "layer" oldLayer)
  74.                (tblsearch "layer" newLayer)
  75.                (setq ss (ssget "_X" (list (cons 8 oldLayer))))
  76.           )
  77.           (repeat (setq i (sslength ss))
  78.             (setq ent (entget (ssname ss (setq i (1- i))))
  79.                   ent (subst (cons 8 newLayer)
  80.                              (assoc 8 ent)
  81.                              ent
  82.                       )
  83.             )
  84.             (entmod ent)
  85.           )
  86.          )
  87.          ((not (tblsearch "layer" oldLayer))
  88.           (prompt (strcat "\nLayer " oldLayer " not found. "))
  89.          )
  90.    )
  91. )
  92. (princ)
  93. )(vl-load-com)

我不确定如何在renameLayer函数中重命名层。
  1. ;(command "._purge" "la" "" "n")

我可以在unitLayer函数开始之前卸载对话框,以便使用命令吗?
 
如果在卸载对话框之前必须运行该函数,那么我可能需要从使用命令行切换到使用Visual Lisp重命名层。我在AfraLISP上找到了关于使用VLISP和层的完整论述。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:22:21 | 显示全部楼层
感谢您重新编写Tharwat。它运行得很好。我必须在这个脚本中增加7个分层标准(6个按钮),在每个标准中重命名大约20个层。有没有可能像以前一样将其分成两个函数?我想试着根据你的代码自己编写代码,只是想知道你是否预见到这样工作会有任何问题。
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:27:54 | 显示全部楼层
很高兴听到这个消息。非常欢迎你。
 
 
当然,你可以添加任意数量的代码,只要试着编写代码,如果你需要任何帮助,请尽管问,我会尽力帮助你(当然,如果可能的话)。
 
注意:我已经更新了我上次回复中的代码,并添加了一些额外代码的错误处理,以更准确。
 
祝你好运
 
塔瓦特
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 19:33:26 | 显示全部楼层
好的,我回来了,几乎一切都正常。我添加了一个功能来搜索dwg中的所有块,并更改任何非标准层的层,但我无法使其检查未插入模型空间的块。我已经在Autodesk论坛上修改了用户pbejse编写的代码。有什么建议吗?
 
  1. (command "._rename" "la" oldLayer newLayer)
回复

使用道具 举报

1

主题

6

帖子

5

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 19:36:44 | 显示全部楼层
(setq ss(ssget“x”(list(cons 0“insert”)(cons 410(getvar“ctab”))(cons 2“*TITLEBLOCK*”)))
 
 
将ctab替换为布局中的名称&“标题栏*”替换为块中的名称,以从图纸空间中的特定布局中选择块
 
 
gr.Rlx
回复

使用道具 举报

rlx

21

主题

1505

帖子

1551

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
81
发表于 2022-7-5 19:42:30 | 显示全部楼层
谢谢rlx,但我在上一篇文章中不够具体。我希望它能够获得块表中的块,但不会插入到图形中的任何位置。也许我需要看一下对块进行表搜索,看看是否会返回所有块。我注意到它也不会改变嵌套块插入的层或嵌套块内的线层。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 13:40 , Processed in 0.368729 second(s), 72 queries .

© 2020-2025 乐筑天下

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