Преобразование в Display CS

Автор Тема: Преобразование в Display CS  (Прочитано 8626 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Преобразование в Display CS
« Ответ #15 : 03-03-2020, 21:22:02 »
Ну как минимум операции по получению вершин прямоугольника ты должен производить в DCS, а затем преобразовать их в WCS для построения

Если смотреть внимательней, именно это я и делаю
Нет. Посмотри внимательно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Преобразование в Display CS
« Ответ #16 : 03-03-2020, 21:24:30 »
Внимательней некуда. Конкретнее.
Разве что Z координата

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Преобразование в Display CS
« Ответ #17 : 03-03-2020, 21:26:25 »
И почему ты обнуляешь Z в WCS?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Преобразование в Display CS
« Ответ #18 : 03-03-2020, 21:27:29 »
Щас, исправлю Z

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Преобразование в Display CS
« Ответ #19 : 03-03-2020, 21:33:19 »
Внимательней некуда. Конкретнее.
Разве что Z координата
В том виде, что у тебя на рисунке, у всех угловых точек разные координаты Z. Поэтому фортель с тем, что ты преобразовал только topLeft и bottomRight не проходит. Нужно обработать все 4 точки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Преобразование в Display CS
« Ответ #20 : 03-03-2020, 22:05:19 »
Цитата:  link=topic=9763.msg43043#msg43043 date=1583260399
Нужно обработать все 4 точки
Верно. Теперь отрисовывает корректно

И ещё: матрица преобразований dcs в wcs
Код - C++ [Выбрать]
  1.    double k(0.015625);
  2.    resbuf rb;
  3.    acedGetVar(_T("viewdir"), &rb);
  4.    AcGeVector3d zAxis(rb.resval.rpoint[X], rb.resval.rpoint[Y],
  5.          rb.resval.rpoint[Z]), xAxis, yAxis;
  6.    zAxis.normalize();
  7.    zAxis = UcsToDcs(zAxis);
  8.  
  9.    if ((fabs(zAxis.x) < k) && (fabs(zAxis.y) < k))
  10.       xAxis = AcGeVector3d::kYAxis.crossProduct(zAxis);
  11.    else
  12.       xAxis = AcGeVector3d::kZAxis.crossProduct(zAxis);
  13.    xAxis.normalize();
  14.    yAxis = zAxis.crossProduct(xAxis);
  15.    yAxis.normalize();
  16.    
  17.    AcGeMatrix3d dcsToWcs;
  18.    dcsToWcs.setCoordSystem(AcGePoint3d::kOrigin, xAxis, yAxis, zAxis);
  19.  
Ничего не напортачил?
ПС: кроме AcGePoint3d::kOrigin - тоже нужно в DCS

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Преобразование в Display CS
« Ответ #21 : 03-03-2020, 22:15:21 »
Ничего не напортачил?
На первый взгляд всё правильно. Но нужно тестировать. Попробуй на своих четырёх точках.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Преобразование в Display CS
« Ответ #22 : 03-03-2020, 22:25:03 »
Можно сделать иначе без использования VIEWDIR. Глянь код функции Wcs2Dcs отсюда: https://adndevblog.typepad.com/autocad/2012/06/setting-the-view-center-in-an-external-dwg-file-with-objectarx-or-realdwg-in-c.html
Тебе нужно будет только инвертировать результирующую матрицу. Из плюсов той функции - она работает и в перспективном виде.
Пример её использования там же.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Преобразование в Display CS
« Ответ #23 : 04-03-2020, 02:15:27 »
Вот немного упрощенный вариант (без учета перспективы):
Код - C++ [Выбрать]
  1. static void viewRect() {
  2.   AcGeMatrix3d ucs2wcs(Ucs2Wcs());
  3.   AcGeMatrix3d wcs2dcs(Wcs2Dcs());
  4.   AcGeMatrix3d dcs2wcs(Dcs2Wcs());
  5.   resbuf rb;
  6.   acedGetVar(_T("VIEWCTR"), &rb);
  7.   AcGePoint3d center(rb.resval.rpoint[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z]);
  8.   center.transformBy(ucs2wcs).transformBy(wcs2dcs);
  9.   acedGetVar(_T("VIEWSIZE"), &rb);
  10.   double height = rb.resval.rreal;
  11.   acedGetVar(_T("SCREENSIZE"), &rb);
  12.   double width = height * rb.resval.rpoint[X] / rb.resval.rpoint[Y];
  13.   AcGePoint3d p[4] = {
  14.     AcGePoint3d((center.x - (width / 2)), (center.y - (height / 2)), 0),
  15.     AcGePoint3d((center.x - (width / 2)), (center.y + (height / 2)), 0),
  16.     AcGePoint3d((center.x + (width / 2)), (center.y + (height / 2)), 0),
  17.     AcGePoint3d((center.x + (width / 2)), (center.y - (height / 2)), 0)
  18.   };
  19.   AcGePoint3dArray pts;
  20.  
  21.   for (int i = 0; i < 4; i++)
  22.   {
  23.     p[i] = p[i].transformBy(dcs2wcs);
  24.     pts.append(p[i]);
  25.   }
  26.  
  27.   AcDbBlockTableRecordPointer btr(acdbSymUtil()->blockModelSpaceId(acdbCurDwg()), AcDb::kForWrite);
  28.   AcDb3dPolyline *pline = new AcDb3dPolyline(AcDb::Poly3dType::k3dSimplePoly, pts, true);
  29.   btr->appendAcDbEntity(pline);
  30.   pline->close();
  31.  
  32. }
  33.  
  34. static AcGeMatrix3d Ucs2Wcs()
  35. {
  36.   AcGeMatrix3d mat; mat.setToIdentity();
  37.   acedGetCurrentUCS(mat);
  38.   return mat;
  39. }
  40. static AcGeMatrix3d Ucs2Dcs()
  41. {
  42.   return Ucs2Wcs() * Wcs2Dcs();
  43. }
  44. static AcGeMatrix3d Dcs2Ucs()
  45. {
  46.   return Ucs2Dcs().inverse();
  47. }
  48.  
  49. static AcGeMatrix3d Wcs2Ucs()
  50. {
  51.   return Ucs2Wcs().inverse();
  52. }
  53.  
  54. static AcGeMatrix3d Dcs2Wcs()
  55. {
  56.   AcGeMatrix3d mat; mat.setToIdentity();
  57.  
  58.   acedVports2VportTableRecords();
  59.  
  60.   AcDbViewportTableRecordPointer vtr(acedActiveViewportId(), AcDb::kForRead);
  61.   if (vtr.openStatus() == Acad::eOk)
  62.   {
  63.     mat = AcGeMatrix3d::rotation(-vtr->viewTwist(), vtr->viewDirection(), vtr->target()) *
  64.       AcGeMatrix3d::translation(vtr->target().asVector()) *
  65.       AcGeMatrix3d::planeToWorld(vtr->viewDirection());
  66.   }
  67.   return mat;
  68. }
  69. static AcGeMatrix3d Wcs2Dcs()
  70. {
  71.   return Dcs2Wcs().inverse();
  72. }
  73.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Sergey_KАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 2
Re: Преобразование в Display CS
« Ответ #24 : 04-03-2020, 12:43:22 »
 :o Столько вариантов ) Dcs2Wcs в тему.

Комбинаций много, а сложных преобразований - не счесть... по надобности.
Преобразования WCS->UCS и обратно, поворот, масштаб, сдвиг - затруднений не вызывают. Были некоторые вопросы с DCS...