Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?

Автор Тема: Как сделать чтобы при выборе первой точки до второй растягивалась "резинка"?  (Прочитано 9406 раз)

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

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Код - 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 в автокаде?
Спасибо...
« Последнее редактирование: 09-01-2015, 14:41:11 от Agens »
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Мне кажется, что это не совсем ObjectARX, а .NET. И перед запросом второй точки посмотри свойство UseBasePoint для pPtOpts (кажется, так называется).
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
да .NET, просто в теме задал, новую не стал создавать...
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Тема отделена. Есть правило: один вопрос - одна тема. Иначе потом вообще ничего будет не найти.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
По-моему, порядок получения второй точки должен быть наподобие:
Код - 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);
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). BasePoint задается в МСК, а Editor.GetPoint возвращает точку в ПСК.

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
Спасибо, добавил две строчки (между 31 и 32 строкой, см. начальный код)...
Код - C# [Выбрать]
  1.  pPtOpts.BasePoint = ptStart;
  2.  pPtOpts.UseBasePoint = true;
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). BasePoint задается в МСК, а Editor.GetPoint возвращает точку в ПСК.
О, спасибо :)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN OPEN
  • ***
  • Сообщений: 223
  • Карма: 0
это если пользователь меняет МСК на ПСК?
VS2019, VBA 7.1, VB.NET, C#, ACAD2019, Revit 2020

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Я полагаю, что касается это не всех примитивов. Наверняка для LWPOLYLINE, CIRCLE и прочих примитивов, для построения которых используется OCS, точки могут обрабатываться в системе координат объекта. Но далеко не уверен :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). BasePoint задается в МСК, а Editor.GetPoint возвращает точку в ПСК.
Кстати, в чистом ObjectArx и AutoLisp это не так. Что-то разработчики перемудрили.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я полагаю, что касается это не всех примитивов. Наверняка для LWPOLYLINE, CIRCLE и прочих примитивов, для построения которых используется OCS, точки могут обрабатываться в системе координат объекта. Но далеко не уверен :(
Леша. А причем здесь система координат объекта и ПСК/МСК при вводе точек?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Значит, меня переклинило :) Сорри ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Тут, кстати, есть один неочевидный момент (для меня по крайней мере). 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, которая оперирует точками в МСК.
« Последнее редактирование: 23-09-2015, 19:14:18 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Хм... Завтра выйду на работу - проверю. Недавно совсем как раз с этим были проблемы.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну и заодно уточни версию AutoCAD, в которой это проявляется - проверю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Проверил. Да, виноват, ввел в заблуждение и себя и вас :)
У меня отрисовка идет с помощью создания временного объекта Line (уже не помню, чем стандартная резиновая линия не устроила), а ей подходят точки только в МСК. Запутался, потому что сделал свой метод расширения с названием, похожим на стандартный метод:
Код - C# [Выбрать]
  1. PromptPointResult secondPtRes = ed.GetSecondPoint(secondPtOpt);
Значит, все в порядке - обе точки в ПСК.