Создание Dimension между двумя точками Revit API C#

Автор Тема: Создание Dimension между двумя точками Revit API C#  (Прочитано 9616 раз)

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

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Здравствуйте! Мне нужно найти расстояние между двумя точками. Я использую Dimension.
Но при попытки построения, вылетает исключение "Autodesk.Revit.Exceptions.InvalidOperationException". Как можно это исправить?


Код - C# [Выбрать]
  1. namespace PickObject
  2. {
  3.     [Transaction(TransactionMode.Manual)]
  4.     public class Command : IExternalCommand
  5.     {
  6.        
  7.  
  8.         public Result Execute(
  9.           ExternalCommandData commandData,
  10.           ref string message,
  11.           ElementSet elements)
  12.         {
  13.             UIApplication uiapp = commandData.Application;
  14.             UIDocument uidoc = uiapp.ActiveUIDocument;
  15.             Application app = uiapp.Application;
  16.             Document doc = uidoc.Document;
  17.  
  18.             using (Transaction tx = new Transaction(doc))
  19.             {
  20.                 tx.Start("Start");
  21.  
  22.                 PickPoint(uidoc, app);
  23.  
  24.             tx.Commit();
  25.         }
  26.  
  27.             return Result.Succeeded;
  28.                
  29.         }
  30.  
  31.  
  32.         public void PickPoint(UIDocument uidoc, Application app) {
  33.             View activeView = uidoc.ActiveView;
  34.             SketchPlane sketch = activeView.SketchPlane;
  35.             ObjectSnapTypes snapTypes = ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections | ObjectSnapTypes.Points | ObjectSnapTypes.Perpendicular;
  36.             XYZ startPoint;
  37.             XYZ endPoint;
  38.  
  39.  
  40.                 Plane geometryPlane = Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero);
  41.  
  42.                 sketch = SketchPlane.Create(uidoc.Document, geometryPlane);
  43.  
  44.                 uidoc.Document.ActiveView.SketchPlane = sketch;
  45.                 uidoc.Document.ActiveView.ShowActiveWorkPlane();
  46.              
  47.             try
  48.             {
  49.                 startPoint = uidoc.Selection.PickPoint(snapTypes, "Select start point");
  50.                 endPoint = uidoc.Selection.PickPoint(snapTypes, "Select end point");
  51.                
  52.             }
  53.  
  54.             catch(Autodesk.Revit.Exceptions.OperationCanceledException oc)
  55.             {
  56.                 Console.WriteLine(oc.Message);
  57.                 return;
  58.             }
  59.             catch(Autodesk.Revit.Exceptions.InvalidOperationException oe)
  60.             {
  61.                 Console.WriteLine(oe.Message);
  62.                 TaskDialog.Show("Revit", "No work plane set in current view.");
  63.                 return;
  64.  
  65.             }
  66.             catch (Autodesk.Revit.Exceptions.ArgumentNullException n)
  67.             {
  68.                 Console.WriteLine(n.Message);
  69.                 return;
  70.             } //Выбор точек
  71.  
  72.             double dist = startPoint.DistanceTo(endPoint);
  73.  
  74.             string distance = "Distance is " + dist.ToString();
  75.             string strCoords = "Selected start point is " + startPoint.ToString() + "\nSelected end point is " + endPoint.ToString() + distance;
  76.             Line line = Line.CreateBound(startPoint, endPoint);
  77.             CreateLinearDimension(uidoc.Document, startPoint, endPoint, sketch, app);
  78.             TaskDialog.Show("Revit", strCoords);
  79.        
  80.         }
  81.  
  82.  
  83.         public Dimension CreateLinearDimension(
  84.       Document doc, XYZ pt1, XYZ pt2, SketchPlane sketch, Application app)
  85.         {          
  86.            
  87.                 // first create line
  88.  
  89.                 Line line = Line.CreateBound(pt1, pt2);
  90.  
  91.             ModelCurve modelcurve = doc.Create
  92.               .NewModelCurve(line, sketch);
  93.  
  94.  
  95.                ReferenceArray ra = new ReferenceArray();
  96.                ra.Append(modelcurve.GeometryCurve.Reference);
  97.  
  98.             return doc.Create.NewDimension(doc.ActiveView, line, ra);
  99.         }
  100.  
  101.  
  102.  
  103.     }
  104.  
  105. }


Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Во-первых - размер нельзя создавать по одному Reference! Минимум два их должно быть
Во-вторых - зачем создавать размер чтобы узнать расстояние между точками?!?!?  :o Что за извращение такое? Для этого есть метод XYZ.DistanceTo(XYZ source)

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Про Reference я уже догадалась)
Да? А как мне можно по-другому сделать отметку на плане?  ???

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Мне нужно найти расстояние между двумя точками.
Да? А как мне можно по-другому сделать отметку на плане?
Я пока что не понимаю, что вы хотите сделать

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Вот, на скрине то как работает мой код
В общем, мне это и нужно было)

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Я так понимаю, что вы хотите поставить размер между двумя точкам. Верно?
Тогда зачем вам создавать ModelCurve? Пробуйте сразу на точки размер и поставить.

Кстати, что представляют из себя эти точки? Это элемент Point? Я просто с точками не работал - не приходилось. Но, если я правильно предполагаю, что эти точки - это элементы модели, то вы можете все сделать в разы проще - просто используйте метод PickObject, вместо PickPoint. Обратите внимание что этот метод сразу возвращает Reference и вам останется только создать размер

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
Да, нужно поставить размер
Одна из точек должна быть элементом модели, а вторая точка из облака точек, которое загружается через связь. Думаю, PickObject тут не очень подойдет
Попробую сделать сразу на точки

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Думаю, PickObject тут не очень подойдет
Зря так думаете. Но дело ваше.
И кстати, вы должны понимать, что размер можно поставить только на элемент, который присутствует в модели! Создать временную линию и поставить на неё размер (как вы пытались) - не прокатит! Это вам не автокад ))

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
а разве PickObject не будет выделать все облако точек полностью?
Я просто не так давно разбираюсь в ревите, не понимаю, как многое работает
Почему не прокатит, если плагин работает?  :(

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
а разве PickObject не будет выделать все облако точек полностью?
Не могу, к сожалению, сказать, так как не работал с облаком точек, да и негде взять пример для тестов
Почему не прокатит, если плагин работает?
Так я не пойму - работает или нет? Мы же вроде в этой теме обсуждаем, что не работает

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

  • ADN OPEN
  • Сообщений: 14
  • Карма: 0
не работало из-за Reference, а сейчас все в порядке. Скрин, который я прикрепляла это и есть результат этой программы