Тема: Примитив, проходящий через заданную точку.

Подскажите способы, как выявить примитивы, проходящие через заданную точку Pt. В чатности интересует полилиния, проходящая через заданную точку. Пробовал acedSSGet("C", Pt, Pt, NULL, sset). Почти то, что надо, но у меня поиск происходит в объектном реакторе (реактор для другого примитива, не для полилинии), в modified(const AcDbObject* dbObj). Если редактировать один примитив, то все вроде тип-топ, если группу (2 сразу например), то при применеии acedSSGet редактируется, только один, второй остается на месте и исчезает с экрана, появляется только после регенерации. Т. е. либо нельзя использовать acedSSGet в реакторе, либо я ее неправильно использую. Поскажите, как выйти из этой ситуации? Спасибо...

Re: Примитив, проходящий через заданную точку.

> bkrug
1) acedSSGet("C", Pt, Pt, NULL, sset) - некорректно. Для выбора при помощи "_C" нужно построить прямоугольник с ненулевой высотой и шириной в плоскости взгляда относительно точки Pt (Pt - должна быть точкой в UCS). При этом Pt должна быть видна на экране - в противном случае набор будет пуст.
2) acedSSGet никак не может влиять на исчезновение примитива на экране. Ты случайно не пытаешься в реакторе modified() редактировать примитив, которой вызвал modified()? Этого делать нельзя.
И вообще - что это за примитивы (стандартные или custom)? Какая взаимосвязь между ними? Если они связанны постоянно (типа как группа), то может стоит их связать друг с другом, чтобы не использовать acedSSGet()?
И вообще мало информации...

Re: Примитив, проходящий через заданную точку.

1. Тем не менее acedSSGet("C", Pt, Pt, NULL, sset) выбирает объект тот, который надо.
2. Нет, объект который вызвал modified(), я не редактирую.
3. Примитивы стандартные.Объект, который вызвал modified(), блок, через точку вставки которого проходит полилиния, которую надо двигать за блоком, причем двигать не всю, а только тот сегмент, кот. проходит через точку. В группу объединять их не хочется. Прикрепить Id полилинии к блоку в принципе можно, но как быть если такая пара будет скопирована?
Вариант с acedSSGet нормально работает, если блок редактирую я сам, реактор вызывается и полилиния модифицируется. Нормально работает, если к примеру перемещаю блок с помощью комманды _move, но только если один блок. Если два, то второй во первых остается на прежнем месте (блок) и исчезает с экрана и появляется после регенерации чертежа (т. е. он есть, но остался на месте). Первый же переместился и сегмент полилинии за ним.

Re: Примитив, проходящий через заданную точку.

Забыл добавить, что у полилинии есть XData. Таким образам я помечаю, что это "моя" полилиния.
Если короче;), то задача сводится к тому, чтобы найти полилинии, проходящие через точку вставки блока и имеющие мои XData. Вариант "пробежаться по всей базе" как-то мне не нравиться, если будет насыщенный чертеж, имхо будет тормозить, да и не знаю как в этом случае будет вести себя acedSSGet("X",... <фильтр для отбора полилиний:)>).
К сожалению не могу сейчас проверить, исходники дома остались, архив на флэшке битым оказался:(
А можно вообще в acedSSGet сформировать фильтр таким образом, чтобы попали только п-линии с моими XData или хотя бы с наличием XData?
Может у кого есть идеи?:))

Re: Примитив, проходящий через заданную точку.

А можно вообще в acedSSGet сформировать фильтр таким образом, чтобы попали только п-линии с моими XData или хотя бы с наличием XData?

Конечно можно. Фильтр по имени приложения и группе 0. В lisp'е это так:

(setq ss (ssget "_X" (list (cons 0 "[i]*POLYLINE[/i]") (list -3 (list "[i]MY_APPLICATION[/i]")))))

MY_APPLICATION -> имя твоего APPID в расширенных данных.
"*POLYLINE" -> если работаешь только с "легкими" полилиниями, то замени на "LWPOLYLINE"

Re: Примитив, проходящий через заданную точку.

ага, отлично, вечерком попробую (если буду в сосотоянии), спасибо;)
Всех с наступающим!!!!!

Re: Примитив, проходящий через заданную точку.

> bkrug
На всякий случай как это записывается в ObjectARX (есть нюансы):

void TestXdata(void)
{
  resbuf *filter = acutBuildList(RTDXF0,"*POLYLINE",-3,1001, "MY_APPLICATION", RTNONE);
  ads_name ss;
  int res = acedSSGet("_X", NULL, NULL, filter, ss);
  acutRelRb (filter);
  long length = 0;
  acedSSLength (ss, &length);
  acutPrintf ("\nВсего моих полилиний = %ld", length);
  acedSSFree (ss);
}

Re: Примитив, проходящий через заданную точку.

да, действительно, нюансы есть, спасибо;)
самому бы пришлось поломать голову.....

Re: Примитив, проходящий через заданную точку.

Фильтр работает. Но проблема моя не решилась. Если я использую acedSSGet в modified, то получается так, как буд-то я добавил их (полилинии) в текущий набор (который используется например коммандой move) и тогда все полилинии перемещаются вслед за блоком (т.е. для них тоже была применена комманда move), только остается еще и их старое изображение, которое исчезает после регенерации. Не знаю, удалось ли мне объяснить то, что происходит. Я решил, что acedSSGet в modified использовать нельзя и перенес всю обработку в commandended... acedSSGet каким то образом изменяет тот набор примитивов, который используются коммандой,вызвавшей реактор и после этого происходят нехорошие вещи...