17/10/2015
Модифицируем Ассоциативный массив по траектории при помощи API
В этой статье мы рассмотрим как можно модифицировать ассоциативный массив по траектории при помощи API. Массив по траектории может зависеть или от расстояния между элементами или между количеством элементов в зависимости от свойств массива. Следующий образец кода уменьшает количество элементов или увеличивает расстояние между элементами для уменьшения количества элементов вдоль пути.
Вот записанное видео:
Код - C++: [Выделить]
- #include "AcDbAssocManager.h"
- #include "AcDbAssocArrayActionBody.h"
- #include "AcDbAssocArrayPathParameters.h"
- Acad::ErrorStatus es;
- ads_name ename;
- ads_point pickPt;
- int rc = acedEntSel(_T("\nВыберите примитив: " ), ename, pickPt);
- if (rc != RTNORM)
- return ;
- AcDbObjectId entId;
- acdbGetObjectId(entId, ename);
- AcDbObjectPointer <AcDbEntity> pEntity(entId, AcDb::kForRead);
- if ((es = pEntity.openStatus()) != Acad::eOk)
- return ;
- if (! AcDbAssocArrayActionBody::isAssociativeArray(pEntity))
- {
- acutPrintf(ACRX_T("\nЭто не ассоциативный массив!" ));
- return ;
- }
- AcDbObjectId actionBodyId
- = AcDbAssocArrayActionBody::getControllingActionBody(
- pEntity, NULL);
- pEntity->close();
- AcDbAssocArrayActionBody* pArrayActionBody = NULL;
- if ( (es = acdbOpenAcDbObject(
- (AcDbObject*&)pArrayActionBody,
- actionBodyId,
- AcDb::kForWrite)) != Acad::eOk)
- return ;
- AcDbAssocArrayParameters *pAssocArrayParams
- = pArrayActionBody->parameters();
- AcDbAssocArrayPathParameters *pAssocArrayPathParams
- = AcDbAssocArrayPathParameters::cast(pAssocArrayParams);
- AcDbAssocArrayPathParameters::Method pathArrMethod
- = pAssocArrayPathParams->method();
- if (pathArrMethod
- == AcDbAssocArrayPathParameters::Method::kDivide)
- {
- // Метод Подели (Divide) устанавливает определенное число
- // расположенных на равном расстоянии элементов.
- // Так что мы уменьшим число элементов вдоль пути
- pAssocArrayPathParams->setItemCount
- (pAssocArrayPathParams->itemCount() - 1);
- }
- else if (pathArrMethod
- == AcDbAssocArrayPathParameters::Method::kMeasure)
- {
- double itemSpacingBefore
- = pAssocArrayPathParams->itemSpacing();
- // Метод Измерить (Measure) определяет число элементов в зависимости
- // от расстояния между элементами.
- pAssocArrayPathParams->setItemSpacing
- (pAssocArrayPathParams->itemSpacing() * 1.1);
- double itemSpacingAfter
- = pAssocArrayPathParams->itemSpacing();
- if (fabs(itemSpacingBefore-itemSpacingAfter) < 0.0001)
- { // Уменьшаем число элементов
- pAssocArrayPathParams->setItemCount
- (pAssocArrayPathParams->itemCount() - 1);
- pAssocArrayPathParams->setItemSpacing
- (pAssocArrayPathParams->itemSpacing() * 1.1);
- }
- }
- pArrayActionBody->close();
- AcDbAssocManager::evaluateTopLevelNetwork(entId.database());
- acedUpdateDisplay();
Источник: http://adndevblog.typepad.com/autocad/2015/09/modifying-an-associative-path-array-using-api.html
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=3112
Опубликовано 17.10.2015