SolidWorks API Measure类测量点坐标如何显式指定参考坐标系
问题描述
现有SolidWorks装配体包含基准点P与自定义坐标系F,需求为获取点P相对于坐标系F的X、Y、Z坐标值。初始实现的VB代码如下:
Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim bstatus As Boolean Dim swMeasure As SldWorks.Measure Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc swModel.ClearSelection2 True bstatus = swModel.Extension.SelectByID2("P", "DATUMPOINT", 0, 0, 0, False, 0, Nothing, 0) Debug.Assert bstatus Set swMeasure = swModel.Extension.CreateMeasure bstatus = swMeasure.Calculate(Nothing) Debug.Assert bstatus Debug.Print ("X: " & swMeasure.X) Debug.Print ("Y: " & swMeasure.Y) Debug.Print ("Z: " & swMeasure.Z) End Sub
该脚本可正常运行,但输出坐标采用的参考坐标系为软件最近一次激活的坐标系,可能是目标坐标系F也可能是系统默认原点坐标系,结果不可预测。目前未在Measure类的公开接口中找到强制指定参考坐标系的属性,需要确认显式指定测量参考坐标系的方法,或可行的替代解决方案。
解决方案
IMeasure接口未公开直接设置参考坐标系的属性,不建议依赖该接口的隐式状态获取坐标,最稳定的实现方案是通过SolidWorks的数学变换接口直接做坐标转换,完全不依赖软件界面的历史操作状态,实现步骤如下:
- 分别获取基准点
P在系统默认全局坐标系下的坐标值,以及目标坐标系F相对于全局坐标系的变换矩阵 - 对坐标系
F的变换矩阵求逆,将点的全局坐标与逆矩阵相乘,得到的结果就是点在F坐标系下的局部坐标
可直接运行的修正代码如下:
Sub main() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swMathUtil As SldWorks.MathUtility Dim bstatus As Boolean Dim swPointFeat As SldWorks.Feature Dim swPoint As SldWorks.RefPoint Dim vPointCoord As Variant Dim swMathPoint As SldWorks.MathPoint Dim swCoordFeat As SldWorks.Feature Dim swCoordSys As SldWorks.CoordinateSystem Dim swCoordTransform As SldWorks.MathTransform Dim swLocalPoint As SldWorks.MathPoint Dim vLocalCoord As Variant Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swMathUtil = swApp.GetMathUtility ' 获取基准点P的全局坐标 swModel.ClearSelection2 True bstatus = swModel.Extension.SelectByID2("P", "DATUMPOINT", 0, 0, 0, False, 0, Nothing, 0) Debug.Assert bstatus Set swPointFeat = swModel.SelectionManager.GetSelectedObject6(1, -1) Set swPoint = swPointFeat.GetSpecificFeature2 vPointCoord = swPoint.GetPoint Set swMathPoint = swMathUtil.CreatePoint(vPointCoord) ' 获取目标坐标系F的变换矩阵 swModel.ClearSelection2 True bstatus = swModel.Extension.SelectByID2("F", "COORDSYS", 0, 0, 0, False, 0, Nothing, 0) Debug.Assert bstatus Set swCoordFeat = swModel.SelectionManager.GetSelectedObject6(1, -1) Set swCoordSys = swCoordFeat.GetSpecificFeature2 Set swCoordTransform = swCoordSys.GetTransform ' 矩阵求逆,用于全局坐标转F系局部坐标 Set swCoordTransform = swCoordTransform.Inverse() ' 执行坐标变换并输出结果 Set swLocalPoint = swMathPoint.MultiplyTransform(swCoordTransform) vLocalCoord = swLocalPoint.ArrayData Debug.Print ("X: " & vLocalCoord(0)) Debug.Print ("Y: " & vLocalCoord(1)) Debug.Print ("Z: " & vLocalCoord(2)) End Sub
补充说明:
- 若基准点或目标坐标系位于装配体的子零部件中,需要额外叠加对应零部件的位姿变换矩阵,否则会出现坐标偏差
- 若一定要使用
IMeasure接口,可在调用Calculate方法前先选中目标坐标系F将其激活,此时测量结果会以F为参考,但该方法依赖软件内部状态,不同SolidWorks版本表现可能不一致,不建议在正式脚本中使用
内容的提问来源于stack exchange,提问作者Maksim Surov
相关产品推荐
相关产品推荐

