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

21/08/2014

Подрезка внешних ссылок при помощи ObjectARX

Этот класс используется для определения пространственного фильтра, который AutoCAD использует для создания определения объемного отсечения вхождения блока внешней ссылки в основном чертеже. AutoCAD использует эту пространственный фильтр, чтобы решить, будет ли этот объекты с указанными ID обрабатываться при регенерации.

Ниже небольшой пример. Примечание: команда должна быть определена с флагом ACRX_CMD_NOINTERNALLOCK

Код - C++: [Выделить]
  1. ACED_ARXCOMMAND_ENTRY_AUTO(CMyTestApp,
  2.                            MyTestApp,
  3.                            _MyClip, MyClip,
  4.                            ACRX_CMD_TRANSPARENT |
  5.                            ACRX_CMD_NOINTERNALLOCK, 
  6.                            NULL)
  7.  
  8.  
  9.  static void MyTestApp_MyClip()
  10. {
  11.     ads_point pt1,pt2;
  12.     ads_name ent;
  13.     if (acedEntSel(_T("Выберите внешнюю ссылку:"),ent,pt1)!=RTNORM)
  14.         return;
  15.     AcDbObjectId idXref;
  16.     if (acdbGetObjectId(idXref,ent)!=Acad::eOk)
  17.         return;
  18.     AcDbObjectPointer<AcDbBlockReference> pRef(idXref,AcDb::kForRead);
  19.     if (pRef.openStatus()!=Acad::eOk)
  20.     {
  21.         acutPrintf(_T("Это не внешняя ссылка!\n"));
  22.         return;
  23.     }
  24.     AcGePoint2dArray pts;
  25.     if (acedGetPoint(NULL,_T("Первая точка:"),pt1)!=RTNORM)
  26.         return;
  27.     // ECS вершин должна быть определена в системе
  28.     // координат блока для того чтобы правильно вычислить
  29.     // матрицу преобразования между системами координат
  30.  
  31.     AcGeMatrix3d mat(pRef->blockTransform());
  32.     mat.invert();
  33.  
  34.     AcGePoint3d pt3d(asPnt3d(pt1));
  35.     pt3d.transformBy(mat);
  36.     pts.append(AcGePoint2d(pt3d.x,pt3d.y));
  37.     while (acedGetPoint(pt1,_T("Следующая точка:"),pt2)==RTNORM)
  38.     {
  39.         acedGrDraw(pt1,pt2,1,1);
  40.         pt3d = asPnt3d(pt2);
  41.         pt3d.transformBy(mat);
  42.         pts.append(AcGePoint2d(pt3d.x,pt3d.y));
  43.         memcpy(pt1,pt2,sizeof(ads_point));
  44.     }
  45.     acedRedraw(NULL,0);
  46.     AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
  47.     AcGeVector3d normal;
  48.     double elev;
  49.     if (pDb->tilemode())
  50.     {
  51.         normal = pDb->ucsxdir().crossProduct(pDb->ucsydir());
  52.         elev = pDb->elevation();
  53.     }
  54.     else
  55.     {
  56.         normal = pDb->pucsxdir().crossProduct(pDb->pucsydir());
  57.         elev = pDb->pelevation();
  58.     }
  59.     normal.normalize();
  60.     Acad::ErrorStatus es = pRef.object()->upgradeOpen();
  61.     if (es !=Acad::eOk)
  62.         return;
  63.     // Создаем фильтр
  64.     AcDbSpatialFilter* pFilter = new AcDbSpatialFilter;
  65.     if (pFilter->setDefinition(pts,normal,elev,
  66.         ACDB_INFINITE_XCLIP_DEPTH,-ACDB_INFINITE_XCLIP_DEPTH,true)!=Acad::eOk)
  67.     {
  68.         delete pFilter;
  69.         return;
  70.     }
  71.     // Добавляем его к расширенному словарю вставки блока
  72.     // Класс AcDbIndexFilterManger предоставляет для этого специальный метод
  73.     if (AcDbIndexFilterManager::addFilter(pRef.object(),pFilter) != Acad::eOk)
  74.         delete pFilter;
  75.     else
  76.     {
  77.         acutPrintf(_T("Не удалось добавить фильтр!\n"));
  78.         pFilter->close();
  79.     }
  80.  
  81. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/03/xclip-xrefs-using-objectarx.html

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

Опубликовано 21.08.2014