Получение списка всех тел в сборке.

Автор once, 10.01.19, 10:29:55

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

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

once

Требуется получить список всех тел в сборке для того, чтобы вдальнейшем их промасштабировать. Сначала я через API7 получаю состав сборки (все детали в сборке и подсборках). Затем в цикле пробегаюсь по ним, чтобы получить из каких тел состоят эти детали. В первом примере пришлось прибегнуть к API5, чтобы получить коллекцию тел. Во втором решил обойтить только API7. Тестирую все на сборке из примеров к Компас Heat gun.a3d. По непонятной мне причине не масштабируются Корпус-крышка и Корпус-основа, верней масштабируется только одно тело этих деталей, а при масштабировании второго выдается ошибка "Невозможно выполнить операцию" и детали исчезают (их нет в пространчтве модели, в дереве построения есть). Это происходит как в первом, так и во втором варианте. Возникает несколько вопросов:
1) Как получить список всех тел в сборке, чтобы их вдальнейшем можно было масштабировать?
2) Откуда взялись 2 тела в составе Корпус-крышка и Корпус-основа, когда при просмотре дерева построения оно там одно? В дебаге эти детали состоят из двух тел, одно имеет обозначение как и у детали в которую входит, а второе вообще непонятно откуда взялось. В дереве построения Компас 14 SP2.7 детали Корпус-крышка тело 118 (в дебаге появляется тело 2), Корпус-основа состоит из тела 215 (в дебаге тело 5), в Компасе 18 в дереве построения тоже эти детали состоят из одного тела, но имеют наименование не 215 и 118, а как в дебаге - тело 5 и тело 2.
3) Почему возникает ошибка "Невозможно выполнить операцию" при масштабировании тела 2 детали Корпус-крышка и тела 5 детали Корпус-основа и детали исчезают?
Пример 1
ksPart ksPart = _kompas.TransferInterface(prt7, 1, 0);
ksBodyCollection bc = ksPart.BodyCollection();
ksBody ksBody = bc.First();
while (ksBody != null)
{
     Scaling3D s = ss.Add();
     s.BasePoint = ((IAuxiliaryGeomContainer)topPart).LocalCoordinateSystems.Current;
     IKompasAPIObject kao = _kompas.TransferInterface(ksBody, 2, 0);
     s.Shell = kao;
     s.Scale = 2;
     s.Name = prt7.Marking;
     bool b = s.Update();
     ksBody = bc.Next();
}

Пример 2
IFeature7 f7 = prt7 as IFeature7;
if (f7.ResultBodies is object[])
   foreach (var body in f7.ResultBodies)
      {
         if (body is IBody7)
            {
                Scaling3D s = ss.Add();
                s.BasePoint = ((IAuxiliaryGeomContainer)topPart).LocalCoordinateSystems.Current;
                s.Shell = body;
                s.Scale = 2;
                s.Name = prt7.Marking;
                bool b = s.Update();
            }
      }
else
   {
      if (f7.ResultBodies is IBody7)
         {
            IBody7 bb = f7.ResultBodies as IBody7;
            Scaling3D s = ss.Add();
            s.BasePoint = ((IAuxiliaryGeomContainer)topPart).LocalCoordinateSystems.Current;
            s.Shell = bb;
            s.Scale = 2;
            s.Name = prt7.Marking;
            bool b = s.Update();
         }
   }

Для масштабирования, нужно сначала отключить разнесение сборки, а потом можно масштабировать.

once


once

Сформулирую вопрос проще. С помощью приведенных примеров можно получить список всех тел перебирая каждую деталь? Если да, то, почему некоторые тела не масштабируются, выдавая ошибку "Невозможно выполнить операцию"?