Тема: не могу замкнуть контур полилинии

Вот собственно код:
    COleSafeArray points;
    points.CreateOneDim(VT_R8, 1);
    points.ResizeOneDim(15);
    long index;
    double value;
    points.PutElement(&(index = 0), &(value = 0.0));
    points.PutElement(&(index = 1), &(value = 0.0));
    points.PutElement(&(index = 2), &(value = 0.0));

    points.PutElement(&(index = 3), &(value = 5.0));
    points.PutElement(&(index = 4), &(value = 0.0));
    points.PutElement(&(index = 5), &(value = 0.0));

    points.PutElement(&(index = 6), &(value = 5.0));
    points.PutElement(&(index = 7), &(value = 5.0));
    points.PutElement(&(index = 8), &(value = 0.0));

    points.PutElement(&(index = 9), &(value = 0.0));
    points.PutElement(&(index = 10), &(value = 5.0));
    points.PutElement(&(index = 11), &(value = 0.0));

    points.PutElement(&(index = 12), &(value = 0.0));
    points.PutElement(&(index = 13), &(value = 0.0));
    points.PutElement(&(index = 14), &(value = 0.0));

    AutoCAD::IAcad3DPolylinePtr pline = m_AcadApplication->ActiveDocument->ModelSpace->Add3DPoly(points);
    pline->Closed = true;

Во-первых, последняя точка в массиве такая же, как и первая. Во-вторых, явно устанавливаем Closed в true.

Тем не менее, в контекстном меню построенного полигона есть пункт "Замкнуть".
Это приводит к тому, что при использовании этого полигона в качестве контура для заливки получаю сообщение "Ассоциативность контура штриховки отменена":

    double angle =0 + 2 * 3.14159 / 4;
    double spacing = 0.1;

    AutoCAD::IAcadHatchPtr hatch = m_AcadApplication->ActiveDocument->ModelSpace->AddHatch(0, _bstr_t(L"ANSI31"), FALSE);
    hatch->put_PatternAngle(angle);
    hatch->put_PatternScale(spacing);
    hatch->put_HatchStyle(AutoCAD::acHatchStyleNormal);

    COleSafeArray objects;
    objects.CreateOneDim(VT_DISPATCH, 1);
    objects.PutElement(&(index = 0), pline.GetInterfacePtr());

    hatch->AppendOuterLoop(objects);

    hatch->Evaluate();

Re: не могу замкнуть контур полилинии

1. Зачем использовать 3D-полининию в качестве контура штриховки?
2. Зачем задавать одинаковые начальную и конечные точки, а затем еще и задавать свойство CLOSE?

Re: не могу замкнуть контур полилинии

В рабочем коде используется IAcadPolyline. В документации я прочитал, что этот тип предназначен для обратной совместимости и лучше использовать IAcad3DPolyline либо IAcadLightWeightPolyline. Т.к. в исходном коде использовались 3-мерные координаты, то в примере кода я просто заменил IAcadPolyline на IAcad3DPolyline, без переделки массива точек. Но IAcadLightWeightPolyline я тоже пробовал, результат тот же.
Насчет первой и последней точек - я раньше не использовал свойство Closed, по-этому начальная и конечная точка одинаковые. Да и вы в каком-то посте писали, что это один из способов замкнуть полилинию.
У меня не работают ни первый, ни второй, ни оба вместе.

Re: не могу замкнуть контур полилинии

1) 3D-полилиния для таких вещей не предназначена.
2) Убери повторяющуюся точку
3) Попробуй или:

pline->Closed = VARIANT_TRUE; 

или

pline->put_Closed(VARIANT_TRUE); 

И для того, чтобы штриховка была ассоциативной:

AutoCAD::IAcadHatchPtr hatch = m_AcadApplication->ActiveDocument->ModelSpace->AddHatch(0, _bstr_t(L"ANSI31"), VARIANT_TRUE); 

Re: не могу замкнуть контур полилинии

Спасибо, вечером попробую.
PutClosed и put_Closed я пробовал, и VARIANT_BOOL(true) тоже. А вот до VARIANT_TRUE не додумался.

Re: не могу замкнуть контур полилинии

Вот переделанный код, который у меня создаёт ассоциативную штриховку:

void CTestCOMApp()
{
  CLSID clsid;  CLSIDFromProgID(L"AutoCAD.Application", &clsid);
  AutoCAD::IAcadApplicationPtr app; app.CreateInstance(clsid);
  if (app) {
    app->put_Visible(VARIANT_TRUE);
    AutoCAD::IAcadDocumentPtr doc = app->ActiveDocument;
    COleSafeArray points;
    points.CreateOneDim(VT_R8, 1);
    points.ResizeOneDim(12);
    long index;
    double value;
    points.PutElement(&(index = 0), &(value = 0.0));
    points.PutElement(&(index = 1), &(value = 0.0));
    points.PutElement(&(index = 2), &(value = 0.0));

    points.PutElement(&(index = 3), &(value = 5.0));
    points.PutElement(&(index = 4), &(value = 0.0));
    points.PutElement(&(index = 5), &(value = 0.0));

    points.PutElement(&(index = 6), &(value = 5.0));
    points.PutElement(&(index = 7), &(value = 5.0));
    points.PutElement(&(index = 8), &(value = 0.0));

    points.PutElement(&(index = 9), &(value = 0.0));
    points.PutElement(&(index = 10), &(value = 5.0));
    points.PutElement(&(index = 11), &(value = 0.0));

    AutoCAD::IAcad3DPolylinePtr pline = doc->ModelSpace->Add3DPoly(points);

    pline->Closed = VARIANT_TRUE; 
    double angle =0 + 2 * 3.14159 / 4;
    double spacing = 0.1;

    AutoCAD::IAcadHatchPtr hatch = doc->ModelSpace->AddHatch(0, _bstr_t(L"ANSI31"), VARIANT_TRUE);
    hatch->put_PatternAngle(angle);
    hatch->put_PatternScale(spacing);
    hatch->put_HatchStyle(AutoCAD::acHatchStyleNormal);

    COleSafeArray objects;
    objects.CreateOneDim(VT_DISPATCH, 1);
    objects.PutElement(&(index = 0), pline.GetInterfacePtr());
    hatch->AppendOuterLoop(objects);
    hatch->Evaluate();
  }
}

Re: не могу замкнуть контур полилинии

Огромное спасибо!!! Ключевое слово здесь оказалось - VARIANT_TRUE. Я уже сталкивался с капризностью автокада к типу значений в некоторых случаях, а здесь не догадался.