Сохранение фрагмента из KGAX

Автор Mihonius, 07.05.13, 19:45:35

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

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

Mihonius

Как сохранить чертеж сделанный в KGAX, в меню создано Сохранить, и написано следующее (взято из примера ksContrl):
procedure TMainForm.SaveFileClick(Sender: TObject);
var
idoc : ksDocument2D;
begin
  if iKompas <> nil then
  begin
    idoc := ksDocument2D( ikompas.ActiveDocument2D() );
    if  idoc <> nil then
    idoc.ksSaveDocument(WideString(''));
    idoc := nil;
  end;
end;

Реакции ни какой! Ошибок тоже!

idoc.ksSaveDocument(WideString('')); должно вернуть FALSE, что является ошибкой.
Имя файла нужно задать, в примере ksContrl сохраняется документ, открытый на редактирование, а это значит, что структура ksDocumentParam - интерфейса параметров документа, уже заполнена.
У Вас, если я правильно понял документ создаётся, можете посмотреть пример Step3, там есть код создания документа.



Mihonius

поясните тогда почему в примере  ksContrl тоже сохранение не работает?

#3
В примере  ksContrl, Вы файл создаёте или открываете?
Собственно проверил, если создаёте, то там параметры файла ksDocumentParam до конца не заданы, если открывать то всё прекрасно сохраняется, если доступ к диску есть.

В примере ksContrl, в процедуре procedure TForm1.btNewFileClick(Sender: TObject);, добавьте строку выделенную жирным и файл после создания, будет сохраняться.
docPar.type_ := lt_DocSheetStandart;
docPar.fileName:='D:\ff.frw';
doc.ksCreateDocument( docPar );

Ниже скомпилированный EXE файл. Сохранит после создания, если такого файла не существует D:\ff.frw, иначе нужно открывать файл.

Mihonius

Спасибо!
Файл в примере создаю, дальше разобрался, прошелся по всем параметрам файла, тоже нашел чего не хватает.
ksContrl работает. А такая же структура для KGAX к сожалению не работает.

Цитата: Mihonius от 07.05.13, 21:17:30
поясните тогда почему в примере  ksContrl тоже сохранение не работает?
Как оказалось, работает, что я могу сказать про KGAX, я не знаю, что Вы там делаете?

Mihonius

упрощенный пример моей программы, делаю также!
заметил что в процедуре TMainForm.FormCreate, iKompas равен ноль, может здесь  причина?

Mihonius

Вместо TMainForm.FormCreate, сделал TMainForm.FormActivate, цикл полостью отрабатывает.


Mihonius

не сохраняет
может для kgax нужно другие методы?

Документ по следующему пути "D:\ff.frw" на диске существует?

Mihonius

Попробовал создать, никакого результата, скорее для kgax нужны другие подходы. (
А если написать так  idoc.ksSaveDocument(WideString('D:\ff.frw'));
выдает сообщение компаса о том что:  документ открыт в одном из окон. Запись не выполняется.

Mihonius

Вот весь код, все отрабатывает но не сохраняет!
unit Unit1;
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, KGAXLib_TLB, ksTlb, LDefin2d, Vcl.StdCtrls, Vcl.OleCtrls, ComObj, ksConstTLB, ksAuto, LibTool;

type
  TMainForm = class(TForm)
    KGAX1: TKGAX;
    btSave: TButton;
    btDraw: TButton;
    procedure btDrawClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btSaveClick(Sender: TObject);

    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormActivate(Sender: TObject);
var
idoc    : ksDocument2D;
idocPar : ksDocumentParam;
iKompas : KompasObject;
begin
  iKompas := KompasObject(KGAX1.GetKompasObject);
  if iKompas <> nil then
  begin
    idoc := ksDocument2D( iKompas.Document2D );
    if idoc <> nil then
    begin
      idocPar := ksDocumentParam( ikompas.GetParamStruct(ko_DocumentParam) );
      if ( idocPar <> nil ) then
      begin
        idocPar.Init();
        idocPar.type_ := lt_DocFragment;
        idocPar.fileName:='D:\ff.frw';
        idoc.ksCreateDocument( idocPar );
      end;
    end
  end;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
iKompas : KompasObject;
begin
if iKompas <> nil then
  begin
    KGAX1.CloseAll;
    iKompas.Quit;
  end;
end;

procedure TMainForm.btDrawClick(Sender: TObject);
var
iKompas              : KompasObject;
iDoc                 : ksDocument2D;
begin
iKompas := KompasObject(KGAX1.GetKompasObject);
iDoc    := ksDocument2D( iKompas.ActiveDocument2D );

if (iDoc <> nil) then
  begin
    idoc.ksLineSeg(  50,  50, -50,  50, 1 );
     iDoc.ksLineSeg(  50, -50, -50, -50, 1 );
    iDoc.ksLineSeg(  50, -50,  50,  50, 1 );
     iDoc.ksLineSeg( -50, -50, -50,  50, 1 );
  end;
end;

procedure TMainForm.btSaveClick(Sender: TObject);
var
idoc : ksDocument2D;
iKompas : KompasObject;
begin
  iKompas := KompasObject(KGAX1.GetKompasObject);
  if iKompas <> nil then
  begin
    idoc := ksDocument2D( ikompas.ActiveDocument2D() );
    if  idoc <> nil then
    begin
      idoc.ksSaveDocument('');
      idoc := nil;
    end;
  end;
end;

end.

Mihonius

Все дело процедуре сохранения, а именно в получении параметров документа:

procedure TMainForm.btSaveClick(Sender: TObject);
var
idoc : ksDocument2D;
iKompas : KompasObject;
idocPar : ksDocumentParam;
buf     : string;
begin
  iKompas := KompasObject(KGAX1.GetKompasObject);
  if iKompas <> nil then
  begin
    idoc := ksDocument2D( ikompas.ActiveDocument2D() );
    idocPar := ksDocumentParam( ikompas.GetParamStruct(ko_DocumentParam) );
    if  (idoc <> nil) and (idocPar <> nil) then
    begin
      idoc.ksGetObjParam( idoc.reference, idocPar, ALLPARAM );
      buf := Format('type = %d, n = %s ', [idocPar.type_, idocpar.fileName] );
      ikompas.ksMessage( buf );
      //ikompas.ksMessage(idocPar.fileName);
      if (idoc.ksSaveDocument('')= true) then // так как имя файла не определено возвращает ноль
      begin
      ikompas.ksMessage('сохранили');
      end;
      idoc := nil;
    end;
  end;
end;


Добавил считывание параметров документа тип считывается, а имя файла нет, в чем может быть дело???

Возможно, его просто ещё нет, т.е равно пустой строке, попробуйте задать своё имя и сохранить параметры функцией ksSetObjParam.

Mihonius

Через ksSetObjParam тоже равно пустой строке )
Удалил все создание документа, удалил получение параметров и задал имя файла в явном виде, стало сохранять )
idoc.ksSaveDocument('D:\\fff.frw')
как то странно )

Mihonius

Вот полностью рабочее решение для сохранения:

procedure TMainForm.btSaveClick(Sender: TObject);
var
idoc : ksDocument2D;
iKompas : KompasObject;
saveDialog : TSaveDialog;
begin
  iKompas := KompasObject(KGAX1.GetKompasObject);
  if iKompas <> nil then
  begin
    idoc := ksDocument2D( ikompas.ActiveDocument2D() );
    if  (idoc <> nil) then

    saveDialog := TSaveDialog.Create(self);

    // Give the dialog a title
    saveDialog.Title := 'Сохранить документ';

    // Установка начального каталога
    saveDialog.InitialDir := GetCurrentDir;

    saveDialog.Filter := 'Фрагменты(*.frw)|*.frw';
    saveDialog.DefaultExt := 'frw';

    if saveDialog.Execute
    then
    begin
    idoc.ksSaveDocument(saveDialog.FileName);
    ShowMessage('Документ сохранен : '+saveDialog.FileName);
    end
    else ShowMessage('Сохранение отменено');
    idoc := nil;
    // Освобождения диалога
    saveDialog.Free;

  end;
end;