车间里焊点表要得急,我头回写 CATIA VBA 导焊点坐标那天下午差点把鼠标砸了。点明明在树上,跑宏要么弹"Object doesn't support this property or method",要么不报错但 Excel 里 X/Y/Z 全是 0,要么更绝——只导出十几个,剩下几百个没影。
下面是我自己踩完坑、现在还在用的路子,不绕弯。
先说为啥会报错
焊点在 CATIA 里不是只有一种"点"。你以为都是 HybridShapePointCoord(显式点),实际数模里常混着:
焊点球是 Sphere 或 Cylinder,不是点;
点是在曲线上的 PointOnCurve、在面上的 PointOnSurface;
装配体里点进了子零件,你在总装上下文跑宏,ActiveDocument 指到 Product 不指到 Part;
点刚由公式驱动生成,没 Update,GetCoordinates 读出来是空;
最坑的:早期绑定写了 Dim m As Measurable,一调 GetPoint 就炸"Function or interface marked as restricted"。
网上抄的 point.GetCoordinates coords 只对"显式坐标点"管用,碰上上面那几种直接挂。

能救场的办法:别硬读属性,走 SPAWorkbench 测量
把点(或球)转成 Reference,丢给 SPAWorkbench 的 Measurable,让 CATIA 自己算坐标。这套不挑点类型,球也行、曲线点也行。
关键点:Measurable 和坐标数组别早期绑定,全用 Variant/Object,避开那个 restricted 报错。
Sub CATMain()
On Error Resume Next
Dim CATIA As Object
Set CATIA = GetObject(, "CATIA.Application")
Dim doc As Object
Set doc = CATIA.ActiveDocument
' 焊点常在 Part 里,装配体先钻到 Part
Dim part As Object
Set part = doc.Part
part.Update ' 不 Update 读出来可能是 0
Dim sel As Object
Set sel = doc.Selection
sel.Clear
' 焊点球/圆柱名一般带 Spot/Weld/Sphere,按你数模改名前缀
sel.Search "Name='*Spot*',all"
Dim mSvc As Object
Set mSvc = doc.GetWorkbench("SPAWorkbench")
Dim xl As Object
Set xl = CreateObject("Excel.Application")
xl.Visible = True
Dim wb As Object, sh As Object
Set wb = xl.Workbooks.Add
Set sh = wb.Sheets(1)
sh.Cells(1, 1) = "名称"
sh.Cells(1, 2) = "X"
sh.Cells(1, 3) = "Y"
sh.Cells(1, 4) = "Z"
Dim i As Integer, coords(2) As Variant
Dim ref As Object, meas As Object
For i = 1 To sel.Count
Set ref = part.CreateReferenceFromObject(sel.Item(i).Value)
Set meas = mSvc.GetMeasurable(ref)
meas.GetPoint coords(0), coords(1), coords(2)
sh.Cells(i + 1, 1) = sel.Item(i).Value.Name
sh.Cells(i + 1, 2) = Round(coords(0), 3)
sh.Cells(i + 1, 3) = Round(coords(1), 3)
sh.Cells(i + 1, 4) = Round(coords(2), 3)
Next i
sel.Clear
MsgBox "导完,共 " & sel.Count & " 个"
End Sub几个我栽过跟头的细节
doc.Part 前先确认当前文档是 CATPart,不是在总装 Product 下。总装里得循环 Products 下钻到子 Part 再跑,不然 ActiveDocument.Part 直接空。
焊点是球(Sphere)时,Search 用 *Spot* 或 *Weld* 都行,关键是别只搜 CATGmoSearch.Point,那样球一个都捞不着。
coords 数组声明成 Variant 或 Dim coords(2) 都行,但调 GetPoint 时别加括号包成 GetPoint(coords),要 GetPoint coords(0), coords(1), coords(2) 这种拆开传,VB 里加括号必错。
数模单位是 mm,机器人那边要 m 就自己除 1000,别信什么自动单位转换。
装配体坐标和零件坐标不是一回事。上面代码出的是零件绝对坐标系下的数。要给机器人发总装坐标,得把子 Part 的局部坐标乘上它在 Product 里的变换矩阵——这块要是碰到了我再单写一段,本次先解决"能跑出不报错的数"这个最痛的点。
我这版在 R28、R30 都跑过,焊点球、显式点、曲线点混着放也能全捞出来。你要是数模里焊点藏在被抑制的几何集里,记得先把几何集 Activation 打开再跑,不然 Search 扫不到。
真碰到某种点类型还是读不出,把报错那行和点的 Type 名发我,我再帮你瞅。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删