Carsten Trolle 发表于 2022-7-6 07:24:48

Lisp例程以保存

你好
 
有谁能帮我做一个例程,在保存实际dwg时自动将“0层”内容保存到dxf文件?
 
当涉及到“reactor”和“vlax”时,我的基本lisp知识就不够了。我可以看到这需要由某种反应堆触发,
save&还有saveas,但有什么更适合这个目的?(我的代码中已经准备好了命令反应堆,李·麦克不久前就支持了我)
 
由于(命令“…”)函数在反应堆内不工作,那么我还需要另一个lisp函数的指导,以将所有0层内容保存到dxf。
可以是soemthing(vlax invoke方法….)但我无法计算出参数)?
 
我不希望得到一个现成的解决方案,但任何类似的样本代码,我可以拼写我的方式,并引导我在正确的方向是高度赞赏的。
 
顺致敬意,
卡斯滕
一些示例代码将

Lee Mac 发表于 2022-7-6 07:32:51

然而,文档对象的导出方法允许您在不使用命令调用的情况下导出到DXF,尽管如Visual LISP IDE帮助文档中所述,当扩展参数设置为任意一个时,此方法需要选择集参数。每股收益或。dxf时,该方法将忽略选择集参数,并将导出整个图形。

Carsten Trolle 发表于 2022-7-6 07:39:49

谢谢你的回复李,
 
我在周末尝试了一下出口方法。正如您所写,我成功地创建了完整图形的dxf。
我剩下的问题是只将图形中的图层0过滤到dxf中。
一种可能性是首先将ss和所有0层对象复制到一个新文档中,然后再进行dxf导出。
通过临时文件和所有文件似乎是一条漫长的道路。
 
我在各种web讨论中看到,一些人正在使用wblock创建dxf,这似乎是一条很好的捷径,因为它将与选择集对象一起工作。
我在这个方向上的第一个测试只是一个简单的“命令”,如下所示(在将默认保存版本设置为适当的dxf之后):
 
(setq ss (ssget "_X" '((8 . "0"))))
(command "-wblock" "c:\\test2.dxf" "" "" "0,0" ss "")
 
这很好用。
 
然后我尝试将其放入vlisp:
 
(setq ss (ssget "_X" '((8 . "0"))))
(if ss (setq ss (vla-get-activeselectionset dwgobj)))
(vlax-invoke-method dwgobj 'wblock "C:\\Test.dxf" ss)
 
乍一看,它成功了,至少程序没有崩溃,它创建了一个具有dxf扩展名的文件。
但是当打开文件时,ACAD向我抛出了这个错误:
 
第1行图纸标题错误。
C: \测试。dxf不是有效的dxf文件
DXF输入无效或不完整--图形已丢弃。
 
你知道命令wblock和方法wblock有什么区别吗?
 
BR
卡斯滕

SLW210 发表于 2022-7-6 07:40:04

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

Carsten Trolle 发表于 2022-7-6 07:46:16

对不起,我没有意识到这一点。
以下是我上一篇文章的副本,格式符合要求。
 
我在各种web讨论中看到,一些人正在使用wblock创建dxf,这似乎是一条很好的捷径,因为它将与选择集对象一起工作。
我在这个方向上的第一个测试只是一个简单的“命令”,如下所示(在将默认保存版本设置为适当的dxf之后):
 
(setq ss (ssget "_X" '((8 . "0"))))
(command "-wblock" "c:\\test2.dxf" "" "" "0,0" ss "")

 
这很好用。
 
然后我尝试将其放入vlisp:
 
(setq ss (ssget "_X" '((8 . "0"))))
(if ss (setq ss (vla-get-activeselectionset dwgobj)))
(vlax-invoke-method dwgobj 'wblock "C:\\Test.dxf" ss)

 
乍一看,它成功了,至少程序没有崩溃,它创建了一个具有dxf扩展名的文件。
但是当打开文件时,ACAD向我抛出了这个错误:
 
第1行图纸标题错误。
C: \测试。dxf不是有效的dxf文件
DXF输入无效或不完整--图形已丢弃。
 
你知道命令wblock和方法wblock有什么区别吗?
 
BR
卡斯滕

Lee Mac 发表于 2022-7-6 07:53:32

 
文档对象的wblock方法不是创建真正的DXF文件,而是简单地将压缩的图形文件数据(如.dwg格式所使用)写入DXF文件-您可以通过使用文本编辑器打开生成的DXF文件来查看此结果。
 
一个简单的解决方法可能是将save/qsave命令重新定义为DXF,将图形的dxfout/wblock部分重新定义为DXF,然后执行标准的保存操作-这显然不需要使用反应器,从而避免对命令功能施加限制。

Lee Mac 发表于 2022-7-6 07:55:43

 
可能是这样的:
 
(command "_.undefine" "qsave")
(defun c:qsave ( / ss )
   (if (= 1 (getvar 'dwgtitled))
       (progn
         (if (setq ss (ssget "_X" '((8 . "0"))))
               (command "_.dxfout" "" "_O" ss "" "")
         )
         (command "_.qsave")
       )
       (progn
         (initdia)
         (command "_.saveas")
       )
   )
   (princ)
)

Carsten Trolle 发表于 2022-7-6 08:01:36

谢谢李,
这似乎是一个很好且简单的解决方案,我将检查它,并看看它是否也适用于“非英语口语”ACAD。
 
顺致敬意,
卡斯滕

Lee Mac 发表于 2022-7-6 08:09:38

不客气,卡斯滕,让我知道你进展如何

Carsten Trolle 发表于 2022-7-6 08:14:00

你好,李,
我希望你原谅我不断地重复这个话题。
关于用save和qsave的重新定义替换“reactor”,这相对于“multi documents”来说有一个缺点,即重新定义对于同一ACAD会话中的后续图形文档仍然有效,但我无法控制我的lisp代码也被加载。因此qsave&save变为“未知命令”
我还没有机会在非英语ACAD上测试这种行为,但我认为这可能也是一个问题。
 
在我的代码(做其他事情)中实现了带有“save操作”的reactor的代码,因此应该涵盖这一部分。
受我在网上找到的论坛帖子启发,似乎有可能使用“objectDBX.AxDbDocument”的dxfout方法
下面的代码确实保存了一个“空”dxf文件,没有崩溃。(我想dxf为空是有道理的,因为该方法与我的活动文档无关)。在执行Dxfout之前,是否可以将图层0上的图形对象从活动文档传输到AxDbDocument?
 

(vlax-import-type-library
   :tlb-filename "C:\\Programmer\\Fælles filer\\Autodesk Shared\\axdb17enu.tlb"
   :methods-prefix "acdbm-"
   :properties-prefix "acdbp-"
   :constants-prefix "acdbc-" )
; dxfout another try
(defun dxfout ( / dwgobj dwgoj2)
(setq dwgobj (vla-get-ActiveDocument (vlax-get-Acad-Object)))

(setq dwgobj2 (vlax-create-object "objectDBX.AxDbDocument.17" ))
(vlax-invoke-method dwgobj2 'DxfOut "C:\\Test11-10.dxf")
)


 
谢谢
卡斯滕
页: [1] 2
查看完整版本: Lisp例程以保存