IronPython for Bricscad
在Bricscad V16到V18上进行了测试,如果有足够的兴趣,我也将为AutoCAD构建一个版本对于那些感兴趣的人,我附加了一个包含安装文件的zip文件夹,这样您可以通过NETLOAD加载解释器(PyCAD.dll),然后运行在“插件”文件夹中创建的一些脚本
到目前为止,它只有一个简单的提示(command=IPY_prompt),您可以从脚本中调用函数。任何加载的脚本(自动从插件文件夹中加载)都将通过此提示向CAD系统公开其功能。在不久的将来,我将能够创建适当的“命令”,使其作为脚本工具更加有用
如果要更改脚本,需要停止提示(esc或输入空行)。然后可以使用IPY_reload重新加载脚本,然后再次启动提示进行测试
plugins文件夹中有几个测试脚本,其中一个脚本内置了一个用于测试的错误,删除错误消息只需要很少的修复,所以不用担心
我只是把它放在这里,看看大家对此有什么兴趣,我正在为我当前的一个项目构建一个脚本接口,但如果人们想使用它,我会让它更加通用和开源
未来版本将有一个用于实时编码和测试的小型文本编辑器
由于您可以访问整个.net框架,因此可以使用您喜欢的任何.net库。大多数标准的Python库都是可用的,因此如果您习惯于使用Python std函数,您会感到宾至如归,它们可以很好地协同工作。使用Python外部库在现阶段不可用,需要同时安装Python和IronPython,我选择保持简单
由于代码是IronPython,如果您构建了一个成熟的大型模块,您可以在Visual Studio中轻松地将其编译为dll,但目前您可以在所选编辑器中编写脚本文件
安装:
将内容解压缩到您选择的文件夹中,其中包含DLL和带有几个脚本文件的插件文件夹。在这里放置任何新脚本
在Bricscad中,运行NETLOAD并浏览到此文件夹,然后选择PyCAD。dll并加载它
可用命令:IPY_PROMPT,IPY_ RELOAD<br>如果您有任何问题,请告诉我,谢谢。<br>
**** Hidden Message ***** 添加一个简单的行实体:
演示Python中数据库和事务的基本用法。请注意“with”关键字,它相当于C#中的“using”
我必须承认,Python代码在眼睛(和键盘)上非常容易
导入Bricscad。应用程序服务作为AcAp
来自Teigha的<div>。数据库服务导入*
来自Teigha的<div>。几何体导入*
def addLine():
doc=AcAp.Application.DocumentManager.MdiActiveDocument
db=doc.Database
#创建线实体
p1=Point3d(300,100,0)
p2=Point3d(500,200,0)
线=线(p1,p2)
带有db.TransactionManager的<div>。StartTransaction()作为tr:
#将其添加到模型空间
bt=tr.GetObject(db.BlockTableId,OpenMode.ForRead)
btr=tr.GetObject(bt,OpenMode.ForWrite)
btr.AppendEntity(行)
tr.addNewlyCreatedBobObject(行,真)
tr.Commit()
下面是一个简单的包装器脚本,可以轻松地编写干净的 Python 代码。# dwgtools.py。
''' 此模块包含用于工作的基本交互帮助程序函数。
在编辑器中打开当前活动的 dwg 文件,。
它基本上是一个简单的包装器,使编写惯用的Python代码变得容易。
并去除了很多样板,。
'''。
import Bricscad.ApplicationServices as AcAp。
import Bricscad.EditorInput as AcEd。
from Teigha.DatabaseServices import *。
。
类绘图:。
def __init__(自我):。
self.doc = AcAp.Application.DocumentManager.MdiActiveDocument。
self.db = self.doc.Database。
self.ed = self.doc.Editor。
。
def add_entity(自我,实体):。
“”将实体对象添加到当前 ModelSpace 布局,'''。
with self.db.TransactionManager.StartTransaction() as tr:。
# 将其添加到模型空间。
bt = tr.GetObject(self.db.BlockTableId, OpenMode.ForRead)。
btr = tr.GetObject(bt, OpenMode.ForWrite)。
。
断续器追加实体(实体)。
断续器AddNewlyCreatedDBObject(entity, True)。
。
断续器提交()。
。
def write_message(自我,message_string):。
“”向编辑器的命令行发送文本消息,'''。
self.ed.WriteMessage(message_string)。
并使用它,这里是重构的addLine代码:from dwgtools import *。
。
def addLine():。
# 创建行实体。
line = line(Point3d(300, 100, 0), Point3d(500, 200, 0))。
。
# 将其添加到绘图中。
dwg = 绘图()。
dwg.add_entity(线)。
dwg.write_message(“已将新线条添加到图形数据库!”。
。
干得好,迈克!我最近在一个大型项目中嵌入了IronPython,它作为脚本语言已经足够好了,我在工作中只注意到一些评论(没有测试你的代码):IronPython引擎初始化非常慢。
就速度而言,可能不是CAD的最佳脚本语言。
我无法在不重启应用程序的情况下找到热重新加载 python脚本的方法,这是一个主要的缺点,因为您通常使用脚本进行原型开发,而编写-测试-更改-重新加载模式非常方便。似乎一旦你重新加载脚本,清除符号就不那么容易了。这是完全合理的,但我对LUA语言做了同样的事情,没有问题重新加载脚本。总之,这是我的(有限)经验。这是一个有趣的项目!。
初始启动有点慢,但是一旦脚本被加载和抖动,IronPython就和C#一样快。(我在加载时编译脚本,而不是使用“eval”)。据报道,IronPython比CPython快10-100倍,这对于很多项目来说都是可以忍受的
,IPY_RELOAD确实在不重新启动的情况下进行了热重载,正如你所说,这是关键!
我放弃了旧的示波器并创建了一个新的示波器,到目前为止,它似乎运行良好。我将很快设置一个GitHub存储库,其中包含所有源代码,只要我对它进行了更多的排序。
感谢您对丹尼彭的关注!
我实际上在Clojure中构建了一个脚本引擎,其工作原理相同,但在启动时可能会更快一些。我喜欢Lisp,但是对于只想敲出一个快速脚本的新手来说,Python在大脑上比Clojure容易得多
最终目标是有一个插件目录,其中测试/最终确定的脚本被保存并加载一次,这应该具有良好的性能。我正在开发一个简单的编辑器,用于测试将使用重新加载功能的新脚本,您可以根据需要创建任意数量的脚本引擎和作用域,因此任何新代码都不会踩到任何预加载的代码上。
我现在有更好的错误报告输出,带有行号等错误,这些错误对于调试来说足够好。
如果你最终有很多脚本,那么创建一个IronPython类lib项目并将它们编译成一个dll是非常容易的。虽然主要目标是让新手更容易使用,而不必安装一个完整的开发环境,我可以只为客户端编写脚本,而不必完全重建和发布主应用程序。
它仍然有办法去,但它进展顺利,我对它非常满意,我怀疑我会写更多的C#,直到我也需要 我想知道你是否在GitHub上设置了什么? 这看起来非常有趣,我在C#上有点挣扎,并对简单任务的代码量感到沮丧。 我相信有一天我会明白的...
如果您有任何python的建议或示例,我会很高兴看到更多。
谢谢和最好的给你 嗨,Jerry,
回购协议还没有建立,我需要对其进行一点重构,并将脚本引擎从CAD特定部分中分离出来,以使其更便于其他应用程序的移植。我还想开发一些更多的调试功能,很多事情都能顺利完成,在使用该函数之前不会被发现,但堆栈跟踪确实为您提供了修复问题所需的线索
我还实现了正确的CAD命令初始化(C#使用属性,Python使用装饰器/注释),因此不需要IPY提示,只需调用命令即可
当您更新了“命令”后,IPY_
页:
[1]