明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 77510|回复: 157

[【PyCAD】] Pycad来袭,你还在等什么

    [复制链接]
发表于 2019-12-2 17:57:42 | 显示全部楼层 |阅读模式
本帖最后由 雪山飞狐_lzh 于 2021-4-8 11:44 编辑

2021/4/8
版本1.4.279.0
项目移至gitee,由inspirefunction团队维护
https://gitee.com/inspirefunction/Pycad
2020/8/3
版本1.3.279.0
增加调用arx函数的类invokeArx
可在github下载最新版本
https://github.com/xsfhlzh/Pycad

2020/7/30
版本1.2.279.0

修正发布命令
收录QQ群开心发布的从0开始帮助,感谢开心

2020/1/22
正式版本1.0.279.0
调试器完成。

调试流程: 打开Cad->打开pytest项目->按下F5->在Cad中敲命令即可进入调试模式
退出调试只需要点vscode中的断开连接按钮


2020/1/13
升级版本0.9.279.7
修改py项目的组织形式,原项目组织形式为包,不能防止同名包覆盖的问题
新的项目组织形式与国际接轨, 根目录可随意命名, 保证目录下有个extension包即可, 该包不可重命名, 不可缺失
项目的data目录可放置数据文件,程序中可使用findfile(filename)获取文件路径
项目的cuix目录可放置Cad的cuix文件用于加载定制的菜单、工具条和Ribbon菜单
重写了发布功能, 命令pyrelease, 可选择多项目一起发布, 完成后会在temp目录下生成一个自解压安装包xxx.Setup.dll
可以在未安装Pycad的机器上运行netload命令加载dll来安装Pycad的运行版本和开发的项目
pye命令名修改为pyedit
版本0.9.279.5

在经过漫长的等待后,IronPython终于处于了2.7.9的版本转折点,据官方消息即将迎来3.X的版本更新
在此之际,Pycad重磅来袭,使用Lisp一脉相承的方言进行NetApi开发,使用一贯熟悉的脚本方式,是我们一贯的快乐
Pycad正式在论坛发布0.9.279.5版本,欢迎大家使用
和C#、VB.Net等.Net语言相比较,Python的语法更自由,更适合我们工程师,希望你能喜欢

使用方法:
1、程序支持AutoCAD2013-2020(2014版本以下需安装.Net4.5),将压缩文件下载后解压到任意目录,在AutoCad在用Netload命令选择解压目录中的NFox.Pycad.Acad.dll,同时支持浩辰Cad,对应加载文件为NFox.Pycad.Gcad.dll。
2、程序选用vscode作为编辑器,在Cad中键入pye命令,可以自动打开vscode,当然你需要安装vscode,以及vscode的Python扩展(微软)和Pythonv3.7+
3、如果代码修改完成,在Cad中键入pyrb命令可以即时编译python的脚本。
4、pytest项目有很多例程可以参考。
5、vscode右下角有一个即时窗口,可以直接在这里键入或者从代码区拷贝代码直接执行看结果

6、发布功能和调试功能修改中。。。
感谢山人编写的文档,但是改版暂时只能借鉴了,我们一起把他顶出来写新版的吧:)

如果pye命令出现“系统找不到指定的文件”的错误,请按下面的目录找到配置文件,修改对应的参数为vscode的安装目录

Pycad常用命令
pyrb: 编译并重新加载所有模块, 一般代码修改完后需要运行
pyedit: 编辑/新建项目或者支持模块
pyrun: 运行extensions/.scripts目录下的py脚本
pyreference: 加载一个.Net类库, 并生成智能感知文件
pyrelease: 发布一个或多个项目, 生成自解压安装包




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 12明经币 +11 金钱 +173 收起 理由
likongshun + 1 很给力!
bzhjl + 1 + 50 神马都是浮云
etoxp + 1 + 10 很给力!
flybike007 + 5 很给力!
BaoWSE + 1 赞一个!
gulong2001 + 1 + 20 赞一个!
qq386015442 + 5 赞一个!
孤人旧梦 + 8 很给力!
xshrimp + 2 + 30 很给力!
17号 + 10 很给力!

查看全部评分

 楼主| 发表于 2019-12-4 18:47:51 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2020-1-13 12:23 编辑

pycad的库函数介绍可以用vscode打开stubs目录

里面的pycad/pye/clr/wpf是完善的,用于静态解析的库,这些在智能感知里也看的见
其他的目前正在完善
AutoCad的.Net帮助文件:


中文版NetApi指南:

更新日志:

2019/12/20修正版本0.9.279.6c
再次修正泛型类的解析,智能感知能正常解析索引函数
修改edx的调用方式,见pytest模块例程
edx模块添加getxxx函数、sssetfirst/ssgetfirst函数
修改了一些bug

2019/12/16修正版本0.9.279.6b
修正扩展函数、泛型类的解析
保存数据文件为压缩档
智能感知文件暂时只收录下列类库:
System.dll/mscorlib.dll/System.Core.dll
acdbmgd.dll/accoremgd.dll/acmgd.dll
其他类库请自行在Cad中键入PYREFERENCE命令生成

2019/12/12升级版本0.9.279.6
智能感知文件基本完成,某些泛型相关类有少许问题
取消原有pye.registall()注册,改为pyrb命令自动注册并编译
pycad.runtime模块添加edx模块,支持类lisp_ssget的选择集操作函数
注释了大部分例程

2019/12/30
修正版本0.9.279.6d
修改了一些pycad/pytest模块的bug












本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-12-22 21:39:19 | 显示全部楼层
本帖最后由 雪山飞狐_lzh 于 2019-12-30 20:38 编辑

例程贴
1、hello world
  1. @command()
  2. def helloworld(doc):
  3.     #显示hello world!
  4.     print('hello world!')
  5.     #打开事务
  6.     with dbtrans(doc) as tr:
  7.         #打开当前空间
  8.         btr = tr.opencurrspace()
  9.         #向当前空间添加直线
  10.         tr.addentity(btr, acdb.Line(acge.Point3d(0,0,0), acge.Point3d(10,10,0)))
复制代码

2、模拟直线命令
  1. @command()
  2. def myline2(doc):
  3.     #模拟直线命令
  4.     with dbtrans(doc) as tr:
  5.         btr = tr.opencurrspace()
  6.         lines, pts = [], []
  7.         while True:
  8.             n = len(pts)
  9.             if n == 0:
  10.                 #获取起点
  11.                 respt = edx.getpoint('\n指定第一个点:')
  12.                 if not respt.ok(): return
  13.                 pts.append(respt.value)
  14.             else:
  15.                 if n > 2:
  16.                     opts = aced.PromptPointOptions(
  17.                         '\n指定下一点或[闭合(C)/放弃(U)]', 'C U')
  18.                 else:
  19.                     opts = aced.PromptPointOptions(
  20.                         '\n指定下一点或[放弃(U)]', 'U')
  21.                 #获取下一点
  22.                 opts.AllowNone = True
  23.                 opts.BasePoint = pts[-1]
  24.                 opts.UseBasePoint = True
  25.                 opts.UseDashedLine = False
  26.                 respt = edx.getpoint(opts)
  27.                 if respt.ok():
  28.                     #如果正确输入点就添加一条直线
  29.                     pt = respt.value
  30.                     if n > 0:
  31.                         line = acdb.Line(pts[-1], pt)
  32.                         tr.addentity(btr, line)
  33.                         tr.flush(line)
  34.                         lines.append(line)
  35.                         pts.append(pt)
  36.                 elif respt.keyword('C'):
  37.                     #如果输入关键字C则闭合并退出
  38.                     line = acdb.Line(pts[-1], pts[0])
  39.                     tr.addentity(btr, line)
  40.                     break
  41.                 elif respt.keyword('U'):
  42.                     #如果输入关键字U则回退
  43.                     del pts[-1]
  44.                     if n > 1:
  45.                         lines[-1].Erase()
  46.                         tr.flush(line)
  47.                         del lines[-1]
  48.                 else: break
复制代码

3、linq去重,留下同心圆中直径最小的
  1. @command(flags=acrx.CommandFlags.UsePickSet)
  2. def linqtest(doc):
  3.     #linq去重,留下同心圆中直径最小的
  4.     #选择圆
  5.     ss = edx.ssget(filters=(0, "circle"))
  6.     if not ss.ok(): return
  7.     with dbtrans(doc) as tr:
  8.         #流程:按圆心分组->每组排序后->跳过第一个元素
  9.         cirs = \
  10.             ss.Cast[acdb.ObjectId]()\
  11.             .Select(lambda i: tr.getobject(i))\
  12.             .GroupBy(lambda c: c.Center)\
  13.             .SelectMany(lambda cs: cs.OrderBy(lambda c: c.Radius).Skip(1))
  14.         tr.erase(*cirs)
复制代码

4、获取曲线自交点
  1. @command()
  2. def ccitest2(doc):
  3.     #获取曲线自交点
  4.     #获取曲线
  5.     opts = aced.PromptEntityOptions('\n请选择曲线:')
  6.     opts.SetRejectMessage('错误类型!')
  7.     opts.AddAllowedClass(acdb.Curve, False)
  8.     res = edx.entsel(opts)
  9.     if not res.ok(): return
  10.     with dbtrans(doc) as tr:
  11.         pl = tr.getobject(res[0])  #type: acdb.Curve
  12.         curve3d = pl.GetGeCurve()
  13.         #用cci类判断自相交
  14.         cci = acge.CurveCurveIntersector3d(curve3d, curve3d, acge.Vector3d.ZAxis)
  15.         for k in range(cci.NumberOfIntersectionPoints):
  16.             #显示自相交点
  17.             pars = cci.GetIntersectionParameters(k)
  18.             print(curve3d.EvaluatePoint(pars[0]))
复制代码

5、两曲线间最短距离
  1. @command()
  2. def mindict(doc):
  3.     #两曲线间最短距离
  4.     #获取曲线
  5.     opts = aced.PromptEntityOptions('\n请选择曲线:')
  6.     opts.SetRejectMessage('错误类型!')
  7.     opts.AddAllowedClass(acdb.Curve, False)
  8.     res = edx.entsel(opts)
  9.     if not res.ok(): return
  10.     res2 = edx.entsel(opts)
  11.     if not res2.ok(): return
  12.     with dbtrans(doc) as tr:
  13.         curves = (tr.getobject(res.ObjectId).GetGeCurve(), tr.getobject(res2.ObjectId).GetGeCurve())
  14.         pocs = curves[0].GetClosestPointTo(curves[1])
  15.         line = acdb.Line(pocs[0].Point, pocs[1].Point)
  16.         tr.addentity(tr.opencurrspace(), line)
复制代码
发表于 2020-8-22 16:44:03 | 显示全部楼层
本帖最后由 Block 于 2020-8-22 16:45 编辑

加载不进来啊。我是CAD2020/2018都试过了。


Command: NETLOAD

Cannot load assembly. Error details: System.IO.FileLoadException: Could not load file or assembly 'file:///D:\Pycad\NFox.Pycad.Acad.dll' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x80131515)
File name: 'file:///D:\Pycad\NFox.Pycad.Acad.dll' ---> System.NotSupportedException: An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark)
   at System.Reflection.Assembly.LoadFrom(String assemblyFile)
   at Autodesk.AutoCAD.Runtime.ExtensionLoader.Load(String fileName)
   at loadmgd()
发表于 2019-12-2 18:01:33 | 显示全部楼层
优秀的大佬
发表于 2019-12-2 18:05:04 | 显示全部楼层
狐哥出手,必属精品........
开天辟地之作
发表于 2019-12-2 18:34:17 | 显示全部楼层
这就厉害了,顶起来
发表于 2019-12-2 19:46:41 | 显示全部楼层
狂顶500次,空了研究一下
发表于 2019-12-2 21:28:21 | 显示全部楼层
牛!非常Niubility!
发表于 2019-12-2 22:24:28 | 显示全部楼层
狐哥啊,你咋这么牛掰?真想研究研究你脑袋是什么做的,里面装的又是什么
发表于 2019-12-2 23:31:06 | 显示全部楼层
牛逼   牛逼
发表于 2019-12-3 06:55:07 | 显示全部楼层
牛逼,非常牛逼。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-12-23 05:12 , Processed in 0.187926 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表