Тема: acedSSGet (CP...)

Столкнулся с интересной проблемой :)
делаю выборку из чертежа полигоном (_cp)
код работает в acad2004-2008. А вот в 2009 на возврат acedssget идет -5001 (RTERROR)
В чем может быть проблема?

...
int es;
ads_name ssname;
struct resbuf *pointlist;
pointlist = PointsToList(RamkaPoints);
if( (es = acedSSGet(_T("_CP"), pointlist, NULL, NULL, ssname)) != RTNORM)
{
  acutRelRb(pointlist);
  return false;
}
...

ну и собственно функция формирования resbuf.

resbuf *PointsToList(AcGePoint3dArray ptArray)
{
  resbuf* ptList = NULL;
  resbuf* lastRb = NULL;
  resbuf* rb;
  int len = ptArray.length();
  for (int i=0;i<len;i++)
  {
    if ((rb = acutNewRb(RT3DPOINT)) == NULL)
    {
      acutRelRb(ptList);
      return NULL;
    }
    copyPt(rb->resval.rpoint, asDblArray(ptArray.at(i)));
    if (ptList == NULL)
    {
     ptList = rb;
     lastRb = rb;
    }
    else
    {
     lastRb->rbnext = rb;
     lastRb = rb;
    }
  }
  return ptList;
}

Re: acedSSGet (CP...)

Попробуй для начала тоже самое в lisp'е:

(ssget "_CP" (list <список точек>))

Надеюсь, что код выполняется в контексте документа, что все точки в списке видны на экране и т.д.

Re: acedSSGet (CP...)

вот в лиспе я не силен. не уверен что все сделал правильно. нарисовал что-то и через ком. строку ввел:

Команда: (ssget "_CP" (list
((_> 0,0
((_> 0,1
((_> 1,1
((_> 1,0
((_> 0,0 )
(_> )

а это мне ответил акад

; ошибка: неверный список точек

Re: acedSSGet (CP...)

Надеюсь, что код выполняется в контексте документа, что все точки в списке видны на экране и т.д.

ДА
Еще заметил, что не работает только во второй четверти (X - положительный, У - отрицательный)

Re: acedSSGet (CP...)

тю, наоборот X - отрицательный,а У - положительный

Re: acedSSGet (CP...)

В твоем случае лисп выглядит так: (ssget "_CP" '((0 0) (0 1) (1 1) (1 0)))

Re: acedSSGet (CP...)

в первой четверти <Selection set: 13>
во второй четверти то же самое <Selection set: e9>

Re: acedSSGet (CP...)

в lisp в общем все работает. я так понял что e9 и 13 это не кол-во элементов а имя выборки. потом если выполнить. например перенос с опцией _p - предидущий выбор, то выделяется все что нужно.
значит проблема где-то в коде.
Да, сразу вопрос. Я тут заметил что в lisp первая и последняя точки не совпадают. Значит замыкать контур не нужно?
Убрал у себя. Работает через раз. Если выборка чисто во второй четверти, то стабильно не работает, а если выпасть за границы, например в I, III или IV четверть, то работает через раз (под настроение)

Re: acedSSGet (CP...)

Значит замыкать контур не нужно?

Не нужно. Очень странно если в лиспе работает, а в arx нет, т.к. это один и тот же алгоритм.

Re: acedSSGet (CP...)

так в этом то и весь прикол. у меня уже мозги кипят :)
в каждым акадом что-то новое. только 3 месяца назад окончательно перестроились на 2008, (на 2007 забили, т.к. сам autodesk его отзывает) и тут на тебе, половина программы не работает в 2009. правда если поставить все сервис паки то становится чуток полегче, но все равно не все проблемы решены.

PS: лирическое отступление :)
короче говоря я в шоке. и они опять забыли прикрутить AcDbMPolygon17.lib в arxHeaders.h
хотя в 2009 ARX уже положили настоящий либ x64, а не как в 2007 и 2008 просто скопировали win32 в папку x64.

Re: acedSSGet (CP...)

о, добился того что акад начал писать
Invalid type in acutBuildList() arg #5
значит все-таки не правильно работает функция формирования resbuf *PointsToList( AcGePoint3dArray ptArray)?

Re: acedSSGet (CP...)

> Николай
Конечно. Добавь:

lastRb->rbnext=NULL;

Иначе у тебя список незавершенный.

Re: acedSSGet (CP...)

P.S.: Кстати, а acedSSFree(ssname) делать не забываешь?

Re: acedSSGet (CP...)

про acedSSFree конечно не забываю.
lastRb->rbnext=NULL; не помог
расковырял так, что теперь не работает и в 2008 акаде :)
PS. В тех случаях когда все-таки работает нужно замыкать контур. Если первая и последняя точка не совпадают, выбирается не все объекты, которые попали внутрь контура.

Re: acedSSGet (CP...)

> Николай
Точки в UCS или в WCS? Должны быть в UCS. Да и взгляд должен быть правильный. Ну и не должно быть самопересечений контура.
А вообще я бы не пользовался ssget "_CP". Это принципиально ненадежно.

Re: acedSSGet (CP...)

А как тогда сделать выборку всех видимых объектов чертежа, которые попадают целиком или частично в область указанную точками? По-моему ssget - это оптимальный выбор. Если я не прав, подскажите как это сделать лучше.

Re: acedSSGet (CP...)

> Николай
Он оптимальный, но ненадежный.