Re[2]: Как передать массив объектов в виде VARIANT
От: Аноним  
Дата: 01.04.04 16:39
Оценка:
Здравствуйте, 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. Главное, чтобы работало.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.