Создание просмотрщика для файлов Компас в Delphi

Автор NikOpoL, 26.06.09, 11:45:45

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

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

NikOpoL

Здравствуйте.

Помогите разобраться с вопросом создания просмотрщика для файлов Компас v10 в Delphi.

Есть проект с формой на которой есть панель куда необходимо выводить просмотр файлов.

Используя компонент KGAXLib_TLB и код:

FKGAX := TKGAX.Create(self);
FKGAX.Parent:=Panel1;
FKGAX.Align:=alClient;

удалось чтобы на панель выводилось окно компаса (рабочее пространство, в котором отображается пустой документ черетежа с рамкой А4 и фтампом).

Что делать дальше?

Prog2

Можно, например, так.
На форму бросить компонент OpenDialog (вкладка Dialogs) и какую-нибудь кнопку (Button1).
А в обработчике Button1Click прописать:

if(OpenDialog1->Execute())
{
  FKGAX->AddDocument((WideString)OpenDialog1->FileName);
}

А дальше... зависит от потребностей)

PS: код из Builder'a, но, надеюсь, перевод в Delphi сложностей не вызовет.

NikOpoL

Необходимо без диалога а напрямую. Тоесть по кнопке загружался определенный файл.

Расскажите, кто знает, как работать с API Компас.

Я попробовал ничего не вышло  :%:...

Есть библиотека KlAPI7.tlb, как начать с ней работать, как к ней подключиться???

Prog2

А что мешает передавать сразу имя файла?

FKGAX->AddDocument((WideString)"C:\\Чертёж.cdw");

Ещё тут тема была "Lister плагин для Total Commander": http://forum.ascon.ru/index.php/topic,13196.0.html, может полезна будет.

Про API Компаса - оффтоп. В принципе, уже много таких тем создавалось, всё описано. Воспользуйтесь поиском :).
И ещё у Вас в локальной папке есть файлик (путь поправьте) C:\Program Files\ASCON\KOMPAS-3D V9\SDK\Компиляция библиотек под K9LT.doc - там вполне неплохо объясняется.

NikOpoL

Уже пробывал.
После добавления сей строки:
FKGAX.AddDocument('c:\ddddd.cdw');
Происходит следующее:
на панели подгружается рамка с штампом А4, потом панель снова серая. все, сколько не жди ничего далее не происходит.

Эту тему тоже читал, но исходники предложенные Andreych скачать не смог, если у тебя есть вышли пож.

Данный файл ток для 10 версии тож читал - как подключить необходимые файлы эт ясно.

Перелистал все темы в данном разделе. Ничего конкретного не смог взять. Если можешь укажи конкретно какие темы мне могли б помочь.

API всегда актуален своей разноплановостью.

Если можешь пропиши как я могу перейти к использованию API функций.

Prog2

Цитата: NikOpoL от 26.06.09, 14:34:57
После добавления сей строки:
FKGAX.AddDocument('c:\ddddd.cdw');
...сколько не жди ничего далее не происходит.
Странно... у меня в результате открывается чертёж с указанным именем, и его можно крутить-вертеть как попало.
На вскидку: возможно, тип передаваемого параметра (т.е. строки с именем файла) не соостветствует - требуется WideString (!) (не уверен, как с этим в делфях). И ещё косяки могут происходить из-за нескольких одновременно запущенных процессов Kompas.exe, посмотри в диспетчере.

Файлы от Andreych я себе не скачивал. Если не получается - лучше сразу к нему в личку.

По поводу API. Если до крайности необходим именно API седьмой, то ХЗ, где посмотреть.
Сам пользуюсь пятым. И если устроит 5, в очередной раз посоветую пособие http://download.ascon.ru/public/educat/master/DelphiAUTO.zip. В нём, ИМХО, очень детально всё расписано (по шагам, как начать и по возрастающей, основые приёмы и методы есть) - для новичков самое оно.

Prog2

Вот нашёл пример обращения к Компасу из своего exe-шника на делфи: http://forum.ascon.ru/index.php/topic,14039.0.html
Цитата: prog1 от 26.02.09, 10:21:32
1)  Из OpenDialog получаем FileName,
    запускаем Kompas:
try
  Kompas:= KompasObject(GetActiveOleObject('Kompas.Application.5'));
except
   try
   Kompas:=KompasObject(CreateOleObject('Kompas.Application.5'));
   except
     exit;
   end;
end;
    doc:= ksDocument2D( kompas.Document2D );
    doc.ksOpenDocument(FileName,false) ; //открываем чертеж

NikOpoL

ответ на 15:23:14
на форме еще кнопка, которая:

procedure TForm1.Button5Click(Sender: TObject);
var
  Namedockj:WideString;
begin
Namedockj:='C:\ddddd.cdw';
FKGAX := TKGAX.Create(self);
FKGAX.Parent:=Panel1;
FKGAX.Align:=alClient;
FKGAX.AddDocument(Namedockj);
end;

Таже реакция.

ответ на 11:21:32
такую связку тоже пробовал тока для Kompas.Application.7

Можт я че наплутал, укажи пжлст типы переменных Kompas doc и подключенные файлы

Prog2

Повторил всё как у тебя (при этом подключил лишь заголовочный файл "KGAXLib_OCX"):

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  WideString fName="C:\\1.cdw";
  TKGAX *KGAX1=new TKGAX(Panel1);
  KGAX1->Parent=Panel1;
  KGAX1->Align=alClient;
  KGAX1->AddDocument(fName);
}

Работает. (!)НО в этом случае после нажатия на кнопку нужно вручную завершать процесс Kompas.exe, иначе они начинают размножаться. Кстати, как его правильно завершить программно?
Видно, в делфях (или в К10) свои тонкости...

По второму вопросу: подключены заголовки "Ks_TLB" и "ksConstants".
Типы переменных: Kompas - тип KompasObject; doc - тип ksDocument2D.
В проект добавлены Ks_TLB.cpp, kAPI5BC.lib (тут прошу прощения - в делфях будет чутка по другому, prog1 знает).

KGAX хороший компонент, но просмотор нужно делать обычными функциями API компаса на панель.

NikOpoL

Пытаюсь запустить Компас из своего приложения и в Компасе открыть документ.
???

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, ExtCtrls, StdCtrls,
  ComObj, ksauto, ksTLB;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1:                TForm1;
  Kompas:               KompasObject;
  Doc:                  ksDocument2D;
  NameDocForOpen:       WideString;
  ResultOpenDoc:        Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  NameDocForOpen:=ExtractFileDir(Application.ExeName)+'\Cherteg.CDW';
  try
  Kompas:=KompasObject(CreateOleObject('KOMPAS.Application.7'));
  except
    exit;
  end;
  Kompas.Visible:=true;
  doc:=ksDocument2D(Kompas.Document2D);
  ResultOpenDoc:=doc.ksOpenDocument(NameDocForOpen, WordBool(0));
end;

end.

После этого выводит ошибку с "Project Project1.exe raised exception class EOleSysError with message "Член группы не найден"".

Что я сделал не верно?
Чего я не сделал?
Как правильно?

prog1

Я Application.5 использую  - ошибка может в открытии компаса, а дальше ksOpenDocument (не забудьте посмотреть что возвращает команда  ksOpenDocument -  может имя файла не то), :
---------------------------------------
procedure KompasStart;
  begin
try
  Kompas:= KompasObject(GetActiveOleObject('Kompas.Application.5'));
except
   try
   Kompas:=KompasObject(CreateOleObject('Kompas.Application.5'));
   except
     exit;
   end;
end;      if Kompas <> nil then Kompas.Visible := true;
  end;


NikOpoL

После изменения строки KOMPAS.Application.7 на KOMPAS.Application.5 все получилось.

Как можна выводить окно компаса на панель в моей форме???

ранее использовалось:

  FKGAX := TKGAX.Create(self);
  FKGAX.Parent:=Panel1;
  FKGAX.Align:=alClient;

при присоединенном KGAXLib_Tlb. Но не получается открыть в нем документ

Кто знает или как:
при использовании KGAXLib_Tlb выводить на панель файлы Компас;
другими средствами выводить на панель окно компаса и открывать в нем документ

Заранее спасибо

prog1

Можно бросить на форму OleContainer:TOleContainer (вкладка Система). Подцепите к нему Компас и всё готово
Удачи!

NikOpoL


Prog2

Ничего, если я вмешаюсь?)
На вкладке System есть компонент OleContainer. Его бросаете на свою панель, выставляете габаритные размеры (так чтоб красиво было).
Далее, например, какой-нибудь кнопке назначаете действие:
OleContainer1->CreateObjectFromFile("C:\\1.cdw", 0);
//Тут можете поэкспериментировать со вторым параметром: 0 или 1.

Всё, больше ничего не нужно. В результате на Вашей панельке (в OleContainer) откроется чертёж "1.cdw" (!) в виде слайда. По двойному щелчку сможете зумировать и ещё кой-чего.

Такой вариант предпочтительнее использования KGAX - не остаётся "мусора" в виде отвисающих процессов kompas.exe.

NikOpoL

На форме ОлеКонтейнер и кнопка.
Под кнопкой:
procedure TForm1.Button5Click(Sender: TObject);
begin
  OleContainer3.CreateObjectFromFile('D:\Zadacha\Project\Cherteg.CDW',False);
end;

По нажатию кнопки начинается загрузка Компаса, но потом выкидывает ошибку, компас выгружается:
First chance exception at $7C812AEB. Exception class EOleSysError with message 'Разрушительный сбой'. Process Project1.exe (3268)


Сейчас что неверно???

Prog2

Попробуйте проверить, цепляется ли Компас вообще. В режиме дизайнера - двойной щелчок на OleContainer. В открывшемся диалоге нужно выбрать "КОМПАС-чертёж". Если всё в порядке, на форме отобразится пустой чертёж (ещё до компиляции), а по повторному двойному щелчку должно открыться само окно Компаса. Это отрабатывает?

NikOpoL

В дизайнере выбрал для контейнера компас чертеж, отобразился пустой чертеж, по двойному щелчку открывается окно компаса.

В запущеном проекте отображается пустой чертеж но по надатию кнопки та же ошибка...

NikOpoL

Ошибку выводит в выделенное место:

begin
  OleContainer3.CreateObjectFromFile('D:\Zadacha\Project\Cherteg.CDW',False);
|end;

Сейчас в конструкторе при двойном клике по контейнеру пробует активироваться компас, но сбоит с выводом "Error" "Разрушительный сбой"

???