Компас спецификация, связанные файлы.

Автор l2qwe, 30.06.15, 10:12:21

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

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

l2qwe

Доброе время суток.

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


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


    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

Можно попробовать через API7, IAttachedDocuments - интерфейс коллекции документов, присоединенных к объекту спецификации.
+ Благодарностей: 1

l2qwe

Спасибо за наводку в целом получилась солянка из 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;

Дмитрий Геннадьевич

Здравствуйте!!!
Та же задача, только как еще получить номер раздела спецификации, которому принадлежит объект?
Какое поле отвечает за номер раздела?

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

Спасибо!

Дмитрий22

Солянка 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)
                    {
                        //..............
                    }
             }
         

Дмитрий Геннадьевич

Большое спасибо, всё получилось.
На Делфи выглядит так (без подробностей))):

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

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