DesmetMartin 发表于 2022-7-5 17:43:08

帮我解决这个关于DI的口齿不清的问题

你好
 
谁能帮我让这个Lisp程序的工作。
在*DIM*命令中,lisp应转到您选择的层(按1或2)。
 
放置尺寸后,图层应返回到选择“DIM”命令之前的图层。
 
这是现在的代码。
 
; AFKORTINGEN VAN DE VARIABELEN
;ADDL Automatic dimension layer

;****************************************************************************

(defun CommandReactor:Start ()
(or *CommandReactor*
   (setq *CommandReactor*
            (vlr-command-reactor
            nil
            '(
                (:vlr-commandcancelled . CommandReactor:CommandEnded)
                (:vlr-commandended . CommandReactor:CommandEnded)
                (:vlr-commandfailed . CommandReactor:CommandEnded)
                (:vlr-commandwillstart . CommandReactor:CommandWillStart)
               )
            )
   )
)
(prompt "\nCommand reactor loaded. ")
(princ)
)

;****************************************************************************

(defun CommandReactor:CommandEnded (rea cmd)
(if (and *OldClayer*
          (wcmatch (strcase (car cmd)) "*DIM*")
   )
   (progn
   (setvar 'clayer *OldClayer*)
   (setq *OldClayer* nil)

   )
)
)

;****************************************************************************
(defun CommandReactor:CommandWillStart (rea cmd)
(if (wcmatch (strcase (car cmd)) "*DIM*")
           (progn
             (setq *OldClayer* (getvar 'clayer))
             (vla-add
        (vla-get-layers (vla-get-activedocument (vlax-get-acad-object)))
          
; Kiezen van de DIM layer
        (setq ADDL 0)
                   (while (or (< ADDL 1) (> ADDL 2))
                           (setq ADDL (getint "\nInput the DIM layer: Dim. (1), Dim. front (2): ")))
) ; end while


;ADDL = 1, Dimension layer
(if (= ADDL 1)
        (progn
                (command "_layer" "_m" "S-DIMENSIONS" "_c" "3" "" "")
        ); progn
); if (=ADDL 1)

;ADDL = 2, Dimension front layer
(if (= ADDL 2)
        (progn
                (command "_layer" "_m" "S-DIMENSIONS front" "_c" "3" "" "")
        ); progn
); if (=ADDL 2)

(setvar 'clayer *OldClayer*)


   )
)
)

;****************************************************************************
(CommandReactor:Start)
(princ)


;****************************************************************************
;****************************************************************************
;****************************************************************************
;****************************************************************************



 
请帮忙!
谢谢

Dadgad 发表于 2022-7-5 17:47:41

欢迎来到CADTutor。
 
你可能会有兴趣看看下面李的gem。
 
http://www.lee-mac.com/layerdirector.html
 
李的精彩网站是我最喜欢的网站之一。
 
谢谢李!

DesmetMartin 发表于 2022-7-5 17:49:46

非常感谢。
 
我贴出的Lisp程序与李的Lisp程序原则相同。
我搜索的唯一“额外”是当你激活时,一个DIM命令,你可以选择一个数字,它会给你数字后面的层。
 
如果你加载我发布的LISP,你就会明白我的意思。
唯一的问题是Lisp程序或缺少什么,我不知道是什么。
 
 
我希望有人能在这方面帮助我。

DesmetMartin 发表于 2022-7-5 17:54:12

我仍然需要帮助。

marko_ribar 发表于 2022-7-5 17:58:09

在这里,我对其进行了一些修改:
 
希望这是你需要的。。。
M、 R。

Tharwat 发表于 2022-7-5 17:59:47

你好
 
虽然我认为这不是一个好的方式来使用反应堆这样的任务,但这取决于你们。
 
注:
[列表]
[*]最好将表示命令名称的字符串从*DIM*更改为所需的命令名称,因为使用当前字符串,即使调用命令DymStyle,也会触发reactor。
[*]不能对反应堆使用命令调用。
[/列表]
 
这是我的修改,以处理我认为的所有事件,当你不再需要反应堆时,用一个函数结束反应堆。
 

(vl-load-com)
;;        Author: Tharwat Al Shoufi        ;;
;;        Date: 09.May.2016                ;;
(defun c:CommandReactorStart nil
(or *CommandReactor*
   (setq *CommandReactor*
            (vlr-command-reactor
            nil
            '(
                (:vlr-commandcancelled . CommandReactor:CommandBroken)
                (:vlr-commandended . CommandReactor:CommandEnded)
                (:vlr-commandfailed . CommandReactor:CommandBroken)
                (:vlr-commandwillstart . CommandReactor:CommandWillStart)
                )
            )
         )
   )
(prompt "\nCommand reactor Started.")
(princ)
)
;;                                        ;;
;;                                        ;;
(defun c:CommandReactorEnd nil
(if *CommandReactor*
   (vlr-remove *CommandReactor*)
   )
(prompt "\nCommand reactor Disabled !")
(princ)
)
;;                                        ;;
;;                                        ;;
(defun CommandReactor:CommandEnded (rea cmd)
(if (and *OldClayer*
          (tblsearch "LAYER" *OldClayer*)
          (wcmatch (strcase (car cmd)) "*DIM*")
          )
   (progn
   (setvar 'clayer *OldClayer*)
   (setq *OldClayer* nil)
   )
   )
(princ)
)
;;                                        ;;
;;                                        ;;
(defun CommandReactor:CommandBroken (rea cmd)
(if (and *OldClayer*
          (tblsearch "LAYER" *OldClayer*)
          )
   (progn
   (setvar 'clayer *OldClayer*)
   (setq *OldClayer* nil)
   )
   )
(princ)
)
;;                                        ;;
;;                                        ;;
(defun CommandReactor:CommandWillStart (rea cmd / lay new name)
(if
   (and (wcmatch (strcase (car cmd)) "*DIM*")
      (setq *OldClayer* (getvar 'clayer))
      (progn
          (while (not (and (setq lay
                                  (getint
                                    "\nInput the DIM layer: Dim. (1), Dim. front (2): "
                                    )
                                 )
                           (< 0 lay 3)
                           )
                      )
            (alert "\nNumber must be (1) or (2):")
            )
          lay
          )
      (setq
          new (vla-add (vla-get-layers
                         (vla-get-activedocument (vlax-get-acad-object))
                         )
                     (if (eq lay 1)
                         (setq name "S-DIMENSIONS")
                         (setq name "S-DIMENSIONS front")
                         )
                     )
          )
      )
    (progn
      (vla-put-color new AcGreen)
      (setvar 'clayer name)
      )
    )
(princ)
)
;;                                        ;;
(c:CommandReactorStart)
(princ "\nType CommandReactorStart activate the reactor and CommandReactorEnd to Deactivate")

DesmetMartin 发表于 2022-7-5 18:04:59

@塔瓦特
 
首先,谢谢你!这正是我想要的。
 
第二,你说这不是一个好方法是什么意思?
你还有什么建议?
 
再次感谢!
 
@马尔科·里巴
也谢谢!但在执行连续命令时,有一个小问题。
 
 
致以诚挚的问候!

Tharwat 发表于 2022-7-5 18:08:11

 
太好了,非常欢迎你。
 
 
在我看来,最好的选择是让反应堆在没有用户干预的情况下在后台完成工作,但在您的情况下,您正在中断功能,询问用户有关表示层名称的关键字。
 
因此,您也可以编写一个简单的例程,要求用户指定三个点,如果创建DimLinear或DimAligned,则可以使用与要求用户为层名称指定数字1或2相同的方式,并且根本不需要reactor。
 
正如您可能知道的那样,命令名:dimstyle有一个短关键字来调用这个命令,它是d,所以运行我上面发布的代码并点击d,反应器将被触发,并要求您指定数字1或2。因此,这是另一个比reactor更简单的例程的问题,除非将完整的命令名修改为reactor的代码。
 
 
你是在第一篇帖子中写这些代码的人吗?
 
快乐的编码。

DesmetMartin 发表于 2022-7-5 18:09:43

不,我在第一篇文章中没有写代码。
我在网上的某个地方找到了这个。
 
我试图理解你在说什么,但我计划参加课程,学习编写LISP或vb。所以我希望我能理解
 
我可以问你,如果我想添加另一个附加了另一层的数字,我应该怎么做吗?
 
 
谢谢

Tharwat 发表于 2022-7-5 18:14:46

我可以先问一下你在创建什么样的维度吗?
添加一个数字并不难,但我计划用另一个简单的例程更改反应堆代码。
 
当你运行我上面发布的代码时,你是否试图点击d?你收到了什么信息?
页: [1] 2
查看完整版本: 帮我解决这个关于DI的Lisp程序的问题