Непонятно почему, но в 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 }
Рубрика: AutoCAD | Помечено: AutoCAD, ObjectARX, SDK, Visual Studio