Как добраться до конкретного ребра/поверхности

Автор gabik, 10.12.12, 13:28:07

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

gabik

У нас есть например компонент:
ksPart part = (ksPart)_doc.GetPart((short)Part_Type.pNew_Part);
В нем у нас есть два эскиза, которые мы выдавливаем и получаем общее ребро между двумя объектами. Теперь нам необходимо применить операцию скругления этого ребра. Откуда взять именно это ребро?
В примерах скругления из SDK скругляется весь ksPart:
ksEntityCollection collect = (ksEntityCollection)part.EntityCollection((short)Obj3dType.o3d_edge) и добавление этой коллекции в filletDef.array().
Можно конечно подобрать индекс поверхности и добавить конкретную, но если таких поверхностей сотни?
Можно как-нибудь из конкретной операции вытащить элементы которые были созданы после неё? Например у нас есть конкретная операция выдавливания, я хочу получить все ребра/ поверхности/ точки которые образовались после этой операции?

ksFaceDefinition::EdgeCollection - Получить указатель на интерфейс массива ребер, ограничивающих грань.
Получить одну коллекцию до операции, вторую после и сравнить, что не совпадает будут новыми ребрами.
+ Благодарностей: 1

chelkar

Цитата: gabik от 10.12.12, 13:28:07
Можно как-нибудь из конкретной операции вытащить элементы которые были созданы после неё? Например у нас есть конкретная операция выдавливания, я хочу получить все ребра/ поверхности/ точки которые образовались после этой операции?
Можно получить аналог подсветки элементов модели по выделению операции в Дереве построения.
Для этого после создания операции получаем от нее элемент в дереве IEntity::GetFeature
и далее IFeature::EntityCollection с нужным типом. Функция вернет коллекцию объектов, тех которые КОМПАС подсветит при указании такой операции в Дереве построения.
+ Благодарностей: 1

gabik

Получаю дерево, далее из него коллекцию конкретных объектов. Все отлично.
ksFeature featureHandle = (ksFeature)baseLoftHandle.GetFeature();
ksEntityCollection coll = (ksEntityCollection)featureHandle.EntityCollection((short)Obj3dType.o3d_face);

Мне, например, нужно сделать операцию с одной конкретной полученной гранью:
filletCollection.Add(coll.GetByIndex(1));
Всего получил я их 3. Операция применяется отлично, скругление происходит, но элементы в коллекции постоянно меняются местами при перерисовке. Таким образом при каждом запуске операция скругления применяется к новой грани из трех. Как быть в этом случае?

10.12.12, 20:43:14 #4 Последнее редактирование: 10.12.12, 21:26:43 от Sabahs
Вам необходимо однозначно определить одну грань из трёх, по тем признакам, которые Вам известны, Вы делаете поиск по индексу, а это не правильно, он не даёт однозначности.
+ Благодарностей: 1

chelkar

Чтобы что-то посоветовать, надо понимать условия выполнения действия.
Можно попробовать поискать нужный объект по геометрии. Например отфильтровать по заданной геометрической точке. См. функцию IEntityCollection::SelectByPoint
Либо, при выполнении предыдущих операций именовать грани через IEntity::name, а потом перебирать их по имени.
Если же код моделирования выполняется в заведомо неизвестных условиях, например, на произвольной пользовательской модели, то что то определить можно только через запрос пользователю.
+ Благодарностей: 1