21/08/2014
Подрезка внешних ссылок при помощи ObjectARX
Этот класс используется для определения пространственного фильтра, который AutoCAD использует для создания определения объемного отсечения вхождения блока внешней ссылки в основном чертеже. AutoCAD использует эту пространственный фильтр, чтобы решить, будет ли этот объекты с указанными ID обрабатываться при регенерации.Ниже небольшой пример. Примечание: команда должна быть определена с флагом ACRX_CMD_NOINTERNALLOCK
Код - C++: [Выделить]
- ACED_ARXCOMMAND_ENTRY_AUTO(CMyTestApp,
- MyTestApp,
- _MyClip, MyClip,
- ACRX_CMD_TRANSPARENT |
- ACRX_CMD_NOINTERNALLOCK,
- NULL)
- static void MyTestApp_MyClip()
- {
- ads_point pt1,pt2;
- ads_name ent;
- if (acedEntSel(_T("Выберите внешнюю ссылку:"),ent,pt1)!=RTNORM)
- return;
- AcDbObjectId idXref;
- if (acdbGetObjectId(idXref,ent)!=Acad::eOk)
- return;
- AcDbObjectPointer<AcDbBlockReference> pRef(idXref,AcDb::kForRead);
- if (pRef.openStatus()!=Acad::eOk)
- {
- acutPrintf(_T("Это не внешняя ссылка!\n"));
- return;
- }
- AcGePoint2dArray pts;
- if (acedGetPoint(NULL,_T("Первая точка:"),pt1)!=RTNORM)
- return;
- // ECS вершин должна быть определена в системе
- // координат блока для того чтобы правильно вычислить
- // матрицу преобразования между системами координат
- AcGeMatrix3d mat(pRef->blockTransform());
- mat.invert();
- AcGePoint3d pt3d(asPnt3d(pt1));
- pt3d.transformBy(mat);
- pts.append(AcGePoint2d(pt3d.x,pt3d.y));
- while (acedGetPoint(pt1,_T("Следующая точка:"),pt2)==RTNORM)
- {
- acedGrDraw(pt1,pt2,1,1);
- pt3d = asPnt3d(pt2);
- pt3d.transformBy(mat);
- pts.append(AcGePoint2d(pt3d.x,pt3d.y));
- memcpy(pt1,pt2,sizeof(ads_point));
- }
- acedRedraw(NULL,0);
- AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
- AcGeVector3d normal;
- double elev;
- if (pDb->tilemode())
- {
- normal = pDb->ucsxdir().crossProduct(pDb->ucsydir());
- elev = pDb->elevation();
- }
- else
- {
- normal = pDb->pucsxdir().crossProduct(pDb->pucsydir());
- elev = pDb->pelevation();
- }
- normal.normalize();
- Acad::ErrorStatus es = pRef.object()->upgradeOpen();
- if (es !=Acad::eOk)
- return;
- // Создаем фильтр
- AcDbSpatialFilter* pFilter = new AcDbSpatialFilter;
- if (pFilter->setDefinition(pts,normal,elev,
- ACDB_INFINITE_XCLIP_DEPTH,-ACDB_INFINITE_XCLIP_DEPTH,true)!=Acad::eOk)
- {
- delete pFilter;
- return;
- }
- // Добавляем его к расширенному словарю вставки блока
- // Класс AcDbIndexFilterManger предоставляет для этого специальный метод
- if (AcDbIndexFilterManager::addFilter(pRef.object(),pFilter) != Acad::eOk)
- delete pFilter;
- else
- {
- acutPrintf(_T("Не удалось добавить фильтр!\n"));
- pFilter->close();
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2013/03/xclip-xrefs-using-objectarx.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=926
Опубликовано 21.08.2014