Необычная UCS

Автор Тема: Необычная UCS  (Прочитано 8059 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Необычная UCS
« Ответ #15 : 10-11-2018, 20:17:07 »
_UCS _View
А эта команда в интерфейсе есть?


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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Необычная UCS
« Ответ #16 : 10-11-2018, 20:52:05 »
Через ком. строку понятно.
Что-то в интерфейсе не нашел соответствия.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Необычная UCS
« Ответ #17 : 10-11-2018, 21:01:02 »
Через ком. строку понятно.
Что-то в интерфейсе не нашел соответствия.
А зачем это тебе?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Необычная UCS
« Ответ #18 : 10-11-2018, 21:04:58 »
Для пользователей.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Необычная UCS
« Ответ #19 : 10-11-2018, 21:05:49 »
Для пользователей.
Ну создай им кнопку.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Необычная UCS
« Ответ #20 : 10-11-2018, 21:44:00 »
Тут надо переводить координаты точек грамотно. Ниже - пример того, как это будет работать. Здесь используется P/Invoke для вызова метода трансформации координат точек. Вроде как, можно то же самое сделать и на чистом .NET.
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.Runtime;
  5. using System;
  6. using System.Runtime.InteropServices;
  7.  
  8. namespace AcadTest
  9. {
  10.     public class UCSTest
  11.     {
  12.         [CommandMethod(nameof(TestUcs), CommandFlags.Modal)]
  13.         public void TestUcs()
  14.         {
  15.             var doc = Application.DocumentManager.MdiActiveDocument;
  16.             var db = doc.Database;
  17.             using (var t = doc.TransactionManager.StartTransaction())
  18.             {
  19.                 var ucs = doc.Editor.CurrentUserCoordinateSystem;
  20.                 var ms = (BlockTableRecord)db.CurrentSpaceId.GetObject(OpenMode.ForWrite);
  21.                 var ptUcs = doc.Editor.GetPoint("Точка").Value;
  22.                 var ptWcs = ptUcs.TransformCS(UCSType.UCS, UCSType.WCS);
  23.                 var ptDcs = ptWcs.TransformCS(UCSType.WCS, UCSType.DCS);
  24.                 var pt2Dcs = ptDcs + new Vector3d(3, 6, 0);
  25.                 var pt2Wcs = pt2Dcs.TransformCS(UCSType.DCS, UCSType.WCS);
  26.                 var line = new Line(ptWcs, pt2Wcs);                
  27.                 ms.AppendEntity(line);
  28.                 t.AddNewlyCreatedDBObject(line, true);
  29.                 t.Commit();
  30.             }
  31.         }        
  32.     }
  33.  
  34.     static class UCSSupport
  35.     {
  36.         /// <summary>
  37.         /// Перевод координат точки из одной системы в другую
  38.         /// </summary>
  39.         /// <param name="point">Точка</param>
  40.         /// <param name="from">Система координат "из"</param>
  41.         /// <param name="to">Система координат "в"</param>
  42.         /// <returns>Точка с координатами в нужной СК</returns>
  43.         public static Point3d TransformCS(this Point3d point, UCSType from, UCSType to)
  44.         {
  45.             using (ResultBuffer resBufFrom = new ResultBuffer(new TypedValue(5003, from)))
  46.             using (ResultBuffer resBufTo = new ResultBuffer(new TypedValue(5003, to)))
  47.             {
  48.                 double[]
  49.                     coords = point.ToArray(),
  50.                     retVal = new double[3];
  51.                 AcedTrans
  52.                     (coords, resBufFrom.UnmanagedObject,
  53.                     resBufTo.UnmanagedObject, 0, retVal);
  54.                 return new Point3d(retVal);
  55.             }
  56.         }
  57.  
  58.         /// <summary>
  59.         /// http://adndevblog.typepad.com/autocad/2013/page/41/
  60.         /// </summary>
  61.         /// <param name="point">Точки на листе</param>
  62.         /// <param name="fromRb">Система координат "ИЗ"</param>
  63.         /// <param name="toRb">Система координат "В"</param>
  64.         /// <param name="disp"></param>
  65.         /// <param name="result"></param>
  66.         /// <returns></returns>
  67.         [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acedTrans")]
  68.         public static extern int AcedTrans(double[] point, IntPtr fromRb, IntPtr toRb, int disp, double[] result);
  69.     }
  70.  
  71.  
  72.     /// <summary>
  73.     /// Тип координатной системы
  74.     /// </summary>
  75.     public enum UCSType
  76.     {
  77.         /// <summary>
  78.         /// Мировая
  79.         /// </summary>
  80.         WCS = 0,
  81.         /// <summary>
  82.         /// Пользовательская
  83.         /// </summary>
  84.         UCS = 1,
  85.         /// <summary>
  86.         /// Экрана
  87.         /// </summary>
  88.         DCS = 2,
  89.         /// <summary>
  90.         /// Экрана пространства листа
  91.         /// </summary>
  92.         PSDCS = 3,
  93.     }
  94. }
  95.  

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Необычная UCS
« Ответ #21 : 10-11-2018, 23:28:19 »
Вроде как, можно то же самое сделать и на чистом .NET.
Можно, хотя и не так просто. А можно используя ActiveX/COM модель: Autodesk.AutoCAD.Interop.IAcadUtility.TranslateCoordinates
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Необычная UCS
« Ответ #22 : 10-11-2018, 23:54:22 »
Можно, хотя и не так просто.
Всё-таки не сложно:
Код - C# [Выбрать]
  1. [CommandMethod(nameof(TestUcs), CommandFlags.Modal)]
  2. public void TestUcs()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   Database db = doc.Database;
  6.   using (Transaction t = doc.TransactionManager.StartTransaction())
  7.   {
  8.     Matrix3d UCS2WCS = doc.Editor.CurrentUserCoordinateSystem;
  9.     Matrix3d WCS2DCS = GetWCS2DCS(doc.Editor);
  10.     Point3d pt = doc.Editor.GetPoint("Точка").Value;
  11.     pt = pt.TransformBy(UCS2WCS); pt = pt.TransformBy(WCS2DCS);
  12.     Point3d pt2 = pt + new Vector3d(3, 6, 0);
  13.     pt =  pt.TransformBy(WCS2DCS.Inverse()); pt2 = pt2.TransformBy(WCS2DCS.Inverse());
  14.     Line line = new Line(pt, pt2);
  15.     BlockTableRecord ms = (BlockTableRecord)db.CurrentSpaceId.GetObject(OpenMode.ForWrite);
  16.     ms.AppendEntity(line);
  17.     t.AddNewlyCreatedDBObject(line, true);
  18.     t.Commit();
  19.   }
  20. }
  21. public static Matrix3d GetWCS2DCS(Editor ed)
  22. {
  23.   using (ViewTableRecord vtr = ed.GetCurrentView())
  24.   {
  25.     Matrix3d mat = Matrix3d.PlaneToWorld(vtr.ViewDirection);
  26.     mat = Matrix3d.Displacement(vtr.Target - Point3d.Origin) * mat;
  27.     mat = Matrix3d.Rotation(-vtr.ViewTwist, vtr.ViewDirection, vtr.Target) * mat;
  28.     return mat.Inverse();
  29.   }
  30. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Необычная UCS
« Ответ #23 : 11-11-2018, 00:56:46 »
Вот-вот, как-то так, да  :D
Насколько я помню, в .NET вроде как нет инструмента для перевода в PSDCS и обратно. Поэтому и использовался метод из ObjectARX. А в остальных случаях можно обойтись инструментами .NET

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Необычная UCS
« Ответ #24 : 11-11-2018, 01:26:49 »
Насколько я помню, в .NET вроде как нет инструмента для перевода в PSDCS и обратно
Есть. Тут от Gilles Chanteau набор функций преобразования координат: https://forums.autodesk.com/t5/net/get-the-displaying-coordinates-of-a-viewport-object/td-p/6048418
А тут еще больше: https://www.theswamp.org/index.php?topic=31865.msg373672#msg373672
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Re: Необычная UCS
« Ответ #25 : 11-11-2018, 11:41:00 »
Всё-таки не сложно:
Да, получается то что нужно.
А нельзя как-то вывести одну матрицу применимую к примитиву, из мировой в мировую, но с учетом вида  :o
Т.е. все манипуляции с точками делать в мировой, а потом объект трасформировать.


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Необычная UCS
« Ответ #26 : 11-11-2018, 13:21:05 »
А нельзя как-то вывести одну матрицу применимую к примитиву, из мировой в мировую, но с учетом вида 
Ну и как ты себе это представляешь, если требуется трансформация UCS->WCS->DCS (здесь дополнительные математические операции с координатами в виде)->WCS?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Необычная UCS
« Ответ #27 : 12-11-2018, 12:16:13 »
Есть. Тут от Gilles Chanteau набор функций преобразования координат: https://forums.autodesk.com/t5/net/get-the-displaying-coordinates-of-a-viewport-object/td-p/6048418
А тут еще больше: https://www.theswamp.org/index.php?topic=31865.msg373672#msg373672
Вот это клад Вы раскопали! Спасибо!