Здравствуйте, Plutonia Experiment, Вы писали:
PE>Покажи, как ты это далал. Непонятно, какая именно сигнатура тебе нужна
Штриховка в AutoCAD создается последовательным вызовом двух методов:
методом добавления объекта Hatch и методом добавления контура к Hatch.
Вот пример на VBA из Help'а:
Sub Example_AppendOuterLoop()
' This example creates an associative hatch in model space.
Dim hatchObj As AcadHatch
Dim patternName As String
Dim PatternType As Long
Dim bAssociativity As Boolean
' Define the hatch
patternName = "ANSI31"
PatternType = 0
bAssociativity = True
' Create the associative Hatch object
Set hatchObj = ThisDrawing.ModelSpace.AddHatch(PatternType, patternName, bAssociativity)
' Create the outer loop for the hatch.
' An arc and a line are used to create a closed loop.
Dim outerLoop(0 To 1) As AcadEntity
Dim center(0 To 2) As Double
Dim radius As Double
Dim startAngle As Double
Dim endAngle As Double
center(0) = 5: center(1) = 3: center(2) = 0
radius = 1
startAngle = 0
endAngle = 3.141592
Set outerLoop(0) = ThisDrawing.ModelSpace.AddArc(center, radius, startAngle, endAngle)
Set outerLoop(1) = ThisDrawing.ModelSpace.AddLine(outerLoop(0).startPoint, outerLoop(0).endPoint)
' Append the outer loop to the hatch object, and display the hatch
hatchObj.AppendOuterLoop (outerLoop)
hatchObj.Evaluate
ZoomAll
End Sub
На C++ Builder обертка метода AppendOuterLoop выглядит так:
// [14] Append loops to the hatch
virtual HRESULT STDMETHODCALLTYPE AppendOuterLoop(VARIANT ObjectArray/*[in]*/) = 0;
Мне непонятно, как сформировать этот самый ObjectArray, чтобы он верно воспринимался.
Для начала я пытался передать массив объектов длиной 1, чтобы проверить, как это работает.
Делал это следующим образом:
HRESULT hr;
IAcadHatchPtr iHatch; //смарт-указатель, порожденный TComInterface
//создаю объект Hatch, все работает верно
hr = iModelSpace->AddHatch(acHatchPatternTypePreDefined,WideString("ANSI31"),0,&iHatch);
if (FAILED(hr)) return;
//пытаюсь сформировать массив
Variant VarArr[1];
VarArr[0] = (IAcadObject*)Contur; //Contur - объект типа IAcadPolylinePtr (смарт-указатель на полилинию)
//формирую массив SAFEARRAY размером 1 на основе массива Variant и передаю в метод добавления контура
//метод возвращает код ошибки, которому соответсвует сообщение "Invalid object Array"
hr = iHatch->AppendOuterLoop(VarArrayOf(VarArr,0));
if (FAILED(hr)) return; //выход по ошибке
Я пробовал формировать массив еще и другими способами, выполянл различные приведения типов и др.
Все попытки вели к одному из двух результатов, либо "Invalid object Array",
либо Access Violation at address 00000000 (или 00000001).
Мне поможет любая подсказка, даже без использования оберток C++ Builder. Главное, чтобы работало.