• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Как, все-таки, изменить имя тела результата операции вращения, выдавливания

Автор Akew, 18.01.15, 09:58:38

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

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

Akew

Добрый день!

Столкнулся с проблемой переименования тел, полученных в результате операций вращения, выдавливания. По умолчанию, им присваиваются стандартные имена "Тело 1", "Тело 2" и т.д. Существует ли способ простого изменения этих имен? (Простой - это значит без перебора полного состава сборки, выискивая в нем операцию создания тела, и тела, полученного в результате этой операции).

Версия КОМПАСа - 14 SP1.

Эта проблема уже обсуждалась на форуме, http://forum.ascon.ru/index.php/topic,17628.msg100154.html#msg100154, но решение так никто и не предложил.

Спасибо всем, кто откликнется.


Akew

Спасибо за подсказку. Разобрался, этот вопрос решен.

Выкладываю фрагмент кода этого решения.

Задача состояла в том, чтобы создать и применить операцию вращения. Эти действия реализованы в функции, возвращающей указатель на выполненную операцию вращения.
Процесс формирования эскиза, определение операции вращения и т.д., опущены. Продемонстрирован только механизм получения указателя на интерфейс IBody7 тел (или одного тела), полученных в результате данной операции вращения, и само переименование.
nameBodyRotate - это переменная типа _bstr_t, переданная в эту функцию, содержащая новое имя (указатель) для тела вращения. Кол-во тел (частей тел), полученных в результате операции вращения, в общем случае, может быть больше одного.

. . .
entityRotate->Create(); // Выполнить операцию вращения

if(! entityRotate) return NULL; // Если результат операции NULL, вернуть NULL

ksBodyCollectionPtr body_collection = entityRotate->BodyCollection(); // Получить коллекцию тел ksBody, созданных в операции вращения

if( ! body_collection ) return entityRotate; // Если не получилось, то вернуть указатель на операцию вращения

int n_bodies = body_collection->GetCount(); // Получить кол-во тел ksBody в коллекции

if(n_bodies == 0)  return entityRotate; // Если нет ни одного тела, то вернуть указатель на операцию вращения

IBody7Ptr body7_ptr; // Объявление переменной типа "Указатель на интерфейс IBody7"
ksBodyPtr ptr_body; // Объявление переменной типа "Указатель на интерфейс ksBody"
int i; // Объявление переменной цикла
for( i=0; i<n_bodies; ++i ) { // Проход по телам операции вращения
ptr_body = body_collection->GetByIndex( i ); // Получить очередное тело
if( ptr_body == NULL ) continue; // Если пусто, то прейти к следующему телу

body7_ptr = kompas->TransferInterface( ptr_body, ksAPI7Dual, o3d_body ); // Получить указатель на интерфейс IBody7 тела ptr_body с помощью преобразователя интерфейсов
if( ! body7_ptr ) continue; // Если указатель получить не удалось, то прейти к следующему телу
body7_ptr->put_Name( nameBodyRotate ); // Установить пользовательское имя телу
body7_ptr->Update(); // Провести изменение в теле
}

return entityRotate; // Вернуть указатель на операцию вращения. Работа закончена


У меня возник новый вопрос: Как установить плотность материала и его название для тела (тел), созданного все той же операцией вращения?

Я знаю, что плотность задает метод SetMaterial() в интерфейсах IPart (ksPart) или IPart7, однако мне не удалось получить их, подобно тому, как я получил указатель интерфейса IBody7 из ksBody в приведенном фрагменте (получаю NULL).
Лучшее, что у меня получилось, - это уставновить плотность и название материала на все детали сборки, посредством GetParent(), но это не совсем то, что нужно.

Согласно справке, интерфейс твердого тела - IBody7, имеет дополнительные интерфейсы, один из которых - IMassInertiaParam7, сам не проверял.

Akew

Этот интерфейс, IMassInertiaParam7, позволяет только прочитать плотность (атрибут r).
Насколько я смог понять, плотность можно задать только для деталей с помощью метода SetMaterial (в IPart и IPart7), а тело операции вращения само по себе деталью еще не является.
Свою догадку в полной мере пока не успел проверить.

Akew

Я реализовал задание плотности для тел вращения посредством интерфейса детали (тело вращения является деталью), и, в принципе, вопрос можно считать решенным. Однако, это решение получилось довольно громоздким.
Буду признателен за другие, более простые, варианты решения этой задачи, если они существуют.