Тема: Как получить матрицу ECS<->WCS?

Есть у AcDbEntity метод
getEcs(AcGeMatrix3d& retVal);
Но он возвращает единичную марицу (в частности для AcDbHatch)
При этом AcDbHatch - выдает всю свою информацию в своей 2-D системе координат.
Вопрос: Так как же получить матрицу преобразования AcDbHatch из своей системы в мировую (ECS->WCS)?

Re: Как получить матрицу ECS<->WCS?

спасибо, нашел.
Есть метод getPlane - через который можно эту информацию извлечь...

Re: Как получить матрицу ECS<->WCS?

Вообще-то у AcDbHatch есть методы normal() и elevation(), при помощи которых можно получить матрицу преобразования ECS->WCS

Re: Как получить матрицу ECS<->WCS?

Наверное я не понимаю как по 1-му(одному!) вектору и 1-му(одному!) double-у можно получить origin, X Y - axes, Plane normal...
Расскажите мне как по normal() и eleveation() можно получить ECS->WCS.
Заранее благодарен.

Re: Как получить матрицу ECS<->WCS?

Приблизительно так:

  static GetECS(AcGeVector3d zDir, double elev, AcGeMatrix3d& mat)
  {
    AcGeVector3d xDir,yDir;
    if (zDir == AcGeVector3d::kZAxis) {
      xDir = AcGeVector3d::kXAxis;
      yDir = AcGeVector3d::kYAxis;
    } else {
      const double kArbBound = 0.015625;         //  1/64th
      if ((fabs(zDir.x) < kArbBound) && (fabs(zDir.y) < kArbBound))
        xDir = AcGeVector3d::kYAxis.crossProduct(zDir);
      else
        yDir = AcGeVector3d::kZAxis.crossProduct(zDir);
      xDir.normalize();
      yDir = zDir.crossProduct(xDir);
      yDir.normalize();
      AcGePoint3d m_origin = AcGePoint3d::kOrigin + zDir * elev;
      mat.setCoordSystem(m_origin, xDir, yDir, zDir);
    }
  }

А вообще в примере ARXDBG есть функция ArxDbgUtils::getEcsToWcsMatrix(...), которая делает практически тоже самое.

Re: Как получить матрицу ECS<->WCS?

> Александр Ривилис
Сразу вопрос:
>AcGeVector3d xDir,yDir;
>if (zDir == AcGeVector3d::kZAxis)
>{
>   xDir = AcGeVector3d::kXAxis;
>   yDir = AcGeVector3d::kYAxis;
>}
С чего это вдруг??? Есть у меня плоская "звездочка" паралельная плоскости XY на растоянии 50 единиц автокада. Вектор нормали паралелен Z и нормирован. Остается две степени свободы. Я могу крутить плоскость звездочки вокруг вектора Z - проходящего через любую точку плоскости звездочки. При этом нормаль и elevation будут постоянны.
elevation - есть расстояние от начала координат мировой системы до плоскости "звездочки". Т.е. origin системы координат entity и угол поворота вокруг оси - произвольны...
И посему нижеследующий код - это единственно возможный (исключая вариации).
    pHatch->getPlane(plane, planarity);
    AcGePoint3d origin;
    AcGeVector3d axis1;
    AcGeVector3d axis2;
    AcGeVector3d axis3;
    plane.getCoordSystem(origin, axis1, axis2);
    axis3 = plane.normal();
    ecs.setCoordSystem(origin, axis1, axis2, axis3);

Re: Как получить матрицу ECS<->WCS?

С чего это вдруг???

Потому что так решил Autodesk - это его алгоритм получения ECS по вектору нормали и точке начала. Кстати pHatch->getPlane(plane, planarity) работает точно также, т.е. определяет плоскость по вектору нормали и началу. Ты же понимаешь, что и в плоскости система координат может поворачиваться произвольно. Поэтому:

AcGePoint3d origin;
AcGeVector3d axis1;
AcGeVector3d axis2;
AcGeVector3d axis3;
plane.getCoordSystem(origin, axis1, axis2);

вычисляется на основе arbitrary-алгоритма на основе вектора нормали и точки начала.

Я могу крутить плоскость звездочки вокруг вектора Z - проходящего через любую точку плоскости звездочки.

Правильно. Но ECS звездочки останется постоянной. Изменятся координаты вершин звездочки в ECS.

Re: Как получить матрицу ECS<->WCS?

Случайно нашел подтверждение своим словам документации в документации (ObjectARX SDK Help->AcDbHatch):

AcDbHatch is a planar entity that can be created and placed in an arbitrary plane in 3D space.
The hatch plane can be uniquely defined by a normal vector in WCS (World Coordinate System) and an elevation indicating the distance from the WCS origin to the hatch plane. The hatch plane adopts a standard AutoCAD object coordinate system (OCS). Its origin coincides with the WCS origin and its X and Y axes are calculated using the arbitrary axis algorithm.

Re: Как получить матрицу ECS<->WCS?

> Александр Ривилис
The hatch plane can be uniquely defined by a normal vector in WCS (World Coordinate System) and an elevation indicating the distance from the WCS origin to the hatch plane.
Ну так и есть - плоскость может быть однозначно определена вектором нормали и растоянием до начала мировой системы координат.
А вот то что они на OCS наложили ограничения, которые фиксируют OCS origin coincides with the WCS origin и оси должны быть вычислены по их алгоритму - спасибо Александр тебе (в хорошем смысле) за то что доказал что оно так, и спасибо автодеску (в переносном смысле) за такую прозрачность и "просто необходимые" ограничения на OCS. Ведь и действительно легкое неудобство разработчикам окупается тем что вместо матрицы ECS для каждого объекта надо сохранить всего лишь один вектор и один дабл только для тех объектов для которых это требуется...