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

Профессиональные вопросы => Программирование приложений => Тема начата: HaHa от 26.01.13, 20:21:30

Название: ksTable
Отправлено: HaHa от 26.01.13, 20:21:30
Исходя из документации, ksTable это составной объект(ksLineSeg и ksText), таким образом запаришься таблицу строит, не подскажете нет ли другого способа создания таблицы и работы с ней?
Название: Re: ksTable
Отправлено: Sabahs от 26.01.13, 20:32:44
ITable
Название: Re: ksTable
Отправлено: HaHa от 26.01.13, 20:47:04
спасибо :)
Название: Re: ksTable
Отправлено: HaHa от 26.01.13, 21:16:44
Создаю таблицу


var
TableDraw: IDrawingTables;
....
TableDraw.Add(8, 4, 30, 50);
...

Выдает ошибку
Название: Re: ksTable
Отправлено: Sabahs от 26.01.13, 21:17:23
Много точек.
Название: Re: ksTable
Отправлено: HaHa от 26.01.13, 21:19:27
точки это пропущенный код :)
Название: Re: ksTable
Отправлено: Sabahs от 26.01.13, 21:23:00
...
Название: Re: ksTable
Отправлено: HaHa от 26.01.13, 21:36:27
хм :o
Название: Re: ksTable
Отправлено: HaHa от 27.01.13, 18:34:59

var
  DocTable: IDrawingTable;
  DocTables: IDrawingTables;
  SymbolContainer: ISymbols2DContainer;
begin
.....
DocTables:= SymbolContainer.DrawingTables;
DocTable:= DocTables.Add(10, 10, 10, 10, 2);

все равно ошибка:-(
Название: Re: ksTable
Отправлено: Sabahs от 27.01.13, 18:56:54
Какая ошибка, нет никакой ошибки, если Вы считаете, что DocTable:= DocTables.Add(10, 10, 10, 10, 2); достаточно, то Вы заблуждаетесь.
Название: Re: ksTable
Отправлено: HaHa от 27.01.13, 19:06:47
Вы имеете ввиду про координаты точки привязки?Или еще что есть?
Название: Re: ksTable
Отправлено: Sabahs от 27.01.13, 19:11:04
Я говорю о том, что её создать нужно, Вы получили только интерфейс таблицы.
Смотрите (http://yadi.sk/d/ypJ7Ay3i29VWz)
Название: Re: ksTable
Отправлено: HaHa от 27.01.13, 20:22:57
незнаю даже что и думать, делаю как у Вас, все равно ошибка


DocTables:= SymbolContainer.DrawingTables;
DocTable:= DocTables.Add(10, 10, 10, 10, 2);
DocTable.X:= 100;
DocTable.Y:= 100;
DocTable.Angle:= 0;
DocTable.Update;
Название: Re: ksTable
Отправлено: Sabahs от 27.01.13, 20:25:12
Картинку ошибки можно посмотреть.
Название: Re: ksTable
Отправлено: HaHa от 27.01.13, 20:29:50
Постарался в точности как у вас, хотя может где нить и накосячил

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;
Название: Re: ksTable
Отправлено: PS от 27.01.13, 20:32:24
А как Вы получили IKompasDocument2D?
Название: Re: ksTable
Отправлено: Sabahs от 27.01.13, 20:32:39
У Вас 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;
Название: Re: ksTable
Отправлено: HaHa от 27.01.13, 20:46:12

KompasDocument2D:= Application.ActiveDocument as IKompasDocument2D;
Название: Re: ksTable
Отправлено: Sabahs от 27.01.13, 20:48:35
Можно и так, но нужно проверку делать, иначе опять полетите, если окажется, что активен 3D документ.
if(KompasDocument.Type_=ksDocumentDrawing)or(KompasDocument.Type_=ksDocumentFragment)then
Название: Re: ksTable
Отправлено: HaHa от 27.01.13, 20:52:41
уже запарился

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;

активен чертеж
Название: Re: ksTable
Отправлено: Sabahs от 27.01.13, 20:53:54
Ваша ошибка в том, что вы пытаетесь получить интерфейсы из воздуха.
//==============================================================================
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;
//==============================================================================
Название: Re: ksTable
Отправлено: HaHa от 27.01.13, 21:18:33
Спасибо Большое :)
Название: Re: ksTable
Отправлено: Bordes от 30.01.13, 17:41:27
Как вариант:
в документ можно вставить заранее сделанную таблицу, а потом уж редактировать ее (это попроще, чем создавать ее прямо в документе).
Для этого надо создать фрагмент с одной таблицей, потом:
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);