明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: landsat99

有人Python开发Autocad吗?都是COM,好像很少讨论

[复制链接]
 楼主| 发表于 2022-4-22 08:30 | 显示全部楼层
本帖最后由 landsat99 于 2022-4-22 08:33 编辑
yswoyh 发表于 2022-4-21 16:42
前些日子做了一个测试,VB,python,vb.net
VB6.0利用ActiveX 操作CAD 画圆 10000个圆 用时 10.05秒
VB.n ...

很棒的测试。  几种技术方案的效率一目了然。

.net库二次封装了objectArx,即便对比原生lisp效率,也是高一个量级的,比py这种纯外线程COM更是高两个量级。 尤其这种密集生成Enti操作,,这确实很惊讶。。 另外.net也比较便捷人性化。

直接C++的objarx生成entity能再提高50%~60%左右,这个我对比过VC++和C#已经没有五六倍甚至数量级这种的优势。 我的结论是VC++的objarx优势并不是特别突出,基本在伯仲之间。VC++的优势在于环境标准化,各种包 库浩如烟海,还有历史代码的组织、集成、重用上。

同时另一个角度,,这两种开发在acad上都有明显的缺陷,一个是兼容性,acad版本的分版本匹配,比较繁琐;一个是快捷性,要编译、运行的明确分离。

有投资,有开发项目的这么搞静态的可以;大多数应用环境不太合适,太重了。  

CAd这种应用,用动态的应该更香



 楼主| 发表于 2022-4-22 08:40 | 显示全部楼层
本帖最后由 landsat99 于 2022-4-22 08:51 编辑

另外,,Acad官方提出的Javascript方案,有人用过吗?  官方给JS的APi还是什么性质?是内置的Node环境还事啥?咋用?

如果有官方提供的API, 是不错的脚本方式!!毕竟是官方技术支持





发表于 2022-4-23 10:56 | 显示全部楼层
landsat99 发表于 2022-4-20 14:14
com效率确实先天不足。。这是个不大不小的缺陷。一般情况下,运行速度不是瓶颈,工具通用型,编写的便 ...

你这c++ 耗时 1.2秒是开玩笑的吗?应该0.12秒都要不了
发表于 2022-4-24 10:25 | 显示全部楼层
用时28.096秒,还是比VB慢啊
import win32com.client
import pythoncom
import math
import time

# wincad = win32com.client.Dispatch("AutoCAD.Application.18")
wincad = win32com.client.Dispatch("AutoCAD.Application")
doc = wincad.ActiveDocument
doc.Utility.Prompt("Hello! Autocad from pywin32.\n")
msp = doc.ModelSpace
print(doc.Name)

def vtpnt(x, y, z=0):
    """坐标点转化为浮点数"""
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x, y, z))

time_start=time.time()
x,y,z, radius = 0,0,0, 10
# center, radius = vtpnt(x,y,z), 10
for i in range(0,10000):
    circleObj = msp.AddCircle(vtpnt(x,y,z), radius)
    textOBJ = msp.AddText(y,vtpnt(x,y,z),5)
    y+=10

time_end=time.time()
doc.Utility.Prompt("用时:" + str("%.5f"%(time_end-time_start)) + "秒。")
发表于 2022-4-24 10:27 | 显示全部楼层
不过应该比用pyautocad库的快
 楼主| 发表于 2022-4-26 09:19 | 显示全部楼层
烟盒迷唇 发表于 2022-4-24 10:27
不过应该比用pyautocad库的快

另外win32com这个库稳定性好。特别是匹配标准COM写法,方便查资料这个确实加分。
 楼主| 发表于 2022-4-26 09:36 | 显示全部楼层
本帖最后由 landsat99 于 2022-4-26 09:37 编辑
烟盒迷唇 发表于 2022-4-24 10:25
用时28.096秒,还是比VB慢啊
import win32com.client
import pythoncom

嗯嗯,是的。 <外部COM> vs. <VBA的内部COM>确实要慢不少,仅仅生成Enti 单项有数量级的差距。我粗测约10倍以上。

另外,这份官方资料(关于acad各种工具原理说明及效率概况)比较权威。
有代表醒的图元生成、修改,及扩展数据的操作效率均有说明。

和大家分享一下,。




本帖子中包含更多资源

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

x
 楼主| 发表于 2022-4-26 09:46 | 显示全部楼层
另外官方强调: 应避免外部COM操作 Xrecord Xdata这类扩展数据。效率会奇差的说,,



本帖子中包含更多资源

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

x
 楼主| 发表于 2022-4-26 10:13 | 显示全部楼层
Xdata Xrecord 有上千倍的差别,,

有理由怀疑acad没打算对外部com提供有效Xdata接口。Xrecord原生由objarx和.net操作,com老技术api也懒得增加

解决方案,扩展数据Xdata Xrecord 用Json 、XML或SQLite本地数据库替代。官方列举的典型外部工具Java,Python,R,Matlab...都有通用Json XMLd的API, 接口健壮度、效率是通用工具的专长。也避免在dwg文件内保存扩展数据的 数据管理i问题
发表于 2022-4-26 17:33 | 显示全部楼层
我比较喜欢用win32com,有蛮多资料可以参考的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-24 04:40 , Processed in 0.278430 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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