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

Вниз

OleVariant (AutoCAD)   Найти похожие ветки 

 
Андре ©   (2002-03-11 10:25) [0]

Возникла необходимость построения в AutoCad из моей программы нескольких фигур. Я импортировал Type Library и все бы хорошо, но возникли трудности при вызове функции GetPoint.
В AutoCad_TLB она объявлена следующим образом:

function GetPoint(Point: OleVariant; Prompt: OleVariant): OleVariant; safecall;

Я пробую делать так:

var Acad : IAcadApplication;
ActiveDocument : IAcadDocument;
ModelSpace : IAcadBlock;
InsertPoint,Promt, Pnt : OLEVariant;
V : variant;
Utility : IAcadUtility;

Acad:=GetActiveOLEObject("AutoCAD.Application") as AcadApplication;
ActiveDocument:=Acad.ActiveDocument;
ModelSpace:=ActiveDocument.ModelSpace;

InsertionPoint:=VarArrayCreate([0,2],varVariant);
InsertionPoint[0]:=100; InsertionPoint[1]:=100; InsertionPoint[2]:=0;

Utility:=ActiveDocument.Utility;
Promt:="dsfa";

Pnt:=Utility.GetPoint(InsertPoint, Promt);

При выполнении последней команды возникает ошибка:

Invalid argumentPoint in GetPoint.

Как я понял, я не правильно задаю InsertPoint.

В VBA это выглядело следующим образом:

Dim basePnt(0 To 2) As Double
basePnt(0) = 2#: basePnt(1) = 2#: basePnt(2) = 0#
returnPnt = ThisDrawing.Utility.GetPoint(basePnt, "Enter a point: ")

А как это сделать в Delphi ?


 
Milz ©   (2002-03-11 10:49) [1]

Скорее всего проблема в том, что ты работаешь с IAcadDocument и т.п., а нада с IAcadDocumentDisp и т.п. ведь ты работаешь через OLE ... по крайней мере у меня часто акад вылетал и глючил именно из-за этого.
Причём обрати внимание, что Mcad.ActiveDocument возвращает IMcadDocument, а надо IMcadDocumentDisp и т.п. ...
См. пример для МДТ


uses comobj,McadAuto_TLB,AutoCAD_TLB;

var Acad:IAcadApplicationDisp;
Mcad:IMcadApplicationDisp;
McadDoc:IMcadDocumentDisp;

procedure TForm1.Button1Click(Sender: TObject);
var MPart:IMcadPartDisp;
begin
try
// связываемся с запущенным автокадом
acad:=GetActiveOleObject("AutoCAD.Application") as IAcadApplicationDisp;
except
// возникла ошибка EOleSysError, значит с автокадом не удалось связаться - создаём объект - автокад
acad:=CreateOLEObject("AutoCAD.Application") as IAcadApplicationDisp;
end;
acad.Visible:=true; // иначе мы ничего не увидим ...
// связываемся с мдт через автокад
Mcad:=acad.GetInterfaceObject("Mcad.Application") as IMcadApplicationDisp;
// текущий документ мдт
McadDoc:=mcad.ActiveDocument as IMcadDocumentDisp;

// для примера добавим парт
MPart:=McadDoc.AddNewPart("MainPart") as IMcadPartDisp;
end;



 
ShaggyDoc ©   (2002-03-11 11:44) [2]

>Андре ©
acad:=IAcadApplication(GetActiveOLEObject("AutoCAD.Application"));
ActiveDocument:=Acad.ActiveDocument;

....
Точки надо описывать так
InsertionPoint:=VarArrayCreate([0,2],VT_R8);
// VT_R8 = 5; 8-байтовое действительное
// определение в ActiveX.Pas
InsertionPoint[0]:=100; InsertionPoint[1]:=100; InsertionPoint[2]:=0;

pnt:=ActiveDocument.Utility.GetPoint(InsertionPoint,"Укажи точку, зараза:")


 
Андре ©   (2002-03-11 12:35) [3]

2 Milz: Что такое IAcadApplicationDisp ? Я не нашел его объявления в импортированной библиотеке типов(AutoCAD 2002) ?


2 ShaggyDoc: Спасибо. Это помогло.


Еще один вопрос: все это работало дома, принес на работу и на строке:

ModelSpace:=ActiveDocument.ModelSpace;

появляется ошибка:

EOleException with message "No database".

Никто не знает в чем дело ? Причем тут database ?




 
ShaggyDoc ©   (2002-03-11 13:52) [4]

Он базарит про графическую базу данных документа. Возможно сейчас вообще нет открытого документа и, соотвественно, ModelSpace. Именно здесь и обрабатываются ощибки, то есть как бы добавлен скрытый try except.

Milz выше написал пример обработки


 
Milz ©   (2002-03-11 15:41) [5]

2 Андре
Не люблю много цитировать, но вижу придётся. Кто-то кому-то это уже объяснял следующим одразом:

--------------------------------------------------------
IDispatch - это не класс, а интерфейс объекта, генерируемого фабрикой класса.
Все диспинтерфейсы унаследованы от IDispatch. Для доступа к методам и свойствам конкретного интерфейса (наследника IDispatch) необходимо наличие библиотеки типов (TLB - Type Library) интерфейсных объектов, создаваемых классом (в дан.случае - компонентом класса WebBrowser).

Например, где-то в TLB объекта, реализуемого классом WebBrowser, имеется примерно такая декларация:

IWebDocument = interface(IDispatch)
... здесь объявлены методы интерфейса IWebDocument
end;

IWebDocumentDisp = dispinterface (соответствующий ему диспинтерфейс)
... а здесь соотв-но объявлены одноименные методы и public-св-ва интерфейса IWebDocument, доступ к которым возможен через механизм OLE Automation
end;

тогда обращение к интерфейсу объекта Document может выглядеть в твоем коде след.образом:

var
WebDocDispIntf: IWebDocumentDisp; // заметь - соотв.диспинтерфейс, а не просто интерфейс !!!!!
...
WebDocDispIntf := WebBrowser.Document as IWebDocumentDisp;

приведенный пример реализует раннее связывание (как более эффективное) и требует при компиляции наличия файла-прототипа библ-ки типов объекта WebBrowser. Файл-прототип или уже есть среди исходников компонента, либо его можно получить ср-вами Делфи в меню Import Type Library, указав в кач-ве источника файл, содержащий саму библку типов (например, WebBrowser.tlb).
В рез-те успешного импорта Делфи создаст файл, например, WebBrowser_TLB.pas, который необходимо подключить к проекту в соотв.модулях в разделах USES. По инф-ции в *.tlb и *_TLB.pas можно уже судить о методах и св-вах (и их типах) интересующих интерфейсов и применять их осознанно.
Многие *.tlb-файлы содержат и краткие описания всех объектов (методов, св-в, идентификаторов) в их составе. Делфи содержит встроенные ф-ции просмотра/модификации *.tlb-файлов.

--------------------------------------------------------

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




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

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

Наверх




Память: 0.49 MB
Время: 0.012 c
3-80419
Rustik
2002-02-26 16:15
2002.03.25
Проблема при построении репорта в Fastreporte


4-80729
Igor_thief
2002-01-24 15:26
2002.03.25
Button


3-80416
UncleRu
2002-02-19 20:08
2002.03.25
Транзакция. Как это сделать?


1-80621
dimonf
2002-03-11 21:07
2002.03.25
Господа, подскажите, как можно добавлять строки в StringGrid в цикле не зная заранее, сколько у меня, будет записей?


1-80562
KvORubin
2002-03-08 09:46
2002.03.25
Какой компонент может просматривать картинку JPG или GIF ???