Получить свойства СТАНДАРТНОЙ детали

Автор SerGoVec, 30.09.16, 14:05:18

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

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

SerGoVec

Всем привет!

Бьюсь на задачей - как получить свойства стандартной детали?
Свойства обычной детали я легко получаю через PropertyKeeper и PropertyMng, но СТАНДАРТНОЙ детали не выходит.

Помогите!

SerGoVec

Благодаря коду Sabahs - http://forum.ascon.ru/index.php?action=dlattach;topic=27126.0;attach=56801;image + кое-что докрутил = получил желаемое.


{Получение свойств стандартных деталей API7}
procedure ChangePropertyStandart();
var
  Disp, Obj, Obj1, Obj_: IDispatch;
  Doc3D, Doc3Dt: IKompasDocument3D;
  Document: IKompasDocument;
  pDocuments: IDocuments;
  pPart7, pPart7t: IPart7;
  pPropertyMng: IPropertyMng;
  pProperty: IProperty;
  pPropertyKeeper: IPropertyKeeper;
  Count, i, ii, j, jj, k, kk, i_, j_: Integer;
  Air, Air1, Air2, Air_: OleVariant;
  S,SS,S1: string;
  FromSource, isSingleAssemble, isSingleAssemble_t: WordBool;

begin
  GetNewKompasAPI_5;
  GetNewKompasAPI_7;

  pDocuments := KompasAPI_7.Documents;  //!!!
  Document := KompasAPI_7.ActiveDocument;
  pPropertyMng := KompasAPI_7 as IPropertyMng;

  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)]; //!
      //количество деталей верхнего уровня
    KompasAPI_5.ksMessage(IntToStr(Count));
    pPropertyKeeper := pPart7 as IPropertyKeeper;

    Air := pPart7.PartsEx[1]; //0 - ksAllParts - все компоненты.
                              //1 - ksUniqueParts
    i:=-1;
      //коллекция - несколько объектов VT_ARRAY | VT_DISPATCH, один - VT_DISPATCH
    if (VarType(Air) = (VT_ARRAY or VT_DISPATCH)) then i := VarArrayHighBound(Air,1)
      else if (VarType(Air) = VT_DISPATCH) then i:=0; //на уровне детали

    j:=0;
      //*************прохождение по всем деталям - частям***********************
    while j <> i+1 do
    begin
      if (i=0) and (VarType(Air) = VT_DISPATCH) then Obj := Air else Obj := Air[j];
      if (Obj <> nil) then
      begin
        //-----------полученмие указателя на деталь/поддеталь(части)-------------------
        pPart7t := Obj as IPart7;                                             
        if pPart7t <> nil then pPropertyKeeper := pPart7t as IPropertyKeeper; //получаем объект отчета - т.е. ОТЧЕТ ЧАСТИ
        if pPropertyKeeper <> nil then
        begin
          //---------открытие документа поддетали/детали(части)-----------------
          Doc3Dt := pDocuments.Open(pPart7t.FileName, False, False) as IKompasDocument3D;
          if Doc3Dt <> nil then
          begin
            //**************проход по всем свойствам детали (части) + свойства записанные в сборку*****************
            Air1:= pPropertyMng.GetProperties(IDispatch(Doc3D));
            ii := -1;

            if (VarType(Air1) = (VT_ARRAY or VT_DISPATCH)) then ii := VarArrayHighBound(Air1,1)
            else if (VarType(Air1) = VT_DISPATCH) then ii:=0; //на уровне детали

            S := '';
            jj :=0;
            while jj <> ii+1 do
            begin
              if (ii=0) and (VarType(Air1) = VT_DISPATCH) then Obj1 := Air1 else Obj1 := Air1[jj];
              if (Obj1 <> nil) then
              begin
                pProperty := Obj1 as IProperty;
                if pProperty <> nil then
                begin
                  pPropertyKeeper.GetPropertyValue(pProperty, Air1,False,FromSource);
                  if (FromSource) then S1:=' FromSource=True' else S1:='FromSource=False';
                  if (pProperty.DataType = ksPropertyDataTypeString) then S:= S+pProperty.Name + ' ' + Air1 + S1 +#10+#13                 //значение - строка
                  else if (pProperty.DataType = ksPropertyDataTypeLong) then S:= S+pProperty.Name + ' ' + IntToStr(Air1) + S1 +#10+#13  //значение - целое
                  else if (pProperty.DataType = ksPropertyDataTypeDouble) then     //значение - вещественное
                  begin
                    Str(Air1:20:8,SS);
                    S:=S + pProperty.Name + ' ' + SS+S1+#10+#13;
                  end
                  else if (pProperty.DataType=ksPropertyDataTypeBoolean) then          //значение - логическое
                  begin
                    if (Air1) then S:=S+pProperty.Name + ' True' + S1 + #10 + #13
                    else S:=S+pProperty.Name + ' False' + S1 + #10 + #13;
                  end;
                end;
                pProperty := nil;
              end;
              Inc(jj);
              Air1 := pPropertyMng.GetProperties(IDispatch(Doc3D));
            end;
            //******************************************************************
            KompasAPI_5.ksMessage(S);
            pPart7t := nil;
          end;
          //--------------/открытие документа детали/поддетали(части)-----------
        end;
        Inc(J);
        //----------------/полученмие указателя на деталь/поддеталь(частям)-----
      end;
    end;
    //********************/прохождение по всем деталям/поддеталям(частям)*******
  end;
end;