Проблемы с изменением начальной и конечной точки дуговой трубы

Автор Тема: Проблемы с изменением начальной и конечной точки дуговой трубы  (Прочитано 2214 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
В продолжение предыдущей темы: https://adn-cis.org/forum/index.php?topic=9578.msg41153#msg41153
Если попытаться задать новую точку дуговой трубы таким образом, чтобы образовалась новая дуга с центральным углом больше 180 градусов, то могут возникнуть проблемы.
Проверочный код:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Geometry;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.Civil.DatabaseServices;
  7.  
  8. namespace C3dTest
  9. {
  10.     public static class EditCurvePipeTest
  11.     {
  12.         [CommandMethod("SetPipeNewEndPoint")]
  13.         public static void SetPipeNewEndPoint()
  14.         {
  15.             Document adoc = Application.DocumentManager.MdiActiveDocument;
  16.             Editor ed = adoc.Editor;
  17.             Database db = adoc.Database;
  18.  
  19.             PromptEntityOptions pipeOps
  20.                 = new PromptEntityOptions("\nSelect a pipe: ");
  21.             pipeOps.SetRejectMessage("It's not a pipe!");
  22.             pipeOps.AddAllowedClass(typeof(Pipe), true);
  23.             PromptEntityResult pipeRes = ed.GetEntity(pipeOps);
  24.             if (pipeRes.Status != PromptStatus.OK) return;
  25.  
  26.             PromptPointResult ptRes = ed.GetPoint
  27.                 ("\nSelect a new endpoint for the pipe: ");
  28.             if (ptRes.Status != PromptStatus.OK) return;
  29.  
  30.             Point3d selPoint = ptRes.Value
  31.                 .TransformBy(ed.CurrentUserCoordinateSystem);
  32.  
  33.             using (Transaction tr = db.TransactionManager.StartTransaction())
  34.             {
  35.                 Pipe pipe = tr.GetObject(pipeRes.ObjectId, OpenMode.ForWrite) as Pipe;
  36.                 pipe.EndPoint = new Point3d(selPoint.X, selPoint.Y, pipe.EndPoint.Z);
  37.                 tr.Commit();
  38.             }
  39.         }
  40.     }
  41. }
  42.  
Как это выглядит:


Решение - аналогично тому, которое применено тут: https://adn-cis.org/forum/index.php?topic=9578.msg41137#msg41137. То есть - увеличивать дугу по кусочкам. Код оттуда довольно легко адаптируется для этой задачи, поэтому, приводить тут переделанный код не вижу смысла.

Отправил в DevHelp, ID: 15987799

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Дмитрий Загорулькин,
У меня какое-то дежавю уже второй день. Мне кажется, что я с чем-то подобным сталкивался очень много лет назад.  Но это был не Civil 3d, а Autodesk Architecture и не .NET, а OMF.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Всё новое - хорошо забытое старое?  :)