Спроецировать точку на вид профиля

Автор Тема: Спроецировать точку на вид профиля  (Прочитано 7913 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Подскажите пожалуйста, как спроецировать точку COGO на вид профиля.
« Последнее редактирование: 26-12-2015, 14:14:29 от Захаров Максим »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Насколько я помню, точки COGO не имеют отображения на виде профиля, как например труба или колодец. Или нужно получить значения координат точки на виде профиля?

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Согланен. Координаты знаю как получить на виде профиля. А как объект то создать, ведь он должен быть связан с обектов на чертеже

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Получается, нужно добавить в сивил функционал по отображению COGO точки на виде профиля. Можно создавать блок для отображения точки на виде профиля, связывать его с событиями изменения точки в модели... Но если бы такая задача стояла передо мной, я бы попробовал реализовать это через Overrule.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Ну думаю это крайний случай. Ведь стандартными средствами сивила это сделать не проблема. Создается объект на виде прифиля который связан динамически с объектом на чертеже. Напоимер если посмотреть свойства спроецированного объекта то это та же точка сого, только есть приписка что это проекция. Вот я и думаю может в ipi есть специальная функция по проецированию объектов (блоков полилиний ну и точек гого)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй командным методом (команда ProjectObjectsToProf)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
И еще посмотри тему: https://forums.autodesk.com/t5/autocad-civil-3d-customization/projecting-objects-to-profile-in-vb-net/td-p/3778808
Возможно это то, что тебе нужно или наведёт на решение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Спасибо Александр. Посмотрел тему, попробуем. Странно, трассу можно спроецировать а сторонний объект нет. Я так понял что это возможно через com

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Да, действительно, точку можно спроецировать на вид профиля стандартным инструментом ProjectObjectsToProf. Не знал этого раньше. При этом создается дополнительное отображение этой же самой точки на виде профиля. То есть, не так как в трубопроводной сети - в модели один объект, на  виде профиля другой. Но при этом, можно их выбрать по отдельности и удалить точку на виде профиля без удаления точки в модели.
В общем, довольно интересный, но совершенно непонятно как работающий механизм.
Как такое сделать программно, я не нашел ни в NET, ни в COM. Скорее всего, пока такой возможности нет. Но лучше спросить об этом в ADN DevHelp.

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

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

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Re: Спроецировать точку на вид профиля
« Ответ #10 : 28-12-2015, 10:03:23 »
Спасибо большое Александр, буду очень признателен. И тебе Дмитрий.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Спроецировать точку на вид профиля
« Ответ #11 : 28-12-2015, 18:41:20 »
Еще с утра отправил. Ждём.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Александр Ривилис 30-11-2016, 18:31:45

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Спроецировать точку на вид профиля
« Ответ #12 : 13-01-2016, 23:28:16 »
Получил сегодня ответ от ADN DevHelp - как и предполагалось в Civil 3D API такой возможности нет. Теоретически это должен был бы один из методов класса ProfileProjection, но они не реализованы. Так что только командным методом.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 139
  • Карма: 3
Re: Спроецировать точку на вид профиля
« Ответ #13 : 14-01-2016, 18:05:42 »
Спасибо Александр, пойду другим путем, придется наверное блоки в профиль вставлять.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Спроецировать точку на вид профиля
« Ответ #14 : 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. }
В этом случае, будет динамическая связь между точкой на плане и точкой на виде профиля. Это позволит избежать ошибок в чертежах: