TheZman 发表于 2022-7-6 10:25:58

外部参照代码

你好,我已经潜伏了一段时间的CADTutor论坛。大约几天前,我决定先潜入AutoLISP。
 
通常我喜欢自己想办法解决问题,但现在把它砸在桌子上会让我头痛不已,所以我决定寻求一些专家建议。
 
我们有一个覆盖3个乡镇/地区的服务区。每个部分和某些区域的四分之一部分都是一个地图(图形),因此我一直在尝试在地图边缘获取一个文本实体,以便用户可以单击它们,然后单击一个按钮,该按钮运行lisp例程,该例程自动将正确的部分外部参照到位。这是我目前掌握的代码。
 
(vl-load-com)                                                
(defun C:hyperload ( / ent p1)                                    
(setq ent (entsel "\nSelect text at edge of drawing "))
       (setq p1 (strcat "M:\\NewMaps\\"(vla-get-TextString (vlax-ename->vla-object (car ent)))))
                                                      
   (command "xref"                                          
   "a"                                                
   p1                                                                                 
   "0,0"                                                      
   ""
   ""
   "")
   
(princ)
)
(princ)
问题是当有人外部参照创建循环参照的地图时。它试图在问题中加上“0,0”,然后出错,因为它需要是或否。
为了解决这个问题,我将其从“附加”改为“覆盖”,并在代码中添加了“是”。如果有一个循环引用,并且出现了继续的问题,那么效果很好。
 
那么,我该如何让脚本停止,让用户输入yes或no,然后继续?

如果存在循环参照,我如何使外部参照自动覆盖?
 
关于我想尝试做的其他事情,我还有很多其他问题。但这是目前最大的一个。
谢谢你的回复。

alanjt 发表于 2022-7-6 10:33:43

暂时将专家系统变量设置为5可能允许您忽略循环引用问题。

TheZman 发表于 2022-7-6 10:46:44

谢谢你的回复
我将command expert 5放在xref命令之前,然后在之后返回到0。但循环引用问题仍然存在。只有当有人保存了一个带有外部参照的地图时,才会出现这种情况,这是他们一开始就不应该做的,所以也许我现在就不去管它了。

alanjt 发表于 2022-7-6 10:52:15

值得一试。我自己也有点好奇;可能需要做一些挖掘。

BlackBox 发表于 2022-7-6 11:00:30

只是好奇。。。为什么有循环引用?
 
如果所有外部参照(用于地图)都被外部参照为覆盖,而不是附件(甚至在它们之间,即四分之一截面等),则此问题不存在。
 
相反,如果将地图作为附件外部参照到一个图形中(已卸载),则可以轻松使用ActiveX外部参照该参照,并根据选择加载/卸载后续外部参照。
 
无论如何,*至少*如果你不想全力以赴,我会使用类似的方法:
 

(defun C:hyperload(/ eName)
(vl-load-com)
(if (setq eName (car (entsel "\n>>Select Text at Edge of Drawing: ")))
   (command
   "._-xref"
   "_attach"
   (strcat
       "M:\\NewMaps\\"
       (vla-get-TextString (vlax-ename->vla-object eName)))
   '(0 0 0)
   1
   1
   0))
(princ))

 
请注意,如果用户选择了错误的文本,即任何不是地图名称的内容,这仍然不能防止出现错误

BlackBox 发表于 2022-7-6 11:10:21

*轻微*缓解:
 

(defun C:hyperload(/ eName dwgName dir)
(vl-load-com)
(if (and (setq eName (car (entsel "\n>>Select Text at Edge of Drawing: ")))
          (vl-position
            (strcase (setq dwgName (vla-get-TextString (vlax-ename->vla-object eName))))
            (vl-directory-files (setq dir "M:\\NewMaps\\") "*.dwg" 1)))
   (command "._-xref" "_attach" (strcat dir dwgName ".dwg") '(0 0 0) 1 1 0))
(princ))

alanjt 发表于 2022-7-6 11:13:42

 
FindFile是你的朋友:眨眼:
 
(defun c:Foo (/ e l n)
(if (and (setq e (car (entsel "\nSelect text: ")))
          (member (cdr (assoc 0 (setq l (entget e)))) '("MTEXT" "TEXT"))
          (findfile (setq n (strcat "M:\\NewMaps\\" (cdr (assoc 1 l)) ".DWG")))
   )
   (command "._-xref" "_attach" n '(0 0 0) 1 1 0)
)
(princ)
)

BlackBox 发表于 2022-7-6 11:24:48

是的,当然。
 
有趣的是,我已经编写了几行ActiveX代码来响应OP,并且只选择发布一个片段,因为我觉得这是一个重要的检查(验证选择的文本是否与其中一个图形匹配)。事实上,我这一头并不是这样写的。
 
编辑:我的原始代码是几行,因为我最初是在浏览blocks集合。

TheZman 发表于 2022-7-6 11:26:25

哇,谢谢,你们太棒了
页: [1]
查看完整版本: 外部参照代码