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

ADN Club => Civil 3D API => Тема начата: Дмитрий Загорулькин от 22-11-2019, 18:51:51

Название: Проблемы с изменением начальной и конечной точки дуговой трубы
Отправлено: Дмитрий Загорулькин от 22-11-2019, 18:51:51
В продолжение предыдущей темы: 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
Название: Re: Проблемы с изменением начальной и конечной точки дуговой трубы
Отправлено: Александр Ривилис от 22-11-2019, 20:31:46
Дмитрий Загорулькин,
У меня какое-то дежавю уже второй день. Мне кажется, что я с чем-то подобным сталкивался очень много лет назад.  Но это был не Civil 3d, а Autodesk Architecture и не .NET, а OMF.
Название: Re: Проблемы с изменением начальной и конечной точки дуговой трубы
Отправлено: Дмитрий Загорулькин от 25-11-2019, 15:14:59
Всё новое - хорошо забытое старое?  :)