Тема: Как защитить объект от удаления?

как сделать объект защищенным от удаления?

Re: Как защитить объект от удаления?

от удаления и изменения....

Re: Как защитить объект от удаления?

а также от просмотра и редактирования...

Re: Как защитить объект от удаления?

subErase перегрузить

Re: Как защитить объект от удаления?

в реакторе "на удаление"

...
    if (!mayBeDeleted) {
        acutPrintf("\n%s", __GSW_MSG_WRN_CHILDEXIST);
        put->upgradeOpen();
        put->erase(false);
        put->downgradeOpen();
        return;
    }
...

Re: Как защитить объект от удаления?

может я что то не понял но:
void erased(const AcDbObject* dbObj, Adesk::Boolean pErasing), a -
Acad::ErrorStatus upgradeOpen(); - не константный метод!!!

Re: Как защитить объект от удаления?

1) Надо использовать метод...
AcDbDatabaseReactor::objectErased(
const AcDbDatabase* dwg,
const AcDbObject* dbObj,
Adesk::Boolean pErased )
2) Если слабо привести константный указатель к неконстантному или принципиально этого делать не хочешь, то запоминай удаленные объекты в оном методе в массивчик - затем по событию
AcEdInputContextReactor::beginQuiescentState()
пооткрывать объекты из массивчика (не забыть флажок, что открывать erased) и сделать erase(false)

Re: Как защитить объект от удаления?

После этого в AutoCAD 2004-2006 не будет работать UNDO.

Re: Как защитить объект от удаления?

Это почему это он не будет работать? В чем это будет выражаться?

Re: Как защитить объект от удаления?

Не будет работать не сама команда UNDO, а будет нарушен механизм. Не корректно отрабатывать Undo Begin/End, и т.д.
Есть другой способ - при попытке выбора определенных объектов помещать их на блокированный слой (используя AcEdInputContextReactor). Это не даст не только удалять объекты, но и модифицировать их. Не знаю - этого ли добивается автор вопроса, но честно говоря разницу между модификацией и удалением я не очень вижу. Некоторые команды AutoCAD при применении их к примитивам удаляют выбранный объект и создают другие. Что делать в данном случае?

Re: Как защитить объект от удаления?

А подробнее о подводных камнях этого дела есть на сайте http://adn.autodesk.com, если конечно есть туда доступ)

Re: Как защитить объект от удаления?

Если слабо привести константный указатель к неконстантному или принципиально этого делать не хочешь, то запоминай удаленные объекты в оном методе в массивчик - затем по событию
AcEdInputContextReactor::beginQuiescentState()
пооткрывать объекты из массивчика (не забыть флажок, что открывать erased) и сделать erase(false)

слабо, как это сделать???

Re: Как защитить объект от удаления?

const_cast<>

Re: Как защитить объект от удаления?

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();
    }
}

Re: Как защитить объект от удаления?

пардон закралась ошибка, вот так лучше но все равно не работает???

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();
}
}

Re: Как защитить объект от удаления?

> Миша
Начни с азов C/C++. Подумай, что сравнивается *locName == *myName и все поймешь сам.

Re: Как защитить объект от удаления?

ок!!! так лучше:

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();
}
}

а по поводу модификации, можно ли "закрыть" объект от модификации на стадии его создания????

Re: Как защитить объект от удаления?

А почему бы и нет. Переопределить ВСЕ методы, которые модифицируют объект так, чтобы они ничего не делали.
Тут есть правда другая опасность, что ты и сам не сможешь ни модифицировать, ни удалить этот объект. Так и будет болтаться в чертеже после своего создания... Поэтому следует предусмотреть дополнительный метод, который бы разрешал/запрещал модификацию примитива. Причем это может быть как статический метод, который будет распространяться на все объекты данного класса, так и нестатический с областью действия - конкретный объект.

Re: Как защитить объект от удаления?

перегрузил все методы так или иначе связанные с модификацией, как у Entity так и у соответствующего ему Objecta, оставил их пустыми...копируется "собака"???

Re: Как защитить объект от удаления?

> Миша
Так копирование - это же не модификация! Появляется новый примитив! Нужно переопределить метод clone(), а возможно еще и deepClone() и wblockClone() чтобы примитив нельзя было скопировать.
P.S. Интересно, а что же ты позволишь с ним делать? :-;

Re: Как защитить объект от удаления?

эт будет сеть триангуляционных точек, в том-то и дело, что с ними ничего делать не нужно...более того, опасно, они там где они должны быть (статический объект так сказать), к ним можно только привязаться, посмотреть координаты

Re: Как защитить объект от удаления?

а как можно переопределить
virtual AcRxObject *clone() const;
в теле самого класса??

Re: Как защитить объект от удаления?

Наверное так:

class AcDbMyObj: : public ... {
...
public:
virtual AcRxObject *clone(void) const {return NULL;};
...
}