MisterJingles 发表于 2022-7-5 17:12:59

脚本错误

大家好
 
几年来,我一直在使用下面的脚本计算dwg中的线条长度,没有问题。
今天我得到了以下错误。。。
 
“如果未事先调用(*push error using command*),则无法从*error*调用(命令)。
建议将(命令)调用转换为(命令-s)。"
 
我不是程序员,所以我看不出问题出在哪里。有人知道哪里有问题吗?
 
非常感谢
抢劫
 
 
脚本错误。txt文件
脚本错误。txt文件

MisterJingles 发表于 2022-7-5 17:19:18

结果是我们办公室的其他用户运行这个脚本没有任何问题,所以出现了另一个问题。
我被难住了,时间不多了。

SLW210 发表于 2022-7-5 17:19:38

这将有助于张贴在正确的论坛。我已经将您的帖子转移到AutoLISP、Visual LISP和DCL论坛。

MisterJingles 发表于 2022-7-5 17:25:28

很好,谢谢你把它搬过来。

Grrr 发表于 2022-7-5 17:26:41

因此,我只不过是将(vl load com)添加到您的“脚本”中,并将所有“命令”重命名为“command-s”,为我测试和工作:
(defun dxf (n ed) (cdr (assoc n ed)))

(defun bom-code (ssfilter      /       errexit undox   restore
*error* olderroldcmdecho      %l      %t
sset    %i      en      ed      p1      p2
ot      a1      a2      r
)
(defun errexit (s)
(princ)
(restore)
)

(defun undox ()
(command-s "._undo" "_E")
(setvar "cmdecho" oldcmdecho)
(setq *error* olderr)
(princ)
)

(setq olderr*error*
restore undox
*error* errexit
)
(setq oldcmdecho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command-s "._UNDO" "_BE")
(setq %i 0
%t 0
)
(vl-load-com)
(setq sset (ssget ssfilter))
(if sset
(progn
   (princ "\nLengths:")
   (repeat (sslength sset)
                (setq en (ssname sset %i))
                (setq ed (entget en))
                (setq ot (dxf 0 ed))
                (setq curve (vlax-ename->vla-object en))
                (if (vl-catch-all-error-p
                        (setq len        (vl-catch-all-apply
                                'vlax-curve-getDistAtParam
                                (list        curve
                                        (vl-catch-all-apply
                                                'vlax-curve-getEndParam
                                                (list curve)
                                        )
                                )
                        )
                        )
                )
                nil
                len
                )
                (setq %l len)
               
                (setq %i (1+ %i)
                        %t (+ %l %t)
                )
                (terpri)
                ;(princ %l )
                (princ (rtos %l (getvar "lunits")(getvar "luprec")))
        )
   (princ "\nTotal = ")
   ;(princ %t)
   (princ (rtos %t (getvar "lunits")(getvar "luprec")))
   (textpage)
)
)
(setq sset nil)
(restore)
)

(defun bom-code-old (ssfilter      /       errexit undox   restore
*error* olderroldcmdecho      %l      %t
sset    %i      en      ed      p1      p2
ot      a1      a2      r
)
(defun errexit (s)
(princ)
(restore)
)

(defun undox ()
(command-s "._undo" "_E")
(setvar "cmdecho" oldcmdecho)
(setq *error* olderr)
(princ)
)

(setq olderr*error*
restore undox
*error* errexit
)
(setq oldcmdecho (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command-s "._UNDO" "_BE")
(setq %i 0
%t 0
)
(setq sset (ssget ssfilter))
(if sset
(progn
   (princ "\nLengths:")
   (repeat (sslength sset)
                (setq en (ssname sset %i))
                (setq ed (entget en))
                (setq ot (dxf 0 ed))
                (cond
                        ((= ot "LINE")
                                (setq p1 (dxf 10 ed)
                                        p2 (dxf 11 ed)
                                        %l (distance p1 p2)
                                )
                        )
                        ((= ot "ARC")
                                (setq a1 (dxf 50 ed)
                                        a2 (dxf 51 ed)
                                        r(dxf 40 ed)
                                        %l (* r (abs (- a2 a1)))
                                )
                        )
                        (t
                                (command-s "._area" "_obj" en)
                                (setq %l (getvar "perimeter"))
                               
                        )
                )
                (setq %i (1+ %i)
                        %t (+ %l %t)
                )
                (terpri)
                (princ %l)
        )
   (princ "\nTotal = ")
   (princ %t)
   (textpage)
)
)
(setq sset nil)
(restore)
)

(defun c:lmeasure ()
(initget "Lines Arcs Polylines Splines ALL")
(setq ans (getkword
        "Enter an option : "
)
)
(cond
        ((= ans "Lines") (c:bom_lines))
        ((= ans "Arcs") (c:bom_arcs))
        ((= ans "Polylines") (c:bom_polylines))
        ((= ans "Splines") (c:bom_splines))
        (t
                (bom-code '((-4 . "<OR")
                        (0 . "LINE")
                        (0 . "ARC")
                        (0 . "POLYLINE")
                        (0 . "LWPOLYLINE")
                        (0 . "SPLINE")
                        (-4 . "OR>")
                )
                )
        )
)
(princ)
)

(defun c:bom_lines ()
(bom-code '((0 . "LINE")))
(princ)
)

(defun c:bom_arcs ()
(bom-code '((0 . "ARC")))
(princ)
)

(defun c:bom_polylines ()
(bom-code '((-4 . "<OR")
        (0 . "POLYLINE")
        (0 . "LWPOLYLINE")
        (-4 . "OR>")
)
)
(princ)
)

(defun c:bom_splines ()
(bom-code '((0 . "SPLINE")))
(princ)
)
(vl-load-com)
有趣的代码,我可能会重写它进行练习。

MisterJingles 发表于 2022-7-5 17:30:38

谢谢Grrr,似乎发生了一些奇怪的事情。我不再收到错误消息,但也没有收到值。请参见图。
它再次给了我的同事们想要的结果,所以我的ACADM安装似乎有问题。
 

 
至少我知道代码是对的。我前一段时间从Cadtutor那里拿到的,它对我来说是无价的。

ReMark 发表于 2022-7-5 17:33:04

回避问题。。。你的系统发生了什么事,你是唯一一个无法运行到现在为止运行完美的脚本的人?最近发生了什么变化?
 
是否尝试关闭然后重新启动AutoCAD?
 
您最近下载并使用过任何自定义lisp例程吗?
 
你最近有没有什么原因不明的电脑问题?

Tharwat 发表于 2022-7-5 17:37:54

这可能很有趣

MisterJingles 发表于 2022-7-5 17:39:23

这就是我绞尽脑汁想弄明白的。
我关闭并重新启动了不止一次,我重置了ACAD设置,导入了同事设置(脚本在其PC上运行良好),但仍然没有任何乐趣。
绝对没有下载其他自定义lisp例程,也没有遇到任何其他PC问题。
 
我唯一能想到的是周五我们进行了一些Inventor培训,讲师坐在我的电脑前,插上鼠标,还有他的HD安装了一些额外的内容库,然后开始了Inventor的工作。我已经和他谈过了,他想不出是什么原因导致了我今天的问题,尽管这似乎太巧合了。

Grrr 发表于 2022-7-5 17:42:39

Jingles先生,请尝试以下代码以确定是否是visual lisp扩展失败:
(defun C:test ( / s o len )
(alert "\nSelect a line to display its length. ")
(if (setq s (ssget "_+.:E:S" (list (cons 0 "LINE"))))
        (progn
                (setq o (vlax-ename->vla-object (ssname s 0)))
                (setq len (vlax-curve-getDistAtParam o (vlax-curve-getEndParam o)))
                (alert (strcat "\nLine length is: " (rtos len 2 2) " units."))
        )
)
(princ)
)
(vl-load-com)(princ)
页: [1] 2
查看完整版本: 脚本错误