FindObject - Найти объект в текущем документе по объекту из другого документа

Автор anton.gorschnev, 21.05.26, 16:27:12

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

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

anton.gorschnev

Доброго дня. Столкнулся с банальной задачей подсветить 3D выноску детали помещенной в сборку. И так сборка имеет неопределенное количество подсборок и деталей сколько и куда входит деталь 3D выноску которой необходимо подцветить неизвестно. Есть головная сборка, имя файла детали и объект 3D выноски взятый непосредственно с детали. Сейчас вижу единственный способ прочитать все ветвления входимостей используя object[] ob_ = IKompasDocument3D_.TopPart.PartsEx[ksPart7CollectionTypeEnum.ksUniqueParts]; при  этом запомнить и сохранить иерархию ветвей содержащих нужную деталь. Далее пройти по сохраненной иерархией  IBaseLeader3D IBaseLeader3DIn_ =(IBaseLeader3D)Part7In_.FindObject(IBaseLeader3D_, IKompasDocument3DIn_.TopPart); При количестве требующих подсветки 3D выносок 10 более да еще в разных документах,способ становиться довольно затратным. Подскажите возможно есть более эффективный способ?

lavgirb


anton.gorschnev

Имеется  IBaseLeader3D взятый не посредственно с детали. Или вы имеете в виду найти используя ILeaders3D ILeaders3D_ = ISymbols3DContainer_.Leaders3D;

lavgirb

Сам не пробовал. Просто как вариант. Выйти на IModelObject (IBaseLeader3D->IModelObject), а у IModelObject есть свойство Owner и т.д.
Или поспешил?

anton.gorschnev

 Не получилось в коллекции выносок хранятся только выноски с текущего документа, при включенном отображении выносок со всех вложенных документов ни чего не меняется.
IPart7 IPart7_ = WeldingStructure_.IKompasDocument3D_.TopPart;
ISymbols3DContainer ISymbols3DContainer_ = (ISymbols3DContainer)IPart7_;
ILeaders3D ILeaders3D_ = ISymbols3DContainer_.Leaders3D;
Сравнивать несчем. Интересно как реализованно отображение всех выносок, как бы до этой коллекции добраться.

p3452

Создайте программно, хотя-бы один вариант "выноски" (API5, API7, Строительная) и сразу поймете что откуда берется и где хранится...

p/s:
1. Пора бы уже терминологию Компас освоить:
- "документ", это файл
- "компонент", это деталь или сборка...
2. "Документ" может содержать множество компонентов, а компонент не всегда является "документом"...

anton.gorschnev

ISymbols3DContainer ISymbols3DContainer_ = (ISymbols3DContainer)IPart7_;
ILeaders3D ILeaders3D_ = ISymbols3DContainer_.Leaders3D;
IBaseLeader3D_ = ILeaders3D_.Add(ksObj3dTypeEnum.o3d_leader3D);
IBaseLeader3D_.BasePlane = ksObj3dTypeEnum.o3d_planeXOY;
if (WeldingStructure_.WeldingAdditionalRequirements.PositionWelding) { IBaseLeader3D_.ArrowType = ksArrowEnum.ksUpHalfArrow; }//стрелка
else { IBaseLeader3D_.ArrowType = ksArrowEnum.ksDownHalfArrow; }

//Расчет координат точки вставки
double XPart=0, YPart=0, ZPart=0;
                   
IMathCurve3D IMathCurve3D_ = WeldingStructure_.SelectWeldTrajectoryStructList[0].IEdge_.MathCurve;
                        double ParamMax = IMathCurve3D_.ParamMax;
                        double ParamMin = IMathCurve3D_.ParamMin;
                        IMathCurve3D_.GetPoint((ParamMax + ParamMin) / 3, out double X, out double Y, out double Z);
Debug.Print($"X= {X}, Y = {Y}, Z= {Z}");
XPart = X; YPart = Y; ZPart = Z;
...
IBaseLeader3D_.Update();
К сожалению после создания все равно не понял как выбрать выноску в сборке назначенную в детали при разных вариантах входимости не используя рекурсивно IBaseLeader3D IBaseLeader3DIn_ =(IBaseLeader3D)Part7In_.FindObject(IBaseLeader3D_, IKompasDocument3DIn_.TopPart);Сейчас попробую выбрать выноску FindObject без промежуточных преобразований, но что то мне подсказывает что выноска будет отображаться не в месте ее нахождения в сборке.
PS по поводу типов объектов и иерархии очень не хватает чего то такого  Inventor2019ObjectModel