Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
3-80427
dmitryK
2002-02-22 15:46
2002.03.25
Ошибки ADO


4-80724
Gennady
2002-01-26 14:53
2002.03.25
SHAppBarMessage


1-80611
Seven
2002-03-11 15:49
2002.03.25
Как программно выделить строку в TStringGrid ?


3-80417
Malder
2002-02-25 22:13
2002.03.25
Раздача привелегий юзерам


1-80524
sevylor
2002-03-08 05:14
2002.03.25
DOS & int25





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский