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

ADN Club => Civil 3D API => Тема начата: Захаров Максим от 26-12-2015, 09:20:05

Название: Спроецировать точку на вид профиля
Отправлено: Захаров Максим от 26-12-2015, 09:20:05
Подскажите пожалуйста, как спроецировать точку COGO на вид профиля.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Дмитрий Загорулькин от 26-12-2015, 15:39:25
Насколько я помню, точки COGO не имеют отображения на виде профиля, как например труба или колодец. Или нужно получить значения координат точки на виде профиля?
Название: Re: Спроецировать точку на вид профиля
Отправлено: Захаров Максим от 26-12-2015, 16:32:57
Согланен. Координаты знаю как получить на виде профиля. А как объект то создать, ведь он должен быть связан с обектов на чертеже
Название: Re: Спроецировать точку на вид профиля
Отправлено: Дмитрий Загорулькин от 26-12-2015, 17:10:37
Получается, нужно добавить в сивил функционал по отображению COGO точки на виде профиля. Можно создавать блок для отображения точки на виде профиля, связывать его с событиями изменения точки в модели... Но если бы такая задача стояла передо мной, я бы попробовал реализовать это через Overrule.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Захаров Максим от 26-12-2015, 18:36:55
Ну думаю это крайний случай. Ведь стандартными средствами сивила это сделать не проблема. Создается объект на виде прифиля который связан динамически с объектом на чертеже. Напоимер если посмотреть свойства спроецированного объекта то это та же точка сого, только есть приписка что это проекция. Вот я и думаю может в ipi есть специальная функция по проецированию объектов (блоков полилиний ну и точек гого)
Название: Re: Спроецировать точку на вид профиля
Отправлено: Александр Ривилис от 26-12-2015, 19:31:52
Попробуй командным методом (команда ProjectObjectsToProf)
Название: Re: Спроецировать точку на вид профиля
Отправлено: Александр Ривилис от 26-12-2015, 19:56:31
И еще посмотри тему: https://forums.autodesk.com/t5/autocad-civil-3d-customization/projecting-objects-to-profile-in-vb-net/td-p/3778808
Возможно это то, что тебе нужно или наведёт на решение.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Захаров Максим от 26-12-2015, 20:26:06
Спасибо Александр. Посмотрел тему, попробуем. Странно, трассу можно спроецировать а сторонний объект нет. Я так понял что это возможно через com
Название: Re: Спроецировать точку на вид профиля
Отправлено: Дмитрий Загорулькин от 27-12-2015, 13:58:54
Да, действительно, точку можно спроецировать на вид профиля стандартным инструментом ProjectObjectsToProf. Не знал этого раньше. При этом создается дополнительное отображение этой же самой точки на виде профиля. То есть, не так как в трубопроводной сети - в модели один объект, на  виде профиля другой. Но при этом, можно их выбрать по отдельности и удалить точку на виде профиля без удаления точки в модели.
В общем, довольно интересный, но совершенно непонятно как работающий механизм.
Как такое сделать программно, я не нашел ни в NET, ни в COM. Скорее всего, пока такой возможности нет. Но лучше спросить об этом в ADN DevHelp.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Александр Ривилис от 27-12-2015, 19:27:12
Отправлю им этот вопрос, но ответа следует ждать после Нового года - каникулы.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Захаров Максим от 28-12-2015, 10:03:23
Спасибо большое Александр, буду очень признателен. И тебе Дмитрий.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Александр Ривилис от 28-12-2015, 18:41:20
Еще с утра отправил. Ждём.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Александр Ривилис от 13-01-2016, 23:28:16
Получил сегодня ответ от ADN DevHelp - как и предполагалось в Civil 3D API такой возможности нет. Теоретически это должен был бы один из методов класса ProfileProjection (http://docs.autodesk.com/CIV3D/2015/ENU/API_Reference_Guide/html/2d9db59c-d031-40e5-9d3a-06f475b4f92a.htm), но они не реализованы. Так что только командным методом.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Захаров Максим от 14-01-2016, 18:05:42
Спасибо Александр, пойду другим путем, придется наверное блоки в профиль вставлять.
Название: Re: Спроецировать точку на вид профиля
Отправлено: Дмитрий Загорулькин от 18-01-2016, 00:30:30
Пример, как это можно сделать через DrawableOverrule:
Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.Geometry;
  4. using Autodesk.AutoCAD.GraphicsInterface;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.Civil.ApplicationServices;
  7. using Autodesk.Civil.DatabaseServices;
  8. using System.Linq;
  9.  
  10. namespace CivilTest
  11. {
  12.     public class PViewCOGOPointCmd
  13.     {
  14.         private static PViewCOGOPointDO _overrule = null;
  15.  
  16.         [CommandMethod("OnOffPViewCogoPoint")]
  17.         public void Run()
  18.         {
  19.             if (_overrule == null)
  20.             {
  21.                 _overrule = new PViewCOGOPointDO();
  22.                 Overrule.AddOverrule
  23.                     (RXClass.GetClass(typeof(CogoPoint)), _overrule, false);
  24.  
  25.             }
  26.             else
  27.             {
  28.                 Overrule.RemoveOverrule
  29.                     (RXClass.GetClass(typeof(CogoPoint)), _overrule);
  30.                 _overrule = null;
  31.             }
  32.             Application.DocumentManager.
  33.                 MdiActiveDocument.Editor.Regen();
  34.         }
  35.     }
  36.  
  37.     public class PViewCOGOPointDO : DrawableOverrule
  38.     {
  39.         static bool NotExist(ObjectId id)
  40.         {
  41.             return id.IsNull
  42.                 || !id.IsValid
  43.                 || id.IsErased
  44.                 || id.IsEffectivelyErased;
  45.         }
  46.  
  47.         public override bool WorldDraw(Drawable drawable, WorldDraw wd)
  48.         {
  49.             if (drawable is CogoPoint)
  50.             {
  51.                 CogoPoint cogoPt = drawable as CogoPoint;
  52.  
  53.                 Database db = HostApplicationServices.WorkingDatabase;
  54.                 CivilDocument cdoc = CivilDocument.GetCivilDocument(db);
  55.                 ObjectId[] alignIds = cdoc.GetAlignmentIds().Cast<ObjectId>().ToArray();
  56.  
  57.                 // Проходим по трассам четрежа
  58.                 foreach (ObjectId alignId in alignIds)
  59.                 {
  60.                     // Если трассы нет
  61.                     if (NotExist(alignId))
  62.                         // Переходим к следующей
  63.                         continue;
  64.  
  65.                     // Пикетаж и смещение точки
  66.                     double station = 0.0, offset = 0.0;
  67.  
  68.                     // Открываем трассу на чтение
  69. #pragma warning disable 618
  70.                     using (Alignment align = alignId.Open
  71.                         (OpenMode.ForRead, false, true) as Alignment)
  72. #pragma warning restore 618
  73.                     {
  74.                         align.StationOffset(cogoPt.Location.X, cogoPt.Location.Y, ref station, ref offset);
  75.  
  76.                         // Получаем виды профилей трассы
  77.                         ObjectId[] alignPViewIds = align.GetProfileViewIds().Cast<ObjectId>().ToArray();
  78.  
  79.                         // проходим по видам профилей
  80.                         foreach (ObjectId pViewId in alignPViewIds)
  81.                         {
  82.                             if (NotExist(pViewId))
  83.                                 continue;
  84. #pragma warning disable 618
  85.                             using (ProfileView pView = pViewId.Open
  86.                                 (OpenMode.ForRead, false, true) as ProfileView)
  87. #pragma warning restore 618
  88.                             {
  89.                                 double pViewCoordX = 0.0, pViewCoordY = 0.0;
  90.  
  91.                                 // Если тока проецируется на вид профиля
  92.                                 if (pView.FindXYAtStationAndElevation(station, cogoPt.Location.Z, ref pViewCoordX, ref pViewCoordY))
  93.                                 {
  94.                                     // Рисуем отображение окружности в этой точке
  95.                                     // Здесь можно отобразить любой объект (кроме маскировки), в том числе и блок
  96.                                     using (Circle ci = new Circle
  97.                                         (new Point3d(pViewCoordX, pViewCoordY, pView.Location.Z),
  98.                                         Vector3d.ZAxis, 2.0))
  99.                                     {
  100.                                         ci.WorldDraw(wd);
  101.                                     }
  102.                                 }
  103.                             }
  104.                         }
  105.                     }
  106.                 }
  107.             }
  108.  
  109.             return base.WorldDraw(drawable, wd);
  110.         }
  111.     }
  112. }
В этом случае, будет динамическая связь между точкой на плане и точкой на виде профиля. Это позволит избежать ошибок в чертежах: