Привязка двух сборок по внутренним элементам

Автор anton_cher93, 26.01.18, 13:00:48

« предыдущая - следующая »

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

anton_cher93

Такой вопрос:
Имеем файл сборки, внутри этой сборки две другие сборки (назовем их подсборки).
Нужно программно привязать одну подсборку к другой.
Проблема в том что у одной подсборки есть деталь, внутри которой плоскость, по которой привязываем подсборки.
Получается нужно эту плоскость вытащить из подсборки в основную сборку, чтобы уже в основной сборке создать привязку.
Как это можно сделать?

Sabahs

Точно также, как и в обычной сборке ищете, то, что нужно и сопрягаете, только вложенность поиска больше.

anton_cher93

Не отрабатывает!
Создаю привязку подсборок в общей сборке,
первый объект привязки задаю плоскость подсборки,
второй объект - плоскость детали во второй подсборке.

Операция создания привязки не отрабатывает. Возвращает false.

anton_cher93

Цитата: Sabahs от 26.01.18, 13:19:27
Точно также, как и в обычной сборке ищете, то, что нужно и сопрягаете, только вложенность поиска больше.


Как я понимаю, нужно плоскость детали в подсборке вытащить через прокси в саму подсборку (что то вроде мнимой виртуальной плоскости) и потом уже создавать привязку подсборок, где в качестве объекта указать ссылку на виртуальную плоскость.
Вопрос в том, как это сделать программно?

Sabahs

Какие виртуальные плоскости?
Вы, когда вручную данную операцию делаете, то тоже виртуальные плоскости указываете?

anton_cher93

Вот пример выполнения:

Sborka = (ksDocument3D)ikompas.Document3D();

            //Открываем сборку
            if(Sborka.Open("D:\\Сборка.a3d", false))
            {
                // Получаем коллекцию компонентов
                SborkaColl = Sborka.PartCollection(true);

                //Получаем ссылку на первую подсборку
                Podsborka_1 = SborkaColl.GetByIndex(0);

                //Получаем ссылку на вторую подсборку (в этой подсборке деталь)
                Podsborka_2 = SborkaColl.GetByIndex(1);

                //Получаем ссылку на плоскость в первой подсборке
                XOY_plane_1 = Podsborka_1.GetDefaultEntity((short)1);

                // Получаем интерфейс 3D модели второй подсборки
                ksDocument3D Podsbor_2_3D = (ksDocument3D)ikompas.Document3D();

                // Открываем вторую подсборку
                Podsbor_2_3D.Open(Podsborka_2.fileName, true);

                // Получаем коллекцию компонентов подсборки
                PodsborkaColl = Podsbor_2_3D.PartCollection(true);

                // Находим дееталь
                detal = PodsborkaColl.GetByIndex(0);


                // Находим плоскость в детали
                XOY_plane_2 = detal.GetDefaultEntity((short)1);

               // Пытаемся создать привязку первой подсборки к плоскости детали во второй подсборке
                Sborka.AddMateConstraint((short)MateConstraintType.mc_Distance,
                             XOY_plane_1,
                             XOY_plane_2,
                             1,
                             1,
                             0.0);

Последняя операция не отрабатывает!

Sabahs

Если память не изменяет, то в ksPartCollection должны входить и под сборки, т.е. все элементы нужно искать тут SborkaColl.

anton_cher93

Хорошо.
Тогда вопрос, как получить компоненты компонента?
Например, нашли компонент, а в его составе есть другие компоненты, и нам нужен один из них.
Я в примере делал через создание и открытие документа по полному имени компонента, но скорее всего можно проще.

Sabahs

Получаете у коллекции нужные ksPart-ы, а у них нужные ksEntity.

anton_cher93

Получается, в сборке в PartCollection я нахожу компонент подсборки в виде ksPart, а уже компоненты этой подсборки (детали, которые входят в подсборку) ищу в EntityCollection?

Sabahs

Оптимальный вариант, использовать API7 - всё, через IPart7.
Никакие EntityCollection Вам ненужны, т.к. у Вас все объекты участвующие в операции, создаются по умолчанию.