Создание отверстия в указанной точке

Программирование для CATIA.

Создание отверстия в указанной точке

Сообщение Headless » 20 дек 2011 18:55

Уважаемые специалисты!
Задача состоит в следующем: В эскизе есть несколько точек. После выбора одной из них запускаю макрос и хочу, чтобы он построил отверстие с привязкой к этой точке (именно с привязкой, чтобы можно было при желании изменить установочные размеры). Значит, сделал форму, которая возвращает значения диаметра отверстия в зависимости от диаметра стержня резьбы и ряда точности (для крепежа по ГОСТ 12876-67), диаметр и глубину цековки (опционально) , диаметр и глубину зенковки (опционально).





Отверстие делаю с помощью AddNewHoleFromRefPoint

Подскажите, пожалуйста, каким образом привязаться к точке эскиза?
Спасибо за внимание
Headless
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 12 окт 2011 12:29

Re: Создание отверстия в указанной точке

Сообщение Wireless_Fidelity » 20 дек 2011 23:39

Здравствуйте.

В CATIA эскиз можно рассматривать как каркас, который может представлять собой один и более топологических домена (точки в эскизе могут быть "изолированы" от других элементов, ровно как в Вашем случае). Поэтому подход к получению конкретной точки эскиза должен быть такой же, как и при работе с каркасом обычной поверхности - ищутся все вершины (Vertex) эскиза, а затем выбирается нужная. Обратите внимание, что при создании отверстия вручную при выборе точки из скетча выбирается не "Point.1", а "Sketch.1\Vertex.2"
Кусок скрипта, приведённый ниже, сохраняет первую вершину эскиза в переменную vtxSketchPoint, которая может быть передана в AddNewHoleFromRefPoint в качестве аргумента:

Код: Выделить всё
' получение скетча
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

oSelection.Clear
oSelection.Add sktSketch
oSelection.Search "Topology.Vertex,sel"

' получение первой вершины из тех, что были найдены в скетче
Dim vtSketchPoint as Vertex
Set vtSketchPoint = oSelection.Item(1).Value
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Создание отверстия в указанной точке

Сообщение Headless » 21 дек 2011 11:34

Здравствуйте, Wireless_Fidelity !!!
Большое спасибо, что откликнулись. По куску скрипта выше, я так понимаю, ссылка на точку vtxSketchPoint будет браться только если в дереве детали есть Sketch.1. А если я хочу просто нажать мышкой на точку любого эскиза (Sketch.x), то каким образом мне вытянуть ссылку на номер скетча?
Headless
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 12 окт 2011 12:29

Re: Создание отверстия в указанной точке

Сообщение Wireless_Fidelity » 21 дек 2011 14:04

Чтобы получить точку из выделенной вершины скрипта, просто сразу пишите:

Код: Выделить всё
Dim vtSketchPoint as Vertex
Set vtSketchPoint = oSelection.Item(1).Value


потому как в Selection будет находиться единственный объект - выделенная вершина.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Создание отверстия в указанной точке

Сообщение Headless » 18 янв 2012 15:54

Все равно осталось непонимание:
Из хелпа CAA:
Func AddNewHoleFromRefPoint( CATIAReference iOrigin, CATIAReference iSupport, double iDepth) As CATIAHole , где iOrigin - есть загадочное CATIAReference .

Код из предыдущего сообщения возвращает тип Vertex .. При попытке запихать в AddNewHoleFromRefPoint аргумент Vertex оно ругается.
Как же быть?
Headless
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 12 окт 2011 12:29

Re: Создание отверстия в указанной точке

Сообщение Wireless_Fidelity » 18 янв 2012 18:41

А если посмотреть ещё внимательнее, то можно увидеть, что Vertex это подкласс Reference.


IUnknown
|
+---IDispatch
|
+---CATBaseUnknown
|
+---CATBaseDispatch
|
+---AnyObject
|
+---Reference
|
+---Boundary
|
+---Vertex

Тем не менее, проверю скрипт у себя и отпишусь.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Создание отверстия в указанной точке

Сообщение Wireless_Fidelity » 18 янв 2012 20:34

Действительно, скрипт не работает. Но удалось его победить.
Когда пользователь создаёт отверстие, используя какую-то точку в качестве центра ("точка из 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
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7