Действительно, скрипт не работает. Но удалось его победить.
Когда пользователь создаёт отверстие, используя какую-то точку в качестве центра ("точка из 3Д"), то CATIA генерирует скетч, в котором содержится всего два элемента - точка центра отверстия (всегда называется Point.1) и проекция точки из 3Д. Точка центра отверстия через Coincidence сonstraint привязана к проекции точки из 3Д. За счёт этого достигается ассоциативность.
По какой-то причине метод AddNewHoleFromRefPoint не может спроецировать во внутренний скетч точку, выбранную в скетче в 3Д. Поэтому мы его обманем и подсунем ему не вершину скетча, а динамически созданную точку, отстоящую от этой вершины на 0,0,0. Метод посчитает точку обычной и корректно отработает, а мы сохраним ассоциативность созданной дырки с вершиной скетча (выбранной пользователем точкой).
Перед запуском скрипта ниже нужно в 3Д модели (а не в дереве спецификаций) сначала выбрать вершину скетча, которая будет являться центром дырки, а затем грань, которая будет суппортом:
- Код: Выделить всё
Sub CATMain()
' получение скетча
Dim prtPart As Part
Set prtPart = CATIA.ActiveDocument.Part
Dim sktSketch As Sketch
Set sktSketch = prtPart.FindObjectByName("Sketch.1")
' поиск вершин в скетче
Dim oSelection As Selection
Set oSelection = CATIA.ActiveDocument.Selection
Dim oHSF As HybridShapeFactory
Set oHSF = prtPart.HybridShapeFactory
' получение первой вершины из тех, что были найдены в скетче
Dim vtSketchPoint As Vertex
Set vtSketchPoint = oSelection.Item(1).Value
' создание динамической точки с отстоянием от вершины 0,0,0
Dim pntTempPoint As HybridShapePointCoord
Set pntTempPoint = oHSF.AddNewPointCoordWithReference(0, 0, 0, vtSketchPoint)
pntTempPoint.Compute
' получение ссылки на динамическую точку
Dim refTempPoint As Reference
Set refTempPoint = prtPart.CreateReferenceFromObject(pntTempPoint)
' получение суппорта
Dim refSupport As Face
Set refSupport = oSelection.Item(2).Value
' создание отверстия с центром в динамической точке (=выбранной вершине скетча)
prtPart.ShapeFactory.AddNewHoleFromRefPoint refTempPoint, refSupport, 200
End Sub