Тема: Использование AutoCAD как внешнего редактора в Delphi-проекте

Привет! Подскажите пути решиния такой задачки...
В бд, в blob-поле хранятся DXF-файлы.(или DWG, в принципе без разницы)
Надо из моей программы открыть AutoCAD -> передать в него файл из BLOB-поля  ->  отредактировать -> сохранить обратно в базу.
Как это можно реализовать? ипользовать AutoCAD как OLE-сервер? Как тогда из него сохранять файл в базу?
Буду благодарен и за ссылки на подобные темы(Delphi&Autocad)

Re: Использование AutoCAD как внешнего редактора в Delphi-проекте

В данном случае лучше, чтобы "основным" было приложение, работающее внутри AutoCAD. Программа для обработки БД может быть реализована в виде COM-сервера (EXE или DLL). К его объектам и методам можно обращаться из программ, написанных на Visual Lisp. Сервер должен уметь выгружать во временный файл из BLOB и загружать обратно.

Если к БД возможен доступ через ADO, то из LISP можно посылать SQL-запросы, обращаясь к объекту ADODB.Command и другим из msado15.dll.

Re: Использование AutoCAD как внешнего редактора в Delphi-проекте

К сожалению, я практически не знаком с AutoCAD, лезть внутрь него нет времени. Да и использование AutoCAD в моем приложении является неким дополнительным расширением  функциональности.
А вот идея выгрузки из BLOB-поля временного файла на диск c последующим запуском AutoCAD,изменением файла, и сохраниением временного файла обратно в БД - мне подходит smile
Где-то тут я вроде уже читал про запуск AutoCad из Delphi...

Re: Использование AutoCAD как внешнего редактора в Delphi-проекте

Щелкни "Поиск по форуму" и набери Delphi. 92 страницы.

Только не зная AutoCAD ничего не сделаешь. Импортируй библиотеку типов, но разбираться-то придется.

См. книгу Н.Полещука AutoCAD 2002 в подлиннике. Глава 47.

Re: Использование AutoCAD как внешнего редактора в Delphi-проекте

Я сделал вот так.
/*****************************************/
procedure TFrmEdit.btnEditImageClick(Sender: TObject);
var AcadPatch,FileName: string;
res: integer;
begin
   FileName:=ExtractFilePath(ParamStr(0))+'~tmpoper.dwg';
   //выгрузить blob из БД во временый файл
   DtModule.qRouteOperimage.SaveToFile(FileName);
   //вызвать AUTOCAD и открыть в нем временный файл
   AcadPatch:='C:\Program Files\ACAD2000\acad.exe ';
   res:=WinExecAndWait32(AcadPatch+' '+FileName,1);
   if res=-1 then MsgBox('Ошибка!','Запуск AutoСAD не удался',
                          MB_OK +MB_ICONError);
   //сохранить временный файл в БД
   DtModule.qRouteOper.Edit;
   DtModule.qRouteOperimage.LoadFromFile(FileName);
   DtModule.qRouteOper.Post;
   //удалить временый файл
   if FileExists(FileName) then DeleteFiles(FileName);
   show;
   setfocus;
end;
/*****************************************/
На первый взгляд все работает так, как хотелось.
WinExecAndWait32() - фукция по вызову внешнего приложения и ожидания его завершения (из "Советов" В.Озерова)
Конечно, немного не удобно - пока AutoCad не закроешь, с моей программой ничего не сделаешь. Но по-другому окончание редактирования временного файла не определить...

Re: Использование AutoCAD как внешнего редактора в Delphi-проекте

Это слишком примитивно. AutoCAD не Notepad, чтобы его так запускать и мочить. Он и обидеться может. Не факт, что ЭТОТ Автокад вообще проглотит ЭТОТ файл. Такой метод годится только для того, чтобы показать, что можно редактировать файл, но не для практической работы.

Если бы не было COM, так и надо было бы делать. Кстати, и AutoCAD может быть несколько, и запускать надо конкретный. В данном случае Автокад надо запускать как COM-сервер (параллельно) и отслеживать в Delphi события, в нем происходящие.

Вначале

var  Acad : OleVariant;
begin
   try
     Acad := GetActiveOleObject('AutoCAD.Application');
   except
     Acad:= CreateOleObject('AutoCAD.Application');
   end;
   Acad.visible:= True;
Воможно и 'AutoCAD.Application' и 'AutoCAD.Application.15' и
'AutoCAD.Application.16'. Это надо выяснять программно.

Теперь можно посылать в acad команды, например для загрузки файла.
А далее обработка событий, происходящих в Автокад и прочее по вкусу.