gekusei88 发表于 2022-7-6 06:19:11

跨多个

有谁能告诉我,是否可以将一个图形中定义的变量按批处理顺序传递到另一个图形中?
 
在定义了一些“主”变量后,我试图在图形目录中批量运行一个例程。
 
例行程序只是将特定层的颜色更改为定义的颜色。我正在使用Lee Mac的批处理代码和“.-layer”命令。
 
我们有数百张只需要改变单层颜色的图纸;我希望能够定义新的颜色和层名称,然后运行-全局使用这些参数分层。
 
我已经附上了到目前为止我得到的,谢谢大家。
 
(defun c:BATCHLAY (/ wfile rfile ofile dir bna)

(setq mlna (entget (car (entsel))))
(setq lcent (assoc 8 mlna))
(setq lna (cdr lcent))

(setq mcolor (getstring "Enter new layer color name:"))

(if (and (setq wfile "C:\\lay_color.scr")
(setq rfile (getfiled "\nSelect File from Directory to Read: " "" "dwg" ))
        (progn
                (setq ofile (open wfile "w"))
                (foreach x (vl-directory-files (setq dir (vl-filename-directory rfile)) "*.dwg" 1)
                (write-line
                (strcat "open \"" dir "\\" x "\" (c:LAYCLR) qsave close")
                ofile)
        )
        (close ofile)
        (command "script" wfile)
)
(princ "\n<!> File Selection Error <!>"))
(princ)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:LAYCLR ()

(command ".-layer" "C" mcolor lna "")

(princ)

)

Shneuph 发表于 2022-7-6 06:29:31

尝试将层名称和颜色变量存储在以下环境变量中:(未测试)
 

(defun c:BATCHLAY (/ wfile rfile ofile dir bna)

(setq mlna (entget (car (entsel))))
(setq lcent (assoc 8 mlna))

(setenv "gek-lna" (cdr lcent))
(setenv "gek-mcolor" (getstring "Enter new layer color name:"))

   (if (and (setq wfile "C:\\lay_color.scr")
   (setq rfile (getfiled "\nSelect File from Directory to Read: " "" "dwg" ))
       (progn
         (setq ofile (open wfile "w"))
         (foreach x (vl-directory-files (setq dir (vl-filename-directory rfile)) "*.dwg" 1)
         (write-line
         (strcat "open \"" dir "\\" x "\" (c:LAYCLR) qsave close")
         ofile)
       )
       (close ofile)
       (command "script" wfile)
   )
   (princ "\n<!> File Selection Error <!>"))
   (princ)
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:LAYCLR ()

(command ".-layer" "C" (getenv "gek-mcolor") (getenv "gek-lna") "")

(princ)

)

Dadgad 发表于 2022-7-6 06:32:35

欢迎来到CADTutor!
 
虽然没有自定义lisp那么性感,但可以通过应用标准检查器来实现这一点。图纸的dws。

pBe 发表于 2022-7-6 06:37:36

研究vl传播

irneb 发表于 2022-7-6 06:42:11

或vl bb集合和vl bb ref
但是,如果您通过ScriptPro之类的工具运行代码,它可能无法工作。看到ScriptPro为每个DWG启动和停止ACad的新会话,这将清除所有这些变量。在这种情况下,我建议使用外部文件或注册表。根据Shneuph的帖子,最简单的版本。
 
顺便说一句,对于这个批处理文件,我更愿意考虑通过ObjectDBX来实现。运行速度会快得多,但需要重写所有代码才能使用ActiveX。

pBe 发表于 2022-7-6 06:48:26

 
虽然不确定ScriptPro,但在使用vl propagate thru-run-on-the-the-mill脚本时从未遇到过问题。
 
既然你提到了ODBX,那么vl-propagate可以使用它吗?[好奇就是一切]
 

gekusei88 发表于 2022-7-6 06:52:46

谢谢大家的回复,谢谢大家的热情欢迎。
 
我尝试了你对Shneuph进行的环境变量修改,它似乎不是现成的,但使用环境变量绝对是一个有趣的想法。我不知道你可以用这种方式添加到它们中(我刚刚开始使用autolisp),所以我以后肯定会对这个想法进行更多的修补。
 
就使用标准检查器而言。dws,这是我建议我们的用户采取的常规路线。然而,据我所知,您必须在每个图形内部运行检查器,并且没有内置批处理检查器。鉴于此更改如此简单,并且有如此多的图形,因此手动进行更改并没有多大优势。
 
至于所有其他想法,我将逐一研究!我对列出的大多数内容都不熟悉,因为我只做了几周,所以有很多学习材料要查。

Lee Mac 发表于 2022-7-6 06:57:52

为了确保图纸之间的数据可访问,我个人会选择使用黑板名称空间(即vl bb集合/vl bb参考),正如Irnéb所建议的那样;事实上,这就是我在批处理属性编辑器程序中实现的方法,以便于在脚本处理的每个图形之间传输属性数据(请参阅第1015行和第1023行)。
 
关于环境变量(即setenv/getenv)的使用,由于这些函数将数据写入注册表[默认位置:(strcat“HKEY\U CURRENT\U USER\”(vlax product key)“\\FixedProfile\\General”)],我建议您谨慎使用环境变量,以避免不必要地膨胀注册表。
 
 
据我所知,大多数(如果不是全部)AutoCAD版本的程序文件中都应该包含“批量标准检查器”。
 
文档:
http://exchange.autodesk.com/autocad/enu/online-help/browse#WS1a9193826455f5ffa23ce210c4a30acaf-4日。htm

gekusei88 发表于 2022-7-6 07:07:57

谢谢李的帮助,不过我必须道歉,我说错了批次检查器。我知道,但据我所知,它只生成了一份报告,报告中列出了与贵方相比的所有差异。dws文件与您可以实际进行更正的单个检查器。我在这里试图实现的基本上是,但现在是一个简化版本。
 
然而,您编写的“批属性编辑器”lisp实际上正是我在这些论坛上的第一篇帖子中试图操纵ATTIN所做的!很明显,你比我知识渊博,并且已经开发出了比我试图使用Express Tools ATTIN功能删除用户输入并定义文件导入位置的(并非如此)简单路线更强大的东西。虽然我不是第一个尝试这种事情的人,这有点令人沮丧,但同时也令人敬畏的是,已经有了明确的需求!至少现在我可以停止尝试那些我还无法胜任的事情,重新开始学习lol。
 
我会查看“vl bb集合/vl bb引用”的建议,并感谢大家提醒我不要把注册表弄得乱七八糟,天知道这本身已经够糟糕的了。

irneb 发表于 2022-7-6 07:08:23

另一个原因是,您可以为变量选择一个名称,该名称已经作为ACad的标准设置存在。因此,您可能正在覆盖ACad需要的内容。 
不幸的是,它只进行检查和报告,不进行批量更改。 
这是我不喜欢ScriptPro的原因之一。在我看来,关闭整个ACad,然后为要运行的每个DWG启动一个新的ACad是愚蠢的。这与使用DOS的一些旧(windows之前)方法的原理相同。BAT文件,用特定的DWG和SCR启动ACad,然后关闭并用下一个重新启动。 
不过,有一些“更好的”批处理脚本系统不关闭ACad,例如(我最喜欢的)AutoScript,它在ACad内运行,不需要启动停止会话。至少以我的经验来看,它甚至比SprintPro跑得更快。
 
是的。ODBX意味着您的LSP只在当前DWG中运行,它不需要关闭和打开当前文档,因此不需要跨命名空间共享值。
页: [1] 2
查看完整版本: 跨多个