cmcc_gy
发表于 2022-4-21 09:07:29
landsat99 发表于 2022-4-20 22:15
改了一下,用的AddExtrudedSolid,可以生成。
好,非常感谢
wyjrwy
发表于 2022-4-21 09:35:37
这个就是没有详细的介绍,入门不了啊
陨落
发表于 2022-4-21 09:57:49
这么巧。。我最近刚好搞了一套lisp+cpython无缝连接编程的技术,,准备空了发出来。只有两点缺陷:
1、python的com server想在win10上注册成功几乎不可能
2、python注册com的事件,涉及到dwg数据库的,会导致cad直接崩溃,无药可救
landsat99
发表于 2022-4-21 10:35:39
wyjrwy 发表于 2022-4-21 09:35
这个就是没有详细的介绍,入门不了啊
您好。 我倒是觉得恰恰相反,COM资料极其丰富
官方ActiveX API的详细文档,每个版本都更新发布,说明、实例极其详细,,。这些VBA实例都是COM的调用方法照抄就好,python与之完全相同,基本没任何差别。同理你用Java,swt.win32调用com也是一模一样的,,那个Java更加的方便无所不能。。
我认为com的优势就是:资料丰富,操作标准通用
landsat99
发表于 2022-4-21 10:45:31
本帖最后由 landsat99 于 2022-4-21 10:48 编辑
陨落 发表于 2022-4-21 09:57
这么巧。。我最近刚好搞了一套lisp+cpython无缝连接编程的技术,,准备空了发出来。只有两点缺陷:
1、pyt ...
您好。一起期待您的作品
目前 Py调用Lisp,我用的是com接口SendCommand方法;可能这是最土的办法,不知道还有啥其他办法;;
Lisp调用Py,我用 (command “shell” “d:\\xxx\\xxx\\xx.py") ; 这个有黑窗口,比较郁闷。。
大咖,您的开发打算实现什么功能诉求呢?
陨落
发表于 2022-4-21 11:41:27
landsat99 发表于 2022-4-21 10:45
您好。一起期待您的作品
目前 Py调用Lisp,我用的是com接口SendCommand方 ...
我用的不是你这些方法,这几天我把用我的方法实现非模态对话框的效果弄好了,就放出来。
但是我的方法需要用py注册com server,这个在win10非常难搞。考虑的win10现在普及度这么高,可能也是个大问题。
另外com虽然便利,但功能相对.net来说其实弱鸡很多。
com里面也没法实现如lisp中grread的动态效果,使用事件会崩溃等。。
但是跟py结合的一大好处是可以利用py大量丰富的第三方库,
landsat99
发表于 2022-4-21 12:03:51
陨落 发表于 2022-4-21 11:41
我用的不是你这些方法,这几天我把用我的方法实现非模态对话框的效果弄好了,就放出来。
但是我的方法需 ...
赞一个 二次封装.net,这个工作量不是一般的大。。再加上稳定的com接口。。大部头史诗级作品
嗯呢。期待作品早日面世
陨落
发表于 2022-4-21 12:10:09
landsat99 发表于 2022-4-21 12:03
赞一个 二次封装.net,这个工作量不是一般的大。。再加上稳定的com接口。。大部头史诗级作品
我可没说封装.net,我就说com跟.net比很弱鸡,
landsat99
发表于 2022-4-21 12:31:25
陨落 发表于 2022-4-21 12:10
我可没说封装.net,我就说com跟.net比很弱鸡,
期待更多的人用py, 也期待py的应用生态越来越丰富 赞一个
yswoyh
发表于 2022-4-21 16:42:19
前些日子做了一个测试,VB,python,vb.net
VB6.0利用ActiveX 操作CAD 画圆 10000个圆 用时 10.05秒
VB.net 利用objectARX技术 操作CAD画圆速度最快 ,画10000圆,用时 0.39 秒
python 利用ActiveX 操作CAD画圆 10000个圆 用时 27.95秒
下面是代码
Private Declare Function GetTickCount Lib "kernel32" () As Long
Dim Acadapp As Object
Dim acaddoc As Object
Dim StartT As Long'获取运算开始时间
Dim SpendT As Long'获取运算结束时间
Private Sub Form_Load()
StartT = GetTickCount
Set Acadapp = GetObject(, "autocad.application")
Set acaddoc = Acadapp.ActiveDocument
Dim pt(0 To 2) As Double
Dim a As Object
Dim i As Long
pt(0) = 0: pt(1) = 0
For i = 1 To 10000
Set a = acaddoc.ModelSpace.AddCircle(pt, 10) '画圆
Set a = acaddoc.ModelSpace.AddText(pt(1), pt, 5) '写文字
pt(1) = pt(1) + 10
Next i
SpendT = GetTickCount - StartT
acaddoc.Utility.Prompt ("本次操作耗时:" & Format(SpendT / 1000, "0.00") & "秒")
End
End Sub
#python 利用ActiveX 操作CAD画圆 10000个圆 用时 27.95秒
#代码量最少
# 加一个添加文字用时56.60秒
from pyautocad import Autocad,APoint
import time
time_start=time.time()
acad=Autocad()
p1=APoint(0,0)
for i in range(0,10000):
acad.model.AddCircle(p1,10)
acad.model.AddText(p1.y, p1,5)
p1.y+=10
time_end=time.time()
acad.prompt(time_end-time_start)
'VB.net 利用objectARX技术 操作CAD画圆速度最快 ,画10000圆,用时 0.39 秒
'引用CAD安装目录下的 acdbmgd.dll,acmgd.dll这两个文件,将本地复制设置为false
'编译生成,用 netload 命令加载程序,执行命令 netCircle
' 加一个添加文字用时1.89秒
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.Colors
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime
Public Class Class1
Public StartTime As System.DateTime
Public EndTime As System.DateTime
Public ts As System.TimeSpan
<CommandMethod("netCircle")> Public Sub CreateCircle()
StartTime = System.DateTime.Now
Dim pt(0 To 2) As Double
Dim i As Integer
pt(0) = 0 : pt(1) = 0 : pt(2) = 0
For i = 1 To 10000 '画10000个圆
Dim circleId As ObjectId = AddCircle(New Point3d(pt(0), pt(1), pt(2)), 5)
pt(1) = pt(1) + 10
Next i
EndTime = System.DateTime.Now
ts = EndTime.Subtract(StartTime)
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
ed.WriteMessage("画" & i - 1 & "圆,用时 " & ts.TotalSeconds.ToString & " 秒")
'MsgBox(ts.TotalSeconds.ToString)
End Sub
Public Shared Function AddCircle(ByVal cenPt As Point3d, ByVal radius As Double) As ObjectId
' 在内存中创建一个圆对象
Dim ent As New Circle(cenPt, Vector3d.ZAxis, radius)
' 调用AppendEntity函数,将圆加入到模型空间.
Dim entId As ObjectId = AppendEntity(ent)
Return entId
End Function
' 将图形对象加入到模型空间的函数.
Public Shared Function AppendEntity(ByVal ent As Entity) As ObjectId
' 得到当前文档图形数据库.
Dim db As Database = HostApplicationServices.WorkingDatabase
Dim entId As ObjectId
Using trans As Transaction = db.TransactionManager.StartTransaction
' 以读方式打开块表.
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
' 以写方式打开模型空间块表记录.
Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite)
' 将图形对象的信息添加到块表记录中,并返回ObjectId对象.
entId = btr.AppendEntity(ent)
' 把图形对象添加到事务处理中.
trans.AddNewlyCreatedDBObject(ent, True)
' 提交事务处理.
trans.Commit()
End Using
Return entId
End Function
' 由插入点、文字内容、文字高度和倾斜角度创建单行文字的函数.
Public Shared Function AddText(ByVal position As Point3d, ByVal textString As String, ByVal height As Double, ByVal oblique As Double) As ObjectId
Try
' 在内存中创建单行文字对象.
Dim ent As New DBText()
' 设置文字插入点.
ent.Position = position
'设置文字内容.
ent.TextString = textString
'设置文字高度.
ent.Height = height
'设置文字倾斜角.
ent.Oblique = oblique
' 调用EntityToModelSpace函数,将单行文字加入到模型空间.
Dim entId As ObjectId = AppendEntity(ent)
Return entId
Catch
' 创建失败,则返回一个空的ObjectId.
Dim nullId As ObjectId = ObjectId.Null
Return nullId
End Try
End Function
End Class