Тема: Контейнерный класс как объект БД Автокада

Существует ли в Oarx механизм, позволяющий реализовать следующее. В контейнепный коасс (коробка) по мере вычислений добавляются объекты (содержимое коробки, уложенное оптимальным способом), которые необходимо отображать на экране. Вопрос : возможно ли получить такой класс-контейнер, который сам являся бы объектом БД, хранил в себе экземпляры примитивов или ссылки на них(а не идентификаторы БД), примитивы добавленные в него, автоматически считались  добавленными в БД и соответсвующим образом отображались???
Или в данном случае так сделать нельзя, добавлять примитивы в БД можно(или надо) только напрямую, а в класс-контейнер добавлять AcDbObjectId примитивов???
Большое спасибо, если вопрос поставлен как-нибудь некорректно, прошу меня извинить, Алексеев Сергей

Re: Контейнерный класс как объект БД Автокада

Легко!
Объекты-содержимые и объект-коробка создаются отдельно и независимо друг от друга (тут имеется ввиду создание классов, а не создание объекта в базе данных).
Создаётся объект-содержимое, в котором заполняются соответствующим образом функции worldDraw, dwgInFields, dwgOutFields etc
Далее создаётся объект-коробка со своими worldDraw, dwgInFields, dwgOutFields etc. При этом в каждой из этих функций передаётся управление списку внутренних объектов-содержимых.

Acad::ErrorStatus container::dwgOutFields(AcDbDwgFiler* pFiler) const
{
    //сохраняем какие-то данные по контейнеру
    pFiler->writeString(nazvanieContainera);
    //сохраняем количество внутр. объектов
    pFiler->writeItem((Adesk::UInt16) itemsPArray.length());
    for (i=0; i<itemsPArray.length(); i++)
        itemsPArray[i]->dwgOutFields(pFiler);
    return pFiler->filerStatus();
}
Acad::ErrorStatus container::dwgInFields(AcDbDwgFiler* pFiler)
{
    //читаем какие-то данные по контейнеру
    pFiler->readString(nazvanieContainera);
    //читаем количество внутр. объектов
    int len;
    pFiler->readItem(&len);
    //читаем внутренности вложенных объектов
    for (i=0; i<len; i++)
    {
        item *pItem=new item;
        pItem->dwgInFields(pFiler);
        itemPArray.append(pItem);
    }
    return pFiler->filerStatus();
}

аналогично в worldDraw etc
Да, и не забывай обнулять массив внутренних объектов, чтобы не получить удвоение массива каждый раз при изменении объекта. Так как при изменении объекта, объект создаётся снова, для последующей возможности применения UNDO (объект копируется, а функция AcArray::append(...) лишь добавляет новые данные не удаляя старые). Это важно. То есть вполне достаточным будет вставить в конструктор контейнера фразу itemsPArray.setLogicalLength(0);
С остальным разберёшься сам. Если чё не понятно, пиши.

Re: Контейнерный класс как объект БД Автокада

Спасибо

Re: Контейнерный класс как объект БД Автокада

В продолжение темы, можно ли в контейнере хранить экземпляры объектов БД автокада или лучше в контейнере хранить их идентификаторы, а доступ к каждому элементу кнтейнера получать через acdbOpenObject???
Большое спасибо, Алексеев С.

Re: Контейнерный класс как объект БД Автокада

Сложно что-либо конкретное сказать не понимая задачу. Думаю, что в ряде случаев вполне нормальное решение сохранять идентификаторы интересующих объектов. Главное чтобы идентификатор оказался действующим. Особенно актуальным это может оказаться при копировании объекта в другой чертёж.

Re: Контейнерный класс как объект БД Автокада

Возможно ли реализовать следующую идеологию. Класс А(например коробка) ссылается на свое содержимое (класс B). В коробке, например, лежит один предмет. Без OARX данная ситуация могла быб быть реализована следующим образом:
class B {
...
};
class A {
B * item ;
или
public:
...
}

Re: Контейнерный класс как объект БД Автокада

Т.к. предыдущее сообщение до конца не дописал ()network problem) его же повторяю
Возможно ли реализовать следующую идеологию. Класс А(например коробка) ссылается на свое содержимое (класс B). В коробке, например, лежит один предмет. Без OARX данная ситуация могла быб быть реализована следующим образом:
class B {
...
};
class A {
B * item ;
или
B item ;
public:
...
}
В Oarx такие ссылки возможны? Или здесь надо поступать следующим образом
class A {
AcDbObjectId itemId ; //Идентификатор объекта В, добавленного в БД
public:
...
}
Большое спасибо, Алексеев

Re: Контейнерный класс как объект БД Автокада

Ачто такое subEntities??? Где про них можно почитать??? Может быть здесь они имеют место???
Большое спасибо, Алексеев