使用 Python 批处理 运行 autoLISP
Batch run autoLISP with Python
我想 运行 在多个 CAD 文件(例如文件夹中的所有文件)上使用 autoLISP。基本上,打开文件 (DWG)、运行 LISP(包括保存文件)并关闭。我是 LISP 的新手,但对 Python 不太陌生。
是否可以 运行 与 Python 的批处理?我知道如何使用 Python 中的程序打开文件,但不知道如何 运行 LISP。或者,有人知道如何 运行 使用 LISP 进行批处理吗?
目前我找到的解决方案涉及第三方软件和 C#。另外,我正在 运行ning AutoCAD-MEP 2018 和 Python 3.5.
根据我的经验,批处理多个文件的最佳方法是使用 AutoCAD 脚本文件 (.scr
)。
脚本仅用于打开每个绘图,加载并 运行 适当的 AutoLISP 程序,然后保存并关闭绘图,然后再移动到下一个绘图文件。
自从 AutoLISP 运行s 在 Document 命名空间中,当另一个绘图变为活动状态时计算停止;但是,AutoCAD 脚本文件将继续 运行,直到脚本中的所有命令都已发出,或者脚本已中止。
这种脚本的基本结构是:
_.open C:\Drawing1.dwg (load "MyProgram.lsp" nil) (c:MyCommand) _.qsave _.close
_.open C:\Drawing2.dwg (load "MyProgram.lsp" nil) (c:MyCommand) _.qsave _.close
_.open C:\Drawing3.dwg (load "MyProgram.lsp" nil) (c:MyCommand) _.qsave _.close
...
以上可以使用 AutoCAD SCRIPT
命令从空白的新绘图中另存为 MyScript.scr
和 运行。
当然也可以加入额外的错误检查,比如在评估之前检查AutoLISP程序是否加载成功等
有关 AutoCAD 脚本文件的更多信息,我整理了 this basic tutorial AutoCAD 脚本。
考虑到上述情况,下一步是自动构建脚本文件本身(而不是手动编写几乎相同的每一行)。
为此,有几个现有的应用程序:ScriptPro 是众所周知的,我前段时间也创建了自己的 Script Writer 应用程序,它提供了一个基本界面,允许用户输入第一个脚本文件的行和程序构建其余部分。
为了提供一个现有示例,我的 Batch Attribute Editor 应用程序也基于使用 AutoLISP 应用程序构建 AutoCAD 脚本文件的技术,然后使用该文件在多个选定图形上评估 AutoLISP 函数。
简而言之,虽然您明确说明使用 Python 来执行此任务,但我认为在这种情况下没有必要,因为一个非常简单的脚本文件 (.scr
)就够了。
我实际上已经使用 python 2.7 使用 comtypes.
这里是测试用例的代码:
#Import needed modules
import os
import comtypes.client
from comtypes import COMError
from comtypes.client import CreateObject, GetModule, GetActiveObject
#Uncomment it if you need to load these type libraries.
'''
#Load all needed type libraries
GetModule("C:/Windows/System32/stdole2.tlb")
import comtypes.gen.stdole as ole
print "stdole2 successfully loaded"
GetModule("C:/Program Files/Common Files/Autodesk Shared/acax20enu.tlb")
import comtypes.gen._4E3F492A_FB57_4439_9BF0_1567ED84A3A9_0_1_0 as acax
print "acax20enu successfully loaded"
GetModule("C:/Program Files/Common Files/Autodesk Shared/AcSmComponents20.tlb")
import comtypes.gen._ED125AFF_6294_4BE4_81E2_B98DCBBA214E_0_1_0 as AcSm
print "AcSmComponents20 successfully loaded"
'''
def main():
#1- Get the AutoCAD instance
try:
acad = GetActiveObject("AutoCAD.Application.20")
print "AutoCAD is Active"
print "########"
except(OSError, COMError): #If AutoCAD isn't running, run it
acad = CreateObject("AutoCAD.Application.20",dynamic=True)
print "AutoCAD is successfuly Opened"
print "########"
#2- Get the paths to the lisp file and the dwg file
directory_name = "E:\Dir1\Dir2" #replace it with a real path, use "\" as directory delimiters.
'''
Note that "\" is transformed automatically to "\", & in order to comply with
the AutoLISP "load" function, every "\" must be transformed again to "/".
'''
temp=""
for char in directory_name:
if char == "\":
temp += "/"
else:
temp += char
directory_name = temp
filename = directory_name + "/TestDWG.dwg"
lispfile = directory_name + "/linedraw.lsp"
#3- Open the drawing file
print "Opening Drawing File ..."
doc = acad.Documents.Open(filename)
print "Drawing is successsfuly Opened"
print "########"
#4- Construct the AutoLISP expression that loads AutoLISP files
command_str = '(load ' + '"' + lispfile + '")' + " "
#5-Execute the AutoLISP expression
print "Sending AutoLISP Expression ..."
print "Expression: " + command_str
doc.SendCommand("(setq *LOAD_SECURITY_STATE* (getvar 'SECURELOAD)) ")
doc.SendCommand("(setvar \"SECURELOAD\" 0) ")
doc.SendCommand(command_str)
doc.SendCommand("(setvar \"SECURELOAD\" *LOAD_SECURITY_STATE*) ")
print "AutoLISP Expression is successfuly sent"
print "########"
#6- Save and Close the drawing file and AutoCAD application
doc.Save()
doc.Close()
acad.Quit()
print "Process Finished"
print "__________"
if __name__ == '__main__':
main()
我想 运行 在多个 CAD 文件(例如文件夹中的所有文件)上使用 autoLISP。基本上,打开文件 (DWG)、运行 LISP(包括保存文件)并关闭。我是 LISP 的新手,但对 Python 不太陌生。
是否可以 运行 与 Python 的批处理?我知道如何使用 Python 中的程序打开文件,但不知道如何 运行 LISP。或者,有人知道如何 运行 使用 LISP 进行批处理吗?
目前我找到的解决方案涉及第三方软件和 C#。另外,我正在 运行ning AutoCAD-MEP 2018 和 Python 3.5.
根据我的经验,批处理多个文件的最佳方法是使用 AutoCAD 脚本文件 (.scr
)。
脚本仅用于打开每个绘图,加载并 运行 适当的 AutoLISP 程序,然后保存并关闭绘图,然后再移动到下一个绘图文件。
自从 AutoLISP 运行s 在 Document 命名空间中,当另一个绘图变为活动状态时计算停止;但是,AutoCAD 脚本文件将继续 运行,直到脚本中的所有命令都已发出,或者脚本已中止。
这种脚本的基本结构是:
_.open C:\Drawing1.dwg (load "MyProgram.lsp" nil) (c:MyCommand) _.qsave _.close
_.open C:\Drawing2.dwg (load "MyProgram.lsp" nil) (c:MyCommand) _.qsave _.close
_.open C:\Drawing3.dwg (load "MyProgram.lsp" nil) (c:MyCommand) _.qsave _.close
...
以上可以使用 AutoCAD SCRIPT
命令从空白的新绘图中另存为 MyScript.scr
和 运行。
当然也可以加入额外的错误检查,比如在评估之前检查AutoLISP程序是否加载成功等
有关 AutoCAD 脚本文件的更多信息,我整理了 this basic tutorial AutoCAD 脚本。
考虑到上述情况,下一步是自动构建脚本文件本身(而不是手动编写几乎相同的每一行)。
为此,有几个现有的应用程序:ScriptPro 是众所周知的,我前段时间也创建了自己的 Script Writer 应用程序,它提供了一个基本界面,允许用户输入第一个脚本文件的行和程序构建其余部分。
为了提供一个现有示例,我的 Batch Attribute Editor 应用程序也基于使用 AutoLISP 应用程序构建 AutoCAD 脚本文件的技术,然后使用该文件在多个选定图形上评估 AutoLISP 函数。
简而言之,虽然您明确说明使用 Python 来执行此任务,但我认为在这种情况下没有必要,因为一个非常简单的脚本文件 (.scr
)就够了。
我实际上已经使用 python 2.7 使用 comtypes.
这里是测试用例的代码:
#Import needed modules
import os
import comtypes.client
from comtypes import COMError
from comtypes.client import CreateObject, GetModule, GetActiveObject
#Uncomment it if you need to load these type libraries.
'''
#Load all needed type libraries
GetModule("C:/Windows/System32/stdole2.tlb")
import comtypes.gen.stdole as ole
print "stdole2 successfully loaded"
GetModule("C:/Program Files/Common Files/Autodesk Shared/acax20enu.tlb")
import comtypes.gen._4E3F492A_FB57_4439_9BF0_1567ED84A3A9_0_1_0 as acax
print "acax20enu successfully loaded"
GetModule("C:/Program Files/Common Files/Autodesk Shared/AcSmComponents20.tlb")
import comtypes.gen._ED125AFF_6294_4BE4_81E2_B98DCBBA214E_0_1_0 as AcSm
print "AcSmComponents20 successfully loaded"
'''
def main():
#1- Get the AutoCAD instance
try:
acad = GetActiveObject("AutoCAD.Application.20")
print "AutoCAD is Active"
print "########"
except(OSError, COMError): #If AutoCAD isn't running, run it
acad = CreateObject("AutoCAD.Application.20",dynamic=True)
print "AutoCAD is successfuly Opened"
print "########"
#2- Get the paths to the lisp file and the dwg file
directory_name = "E:\Dir1\Dir2" #replace it with a real path, use "\" as directory delimiters.
'''
Note that "\" is transformed automatically to "\", & in order to comply with
the AutoLISP "load" function, every "\" must be transformed again to "/".
'''
temp=""
for char in directory_name:
if char == "\":
temp += "/"
else:
temp += char
directory_name = temp
filename = directory_name + "/TestDWG.dwg"
lispfile = directory_name + "/linedraw.lsp"
#3- Open the drawing file
print "Opening Drawing File ..."
doc = acad.Documents.Open(filename)
print "Drawing is successsfuly Opened"
print "########"
#4- Construct the AutoLISP expression that loads AutoLISP files
command_str = '(load ' + '"' + lispfile + '")' + " "
#5-Execute the AutoLISP expression
print "Sending AutoLISP Expression ..."
print "Expression: " + command_str
doc.SendCommand("(setq *LOAD_SECURITY_STATE* (getvar 'SECURELOAD)) ")
doc.SendCommand("(setvar \"SECURELOAD\" 0) ")
doc.SendCommand(command_str)
doc.SendCommand("(setvar \"SECURELOAD\" *LOAD_SECURITY_STATE*) ")
print "AutoLISP Expression is successfuly sent"
print "########"
#6- Save and Close the drawing file and AutoCAD application
doc.Save()
doc.Close()
acad.Quit()
print "Process Finished"
print "__________"
if __name__ == '__main__':
main()