pyqt5+win32+python联合在CAD绘图无法绘制

1 初始报错

想法是:写好pyqt5的简单界面代码后,用一个信号槽连接到CAD绘制图形。

出现了报错:显示“已成功连接到 CAD”,说明连接没有问题,但是“在 CAD 中绘制线条时出错: (-2147352567, '发生意外。', (0, None, None, None, 0, -2147024809), None)”。

搜索后给出可能原因是:1-参数输入错误,2-CAD窗口暂时不适合绘制,3-COM接口存在问题,但是这些原因并不符合我的情况。

初始代码如下:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
import win32com.client


class ZWCADDrawer(QMainWindow):
    def __init__(self):
        super().__init__()

        self.initUI()

        # 尝试连接到已打开的AutoCAD实例(如果存在)
        self.connect_to_ZWcad()

    def initUI(self):
        # 设置窗口标题和大小
        self.setWindowTitle('PyQt5 触发ZWCAD 绘图')
        self.setGeometry(100, 100, 300, 200)

        # 创建一个垂直布局
        layout = QVBoxLayout()

        # 创建一个按钮,点击时在AutoCAD中绘制线条
        self.drawLineButton = QPushButton('在 ZWCAD 中绘制线条', self)
        self.drawLineButton.clicked.connect(self.draw_line_in_ZWcad)

        # 将按钮添加到布局中
        layout.addWidget(self.drawLineButton)

        # 创建一个中心小部件,并将布局设置给它
        centralWidget = QWidget(self)
        self.setCentralWidget(centralWidget)
        centralWidget.setLayout(layout)

    def connect_to_ZWcad(self):
        try:
            # 尝试获取已打开的AutoCAD实例
            self.acad = win32com.client.Dispatch("ZWCAD.Application")
            if self.acad is not None:
                print("已成功连接到 ZWCAD")
                # 可选:使 ZWCAD 可见
                # zwcad.Visible = True
                return True
            else:
                # 通常情况下,GetObject 在成功时不会返回 None,这里可能是个多余的检查
                # 但为了清晰起见,我保留了它并添加了一条注释
                print("GetObject 调用成功,但返回的 ZWCAD 对象为空(这通常不应该发生)。")
                return False
        except Exception as e:
            # 如果 GetObject 抛出异常,通常意味着 ZWCAD 没有运行或无法访问
            print(f"无法连接到 ZWCAD: {e}")
            return False


    def draw_line_in_ZWcad(self):
            if self.acad is not None:
                try:
                    # 获取当前活动的文档
                    doc = self.acad.ActiveDocument

                    # 获取模型空间
                    model_space = doc.ModelSpace

                    # 定义线条的起点和终点
                    start_point = (0, 0, 0)
                    end_point = (100, 100, 0)

                    # 在模型空间中添加线条
                    line = model_space.AddLine(start_point, end_point)

                    print("线条已在 ZWCAD 中绘制。")

                except Exception as e:
                    print(f"在 ZWCAD 中绘制线条时出错: {e}")
            else:
                print("ZWCAD 未运行或无法连接。")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ZWCADDrawer()
    ex.show()
    sys.exit(app.exec_())

2 改变点坐标格式

def vtfloat(lst):
        # 使用列表推导式对列表中的每个元素进行浮点数转换
        # 如果转换失败(比如,元素不是数字类型),则这里会抛出 ValueError
        try:
            float_lst = [float(item) for item in lst]
        except ValueError as e:
            # 如果转换过程中发生错误,可以选择抛出异常或返回 None/错误信息
            raise ValueError(f"无法将列表中的某些元素转换为浮点数: {e}")

            # 现在,float_lst 包含了所有已转换为浮点数的元素
        # 创建一个 VARIANT 对象,包含这个浮点数数组
        variant = win32.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, float_lst)

        return variant

(第一次-其他代码均不变)

start_point = [0,0,0]
end_point = [100,100,0]
line = model_space.AddLine(self.vtfloat(start_point), self.vtfloat(end_point))

报错:在 ZWCAD 中绘制线条时出错: vtfloat() takes 1 positional argument but 2 were given


(第二次-其他代码均不变)

start_point = [self.vtfloat(0), self.vtfloat(0), self.vtfloat(0)]
end_point = [self.vtfloat(100), self.vtfloat(100), self.vtfloat(0)]
line = model_space.AddLine(start_point, end_point)

报错:在 ZWCAD 中绘制线条时出错: vtfloat() takes 1 positional argument but 2 were given


(第三次-其他代码均不变)

start_point = np.array([0, 0])  # 使用NumPy数组表示坐标点
end_point = np.array([0, 0])

ms.AddLine(self.vtfloat(start_point), self.vtfloat(end_point))

报错:Error drawing line: vtfloat() takes 1 positional argument but 2 were given

(第四次-代码有变化,没有pyqt5的参与)

于是我尝试了用坐标(x,y,z)这样,是可以在ZWCAD绘制出线段的。
但是为什么连接到pyqt5里面就不行了呢

import win32com.client
import pythoncom

def POINT(x,y,z):
   return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (x,y,z))

acadapp = win32com.client.Dispatch('ZWCAD.Application')

ms = acadapp.ActiveDocument.ModelSpace
acadapp.ActiveDocument.Utility.Prompt("hello world\n")

start_point = POINT(0, 0, 0)
print(start_point)  

ms.AddLine(POINT(0,0,0), POINT(100,100,0))

start_point打印出来的也是4个,能被AddLine识别-win32com.client.VARIANT(8197, (0, 0, 0))

但是我原样搬过去pyqt5的函数代码中,就会出现:在 ZWCAD 中绘制线条时出错: POINT() takes 3 positional arguments but 4 were given

在此留个记录,之后找到解决方法再回来更新。

也希望能得到社区大佬们的回复,非常感谢!

参考:python - comtypes库运行报错,无法传送VARIANT类型的参数 - SegmentFault 思否

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值