Создание LoftedSolid в .NET

Непонятно почему, но в ObjectARX.NET нет возможности создавать LoftedSolid (трехмерное тело по сечения), а  есть только возможность для создания LoftedSurface (трехмерная поверхность по сечениям).

Опишем функцию которая это исправит:

public static Solid3d CreateLoftedSolid(

    Entity[] crossSections,

    Entity[] guideCurves,

    Entity pathCurve,

    LoftOptions loftOptions);

в качестве параметров необходимо передать массив поперечных сечений, массив направляющих, траекторию сечения (может быть null), и настройки сечений.

Исходный код: LoftedSolidExample (zip, 12.3 Кб)

Функцию необходимо описать на С++.NET, где преобразовав входные параметры мы вызываем функцию
AcDb3dSolid::createLoftedSolid(
    AcArray<AcDbEntity*>& crossSectionCurves,
    AcArray<AcDbEntity*>& guideCurves,
    AcDbEntity* pPathCurve,
    AcDbLoftOptions& loftOptions
);

и возвращаем полученный результат.
Описание класса:

    1 //-----------------------------------------------------------------------------

    2 //- Solid3dExtension.h

    3 #pragma once

    4 

    5 //-----------------------------------------------------------------------------

    6 using namespace Autodesk::AutoCAD::DatabaseServices;

    7 

    8 #define GETENTITY(entity)  (static_cast<AcDbEntity*>(entity->UnmanagedObject.ToPointer()))

    9 #define GET3DSOLID(solid)  (static_cast<AcDb3dSolid*>(solid->UnmanagedObject.ToPointer()))

   10 #define GETLOFTOPTIONS(loftOptions)  (*static_cast<AcDbLoftOptions*>(loftOptions->UnmanagedObject.ToPointer()))

   11 

   12 namespace RegionCAD {

   13   namespace Extensions {

   14     static public __gc class Solid3dExtension sealed

   15     {

   16     public:

   17       static inline Solid3d* CreateLoftedSolid(Entity *crossSections[], Entity *guideCurves[], Entity *pathCurve, LoftOptions *loftOptions)

   18       {

   19         // Определяем массив равный по размеру массиву поперечных сечений

   20         AcArray<AcDbEntity*> CrossSectionCurves(crossSections->Count, 1);

   21         // Задаем логическую длину массива, для доступа к элементам

   22         CrossSectionCurves.setLogicalLength(crossSections->Count);

   23         // Переносим данные из массива поперечных сечений

   24         for (int i = 0; i < crossSections->Count; ++i)

   25           CrossSectionCurves.setAt(i, GETENTITY(crossSections[i]));

   26 

   27         // Определяем массив равный по размеру массиву направляющих

   28         AcArray<AcDbEntity*> GuideCurves(guideCurves->Count, 1);

   29         // Задаем логическую длину массива, для доступа к элементам

   30         GuideCurves.setLogicalLength(guideCurves->Count);

   31         // Переносим данные из массива направляющих

   32         for (int i = 0; i < guideCurves->Count; ++i)

   33           GuideCurves.setAt(i, GETENTITY(guideCurves[i]));

   34 

   35         // Определяем траекторию сечения (может быть не задана)

   36         AcDbEntity* pPathCurve = pathCurve ? GETENTITY(pathCurve) : NULL;

   37 

   38         // Определяем настройки сечений

   39         AcDbLoftOptions LoftOptions = GETLOFTOPTIONS(loftOptions);

   40 

   41         // Создаем тело по сечениям

   42         Solid3d* solid = new Solid3d();

   43         AcDb3dSolid* unmanagedSolid = GET3DSOLID(solid);

   44         unmanagedSolid->createLoftedSolid(CrossSectionCurves, GuideCurves, pPathCurve, LoftOptions);

   45 

   46         return solid;

   47       }

   48     };

   49   }

   50 }

Ответить