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

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

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

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

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

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

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

Свойство компонента API7 - источник

Автор Lito 2, 25.11.14, 17:25:16

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

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

Lito 2

Добрый день.
Может быть, кто-то подскажет, как добраться до галочки "Источник" в свойствах компонента у сборочной единицы и снять ее у всех объектов?

Количество всех элементов СБ я получаю, а вот как дальше получить интерфейс на элемент СБ и достучаться до свойств
каждого элемента?



.......
var vsego, i, j, stand, det : integer;

     Kompas7 : IApplication;
     Doc : IKompasDocument;
     S3D : IKompasDocument3D;
     dispEl : IDispatch;
     Propty : IProperty;
     pPart7 : IPart7;
     pParts7 : IParts7;
     Mng: IPropertyMng;

.......

   begin
      S3D:= Doc as IKompasDocument3D;
      pPart7:= S3D.TopPart as IPart7;
      vsego:= pPart7.Parts.Count;

     
      for i := 0 to vsego-1 do
            begin
                kolSv:= 0;
                if pPart7.Parts.Part[i].Standard = True then Inc(stand);
                if pPart7.Parts.Part[i].Detail = True then Inc(det)
                  else
                     Inc(sb);
               
                dispEl:= pPart7.Parts.Part[i] as IDispatch; //тут не верно, надо как-то по другому

                Mng:= Kompas7 As IPropertyMng; 
                Application.MessageBox(PwideChar('Элемент: ' + intToStr(i)+ ' - '+ IntToStr(Mng.PropertyCount[dispEl])), LIB_NAME, MB_ICONQUESTION);
             .......

            end;


    end;


Вместо pPart7.Parts лучше использовать pPart7.PartsEx, если PartsEx не возвращает элементы под сборок, то делать функцию рекурсивной.

Slaviation

ЦитироватьМожет быть, кто-то подскажет, как добраться до галочки "Источник"

С++, имеем на руках: IApplicationPtr api_7 (интерфейс приложения КОМПАС-3D) и IPart7Ptr::part7 (проверяемый на состояние галочки компонент)

Собственно сабж:

//Менеджер свойств
const IPropertyMngPtr propMng;
api_7->QueryInterface(IID_IPropertyMng, (void**)&propMng);

//Интерфейс получения/редактирования значения свойств для имеющегося на руках компонента
const IPropertyKeeperPtr propKeeper;
part7->QueryInterface(IID_IPropertyKeeper, (void**)&propKeeper);

//Количество свойств
VARIANTARG arg, index;
VariantInit(&arg);
arg.vt = VT_EMPTY; //Определяем количество свойств в текущем документе
const long propCount(propMng->GetPropertyCount(&arg));

//По всем свойствам
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));

    VariantInit(&value);
    propKeeper->GetPropertyValue(prop, &value, VARIANT_TRUE, &fromSource); //Получили состояние галочки
}








Lito 2

Что при pPart7.Parts, что при PartsEx
кол. свойств в сообщении возвращает 0, что ни так?


begin
      S3D:= Doc as IKompasDocument3D;
      pPart7:= S3D.TopPart as IPart7;
      vsego:= pPart7.Parts.Count;

      pPartsEx := pPart7.PartsEx[ksAllParts];
      propMng:= Kompas7 As IPropertyMng;
     
      for i := 0 to vsego-1 do
            begin
                kolSv:= 0;
                if pPart7.Parts.Part[i].Standard = True then Inc(stand);
                if pPart7.Parts.Part[i].Detail = True then Inc(det)
                  else
                     Inc(sb);
               
                if VarType(pPartsEx)=(VT_ARRAY or VT_DISPATCH) then  pModelObject := IDispatch(pPartsEx[i]) as IModelObject;
                   pPart7i := pModelObject as iPart7;

                Application.MessageBox(PwideChar('Элемент: ' + intToStr(i)+ ' - '+ IntToStr(Mng.PropertyCount[pPart7i])), LIB_NAME, MB_ICONQUESTION); //возвращается 0 свойств
             .......

            end;




Если в pPropertyMng.PropertyCount передавать указатель на документ, то возвращает количество.

var
Disp:IDispatch;
KompasApi:IApplication;
Document:IKompasDocument;
Doc3D,Doc3Dt:IKompasDocument3D;
Air:OleVariant;
J,Count,K:Integer;
pKompasAPIObject:IKompasAPIObject;
pPart7,pPart7t:IPart7;
pPropertyMng:IPropertyMng;
Obj:IDispatch;
pDocuments:IDocuments;
begin
  Disp:=IDispatch(CreateKompasApplication);
  KompasApi:=Disp as IApplication;
  if KompasApi<>nil then
   begin
     pDocuments:=KompasApi.Documents;
     Document:=KompasApi.ActiveDocument;
     pPropertyMng:=KompasApi as IPropertyMng;
   end;
  if Document<>nil then if(Document.type_=ksDocumentPart)or(Document.type_=ksDocumentAssembly)or
   (Document.type_=ksObjectPartDocument)or(Document.type_=ksObjectAssemblyDocument)then
    Doc3D:=Document as IKompasDocument3D;
  if Doc3D<>nil then pPart7:=Doc3D.TopPart;
  if(pPropertyMng<>nil)and(pPart7<>nil)and(pDocuments<>nil)then
   begin
     Count:=pPropertyMng.PropertyCount[IDispatch(Doc3D)];
     Kompas.ksMessage(IntToStr(Count));
     Air:=pPart7.PartsEx[ksAllParts];
     J:=-1;
     if(VarType(Air)=(VT_ARRAY Or VT_DISPATCH))then J:=VarArrayHighBound(Air,1) else
      if(VarType(Air)=VT_DISPATCH)then J:=0;
     K:=0;
     while K<>J+1 do
      begin
        if J=0 then Obj:=Air else Obj:=Air[K];
        if Obj<>nil then
         begin
           pPart7t:=Obj as IPart7;
           if pPart7t<>nil then
            begin
              Doc3Dt:=pDocuments.Open(pPart7t.FileName,False,False) as IKompasDocument3D;
              if Doc3Dt<>nil then
               begin
                 Count:=pPropertyMng.PropertyCount[IDispatch(Doc3Dt)];
                 Kompas.ksMessage(pPart7t.FileName+'  Count='+IntToStr(Count));
                 Doc3Dt.Close(kdSaveChanges);
                 Doc3Dt:=nil;
               end;
              pPart7:=nil;
            end;
           Obj:=nil;
         end;
        Inc(K);
      end;
   end;
  KompasApi:=nil;
  Disp:=nil;
end;

Slaviation

Цитироватькол. свойств в сообщении возвращает 0, что ни так?

В справке SDK на IPropertyMng::PropertyCount читаем
Входные параметры:
Libname ( VARIANT)  - полный путь к библиотеке на диске VT_BSTR либо указатель на документ VT_DISPATCH. Теку­щий документ - VT_EMPTY.

В моем примере - текущий документ (VT_EMPTY)
В примере Sabahs - указатель на документ
В примере Lito 2 - Mng.PropertyCount[pPart7i] где pPart7i это IPart7, что есть ошибка.




Lito 2

Дело в том, что мне не нужно открывать файлы моделей, как в варианте предложенным Sabahs. Такой вариант надо проверять, скорей всего он не совсем корректно будет работать со стандартными изделиями.
Поэтому я и пытался получить указатель через состав сборки без открытия моделей.


Если бы IPropertyMng возвращал количество при передачи ему указателя от IPart7, то я бы и не открывал файлы.
Немного дописав код можно прочитать свойства.

Lito 2


Полный код для получения картинки по каждому компоненту, для получения свойств под сборок, нужно делать функцию рекурсивной.
+ Благодарностей: 2

Lito 2

Снять галочки у свойств получилось, достаточно выполнить код

begin
  if Air2 = '' then
    begin
        strj:= 'Null';
        if (pProperty.Name = 'Обозначение') then Inc(Noboz);
        if (pProperty.Name = 'Наименование') then Inc(NName);
     end
         else strj:= Air2 + ' ';
   if strj <> 'Null' then
      pPropertyKeeper.SetPropertyValue(pProperty, Trim(strj), False)
      else
         pPropertyKeeper.SetPropertyValue(pProperty, strj, False);
end;


А вот как их обратно установить?
pProperty.Delete; не помогает.

Получилось установить галочку только у "Обозначения", прочитав свойство из модели и заменив его обратно, а у "Наименования" и др. не устанавливается, хотя значение на истинное заменяется.
Может быть можно как то эмулировать нажатие кнопки "Удалить значение"?


Lito 2

Сразу после удаления


if (pProperty.Name = 'Обозначение') or (pProperty.Name = 'Наименование') then
  begin
      pProperty.Delete;
      pProperty.Update;
  end;



Попробуйте через менеджер свойств удалить - IPropertyMng.RemoveProperty.

Lito 2

Все равно галочку не  устанавливает.
Пробую  - pPropertyMng.RemoveProperty(IDispatch(Doc3Dt), pProperty.PropertyTypeId);