Тема: intersectWith

Посмотрел по форуму, вроде все должно работать.
На самом деле что-то не так.
Есть полилиния 2D замкнутая (контур).
Есть массив полилиний 2D, которые должны делить контур на части. Но эти линии не всегда пересекают контур. Могут вообще быть внутри, может быть одна точка пересечения, может быть две точки.
Вот код.
В чем может быть ошибка?

...
AcDbObjectIdAarry Cordons; // тут иды делящих полилиний
...
AcDbEntity * plineEnt; // замкнутая полилиния
if (acdbOpenObject(plineEnt, plineId, AcDb::kForRead) != Acad::eOk) return;
    
AcGePoint3dArray arrOut;
AcDbCurve * cordonsCurve;    
Acad::ErrorStatus es;
for (int i = 0; i < Cordons.length(); i++)
{
  if (acdbOpenObject(cordonsCurve , Cordons[i], AcDb::kForRead) != Acad::eOk) continue;
  arrOut.setLogicalLength(0);
  //        
  es = cordonsCurve->intersectWith(plineEnt,AcDb::kExtendThis,arrOut); [b]// возврат eOk[/b]
  cordonsCurve->close();
  for (int k = 0; k < arrOut.length(); k++)
  {
    AcGePoint3d pt = arrOut[i]; [b]// а тут почти всегда (0,0,0), но иногда есть и точки пересечений (их две но одинаковые) [/b]
    // ...
  }        
}    
plineEnt->close();        
...

Re: intersectWith

> Николай
Полилинии лежат в той же плоскости, что и контур? Если нет, то тебе нужно использовать другой вариант метода  intersectWith:

virtual Acad::ErrorStatus intersectWith(
  const AcDbEntity* pEnt,
  AcDb::Intersect intType,
  const AcGePlane& projPlane,
  AcGePoint3dArray& points,
  int thisGsMarker = 0,
  int otherGsMarker = 0) const;

Re: intersectWith

у всех полилиний точки (x,y,0.0), уровень нулевой. Значит все лежат в плоскости XY

Re: intersectWith

Тогда очень странно... Массив полилиний содержит только линейные сегменты или есть дуговые?

Re: intersectWith

только линейные. В контуре точек может быть до 1000, а в делящих подидиниях до 20.

Re: intersectWith

Уточни:
1) 2D-полилиния это AcDb2dPolyline или AcDbPolyline?
2) Версия AutoCAD и ObjectARX
3) Тебе нужно найти реальное пересечение или условное? Если реальное, то почему kExtendThis, а не kOnBothOperands?
Хочу перепроверить. Никогда с такими глюками не сталкивался.

Re: intersectWith

Где были мои глаза... smile
Почему:

    AcGePoint3d pt = arrOut[[b]i[/b]]; // а тут почти всегда (0,0,0), но иногда есть и точки пересечений (их две но одинаковые)

а не:

    AcGePoint3d pt = arrOut[[b]k[/b]]; // а тут почти всегда (0,0,0), но иногда есть и точки пересечений (их две но одинаковые)

Re: intersectWith

А где мои глаза были :)
Спасибо за помощь, все работает.
Кстати, полилинии AcDbPolyline

Re: intersectWith

[offtop]
Был не прав, когда написал что не сталкивался с таким глюком. Двадцать с гаком лет назад поставил на уши системщиков из вычислительного центра Горьковского университета, когда в программе из четырех строк на Fortran'е (два вложенных цикла) умудрился получить аварийное завершение - перепутал индексы. Они так и не поняли в чем дело, внимательно изучая дамп и греша на оптимизирующий компилятор... Так что тебе еще повезло, что количество полилиний в массиве оказалось меньше, чем точек пересечения... :)
[/offtop]

Re: intersectWith

:)
Кстати, странно, что акад не выкинул предупреждение, что я залез за пределы массива. Иногда промахиваюсь в циклах, сообщения вылазят, а тут не вылезло :(
Это у меня проблема Ctrl+C - Ctrl+V (лень печатать :) )