uidoc.Selection.PickElementsByRectangle => Rectangle

Автор Тема: uidoc.Selection.PickElementsByRectangle => Rectangle  (Прочитано 5187 раз)

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

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

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Есть ли способ получить Rectangle
для дальнейшего получения XYZ его вершин

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

из  uidoc.Selection.PickElementsByRectangle ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #1 : 05-02-2019, 13:10:15 »
Нет. Используйте Selection.PickBox, затем уже ищите элементы внутри этого Box-а

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #2 : 05-02-2019, 14:52:35 »
Цитировать
затем уже ищите элементы внутри этого Box-а
но в PickBox нет метода отвечающего за это

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #3 : 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() => выдает ноль элементов

В чем может быть причина?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #4 : 05-02-2019, 16:06:50 »
Вероятно, pickedBox по одному из направлений плоский

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #5 : 05-02-2019, 16:09:39 »
Думаю , на плане это бы работало, но тут разрез и нужна какая то корректирующая примочка наподобие вами предоставленной UpDirection
из
http://adn-cis.org/forum/index.php?topic=9069.0

Прошу прощения, я забыл указать что у меня разрез!

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #6 : 05-02-2019, 16:23:19 »
у вида есть ещё ViewDirection, можете его попробовать.

А вообще, к чему это? Зачем нужен этот прямоугольник? Может, достаточно у выбранных элементов получить boundingbox-ы и их объединить, не?

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #7 : 05-02-2019, 16:30:51 »
мне на разрезе нужно прямоугольником выбрать элементы, которые он пересекает , а также получить точки этого прямоугольника (Min, Max)

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

Но прямоугольник дает больше опций в плане что можно к нему применить BoundingBoxIntersectsFilter , либо BoundingBoxIsInsideFilter

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #8 : 06-02-2019, 10:53:45 »
В продолжение темы вопрос:
как получить Reference уровней на разрезе для создания размера?



Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #9 : 06-02-2019, 10:54:42 »
Код - C# [Выбрать]
  1. var reference = new Reference(level);

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #10 : 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

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #11 : 10-02-2019, 12:21:41 »
у вида есть ещё ViewDirection, можете его попробовать.
судя по всему, ViewDirection изменить нельзя? (он ReadOnly )

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #12 : 10-02-2019, 12:45:00 »
Хотите камеру 3D вида подвигать чтоли? Тогда нужны методы GetOrientation / SetOrientation.

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #13 : 10-02-2019, 14:09:43 »
хочу использовать PickPoint() на разрезе , но, видимо, его можно использовать только на плане...

Отмечено как Решение enot 10-02-2019, 17:07:23

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #14 : 10-02-2019, 14:19:42 »
На разрезе тоже можно. Только перед вызовом PickPoint() надо создать рабочую плоскость. Можно получить CropBox.Transform, из него взять Origin и Normal, по ним создать Plane, из него SketchPlane и присвоить view.SketchPlane

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #15 : 10-02-2019, 14:31:13 »
Можно получить CropBox.Transform, из него взять Origin и Normal
из CropBox.Transform => Origin = CropBox.Transform.Origin  , а как получить Normal из  CropBox.Transform ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #16 : 10-02-2019, 14:39:38 »
BasisZ

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #17 : 10-02-2019, 14:52:53 »
Подошел Basis.X , CropBox.Transform.Origin  => это точка, находящаяся в геометрическом центре CropBox ?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #18 : 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.  

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: uidoc.Selection.PickElementsByRectangle => Rectangle
« Ответ #19 : 10-02-2019, 17:08:14 »
Все получилось, Спасибо!!