ADN Open CIS
Сообщество программистов Autodesk в СНГ

17/10/2015

Модифицируем Ассоциативный массив по траектории при помощи API

В этой статье мы рассмотрим как можно модифицировать ассоциативный массив по траектории при помощи API. Массив по траектории может зависеть или от расстояния между элементами или между количеством элементов в зависимости от свойств массива. Следующий образец кода уменьшает количество элементов или увеличивает расстояние между элементами для уменьшения количества элементов вдоль пути.

Вот записанное видео:

 

Код - C++: [Выделить]
  1. #include  "AcDbAssocManager.h"
  2.  #include  "AcDbAssocArrayActionBody.h"
  3.  #include  "AcDbAssocArrayPathParameters.h"
  4.  
  5.  Acad::ErrorStatus es;
  6.  
  7.  ads_name ename;
  8.  ads_point pickPt;
  9.  int  rc = acedEntSel(_T("\nВыберите примитив: " ), ename, pickPt);
  10.  if  (rc != RTNORM)
  11.         return ;
  12.  AcDbObjectId entId;
  13.  acdbGetObjectId(entId, ename);
  14.  
  15.  AcDbObjectPointer <AcDbEntity> pEntity(entId, AcDb::kForRead);
  16.  if ((es = pEntity.openStatus()) != Acad::eOk)
  17.         return ;
  18.  
  19.  if (! AcDbAssocArrayActionBody::isAssociativeArray(pEntity))
  20.  {
  21.         acutPrintf(ACRX_T("\nЭто не ассоциативный массив!" ));
  22.         return ;
  23.  }
  24.               
  25.  AcDbObjectId actionBodyId
  26.         = AcDbAssocArrayActionBody::getControllingActionBody(
  27.         pEntity, NULL);
  28.  pEntity->close();
  29.  
  30.  AcDbAssocArrayActionBody* pArrayActionBody = NULL;
  31.  if ( (es = acdbOpenAcDbObject(
  32.         (AcDbObject*&)pArrayActionBody,
  33.         actionBodyId,
  34.         AcDb::kForWrite)) != Acad::eOk)
  35.         return ;
  36.  
  37.  AcDbAssocArrayParameters *pAssocArrayParams
  38.         = pArrayActionBody->parameters();
  39.  AcDbAssocArrayPathParameters *pAssocArrayPathParams
  40.         = AcDbAssocArrayPathParameters::cast(pAssocArrayParams);
  41.  
  42.  AcDbAssocArrayPathParameters::Method pathArrMethod
  43.         = pAssocArrayPathParams->method();
  44.  if (pathArrMethod
  45.         == AcDbAssocArrayPathParameters::Method::kDivide)
  46.  {
  47.         // Метод Подели (Divide) устанавливает определенное число
  48.         // расположенных на равном расстоянии элементов.  
  49.         // Так что мы уменьшим число элементов вдоль пути
  50.         pAssocArrayPathParams->setItemCount
  51.                (pAssocArrayPathParams->itemCount() - 1);
  52.  }
  53.  else  if (pathArrMethod
  54.         == AcDbAssocArrayPathParameters::Method::kMeasure)
  55.  {
  56.         double  itemSpacingBefore
  57.                = pAssocArrayPathParams->itemSpacing();
  58.  
  59.         // Метод Измерить (Measure) определяет число элементов в зависимости
  60.         // от расстояния между элементами.
  61.         pAssocArrayPathParams->setItemSpacing
  62.                (pAssocArrayPathParams->itemSpacing() * 1.1);
  63.  
  64.         double  itemSpacingAfter
  65.                = pAssocArrayPathParams->itemSpacing();
  66.  
  67.         if (fabs(itemSpacingBefore-itemSpacingAfter) < 0.0001)
  68.         { // Уменьшаем число элементов
  69.                pAssocArrayPathParams->setItemCount
  70.                        (pAssocArrayPathParams->itemCount() - 1);
  71.                pAssocArrayPathParams->setItemSpacing
  72.                        (pAssocArrayPathParams->itemSpacing() * 1.1);
  73.         }
  74.  }
  75.  pArrayActionBody->close();
  76.  
  77.  AcDbAssocManager::evaluateTopLevelNetwork(entId.database());
  78.  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