Форум: "Основная";
Текущий архив: 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.005 c