Системы координат. Работа с WCS и UCS.

Автор Тема: Системы координат. Работа с WCS и UCS.  (Прочитано 16045 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Здравствуйте. Пишу программу по добавлению координат на чертеже. Столкнулся с проблемой получения координат, при выборе пользовательской системы координат.
Мне нужно что бы при выборе ПСК у меня выводились координаты в МСК, но в точке где я делаю выбор, она же смещается относительно ПСК и выводит координаты не мировой а пользовательской. Смог сделать так что бы все выводилось или в ПСК или в МСК, но скомбиноровать как мне надо(точка ставится в пск, но выводит данные в мск) пока не получается.

Код прилагаю:

Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.

В принципе, буду благодарен если просто скинете пару ссылок где можно почитать про системы координат и как с ними взаимодействовать правильно через C#.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Системы координат. Работа с WCS и UCS.
« Ответ #1 : 17-08-2017, 11:39:19 »
Мне нужно что бы при выборе ПСК у меня выводились координаты в МСК, но в точке где я делаю выбор, она же смещается относительно ПСК и выводит координаты не мировой а пользовательской. Смог сделать так что бы все выводилось или в ПСК или в МСК, но скомбиноровать как мне надо(точка ставится в пск, но выводит данные в мск) пока не получается.
Извини, но это какой-то бред. Если в двух словах, то что ты получаешь через Editor.GetPoint возвращается в ПСК(UCS). Если тебе нужно эту точку преобразовать в МСК(WCS), то нужно получить матрицу преобразования UCS->WCS при помощи Editor.CurrentUserCoordinateSystem и преобразовать по ней.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Системы координат. Работа с WCS и UCS.
« Ответ #2 : 17-08-2017, 11:40:42 »
Может пригодиться - код Александра Ривилиса, которым я успешно пользуюсь уже очень давно:
Код - C# [Выбрать]
  1. /// <summary>Перевод точки из пользовательской системы координат в мировую</summary>
  2.         public static Point3d UcsToWcs(Point3d pt)
  3.         {
  4.             var m = GetUcsMatrix(HostApplicationServices.WorkingDatabase);
  5.             return pt.TransformBy(m);
  6.         }
  7.         private static bool IsPaperSpace(Database db)
  8.         {
  9.             if (db.TileMode) return false;
  10.             var ed = AcApp.DocumentManager.MdiActiveDocument.Editor;
  11.             return db.PaperSpaceVportId == ed.CurrentViewportObjectId;
  12.         }
  13.         private static Matrix3d GetUcsMatrix(Database db)
  14.         {
  15.             Point3d origin;
  16.             Vector3d xAxis, yAxis;
  17.             if (IsPaperSpace(db))
  18.             {
  19.                 origin = db.Pucsorg; xAxis = db.Pucsxdir; yAxis = db.Pucsydir;
  20.             }
  21.             else
  22.             {
  23.                 origin = db.Ucsorg; xAxis = db.Ucsxdir; yAxis = db.Ucsydir;
  24.             }
  25.             var zAxis = xAxis.CrossProduct(yAxis);
  26.             return Matrix3d.AlignCoordinateSystem(
  27.                 Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis,
  28.                 origin, xAxis, yAxis, zAxis);
  29.         }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Системы координат. Работа с WCS и UCS.
« Ответ #3 : 17-08-2017, 11:46:24 »
Может пригодиться - код Александра Ривилиса, которым я успешно пользуюсь уже очень давно:
Это не мой код. Этот код из MGDDBG если мне не изменяет память.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Системы координат. Работа с WCS и UCS.
« Ответ #4 : 17-08-2017, 12:33:54 »
Все примеры, которые я встречал в интернете, использовали транзакцию по такой схеме:
Код - C# [Выбрать]
  1. using (Transaction tr = db.TransactionManager.StartTransaction())
  2. {
  3.     // Тут открытие объектов и работа с ними
  4.  
  5.     tr.Commit(); // <-- ВСЕГДА ПЕРЕД ЗАКРЫВАЮЩЕЙ ФИГУРНОЙ СКОБКОЙ
  6. }
  7.  
Вот скажите мне: откуда у Вас этот новаторский подход, когда транзакция коммитится где-то в середине блока?  :)

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Re: Системы координат. Работа с WCS и UCS.
« Ответ #5 : 17-08-2017, 13:05:31 »
Вот скажите мне: откуда у Вас этот новаторский подход, когда транзакция коммитится где-то в середине блока? 
Новаторский подход, в том и заключается что он новаторский, извиняюсь, уже поправил). Пытаюсь во всем разобраться сам , поэтому могу допустить много ошибок, есть моменты которые не до конца сам могу улавливать или знать. Тут закрыл ее в середине блока, так как подумал что получил то что мне надо в этой транзакции и можно ее закрыть, ошибок в программе не вылезало, соответственно продолжил писать дальше. Запомню на будущее как надо делать. :)
Хотя вспомнил, почему так, у меня получается транзакция внутри другой транзакции, если закрываю ее перед закрывающей скобкой, то не вижу где у меня происходит вставка примитивов, в процессе выполнения программы, только по ее завершению, а если ставлю закрывающую скобку перед циклом, то теряю ссылку на TextSt1. Возможно мне следует организовать работу программы в данном случае подругому, но пока я хотел разобраться с системами координат.
Извини, но это какой-то бред. Если в двух словах, то что ты получаешь через Editor.GetPoint возвращается в ПСК(UCS). Если тебе нужно эту точку преобразовать в МСК(WCS), то нужно получить матрицу преобразования UCS->WCS при помощи Editor.CurrentUserCoordinateSystem и преобразовать по ней.
Я плохо объяснил наверное). Может конечно сам неправильно понимаю, но я хочу чтобы точка получаемая через GetPoint оставалась в UCS, и выводилась где пользователь кликает мышью, а подписи координат выводили в текстовый примитив значение WCS по X и Y в этом месте. Спасибо за наводку с Editor.CurrentUserCoordinateSystem постараюсь разобраться.
Александр Пекшев aka Modis
Спасибо за код, постараюсь понять как мне лучше выполнить преобразования )

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Системы координат. Работа с WCS и UCS.
« Ответ #6 : 17-08-2017, 13:20:33 »
Тут закрыл ее в середине блока, так как подумал что получил то что мне надо в этой транзакции и можно ее закрыть
Мысль верная, а вот исполнение - нет. Надо ее тут же и закрывать, т.е. ставить закрывающую скобку.

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Re: Системы координат. Работа с WCS и UCS.
« Ответ #7 : 17-08-2017, 13:23:43 »
Мысль верная, а вот исполнение - нет. Надо ее тут же и закрывать, т.е. ставить закрывающую скобку.
В ответе выше добавил почему там размещаю Commit ) так-то это не оправдание конечно)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Системы координат. Работа с WCS и UCS.
« Ответ #8 : 17-08-2017, 13:23:50 »
я хочу чтобы точка получаемая через GetPoint оставалась в UCS
Если ты не будешь её менять, то она останется в UCS.
и выводилась где пользователь кликает мышью
Что значит выводилась? Точка никуда не выводится. Или ты имеешь в виду добавить примитив Точка (DBPoint) в базу чертежа? Тогда добавлять нужно с координатами в WCS.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Системы координат. Работа с WCS и UCS.
« Ответ #9 : 17-08-2017, 13:27:46 »
Ладно, заканчиваю оффтоп.
В принципе, буду благодарен если просто скинете пару ссылок где можно почитать про системы координат и как с ними взаимодействовать правильно через C#.
http://spiderinnet1.typepad.com/blog/2013/05/autocad-net-transform-picked-point-from-current-ucs-to-wcs.html
https://knowledge.autodesk.com/ru/search-result/caas/CloudHelp/cloudhelp/2015/RUS/AutoCAD-NET/files/GUID-0EFA65CC-C1AB-4B99-8159-C31602C1A5E8-htm.html

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Re: Системы координат. Работа с WCS и UCS.
« Ответ #10 : 17-08-2017, 14:01:51 »
Ладно, заканчиваю оффтоп.
Спасибо! Надеюсь разберусь! )
Или ты имеешь в виду добавить примитив Точка (DBPoint) в базу чертежа? Тогда добавлять нужно с координатами в WCS.
Нет, программа должна вставлять 2 текстовых примитива в место клика мышью(получаем через GetPoint), в одном примитиве отображается Х клика, в другом У клика, но оба примитива всегда выводят значение координат в WCS, вне зависимости от того какая система координат установлена. Может в данном случае лучше всего при начале выполнения программы устанавливать в чертеже WCS а по завершении возвращать пользовательскую UCS. Вообщем сейчас постараюсь разобраться с ссылками что дал Дмитрий, а как что-то сделаю еще раз выложу сюда готовый вариант того что получится.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Системы координат. Работа с WCS и UCS.
« Ответ #11 : 17-08-2017, 14:19:52 »
Может в данном случае лучше всего при начале выполнения программы устанавливать в чертеже WCS а по завершении возвращать пользовательскую UCS.
Зачем? GetPoint тебе даёт точку в UCS. Преобразовываешь её в WCS и записываешь в текстовые примитивы X и Y преобразованной точки. Я не понимаю в чем проблема?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Системы координат. Работа с WCS и UCS.
« Ответ #12 : 17-08-2017, 14:24:06 »
Заметил, что в твоём коде идёт преобразование примитивов текстов из UCS в WCS. Зачем? Тебе достаточно было точку вставки преобразовать из UCS в WCS и от этого плясать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Дмитриий 18-08-2017, 10:28:13

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Re: Системы координат. Работа с WCS и UCS.
« Ответ #13 : 17-08-2017, 17:07:53 »
Все, вроде как разобрался, по крайней мере все работает так как мне надо.
Как я понял метод GetPoint получает данные в UCS а создание текстового примитива происходит в WCS, отсюда у меня и получалось непонимание конечного результата, так как я думал что создание текстового примитива идет в UCS так же, как и получение данных через GetPoint.
Изменив строку:
Код - C# [Выбрать]
  1. Text_coord_X.Position = CoordTextX.TransformBy(curUCSMatrix);
получаю создаваемый текст там где мне нужно.
А для вывода в текстовый примитив координат в WCS использую:
Код - C# [Выбрать]
  1. Point3d pointCoordWCS = pointCoord.TransformBy(curWCSMatrix);
  2. Text_coord_X.TextString = pointCoordWCS.X.ToString("#");
Хотел только уточнить, создание всех примитивов автокада происходит в WCS? А GetPoint и GetEntity получают в свою очередь результат в UCS правильно я понимаю?

Код получившейся программы прилагаю ниже, вдруг кому пригодится, ну или какие-то ошибки кто заметит...  :)

Извините, вам запрещён просмотр содержимого спойлеров.

Хочу еще раз сказать спасибо Дмитрию, ссылка:
http://spiderinnet1.typepad.com/blog/2013/05/autocad-net-transform-picked-point-from-current-ucs-to-wcs.html
очень помогла разобраться с работой с системами координат!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Системы координат. Работа с WCS и UCS.
« Ответ #14 : 17-08-2017, 17:24:01 »
Хотел только уточнить, создание всех примитивов автокада происходит в WCS?
Почти. Во всяком случае точно не в UCS. Есть еще понятие OCS (система координат объекта). Её использует полилиния.
А GetPoint и GetEntity получают в свою очередь результат в UCS правильно я понимаю?
Да. Если конечно речь идёт о полученной от пользователя точке, так как GetEntity возвращает не только точку, но и ObjectId примитива, который от системы координат не зависит.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение