landsat99 发表于 2022-4-22 08:30:42

本帖最后由 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这种应用,用动态的应该更香



landsat99 发表于 2022-4-22 08:40:58

本帖最后由 landsat99 于 2022-4-22 08:51 编辑

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

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





pengfei2010 发表于 2022-4-23 10:56:39

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

你这c++ 耗时 1.2秒是开玩笑的吗?应该0.12秒都要不了

烟盒迷唇 发表于 2022-4-24 10:25:55

用时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:40

不过应该比用pyautocad库的快

landsat99 发表于 2022-4-26 09:19:45

烟盒迷唇 发表于 2022-4-24 10:27
不过应该比用pyautocad库的快

另外win32com这个库稳定性好。特别是匹配标准COM写法,方便查资料这个确实加分。

landsat99 发表于 2022-4-26 09:36:29

本帖最后由 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各种工具原理说明及效率概况)比较权威。
有代表醒的图元生成、修改,及扩展数据的操作效率均有说明。

和大家分享一下,。




landsat99 发表于 2022-4-26 09:46:47

另外官方强调: 应避免外部COM操作 Xrecord Xdata这类扩展数据。效率会奇差的说,,



landsat99 发表于 2022-4-26 10:13:41

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:38

我比较喜欢用win32com,有蛮多资料可以参考的
页: 1 2 3 [4] 5 6
查看完整版本: 有人Python开发Autocad吗?都是COM,好像很少讨论