StevJ 发表于 2022-7-6 14:13:07

调用另一个LISP失败

似乎无法完全正确地执行此操作。
 
在古代(!)下面是我在工作中使用的例行程序(但还不知道如何清理),有一句话:
(命令“DDATTE”bname)在下面的代码块中显示为红色
这将为刚创建的区域打开属性编辑器,以便可以输入属性数据。
 
我偶然发现CAB有一个很好的DDATTE/ATTEDIT替代品,叫做MyAttEdit。
它很容易修改以显示更多的属性行,这使得它比ATTEDIT有用得多,所以我想我应该尝试将其作为程序的一部分。
 
LSP和DCL位于支持路径中,LSP也位于acad中。文档文件。
作为一个独立的程序,它工作得很好,但当我尝试用这个例程调用它时。我得到错误“未知命令MyAttEdit”并且主例程退出。
 
当然,使用行(C:MyAttEdit)可以让它运行,但它不再与“bname”关联、连接或作用。
需要保持这种联系。
 
我想我遗漏了一些非常基本的东西,但我的大脑不想合作。
我在这里和这里阅读并尝试实施这些想法,但没有乐趣。
 
有人能给我指一下正确的方向吗?
 
谢谢
史蒂夫
 
 

;* DATE 05/20/93
;*REVISED 08/08/00
(setvar "REGENMODE" 1)
;***********************************************************************
;* Function: DXF (Generic)
;* Created by: Rocky W. (3/10/94)
;* Parameters in:
;* Returns:
;* Comments: takes an integer DXF code and an entity list, and
;*    returns the data element of the associated pair.
(defun err (s)
(if (not (MEMBER s '("console break " "Function cancelled")))
   (princ (strcat "\nERROR: " s))
)
(progn

   ;(command "_.U")
   ;(COMMAND "_.redraw")
)

(setq *error* olderr)
(princ)
)
(defun DXF (code elist)
(cdr (assoc code elist))
)
;***********************************************************************
;* Function:C:Hotspot
;* Used by:DSD group
;* Parameters in:
;* Returns:
;* Comments:Used to semi automate the process of assigning attributes to
;*          blocks and regions in a drawing.
;*          region is update by autobox for exiting region with new cords.
(defun C:AUTOROCK(/ olderr)

(c:BOXQA) ; outlines existing attributed regions (helps track progress across the drawing)

(command "ucs" "w");this sets the UCS back to World
(if (tblsearch "LAYER" "NOPLOT")
   (command "_.Layer" "_S" "NOPLOT" "U" "NOPLOT" "")
   (Progn
      (command "_.Layer" "_M" "NOPLOT" "_C" "MAGENTA" "NOPLOT" "_LT" "CONTINUOUS" "NOPLOT" "U" "NOPLOT" "")
   )
)      
(setq rin nil
   mrin ""
   ulsize nil
   lrsize nil
   textdatin ""
   textdatout ""
   var (getvar "CMDECHO")
   atvar (getvar "AFLAGS")
   a2 nil
   atblk 1
   dname (getvar "dwgname")
   strleg (strlen dname)
   strleg1(- strleg 4)
   dpre(getvar "dwgprefix")
drawname (substr dname 1 strleg1))

(setq olderr *error* *error* err)
(setq cmdech var)
(setvar "AFLAGS" 1)

(autobox2)       ;* call function
; draw box from selection

(setq p2 (list (car ul) (cadr lr) )) ;lr corner
(setq p4 (list (car lr) (cadr ul) )) ;lr corner
;function to draw colored vectored region
(grdraw ul p2 7 1)
(grdraw p2 lr 7 1)
(grdraw ul p4 7 1)
(grdraw p4 lr 7 1)

(prompt "\nPick all items that make up unit...")
(setq ss2 (ssget))
(setq a (dxf 2 (entget (ssname ss2 0))))

(if (/= a nil)

   (setq a2 (tblsearch "BLOCK" a))   ;* true if a is a block

   (progn                               ;* false

      (setq xxx(sslength ss2))   ;loop counter
      (setq cxxx 1)

      (setq textdat "")
      (while (<= cxxx xxx)
         (setq dat1 (entget (ssname ss2 (- cxxx 1))))

         (setq txttype (cdr (assoc 0 dat1)))
         (if (= txttype "TEXT")
            (progn                  ;* progn start
               (setq txt1 (dxf 1 dat1));if false
               (setq textdat (strcat textdat txt1 " "))
               (setq cxxx (+ 1 cxxx))
            )                         ;*progn end
         ) ;* endif
      ) ;while end
   ) ;*progn end
) ;*endif block check

(if rin ()(setq rin ""))

(setq dscord (dxf 10 (entget (ssname ss2 0))))   ;* get insert point
(setq dscord (list (- (car dscord) 0.05) (-(cadr dscord) 0.05)))

(setq bname (ssname ss2 0))

(if (and (/= a nil)(= (sslength ss2) 1)(/= a2 nil))
   (progn

      (setq en bname)
      (setq ed (entget en))

      (while (/= "SEQEND" (dxf 0 ed))                     ;*** while 2
         (setq en (entnext en))
         (setq ed (entget en))
         (setq tag (dxf 2 ed))
         (setq val (dxf 1 ed))

         (if (/= "SEQEND" (dxf 0 ed))                     ;*** if 2
            (progn                                          ;*** progn 2
               (if (= "BOXSIZE" TAG)                              ;*** if 3
                  (progn                                          ;*** progn 3
                     (setqttval (read val))
                     ;*      (strcase ttval)
                     (if (/= ttval BSIZE)
                        (progn         
                           (setq ed (subst (cons 1 BSIZE)(assoc 1 ed) ed ))
                           (entmod ed)
                           (entupd en)
                           (PRINC (STRCAT "BOXSIZE CHANGED" BSIZE " " VAL "   "))

                        )
                     )
                  )                                                ;*** progn 3
               )                                                 ;*** endif 3
            )                                                ;*** progn 2
         )                                                   ;*** endif 2
      )                                                    ;*** while 2
;;;
;;;   In place of this line, I would like to call CAB's routine MyAttEdit
(command "DDATTE" bname)
;;;   
;;;   
)
   (progn
      (command "attdef" "" "NAME" "Enter NAME." textdat dscord "")
      (setq nameattr1 (entlast))
      (command "attdef" "" "RIN" "Enter RIN." RIN dscord "")
      (setq nameattr2 (entlast))                                    
      (command "attdef" "" "BOXSIZE""Enter boxsize.   " bsize dscord "")
      (setq nameattr3 (entlast))
      (command "attdef" "" "MRIN""Enter SCLSIS Rin." mrin dscord "")
      (setq nameattr4 (entlast))
      (setq CurLayer( getvar "clayer"))
      (command "attdef" "" "CURRENTLAYER" "Enter Current Layer." "NOPLOT" dscord "")
      (setq nameattr5 (entlast))
      (command "attdef" "" "SHAPE" "Enter Object Shape Type." "R" dscord "")
      (setq nameattr6 (entlast))
      (command "attdef" "" "OBJTYPE" "Enter Object Type." "EQ" dscord "");MOD BY JDR 8/8/00
      (setq nameattr7 (entlast))

      (setq bname   (itoa atblk))

      (while (tblsearch "BLOCK"   (strcat drawname "$ECC$" bname))
         (progn                                       
            (setq atblk (+ atblk 1)                  
               bname(itoa atblk))
         )
      )
       (setq bname (strcat drawname "$ECC$" bname))
   (progn
         (command "block" bname dscordnameattr1 nameattr2 nameattr3 nameattr4 nameattr5 nameattr6 nameattr7 )
         (setq count 0
         emax (sslength ss2)
         )
         (while (< count emax)
         (command (ssname ss2 count))
         (setq count (1+ count))
         )
         (setvar "ATTREQ" 1)
         (setvar "ATTDIA" 1)
         (command "" "insert" bname dscord "1" "1" "0" )
   )
   )
)
(command "redraw") ;clears existing region outlines so NOID regions will display
(NOID) ;* call function to display "neglect" regions
)
(princ)

(defun AUTOBOX2()
(setq bsize nil)
(setq ul (getpoint "Pick UL corner: ")
lr (getcorner ul "Pick LR corner: "))
(setq bsize (strcat "("(rtos (car ul) 2 6) " " (rtos (cadr ul) 2 6) " " (rtos (car lr) 2 6) " " (rtos (cadr lr) 2 6)")" ))
);AUTOBOX2

;;This part written by LeeMac (cadtutor.net) 14 May 2009. Thanks, Lee.
(defun NOID (/ ss attLst Box ul lr); To outline regions with no ID
(vl-load-com)
(if (setq ss (ssget "_X" '((0 . "INSERT") (66 . 1))))
   (progn
   (foreach Obj (mapcar 'vlax-ename->vla-object
                  (mapcar 'cadr (ssnamex ss)))
       (setq attLst nil)
       (foreach att (vlax-safearray->list
                      (vlax-variant-value
                        (vla-getAttributes Obj)))
         (setq attLst (cons (cons (vla-get-TagString att)
                                  (vla-get-TextString att)) attLst)))
       (if (and (assoc "RIN" attLst)
                (eq "" (cdr (assoc "RIN" attLst)))
                (setq Box (assoc "BOXSIZE" attLst)
                      Box (read (cdr Box))))
         (progn
         (setq ul (list (car Box) (cadr Box))
               lr (list (caddr Box) (cadddr Box)))
         (grvecs (list 1 lr (list (car lr) (cadr ul))
                         1 ul (list (car lr) (cadr ul))
                         1 lr (list (car ul) (cadr lr))
                         1 ul (list (car ul) (cadr lr)))))))))
(princ)
)

Lee Mac 发表于 2022-7-6 14:22:50

您可能需要调整CABs例程以接受参数,或使块对象的变量成为全局变量

StevJ 发表于 2022-7-6 14:26:11

谢谢我试试看。
 
史蒂夫

Commandobill 发表于 2022-7-6 14:29:43

代替这个命令,试试这个
 
(sssetfirst nil bname)
(C:MyAttEdit)

stevesfr 发表于 2022-7-6 14:39:48

比尔,不知道怎么了,但这在这里似乎不起作用。
我得到以下错误,
 
错误:错误的参数类型:lselsetp

Lee Mac 发表于 2022-7-6 14:41:48

这是因为“bname”是一个实体,而不是一个选择集。

StevJ 发表于 2022-7-6 14:46:56

我什么都做不到。我只能接受两步手术。
 
谢谢大家,
史蒂夫

Lee Mac 发表于 2022-7-6 14:54:16

如果你发布CAB的例行程序或链接,我相信我能帮上忙

StevJ 发表于 2022-7-6 14:59:32

谢谢你的提议,李。
 
我不知道如何链接到zip文件,所以我将CAB的zip附加到了这条消息中。
 
原始线程的链接是:
http://www.theswamp.org/index.php?topic=6741.0
 
 
史蒂夫
MyAttEdit 03。拉链

Lee Mac 发表于 2022-7-6 15:03:02

好的,Steve,你所需要做的就是注释顶部的主要函数定义,向下到函数标题,用“+”符号概括。
 
然后,在你的日常生活中,只需:
 

(myattedit bname nil nil)

 
代替你的红色代码。
 
(确保在运行代码时加载CAB的代码)。
 
 
页: [1] 2
查看完整版本: 调用另一个LISP失败