daha 发表于 2022-7-6 06:27:58

你如何在取消符中编码

我试图修改现有的lisp例程,以包括一个函数,供用户(即我)取消运行该例程。当lisp运行时,似乎没有办法取消它。(对于大型dwg,可能需要很长很长的时间才能完成)我认为您不必在程序中编写退出或退出函数,但显然对于这一个,我会这么做,因为退出的唯一方法是按住CTRL+SHFT+ESC并终止ACAD进程。谢谢。

rkmcswain 发表于 2022-7-6 06:40:22

你的代码是在运行循环还是什么?
还有什么能让这个功能运行这么长时间?

BlackBox 发表于 2022-7-6 06:45:40

听起来像是在处理一个大数据集。。。可能是因为代码效率低下(不确定,因为没有发布任何代码)。
 
在任何情况下,Ctrl+Shift与此无关,只有当您点击Esc时,例程才会由于内置(或本地化的)*错误*处理程序而停止。

irneb 发表于 2022-7-6 06:53:50

我认为OP意味着Ctrl+shift+Esc打开任务管理器,然后从中终止acad。exe进程。 
但是是的,Lisp程序里面可能出了什么问题。可能是一个永远不会结束的循环,或者代码运行效率极低/经过太多迭代。我们只能肯定地说,如果我们可以看到代码-所以等待操作返回更多信息。

pBe 发表于 2022-7-6 07:00:08

 
 
同意,这是最有可能的罪魁祸首。
 
1+

daha 发表于 2022-7-6 07:02:30

对不起,这是代码。
我将其放入宏中,以便在关闭dwg时运行。但是,如果我在一个大的dwg集(150多个)布局上运行代码,那太可怕了。当我试图用ESC取消它时,它什么都不做。所以,我必须等待一个小时,否则就终止这个过程。如果我有时间,这没什么大不了的,但如果我忘记了,我需要保存这幅画(就像我刚才做的那样),那么我就完了。我必须允许它完成才能保存我的更改。
 
 

(vl-load-com)
(defun c:zza (/ *error* oldCtab)
(defun *error* (msg)
   (and oldCtab (setvar 'ctab oldCtab))
   (cond ((not msg))                                                                  ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** ")))                           ; Fatal error, display it
   )
   (princ)
)
(if (and (setq oldCtab (getvar 'ctab))
          (setq acApp (vlax-get-acad-object))
   )
   (foreach tab (layoutlist)
   (setvar 'ctab tab)
   (vla-zoomall acApp)
   )
)
(*error* nil)
)


BlackBox 发表于 2022-7-6 07:09:55

 
 
我觉得那看起来很熟悉。
 
... 那么为什么不先检查未保存的更改呢?
 

(vl-load-com)

(defun c:ZoomAll (/ *error* oldCtab acApp mspace)

(defun *error* (msg)
   (and oldCtab (setvar 'ctab oldCtab))
   (cond ((not msg))                                                   ; Normal exit
         ((member msg '("Function cancelled" "quit / exit abort")))    ; <esc> or (quit)
         ((princ (strcat "\n** Error: " msg " ** ")))                  ; Fatal error, display it
   )
   (princ)
)

(if (= 0 (getvar 'dbmod))
   (if (and (setq oldCtab (getvar 'ctab))
            (setq acApp (vlax-get-acad-object))
       )
   (foreach tab (layoutlist)
       (setvar 'ctab tab)
       (if (setq mspace (< 1 (getvar 'cvport)))
         (vla-put-mspace acDoc :vlax-false)
       )
       (vla-zoomall acApp)
       (if mspace
         (vla-put-mspace acDoc :vlax-true)
       )
   )
   )
   (prompt "\n** Unsaved changes, save and try again ** ")
)

(*error* nil)
)

BlackBox 发表于 2022-7-6 07:19:51

 
[皮特·坎贝尔声音]
 
... 像这样的事情。
 

 
http://gregjhunter.files.wordpress.com/2010/08/pete.jpg
 
#疯子

fixo 发表于 2022-7-6 07:27:08

在遍历布局时可能会更快,
而不是:


(foreach tab (layoutlist)


....


)

使用此选项:

(setq olayouts(vla-get-layouts doc))
(vlax-for olayout olayouts


;|rest code here|;


)

未测试

alanjt 发表于 2022-7-6 07:34:02

我最近将我的更改为:
 
(defun c:ZAL (/ ctab)
;; Zoom extents of viewport in All Layouts (excluding Model)
;; Alan J. Thompson
(or *Acad* (setq *Acad* (vlax-get-acad-object)))
(or *AcadDoc* (setq *AcadDoc* (vla-get-activedocument *Acad*)))
(setq ctab (getvar 'CTAB))
(foreach layout (layoutlist)
   (setvar 'CTAB layout)
   (vla-put-mspace *AcadDoc* :vlax-false)
   (vla-zoomwindow *Acad* (vlax-3d-point (getvar 'LIMMIN)) (vlax-3d-point (getvar 'LIMMAX)))
)
(setvar 'CTAB ctab)
(princ)
)
页: [1]
查看完整版本: 你如何在取消符中编码