Тема: AutoCad и Delphi
Добрый день...кто-нибудь пишет приложения на Delphi для AutoCad2000, 2002?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Delphi → AutoCad и Delphi
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Добрый день...кто-нибудь пишет приложения на Delphi для AutoCad2000, 2002?
Может, кто нибуть опубликует небольшую статейку, как привязать Дельфи к Автокаду, и пару программ примеров работы с Автокадом.
PS: Мне, например, нужно только импортировать в автокад примитивы и наоборот. Теоритически это просто, практически нехватает опыта.
PP: Может кто укажет место где можно подсмотреть принципы?
Заранее спасиба.
<Олегу> Позвольте! Не Дельпфи к Автокаду, а Автокад к Дельфи. Принцип простой. В справочной дельфевой системе есть примеры программирования клиент-сервер. Там вызываются вордовые команды. Теперь в справочной системе Автокада надо найти, как выглядят объекты OLE, зарегистрированные в системе. И ВСЕ и пиши, что хочется.
Если нужно подробнее, могу примерчик кинуть мылом.
Да, забыл сказать, что все это проходит на VBA, встроенном в Автокад. Можно не нем, только оч противно.
О, Боже! Сколько путаницы!
"только импортировать в автокад примитивы и наоборот",
"клиент-сервер", "как выглядят объекты OLE, зарегистрированные в системе", "все это проходит на VBA, встроенном в Автокад"...
Делается так:
Вариант 1. Приложение написанное на Delphi (или чем угодно), обращается к Автокаду, как к COM-серверу, то есть управляет им. Для этого нада
а) импортровать библиотеку типов Autocad.tlb в Delphi с единственной целью - получить модуль Autocad_TLB.pas, который надо ввести в uses
б) В своей программе
var AcadApplication: IAcadApplication;
Где-то, когда надо пользовать Автокад
Try // Пытаемся найти активный AutoCAD AcadApplication := GetActiveOleObject('AutoCAD.Application') as IAcadApplication; except // Если работающий AutoCAD не найден try // Пытаемся запустить AutoCAD AcadApplication := CreateOleObject(AutoCAD.Application) as IAcadApplication; except MessageDlg('AutoCAD вообще не найден', mtError, [mbOK], 0); end; end; if AcadApplication = nil then begin MessageDlg('Ошибка соединения с AutoCAD', mtError, [mbOK], 0); end else // делать, что надо AcadApplication.ActiveDocument.Activate; { Послылаем макрос в командную строку, добавляя нажатие Enter } AcadApplication.ActiveDocument.SendCommand('(alert "Привет от Delphi") + #13); end;
Вариант 2. Делать из своего приложения COM-сервер, как описано в любой книге по Delphi и обращаться к нему (свойствам и методам) из Visual Lisp, наподобие
(if (setq srv (vlax-get-or-create-object "MyApp.MyAppInt")) (progn (setq res_srv (vlax-invoke-method srv "MyMethod" ;; или ишо какой метод param1 ... paramX ) ;_ end of vlax-invoke ) ;_ end of setq (if (= (vlax-variant-value res_srv) :vlax-true) (progn (alert "Сработало!") .... ;; обработка результатов ) ) )
Много подробных примеров в книге С. Зуев, Н.Полещук "САПР на базе AutoCAD. Как это делается". Обзорно - Н. Полещук. "AutoCAD 2002. В подлиннике", гл. 47 и в готовящейся "AutoCAD 2004. В подлиннике"
Я тут разобрался как под 2004 проги на дельфи писать...вот!
Мона страный вопрос, де взять мона?
Весь 2002 и 2004 автокад проглядел, ненашел!
PS: Скиньте плиз, на мыло.
Product files and registry locations have changed; for example, for AutoCAD 2004, acdb15.dll is now acdb16.dll; acad.tlb is now acax16enu.tlb; and R15.0 is now R16.0. As a result, AutoCAD 2004 breaks binary compatibility for applications, and third-party applications for previous releases of AutoCAD software must be updated in order to run.
Воткнув опостров, в 1й Вариант, столкнулся с 2мя проблемами
1. Эт штука сама не запускает Автокад. Хотя при запущенном Алерт выдает.
2. Решив начертить приметив не смог переработать VBA код в Дельфи
Dim lineObj As AcadLine Dim startPoint(0 To 2) As Double Dim endPoint(0 To 2) As Double ' Define the start and end points for the line startPoint(0) = 1#: startPoint(1) = 1#: startPoint(2) = 0# endPoint(0) = 5#: endPoint(1) = 5#: endPoint(2) = 0# ' Create the line in model space Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint) ZoomAll
Дельфи пишет что StartPoint OleVariant. =/
Воткнув опостров, в 1й Вариант
Автокадов может быть несколько
'AutoCAD.Application'
'AutoCAD.Application.15'
'AutoCAD.Application.16'
надо заранее выяснять, с каким работать
2. Объявлять
var { начальные и конечные точки отрезка} StartPoint, EndPoint: OleVariant; ModelSpace : OleVariant; begin { Создаем массивы координат VT_R8 = 5; 8-байтовое действительное число определенное в ActiveX.Pas} StartPoint := VarArrayCreate([0, 2], VT_R8); EndPoint := VarArrayCreate([0, 2], VT_R8); { Присваиваем значения } StartPoint[0] := 1.0; // X StartPoint[1] := 1.0; // Y StartPoint[2] := 0.0; // Z EndPoint [0] := 5.0; EndPoint [1] := 5.0; EndPoint [2] := 0.0; После коннекта с Автокад ModelSpace := AcadApplication.ActiveDocument.ModelSpace; ModelSpace.AddLine(VarArrayRef(StartPoint), VarArrayRef(EndPoint)).Update; end;
Такие примеры показывают, что рисовать в Автокад из Delphi (VB, C++) очень неудобно. Delphi надо использовать не для рисования!
То же, на Лисп: (command "_.LINE" "1,1" "5,5" "").
Добавлю:
> Олег
Все TLB в 2004 живут там, где положено -
c:\Program Files\Common Files\Autodesk Shared\acax16enu.tlb
Ага это точно...я тоже долго искал...Ребята давайте сотрудничать.
Да, большое спасибо ShaggyDoc, без него я б не разобрался!!!
Кстати, реально было бы сей факт вписать в FAQ. Потому что я сам обыскал почти все возможное, но достаточно подробные сведения "азов" так и не нашел.
> ShaggyDoc
> ShaggyDoc
Ваши ответы помещены в FAQ. Проверьте, если не сложно: https://www.caduser.ru/oldlink/faq/?id=35.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Delphi → AutoCad и Delphi
Форум работает на PunBB, при поддержке Informer Technologies, Inc