Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Agens от 09-01-2015, 10:24:35

Название: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Agens от 09-01-2015, 10:24:35
Код - C# [Выбрать]
  1. using System;
  2. using System.IO;
  3. using System.Resources;
  4. using Exception = System.Exception;
  5. #if AUTOCAD
  6. using Application = Autodesk.AutoCAD.ApplicationServices.Core.Application;
  7. using Ap = Autodesk.AutoCAD.ApplicationServices;
  8. using Db = Autodesk.AutoCAD.DatabaseServices;
  9. using Ed = Autodesk.AutoCAD.EditorInput;
  10. using Gm = Autodesk.AutoCAD.Geometry;
  11. using Rt = Autodesk.AutoCAD.Runtime;
  12. #endif
  13.  
  14. namespace AGThsDrw
  15. {
  16.     public sealed class AcLineDraw
  17.     {
  18.         [Rt.CommandMethod("AGDrawLine", "AGDrawLine", Rt.CommandFlags.Modal)]
  19.         public void DrLine()
  20.         {
  21.             var doc = Application.DocumentManager.MdiActiveDocument;
  22.             var db = doc.Database;
  23.             using (Db.Transaction tr = db.TransactionManager.StartTransaction())
  24.             {
  25.                 var model = tr.GetObject(Db.SymbolUtilityServices.GetBlockModelSpaceId(db), Db.OpenMode.ForWrite) as
  26.                 Db.BlockTableRecord;
  27.                 Ed.PromptPointOptions pPtOpts = new Ed.PromptPointOptions("");
  28.                 // Prompt for the start point
  29.                 pPtOpts.Message = "\nEnter the start point of the line: ";
  30.                 var pPtRes = doc.Editor.GetPoint(pPtOpts);
  31.                 var ptStart = pPtRes.Value;
  32.                 // Prompt for the end point
  33.                 pPtOpts.Message = "\nEnter the end point of the line: ";
  34.                 pPtRes = doc.Editor.GetPoint(pPtOpts);
  35.                 var ptEnd = pPtRes.Value;
  36.                 Db.Line line1 = new Db.Line(ptStart, ptEnd);
  37.                 line1.SetDatabaseDefaults();
  38.                 if (model != null) model.AppendEntity(line1);
  39.                 tr.AddNewlyCreatedDBObject(line1, true);
  40.                 tr.Commit();
  41.             }
  42.         }
  43.     }
  44. }
Вот код построения линии путем пользовательского выбора двух точек. Все просто.
Вопрос: как сделать чтобы при выборе первой точки до второй растягивалась "резинка" как это бывает при выполнении команды _line в автокаде?
Спасибо...
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка" как это бывает при выпол
Отправлено: Алексей Кулик от 09-01-2015, 13:01:19
Мне кажется, что это не совсем ObjectARX, а .NET. И перед запросом второй точки посмотри свойство UseBasePoint для pPtOpts (кажется, так называется).
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка" как это бывает при выпол
Отправлено: Agens от 09-01-2015, 13:11:00
да .NET, просто в теме задал, новую не стал создавать...
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка" как это бывает при в
Отправлено: Алексей Кулик от 09-01-2015, 14:11:35
Тема отделена. Есть правило: один вопрос - одна тема. Иначе потом вообще ничего будет не найти.
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка" как это бывает при в
Отправлено: Алексей Кулик от 09-01-2015, 14:25:46
По-моему, порядок получения второй точки должен быть наподобие:
Код - C# [Выбрать]
  1.                                 pPtOpts.Message = "\nEnter the end point of the line: ";
  2.                                 pPtOpts.BasePoint = ptStart;
  3.                                 pPtOpts.UseBasePoint = true;
  4.                                 pPtRes = doc.Editor.GetPoint(pPtOpts);
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Дмитрий Загорулькин от 09-01-2015, 14:41:38
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). BasePoint задается в МСК, а Editor.GetPoint возвращает точку в ПСК.
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Agens от 09-01-2015, 14:42:14
Спасибо, добавил две строчки (между 31 и 32 строкой, см. начальный код)...
Код - C# [Выбрать]
  1.  pPtOpts.BasePoint = ptStart;
  2.  pPtOpts.UseBasePoint = true;
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Алексей Кулик от 09-01-2015, 15:19:16
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). BasePoint задается в МСК, а Editor.GetPoint возвращает точку в ПСК.
О, спасибо :)
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Agens от 09-01-2015, 20:21:05
это если пользователь меняет МСК на ПСК?
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Дмитрий Загорулькин от 09-01-2015, 20:25:02
Ага. http://docs.autodesk.com/ACD/2011/RUS/filesAUG/WS1a9193826455f5ffa23ce210c4a30acaf-71e1.htm
Приходится постоянно учитывать такую возможность.
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Алексей Кулик от 09-01-2015, 23:03:53
Я полагаю, что касается это не всех примитивов. Наверняка для LWPOLYLINE, CIRCLE и прочих примитивов, для построения которых используется OCS, точки могут обрабатываться в системе координат объекта. Но далеко не уверен :(
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Александр Ривилис от 09-01-2015, 23:33:06
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). BasePoint задается в МСК, а Editor.GetPoint возвращает точку в ПСК.
Кстати, в чистом ObjectArx и AutoLisp это не так. Что-то разработчики перемудрили.
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Александр Ривилис от 09-01-2015, 23:36:08
Я полагаю, что касается это не всех примитивов. Наверняка для LWPOLYLINE, CIRCLE и прочих примитивов, для построения которых используется OCS, точки могут обрабатываться в системе координат объекта. Но далеко не уверен :(
Леша. А причем здесь система координат объекта и ПСК/МСК при вводе точек?
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Алексей Кулик от 09-01-2015, 23:42:28
Значит, меня переклинило :) Сорри ;)
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Александр Ривилис от 10-01-2015, 00:42:14
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). BasePoint задается в МСК, а Editor.GetPoint возвращает точку в ПСК.
Так! И кто это решил ввести меня в заблуждение???  ;)
Код - C# [Выбрать]
  1.     [CommandMethod("GP")]
  2.     public void GP()
  3.     {
  4.       Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  5.       PromptPointOptions optPt1 = new PromptPointOptions("\nУкажите 1-ую точку: ");
  6.       PromptPointResult resPt1 = ed.GetPoint(optPt1);
  7.       if (resPt1.Status == PromptStatus.OK) {
  8.         PromptPointOptions optPt2 = new PromptPointOptions("\nУкажите 2-ую точку: ");
  9.         optPt2.UseBasePoint = true;
  10.         optPt2.BasePoint = resPt1.Value;
  11.         PromptPointResult resPt2 = ed.GetPoint(optPt2);
  12.       }
  13.     }
Смотрим результат:



Подозреваю что ты перепутал с JigPromptPointOptions.BasePoint, который (не проверял, но скорее всего) работает именно с МСК, т.к. является оболочкой для AcEdJig::acquirePoint, которая оперирует точками в МСК.
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Дмитрий Загорулькин от 11-01-2015, 20:04:47
Хм... Завтра выйду на работу - проверю. Недавно совсем как раз с этим были проблемы.
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Александр Ривилис от 11-01-2015, 20:40:11
Ну и заодно уточни версию AutoCAD, в которой это проявляется - проверю.
Название: Re: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?
Отправлено: Дмитрий Загорулькин от 12-01-2015, 10:50:55
Проверил. Да, виноват, ввел в заблуждение и себя и вас :)
У меня отрисовка идет с помощью создания временного объекта Line (уже не помню, чем стандартная резиновая линия не устроила), а ей подходят точки только в МСК. Запутался, потому что сделал свой метод расширения с названием, похожим на стандартный метод:
Код - C# [Выбрать]
  1. PromptPointResult secondPtRes = ed.GetSecondPoint(secondPtOpt);
Значит, все в порядке - обе точки в ПСК.