dnovember99 发表于 2022-7-5 15:06:05

osmode正在更改

所以我有一个特定的设置方式,我有一个lisp例程,我可以键入一个命令,将它们全部设置回特定的方式。但由于某些原因,当我在命令中时,它会工作,然后当我退出命令或按ESC键时,在完成命令之前,我的所有设置都会运行!例如,我的osnap设置关闭,我的极轴设置从我设置的(15度)开始,然后它将其更改2.5度。东正教有时会关闭或打开。
 
无论我完成命令还是按ESC键,都会发生这种情况。我对lisp做了一些修改,试图让它对我有用,但我似乎无法让它工作。
 
有人知道这个问题的解决方法吗?还是更好的解决方案?几乎每次我运行任何命令时都会发生这种情况。
 
 
 
谢谢大家
 

(defun c:K ()
(setvar "POLARMODE" 1)
(setvar "osmode" 551)
(setvar "POLARANG" (angtof "15.0"))
)
;;when you type K, it resets your osnaps to your custom setting

;;Custom Routines

(defun c:c0 () (command "_copybase" "0,0") )
(defun c:v0 () (command "_pasteclip" "0,0") )
(defun c:ZZ () (command "layfrz") )

(load "_RC-CLOUDS")
(defun c:KL () (load "_KL") (C:KL))
;;DRAW BACKWARDS 3-POINT LEADER
(defun c:T2MT () (load "T2MT-MT2T") (C:T2MT))
;;TEXT TO MTEXT
(defun c:VB () (load "_VB") (C:VB))
;;VIEWPORT BOX IN MODELSPACE
(defun c:XRR () (load "XRR") (C:XRR))
;;XREF RELOAD
(defun c:XRV () (load "XRV") (C:XRV))
;;XREF RELOAD WITH VISRETAIN
(defun c:XRU () (load "XRU") (C:XRU))
;;XREF DETACH
(defun c:explodable () (load "explodable") (C:explodable))
;;explodable
(defun c:cleanbase () (load "cleanbase") (C:cleanbase))
;;Clean base drawing
(defun c:cleantitle () (load "cleantitle") (C:cleantitle))
;;Clean title drawing

(Defun c:ERD () (load "_ERD") (c:ERD))
(Defun c:ERH () (load "_ERD") (c:ERH))
(Defun c:ERT () (load "_ERD") (c:ERT))

(Defun C:QS () (command ".qsave") (princ))
(defun c:read ()
(defun c:qs () (alert "NO! NO! NO! NO! NO! NO!"))
)


(defun c:Dave()
(load "_0Dave.lsp")
(alert "Dave - list of commands \nK - Your ACAD Defaults \nQS - Quick Save \nERH Erase Hatch \nMA Match Properties\nREAD - removes Quick Save command \nKL - Draw backwards three point leader \nCleantitle - Clean title drawing \nCleanBase - Clean base drawing\nRCC - Rev Cloud Sketch \nRCB - Rev Cloud Block")
)

(print "Dave Lisp Loaded Successfully!")
(princ)

(defun c:MA () (COMMAND "MATCHPROP") )
;;XREF DETACH
 
 
这是我原来帖子的链接。
 
http://www.cadtutor.net/forum/showthread.php?104632-osmode-is-always-changing&p=704537#post704537

tombu 发表于 2022-7-5 15:14:29

 
您是说,在运行AutoCAD命令后,还是在从加载的lisp例程之一运行自定义命令后,所有系统变量设置都会变为wakko?
 
如果在从加载的lisp例程之一运行自定义命令后发布它,以便我们可以查看它,我可以假设您发布了acaddoc吗。lsp文件?

dnovember99 发表于 2022-7-5 15:17:22

 
这不仅仅是通过一个自定义的lisp例程来实现的。甚至当我画一条简单的线,做匹配属性(在lisp上面我把它设置为MA),镜像或者其他任何事情的时候。
 
我对整个lisp程序还是比较陌生,所以如果这听起来不好,我很抱歉。但是acadoc。lsp?如果这让你发笑,请继续,哈哈

tombu 发表于 2022-7-5 15:22:13

阿卡多克。每次打开图形时,lsp都会加载,因此其中定义的任何lisp在任何打开的图形acad中始终可用。lsp仅在打开AutoCAD时加载。
这些文件是用户定义的,不随AutoCAD一起安装。
 
我猜是上面代码中加载的lisp例程之一导致了这个问题。因为你没有使用过阿卡多克。lsp您必须已使用Appload添加了上述代码。尝试从中删除代码,然后查看重新启动AutoCAD是否可以解决此问题。
 
然后从命令行一次一个地加载这些例程,测试每个例程,看看哪个例程使系统变量设置变为wakko。发布使您的系统变量设置变为wakko的例程,我们将能够为您修复它。

dnovember99 发表于 2022-7-5 15:27:30

 
 
我认为我发现了一个可能的问题。在同一个文件夹中有两个lisp例程(但对其中一个稍作修改)会导致这个问题吗?我还使用了lee mac的autoloader。但在自动加载器中,它只有其中一个文件。
 
这是我的自动加载器文件(****是我屏蔽的个人信息。因为我在工作电脑上。)
 
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/AlignTextV1-4.lsp" '("AT"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/BreakObjects22.LSP" '("BREAKALL" "BREAKOBJECT" "BREAKWOBJECT" "BREAKWLAYER" "BREAKWITH" "BREAKTOUCHING" "BREAKWITHTOUCHING" "BREAKSELECTED" "BREAKREMOVE" "MYBREAK"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/BREAL ALL (BRKALL).lsp" '("BRKALL"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/BubbleOff.lsp" '("BOFF"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/CHANGE TEXT STYLE (CTS).lsp" '("CTS"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/creater.lsp" '("CREATE"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/del-layer.lsp" '("DEL-LAYER" "MDEL-LAYER"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/DynamicTextAlignV1.0.lsp" '("DTA"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/EXISTING TO REMAIN TEXT(ENT).LSP" '("ENT"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/FLIP IT.lsp" '("FLIP"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/GTTR.lsp" '("GTTR" "BTI" "GTTI"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/JTEXT V1.0.LSP" '("JTEXT"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/JTEXT V2.0.LSP" '("JTEXT"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/justify.lsp" '("JL" "JR"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/layer color change (LC).lsp" '("LC"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/Layer No Plot (LNP).LSP" '("LNP"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/Layer plot (LP).LSP" '("LP"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/NO SPACES.LSP" '("NOSPACE"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/pipe-calc.lsp" '("INVERT"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/PLOT NO PLOT.LSP" '("LNP" "LP"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/Scale All Tags(SX).lsp" '("SX"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/Scale Text Height(TH).lsp" '("TH"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/Spin Block(SPB).lsp" '("SPB"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/t2m.lsp" '("T2M"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/TEXT TO LEADER (TXL).LSP" '("TXL" "TEXTLEADER"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/TRIM BETWEEN LINES(TB2).lsp" '("TB2"))
(autoload "C:/Users/dave********/Desktop/LISP ROUTINES/XrefBind.LSP" '("XB"))

 
以下是一个lisp的代码:
;; ENTER COMMAND OF (SX) SELECT ANY TAGS THAT YOU WANT TO CHANGE THE SCALE ON/
;; 48 = 1/4" SCALE96 = 1/8" SCALE.
;; YOU CAN SELECT MULTI TAGS AT ONCE. AFTER YOU HAVE YOUR NEW SCALE ALL THAT YOU WILL NEED TO DO IS
;; REARRANGE BUT THIS ELMINATES YOU HAVING TO SELECT WHAT YOU WANT, GO TO PROPERTIES AND CHANGE EACH
;; VALUE OF THE X, Y AND Z AXIS (THIS COMMAND WILL ALSO REMEMBER THE LAST SCALE FACTOR USED).
(defun c:SX (/ i s)
(or (setq i (getenv "ScaleIt")) (setq i "48."))
(if (and (not (initget 2))
   (setq i (cond ((getreal (strcat "\nEnter block scale[<" i ">]: ")))
               ((read i))
           )
   )
   (setq s (ssget ":L" '((0 . "insert"))))
   (setenv "ScaleIt" (vl-princ-to-string i))
   )
   (foreach b (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
   (foreach c '("X" "Y" "Z")
(vl-catch-all-apply 'vlax-put (list b (read (strcat c "ScaleFactor")) i))
   )
   )
)
(princ)
)
(vl-load-com)
 
这是相同的代码,只是顶部的措辞略有变化
;; TAG SCALE - 11.28.2017
;; ENTER COMMAND OF (SX) SELECT ANY TAGS THAT YOU WANT TO CHANGE THE SCALE ON/
;; 48 = 1/4" SCALE96 = 1/8" SCALE.
;; YOU CAN SELECT MULTI TAGS AT ONCE. AFTER YOU HAVE YOUR NEW SCALE ALL THAT YOU WILL NEED TO DO IS
;; REARRANGE BUT THIS ELMINATES YOU HAVING TO SELECT WHAT YOU WANT, GO TO PROPERTIES AND CHANGE EACH
;; VALUE OF THE X, Y AND Z AXIS (THIS COMMAND WILL ALSO REMEMBER THE LAST SCALE FACTOR USED).
(defun c:SX (/ i s)
(or (setq i (getenv "ScaleIt")) (setq i "48."))
(if (and (not (initget 2))
   (setq i (cond ((getreal (strcat "\nEnter block scale[<" i ">]: ")))
               ((read i))
           )
   )
   (setq s (ssget ":L" '((0 . "insert"))))
   (setenv "ScaleIt" (vl-princ-to-string i))
   )
   (foreach b (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
   (foreach c '("X" "Y" "Z")
(vl-catch-all-apply 'vlax-put (list b (read (strcat c "ScaleFactor")) i))
   )
   )
)
(princ)
)
(vl-load-com)
 
我仍将卸载所有这些文件,然后尝试查找导致问题的文件。我还注意到,我在自动加载器中有一些我不经常使用的东西,所以是时候修剪脂肪了。

tombu 发表于 2022-7-5 15:29:14

使用自动加载器的最大优点是,在第一次运行命令之前不会加载完整的lisp。所以在你使用它们之前,这些都不会引起问题。
另一方面,由于您在第一篇文章中似乎以某种方式加载了代码,因此可能会导致问题。

dnovember99 发表于 2022-7-5 15:33:41

 
所以在删除了我在appload下启动的所有内容之后。我发现其中两个Lisp程序是问题的根源。但我也注意到,当我打开极轴追踪并将其设置为15度时,如果我画一条不在15度的线,那么绘制的下一段线就会被弄乱并偏离2-5度。
 
但这是我注意到的两个Lisp程序
 
;; THIS WILL ALLOW YOU TO BE ABLE TO CHOOSE IF YOU WANT TO HAVE THIS AT THE BEGINNING OR THE END OF TEXT
;; AFTER SELECTING P OR S YOU CAN PLACE WHAT EVER TEXT YOU WANT.
;; THIS WILL ADD TO THE BEGINNING RO THE END OF EACH SELECTED TEXT GROUP.
;;
;;
(defun c:ENT (/ PreSuf Str ent Cstr)
(vl-load-com)
(initget "P S")
(setq PreSuf (getkword "\nChoose <Prefix>: "))
(if (not PreSuf)
   (setq PreSuf "S")
)
(while (not str)
   (setq str (getstring T "\nEnter String: "))
   (cond ((and (eq str "")
(princ "Null Input Try again")
(setq str nil)
   )
)
   )
)
(while (and (setq ent (car (nentsel "\nSelect Text/Attribute: ")))
      (member (cdr (assoc 0 (entget ent)))
       '("TEXT" "MTEXT" "ATTRIB")
      )
)
   (setq ent(vlax-ename->vla-object ent)
Cstr (vla-get-textstring ent)
   )
   (vla-put-textstring
   ent
   (if (eq PreSuf "S")
(strcat Cstr "" str)
(strcat str "" Cstr)
   )
   )
)(princ)
)
 
(defun C:FLIP ( / L f )
(and
   (setq L
   (CycleInputs
       '(
         (SS (progn (princ "\n>>Select objects to mirror: ") (ssget "_:L")))
         (p1 (progn (initget "Exit") (apply 'getpoint (append (if p2 (list p2)) '("First Point : ")))) )
         (p2 (progn (initget "Exit") (apply 'getpoint (append (if p1 (list p1)) '("Second Point : ")))) )
       )
       (lambda (s v) (= "Exit" v) )
   ); CycleInputs
   ); setq L
   (= 3 (length L)) (setq f (lambda (x) (cdr (assoc x L))))
   (progn
   (setvar 'cmdecho 0)
   (command "_.MIRROR" (f 'SS) "" "_non" (f 'p1) "_non" (f 'p2) "Y")
   (setvar 'cmdecho 1)
   )
)
(princ)
); defun C:flip


(defun CycleInputs ( inpL exitf / tmp )
(cond; (87 114 105 116 116 101 110 32 98 121 32 71 114 114 114)
   ( (not inpL) inpL)
   ( (setq tmp (vl-catch-all-apply (function (lambda (a b) (set a (eval b)))) (car inpL)))
   (cond
       ( (vl-catch-all-error-p tmp) (prompt (vl-catch-all-error-message tmp)) )
       ( (and exitf (vl-catch-all-apply (function exitf) (list (caar inpL) tmp))) (set (caar inpL) nil) )
       (
         (mapcar (function (lambda (tmp) (set (car tmp) nil) tmp))
         (cons (cons (caar inpL) tmp) (CycleInputs (cdr inpL) exitf))
         )
       )
   )
   )
   ( (CycleInputs (reverse (cons (car inpL) (reverse (cdr inpL)))) exitf) )
)
)
 
再次感谢您的帮助/

dnovember99 发表于 2022-7-5 15:37:41

我想知道的是,如果您要将错误处理程序lisp例程保存在所有lisp例程所在的同一个文件中,并且您运行的每个lisp例程在使用自定义lisp时都会调用错误处理程序?这是可能的吗?

tombu 发表于 2022-7-5 15:41:48

ENT被定义为函数名和局部变量。我会修改函数名,因为ENT是最常用的lisp变量之一,因为它用于实体。仅供参考:Cadalyst tip 1527A DDAPTXT。LSP追加到文本©1999年6月,Scott A.Matthews有一个很好的对话框例程,用于向文本添加前缀和后缀。
 
FLIP的全局变量可能与加载到图形中的其他代码冲突。
改变
8
通常用于选择集的SS可能是最常用的lisp变量。

tombu 发表于 2022-7-5 15:47:42

 
通常,我会将*ERROR*添加为局部变量,并在主函数中定义一个*ERROR*函数,以便在需要时重置所有内容,而不修改默认的*ERROR*函数。
任何允许用户输入或运行足够长时间以使某人按Esc键的功能都需要说明有人响应不正确。只有在例程顺利完成时,才能在例程结束时重置系统变量。
页: [1] 2
查看完整版本: osmode正在更改