明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: landsat99

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

[复制链接]
发表于 2022-4-21 09:07 | 显示全部楼层
landsat99 发表于 2022-4-20 22:15
改了一下,用的AddExtrudedSolid,可以生成。

好,非常感谢
发表于 2022-4-21 09:35 | 显示全部楼层
这个就是没有详细的介绍,入门不了啊
发表于 2022-4-21 09:57 | 显示全部楼层
这么巧。。我最近刚好搞了一套lisp+cpython无缝连接编程的技术,,准备空了发出来。只有两点缺陷:
1、python的com server想在win10上注册成功几乎不可能
2、python注册com的事件,涉及到dwg数据库的,会导致cad直接崩溃,无药可救
 楼主| 发表于 2022-4-21 10:35 | 显示全部楼层
wyjrwy 发表于 2022-4-21 09:35
这个就是没有详细的介绍,入门不了啊

您好。   我倒是觉得恰恰相反,COM资料极其丰富

官方ActiveX API的详细文档,每个版本都更新发布,说明、实例极其详细,,。这些VBA实例都是COM的调用方法照抄就好,python与之完全相同,基本没任何差别。同理你用Java,swt.win32调用com也是一模一样的,,那个Java更加的方便无所不能。。

我认为com的优势就是:资料丰富,操作标准通用
 楼主| 发表于 2022-4-21 10:45 | 显示全部楼层
本帖最后由 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 | 显示全部楼层
landsat99 发表于 2022-4-21 10:45
您好。  一起期待您的作品

目前 Py调用Lisp,我用的是com接口SendCommand方 ...

我用的不是你这些方法,这几天我把用我的方法实现非模态对话框的效果弄好了,就放出来。
但是我的方法需要用py注册com server,这个在win10非常难搞。考虑的win10现在普及度这么高,可能也是个大问题。
另外com虽然便利,但功能相对.net来说其实弱鸡很多。
com里面也没法实现如lisp中grread的动态效果,使用事件会崩溃等。。
但是跟py结合的一大好处是可以利用py大量丰富的第三方库,
 楼主| 发表于 2022-4-21 12:03 | 显示全部楼层
陨落 发表于 2022-4-21 11:41
我用的不是你这些方法,这几天我把用我的方法实现非模态对话框的效果弄好了,就放出来。
但是我的方法需 ...

赞一个    二次封装.net,这个工作量不是一般的大。。再加上稳定的com接口。。大部头史诗级作品  

嗯呢。期待作品早日面世
发表于 2022-4-21 12:10 | 显示全部楼层
landsat99 发表于 2022-4-21 12:03
赞一个    二次封装.net,这个工作量不是一般的大。。再加上稳定的com接口。。大部头史诗级作品[e ...

我可没说封装.net,我就说com跟.net比很弱鸡,
 楼主| 发表于 2022-4-21 12:31 | 显示全部楼层
陨落 发表于 2022-4-21 12:10
我可没说封装.net,我就说com跟.net比很弱鸡,

期待更多的人用py, 也期待py的应用生态越来越丰富   赞一个
发表于 2022-4-21 16:42 | 显示全部楼层
前些日子做了一个测试,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
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 14:36 , Processed in 0.244840 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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