Python SolidWorks 二次开发---SolidWorks中IMathUtility对象的CreatePoint方法踩坑

Python SolidWorks 二次开发—SolidWorks中IMathUtility对象的CreatePoint方法踩坑



前言

前天有个网友说他也用Python做SolidWorks的二次开发,但是遇到了一个问题,困扰了好久都没解决,期间查找各种国内外资料都没解决,搞得现在碰到用这个方法的时候都绕着走,问我是不是遇到过,有没有解决办法,我看后当时简单测试了下,确实是有问题,今天抽空又研究了下他碰到的问题,现在已经完美解决,下面记录下解决方法,大家有遇到类似问题的可以参考下。


一、问题描述

网友的问题是他需要在SolidWorks中创建一个点,用到的是IMathUtility对象下的CreatePoint方法,但是总是报错,无法解决

1、CreatePoint在VBA中的方法定义

CreatePoint在VBA中的定义如下:

Function CreatePoint( _
   ByVal ArrayDataIn As System.Object _
) As System.Object

ArrayDataIn: 是一个双精度的坐标数组

2、CreatePoint在用makepy.py生成的方法中的定义

CreatePoint在makepy.py生成的文件中定义如下

	def CreatePoint(self, ArrayDataIn=defaultNamedNotOptArg):
		'Creates a new math point object'
		ret = self._oleobj_.InvokeTypes(5, LCID, 1, (9, 0), ((12, 1),),ArrayDataIn
			)
		if ret is not None:
			ret = Dispatch(ret, 'CreatePoint', None)
		return ret

可以看到VBA和Python 中两个的定义是一样的,这样看来应该不会出问题,也很容易解决问题,实际则不然

二、问题出现

1、Python 测试代码

方法本身使用不难,于是就在Python 中简单写了如下测试代码:

import win32com.client
import pythoncom

def main():
    sldver=2018
    swApp=win32com.client.Dispatch(f'SldWorks.Application.{sldver-1992}')
    swApp.CommandInProgress =True
    swApp.Visible =True
    errors=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    warnings=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    swModel = swApp.ActiveDoc
    # 创建IMathUtility对象
    swMathUtil = swApp.GetMathUtility
    # 创建点
    Pt1=swMathUtil.CreatePoint((0.05,0.06,0.07))
    # 输出结果
    print(Pt1.ArrayData)
    
if __name__ == '__main__':
    main()

2、问题出现

运行以后出现如下错误:

pywintypes.com_error: (-2147352573, ‘找不到成员。’, None, None)

出现问题的语句是:

# 创建点
Pt1=swMathUtil.CreatePoint((0.05,0.06,0.07))

错误提示是说CreatePoint的赋值有问题,可是对照函数原型,这样赋值不应该有问题,就算有问题也不应该是这个错误,出于对函数原型的相信就重新试下赋值,修改上面一句代码如下:

# 创建点
   Pt1=swMathUtil.CreatePoint(win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (0.05,0.06,0.07)))

结果是依然报错,那可以肯定的是跟赋值形式没有关系

3、解决措施

既然以上的赋值都有问题,决定先不赋值,看看初始值是什么,于是上面修改代码如下:

# 创建点
Pt1=swMathUtil.CreatePoint
# 输出结果
print(Pt1.ArrayData)

输入的结果如下,依据输出的结果来看,初始值就是坐标轴中心,既然有值那就能修改,尝试修改下:

(0.0, 0.0, 0.0)

修改后的代码如下:

# 创建点
Pt1=swMathUtil.CreatePoint
# 点赋值
Pt1.ArrayData=(0.05,0.06,0.07)
# 输出结果
print(Pt1.ArrayData)

实际输出的结果如下:

(9.60958240462e-312, 0.05, 0.0)

正确的输入结果应该是

(0.05,0.06,0.07)

这样看来是赋值不正确,再次修改代码如下:

# 创建点
Pt1=swMathUtil.CreatePoint
# 点赋值
Pt1.ArrayData=win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (0.05,0.06,0.07))
# 输出结果
print(Pt1.ArrayData)

输出结果如下:

(0.05,0.06,0.07)

可以看到此时的输出结果是正确的,说明问题已经找到并解决

4、问题解决后的完整代码

完整代码如下:

import win32com.client
import pythoncom


def main():
    sldver=2018
    swApp=win32com.client.Dispatch(f'SldWorks.Application.{sldver-1992}')
    swApp.CommandInProgress =True
    swApp.Visible =True
    errors=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    warnings=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    swModel = swApp.ActiveDoc
    # 创建IMathUtility对象
    swMathUtil = swApp.GetMathUtility
    # 创建点
    Pt1=swMathUtil.CreatePoint
    # 点赋值
    Pt1.ArrayData=win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (0.05,0.06,0.07))
    # 输出结果
    print(Pt1.ArrayData) 
    
if __name__ == '__main__':
    main()

三、问题总结

这个问题的出现,常规的解决方法都是查找原方法的定义,按照定义进行赋值,结果是按照原方法的形式去赋值处理的话问题是无法解决的,这时候需要另寻他法,对出现的结果直接进行修改,这样问题很容易就解决了,此问题的出现提醒在后续COM接口的调用中,不能完全依照原始定义去处理,有时候也是需要变通处理的

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
SolidWorks可以通过Python编程语言进行二次开发Python是一种简单易学的脚本语言,拥有丰富的库和模块,可以很好地与Solidworks集成。 首先,为了进行SolidWorks的二次开发,我们需要安装SolidWorks API以及Python的相关库。SolidWorks API是一组可用于对SolidWorks进行编程访问的库和接口。Python的相关库包括pywin32和comtypes,用于与SolidWorks的COM接口进行交互。 使用Python进行SolidWorks二次开发可以实现许多功能,如自动化生成零件、装配件和工程图。我们可以使用Python脚本读取和修改SolidWorks文件、创建和操作零件和装配件,以及生成和管理工程图。Python也可以帮助我们进行CAD数据的处理和分析,如提取尺寸信息、计算质量和重心等。 在二次开发,我们可以编写Python脚本来快速完成重复性的任务,提高工作效率。Python的易学性和代码的简洁性使得二次开发变得更加容易,无需编写繁琐的代码,可以快速实现想要的功能。 除了使用已有的库和模块,我们还可以使用SolidWorks的API文档和示例代码来学习和开发自己的功能。SolidWorks提供了详细的API文档,其包含各种对象方法的说明,以及示例代码和教程来帮助我们开始二次开发。 总之,通过使用Python进行SolidWorks二次开发,我们可以实现自动化、快速和高效的CAD任务处理,并且具有灵活性和可扩展性。这极大地促进了CAD工程师在实际工作的效率和创造力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值