Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => Тема начата: l2qwe от 30.06.15, 10:12:21

Название: Компас спецификация, связанные файлы.
Отправлено: l2qwe от 30.06.15, 10:12:21
Доброе время суток.

Задача получить информацию из спецификации(позиция, обозначение, кол-во, примечание и файлы связанные с данной позицией)


Все получается кроме того что я не понимаю как достать связанные файлы(пути к файлам) с объектом спецификации.


    pDocument:= ksSpcDocument( kompas.SpcDocument );
    pDocument.ksOpenDocument(OpenDialog1.FileName,4);
    pSpec := ksSpecification(pDocument.GetSpecification);
iter := ksIterator( kompas.GetIterator() );
iter.ksCreateSpcIterator( '', 0, 0 );

    if iter.Reference <> 0 then begin
  obj := iter.ksMoveIterator( 'F' );
        while pDocument.ksExistObj(obj) <> 0 do begin
          self.ds1.Append;
          l_ind_ispoln := 0;

          self.Memo1.Lines.Add( '=====*********+++++++++++**********====' );
          //узнаем количество колонок у базового объекта спецификации
          count := pSpec.ksGetSpcTableColumn( '', 0, 0 );

          // пройдем по всем колонкам
          for i := 1 to count do begin
            //для текущего номера определим тип колонки, номер исполнения и блок
            spcColPar := ksSpcColumnParam( kompas.GetParamStruct(ko_SpcColumnParam) );
            if pSpec.ksGetSpcColumnType( obj,          //объект спецификации
                                  i,      // номер колонки, начиная с 1
                                  spcColPar ) <> 0 then begin
              //возьмем текст

              columnType := spcColPar.columnType;
              ispoln := spcColPar.ispoln;
              blok := spcColPar.block;
              col_name := spcColPar.name;
              buf := pSpec.ksGetSpcObjectColumnText( obj, columnType, ispoln, blok );
              group_spec_name := pSpec.ksGetSpcSectionName(obj);


              if(col_name = CS_PosNo)then
                ds1.FieldByName('stPosNo').Value := buf;

              if(col_name = CS_Desc)then
                ds1.FieldByName('stDesc').Value := buf;

              if(col_name = CS_Product)then
                ds1.FieldByName('stProduct').Value := buf;

              if(col_name = CS_Name)then
                ds1.FieldByName('stName').Value := buf;

              if(col_name = CS_Amount)then begin

                if(l_ind_ispoln>0) then begin // Даные для исоплнения скопируем строку
                  CopyDataRow(self.ds1);
                  Self.ds1.Edit;
                  ds1.FieldByName('stProductParent').Value := Right( VarToStr(100+l_ind_ispoln),2);
                end else begin
                  ds1.FieldByName('stProductParent').Value := Right( VarToStr(100+l_ind_ispoln),2);
                  ds1.FieldByName('stRazdel').Value := group_spec_name;
                  ds1.FieldByName('stType').Value := Self.GetTypeByRazdel(group_spec_name);
                end;

                ds1.FieldByName('stAmount').Value := buf;
                Inc(l_ind_ispoln);
              end;

            end; //if
          end; //for
          self.ds1.Post;
          obj := iter.ksMoveIterator( 'N' );
        end;//while
      end;//if
Название: Re: Компас спецификация, связанные файлы.
Отправлено: Sabahs от 01.07.15, 07:12:44
Можно попробовать через API7, IAttachedDocuments - интерфейс коллекции документов, присоединенных к объекту спецификации.
Название: Re: Компас спецификация, связанные файлы.
Отправлено: l2qwe от 01.07.15, 10:50:53
Спасибо за наводку в целом получилась солянка из Api7 и Api5. Наверное чутка криворуко. Но зато работает.
Для получение данных 1 уровня по спецификации и использование уже для загрузки в информационные системы, может кому пригодится.

...
uses ... ksTLB,ksAPI7,ksAuto,LDefin2D,ksConstTLB ...
...

var
  pDocument : ksSpcDocument;
  pSpec     : ksSpecification;
  iter: ksIterator;
  obj, columnType, ispoln, blok: LongInt;
  count, i, colNumb: Integer;
  spcColPar: ksSpcColumnParam;
  buf: string;
  kompas : KompasObject;
  l_int : integer;
  col_name : string;
  group_spec_name : string;
  l_ind_ispoln : integer;
  // API7
  api7KompasApp : iApplication;
  api7SpecDescriptions :iSpecificationDescriptions;
  api7SpecBaseObjects : ISpecificationBaseObjects;
  api7SpecObject : ISpecificationObject;
  api7AttachedDocument : iAttachedDocument;
begin

  if( not dlgOpen_spw.Execute())then
    exit;

  kompas := KompasObject(CreateOleObject('Kompas.Application.5'));
  api7KompasApp:=CreateOleObject('Kompas.Application.7') as iApplication;

  try
    if(not Self.ds_spec.Active)then
      self.ds_spec.CreateDataSet;

    pDocument:= ksSpcDocument( kompas.SpcDocument );
    pDocument.ksOpenDocument(dlgOpen_spw.FileName,4);
    //активный документ спецификация

    api7SpecDescriptions := newKompasAPI.ActiveDocument.SpecificationDescriptions;
    api7SpecBaseObjects := api7SpecDescriptions.Active.BaseObjects;

    pSpec := ksSpecification(pDocument.GetSpecification);

    iter := ksIterator( kompas.GetIterator() );
iter.ksCreateSpcIterator( '', 0, 0 );

    if iter.Reference <> 0 then begin
  obj := iter.ksMoveIterator( 'F' );
        while pDocument.ksExistObj(obj) <> 0 do begin
          self.ds_spec.Append;

          // в obj должен быть уникальный идентификатор объекта
          ds_spec.FieldByName('stFiles').Value := '';

          //Получим прикреплённые документы(файлы)
          api7SpecObject := api7SpecBaseObjects.Item[obj];
          count := -1;
          if(Assigned(api7SpecObject.AttachedDocuments))then
            count := api7SpecObject.AttachedDocuments.Count;
          for i := 0 to count-1 do begin
            api7AttachedDocument :=api7SpecObject.AttachedDocuments.Item[i];
            ds_spec.FieldByName('stFiles').Value := ds_spec.FieldByName('stFiles').Value + ';'+api7AttachedDocument.Name;
          end;

          l_ind_ispoln := 0;
          //узнаем количество колонок у базового объекта спецификации
          count := pSpec.ksGetSpcTableColumn( '', 0, 0 );

          // пройдем по всем колонкам
          for i := 1 to count do begin
            //для текущего номера определим тип колонки, номер исполнения и блок
            spcColPar := ksSpcColumnParam( kompas.GetParamStruct(ko_SpcColumnParam) );
            if pSpec.ksGetSpcColumnType( obj,          //объект спецификации
                                  i,      // номер колонки, начиная с 1
                                  spcColPar ) <> 0 then begin

              columnType := spcColPar.columnType;
              ispoln := spcColPar.ispoln;
              blok := spcColPar.block;
              col_name := spcColPar.name;
              buf := pSpec.ksGetSpcObjectColumnText( obj, columnType, ispoln, blok );
              group_spec_name := pSpec.ksGetSpcSectionName(obj);

              if(col_name = CS_PosNo)then
                ds_spec.FieldByName('stPosNo').Value := buf;

              if(col_name = CS_Desc)then
                ds_spec.FieldByName('stDesc').Value := buf;

              if(col_name = CS_Product)then
                ds_spec.FieldByName('stProduct').Value := buf;

              if(col_name = CS_Name)then
                ds_spec.FieldByName('stName').Value := buf;

              if(col_name = CS_Amount)then begin
                if(l_ind_ispoln>0) then begin // Даные для исоплнения скопируем строку
                  CopyDataRow(self.ds_spec);
                  Self.ds_spec.Edit;
                  ds_spec.FieldByName('stProductParent').Value := Right( VarToStr(100+l_ind_ispoln),2);
                end else begin
                  ds_spec.FieldByName('stProductParent').Value := Right( VarToStr(100+l_ind_ispoln),2);
                  ds_spec.FieldByName('stRazdel').Value := group_spec_name;
                  ds_spec.FieldByName('stType').Value := Self.GetTypeByRazdel(group_spec_name);
                end;

                ds_spec.FieldByName('stAmount').Value := buf;
                Inc(l_ind_ispoln);
              end;
            end; //if
          end; //for
          self.ds_spec.Post;
          obj := iter.ksMoveIterator( 'N' );
        end;//while
      end;//if
      //Грид ширина столбцов
      for i:=0 to dbgrd_spec.Columns.Count-1 do
        dbgrd_spec.Columns.Items[i].Width:=round(dbgrd_spec.Width/(dbgrd_spec.Columns.Count+1));
  finally
    kompas.Quit;
  end;

end;
Название: Re: Компас спецификация, связанные файлы.
Отправлено: Дмитрий Геннадьевич от 22.04.20, 14:57:02
Здравствуйте!!!
Та же задача, только как еще получить номер раздела спецификации, которому принадлежит объект?
Какое поле отвечает за номер раздела?

Или, как вариант, как пройти итератором только внутри заданного раздела?

Спасибо!
Название: Re: Компас спецификация, связанные файлы.
Отправлено: Дмитрий22 от 22.04.20, 16:59:24
Солянка API5 и API7:
   
          reference refSpcObj = specification.ksGetCurrentSpcObject();     
          string Razdel = specification.ksGetSpcSectionName(refSpcObj);
          ksSpcObjParam Par_f = (ksSpcObjParam)kompas.GetParamStruct((short)StructType2DEnum.ko_SpcObjParam);
            if (Par_f.typeObj == 1)
             {
                ISpecificationBaseObject Base00 = (ISpecificationBaseObject)pKompasDocument.SpecificationDescriptions.Active.CurrentObject;
                    if ((Razdel == "Детали" && Base00.Section == 20) || (Razdel == "Сборочные единицы" && Base00.Section == 15))
                        foreach (IAttachedDocument ad in Base00.AttachedDocuments)
                    {
                        //..............
                    }
             }
         
Название: Re: Компас спецификация, связанные файлы.
Отправлено: Дмитрий Геннадьевич от 23.04.20, 14:06:37
Большое спасибо, всё получилось.
На Делфи выглядит так (без подробностей))):

//Получим и покажем номер раздела         
kompas.ksMessage('Номер раздела = '+inttostr(api7SpecObject.Section));

//Получим и покажем имя раздела         
kompas.ksMessage('Имя раздела = '+spc.ksGetSpcSectionName(Obj));