Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
8-1143410774
vlad145
2006-03-27 02:06
2006.10.29
Захват части изображения


15-1159933925
[DUH]
2006-10-04 07:52
2006.10.29
Работа с теодолитом


15-1159952437
IMHO
2006-10-04 13:00
2006.10.29
Заинтересовать ребенка английским языком


15-1160463589
*Стажер*
2006-10-10 10:59
2006.10.29
Mandrake Linux


8-1143445304
zxcv
2006-03-27 11:41
2006.10.29
Chart 3D





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский