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

15/06/2015

Как определить какие свойства слоя переопределены в ВЭкране?

Ниже пример кода, который позволяет определить какие слои имеют переопределения и какие свойства слоя переопределены в ВЭкране. Метод AcDbLayerTableRecord::hasAnyOverrides позволяет нам быстро узнать есть ли какие-то переопределения у слоя для ВЭкранов. Если есть, то мы можем узнать подробности при помощи метода AcDbLayerTableRecord::hasOverrides с указанием ObjectId ВЭкрана, для которого мы хотим узнать переопределения.

Код - C++: [Выделить]
  1. void LayerPropsForViewportInfo()
  2. {
  3.   Acad::ErrorStatus es;
  4.   AcDbDatabase *pDb = acdbHostApplicationServices()->workingDatabase();
  5.   ads_point pt;
  6.   ads_name ename;
  7.   if  (RTNORM != acedEntSel(ACRX_T("\nВыберите видовой экран:" ), ename, pt))
  8.     return ;
  9.  
  10.   AcDbObjectId vpid = AcDbObjectId::kNull;
  11.  
  12.   if (Acad::eOk != acdbGetObjectId(vpid, ename ))
  13.     return ;
  14.  
  15.   AcDbObjectId layerId = AcDbObjectId::kNull;
  16.  
  17.   AcDbLayerTable* pLayerTable;
  18.  
  19.   pDb->getSymbolTable(pLayerTable, AcDb::kForRead);
  20.  
  21.   AcDbLayerTableIterator *pIter = NULL;
  22.   AcDbLayerTableRecord *pLTR = NULL;
  23.  
  24.   pLayerTable->newIterator(pIter);
  25.   for  (; !pIter->done(); pIter->step())
  26.   {
  27.     es = pIter->getRecord(pLTR, AcDb::kForRead);
  28.     if (! pLTR->hasAnyOverrides())
  29.     {
  30.       pLTR->close();
  31.       continue ;
  32.     }
  33.  
  34.     if (!pLTR->hasOverrides(vpid))
  35.     {
  36.       pLTR->close();
  37.       continue ;
  38.     }
  39.  
  40.     TCHAR *lname;  pLTR->getName(lname);
  41.  
  42.     acutPrintf(L"\nСлой: %s имеет следующие переопределения:", lname);
  43.  
  44.     bool  isOverriddenForVP = Adesk::kFalse;
  45.     AcCmColor clr = pLTR->color(vpid, isOverriddenForVP);
  46.  
  47.     if (isOverriddenForVP)
  48.     {
  49.       acutPrintf(L"\n Переопределён цвет" );
  50.     }
  51.  
  52.     isOverriddenForVP = Adesk::kFalse;
  53.     AcDbObjectId ltypeId = pLTR->linetypeObjectId(vpid, isOverriddenForVP);
  54.  
  55.     if (isOverriddenForVP)
  56.     {
  57.       acutPrintf(L"\n Переопределён тип линии" );
  58.     }
  59.  
  60.     isOverriddenForVP = Adesk::kFalse;
  61.  
  62.     AcDb::LineWeight lw = pLTR->lineWeight(vpid, isOverriddenForVP);
  63.  
  64.     if (isOverriddenForVP)
  65.     {
  66.       acutPrintf(L"\n Переопределён вес линии" );
  67.     }
  68.  
  69.     isOverriddenForVP = Adesk::kFalse;
  70.  
  71.     ACHAR *psName = pLTR->plotStyleName(vpid, isOverriddenForVP);
  72.  
  73.     if (isOverriddenForVP)
  74.     {
  75.       acutPrintf(L"\n Переопределён стиль печати" );
  76.  
  77.     }
  78.     pLTR->close();
  79.   }
  80.  
  81.   delete  pIter;
  82.  
  83.   pLayerTable->close();
  84. }

Источник: http://adndevblog.typepad.com/autocad/2015/06/identifying-layer-property-overrides-for-a-viewport.html

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

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

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