Такой вопрос:
Имеем файл сборки, внутри этой сборки две другие сборки (назовем их подсборки).
Нужно программно привязать одну подсборку к другой.
Проблема в том что у одной подсборки есть деталь, внутри которой плоскость, по которой привязываем подсборки.
Получается нужно эту плоскость вытащить из подсборки в основную сборку, чтобы уже в основной сборке создать привязку.
Как это можно сделать?
Точно также, как и в обычной сборке ищете, то, что нужно и сопрягаете, только вложенность поиска больше.
Не отрабатывает!
Создаю привязку подсборок в общей сборке,
первый объект привязки задаю плоскость подсборки,
второй объект - плоскость детали во второй подсборке.
Операция создания привязки не отрабатывает. Возвращает false.
Цитата: Sabahs от 26.01.18, 13:19:27
Точно также, как и в обычной сборке ищете, то, что нужно и сопрягаете, только вложенность поиска больше.
Как я понимаю, нужно плоскость детали в подсборке вытащить через прокси в саму подсборку (что то вроде мнимой виртуальной плоскости) и потом уже создавать привязку подсборок, где в качестве объекта указать ссылку на виртуальную плоскость.
Вопрос в том, как это сделать программно?
Какие виртуальные плоскости?
Вы, когда вручную данную операцию делаете, то тоже виртуальные плоскости указываете?
Вот пример выполнения:
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);
Последняя операция не отрабатывает!
Если память не изменяет, то в ksPartCollection должны входить и под сборки, т.е. все элементы нужно искать тут SborkaColl.
Хорошо.
Тогда вопрос, как получить компоненты компонента?
Например, нашли компонент, а в его составе есть другие компоненты, и нам нужен один из них.
Я в примере делал через создание и открытие документа по полному имени компонента, но скорее всего можно проще.
Получаете у коллекции нужные ksPart-ы, а у них нужные ksEntity.
Получается, в сборке в PartCollection я нахожу компонент подсборки в виде ksPart, а уже компоненты этой подсборки (детали, которые входят в подсборку) ищу в EntityCollection?
Оптимальный вариант, использовать API7 - всё, через IPart7.
Никакие EntityCollection Вам ненужны, т.к. у Вас все объекты участвующие в операции, создаются по умолчанию.