Тема: Создание своего объекта со своими свойствами

Всем привет!

Я начинаю осваивать ObjectARX.
1) Как сделать свой объект так, чтобы его можно было строить также как и стандартные автокадовские примитивы?
На примере полилинии:
Сейчас я сделал только так: щелкаю мышкой в разных местах по чертежу, потом нажимаю Enter и по этим точкам строится полилиния. Надо сделать так, чтобы когда щелкнул в одном месте чертежа из этой точки тянулась линия в место, куда указывает курсор, потом опять щелкнуть по чертежу и т.д.
2) Как добавить свои свойства объекту? После двойного щелчка мышкой по объекту выскакивает кадовское окно свойств, как добавить в него свои пункты?
3) И ещё, как сделать привязку к своему объекту? Когда рядом с объектом проходит курсор мышки, чтоб он "прилипал" к линии моего объекта?

Заранее Спасибо за ответы.

Re: Создание своего объекта со своими свойствами

ну давай по порядку.

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

я так подозреваю, что пользуешься acedGetPoint. в первый параметр передавай предыдущую точку если она есть и будет тянуться линия, а если точек набралось больше чем 1, то строй временную полилинию или рисуй прям на окне, без занесения данных в БД чертежа (этот вариант более геморойный, т.к. нада работать с реакторами, а ты только начинаешь осваивать ARX)

Как добавить свои свойства объекту? После двойного щелчка мышкой по объекту выскакивает кадовское окно свойств, как добавить в него свои пункты?

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

И ещё, как сделать привязку к своему объекту? Когда рядом с объектом проходит курсор мышки, чтоб он "прилипал" к линии моего объекта?

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

Re: Создание своего объекта со своими свойствами

Вообще-то все требования, которые предъявлены к "своему" объекту можно реализовать и без "своего" объекта. Про acedGetPoint (или AcEdGig) Николай уже сказал. Если не нужны свойства, а нужно свое окошко по doubleclick, то нужен соответствующий реактор (точнее, AcDbDoubleClickEdit). Про прилипание - это вообще что-то странно.
P.S.: Изучать ObjectARX нужно последовательно. Судя по вопросам ты еще не изучил азы, а уже хочешь создавать свои объекты и назначать им свои свойства.

Re: Создание своего объекта со своими свойствами

Спасибо за ответы, с первой частью разобрался.
По поводу прилипания: возможно вы не правильно меня поняли. В автокаде если нарисовать отрезок, потом начать рисовать ещё один отрезок(или другое что-нибудь), то при подведении мыши к концам первого отрезка он "прилипает" к ним, и дальше если вести курсор вдоль отрезка, то на отрезке будет крестик вблизи курсора. Можно ли такое сделать для моего объекта?

Re: Создание своего объекта со своими свойствами

Геннадий пишет:

то на отрезке будет крестик вблизи курсора

Ты имеешь в виду привязку "ближайшая"? Можно конечно.

Re: Создание своего объекта со своими свойствами

Александр Ривилис,
Да, именно эту! Как её реализовать?

Re: Создание своего объекта со своими свойствами

необходимо перезагрузить метод

getOsnapPoints(AcDb::OsnapMode osnapMode,int gsSelectionMark,const AcGePoint3d& pickPoint,const AcGePoint3d& lastPoint,const AcGeMatrix3d& viewXform,AcGePoint3dArray& snapPoints,AcDbIntArray& geomIds) const

Я сделал так:

Acad::ErrorStatus CRazmetka::getOsnapPoints(AcDb::OsnapMode osnapMode,int gsSelectionMark,const AcGePoint3d& pickPoint,const AcGePoint3d& lastPoint,const AcGeMatrix3d& viewXform,AcGePoint3dArray& snapPoints,AcDbIntArray& geomIds) const
{    assertReadEnabled () ;
    snapPoints.append(Start);
    snapPoints.append(End);
    snapPoints.append(LeftDownGrip);
    snapPoints.append(RightDownGrip);

   
    return Acad::eOk;
}

где Start,End,LeftDownGrip,RightDownGrip- являются AcGePoint3d

Re: Создание своего объекта со своими свойствами

на самом деле все НАМНОГО проще.
зачем перегружать метод, если можно просто выставить все необходимое в самом акаде?

int osmod = acdbHostApplicationServices()->workingAppSysvars()->osmode();
acdbHostApplicationServices()->workingAppSysvars()->setOsmode(512); // привязка БЛИЖАЙШАЯ
// ... тут свой код, где эта привязка должна отрабатываться
acdbHostApplicationServices()->workingAppSysvars()->setOsmode(osmod); // вернуть исходные привязки

Re: Создание своего объекта со своими свойствами

DIVON DIVON пишет:

необходимо перезагрузить метод

getOsnapPoints(AcDb::OsnapMode osnapMode,int gsSelectionMark,const AcGePoint3d& pickPoint,const AcGePoint3d& lastPoint,const AcGeMatrix3d& viewXform,AcGePoint3dArray& snapPoints,AcDbIntArray& geomIds) const

Спасибо, но привязка работает только в тех точках, которые я указал. А как сделать чтоб крестик бегал например вдоль линии, проходящей через две точки, которые я добавил в snapPoints.

И ещё, можно ли так сделать, чтоб от курсора тянулись две пунктирные линии к моему отрезку по вертикали и горизонтали.
Вот так:
Создание своего объекта со своими свойствами

Re: Создание своего объекта со своими свойствами

Чистейшей воды математика+немного логики.
Тебе необходимо найти уравнение прямой, проходящей через эти 2е точки, потом  получить координату Х или Y перпендикуляра от курсора, смотря через что выражение составишь, и от этой точки уже строить отрезок к курсору

Re: Создание своего объекта со своими свойствами

DIVON DIVON пишет:

Чистейшей воды математика+немного логики.

Тебе необходимо найти уравнение прямой, проходящей через эти 2е точки, потом  получить координату Х или Y перпендикуляра от курсора, смотря через что выражение составишь, и от этой точки уже строить отрезок к курсору

Спасибо, но с этим я уже сам разобрался. А вот по поводу первой части ещё не разобрался.