Установка стиля печати
Вы можете обнаружить, что при попытке назначить стиль печати слою с помощью 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 чертежа настроен на использование стилей печати на основе цвета.
Следующий код показывает, как это сделать:
- static void setNewPlotStyleName()
- {
- AcDbDatabase* pDb = curDoc()->database();
- AcDbDictionaryWithDefault* pDict = NULL;
- Acad::ErrorStatus es = pDb->getPlotStyleNameDictionary(pDict,
- AcDb::kForWrite);
- if(es != Acad::eOk)
- return;
- AcDbPlaceHolder* pNewHolder = new AcDbPlaceHolder;
- if(!pNewHolder)
- {
- pDict->close();
- return;
- }
- AcDbObjectId newId;
- const TCHAR newStyleName[] = _T("Пример имени стиля печати ");
- es = pDict->setAt(newStyleName, pNewHolder, newId);
- if(es != Acad::eOk)
- {
- delete pNewHolder;
- pDict->close();
- return;
- }
- // закрываем новый объект
- pNewHolder->close();
- // Устанавливаем defaultId в id нового стиля
- // Вы не обязаны это делать, но это показывает, что
- // вы можете это сделать
- es = pDict->setDefaultId(newId);
- if(es != Acad::eOk)
- {
- // Так как он уже в базе данных,
- // мы можем его просто удалить
- es = acdbOpenAcDbObject((AcDbObject *&)pNewHolder, newId,
- AcDb::kForWrite);
- assert(es == Acad::eOk);
- pNewHolder->erase();
- pNewHolder->close();
- pDict->close();
- return;
- }
- pDict->close();
- // Открываем запись таблицы слоев для текущего слоя
- AcDbLayerTableRecordPointer pLayerBtr(pDb->clayer(),
- AcDb::kForWrite);
- es = pLayerBtr.openStatus();
- if(es == Acad::eOk)
- {
- // устанавливаем ей имя стиля печати
- es = pLayerBtr->setPlotStyleName(newStyleName);
- if(es != Acad::eOk)
- acutPrintf(_T("Ошибка установки имени стиля печати %s."),
- newStyleName);
- }
- }
- //// Это должно всегда работать пока
- // никто не изменил имя "Normal" программно.
- // Опять же, это для демонстрационных целей..
- //
- static void setDefaultPlotStyleName()
- {
- const TCHAR styleName[] = _T("normal");
- AcDbDatabase* pDb = curDoc()->database();
- // Открываем запись таблицы слоев текущего слоя
- AcDbLayerTableRecordPointer pLayerBtr(pDb->clayer(),
- AcDb::kForWrite);
- Acad::ErrorStatus es = pLayerBtr.openStatus();
- if(es == Acad::eOk)
- {
- // устанавливаем стиль печати по имени
- es = pLayerBtr->setPlotStyleName(styleName);
- if(es != Acad::eOk)
- acutPrintf(_T("Ошибка установки стиля печати %s."),
- styleName);
- }
- }
Источник: https://adndevblog.typepad.com/autocad/2013/01/setting-a-plot-style-name.html
Опубликовано 24.01.2022