Тема: как "ходить" по линии
Есть полилиния. В основном замкнутая - либо флаг стоит либо первая и последняя точки совпадают.
Как мне выбирать конечные точки сегментов именно на ней, т.е. чтобы курсор к ней как бы прилип
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → ObjectARX → как "ходить" по линии
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть полилиния. В основном замкнутая - либо флаг стоит либо первая и последняя точки совпадают.
Как мне выбирать конечные точки сегментов именно на ней, т.е. чтобы курсор к ней как бы прилип
> ДДВ
Не очень понятно что именно тебе нужно (точнее в каком контексте), но посмотри в сторону acedRegisterFilterWinMsg()
мне надо отделить кусок полилинии от точки до точки.
ткнуть две точки, а потом в программе разбирать - принадлежат/нет. И если не принадлежит хоть одна, значит ретурн. Это, наверное, останется для перестраховки :).
Но, для удобства пользователей хочу сделать чтобы они выбирали точно точки, лежащие на линии
Но, для удобства пользователей хочу сделать чтобы они выбирали точно точки, лежащие на линии
Тогда то, что я написал совсем из другой оперы... Алгоритм мне видится такой:
1) запрос у пользователя точки (возможно с включением привязки "ближайшая")
2) При помощи acedNEntSelP с pickflag == TRUE получаем ads_name выбранного примитива и убеждаемся что это полилиния.
3) Повторяем пункты 1) и 2) и дополнительно убеждаемся что выбрана одна и таже полилиния.
Ну а дальше уже твой алгоритм.
Если я правильно понял задание и еще если ползатель не полный ... (будет стараться попасть хоть где-то рядом с линией :) ), то можно сделать проще:
AcDbCurve* pCurve; ads_name entCont; ads_point pn; AcDbObjectId eId; AcGePoint3d ppt1, ppt2; bool next = true; while (next) { switch (acedEntSel(_T("\nВыберите контур: "), entCont,pn)) { case RTCAN : return; case RTERROR : continue; case RTNORM : acdbGetObjectId(eId,entCont); if (acdbOpenObject(pCurve, eId, AcDb::kForRead) != Acad::eOk) continue; if(pCurve == NULL) { acedAlert(_T("Ообъект не подходит...")); continue; } pCurve->close(); next = false; break; } } switch(ads_getpoint(NULL,_T("\n1-я точка: "),pn)) { case RTERROR: case RTCAN: return; } ppt1 = перевод точки в мировую систему координат(pn); switch(ads_getpoint(NULL,_T("\n2-я точка: "),pn)) { case RTERROR: case RTCAN: return; } ppt2 = перевод точки в мировую систему координат(pn); pCurve->getClosestPointTo(ppt1,ppt1); // переносим первую точку на кривую pCurve->getClosestPointTo(ppt2,ppt2); // переносим вторую точку на кривую /* теперь осталось только найти все промежуточные точки, создать массив точек не забывая про введенные с экрана и создать полилинию по всем этим точкам */
P.S.: Кажется я зевнул один момент - тебе нужно от вершины до вершины (т.е. не от любой точки полилинии). В этом случае привязка нужна "конточка", ну и для гарантии находишь ближайшую вершину к указанной пользователем точке.
Спасибо за ответы. Примерно так я и делаю.
Просто хотелось красотищу навести - "прилепить" курсор к точкам выбранной полилинии.
> ДДВ
Это можно сделать при помощи acedRegisterFilterWinMsg(), но достаточно не просто и чревато последствиями.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → ObjectARX → как "ходить" по линии
Форум работает на PunBB, при поддержке Informer Technologies, Inc