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

24/01/2022

Установка стиля печати

Вы можете обнаружить, что при попытке назначить стиль печати слою с помощью AcDbLayerTableRecord::setPlotStyleName() иногда возвращается «eKeyNotFound»? Это связано с тем, что PlotStyles и plotStyleNames не совпадают. PlotStyleNames — это просто записи в словаре plotStyleName (ACAD_PLOTSTYLENAME). Они не полагаются на plotStyles в файлах STB и автоматически не генерируются plotStyles. Намерение противоположно тому, что вы могли бы подумать; наоборот plotStyleName используется в качестве имени поиска, когда AutoCAD ищет plotStyle.

Когда setPlotStyleName возвращает "Acad::eKeyNotFound", это указывает на отсутствие такой записи в словаре plotStyleName. Чтобы создать нужную запись в этом словаре, вы можете использовать метод AcDbDatabase::getPlotStyleNameDictionary() для получения указателя на словарь plotStyleName (это объект типа класса AcDbDictionaryWithDefault, производный от AcDbDictionary). Затем вам нужно создать новый объект AcDbPlaceHolder и добавить его в словарь plotStyleName, используя нужное вам plotStyleName в качестве ключа записи.

Обратите внимание, что в словаре plotStyleName есть запись по умолчанию "Нормальный" класса AcDbPlaceHolder. А функция setPlotStyleName возвращает статус ошибки, если стиль печати не может быть найден в текущей таблице стилей печати (как в этом случае) или если PlotStyleMode чертежа настроен на использование стилей печати на основе цвета.

Следующий код показывает, как это сделать:

Код - C++: [Выделить]
  1. static void setNewPlotStyleName()
  2. {   
  3. AcDbDatabase* pDb = curDoc()->database();   
  4. AcDbDictionaryWithDefault* pDict = NULL;   
  5.  
  6.   Acad::ErrorStatus es = pDb->getPlotStyleNameDictionary(pDict,
  7.   AcDb::kForWrite);   
  8.  if(es != Acad::eOk)       
  9.   return;   
  10. AcDbPlaceHolder* pNewHolder = new AcDbPlaceHolder;   
  11.  if(!pNewHolder)   
  12. {       
  13.   pDict->close();       
  14.   return;   
  15. }   
  16. AcDbObjectId newId;   
  17.  const TCHAR newStyleName[] = _T("Пример имени стиля печати ");   
  18. es = pDict->setAt(newStyleName, pNewHolder, newId);   
  19.  if(es != Acad::eOk)   
  20. {       
  21.   delete pNewHolder;       
  22.   pDict->close();       
  23.   return;   
  24. }   
  25.  
  26.  // закрываем новый объект   
  27. pNewHolder->close();   
  28.  // Устанавливаем defaultId в id нового стиля   
  29.  // Вы не обязаны это делать, но это показывает, что   
  30.  // вы можете это сделать    
  31. es = pDict->setDefaultId(newId);   
  32.  if(es != Acad::eOk)   
  33. {       
  34.   // Так как он уже в базе данных,       
  35.   // мы можем его просто удалить       
  36.   es = acdbOpenAcDbObject((AcDbObject *&)pNewHolder, newId,
  37.    AcDb::kForWrite);       
  38.   assert(es == Acad::eOk);       
  39.   pNewHolder->erase();       
  40.   pNewHolder->close();       
  41.   pDict->close();       
  42.   return;   
  43. }   
  44. pDict->close();   
  45.  // Открываем запись таблицы слоев для текущего слоя   
  46. AcDbLayerTableRecordPointer pLayerBtr(pDb->clayer(),
  47.   AcDb::kForWrite);   
  48. es = pLayerBtr.openStatus();   
  49.  if(es == Acad::eOk)   
  50. {       
  51.   // устанавливаем ей имя стиля печати       
  52.   es = pLayerBtr->setPlotStyleName(newStyleName);       
  53.   if(es != Acad::eOk)           
  54.    acutPrintf(_T("Ошибка установки имени стиля печати %s."),
  55.    newStyleName);   
  56. }
  57. }
  58. //// Это должно всегда работать пока
  59. // никто не изменил имя "Normal" программно.
  60. // Опять же, это для демонстрационных целей..
  61. //
  62. static void setDefaultPlotStyleName()
  63. {   
  64.  const TCHAR styleName[] = _T("normal");   
  65. AcDbDatabase* pDb = curDoc()->database();   
  66.  // Открываем запись таблицы слоев текущего слоя   
  67. AcDbLayerTableRecordPointer pLayerBtr(pDb->clayer(),
  68.   AcDb::kForWrite);   
  69. Acad::ErrorStatus es = pLayerBtr.openStatus();   
  70.  if(es == Acad::eOk)   
  71. {       
  72.   // устанавливаем стиль печати по имени       
  73.   es = pLayerBtr->setPlotStyleName(styleName);       
  74.   if(es != Acad::eOk)           
  75.    acutPrintf(_T("Ошибка установки стиля печати %s."),
  76.    styleName);   
  77. }
  78. }

 

Источник: https://adndevblog.typepad.com/autocad/2013/01/setting-a-plot-style-name.html

 

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