bfordmn 发表于 2022-7-6 07:17:00

从LIS设置AECC_点

关于从AECC_点提取信息,似乎有很多主题,但在LISP例程中设置AECC_点,我找不到任何主题。
 
自2000年初以来,我没有编写过多少lisp,但现在我们需要一个在LDD 2004中运行的例程,该例程将在DWG中大约500个小圆圈的集合中心放置一个AECC_点。我创建一个圆的选择集并通过SS循环以获得中心点不会有任何问题,但我不知道如何使用lisp执行“放置点手册”。
 
与图标相关的命令是:
 
^C^C^C^P(cr\U mnl)(zz\U sdsk’(cg:设置:手动));LDD公司
 
我只需要能够从lisp中执行一个“命令”,该命令将触发放置点手动命令。然后,我将从SS中的每个圆向其提供中心点坐标。
 
任何帮助都将不胜感激。
 

BlackBox 发表于 2022-7-6 07:35:14

欢迎来到CADTutor。
 
遗憾的是,Land Desktop使用外部数据库,内部命令不能像通用AutoCAD命令那样暂停以供用户输入。
 
唯一可以做到这一点的方法是与外部ActiveX COM AeccApplication对象进行交互。
 
请考虑位于\\帮助\目录:
 

(defun c:LAG () (c:LandAutoGuide))
(defun c:LandAutoGuide (/ file path)
(if (setq path (findfile (setq file "landauto-guide.chm")))
   (startapp "explorer" path)
   (prompt (strcat "\n** \"" file "\" cannot be found ** "))
)
(princ)
)

(defun c:LAR () (c:LandAutoReference))
(defun c:LandAutoReference (/ file path)
(if (setq path (findfile (setq file "landauto-reference.chm")))
   (startapp "explorer" path)
   (prompt (strcat "\n** \"" file "\" cannot be found ** "))
)
(princ)
)

bfordmn 发表于 2022-7-6 07:48:00

谢谢你的回复。我觉得在LISP中放置点会很困难。考虑到我的土气和缺乏时间,我可能不会追求这一更复杂的方法。
 
我决定简化这个问题。由于LDD命令“自动创建点”将在任意数量的互连线的末端设置点,所以我所要做的就是循环通过每个圆元素并创建一个长的互连线串。然后,在LISP之外,我可以简单地运行“自动创建点”命令,选择由LISP创建的长线段,点将放置在每个圆心。
 
这个解决方案没有那么优雅,但编写起来要简单得多,执行起来也几乎一样快。
 
再次感谢。

SLW210 发表于 2022-7-6 08:03:22

请阅读代码发布指南,并编辑您的帖子以包含代码标签。

BlackBox 发表于 2022-7-6 08:25:28

考虑到您使用的是“哑”圆(不读取点编号、属性或对象数据等),为什么不直接将每个圆的坐标导出到ASCII文本文件(PNEZ?)中呢,然后作为点导入?
 
我认为这比试图在每个圆上执行Land Desktop命令(速度慢得出奇)要高效得多。
 

(vl-load-com)

(defun c:CTOA () (c:CircleToAscii))
(defun c:CircleToAscii
      (/ *error* ss n i path acApp acDoc oShell file pt)
(princ "\rCIRCLETOASCII ")

(defun *error* (msg)
   (if oShell
   (vlax-release-object oShell)
   )
   (if file
   (close file)
   )
   (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 ss (ssget "_:L" '((0 . "CIRCLE"))))
          (setq n (sslength ss))
          (setq i 0)
          (setq path
               (strcat (vl-filename-directory (vl-filename-mktemp))
                         "\\"
                         (vl-filename-base (getvar 'dwgname))
                         "_"
                         (menucmd "M=$(edtime,$(getvar,date),YYYY-MO-DD)")
                         "_PNEZ"
                         ".txt"
               )
          )
          (setq acApp (vlax-get-acad-object))
          (setq acDoc (vla-get-activedocument acApp))
          (princ "\nWorking, please wait...")
          (princ)
          (setq oShell
               (vla-getinterfaceobject acApp "Shell.Application")
          )
   )
   (progn
   (if (findfile path)
       (vl-file-delete path)
   )
   (setq file (open path "w"))
   (vlax-for x (setq ss (vla-get-activeselectionset acDoc))
       (write-line
         (strcat
         (itoa (setq i (1+ i)))
         ","
         (rtos (cadr (setq pt (vlax-get x 'center))))
         ","
         (rtos (car pt))
         ","
         (rtos (last pt))
         )
         file
       )
   )
   (setq file (close file))
   (vla-delete ss)
   (prompt (strcat "\n** " (itoa n) " circles processed ** "))
   (vlax-invoke oShell 'open path)
   (*error* nil)
   )
   (cond (acDoc
          (*error* "Unable to create \"Shell.Application Object\"")
         )
         (n (*error* "Unable to create temporary file"))
         ((*error* "No circles selected"))
   )
)
)
页: [1]
查看完整版本: 从LIS设置AECC_点