В чем отличия EntytyJig от DrawJig?

Автор Тема: В чем отличия EntytyJig от DrawJig?  (Прочитано 69797 раз)

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #90 : 01-09-2016, 19:16:22 »
Вспомнил, я же тоже натыкался на эту "дистанцию", но там не работало что-то другое, потому и поставил везде единный класс с запросом точек.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #91 : 01-09-2016, 23:09:47 »
Я сделал тестовый пример с двумя динамическими размерами. Может быть будет интересно.

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. #pragma warning disable 0618
  9.  
  10. // This line is not mandatory, but improves loading performances
  11. [assembly: CommandClass(typeof(TestDrawJigWithDynDim.MyCommands))]
  12.  
  13. namespace TestDrawJigWithDynDim
  14. {
  15.   public class MyCommands
  16.   {
  17.     [CommandMethod("TestDrawJig")]
  18.     public void MyCommand() // This method can have any name
  19.     {
  20.       Document doc = Application.DocumentManager.MdiActiveDocument;
  21.       Database db = doc.Database;
  22.       if (doc == null) return;
  23.       Editor ed = doc.Editor;
  24.       Matrix3d mat = ed.CurrentUserCoordinateSystem;
  25.       PromptPointResult res = ed.GetPoint("\nУкажите базовую точку: ");
  26.       if (res.Status == PromptStatus.OK)
  27.       {
  28.         Point3d basePt = res.Value.TransformBy(mat);
  29.         DrawJigWithDynDim jig = new DrawJigWithDynDim(basePt, 500, 500);
  30.         if (jig.DragMe() == PromptStatus.OK)
  31.         {
  32.           Point3dCollection pts = new Point3dCollection();
  33.           pts.Add(basePt);
  34.           pts.Add(basePt + new Vector3d(0,         jig.height, 0));
  35.           pts.Add(basePt + new Vector3d(jig.width, jig.height, 0));
  36.           pts.Add(basePt + new Vector3d(jig.width,      0,     0));
  37.           using (Polyline3d poly = new Polyline3d(Poly3dType.SimplePoly, pts, true))
  38.           {
  39.             using (BlockTableRecord btr = db.CurrentSpaceId.Open(OpenMode.ForWrite) as BlockTableRecord)
  40.             {
  41.               btr.AppendEntity(poly);
  42.             }
  43.           }
  44.         }
  45.       }
  46.     }
  47.   }
  48.  
  49.   public class DrawJigWithDynDim: DrawJig
  50.   {
  51.     private DynamicDimensionDataCollection dimCol = new DynamicDimensionDataCollection();
  52.     private Point3d basePt, prevPt;
  53.     public double width  = 100, height  = 100;
  54.     private double minWidth = 100, minHeight = 100;
  55.     private bool bFixWidth  = false;
  56.     private bool bFixHeight = false;
  57.     public DrawJigWithDynDim(Point3d pt, double w, double h)
  58.     {
  59.       basePt = prevPt = pt; width = w; height = h;
  60.     }
  61.     public PromptStatus DragMe()
  62.     {
  63.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  64.       Database db = Application.DocumentManager.MdiActiveDocument.Database;
  65.       Point3d p1 = basePt;
  66.       Point3d p2 = basePt + new Vector3d(width, 0, 0);
  67.       Point3d p3 = basePt + new Vector3d(0, height, 0);
  68.       AlignedDimension dim1 = new AlignedDimension();
  69.       dim1.DynamicDimension = true;
  70.       AlignedDimension dim2 = new AlignedDimension();
  71.       dim2.DynamicDimension = true;
  72.       DynamicDimensionData ddim1 = new DynamicDimensionData(dim1, true, false);
  73.       ddim1.Editable = true; ddim1.Focal = true;
  74.       dimCol.Add(ddim1);
  75.       DynamicDimensionData ddim2 = new DynamicDimensionData(dim2, true, false);
  76.       ddim2.Editable = true; ddim2.Focal = true;
  77.       dimCol.Add(ddim2);
  78.       UpdateDimensions();
  79.       PromptResult res;
  80.       while ((res = ed.Drag(this)).Status == PromptStatus.Other);
  81.       return (res.Status == PromptStatus.None) ? PromptStatus.OK : res.Status;
  82.     }
  83.     protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  84.     {
  85.       Point3dCollection pts = new Point3dCollection();
  86.       pts.Add(basePt);
  87.       pts.Add(basePt + new Vector3d(0, height, 0));
  88.       pts.Add(basePt + new Vector3d(width, height, 0));
  89.       pts.Add(basePt + new Vector3d(width, 0, 0));
  90.       pts.Add(basePt);
  91.       return draw.Geometry.Polygon(pts);
  92.     }
  93.  
  94.     protected override DynamicDimensionDataCollection GetDynamicDimensionData(double dimScale)
  95.     {
  96.       return dimCol;
  97.     }
  98.  
  99.     protected override void OnDimensionValueChanged(DynamicDimensionChangedEventArgs e)
  100.     {
  101.       switch (e.Index)
  102.       {
  103.         case 0:
  104.           if (e.Value.ToString() != "0")
  105.           {
  106.             width = e.Value * Math.Sign(prevPt.X - basePt.X);
  107.             bFixWidth = true;
  108.           }
  109.           else
  110.           {
  111.             bFixWidth = false;
  112.           }
  113.  
  114.           break;
  115.         case 1:
  116.           if (e.Value.ToString() != "0")
  117.           {
  118.             height = e.Value * Math.Sign(prevPt.Y - basePt.Y);
  119.             bFixHeight = true;
  120.           }
  121.           else
  122.           {
  123.             bFixHeight = false;
  124.           }
  125.  
  126.           break;
  127.       }
  128.       UpdateDimensions();
  129.     }
  130.  
  131.     protected override SamplerStatus Sampler(JigPrompts prompts)
  132.     {
  133.       JigPromptPointOptions jigOpts = new JigPromptPointOptions();
  134.       jigOpts.UserInputControls =
  135.         ( UserInputControls.Accept3dCoordinates | UserInputControls.NullResponseAccepted);
  136.       jigOpts.BasePoint = basePt;
  137.       jigOpts.UseBasePoint = true;
  138.       jigOpts.Cursor = CursorType.RubberBand;
  139.  
  140.       jigOpts.Message = "\nУкажите диагональную точку: ";
  141.       PromptPointResult dres = prompts.AcquirePoint(jigOpts);
  142.       if (dres.Status != PromptStatus.OK && dres.Status != PromptStatus.Other)
  143.         return SamplerStatus.Cancel;
  144.       if (dres.Status == PromptStatus.OK)
  145.       {
  146.         Point3d curPt = dres.Value;
  147.         if (curPt.DistanceTo(prevPt) < 1e-3)
  148.           return SamplerStatus.NoChange;
  149.         prevPt = curPt;
  150.         if (!bFixWidth)
  151.           width = Math.Max(Math.Abs(curPt.X - basePt.X), minWidth) * Math.Sign(curPt.X - basePt.X);
  152.         if (!bFixHeight)
  153.           height = Math.Max(Math.Abs(curPt.Y - basePt.Y), minHeight) * Math.Sign(curPt.Y - basePt.Y);
  154.       }
  155.       UpdateDimensions();
  156.       return SamplerStatus.OK;
  157.     }
  158.  
  159.     protected void UpdateDimensions()
  160.     {
  161.       Point3d p1 = basePt;
  162.       Point3d p2 = basePt + new Vector3d(width, 0, 0);
  163.       Point3d p3 = basePt + new Vector3d(0, height, 0);
  164.       Point3d p4 = basePt + new Vector3d(width, height, 0);
  165.       AlignedDimension dim;
  166.       dim = dimCol[0].Dimension as AlignedDimension;
  167.       dim.XLine1Point = p1;
  168.       dim.XLine2Point = p2;
  169.       dim.DimLinePoint = p1 + (p2 - p1) * 0.5 -
  170.         new Vector3d(0, minHeight, 0) * Math.Sign(p4.Y - p1.Y);
  171.       dim = dimCol[1].Dimension as AlignedDimension;
  172.       dim.XLine1Point = p1;
  173.       dim.XLine2Point = p3;
  174.       dim.DimLinePoint = p1 + (p3 - p1) * 0.5 -
  175.         new Vector3d(minWidth, 0, 0) * Math.Sign(p4.X - p1.X);
  176.     }
  177.   }
  178. }

И вот так это выглядит:



Хочу обратить внимание на несколько моментов:
1. Editor.Drag(...) приходится зацикливать, так как переход от одного к другому размеру возвращает PromptStatus.Other.
2. Чтобы можно было выйти из цикла по Enter приходится добавлять флаг UserInputControls.NullResponseAccepted к jigOpts.UserInputControls
3. После задания одного из размеров он фиксируется. Чтобы снять фиксацию нужно ввести в поле размера 0.
« Последнее редактирование: 02-09-2016, 00:28:21 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #92 : 02-09-2016, 14:35:08 »
К сожалению (как обычно) в AutoCAD .NET API есть ограничения по сравнению с чистым ObjectARX. Одно из них невозможность задавать дополнительные параметры DynamicDimensionData, которые есть у его "native родителя" - AcDbDimData. В частности у AcDbDimData есть метод setConstrain, который позволяет установить значок блокировки для размера, который явно указывает, что этот размер остаётся неизменным:



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

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #93 : 02-09-2016, 17:14:37 »
Это был ответ от ADN? А с какой целью так сделано не пояснили?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #94 : 02-09-2016, 17:38:33 »
Это был ответ от ADN? А с какой целью так сделано не пояснили?
Это мой ответ. От ADN пока ничего.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #95 : 02-09-2016, 18:06:59 »
А с какой целью так сделано не пояснили?
А это ты про что? Я не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #96 : 02-09-2016, 18:16:05 »
Я так понимаю, что NET API это обёртка над ObjectARX, причем активно продвигаемая в массы. Вот и не понятно зачем кастрировать эту обёртку, дать сам метод OnDimensionValueChanged и не давать с ним работать, в чем смысл?
Может вообще пользоваться динамическими размерами в DrawJig ( net api) не надо (не рекомендуется). Я без претензий, просто буду знать, что если захочется динимических размеров, то пользуйся EntityJig. Если без них и много объектов, то DrawJig.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #97 : 02-09-2016, 18:36:54 »
Вот и не понятно зачем кастрировать эту обёртку
Умышленно никто ничего не кастрировал. Просто для полноценной реализации этой обертки потребовались еще значительные усилия (время и деньги) - эта обертка не делается автоматически. Видимо решили, что на это не стоит тратить силы...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #98 : 02-09-2016, 18:39:01 »
Я без претензий, просто буду знать, что если захочется динимических размеров, то пользуйся EntityJig.
Ты что пропустил всё мое общение с Димой и вот этот пример: http://adn-cis.org/forum/index.php?topic=7251.msg22179#msg22179 ???
Так и для кого я старался???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #99 : 05-09-2016, 06:48:13 »
Видимо решили, что на это не стоит тратить силы.
Понятно, спасибо за разъяснения и за код (http://adn-cis.org/forum/index.php?topic=7251.msg22179#msg22179) сходу не понял в чем различия, а скомпилировав... событие работает, буду разбираться. Соответственно вопросов про применимость больше не возникает. Буду учиться.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #100 : 05-09-2016, 09:36:33 »
сходу не понял в чем различия
Различие в том, что используется AcquirePoint, а не AcquireDistance.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #101 : 09-09-2016, 12:17:49 »
Различие в том, что используется AcquirePoint, а не AcquireDistance.
В ADN DevHelp решили, что это неправильное поведение (т.е. вроде должно работать с обеими методами) и отправили запрос в DevTeam.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #102 : 15-10-2016, 14:51:22 »
Александр Ривилис, только сейчас очень плотно засел за динамические размеры (интересует 2 и более).
Возник вопрос насчет Вашего кода:
Я сделал тестовый пример с двумя динамическими размерами. Может быть будет интересно.
Все-таки OnDimensionValueChanged же не срабатывает! Именно для этих целей и был прописан UpdateDimensions? Если да, то почему тогда оставили OnDimensionValueChanged, он ведь реально не делает ничего.. :(

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #103 : 15-10-2016, 14:56:32 »
Все-таки OnDimensionValueChanged же не срабатывает!
Как же не срабатывает, когда он срабатывает. Иначе фиксация размеров не происходила бы...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: В чем отличия EntytyJig от DrawJig?
« Ответ #104 : 15-10-2016, 15:05:16 »
Как же не срабатывает, когда он срабатывает.
Извините, что-то я тупанул. Он срабатывает каждый раз после ввода значения динамического размера.
А не могли бы Вы пояснить физический смысл UpdateDimensions?
И еще, я не могу понять, как задавать динамический угол, используя AlignedDimension?