# Pycad Python Extension for AutoCad
Editor/Debuger
Pycad是利用ironpython来实现对CAD.net API的利用,使得大家得以在CAD上面使用Python语言进行编程.
我们致力于适配上AutoDeskCAD/浩辰CAD/中望CAD等主流CAD.
程序支持AutoCad2013-2020(2014版本以下需安装.Net4.5),将压缩文件下载后解压到任意目录,在AutoCad在用Netload命令选择解压目录中的NFox.Pycad.Acad.dll,同时支持浩辰Cad,对应加载文件为NFox.Pycad.Gcad.dll。
程序选用vscode作为编辑器,在Cad中键入pye命令,可以自动打开vscode,当然你需要安装vscode,以及vscode的Python扩展(微软)和Pythonv3.7+。
如果代码修改完成,在Cad中键入pyrb命令可以即时编译python的脚本。
pytest项目有很多例程可以参考。
vscode右下角有一个即时窗口,可以直接在这里键入或者从代码区拷贝代码直接执行看结果
修改py项目的组织形式,原项目组织形式为包,不能防止同名包覆盖的问题,新的项目组织形式与国际接轨, 根目录可随意命名, 保证目录下有个extension包即可, 该包不可重命名, 不可缺失;项目的data目录可放置数据文件,程序中可使用findfile(filename)获取文件路径;项目的cuix目录可放置Cad的cuix文件用于加载定制的菜单、工具条和Ribbon菜单;重写了发布功能, 命令pyrelease, 可选择多项目一起发布, 完成后会在temp目录下生成一个自解压安装包xxx.Setup.exe;可以在未安装Pycad的机器上安装Pycad的运行版本和开发的项目;pye命令名修改为pyedit。
调试器基本完成,提供测试,调试流程: 打开Cad->打开pytest项目->按下F5->在Cad中敲命令即可进入调试模式;退出调试只需要点vscode中的断开连接按钮。
修正发布功能,增加invokeArx模块以调用Arx函数,例子见pytest项目的runtime模块
感谢山人编写的文档,但是改版暂时只能借鉴了,我们一起把他顶出来写新版的吧:)
如果pye命令出现“系统找不到指定的文件”的错误,请在“Pycad\bin”目录下找到配置文件settings.json,修改“editor.path”参数为vscode的安装目录.
细节问题:
1、关于vscode 自动提示配置说明: 在vscode配置信息修改这两个地方
1、启动命令
2、导入模块文件:
from pycad.runtime import *
from pycad.system import *
3、开始第一个程序:hello world
@command()
def test(doc)
print("hello world")
@command()
def test2(doc):
print "the type is :" , type(doc)
print "the dwg name is :" , doc.Name
args=dir(doc)
for val in args:
print "the doc object has method or propertyname is :", val
pycad主要对objectarx.net的二次封装,在system与runtime中,封装了下面的对象:
"acap": "Autodesk.AutoCAD.ApplicationServices",
"acdb": "Autodesk.AutoCAD.DatabaseServices",
"aced": "Autodesk.AutoCAD.EditorInput",
"acge": "Autodesk.AutoCAD.Geometry",
"acrx": "Autodesk.AutoCAD.Runtime",
"acws": "Autodesk.AutoCAD.Windows",
"acgi": "Autodesk.AutoCAD.GraphicsInterface",
"acgs": "Autodesk.AutoCAD.GraphicsSystem",
"acin": "Autodesk.AutoCAD.Internal",
"acps": "Autodesk.AutoCAD.PlottingServices",
"acco": "Autodesk.AutoCAD.Colors",
编写方式跟c#二次开发差不多
@command()
def enttest(doc):
with dbtrans(doc) as tr:
btr=tr.opencurrspace() #这里默认只读打开,.netapi推荐对象打开先以读打开以节省资源,再需要写入时提权
#创建点
point=acdb.DBPoint(acge.Point3d(2,2,0))
tr.addentity(btr,point) #addentity会将btr提权为写打开,并将对象加入数据库
#创建直线 第一个参数:起点 第二个参数:终点
line=acdb.Line(acge.Point3d(2,2,0),acge.Point3d(4,5,1))
tr.addentity(btr,line)
#创建圆形 第一个参数:起点 第二个参数:投影向量,第三个参数:半径
c1=acdb.Circle(acge.Point3d(10,10,0),acge.Vector3d(0,0,1),1) # z轴投影
c2=acdb.Circle(acge.Point3d(20,20,0),acge.Vector3d(0,1,0),2) # y轴投影
c3=acdb.Circle(acge.Point3d(30,30,0),acge.Vector3d(1,0,0),3) # x轴投影
tr.addentity(btr,c1,c2,c3) #or: tr.addentity(btr, *(c1,c2,c3))
#创建多段线
pl=acdb.Polyline()
pl.AddVertexAt(0,acge.Point2d(0,0),0,0,0) #添加顶点
pl.AddVertexAt(1,acge.Point2d(0,1),0,0,0)
pl.AddVertexAt(2,acge.Point2d(1,1),0,0,0)
pl.AddVertexAt(3,acge.Point2d(1,0),0,0,0)
pl.Closed=True #是否闭合
tr.addentity(btr,pl)
#创建弧线 第一个参数:弧的圆心 第二个参数:半径 第三个参数: 起点角度 第四个参数:终点角度
arc=acdb.Arc(acge.Point3d(10,0,0),3,math.pi*0.5,math.pi*1.25)
tr.addentity(btr,arc)
@command()
def createlayer(doc):
LayerName="MyLayer"
with dbtrans(doc) as tr:
tr.addlayer(LayerName)
print("\n创建{0}图层成功".format(LayerName))
@command()
def cl1(doc):
LayerName="MyLayer2"
with dbtrans(doc) as tr:
tr.addlayer(LayerName,acco.Color().FromColorIndex(acco.ColorMethod.ByLayer,2))
print("\n创建{0}图层成功".format(LayerName))
@command() #修改图层属性
def ModifyLayer(doc):
res=edx.entsel("\n选择要修改的图形:")
if not res.ok(): return
with dbtrans(doc) as tr:
ent=tr.getobject(res.ObjectId)
ltr=tr.getobject(res.LayerId,acdb.OpenMode.ForWrite) #获取LayerTableRecord表记录
ltr.IsFrozen=True #冻结图层
ltr.IsLocked=True #锁定图层
print("\n{0}图层已经冻结和锁定".format(ent2.Layer))
@command()
def cl1(): #这里缺少参数doc,正确写法为 def cl1(doc)
本工程第一作者为:xsfhlzh
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型