05/08/2013
Создание поверхности сопряжения ассоциированной с краями.
Это пример кода, создающего поверхность сопряжения, которая ассоциативно связана с краями двух других поверхностей. Ассоциативность подразумевает, что при изменении любой из этих поверхностей средствами AutoCAD, поверхность сопряжения будет автоматически изменена.
В этом коде создаются две выдавленных поверхности. Информация о краях этих поверхностей используется для создания профиля по сечениям. Профиль по сечениям используется для создания поверхности сопряжения.
Код - C++: [Выделить]
- #include "dbextrudedsurf.h"
- #include "dbBlendOptions.h"
- #include "AcDbAssocVariable.h"
- #include "AcDbAssocDependency.h"
- #include "AcDbAssocPersSubentIdPE.h"
- #include "acarray.h"
- Void CreateBlended()
- {
- AcDbDatabase *pDb
- = acdbHostApplicationServices()->workingDatabase();
- Acad::ErrorStatus es;
- AcDbObjectId surfaceId1 = AcDbObjectId::kNull;
- AcDbObjectId surfaceId2 = AcDbObjectId::kNull;
- AcDbSweepOptions sweepOptions;
- // Создаём первую цилиндрическую поверхность
- AcGePoint3d center1 = AcGePoint3d::kOrigin;
- double radius1 = 10.0;
- double height1 = 5.0;
- AcDbCircle *pCircle1
- = new AcDbCircle(center1, AcGeVector3d::kZAxis, radius1);
- AcDb3dProfile circularProfile1(pCircle1);
- AcDbExtrudedSurface *pExtrudedSurface1 = NULL;
- es = AcDbSurface::createExtrudedSurface
- (
- &circularProfile1,
- AcGeVector3d(0.0, 0.0, height1),
- sweepOptions,
- pExtrudedSurface1
- );
- // Создаём вторую цилиндрическую поверхность
- AcGePoint3d center2(0.0, 0.0, 10.0);
- double radius2 = 5.0;
- double height2 = 5.0;
- AcDbCircle *pCircle2
- = new AcDbCircle(center2, AcGeVector3d::kZAxis, radius2);
- AcDb3dProfile circularProfile2(pCircle2);
- AcDbExtrudedSurface *pExtrudedSurface2 = NULL;
- es = AcDbSurface::createExtrudedSurface
- (
- &circularProfile2,
- AcGeVector3d(0.0, 0.0, height2),
- sweepOptions,
- pExtrudedSurface2
- );
- AcDbBlockTable *pBlockTable;
- AcDbBlockTableRecord *pMS = NULL;
- pDb->getBlockTable(pBlockTable, AcDb::kForRead);
- pBlockTable->getAt(ACDB_MODEL_SPACE, pMS, AcDb::kForWrite);
- // Добавляем обе цилиндрические поверхности в базу
- pMS->appendAcDbEntity(surfaceId1, pExtrudedSurface1);
- pMS->appendAcDbEntity(surfaceId2, pExtrudedSurface2);
- pMS->close();
- pBlockTable->close();
- // Получаем протокол расширения, ассоциированный
- // с первой цилиндрической поверхностью.
- // Эта информация будет использоваться для извлечения информации о грани.
- AcDbAssocPersSubentIdPE* const pAssocPersSubentIdPE1
- = AcDbAssocPersSubentIdPE::cast(
- pExtrudedSurface1->queryX(AcDbAssocPersSubentIdPE::desc()));
- if( pAssocPersSubentIdPE1 == NULL)
- return;
- // Получаем все субпримитивы грани первой цилиндрической поверхности
- AcArray<AcDbSubentId> edgeSubentIds1;
- pAssocPersSubentIdPE1->getAllSubentities
- (
- pExtrudedSurface1,
- AcDb::kEdgeSubentType,
- edgeSubentIds1
- );
- // Получаем субпримитив грани для грани, которая будет использоваться
- // для сопряжения поверхностей.
- AcDbFullSubentPath path1(surfaceId1, edgeSubentIds1[0]);
- // Создаём профиль по сечениям используя грань
- AcDbEdgeRef edgeRef1(path1);
- AcArray<AcDbEdgeRef> edgeArray1;
- edgeArray1.append(edgeRef1);
- AcDbPathRef pathRef1(edgeArray1);
- AcDbLoftProfile startProfile(pathRef1);
- // Получаем протокол расширения, ассоциированный со
- // второй цилиндрической поверхностью
- AcDbAssocPersSubentIdPE* const pAssocPersSubentIdPE2
- = AcDbAssocPersSubentIdPE::cast(
- pExtrudedSurface2->queryX(AcDbAssocPersSubentIdPE::desc()));
- if( pAssocPersSubentIdPE2 == NULL)
- return;
- // Получаем все субпримитивы граней второй цилиндрической поверхности
- AcArray<AcDbSubentId> edgeSubentIds2;
- pAssocPersSubentIdPE2->getAllSubentities
- (
- pExtrudedSurface2,
- AcDb::kEdgeSubentType,
- edgeSubentIds2
- );
- // Получаем субпримитив грани, которая будет использоваться
- // для сопряжения поверхностей
- AcDbFullSubentPath path2(surfaceId2, edgeSubentIds2[1]);
- // Создаём профиль по сечениям используя грани
- AcDbEdgeRef edgeRef2(path2);
- AcArray<AcDbEdgeRef> edgeArray2;
- edgeArray2.append(edgeRef2);
- AcDbPathRef pathRef2(edgeArray2);
- AcDbLoftProfile endProfile(pathRef2);
- pExtrudedSurface1->close();
- pExtrudedSurface2->close();
- // Используем поверхность сопряжения используя профили по сечениям
- // Убедимся, что мы создаём ассоциативную поверхность сопряжения.
- AcDbBlendOptions blendOptions;
- AcDbObjectId blendSurfaceId = AcDbObjectId::kNull;
- AcDbSurface *pBlendSurface = NULL;
- es = AcDbSurface::createBlendSurface
- (
- &startProfile,
- &endProfile,
- &blendOptions,
- true,
- blendSurfaceId
- );
- if(es == Acad::eOk)
- {
- acutPrintf(ACRX_T("Создана поверхность сопряжения !"));
- }
- }
На рисунке видны цилиндрические поверхности и поверхность сопряжения:
Источник: http://adndevblog.typepad.com/autocad/2013/06/creating-blended-surface-associated-with-edges.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=145.0
Опубликовано 05.08.2013
Отредактировано 08.08.2013 в 14:55:15
Отредактировано 08.08.2013 в 14:55:15