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

ADN Club => Revit API => Тема начата: enot от 05-02-2019, 12:57:24

Название: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 05-02-2019, 12:57:24
Есть ли способ получить Rectangle
для дальнейшего получения XYZ его вершин

Аналогично, как , например, для pickedBox : XYZ pt= pickedBox.Min;

из  uidoc.Selection.PickElementsByRectangle ?
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 05-02-2019, 13:10:15
Нет. Используйте Selection.PickBox, затем уже ищите элементы внутри этого Box-а
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 05-02-2019, 14:52:35
Цитировать
затем уже ищите элементы внутри этого Box-а
но в PickBox нет метода отвечающего за это
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 05-02-2019, 16:03:55
пока вижу единственный вариант:

 
Код - C# [Выбрать]
  1.  PickedBox pickedBox = uidoc.Selection.PickBox(PickBoxStyle.Crossing);
  2.             Outline outline = new Outline(pickedBox.Min, pickedBox.Max);        
  3.  
  4.             BoundingBoxIntersectsFilter bbfilter  = new BoundingBoxIntersectsFilter(outline);
  5.             var els = new FilteredElementCollector(doc, doc.ActiveView.Id).WherePasses(bbfilter).ToElements();

Однако,

       
Код - C# [Выбрать]
  1.      MessageBox.Show(els.Count().ToString());  
els.Count() => выдает ноль элементов

В чем может быть причина?
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 05-02-2019, 16:06:50
Вероятно, pickedBox по одному из направлений плоский
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 05-02-2019, 16:09:39
Думаю , на плане это бы работало, но тут разрез и нужна какая то корректирующая примочка наподобие вами предоставленной UpDirection
из
http://adn-cis.org/forum/index.php?topic=9069.0

Прошу прощения, я забыл указать что у меня разрез!
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 05-02-2019, 16:23:19
у вида есть ещё ViewDirection, можете его попробовать.

А вообще, к чему это? Зачем нужен этот прямоугольник? Может, достаточно у выбранных элементов получить boundingbox-ы и их объединить, не?
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 05-02-2019, 16:30:51
мне на разрезе нужно прямоугольником выбрать элементы, которые он пересекает , а также получить точки этого прямоугольника (Min, Max)

Либо, ткнуть на две точки , и получить линию => получить элементы , которые эта линия пересекает

Но прямоугольник дает больше опций в плане что можно к нему применить BoundingBoxIntersectsFilter , либо BoundingBoxIsInsideFilter
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 06-02-2019, 10:53:45
В продолжение темы вопрос:
как получить Reference уровней на разрезе для создания размера?

(https://i.postimg.cc/dhmZBfqb/dim-levels.png) (https://postimg.cc/dhmZBfqb)
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 06-02-2019, 10:54:42
Код - C# [Выбрать]
  1. var reference = new Reference(level);
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 06-02-2019, 11:05:46
Ага)
 я просто забыл добавить уровни в список...

Сохраню сюда также ссылки, помогающие в решение моего вопроса, чтобы не забыть

http://adn-cis.org/forum/index.php?topic=3121.0

http://adn-cis.org/ploskosti-proekczii-i-vyibrannyie-tochki.html
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 10-02-2019, 12:21:41
у вида есть ещё ViewDirection, можете его попробовать.
судя по всему, ViewDirection изменить нельзя? (он ReadOnly )
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 10-02-2019, 12:45:00
Хотите камеру 3D вида подвигать чтоли? Тогда нужны методы GetOrientation / SetOrientation.
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 10-02-2019, 14:09:43
хочу использовать PickPoint() на разрезе , но, видимо, его можно использовать только на плане...
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 10-02-2019, 14:19:42
На разрезе тоже можно. Только перед вызовом PickPoint() надо создать рабочую плоскость. Можно получить CropBox.Transform, из него взять Origin и Normal, по ним создать Plane, из него SketchPlane и присвоить view.SketchPlane
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 10-02-2019, 14:31:13
Можно получить CropBox.Transform, из него взять Origin и Normal
из CropBox.Transform => Origin = CropBox.Transform.Origin  , а как получить Normal из  CropBox.Transform ?
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 10-02-2019, 14:39:38
BasisZ
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 10-02-2019, 14:52:53
Подошел Basis.X , CropBox.Transform.Origin  => это точка, находящаяся в геометрическом центре CropBox ?
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: Александр Игнатович от 10-02-2019, 15:35:22
BasisX подойти не мог, ты что-то перепутал
Код - C# [Выбрать]
  1.         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
  2.         {
  3.             var uiapp = commandData.Application;
  4.             var uidoc = uiapp.ActiveUIDocument;
  5.  
  6.             var pt = PickPoint(uidoc);
  7.  
  8.             TaskDialog.Show("dev", $"{pt}");
  9.  
  10.             return Result.Succeeded;
  11.         }
  12.  
  13.         private static XYZ PickPoint(UIDocument uidoc)
  14.         {
  15.             var document = uidoc.Document;
  16.  
  17.             var view = uidoc.ActiveGraphicalView;
  18.  
  19.             using (var transactionGroup = new TransactionGroup(document, "temp"))
  20.             {
  21.                 transactionGroup.Start();
  22.  
  23.                 CreateSketchPlane(view);
  24.                
  25.                 try
  26.                 {
  27.                     return uidoc
  28.                         .Selection
  29.                         .PickPoint();
  30.                 }
  31.                 catch (OperationCanceledException)
  32.                 {
  33.                     return null;
  34.                 }
  35.                 finally
  36.                 {
  37.                     transactionGroup.RollBack();
  38.                 }
  39.             }
  40.         }
  41.  
  42.         private static void CreateSketchPlane(View view)
  43.         {
  44.             if (view.SketchPlane != null)
  45.                 return;
  46.  
  47.             var document = view.Document;
  48.  
  49.             using (var transaction = new Transaction(document, "create view sketchplane"))
  50.             {
  51.                 transaction.Start();
  52.  
  53.                 var transform = view.CropBox.Transform;
  54.  
  55.                 var plane = Plane.CreateByNormalAndOrigin(transform.BasisZ, transform.Origin);
  56.  
  57.                 var sketchPlane = SketchPlane.Create(document, plane);
  58.                
  59.                 view.SketchPlane = sketchPlane;
  60.  
  61.                 transaction.Commit();
  62.             }
  63.         }
  64.  
Название: Re: uidoc.Selection.PickElementsByRectangle => Rectangle
Отправлено: enot от 10-02-2019, 17:08:14
Все получилось, Спасибо!!