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