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

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

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

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

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

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

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

Свойство компонента API5

Автор Saller, 17.02.14, 18:22:18

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

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

Saller

Добрый день коллеги. Подскажите пожалуйста, как добраться до свойств компонента (в дереве 3D модели правой клавишей выбрать "Свойство компоненты")?

17.02.14, 18:32:22 #1 Последнее редактирование: 17.02.14, 19:26:34 от Sabahs
ksPart - Интерфейс детали или под сборки в составе сборки.
Смотрите свойство которое Вам нужно.

Также можно методом KompasObject::ksExecuteKompasCommand выполнить одну из команд:
- ksCMSelectedCompanentProperties - 40463 - Свойства детали или сборки;
- ksCMSelectedCompanentInstanceProperties - 40464 - Свойства вставленного компонента.

+ Благодарностей: 1

Slaviation

На API5 проблематично.
Ниже пример на API7, api_7 - глобальная переменная.

BOOL GetProps(const IPart7Ptr& part7)
{
   if(!part7)
                return FALSE;

        //Получи интерфейс менеджера свойств
        const IPropertyMngPtr propMng;
   if(api_7->QueryInterface(IID_IPropertyMng, (void**)&propMng) != S_OK || !propMng)
      return FALSE;

   //Получи интерфейс получения редактирования значения свойств
        const IPropertyKeeperPtr propKeeper;
   if(part7->QueryInterface(IID_IPropertyKeeper, (void**)&propKeeper) != S_OK || !propKeeper)       return FALSE;

   VARIANTARG arg, index;
   VariantInit(&arg);
   arg.vt = VT_EMPTY;

   const long propCount(propMng->GetPropertyCount(&arg));
   if (propCount < 1)
      return TRUE;

   VariantInit(&index);
   index.vt = VT_I4;
   VARIANT value;
   VARIANT_BOOL fromSource(VARIANT_TRUE);

   for (long i = 0; i < propCount; ++i)
   {
      index.intVal = i;
      
      const IPropertyPtr prop(propMng->GetProperty(&arg, &index));
      if (!prop)
         continue;

      VariantInit(&value);
      if (!propKeeper->GetPropertyValue(prop, &value, VARIANT_TRUE, &fromSource))
         continue;
      
      if (value.vt == VT_EMPTY)
         continue;

      const _bstr_t propValue((_bstr_t)value);
      if(!propValue.length())
         continue;
      
                //Имеем имя свойства - prop->Name и значение преобразованное к строке propValue

   }

   return TRUE;
}
+ Благодарностей: 1

Saller

Цитата: Sabahs от 17.02.14, 18:32:22
ksPart - Интерфейс детали или под сборки в составе сборки.
Смотрите свойство которое Вам нужно.
Part я получаю, а вот как для каждой детали/сборке получить свойство и вернуть в мою программу не понял. Поискав по форуму нашел примеры только для API7, а вот для API5 ничего похожего нету.
Цитата: Sabahs от 17.02.14, 18:32:22
Также можно методом KompasObject::ksExecuteKompasCommand выполнить одну из команд:
- ksCMSelectedCompanentProperties - 40463 - Свойства детали или сборки;
- ksCMSelectedCompanentInstanceProperties - 40464 - Свойства вставленного компонента.
Этими командами открывает окно свойств, а мне надо бы вытянуть некоторые свойства в свое приложение.

Saller

Цитата: Slaviation от 18.02.14, 08:05:00
На API5 проблематично.
Ниже пример на API7, api_7 - глобальная переменная.

BOOL GetProps(const IPart7Ptr& part7)
{
   if(!part7)
                return FALSE;

        //Получи интерфейс менеджера свойств
        const IPropertyMngPtr propMng;
   if(api_7->QueryInterface(IID_IPropertyMng, (void**)&propMng) != S_OK || !propMng)
      return FALSE;

   //Получи интерфейс получения редактирования значения свойств
        const IPropertyKeeperPtr propKeeper;
   if(part7->QueryInterface(IID_IPropertyKeeper, (void**)&propKeeper) != S_OK || !propKeeper)       return FALSE;

   VARIANTARG arg, index;
   VariantInit(&arg);
   arg.vt = VT_EMPTY;

   const long propCount(propMng->GetPropertyCount(&arg));
   if (propCount < 1)
      return TRUE;

   VariantInit(&index);
   index.vt = VT_I4;
   VARIANT value;
   VARIANT_BOOL fromSource(VARIANT_TRUE);

   for (long i = 0; i < propCount; ++i)
   {
      index.intVal = i;
      
      const IPropertyPtr prop(propMng->GetProperty(&arg, &index));
      if (!prop)
         continue;

      VariantInit(&value);
      if (!propKeeper->GetPropertyValue(prop, &value, VARIANT_TRUE, &fromSource))
         continue;
      
      if (value.vt == VT_EMPTY)
         continue;

      const _bstr_t propValue((_bstr_t)value);
      if(!propValue.length())
         continue;
      
                //Имеем имя свойства - prop->Name и значение преобразованное к строке propValue

   }

   return TRUE;
}
Спасибо за подсказку, попробую еще через API5 вытащить свойства, если не получится то видимо придется переписывать все на API7 (не очень хотелось бы ломать готовые модули).

От сборки методом ksDocument3D.PartCollection - получить указатель на интерфейс динамического массива компонентов, вставленных в сборку, из которого получите детали.
+ Благодарностей: 1

Slaviation

Да ломать вроде как не нужно.
Нужно получить всего два интерфейса:
IApplicationPtr api_7 = api_5->ksGetApplication7();
и
const IPart7Ptr part7(api_5->TransferInterface(part, ksAPI7Dual, NULL));
part и  api_5 у вас уже должны быть на руках.
+ Благодарностей: 1

Saller

Все получилось, премного благодарен за помощь.