27/07/2018
Ассоциативность AcDbHatch
После того как я создал объект штриховки, добавил его в базу, установил стиль и т.д. у неё нет ассоциативности к объектам границы. Чтобы сделать её ассоциативной нужно сделать объект штриховки постоянным реактором для примитивов, которые штрихуются. Следующий пример кода демонстрирует как создать штриховку и сделать её ассоциативной к примитивам её границы (прямоугольник и круг).
Код - C++: [Выделить]
- static void CreateHatch()
- {
- AcDbHatch* pHatch = new AcDbHatch();
- // Устанавливаем плоскость штриховки
- AcGeVector3d normal(0.0, 0.0, 1.0);
- pHatch->setNormal(normal);
- pHatch->setElevation(0.0);
- // Устанавливаем шаблон штриховки ANSI31
- pHatch->setPattern(AcDbHatch::kPreDefined, _T("ANSI31"));
- // Устанавливаем ассоциативность
- pHatch->setAssociative(Adesk::kTrue);
- // Создаём отрезки - AcDbLine
- AcGePoint3d vertexPts[4];
- AcDbObjectId lineId, cirId, hatchId;
- AcDbObjectIdArray dbObjIds;
- AcDbLine *line;
- vertexPts[0].set(2.0, 2.0, 0.0);
- vertexPts[1].set(8.0, 2.0, 0.0);
- vertexPts[2].set(8.0, 8.0, 0.0);
- vertexPts[3].set(2.0, 8.0, 0.0);
- for (int i = 0; i < 4; i++)
- {
- line = new AcDbLine();
- line->setStartPoint(vertexPts[i]);
- line->setEndPoint(vertexPts[(i == 3) ? 0 : i+1]);
- postToDb(line, lineId);
- dbObjIds.append(lineId);
- }
- // Добавляем внешнюю прямоугольную границу к штриховке
- pHatch->appendLoop(AcDbHatch::kExternal, dbObjIds);
- // Добавляем круг AcDbCircle в базу
- AcGePoint3d cenPt(5.0, 5.0, 0.0);
- normal.set(0.0, 0.0, 1.0);
- AcDbCircle *circle = new AcDbCircle();
- circle->setNormal(normal);
- circle->setCenter(cenPt);
- circle->setRadius(1.0);
- postToDb(circle, cirId);
- dbObjIds.setLogicalLength(0);
- dbObjIds.append(cirId);
- // Добавляем внутреннюю границу (круг) к штриховке
- pHatch->appendLoop(AcDbHatch::kDefault, dbObjIds);
- // Вычисляем отрезки штриховки
- pHatch->evaluateHatch();
- // Получаем все объекты ассоциативной границы для дальнейшего использования.
- dbObjIds.setLogicalLength(0);
- pHatch->getAssocObjIds(dbObjIds);
- // Добавляем штриховку в базу
- postToDb(pHatch, hatchId);
- // Добавляем hatchId ко всем элементам границы
- // для уведомления.
- AcDbEntity *pEnt;
- int numObjs = dbObjIds.length();
- for (int i = 0; i < numObjs; i++)
- {
- if (acdbOpenAcDbEntity(pEnt, dbObjIds[i],
- AcDb::kForWrite)==Acad::eOk)
- {
- pEnt->addPersistentReactor(hatchId);
- pEnt->close();
- }
- }
- }
А здесь общий используемый метод postToDb:
Код - C++: [Выделить]
- static Acad::ErrorStatus postToDb(AcDbEntity* ent,
- AcDbObjectId& objId)
- {
- Acad::ErrorStatus es;
- AcDbBlockTable* pBlockTable;
- AcDbBlockTableRecord* pSpaceRecord;
- if (ent==NULL)
- return Acad::eNullObjectPointer;
- if (acdbHostApplicationServices()->workingDatabase()==NULL)
- return Acad::eNoDatabase;
- if ((es = acdbHostApplicationServices()->workingDatabase()->
- getBlockTable(pBlockTable, AcDb::kForRead))!=Acad::eOk)
- return es;
- if ((es =pBlockTable->getAt(ACDB_MODEL_SPACE,
- pSpaceRecord,AcDb::kForWrite)) != Acad::eOk)
- {
- pBlockTable->close();
- return es;
- }
- pBlockTable->close();
- if ((es = pSpaceRecord->appendAcDbEntity(objId, ent))
- != Acad::eOk)
- {
- pSpaceRecord->close();
- return es;
- }
- pSpaceRecord->close();
- return ent->close();
- }
Источник: http://adndevblog.typepad.com/autocad/2013/01/associativity-acdbhatch.html
Автор перевода: Александр Ривилис
Отредактировано 27.07.2018 в 00:27:46
Обсуждение: http://adn-cis.org/forum/index.php?topic=
Опубликовано 27.07.2018Отредактировано 27.07.2018 в 00:27:46