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

16/05/2013

Как средствами ObjectARX не допустить сохранение в DWG-файл некоторых примитивов

Вопрос:
Я хочу запретить некоторым примитивам сохранятся в dwg-файл. Как это сделать?

Ответ:
Если вы хотите предотвратить сохранение каких-то примитивов в DWG-файл, а точнее исключить некоторые примитивы из операции сохранения, вы можете для этой цели использовать реактор AcEdEditorReactor

Ниже пример кода, который показывает, как это можно сделать

Код - C++: [Выделить]
  1. // Код не адаптирован для работы с многодокументным (MDI) режимом.
  2. // Используйте CDocData для того, чтобы исключить глобальные переменные 
  3. static AcDbObjectIdArray gEntityIdsNotToSave;
  4. // Команда TEST
  5. void test()
  6. {
  7.   ads_name ss,ename;
  8.   // Выбираем несколько примитивов, которые не хотим сохранять
  9.   if (acedSSGet(NULL,NULL,NULL,NULL,ss) != RTNORM)
  10.     return;
  11.  
  12.   // Если выбор успешен
  13.   long len;
  14.   // Получаем количество выбранных примитивов в наборе
  15.   acedSSLength(ss,&len);
  16.   AcDbObjectId id;
  17.   // цикл по всем примитивам в наборе
  18.   for (long i=0; i<len; ++i)
  19.   {
  20.     // получаем ENAME из набора
  21.     if (acedSSName(ss, i, ename) != RTNORM)
  22.       continue;
  23.     // преобразуем ENAME в AcDbObjectId
  24.     if (acdbGetObjectId(id,ename)!=Acad::eOk)
  25.       continue;
  26.  
  27.     // запоминаем его в массиве
  28.     gEntityIdsNotToSave.append(id);
  29.   }
  30. }
  31.  
  32. // Наследуем класс от AcEdEditorReactor, чтобы перехватить событие сохранения
  33. class NoSave : public AcEditorReactor
  34. {
  35. public:
  36.  
  37.   NoSave()
  38.   {
  39.     acedEditor->addReactor(this);
  40.   }
  41.   ~NoSave()
  42.   {
  43.     acedEditor->removeReactor(this);
  44.   }
  45.  
  46.   virtual void beginSave(AcDbDatabase* pDwg, const TCHAR* pIntendedName);
  47.   virtual void saveComplete(AcDbDatabase* pDwg, const TCHAR* pActualName);
  48.   void HideEntities(Adesk::Boolean hide)
  49.   {
  50.     // проверим что массив «несохраняемых» не пустой
  51.     if (gEntityIdsNotToSave.length() == 0)
  52.       return;
  53.  
  54.     // проверяем, что сохраняется именно та база (dwg-файл), которая нас интересует
  55.     bool bTheOne = gEntityIdsNotToSave[0].database() == pDwg;
  56.     // Если нет - выход
  57.     if (!bTheOne)
  58.       return;
  59.  
  60.     // В противном случае цикл по всем примитивам и удаление их
  61.     for (int i=0; i<gEntityIdsNotToSave.length(); ++i)
  62.     {
  63.       // Открываем кажды для записи
  64.       AcDbObjectPointer<AcDbObject> pObj(gEntityIdsNotToSave[i],
  65.         AcDb::kForWrite);
  66.       // убеждаемся, что открыли нормально
  67.       if (pObj.openStatus() == Acad::eOk)
  68.         pObj->erase(hide);
  69.     }
  70.  
  71.     // Убеждаемся, что графика обновлена, т.к.
  72.     // AutoCAD не ожидает в этот момент никаких изменений
  73.     actrTransactionManager->flushGraphics();
  74.     acedUpdateDisplay();
  75.   }
  76. };
  77.  
  78. // beginSave: удаляем примитивы, которые не должны быть сохранены
  79. void NoSave::beginSave(AcDbDatabase* pDwg, const TCHAR* pIntendedName)
  80. {
  81.   HideEntities(true);
  82. }
  83.  
  84. // saveComplete: восстанавливаем примитивы, которые были удалены.
  85. void NoSave::saveComplete(AcDbDatabase* pDwg, const TCHAR* pActualName)
  86. {
  87.   HideEntities(false);
  88. }
  89.  
  90. // Создаём глобальный экземпляр реактора редактора AutoCAD
  91. 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