首页 > 编程语言 >pyqt5+win32+python联合在CAD绘图无法绘制

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

时间:2024-08-11 18:55:31浏览次数:19  
标签:point python self pyqt5 win32 start vtfloat 100 ZWCAD

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 思否

标签:point,python,self,pyqt5,win32,start,vtfloat,100,ZWCAD
From: https://blog.csdn.net/weixin_59235556/article/details/141097829

相关文章

  • Python使用PyCharm+PySide6+Pandas创建QTableView显示Excel工作簿数据
    importsysimportwarningsfrompathlibimportPathimportpandasaspdfromPySide6importQtWidgetsfromPySide6.QtCoreimportQtfromPySide6.QtGuiimportQStandardItemModel#读取Excel工作簿数据defread_excel_with_pandas(path_excel,_cols):"&qu......
  • python爬虫
    爬虫一、爬虫的分类1、通用爬虫 实例百度,360,google、搜狗等搜索引擎功能 访问网页-》抓取数据-》数据存储-》数据处理-》提供检测服务robots协议一个约定俗成的协议,添加robots.txt文件,来说明本网站哪些内容不可以被抓取,之际写的爬虫无需遵守网站排名......
  • PythonL-Chapter_01_基础语法
    注释#这是单行注释"""这是多行注释可以写多行文字"""变量和数据类型内置基本数据类型整数(int):用于表示没有小数部分的数字,例如-1,0,1,100等浮点数(float):用于表示带有小数部分的数字,例如3.14,2.718字符串(str):用于表示文本信息,必须使用引号(单引......
  • Selenium + Python 自动化测试11(unittest组织用例)
            我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。上一篇我们讨论了unittest基本使用方法。        本篇文章我们接着讲。一些概念和一些常用的构造测试集的方法。1、基本概念1)TestCase        一个TestCase的......
  • Selenium + Python 自动化测试10(unittest概念)
            我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。上几篇我们讨论了元素的定位方法、操作方法以及一些特殊元素的操作。        在实际的测试项目组中每个模块会写多条案例,如第一条用例那里我们的登录。登录的话就可以有多条......
  • python毕业设计基于Django的汽车租赁系统
    文末获取资源,收藏关注不迷路文章目录一、项目介绍二、主要使用技术三、研究内容四、核心代码五、文章目录一、项目介绍随着经济的飞速发展和人们生活水平的显著提升,汽车已经成为现代生活中不可或缺的重要交通工具。然而,随着城市化进程的加快,交通拥堵、停车难以及高......
  • 【学习笔记】Matlab和python双语言的学习(图论最短路径)
    文章目录前言一、图论基本概念示例二、代码实现----Matlab三、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=36&vd_source=67471d3a1b4f517b7a7964093e62f7e6一、图论图论(G......
  • 21:Python函数全局变量和局部变量
    #全局变量与局部变量,全局变量大写,局部变量小写NAME='ladfs'#定义全局变量,全局作用域顶格defchange_name():print('change_name',NAME)#调用全局变量change_name()#全局变量与局部变量NAME='ladfs'#定义全局变量defchange_name():......
  • 使用条件语句登录QQ(Pythonn实验实训项目)
    实验目的1、掌握变量的创建方法及变量赋值运算的使用方法;2、掌握的掌握if-elif--else条件语句和循环语句的嵌套使用;3、掌握比较运算符的应用;4、掌握输入语句的使用方法;5、掌握continue和break语句的用法。二、实验内容使用条件语句实现QQ登录:若用户名和密码都输入正确,则......
  • 搭建python私有仓库
    1.创建帐号密码文件,并添加内容touch/opt/pyserver/.htpasswdecho"username:password">/opt/pyserver/.htpasswd2.创建包路径mkdir/opt/pyserver/packages3.创建私有仓库#不带转发的命令dockerrun--namepypi--restartalways-v/opt/pyserver/packages:/d......