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

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

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

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

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

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

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

Как получить свойства документа (модель, чертеж, фрагмент)

Автор snegok74, 21.02.13, 11:40:36

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

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

snegok74

Подскажите пожалуйста, как программно получить список свойств модели, фрагмента или чертежа, перебрать их, и получить о них данные.
те которые находятся через меню Файл -> Свойства модели (фрагмента или чертежа).

Нашел на форуме только одну ссылку на что то похожее http://forum.ascon.ru/index.php/topic,19514.msg120002.html#msg120002 но как использовать эти интерфейсы IPropertyKeeper и IProperty,  для меня совсем темный лес.

Если есть у кого, рабочий примерчик по их использованию, поделитесь пожалуйста.

PS ищу это для добавления критериев поиска в диалог открытия http://forum.ascon.ru/index.php/topic,5841.msg163713.html#msg163713



snegok74

С открыванием.
Но если есть такая возможность, было бы идеально. Однако сильно сомневаюсь что так можно.

Если так то, что Вы конкретно хотите получить? Я думаю интерфейсы IPropertyKeeper и IProperty Вам мало чем помогут.

snegok74

В модели, сборке или чертеже можно ввести обозначение документа и наименование изделия.
Вот по этим характеристикам я хочу организовать поиск файла.
Конечно на программное открытие каждого файла и просмотр его потратится много времени, но! это всеже быстрее чем вручную искать нужную деталь в свалке чертежей.

yarikv

делал когда то библиотеку, которая обрабатывала свойства Обозначение и Наименование документа. выкладываю исходники. посмотри. может пригодится
+ Благодарностей: 3

snegok74

yarikv - изучаю Ваш исходник (пока в прцессе) и кажется он мне не совсем подходит - просто чертеж может не иметь штампа (Сервис -> Параметры -> Текущий чертеж-> Оформление -> Название = "Без оформления (номер 15)" ) и тогда работа со свойствами по штампу отменяется (((

но в любом случае, yarikv, спасибо огромное - всякие полезности у Вас в примере есть  :um:

Для модели Вам возможно подойдёт свойство IPart7::Marking  - обозначение компонента, но я так понимаю оно может и отсутствовать.

snegok74

Это для моделей и сборок, а как же быть с чертежами и фрагментами, там только этот вариант проходит.

Для чертежей IStamp, если заполнен то хорошо, можно по части имени файла определять, если туда входит обозначение.

snegok74

может IPropertyMng ? он вроде бы как раз за это отвечает. так?

Я с ним не работал, поэтому конкретно сказать ничего не могу, можете получить вариантный массив и посмотреть, что Вам будет возвращено, но меня фраза обведённая красным настораживает.

snegok74

спасибо. буду пытаться "курить" в этом направлении.

snegok74

с о всеми подсказками и  с примером Step4_API7_3D_1 (ISurfaceContainer) настряпал следующий код, но он почему то выдает кол-во свойств текущего документа = 0
товарищи гуру, может глянете чего я не так наваял   :o:


procedure TForm1.Button_A3_0Click(Sender: TObject);
var
  PropMng : IPropertyMng;
  disp, disp2 : IDispatch;
  newKompasAPI  : IApplication;

begin
  Application.Handle := GetHWindow;
  //
  disp := IDispatch(CreateKompasApplication);
  newKompasAPI := disp As IApplication;

  Showmessage('Документов открыто:' + IntToStr(newKompasAPI.Documents.Count));

  if ( newKompasAPI <> nil ) then begin

    PropMng := newKompasAPI As IPropertyMng;
    // varEmpty = VT_EMPTY = текущий документ
    Showmessage('Свойств у документа:' + IntToStr(    PropMng.PropertyCount[varEmpty] ));
    newKompasAPI := nil;
  end
  else
    Showmessage('newKompasAPI = nil');
end;

snegok74

уфффф, разобрался  8-)
вот работающий кусочек на Delphi, кому интересно будет.

uses ... ksAPI7, ActiveX;

procedure TForm1.Button_A3_0Click(Sender: TObject);
var
  PropMng : IPropertyMng;
  disp, dispDoc : IDispatch;
  newKompasAPI  : IApplication;
  v: Variant;
  Prop: IProperty;
  i: integer;
begin
  Application.Handle := GetHWindow;
  //
  disp := IDispatch(CreateKompasApplication);
  newKompasAPI := disp As IApplication;

  if ( newKompasAPI <> nil ) then begin
    Showmessage('открыто документов:' + IntToStr(newKompasAPI.Documents.Count));

    dispDoc := newKompasAPI.ActiveDocument;

    PropMng := newKompasAPI As IPropertyMng;
    // varEmpty = VT_EMPTY = текущий документ
    Showmessage('свойств у документа:' + IntToStr(    PropMng.PropertyCount[dispDoc] ));

    //ShowMessage('_' + ShowBasicVariantType(v) + #13 + #10 + '_' );
    for i:=0 to 15 do begin
      Prop := PropMng.GetProperty(dispDoc,i) as IProperty;
      ShowMessage('_' + Prop.Name);
    end;
    newKompasAPI := nil;
    dispDoc := nil;
  end
  else
    Showmessage('newKompasAPI = nil');
end;
+ Благодарностей: 1

IgorRUtver

А как собственно прочитать значение свойства? У меня свойство создано пользователем, значение выбирается из списка значений типа "лазерная резка", "мех. обр.", "лазерная резка + мех. обр." и тп. Само свойство я получил по примеру выше. А вот значение прочитать не могу. В SDK есть. IPropertyKeeper::GetPropertyValue - получить значение свойства, но вот никак не допру как ей пользоваться, в входных параметрах есть Value - значение свойства, так мне его получить нужно а не указывать  :|

Цитироватьв входных параметрах есть Value - значение свойства
Вообще, это выходное значение для функции  IPropertyKeeper::GetPropertyValue, в данную переменную будет записано значение свойства.

IgorRUtver

Все понял, я неправельно параметры указал
pPropertyKeeper.GetPropertyValue(Prop,v2,false,b1);
Функция записывает не только в переменную v2 : variant значение свойства, но и в переменную b1 : wordbool значение true или false. А я по невнимательности указывал значение а не имя переменной. Спасибо за ответ!

Kuha

Подскажите, пожалуйста, правильный вариант. Не могу на C# победить эту функцию GetPropertyValue:

                KompasDocument kDoc = (KompasDocument)My7Komp.ActiveDocument;
                IPropertyMng PropMng = My7Komp as IPropertyMng;
                MessageBox.Show("Количество свойств файла: " + Convert.ToString(PropMng.PropertyCount[kDoc]));

                for (int i = 0; i < PropMng.PropertyCount[kDoc]; i++)
                {
                    _Property Prop = PropMng.GetProperty(kDoc,i);
                    IPropertyKeeper PropKeep = My7Komp as IPropertyKeeper;
                    bool FromS;
                    object value = new object { };
                    PropKeep.GetPropertyValue(Prop, out value, false, out FromS);
                }


Сами названия свойств Prop.Name считывает без проблем.
C# не позволяет оставить переменную value без типа, написав var value;, но в функции GetPropertyValue подсказывает, что value - это out object. Против приведенного выше варианта компилятор не возражает, но во время работы возникает ошибка " Ссылка на объект не указывает на экземпляр объекта."