Форум: "Прочее";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.051 c