Исходя из документации, ksTable это составной объект(ksLineSeg и ksText), таким образом запаришься таблицу строит, не подскажете нет ли другого способа создания таблицы и работы с ней?
ITable
спасибо :)
Создаю таблицу
var
TableDraw: IDrawingTables;
....
TableDraw.Add(8, 4, 30, 50);
...
Выдает ошибку
Много точек.
точки это пропущенный код :)
...
хм :o
var
DocTable: IDrawingTable;
DocTables: IDrawingTables;
SymbolContainer: ISymbols2DContainer;
begin
.....
DocTables:= SymbolContainer.DrawingTables;
DocTable:= DocTables.Add(10, 10, 10, 10, 2);
все равно ошибка:-(
Какая ошибка, нет никакой ошибки, если Вы считаете, что DocTable:= DocTables.Add(10, 10, 10, 10, 2); достаточно, то Вы заблуждаетесь.
Вы имеете ввиду про координаты точки привязки?Или еще что есть?
Я говорю о том, что её создать нужно, Вы получили только интерфейс таблицы.
Смотрите (http://yadi.sk/d/ypJ7Ay3i29VWz)
незнаю даже что и думать, делаю как у Вас, все равно ошибка
DocTables:= SymbolContainer.DrawingTables;
DocTable:= DocTables.Add(10, 10, 10, 10, 2);
DocTable.X:= 100;
DocTable.Y:= 100;
DocTable.Angle:= 0;
DocTable.Update;
Картинку ошибки можно посмотреть.
Постарался в точности как у вас, хотя может где нить и накосячил
var
KompasDocument2D: IKompasDocument2D;
ViewsAndLayersManager: IViewsAndLayersManager;
Views: IViews;
View: IView;
DocTable: IDrawingTable;
DocTables: IDrawingTables;
SymbolContainer: ISymbols2DContainer;
begin
ViewsAndLayersManager:= KompasDocument2D.ViewsAndLayersManager;
if ViewsAndLayersManager <> nil then
begin
Views:= ViewsAndLayersManager.Views;
if Views <> nil then
begin
View:= Views.ActiveView;
if View <> nil then
begin
SymbolContainer:= View as ISymbols2DContainer;
if SymbolContainer <> nil then
begin
DocTables:= SymbolContainer.DrawingTables;
if DocTables <> nil then
begin
DocTable:= DocTables.Add(10, 10, 10, 10, 2);
if DocTable <> nil then
begin
DocTable.X:= 100;
DocTable.Y:= 100;
DocTable.Angle:= 0;
DocTable.Update;
DocTable:= nil;
end;
DocTables:= nil;
end;
SymbolContainer:= nil;
end;
View:= nil;
end;
Views:= nil;
end;
ViewsAndLayersManager:= nil;
end;
end;
А как Вы получили IKompasDocument2D?
У Вас KompasDocument2D равен nil Вы до таблицы и не доходите, а точнее вылетаете на самой первой строке.
KompasAPI:IApplication;
KompasDocument:=KompasAPI.ActiveDocument;
if KompasDocument<>nil then
begin
if(KompasDocument.Type_=ksDocumentDrawing)or(KompasDocument.Type_=ksDocumentFragment)then
Doc7:=KompasDocument as IKompasDocument2D;
end;
KompasDocument2D:= Application.ActiveDocument as IKompasDocument2D;
Можно и так, но нужно проверку делать, иначе опять полетите, если окажется, что активен 3D документ.
if(KompasDocument.Type_=ksDocumentDrawing)or(KompasDocument.Type_=ksDocumentFragment)then
уже запарился
var
Application: IApplication;
KompasDocument2D: IKompasDocument2D;
ViewsAndLayersManager: IViewsAndLayersManager;
Views: IViews;
View: IView;
DocTable: IDrawingTable;
DocTables: IDrawingTables;
SymbolContainer: ISymbols2DContainer;
begin
KompasDocument2D:= Application.ActiveDocument as IKompasDocument2D;
if KompasDocument2D <> nil then
begin
ViewsAndLayersManager:= KompasDocument2D.ViewsAndLayersManager;
if ViewsAndLayersManager <> nil then
begin
Views:= ViewsAndLayersManager.Views;
if Views <> nil then
begin
View:= Views.ActiveView;
if View <> nil then
begin
SymbolContainer:= View as ISymbols2DContainer;
if SymbolContainer <> nil then
begin
DocTables:= SymbolContainer.DrawingTables;
if DocTables <> nil then
begin
DocTable:= DocTables.Add(10, 10, 10, 10, 2);
if DocTable <> nil then
begin
DocTable.X:= 100;
DocTable.Y:= 100;
DocTable.Angle:= 0;
DocTable.Update;
DocTable:= nil;
end;
DocTables:= nil;
end;
SymbolContainer:= nil;
end;
View:= nil;
end;
Views:= nil;
end;
ViewsAndLayersManager:= nil;
end;
Application:= nil;
end;
end;
активен чертеж
Ваша ошибка в том, что вы пытаетесь получить интерфейсы из воздуха.
//==============================================================================
procedure TForm1.ErrorKompas(Sender: TObject);
var
Disp:IDispatch;
KompasAPI:IApplication;
CutDocuments:IDocuments;
Document:IKompasDocument;
Symbols2DContainer:ISymbols2DContainer;
Doc2D:IKompasDocument2D;
ViewsAndLayersManager:IViewsAndLayersManager;
Views:IViews;
View:IView;
DocTable:IDrawingTable;
DocTables:IDrawingTables;
begin
Disp:=IDispatch(CreateKompasApplication);
KompasAPI:=Disp as IApplication;
CutDocuments:=KompasAPI.Documents;
if CutDocuments<>nil then
begin
Document:=CutDocuments.Add(ksDocumentDrawing,True);
if Document<>nil then
begin
Doc2D:=Document as IKompasDocument2D;
if Doc2D<>nil then
begin
ViewsAndLayersManager:=Doc2D.ViewsAndLayersManager;
if ViewsAndLayersManager<>nil then
begin
Views:=ViewsAndLayersManager.Views;
if Views<>nil then
begin
View:=Views.View[0]; // системный вид
if View<>nil then
begin
Symbols2DContainer:=View as ISymbols2DContainer;
if Symbols2DContainer<>nil then
begin
DocTables:=Symbols2DContainer.DrawingTables;
if DocTables<>nil then
begin
DocTable:=DocTables.Add(10,10,10,10,2);
if DocTable<>nil then
begin
DocTable.X:=100;
DocTable.Y:=100;
DocTable.Angle:=30;
DocTable.Update;
DocTable:=nil;
end;
DocTables:=nil;
end;
Symbols2DContainer:=nil;
end;
View:=nil;
end;
Views:=nil;
end;
ViewsAndLayersManager:=nil;
end;
Doc2D:=nil;
end;
Document:=nil;
end;
CutDocuments:=nil;
end;
KompasAPI:=nil;
Disp:=nil;
end;
//==============================================================================
Спасибо Большое :)
Как вариант:
в документ можно вставить заранее сделанную таблицу, а потом уж редактировать ее (это попроще, чем создавать ее прямо в документе).
Для этого надо создать фрагмент с одной таблицей, потом:
PlacementParam parPlacement;
parPlacement.xBase=parPlacement.yBase=parPlacement.ang=0;
parPlacement.scale=1;
reference refTmpGroup=ksReadFragmentToGroupEx(DataFileName, 1, &parPlacement, 0); // загрузили фрагмент россыпью во временную группу
reference refIt=CreateIterator(TABLE_OBJ, refTmpGroup);
reference refTable=MoveIterator(refIt, 'F'); // получили ref на таблицу
DeleteIterator(refIt);
StoreTmpGroup(refTmpGroup); // сохранили объекты временной группы в документ
ClearGroup(refTmpGroup);
DeleteObj(refTmpGroup);