Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

AutoCAD и Delphi   Найти похожие ветки 

 
litt   (2006-10-06 11:46) [0]

Прочитал статью на этом сайте, о том, как связать AutoCAD и Delphi...
Установил все необходимые компоненты, модули и т.д. и т.п. ...
При исполнении вот этого кода:

procedure TMainForm.NnewClick(Sender: TObject);
var
 App: OleVariant;
begin
 App:= CreateOleObject("AutoCAD.Application");
 ACad:= IDispatch(App)as IAcadApplication;
 frmInput.FormStyle:= fsStayOnTop;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
   ACad.Quit;
 end;

Выдаёт ошибку: Interface not supported.
Сам АвтоКад, появляется в процессах...!, а вот визуализация не происходит....
Я предположил, что ошибка кроется в преведении типов, НО ВОЗМОЖНО И НЕТ,
и в строке кода: ACad.Visible:= True;, но почиму...???
Помогите пожалуйсто...


 
Elen ©   (2006-10-06 12:11) [1]

App:= CreateOleObject("autocad.application.15");


 
Elen ©   (2006-10-06 12:13) [2]

App:= CreateOleObject("autocad.application.15");
Это раз
А во вторых попробуй пользоваться AutoCAD_TLB и создавать через CoClass


 
litt   (2006-10-06 12:19) [3]


> А во вторых попробуй пользоваться AutoCAD_TLB и создавать
> через CoClass

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


 
ShaggyDoc   (2006-10-06 12:19) [4]

Ну, с Автокадом не просто. Много нюансов.

Например, не факт, что строка
"AutoCAD.Application". Это вообще-то переменная информация. Должна быть в переменной с именем наподобие
AcadAppString

Может быть CreateOleObject(AcadAppString)
а может и GetActiveOleObject(AcadAppString).

И зачем вдруг  ACad:= IDispatch(App)as IAcadApplication?

Получен App, вот с ним и надо действовать. Разумеется, не с локальной переменной.

И никаких "необходимых" компонент, модулей и т.д. и т.п. Только позднее связывание!

Если вздумаете это установить, то будете намертво привязаны к конкретной версии AutoCAD_TLB. Со всеми GUID. А версий AutoCAD много, каждый год добавляется новая, не факт, что на другой машине все будет точно такое же.

И где же должна произойти "визуализация"? Уж не думаете ли, что в этой форме, которая fsStayOnTop?


 
litt   (2006-10-06 12:23) [5]


> И где же должна произойти "визуализация"? Уж не думаете
> ли, что в этой форме, которая fsStayOnTop?

Ошибку выдаёт:
 
> ACad.Visible:= True;


 
Elen ©   (2006-10-06 12:29) [6]

uses  
...
AutoCAD_TLB,
...

public  acad:AcadApplication;
...
{Где то  в коде}
if acad=nil then begin acad:=CoAcadApplication.Create;
 acad.Visible:=true;


 
ShaggyDoc   (2006-10-06 13:37) [7]

uses  
...
// Нафиг! AutoCAD_TLB,
...

public  acad : OleVariant;
...

function GetOrCreateAcadAsOleObject(AcadAppString: string): OleVariant;
begin
 try
   Result := GetActiveOleObject(AcadAppString);
 except
   try
     Result := CreateOleObject(AcadAppString);
   except
     MessageDlg("CreateOleObject (" + AcadAppString + ") не получилось!", mtError, [mbOK], 0);
   end;
 end;
end;

{Где то  в коде}
Acad := GetActiveOleObject(AcadAppString);
// Здесь AcadAppString может быть и "AutoCAD.Application",
// но в частном случае
// Далее можно применять любые методы и устанавливать свойства
acad.Visible:=1;


Свойство Visible - worbool (см. AutoCAD_TLB, ели уж использован).

Справку по объектам и методам (с картинками) см. acadauto.chm в каталоге Help AutoCAD


 
Elen ©   (2006-10-06 14:08) [8]


> ShaggyDoc -  Нафиг! AutoCAD_TLB,
...

Чего так?


 
k2 ©   (2006-10-06 14:11) [9]

Elen ©   (06.10.06 14:08) [8]
разницу можно почувствовать при переходе с версии на версию акада


 
ShaggyDoc   (2006-10-06 14:15) [10]


> Elen ©   (06.10.06 14:08) [8]
>
> > ShaggyDoc -  Нафиг! AutoCAD_TLB,
> ...
>
> Чего так


Писал раньше. AutoCAD_TLB привязан к конкретной версии. Это и привязка программы к конкретной версии.

В моем предыдущем посте вместо
Acad := GetActiveOleObject(AcadAppString);

надо Acad := GetOrCreateAcadAsOleObject(AcadAppString);


 
Elen ©   (2006-10-06 14:19) [11]

Эт верно... Ну как вариант автору проверить на работоспособнось подойдет :-) (Хотя у меня стоит и 2002 и 2005) и проблем нет


 
Elen ©   (2006-10-06 14:22) [12]

P.S. Я почему использую TLB - У меня были проблемы с вызовами
Acad := GetOrCreateAcadAsOleObject(AutoCAD.Application);
На одних компах так а на других
Acad := GetOrCreateAcadAsOleObject(AutoCAD.Application.15);
Так что 1:1 - ничья ;-)


 
k2 ©   (2006-10-06 14:22) [13]

ShaggyDoc   (06.10.06 14:15) [10]
можно использовать условную компиляцию :) писать-то со строгой типизацией гораааздо легше :)


 
k2 ©   (2006-10-06 14:24) [14]

Elen ©   (06.10.06 14:22) [12]
зависит от версий на клиентской машине и соответственно регистрации в реестре


 
Elen ©   (2006-10-06 14:30) [15]


> k2

От-Тож. Так что никакой особой разницы в способах нет. В первом случае автору будут видны свойства и методы в подсказках делфи, а во втором нет. Так что можно на этапе программирования пользоваться первым способом, а при внедрении плавно перейти на второй уж если приспичит


 
ShaggyDoc   (2006-10-06 14:52) [16]

Autodesk, или индусы, которые там пишут все запутала.

В нормальном приложении должна быть одна, постоянная строка описания приложения. Но не у Autodesk.

Если стоит на машине несколько Автокадов, то они могут быть зарегистрированы, например, как

AutoCAD.Application
AutoCAD.Application.15 - это версии 2000-2002
AutoCAD.Application.16 - 2004
AutoCAD.Application.16.1 - 2005
AutoCAD.Application.16.2 - 2006
AutoCAD.Application.17 - 2007

и каждый год 22 марта - новая версия. И все эти объекты могут быть зарегистрированы в реестре одновременно.

У всех есть библиотека типов, но разная. При импортировании библиотеки типов всегда будет один AutoCAD_TLB. Если подключить "компоненты" (а даже они разные, в одном случае будет Application, в другом - нет) то разработка будет идти на одни свойства и методы, а выполнении может быть с другими.

Когда Автокады запускаются попеременно, то последний записывается в AutoCAD.Application. Причем еще и махинации делаются. Если проследить по реестру, к какому EXE направляются вызовы, то окажется, что не туда, куда ожидается. И GUID будут другими. Во время работы это чревато сбоями.

Условная компиляция ничего не даст. Нечего прикомпоновывать по условию, тем более, что неизвестно, что завтра еще будет.

Выход в том, чтобы во время выполнения своей программы вычислять строку для Ole-объекта.

Кроме того, Delphi-программисты чаще всего совершенно неверно работают с Автокадом. Они пытаются управлять им из своей программы, рисовать что-то и т.д. Да, это можно делать через COM, но так же трудно и ненадежно, как дистанционно управлять марсоходом. Лучше сидеть внутри.

Для Автокада разработку надо вести так, чтобы работа была внутри Автокада, на его родных средствах. Прежде всего - Visual LISP. Есть VBA, но это как у зайца стоп-сигнал. Есть ObjectARX, но тот кто в нем работает не испытывает нужды в делфийских средствах.

Приложения на Delphi нужны для того, чтобы реализовать то, что невозможно штатными средствами. Например, работа с БД. И это есть в LISP, но в Delphi гораздо лучше можно сделать, особенно в визуальной части.

Приложения же для AutoCAD надо делать в виде COM-серверов.

У меня сделана система в которой на Delphi написан стартер - этакий центр управления. Он запускает любой из выбранных Автокадов. Но запускает как обычный процесс, для конкретного ACAD.EXE. Следующие обращения уже делаются как к OleObject, по соответствующей строке.

Кроме того, имеются около 20 dll, написанных на Delphi. Они являются COM-серверами. Обращение к ним происходит хоть из LISP, хоть из любой программы, в том числе дельфийской.


 
k2 ©   (2006-10-06 15:33) [17]

ShaggyDoc   (06.10.06 14:52) [16]
мне условная компиляция помогла
нужно было доработать старую программку на дельфи с использованием появившихся в новой версии возможностей
потребовалось дописать только несколько процедур и перекомпилировать
зависит от количества программок, которые поддерживать


 
Elen ©   (2006-10-06 15:46) [18]


> ShaggyDoc

Истину глаголите, господа. Ох уж эти индусы... Но согласитесь их творчество весьмя серьезное. они ведь и не упирались на работу с Делфи. Это так же как пытаться чего-то построить в 3DS Max (Ведь их розработка) из PHP. Однако есть куча фирмочек поддерживающих разработки AutoDesk на делфи или С++, типа ИнтерМеха - их Search как раз так и написан, значит можно...


 
litt   (2006-10-06 15:48) [19]


> acad.Visible:=1;
>
> Свойство Visible - worbool (см. AutoCAD_TLB, ели уж использован).
>

Не пойму.....  
Делаю так же...   App.Visible:= 1;
Простите за тупость...., но пишет: "Ошибка призагрузке библиотеки."
????
А с Application помогли спасибо!!!


 
Elen ©   (2006-10-06 15:56) [20]


> litt

Это читать внимательно !!! :
Если стоит на машине несколько Автокадов, то они могут быть зарегистрированы, например, как

AutoCAD.Application
AutoCAD.Application.15 - это версии 2000-2002
AutoCAD.Application.16 - 2004
AutoCAD.Application.16.1 - 2005
AutoCAD.Application.16.2 - 2006
AutoCAD.Application.17 - 2007

Версии не попутал?
Акад точно загрузился?


 
litt   (2006-10-06 15:58) [21]


> k2 ©   (06.10.06 14:24) [14]
>
> Elen ©   (06.10.06 14:22) [12]
> зависит от версий на клиентской машине и соответственно
> регистрации в реестре

Вот что в реестре:

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\Autodesk\AutoCAD\R16.0\ACAD-201:409\AdLM]
"Type"=dword:00000019


 
Elen ©   (2006-10-06 16:05) [22]


> litt

Мало о чем говорит...
У тебя ошибка выползает при изменении visible? или где? - протрась дебугером


 
litt   (2006-10-06 16:07) [23]


> Elen ©   (06.10.06 15:56) [20]

AutoCAD 2004
+
Delphi 7

В процессах появляется: acad.exe и временный файл: ~e5d141.tmp....
В программе все строки компилируются......
Даже App.Visible:= 1 или App.Visible:= True, мне какбы разници нет потому что, ошибку одну выдаёт: "Ошибка призагрузке библиотеки."
,,,
Естли у кого рабочии исходники....??????????, плизз....


 
k2 ©   (2006-10-06 16:09) [24]

litt   (06.10.06 15:58) [21]
это вообще ни о чем не говорит надо искать в HCR,
я уже правда отошла от автокада, так што не проверить ни чемто более конкретным номочь к сожалению не в состоянии


 
Elen ©   (2006-10-06 16:12) [25]


> litt

что и [6] фоллит?


 
litt   (2006-10-06 16:22) [26]

Всё нормально. Стопарится на Visible, или на CreateOleObject, понять не могу...

unit uMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, ToolWin, Menus, OleCtnrs, ImgList,
 uInput, OleServer, AutoCAD_TLB, ComObj;

type
 TMainForm = class(TForm)
   MainMenu: TMainMenu;
   Nfile: TMenuItem;
   ToolBar1: TToolBar;
   StsBr: TStatusBar;
   TlBtnExit: TToolButton;
   Nnew: TMenuItem;
   ImgLst: TImageList;
   procedure NnewClick(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
   ACad: IAcadApplication;
 end;

var
 MainForm: TMainForm;

implementation

{$R *.dfm}

{function GetAcadApplication(Visible: Boolean): IAcadApplication;
var
 App: OleVariant;
begin
 Result:= nil;
 try
  // App:= GetActiveOleObject("AutoCAD.Application");
 except
   App:= CreateOleObject("AutoCAD.Application");
 end;
 Result:= IDispatch(App) as IAcadApplication;
 if Visible then Result.Visible:= True;
end; }

procedure TMainForm.NnewClick(Sender: TObject);
var
 App: OleVariant;
begin
 App:= CreateOleObject("AutoCAD.Application");
 App.Visible:= 1;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
  // ACad.Quit;
 end;

end.


Внизу появляется маленькое окошко AutoCAD-a иминуемое COMMAND LINE  И в эдите этого окошка мигает курсор...
Типа: COMMAND: _


 
Elen ©   (2006-10-06 16:30) [27]


> litt

Ну это и есть автокад... Все правильно - у меня твой код работает...



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.054 c
11-1136150719
Arberes
2006-01-02 00:25
2006.10.29
Ошибки....


1-1158920867
salexn
2006-09-22 14:27
2006.10.29
обратное событие OnIdle


2-1160744545
Gloomer
2006-10-13 17:02
2006.10.29
Как получить значения ключей ветки реестра?


2-1160576247
Dr. Genius
2006-10-11 18:17
2006.10.29
Эмуляция Delphi IDE


3-1156919569
ddddd
2006-08-30 10:32
2006.10.29
Как проверить есть ли в Query поле с заданным названием?