Тема: Как унаследовать класс от AcDbBlockReference

Подскажите пожалуйста!!!!!!!!!!!!!
У меня есть следующая вещь
class ClassName : public AcDbBlockReference {
}
В этом классе описаны некоторые переменные.
Как добавить в АвтоКад блок, в котором будут элементы (линии и др. примитивы) и который будет одновременно с этим обладать описанными в классе свойствами?
Я уже три дня бьюсь над этим и всё равно ничего не выходит =(

Re: Как унаследовать класс от AcDbBlockReference

> Antonio
1) Создать описание блока (AcDbBlockTableRecord), добавить к нему все необходимые примитивы и добавить его в таблицу блоков.
2) Создать экземпляр своего класса ClassName и установить связь между вставкой блока и описанием блока:

AcDbObjectId btrId; // ObjectId для AcDbBlockTableRecord
ClassName *pCust = new ClassName();
pCust->setBlockTableRecord(btrId);
// Далее проделываешь с pCust все что тебе нужно...
// и добавляешь его в чертеж, например в пространство модели
addToModelSpace(pCust);
pCust->close();

Не пытайся использовать атрибуты для этого блока!

Re: Как унаследовать класс от AcDbBlockReference

У меня возникла проблема, кстати до этого она тоже существовала
AcDbBlockTableRecord *pRec;
............
//На этой строке КАД выдаёт Unhandled Exception
pRec->appendAcDbEntity (pCust) == Acad::eOk

Re: Как унаследовать класс от AcDbBlockReference

> Antonio
И правильно делает. pCust ссылается на pRec, а ты пытаешься к pRec добавить pCust, т.е. загоняешь AutoCAD в бесконечную рекурсию. Ты добавляй pCust к Model_Space или Paper_Space тогда все будет нормально.

Re: Как унаследовать класс от AcDbBlockReference

Чё-то у меня не всё получилось =(
Блок создался, добавился в АвтоКад, но я не могу узнать, является ли он моим классом.
Если я проверяю его

 pObject->isKindOf (ClassName::desc());

,он должен быть ClassName или AcDbBlockReference?

Re: Как унаследовать класс от AcDbBlockReference

> Antonio

if (ClassName::cast(pObject)) {
 acutPrintf(_T("\nУра!! Наконец-то получилось - это мой класс!!!"));
}

Re: Как унаследовать класс от AcDbBlockReference

=D
Я влез в VBA в АвтоКАД, и проверил там

MsgBox ThisDrawing.ModelSpace.Item(0).ObjectName

и получил имя класса (в ModelSpace был один единственный элемент, который я вставил)
Спасибо огромное, теперь буду разбираться, как дальше работать. Я просто пока чайник, за 2 дня выучил C++ и за 1 день ObjectARX, теперь надо во всё тщательно въехать.

Re: Как унаследовать класс от AcDbBlockReference

=(
теперь не знаю как в VBA объявить

Dim Obj as CustomClass

(он почему-то не видит моего объекта) и не знаю как в ObjectARX поиметь доступ к этому объекту

Re: Как унаследовать класс от AcDbBlockReference

> Antonio
1) AutoCAD понимает твой объект как ClassName только пока твое dbx/arx-приложение загружено.
2) Для того чтобы работать с ClassName их VBA нужно создать для него COM-wrapper.
P.S.: Если перешел на ObjectARX - бросай VBA.
3) Чтобы в ObjectARX использовать этот объект, включи его .h-айл.

Re: Как унаследовать класс от AcDbBlockReference

Вот этот кусок кода не прокатывает =(
я наверное что-то неправильно делаю (или сделал)
При этом VBA видит элемент именно как ClassName

ads_name ename;
ads_point pt;
acedEntSel (_T("Select appliance: "),ename,pt;
AcDbObjectId idO ;
acdbGetObjectId (idO, ename);
AcDbObject *pO;
acdbOpenAcDbObject (pO, idO, AcDb::kForRead);
if ((pO->isKindOf(ClassName::desc()))==Adesk::kTrue ) {
    acutPrintf(_T("\nУра"));
}
else
{
acutPrintf(_T("\nНе ура"));
}

Вариант с

if (ClassName::cast(pObject)) {
 acutPrintf(_T("\nУра!! Наконец-то получилось — это мой
класс!!!"));
}

тоже почему-то не выводит волшебную строчку со словом "УРА"
Как обратиться к этому элементу?
HELP HELP HELP PLEASE

Re: Как унаследовать класс от AcDbBlockReference

1) Укажи как выглядит твой ACRX_DXF_DEFINE_MEMBERS
2) Такой код у меня работает:

static void TEST(void)
{
  ads_name en; ads_point p;
  if (acedEntSel("\nВыберите объект: ",en,p) == RTNORM) {
    AcDbObjectId eid; acdbGetObjectId(eid,en);
    AcDbObjectPointer<AcDbEntity> pEnt(eid,AcDb::kForRead);
    if (pEnt.openStatus() == Acad::eOk) {
      if (DoubleCircleClass::cast(pEnt.object())) {
        acutPrintf(_T("\nУра - это мой объект!"));
      }
    }
  }
}

Так что ошибка где-то у тебя.

Re: Как унаследовать класс от AcDbBlockReference

P.S.:
А это что за ерунда:

acedEntSel (_T("Select appliance: "),ename,pt;

Re: Как унаследовать класс от AcDbBlockReference

Дело в том, что ObjectARX видит этот объект как AcDbBlockReference.
Вот этот код выводит строку про "Ура!!!"

if (AcDbBlockReference::cast(pO)) {
            acutPrintf(_T("\nУра!! Наконец-то получилось — это мой класс!!!"));
        }
        else
        {
            acutPrintf(_T("\nНе ура"));
        }

P.S.

acedEntSel (_T("Select appliance: "),ename,pt);

это выбор объекта в КАДе (тока я не знаю, как сделать выбор объекта окном)

Re: Как унаследовать класс от AcDbBlockReference

Код работает, но говорит, что это не мой класс, как же тогда объяснить поведение VBA