Тема: как "ходить" по линии

Есть полилиния. В основном замкнутая - либо флаг стоит либо первая и последняя точки совпадают.
Как мне выбирать конечные точки сегментов именно на ней, т.е. чтобы курсор к ней как бы прилип

Re: как "ходить" по линии

> ДДВ
Не очень понятно что именно тебе нужно (точнее в каком контексте), но посмотри в сторону acedRegisterFilterWinMsg()

Re: как "ходить" по линии

мне надо отделить кусок полилинии от точки до точки.
ткнуть две точки, а потом в программе разбирать - принадлежат/нет. И если не принадлежит хоть одна, значит ретурн. Это, наверное, останется для перестраховки :).
Но, для удобства пользователей хочу сделать чтобы они выбирали точно точки, лежащие на линии

Re: как "ходить" по линии

ДДВ пишет:

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

Тогда то, что я написал совсем из другой оперы... Алгоритм мне видится такой:
1) запрос у пользователя точки (возможно с включением привязки "ближайшая")
2) При помощи acedNEntSelP с pickflag == TRUE получаем ads_name выбранного примитива и убеждаемся что это полилиния.
3) Повторяем пункты 1) и 2) и дополнительно убеждаемся что выбрана одна и таже полилиния.
Ну а дальше уже твой алгоритм.

Re: как "ходить" по линии

Если я правильно понял задание и еще если ползатель не полный ... (будет стараться попасть хоть где-то рядом с линией :) ), то можно сделать проще:

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); // переносим вторую точку на кривую
/*
теперь осталось только найти все промежуточные точки,
создать массив точек не забывая про введенные с экрана
и создать полилинию по всем этим точкам
*/

Re: как "ходить" по линии

P.S.: Кажется я зевнул один момент - тебе нужно от вершины до вершины (т.е. не от любой точки полилинии). В этом случае привязка нужна "конточка", ну и для гарантии находишь ближайшую вершину к указанной пользователем точке.

Re: как "ходить" по линии

Спасибо за ответы. Примерно так я и делаю.
Просто хотелось красотищу навести - "прилепить" курсор к точкам выбранной полилинии.

Re: как "ходить" по линии

> ДДВ
Это можно сделать при помощи acedRegisterFilterWinMsg(), но достаточно не просто и чревато последствиями.