Еще раз про Location - Идентификатор материала

Автор Alex152, 02.11.16, 18:47:17

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

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

Alex152

Добрый вечер!
Прошу помощи специалистов что бы разобраться в Location - Идентификатор материала!
Задача состоит в следующим - Мне необходимо получить Идентификатор материала в выбранном чертеже который выглядит следующим образом - "Material:VB7908E20AE8D465DA09CD3450BC1DFF0;Sortament:VCE75DC5022C340ACA7E971A92DD72D9F
^SortamentEx:VA76B8F96B5B34EFE8AA300348B845FD9."

Все объекты Material или Sortament или SortamentEx мне известны, я подключаюсь к базе MatSort их там у себя в программе нахожу.

Вопрос как определить Location - Идентификатор материала в документе 2D! Понимаю что вопрос не новый но полного ответа найти не могу
Первым делом начал копаться на форуме:
Нашел следующий код: - http://forum.ascon.ru/index.php/topic,2908.msg15431.html#msg15431

// Получить атрибут с location текущего материала
ksIteratorPtr iter( kompas->GetIterator() );
BOOL res = iter->ksCreateAttrIterator( docReference, 0, 0, 0, 0, MATERIAL_ATTR_ID );
   long resOld = iter->ksMoveAttrIterator( "F", NULL );

   if ( pAttr )
  {
      ksAttributeObjectPtr attrObj( kompas->GetAttributeObject() );

      // Инициализировать структуру массива для атрибута
      ksUserParamPtr values( kompas->GetParamStruct( ko_UserParam ) );
      values->Init();
      ksDynamicArrayPtr array( kompas->GetDynamicArray( LTVARIANT_ARR ) );
      ksLtVariantPtr val( kompas->GetParamStruct( ko_LtVariant ) );
      val->Init();
      val->strVal = "";
      array->ksAddArrayItem( -1, val );
      values->SetUserArray( array );

      // Считать атрибут
      attrObj->ksGetAttrRow( pAttr, 0L, NULL, NULL, values );
      array->ksGetArrayItem( 0, val );
      m_sLocation = (char*)val->strVal;
   }

У меня при переводе на СИ#  он не работает.

                var iter = (ksIterator)kompas.GetIterator(); // Получить указатель на интерфейс ksIterator для навигации по объектам

              Первая заминка

                bool res = iter.ksCreateAttrIterator(obj??,0,0,0,0,numb??); // Создать итератор для перебора атрибутов объекта

             по справочнику obj это указатель на объект
             numb в примере указан MATERIAL_ATTR_ID но такого нет в сптравочнике

                long resOld = iter.ksMoveAttrIterator("F", 0); //Перемещаться по атрибутам

                reference pAttr = iter.ksMoveIterator("F"); -- Тут тоже скорее всего не верно
                if (pAttr != 0)
                {
                    do
                    {

                        var attrObj = (ksAttributeObject)kompas.GetAttributeObject(); //Получить указатель на интерфейс для работы с атрибутами
                        var values = (ksUserParam)kompas.GetParamStruct((short)StructType2DEnum.ko_UserParam); //Получить указатель на интерфейс структуры параметров объекта нужного типа
                        values.Init();
                        var array = (ksDynamicArray)kompas.GetDynamicArray((short)StructType2DEnum.ko_LtVariant); // Получить указатель на интерфейс динамического массива ksDynamicArray
                        var val = (ksLtVariant)kompas.GetParamStruct((short)StructType2DEnum.ko_LtVariant);
                        val.Init();
                        val.strVal = "";
                        array.ksAddArrayItem(-1, val);
                        values.SetUserArray(array);

                        attrObj.ksGetAttrRow(pAttr, 0, 0, 0, values);
                        array.ksGetArrayItem(0, val);
                        string location = val.strVal;

                    } while ((pAttr = iter.ksMoveIterator("N")) != 0);
                }

Потом оказалось что что вроде как я иду совсем не правильным путем см http://forum.ascon.ru/index.php/topic,27628.msg207111.html#msg207111

Slaviation пишет:
1. У свойства "Материал" с помощью IPropertyKeeper::GetPropertyAdditionalStorage нужно взять интерфейс пользовательского хранилища IUserDataStorage. В нем искомое.

2. Распаковать файл КОМПАС (в версии 16 он архив). В архиве посмотреть содержимое файла meta_info (файл xml). В нем смотреть узел со свойствами

Начал рыть по первому пункту:

                IKompasDocument kDoc = KompasAPI.ActiveDocument;
                IPropertyKeeper PK = (IPropertyKeeper)KompasAPI.ActiveDocument;
                IUserDataStorage user = (IUserDataStorage)KompasAPI.ActiveDocument;

                PK.GetPropertyAdditionalStorage(Property - указатель на интерфейс свойства, true, out user);

как указать данный Property не могу найти.

По второму пункту

файла meta_info (файл xml). - не нашел! Искал хорошо, может не правильно но искал долго скинте если не трудно что бы понять что там есть и что оно даст!

Подскажите как правильно найти Location - Идентификатор материала!!!!!!