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

27/07/2018

Ассоциативность AcDbHatch

После того как я создал объект штриховки, добавил его в базу, установил стиль и т.д. у неё нет ассоциативности к объектам границы. Чтобы сделать её ассоциативной нужно сделать объект штриховки постоянным реактором для примитивов, которые штрихуются. Следующий пример кода демонстрирует как создать штриховку и сделать её ассоциативной к примитивам её границы (прямоугольник и круг).

Код - C++: [Выделить]
  1. static void CreateHatch()
  2. {
  3.   AcDbHatch* pHatch = new AcDbHatch();
  4.   // Устанавливаем плоскость штриховки
  5.   AcGeVector3d normal(0.0, 0.0, 1.0);
  6.   pHatch->setNormal(normal);
  7.   pHatch->setElevation(0.0);
  8.   // Устанавливаем шаблон штриховки ANSI31
  9.   pHatch->setPattern(AcDbHatch::kPreDefined, _T("ANSI31"));
  10.   // Устанавливаем ассоциативность
  11.   pHatch->setAssociative(Adesk::kTrue);
  12.   // Создаём отрезки - AcDbLine
  13.   AcGePoint3d vertexPts[4];
  14.   AcDbObjectId lineId, cirId, hatchId;
  15.   AcDbObjectIdArray dbObjIds;
  16.   AcDbLine *line;
  17.   vertexPts[0].set(2.0, 2.0, 0.0);
  18.   vertexPts[1].set(8.0, 2.0, 0.0);
  19.   vertexPts[2].set(8.0, 8.0, 0.0);
  20.   vertexPts[3].set(2.0, 8.0, 0.0);
  21.   for (int i = 0; i < 4; i++)
  22.   {
  23.     line = new AcDbLine();
  24.     line->setStartPoint(vertexPts[i]);
  25.     line->setEndPoint(vertexPts[(i == 3) ? 0 : i+1]);
  26.     postToDb(line, lineId);
  27.     dbObjIds.append(lineId);
  28.   }
  29.   // Добавляем внешнюю прямоугольную границу к штриховке
  30.   pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds);
  31.   // Добавляем круг AcDbCircle в базу
  32.   AcGePoint3d cenPt(5.0, 5.0, 0.0);
  33.   normal.set(0.0, 0.0, 1.0);
  34.   AcDbCircle *circle = new AcDbCircle();
  35.   circle->setNormal(normal);
  36.   circle->setCenter(cenPt);
  37.   circle->setRadius(1.0);
  38.   postToDb(circle, cirId);
  39.   dbObjIds.setLogicalLength(0);
  40.   dbObjIds.append(cirId);
  41.   // Добавляем внутреннюю границу (круг) к штриховке
  42.   pHatch->appendLoop(AcDbHatch::kDefault, dbObjIds);
  43.   // Вычисляем отрезки штриховки
  44.   pHatch->evaluateHatch();
  45.   // Получаем все объекты ассоциативной границы для дальнейшего использования.
  46.   dbObjIds.setLogicalLength(0);
  47.   pHatch->getAssocObjIds(dbObjIds);
  48.   // Добавляем штриховку в базу
  49.   postToDb(pHatch, hatchId);
  50.   // Добавляем hatchId ко всем элементам границы
  51.   // для уведомления.
  52.   AcDbEntity *pEnt;
  53.   int numObjs = dbObjIds.length();
  54.   for (int i = 0; i < numObjs; i++)
  55.   {
  56.     if (acdbOpenAcDbEntity(pEnt, dbObjIds[i],
  57.       AcDb::kForWrite)==Acad::eOk)
  58.     {
  59.       pEnt->addPersistentReactor(hatchId);
  60.       pEnt->close();
  61.     }
  62.   }
  63. }

А здесь общий используемый метод postToDb:

Код - C++: [Выделить]
  1. static Acad::ErrorStatus postToDb(AcDbEntity* ent,
  2.                   AcDbObjectId& objId)
  3. {
  4.   Acad::ErrorStatus es;
  5.   AcDbBlockTable* pBlockTable;
  6.   AcDbBlockTableRecord* pSpaceRecord;
  7.   if (ent==NULL)
  8.     return Acad::eNullObjectPointer;
  9.   if (acdbHostApplicationServices()->workingDatabase()==NULL)
  10.     return Acad::eNoDatabase;
  11.   if ((es = acdbHostApplicationServices()->workingDatabase()->
  12.     getBlockTable(pBlockTable, AcDb::kForRead))!=Acad::eOk)
  13.     return es;
  14.   if ((es =pBlockTable->getAt(ACDB_MODEL_SPACE,
  15.     pSpaceRecord,AcDb::kForWrite)) != Acad::eOk)
  16.   {
  17.     pBlockTable->close();
  18.     return es;
  19.   }
  20.   pBlockTable->close();
  21.   if ((es = pSpaceRecord->appendAcDbEntity(objId, ent))
  22.     != Acad::eOk)
  23.   {
  24.     pSpaceRecord->close();
  25.     return es;
  26.   }
  27.   pSpaceRecord->close();
  28.   return ent->close();
  29. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/01/associativity-acdbhatch.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 27.07.2018
Отредактировано 27.07.2018 в 00:27:46