Александр, спасибо за ответ!
Заработало!
А как быть, если вместо одного примитива circle нужно использовать несколько примитивов?
В результате мучительных экспериментов совершенно случайно нашлось решение.
По аналогии с хелпом надо создать массив примитивов ( IAcadEntity *entity).
Выделить память и заполнить массив вручную.
Затем этот массив надо обернуть в VARIANT (COleSafeArray outerLoop2). Это уже делается автоматом в цикле.
Вот код (может кому-нибудь пригодится):
#include “acad.h” //с помощью ClassWizard из “acad.tlb” (у меня AutoCAD2000, VC++6.0, Windows2000rus)
void CTestACAD03Dlg::OnAcad()
{
IAcadApplication app;
app.CreateDispatch("AutoCAD.Application");
IAcadDocuments oDocs;
oDocs = app.GetDocuments();
IAcadDocument oDoc;
oDoc = oDocs.Add(COleVariant((short)FALSE));
IAcadModelSpace modsp;
modsp = oDoc.GetModelSpace();
double p11[]={100,100,0};
double p12[]={100,200,0};
double p21[]={100,200,0};
double p22[]={200,200,0};
double p31[]={200,200,0};
double p32[]={200,100,0};
double p41[]={200,100,0};
double p42[]={100,100,0};
COleSafeArray s11,s12,s21,s22,s31,s32,s41,s42;
s11.CreateOneDim(VT_R8,3,p11);
s12.CreateOneDim(VT_R8,3,p12);
s21.CreateOneDim(VT_R8,3,p21);
s22.CreateOneDim(VT_R8,3,p22);
s31.CreateOneDim(VT_R8,3,p31);
s32.CreateOneDim(VT_R8,3,p32);
s41.CreateOneDim(VT_R8,3,p41);
s42.CreateOneDim(VT_R8,3,p42);
IAcadLine ln1,ln2,ln3,ln4;
ln1 = modsp.AddLine(s11,s12);
ln2 = modsp.AddLine(s21,s22);
ln3 = modsp.AddLine(s31,s32);
ln4 = modsp.AddLine(s41,s42);
double centr[]={150,150,0};
COleSafeArray sacentr;
sacentr.CreateOneDim(VT_R8,3,centr);
IAcadCircle circle;
circle = modsp.AddCircle(sacentr,40);
/*
// для окружности - это единственный примитив
IAcadHatch hatch;
hatch = modsp.AddHatch(0,"ANSI31",TRUE);
COleSafeArray outerLoop;
outerLoop.CreateOneDim(VT_DISPATCH,1,&circle);
hatch.AppendOuterLoop(outerLoop);
hatch.Evaluate();
*/
// для нескольких примитивов
IAcadEntity *entity;
entity = new IAcadEntity[4];
entity[0] = (IAcadEntity)ln1;
entity[1] = (IAcadEntity)ln2;
entity[2] = (IAcadEntity)ln3;
entity[3] = (IAcadEntity)ln4;
IAcadHatch hatch2;
hatch2 = modsp.AddHatch(0,"ANSI31",TRUE);
COleSafeArray outerLoop2;
outerLoop2.CreateOneDim(VT_DISPATCH,4);
for(long i =0; i<4; i++) outerLoop2.PutElement(&i,entity[i]);
hatch2.AppendOuterLoop(outerLoop2);
hatch2.Evaluate();
app.SetVisible(TRUE);
app.ZoomAll();
app.Quit();
}
Еще нужно в начало функции InitInstance() поместить вызов AfxOleInit():
BOOL CTestACAD03App::InitInstance()
{
AfxOleInit();
......
}
Также совершенно случайно нашлось ещё одно решение, но намного более сложное.
Это такие дебри COM-технологи!
См: http://www.rsdn.ru/Forum/?mid=591449
Теперь буду мучить полилинию (как использую полилинию нарисовать заштрихованный контур).