DWG Destroyer 发表于 2022-7-6 13:05:03

诡异的朦胧。。。


一直在玩命令自定义等游戏,并开发了一个宏,该宏将把工作层更改为另一个基本上用于标注的层,然后在选择时将标注样式设置为另一个,最后生成一个标注,有效地为其前一个层创建一个统一的标注,最后切换回前一个层。所有工作正常,直到指定用于所述尺寸的指定层在图形中不存在,然后AutoCAD询问该怎么做。显然,为要创建的新层设计代码是有意义的,这很好,但我的问题是;当出现这样的问题时,宏可能需要满足两个分支中的一个,为了克服这种情况,将使用何种编码?我猜还有其他方法可以解决这个问题,比如总是要求在一个特定的名称下创建一个层,不管它是否存在,然后以这种方式成功,但一定有更好的方法吗?以下是我到目前为止的想法,请随意批评。
^C层_s“CSP_DIMS”-dimstyle;R、 \_dimaligned\\\_上一个图层
 
干杯,伙计们!

Lee Mac 发表于 2022-7-6 13:11:07

我会使用一个反应器来执行这类任务,从所有维度命令中做出反应。

DWG Destroyer 发表于 2022-7-6 13:12:31

 
嗯。有没有可能让我沉迷于这方面的信息?即使是一个链接或什么都可以。我对它有点陌生,CAD中的F1今天并不友好;[

Lee Mac 发表于 2022-7-6 13:17:19

 
对不起,我正在为你准备东西

Lee Mac 发表于 2022-7-6 13:19:57

好的,像这样:
 

(defun c:ReON ()
(vl-load-com)
(if (not *Dim:React*)
   (progn
   (setq *Dim:React*
       (vlr-command-reactor nil
         (list
         (cons :vlr-CommandWillStart 'StrtComm)
         (cons :vlr-CommandEnded      'EndComm)
         (cons :vlr-CommandCancelled'CanComm))))
   (if (not (tblsearch "LAYER" "CSP_DIMS"))
       (vla-add
         (vla-get-layers
         (vla-get-ActiveDocument
             (vlax-get-acad-object))) "CSP_DIMS"))
   (princ "\n<<- Reactor Initiated ->>")))
(princ))

(defun StrtComm (React Args / *doc)
(setq old#lay (getvar "CLAYER"))
(if (wcmatch (strcase (car Args)) "DIM*")
   (setvar "CLAYER" "CSP_DIMS")))

(defun EndComm (React Args)
(if (and old#lay
       (wcmatch (strcase (car Args)) "DIM*"))      
   (setvar "CLAYER" old#lay)))

(defun CanComm (React Args)
(if (and old#lay
       (wcmatch (strcase (car Args)) "DIM*"))      
   (setvar "CLAYER" old#lay)))

(defun c:ReOFF (/ old#lay)
(if *Dim:React*
   (progn
   (vlr-remove *Dim:React*)
   (setq *Dim:React* nil)
   (princ "\n<<- Reactor Deactivated ->>")))
(princ))


 
说明:
 
[列表]
[*]键入ReON以激活反应器。每个绘图任务只需要调用一次。
[*]绘制一些尺寸。
[*]如果要停用反应器,请键入ReOFF。
[/列表]

Lee Mac 发表于 2022-7-6 13:23:15

或者,也可以合并dimstyle:
 

(defun c:ReON ( )
(vl-load-com)
(setq *doc
   (vla-get-ActiveDocument
   (vlax-get-acad-object)))
(if (not *Dim:React*)
   (progn
   (setq *Dim:React*
       (vlr-command-reactor nil
         (list
         (cons :vlr-CommandWillStart 'StrtComm)
         (cons :vlr-CommandEnded      'EndComm)
         (cons :vlr-CommandCancelled'CanComm))))
   (if (not (tblsearch "LAYER" "CSP_DIMS"))
       (vla-add
         (vla-get-layers *doc) "CSP_DIMS"))
   (if (not (tblsearch "DIMSTYLE" "Tester"))
       (vla-add
         (vla-get-Dimstyles *doc) "Tester"))
   (princ "\n<<- Reactor Initiated ->>")))
(princ))

(defun StrtComm (React Args)
(setq old#lay (getvar "CLAYER"))
(if (wcmatch (strcase (car Args)) "DIM*")
   (progn
   (vl-catch-all-apply
       (function
         (lambda ( )
         (vla-put-ActiveDimstyle *doc
             (vla-item
               (vla-get-Dimstyles *doc) "Tester")))))
   (setvar "CLAYER" "CSP_DIMS"))))

(defun EndComm (React Args)
(if (and old#lay
       (wcmatch (strcase (car Args)) "DIM*"))      
   (setvar "CLAYER" old#lay)))

(defun CanComm (React Args)
(if (and old#lay
       (wcmatch (strcase (car Args)) "DIM*"))      
   (setvar "CLAYER" old#lay)))

(defun c:ReOFF (/ old#lay *doc)
(if *Dim:React*
   (progn
   (vlr-remove *Dim:React*)
   (setq *Dim:React* nil)
   (princ "\n<<- Reactor Deactivated ->>")))
(princ))

DWG Destroyer 发表于 2022-7-6 13:26:04

 
 
 
哇,'粗文字!我继续把上面的代码放到了我的acaddoc中。pgp文件,它确实像一个符咒。我现在的问题是,作为手动调用“REON”命令的替代方法,我是否可以将其合并到我的维度按钮中,这样每次单击按钮时它都会启动“REON”,这样我就不必记得运行它(当然,之后再次关闭它),这是否会因为后续发生的潜在错误而不利?此外,虽然您的回复确实解决了我的维度难题,但我想了解更多您用于获得此类结果的编码。显然,与我正在使用的过于简单的方法相比,这是一种更强大的方法。如果你能建议我进一步阅读这个主题,我将不胜感激。非常感谢你迄今为止给我的一切!

Lee Mac 发表于 2022-7-6 13:29:48

您只需要在绘图会话开始时调用reON一次,反应器将一直工作,直到调用reOFF或关闭绘图。
 
你可以把代码放进你的阿卡多克。lsp文件,并包括另一行:
 

(c:reON)
以便每次打开图形时都会启动反应器。
 
关于反应堆的信息,我认为AfraLISP有一些信息:
 
http://www.afralisp.net/vl/reactors1.htm
 
还要检查Visual LISP编辑器(VLIDE)帮助文件。
 

DWG Destroyer 发表于 2022-7-6 13:33:24

太棒了非常感谢,这又是一个骗局

Lee Mac 发表于 2022-7-6 13:35:28

没问题,
 
一个最终版本-这将在执行命令后重置旧的标注样式:
 

(defun c:ReON ( )

(setq *dim_lay* "CSP_DIMS";; <<-- Change these
       *dim_sty* "Tester"
)

(vl-load-com)
(setq *doc
   (vla-get-ActiveDocument
   (vlax-get-acad-object)))
(if (not *Dim:React*)
   (progn
   (setq *Dim:React*
       (vlr-command-reactor nil
         (list
         (cons :vlr-CommandWillStart 'StrtComm)
         (cons :vlr-CommandEnded    'EndComm)
         (cons :vlr-CommandCancelled'CanComm))))
   (if (not (tblsearch "LAYER" *dim_lay*))
       (vla-add
         (vla-get-layers *doc) *dim_lay*))
   (if (not (tblsearch "DIMSTYLE" *dim_sty*))
       (vla-add
         (vla-get-Dimstyles *doc) *dim_sty*))
   (princ "\n<<- Reactor Initiated ->>")))
(princ))

(defun StrtComm (React Args)
(setq old#lay (getvar "CLAYER") old#sty (getvar "DIMSTYLE"))
(if (or (wcmatch (strcase (car Args)) "*DIM*")
         (eq "QLEADER" (strcase (car Args))))
   (progn
   (vl-catch-all-apply
       (function
         (lambda ( )
         (vla-put-ActiveDimstyle *doc
             (vla-item
               (vla-get-Dimstyles *doc) *dim_sty*)))))
   (setvar "CLAYER" *dim_lay*))))

(defun EndComm (React Args)
(if (and old#lay old#sty
       (wcmatch (strcase (car Args)) "DIM*"))
   (progn
   (vl-catch-all-apply
       (function
         (lambda ( )
         (vla-put-ActiveDimstyle *doc
             (vla-item
               (vla-get-Dimstyles *doc) old#sty)))))
   (setvar "CLAYER" old#lay)))
(princ))

(defun CanComm (React Args)
(if (and old#lay old#sty
       (wcmatch (strcase (car Args)) "DIM*"))
   (progn
   (vl-catch-all-apply
       (function
         (lambda ( )
         (vla-put-ActiveDimstyle *doc
             (vla-item
               (vla-get-Dimstyles *doc) old#sty)))))
   (setvar "CLAYER" old#lay)))
(princ))

(defun c:ReOFF (/ old#lay old#sty *doc *dim_lay* *dim_sty*)
(if *Dim:React*
   (progn
   (vlr-remove *Dim:React*)
   (setq *Dim:React* nil)
   (princ "\n<<- Reactor Deactivated ->>")))
(princ))
填充顶部的表格。
 
要在会话中期更改配置,只需再次键入ReOn-这不会影响Reactor,但会影响层和样式选择。
 
如果要完全停用反应器,请键入reOff。
页: [1] 2
查看完整版本: 诡异的朦胧。。。