Тема: Как защитить объект от удаления?
как сделать объект защищенным от удаления?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → Как защитить объект от удаления?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
как сделать объект защищенным от удаления?
а также от просмотра и редактирования...
в реакторе "на удаление"
... if (!mayBeDeleted) { acutPrintf("\n%s", __GSW_MSG_WRN_CHILDEXIST); put->upgradeOpen(); put->erase(false); put->downgradeOpen(); return; } ...
может я что то не понял но:
void erased(const AcDbObject* dbObj, Adesk::Boolean pErasing), a -
Acad::ErrorStatus upgradeOpen(); - не константный метод!!!
1) Надо использовать метод...
AcDbDatabaseReactor::objectErased(
const AcDbDatabase* dwg,
const AcDbObject* dbObj,
Adesk::Boolean pErased )
2) Если слабо привести константный указатель к неконстантному или принципиально этого делать не хочешь, то запоминай удаленные объекты в оном методе в массивчик - затем по событию
AcEdInputContextReactor::beginQuiescentState()
пооткрывать объекты из массивчика (не забыть флажок, что открывать erased) и сделать erase(false)
После этого в AutoCAD 2004-2006 не будет работать UNDO.
Это почему это он не будет работать? В чем это будет выражаться?
Не будет работать не сама команда UNDO, а будет нарушен механизм. Не корректно отрабатывать Undo Begin/End, и т.д.
Есть другой способ - при попытке выбора определенных объектов помещать их на блокированный слой (используя AcEdInputContextReactor). Это не даст не только удалять объекты, но и модифицировать их. Не знаю - этого ли добивается автор вопроса, но честно говоря разницу между модификацией и удалением я не очень вижу. Некоторые команды AutoCAD при применении их к примитивам удаляют выбранный объект и создают другие. Что делать в данном случае?
А подробнее о подводных камнях этого дела есть на сайте http://adn.autodesk.com, если конечно есть туда доступ)
Если слабо привести константный указатель к неконстантному или принципиально этого делать не хочешь, то запоминай удаленные объекты в оном методе в массивчик - затем по событию
AcEdInputContextReactor::beginQuiescentState()
пооткрывать объекты из массивчика (не забыть флажок, что открывать erased) и сделать erase(false)
слабо, как это сделать???
ok ^)):
пытался отфильтровать только свои объекты (защитить от удаленя), но кусок этого кода не даёт стереть ничего??? отчего??? не могу найти "косяк"
void
AsdkDbReactor::objectErased(const AcDbDatabase* db,
const AcDbObject* pObj, Adesk::Boolean pErased)
{
const char* myName = "MyEntity";
const char* locName;
locName = pObj->isA()->name();
if(*(pObj->isA()->name()) == *nmblock){
const_cast<AcDbObject*>(pObj)->upgradeOpen();
const_cast<AcDbObject*>(pObj)->erase(false);
const_cast<AcDbObject*>(pObj)->downgradeOpen();
}
}
пардон закралась ошибка, вот так лучше но все равно не работает???
void
AsdkDbReactor::objectErased(const AcDbDatabase* db,
const AcDbObject* pObj, Adesk::Boolean pErased)
{
const char* myName = "MyEntity";
const char* locName;
locName = pObj->isA()->name();
if(*locName == *myName){
const_cast<AcDbObject*>(pObj)->upgradeOpen();
const_cast<AcDbObject*>(pObj)->erase(false);
const_cast<AcDbObject*>(pObj)->downgradeOpen();
}
}
> Миша
Начни с азов C/C++. Подумай, что сравнивается *locName == *myName и все поймешь сам.
ок!!! так лучше:
void
AsdkDbReactor::objectErased(const AcDbDatabase* db,
const AcDbObject* pObj, Adesk::Boolean pErased)
{
AcDbMyObj *locObj = AcDbMyObj::cast(pObj);
if (locObj) {
const_cast<AcDbObject*>(pObj)->upgradeOpen();
const_cast<AcDbObject*>(pObj)->erase(false);
const_cast<AcDbObject*>(pObj)->downgradeOpen();
}
}
а по поводу модификации, можно ли "закрыть" объект от модификации на стадии его создания????
А почему бы и нет. Переопределить ВСЕ методы, которые модифицируют объект так, чтобы они ничего не делали.
Тут есть правда другая опасность, что ты и сам не сможешь ни модифицировать, ни удалить этот объект. Так и будет болтаться в чертеже после своего создания... Поэтому следует предусмотреть дополнительный метод, который бы разрешал/запрещал модификацию примитива. Причем это может быть как статический метод, который будет распространяться на все объекты данного класса, так и нестатический с областью действия - конкретный объект.
перегрузил все методы так или иначе связанные с модификацией, как у Entity так и у соответствующего ему Objecta, оставил их пустыми...копируется "собака"???
> Миша
Так копирование - это же не модификация! Появляется новый примитив! Нужно переопределить метод clone(), а возможно еще и deepClone() и wblockClone() чтобы примитив нельзя было скопировать.
P.S. Интересно, а что же ты позволишь с ним делать? :-;
эт будет сеть триангуляционных точек, в том-то и дело, что с ними ничего делать не нужно...более того, опасно, они там где они должны быть (статический объект так сказать), к ним можно только привязаться, посмотреть координаты
а как можно переопределить
virtual AcRxObject *clone() const;
в теле самого класса??
Наверное так:
class AcDbMyObj: : public ... { ... public: virtual AcRxObject *clone(void) const {return NULL;}; ... }
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → Как защитить объект от удаления?
Форум работает на PunBB, при поддержке Informer Technologies, Inc