jbennett134 发表于 2022-7-5 18:52:53

从DCL bu运行函数

*免责声明*我不确定这段代码来自哪里,它可能是从几个论坛帖子中散列出来的。
 
我正在修改这个层重命名器,但效果不太好。我已经设置好了对话框,工作正常。我有层重命名功能设置和工作良好。问题是,当我试图从对话框中执行层重命名功能时,它崩溃了。
 
 
我认为它陷入了一个循环中,因为VLIDE被卡住了,直到我关闭AutoCAD绘图并打开一个新的。为了简洁起见,我简化了代码。如果有人能看一下并提出一些建议,我将不胜感激。提前感谢!
 
;|------BEGIN---LAYER RENAMER DIALOG BOX---------------------------------------------------------------|;

(defun C:layerRenamer (/ dcl_id fn fname)
(vl-load-com)
(create_dialog)
(setq dcl_id (load_dialog fname))
(if (not (new_dialog "layerRenamer" dcl_id))
   (exit)
)                                        ;if

(action_tile ;This action tile causes a crash when using the UnitLayer function.It works fine when using the testFunction.
   "btnUnit"
   "(c:unitLayer)"
)
(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete fname)
(princ)
)

(defun create_dialog ()
(setq fname (vl-filename-mktemp "dcl.dcl"))
(setq fn (open fname "w"))
(write-line
   "layerRenamer : dialog {
         label = \"Automated Layer Renaming - V06-08-15\";
         : column {
         : boxed_column {
             : button {
               key = \"btnUnit\";
               label = \"Fix Standard Unit Layers\";
               is_default = false;
             }
         }
         : boxed_row {
             : button {
               key = \"cancel\";
               label = \"Close\";
               is_default = true;
               is_cancel = true;
             }
         }   
         }

}"fn
)
(close fn)
)

;|------END-----LAYER RENAMER DIALOG BOX---------------------------------------------------------------|;

;|------BEGIN---BASIC RENAMING FUNCTION----------------------------------------------------------------|;

(defun c:renameLayer ( oldLayer newLayer / ss i ent )
(cond ((and (tblsearch "layer" oldLayer) (not (tblsearch "layer" newLayer)))
(command "._rename" "la" oldLayer newLayer)
)
((and (tblsearch "layer" oldLayer)(tblsearch "layer" newLayer))
(setq ss (ssget "x" (list (cons 8 oldLayer))))
(setq i -1)
   (repeat (sslength ss)
      (setq ent (entget (ssname ss (setq i (1+ i))))
          ent (subst (cons 8 newLayer) (cons 8 (cdr (assoc 8 ent))) ent)
      )   
      (entmod ent)
          )
)
((not (tblsearch "layer" oldLayer))
(prompt (strcat "\nLayer " oldLayer " not found. "))
       )
)
(princ)
)

;|------END-----BASIC RENAMING FUNCTION----------------------------------------------------------------|;

;|------BEGIN---DRAWING SPECIFIC RENAMING FUNCTIONS----------------------------------------------------|;

(defun c:unitLayer ( / newLayer ) ;This function runs perfectly when run from the command line but crashes when run from dialog box.
(setq newLayer "1_ANSI")
(foreach oldLayer '("ANSI" "_ANSI" "F.H." "1_F.H.") (renameLayer oldLayer newLayer))
(command "._purge" "la" "" "n")
)

;|------END-----DRAWING SPECIFIC RENAMING FUNCTIONS----------------------------------------------------|;

(defun c:testFunction ()
(print "Test Function Ran")
(princ)
)

Tharwat 发表于 2022-7-5 19:02:55

从程序c:Rename层中删除c:Rename层,然后重试。

jbennett134 发表于 2022-7-5 19:08:57

删除renameLayer函数中的c:后,仍然会出现相同的错误。谢谢你捕捉到了这一点,我没有注意到它仍然被设置为一个命令函数。

rkmcswain 发表于 2022-7-5 19:12:48

当DCL对话框处于活动状态时,不能调用(命令)函数。

Tharwat 发表于 2022-7-5 19:17:36

试试这个快速修改。

(defun c:Test (/ *error* echo dc fn fname prg)
(defun *error* (msg)
   (if (and fname (findfile fname))
   (vl-file-delete fname)
   )
   (if echo
   (setvar 'CMDECHO echo)
   )
   (if (and msg
            (not (wcmatch (strcase msg) "*CANCEL*,*BREAK*,*EXIT*"))
       )
   (princ (strcat "\nError =>: " msg "..."))
   )
   (princ)
)
(if
   (and
   (setq fname (vl-filename-mktemp "dcl.dcl"))
   (setq fn (open fname "w"))
   (write-line
       "tmp : dialog { label = \"Automated Layer Renaming - V06-08-15\";
         : column {
         : boxed_column { : button { key = \"btnUnit\"; label = \"Fix Standard Unit Layers\"; is_default = false;}}
         : boxed_row { : button { key = \"cancel\"; label = \"Close\"; is_default = true; is_cancel = true;}}}}"
       fn
   )
   (not (close fn))
   )
    (progn
      (if (and (<= 0 (setq dc (load_dialog fname)))
               (new_dialog "tmp" dc)
          )
      (progn (action_tile
               "btnUnit"
               "(unitLayer)(setq prg t)(done_dialog)"
               )
               (start_dialog)
               (unload_dialog dc)
               (vl-file-delete fname)
               (if prg
               (progn
                   (setq echo (getvar 'CMDECHO))
                   (setvar 'CMDECHO 0)
                   (command "._-purge" "la" "" "n")
                   (setvar 'CMDECHO echo)
               )
               )
      )
      (progn (if (>= dc 0)
               (unload_dialog dc)
               )
               (if (and fname (setq fname (findfile fname)))
               (vl-file-delete fname)
               )
      )
      )
    )
)
(princ)
)
(defun unitLayer (/ layers newLayer ss i ent)
(setq layers   (vla-get-layers
                  (vla-get-activedocument (vlax-get-acad-object))
                )
       newLayer "1_ANSI"
)
(foreach oldLayer '("ANSI" "_ANSI" "F.H." "1_F.H.")
   (cond ((and (tblsearch "layer" oldLayer)
               (not (tblsearch "layer" newLayer))
          )
          (vla-put-name (vla-item layers oldLayer) newLayer)
         )
         ((and (tblsearch "layer" oldLayer)
               (tblsearch "layer" newLayer)
               (setq ss (ssget "_X" (list (cons 8 oldLayer))))
          )
          (repeat (setq i (sslength ss))
            (setq ent (entget (ssname ss (setq i (1- i))))
                  ent (subst (cons 8 newLayer)
                           (assoc 8 ent)
                           ent
                      )
            )
            (entmod ent)
          )
         )
         ((not (tblsearch "layer" oldLayer))
          (prompt (strcat "\nLayer " oldLayer " not found. "))
         )
   )
)
(princ)
)(vl-load-com)

我不确定如何在renameLayer函数中重命名层。
;(command "._purge" "la" "" "n")
我可以在unitLayer函数开始之前卸载对话框,以便使用命令吗?
 
如果在卸载对话框之前必须运行该函数,那么我可能需要从使用命令行切换到使用Visual Lisp重命名层。我在AfraLISP上找到了关于使用VLISP和层的完整论述。

jbennett134 发表于 2022-7-5 19:22:21

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

jbennett134 发表于 2022-7-5 19:27:54

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

Tharwat 发表于 2022-7-5 19:33:26

好的,我回来了,几乎一切都正常。我添加了一个功能来搜索dwg中的所有块,并更改任何非标准层的层,但我无法使其检查未插入模型空间的块。我已经在Autodesk论坛上修改了用户pbejse编写的代码。有什么建议吗?
 
(command "._rename" "la" oldLayer newLayer)

jbennett134 发表于 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 发表于 2022-7-5 19:42:30

谢谢rlx,但我在上一篇文章中不够具体。我希望它能够获得块表中的块,但不会插入到图形中的任何位置。也许我需要看一下对块进行表搜索,看看是否会返回所有块。我注意到它也不会改变嵌套块插入的层或嵌套块内的线层。
页: [1] 2
查看完整版本: 从DCL bu运行函数