Доброе время суток.
Задача получить информацию из спецификации(позиция, обозначение, кол-во, примечание и файлы связанные с данной позицией)
Все получается кроме того что я не понимаю как достать связанные файлы(пути к файлам) с объектом спецификации.
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 - интерфейс коллекции документов, присоединенных к объекту спецификации.
Спасибо за наводку в целом получилась солянка из 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;
Здравствуйте!!!
Та же задача, только как еще получить номер раздела спецификации, которому принадлежит объект?
Какое поле отвечает за номер раздела?
Или, как вариант, как пройти итератором только внутри заданного раздела?
Спасибо!
Солянка 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));