Тема: помогите опредилиться с классом

нужно создать "мой" класс, который будет являться новым графическим примитивом, а также должен быть наделен определенными моими свойствами... помогите определиться, этот "мой" класс от кого должен быть наследником... от AcDbEntity или AcDbObject или может еще от кого-то?

Re: помогите опредилиться с классом

Все зависит от того, что будет делать примитив.
Если брать только самые базовые свойства, то можно и от entity. Но если это будет, например точка с навороченными данными на ней, то проще стазу наследовать от точки и т.п.

Re: помогите опредилиться с классом

Если ближе к конкретной задаче, то это, например, будет елемент тепловой схемы. Очевидно, что представление на чертеже обязательно, но его необходимо, также, снабдить специализиорванными свойствами (например: модель, марка и еще множество других числовых характеристик объекта, которые в последствии можно использовать для расчетов)....
Вот такая задача...
И еще вопрос, что необходимо чтобы сработал метод класса worlddraw?

Re: помогите опредилиться с классом

> Yankel
1. Наследуй от AcDbEntity - т.к. это должен быть примитив, а не объект.
2. Чтобы у тебя сработал метод worldDraw() его нужно определить в своем классе с точно тоже сигнатурой, что и в базовом классе. Проще всего это сделать при помощи ObjectDBX Custom Object Class Wizard.

Re: помогите опредилиться с классом

создала класс наследник от AcDbEntity... определила метод worlddraw(), нарисовала все что хотела :), но когда хотела переместить свой объект в AutoCad - после указания первой точки (отвечая на запрос от AutoCad), объект рисуется с центром в (0,0,0), после указания второй точки - объект остается на своем изначальном месте...
Я конечно понимаю, что это все происходит от того что у меня явно указаны координаты размещения... но где и что разместить правильно не имею пока понятия...
прилагаю:
Adesk::Boolean firstClass::worldDraw (AcGiWorldDraw *mode) {
    assertReadEnabled ();
  int circleRadius=200;
  char circleColor=2;
  AcGeVector3d circleVector=AcGeVector3d(0.0,0.0,1.0);
  // draw circle
  mode->subEntityTraits().setColor(circleColor);
  mode->geometry().circle(kotelCenter,circleRadius,circleVector);
  circleColor=3;
  mode->subEntityTraits().setColor(circleColor);
  //AcDbEntity::worldDraw(mode);
  //circle
      AcDbCircle *pCircle=new AcDbCircle;
    pCircle->setCenter(kotelCenter);
    pCircle->setRadius(100);
    pCircle->worldDraw(mode);
  return (Adesk::kTrue) ;
}
и еще один вопрос. Какая принципиальная разница когда рисуешь через mode-> и когда создаешь новый екземпляр класса?

Re: помогите опредилиться с классом

> Yankel
В данном случае правильно было бы определить переменные не внутри worldDraw, а как экземпляры класса:

class firstClass: public AcDbEntity {
//...........
protected:
  AcGePoint3d  center; // Центр окружности
  double       radius; // Радиус окружности
  AcGeVector3d norm; // Вектор нормали
//...........
};

Начальные значения можешь задать в конструкторе.
Кроме того не плохо бы написать функции, которые позволяли бы получать/изменять их значения. Например:

double firstClass::get_radius(void) const
{
  assertReadEnabled () ;
  return (radius) ;
}
Acad::ErrorStatus firstClass::put_radius(double newVal)
{
  assertWriteEnabled () ;
  radius = newVal ;
  return (Acad::eOk) ;
}

Еще необходимо переопределить функцию  firstClass::transformBy() приблизительно так:

Acad::ErrorStatus firstClass::::transformBy(const AcGeMatrix3d & xform)
{
  assertWriteEnabled () ;
  Acad::ErrorStatus retCode = AcDbEntity::transformBy (xform);
  center.transformBy(xform);
  norm.transformBy(xform); norm.normalize();
  radius *= xform.scale();
  recordGraphicsModified();
  return (retCode) ;
}

Ну и переписать worldDraw чтобы он учитывал значения этих переменных. Но это все очень упрощенно. Нужно еще переопределить массу методов (например, dwgInFields/dwgOutFields - чтобы примитив сохранялся в чертеже). Смотри примеры в ObjectARX SDK (например в каталоге samples\entity\curvetext) и документацию: ObjectARX Developer's Guide->Custom Objects->Deriving from AcDbEntity

Re: помогите опредилиться с классом

- определила все параметры, как свойства класса (_center);
- написала для них методы записи и получения их значений;
- написала два конструктора: один с параметрами (желтый кружочек), другой без них(красный), все свойства класса проинициализировала в них;
- прописала соответствующие строки
    pFiler->writeItem(pСenter); и
    pFiler->readItem(&pСenter); в dwgOutFields и dwgInFields соответственно;
в результате:
   - на начало перемещения - создается экземпляр класса по средству конструктора без параметров (красный);
   - прорисовка "красного" экземпляра класса производиьтся относительно той же постоянной точки pСenter(желтого) и не перемещается никак)
   - по завершении перемешения, "красный" экземпляр класса уничтожается, а "желтый" так и продолжает упорно стоять на своем месте...
:(
может я ошибочно это понимаю, но pFiler->writeItem(pСenter),как-бы ,"экспортирует" параметр, а pFiler->readItem(&pСenter) получает этот параметр и передает его экземпляру?

Re: помогите опредилиться с классом

> Yankel
1) Как ты перемещаешь? Командой _MOVE? Может ты говоришь про создание примитива при помощи AcEdJig?
2) Почему экземпляр класса создается при перемещении?
3) Добавила ли ты метод transformBy()?
Трудно понять о чем ты говоришь.

Re: помогите опредилиться с классом

> Yankel
Если ты перемещаешь свой объект мышью, т.е. делаешь drag, то на каждое движение мыши создается новый объект (копия оригинального). Предыдущая копия удаляется. После окончания drag-а перемещается оригинальный объект (посредством transformBy).
Вообще все это в доках по oarx описано достаточно хорошо. Посмотри примеры, там все очень наглядно.