Тема: Как ограничить передвижение gripPoints Entity?

Всем доброго дня.
столкнулись с такой вот проблемой:
Есть некоторый объект с большим количеством gripPoints(ручек) и есть другой объект (н-р полилиния) или их набор.
Нужно ограничить передвижение gripPoints первого объекта только в пределах рамки формируемой другим (другими).
Все вроде бы просто, используем intersectWidth, проверям факт пересечения и запрещаем передвижение. Но как всегда не все так легко:
  1. Если количество ручек увеличивается (сложность объекта возрастает) начинается бешенное торможение
  2. Очень приветствуется не просто запрет передвижения, а остановка точки в гранично допустимом месте рамки
Есть ли средство в арсенале ARX (или в опыте разработок), которое позволяло бы решить описанную выше проблему?

Re: Как ограничить передвижение gripPoints Entity?

Здравствуйте все!
Подобного рода ограничения введенны в Civil3D на перемещение вершин углов, правда реализовано это ещё экзотичнее, чем в других продуктах ... При выходе за расчётную область перетаскиваемые объекты исчезают и на экране остаются лишь исходные (очень завлекательная игрушка "поймай крайнюю точку"). Ухватившись за GripPoint можно дотянуться до кнопки на любой из ToolBar и нажав на неё запустить на выполнение другую команду, отменив тем самым текущую ... По Джону Роббинсу чистейшие ошибки ...
На мой взгляд здесь надо каким-то образом блокировать не GripPoint, а MouseMove (+x) и MouseMove (+y), например, разрешая при этом MouseMove (-x) и MouseMove (-y). Как это сделать и возможно ли это - я не знаю ... Один знакомый гуру по Microsoft обещал посмотреть, сказал, что сходу решения не нашёл, а вручную мышь перехватывать не стоит ...

Re: Как ограничить передвижение gripPoints Entity?

Сергей пишет:

На мой взгляд здесь надо каким-то образом блокировать не GripPoint, а MouseMove (+x) и MouseMove (+y), например, разрешая при этом MouseMove (-x) и MouseMove (-y). Как это сделать и возможно ли это - я не знаю ...

Ну это как раз запросто в ObjectARX. Посмотри пример samples\editor\mfcsamps\pretranslate и в нем filterMouse. Единственно что это можно сделать из arx-файла, а вот из dbx-файла могут быть проблемы.

Re: Как ограничить передвижение gripPoints Entity?

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

filterMouse

- спасибо за совет, посмотрю

Re: Как ограничить передвижение gripPoints Entity?

Посмотрел на vhmouse. Она больше похожа на F8, чем на то, что хотел бы автор этой темы. В Autodesk не оказалось человека, которому пришло бы в голову стопорить указатель мыши при пересечении  некоторой кривой или полигона во время активной команды... как выясняется напрасно. Придётся изобретать :о)

Re: Как ограничить передвижение gripPoints Entity?

Я делал такую вещь:
1) Создавал темпаральный массив _ARR<AcGePoint3d> gripPoints.
getGripPoints(...)
{
getMyGripPoints(gripPoints)
1) выдаем акаду грип точки - что вернулись в массиве gripPoints.
}
moveGripPoints(..., AcGeVector3d shift)
{
if ( gripPoints.GetSize() == 0 )
   getMyGripPoints(gripPoints);
теперь в массиве gripPoints - двигаем на shift - те точки что пришли в массиве индексов.
теперь для каждой сдвинутой грип точки index
{
    AcGePoint3d pnt = preprocessGripPoint(gripPoints[index], index);
    setGripPointRealPosition(pnt, index);
}
}
Т.е. получается что пока объект таскают - у нас есть массив реального положения grip точек в автокаде. Но для объекта выполняется препроцессинг обработки точки. Решается проблема с тем, что вектор shift - это вектор от предыдущего положения к следующему - т.е. если реальные графические "точки объекта" не двигать совместно с грип точкой, то уже на втором шаге - мы теряем где реально находится грип точка, а темпоральный вспомогательный масиив помогает нам решить эту проблему.
При таком подходе - обсчитываются только те "ручки", что тащат. Т.е. если у объекта N-ручек, а тащут за одну, то алгоритм обрабатывает только одну точку. Т.е. сложность объекта не играет рояли. При этом считается что сложность алгоритма определения попадания точки в контур - не играет рояли т.к. его все равно надо делать не зависимо от того перехватываем мы moveGrip или moveMouse.
Либо я не до конца понял суть вопроса. Т.е. не понял что значит возрастание сложности объекта и как это влияет на процессинг грип точки.

Re: Как ограничить передвижение gripPoints Entity?

KonstantinM пишет:

что значит возрастание сложности объекта и как это влияет на процессинг грип точки

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

сложность алгоритма определения попадания точки в контур - не играет рояли

В выше описанной логике конечно нет.
Но в общем процессе передвижения ой как играет...
________________
Появилась еще одна идея:
Обработку проводить не в момент передвижения (moveGripPointAt), а уже после того как передвижение завершилось. Тогда торможения по определению есть точка в границе или нет снимаются!
Но, как отследить завершение перетаскивания (когда gripPoint отпущена)?
Если повешать реактор, а в  modified проверять было ли передвижение (благо свой объект позволит создать такой флаг).
Но в реакторе изменить объект нельзя так как

virtual void modified([b]const[/b] AcDbObject* dbObj);

А снятие const ни к чему, кроме выпада ACAD в осадок не приведет.
Вот так вот, запутался совсем sad

Re: Как ограничить передвижение gripPoints Entity?

Очень просто.
moveGripPoint(...)
{
if ( objectId() != AcDbObjectId() )
{
//значит передвижение происходит для реального объекта, а не его копии.
}
}

Re: Как ограничить передвижение gripPoints Entity?

Если копию объекта при движении грип точки не трогать, то динамика таскания этой грип точки будет выглядить статично. Т.е. объект будет стоять на месте и просто мерцать... а оно надо? Хотя когда сильно тормозит тоже не очень классно. Но я НЕ ВЕРЮ что проверка попадания точки в контур и изменения геометрии и зависимостей - может съедать заметно много времени... наверное что-то написано не оптимально...

Re: Как ограничить передвижение gripPoints Entity?

> Сергей
А что же вы рассчитывали, что за Вас решат Вашу задачу? Наивный! Главное, что в этом примере расписана метода как фильтровать Windows сообщения, а остальное уже дело техники.

Re: Как ограничить передвижение gripPoints Entity?

> Александр
Ривилис
Во-первых я не являюсь автором этой темы? следовательно, это не моя задача, хотя в обозримом будущем я  намерен заняться подоюными вопросами, а во-вторых, я никогда не рассчитывал, что за меня кто-то что-либо решит. И в-третьих, вряд ли меня можно назвать наивным, хотя Вам виднее ...

Re: Как ограничить передвижение gripPoints Entity?

...  завидую англоязычным, у них не надо переключаться на другой язык, поэтому никогда вместо запятой в русской раскладне не проскочит знак вопроса, а вместо text не пропечатается "еуче" ... это так, к слову