16/05/2013
Как средствами ObjectARX не допустить сохранение в DWG-файл некоторых примитивов
Вопрос:
Я хочу запретить некоторым примитивам сохранятся в dwg-файл. Как это сделать?
Ответ:
Если вы хотите предотвратить сохранение каких-то примитивов в DWG-файл, а точнее исключить некоторые примитивы из операции сохранения, вы можете для этой цели использовать реактор AcEdEditorReactor
Ниже пример кода, который показывает, как это можно сделать
Код - C++: [Выделить]
- // Код не адаптирован для работы с многодокументным (MDI) режимом.
- // Используйте CDocData для того, чтобы исключить глобальные переменные
- static AcDbObjectIdArray gEntityIdsNotToSave;
- // Команда TEST
- void test()
- {
- ads_name ss,ename;
- // Выбираем несколько примитивов, которые не хотим сохранять
- if (acedSSGet(NULL,NULL,NULL,NULL,ss) != RTNORM)
- return;
- // Если выбор успешен
- long len;
- // Получаем количество выбранных примитивов в наборе
- acedSSLength(ss,&len);
- AcDbObjectId id;
- // цикл по всем примитивам в наборе
- for (long i=0; i<len; ++i)
- {
- // получаем ENAME из набора
- if (acedSSName(ss, i, ename) != RTNORM)
- continue;
- // преобразуем ENAME в AcDbObjectId
- if (acdbGetObjectId(id,ename)!=Acad::eOk)
- continue;
- // запоминаем его в массиве
- gEntityIdsNotToSave.append(id);
- }
- }
- // Наследуем класс от AcEdEditorReactor, чтобы перехватить событие сохранения
- class NoSave : public AcEditorReactor
- {
- public:
- NoSave()
- {
- acedEditor->addReactor(this);
- }
- ~NoSave()
- {
- acedEditor->removeReactor(this);
- }
- virtual void beginSave(AcDbDatabase* pDwg, const TCHAR* pIntendedName);
- virtual void saveComplete(AcDbDatabase* pDwg, const TCHAR* pActualName);
- void HideEntities(Adesk::Boolean hide)
- {
- // проверим что массив «несохраняемых» не пустой
- if (gEntityIdsNotToSave.length() == 0)
- return;
- // проверяем, что сохраняется именно та база (dwg-файл), которая нас интересует
- bool bTheOne = gEntityIdsNotToSave[0].database() == pDwg;
- // Если нет - выход
- if (!bTheOne)
- return;
- // В противном случае цикл по всем примитивам и удаление их
- for (int i=0; i<gEntityIdsNotToSave.length(); ++i)
- {
- // Открываем кажды для записи
- AcDbObjectPointer<AcDbObject> pObj(gEntityIdsNotToSave[i],
- AcDb::kForWrite);
- // убеждаемся, что открыли нормально
- if (pObj.openStatus() == Acad::eOk)
- pObj->erase(hide);
- }
- // Убеждаемся, что графика обновлена, т.к.
- // AutoCAD не ожидает в этот момент никаких изменений
- actrTransactionManager->flushGraphics();
- acedUpdateDisplay();
- }
- };
- // beginSave: удаляем примитивы, которые не должны быть сохранены
- void NoSave::beginSave(AcDbDatabase* pDwg, const TCHAR* pIntendedName)
- {
- HideEntities(true);
- }
- // saveComplete: восстанавливаем примитивы, которые были удалены.
- void NoSave::saveComplete(AcDbDatabase* pDwg, const TCHAR* pActualName)
- {
- HideEntities(false);
- }
- // Создаём глобальный экземпляр реактора редактора AutoCAD
- static NoSave g_noSave;
Источник: http://adndevblog.typepad.com/autocad/2012/12/how-to-prevent-certain-entities-from-being-saved-to-a-dwg-file-using-objectarx.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=30
Опубликовано 16.05.2013
Отредактировано 26.06.2013 в 16:06:50
Отредактировано 26.06.2013 в 16:06:50