Границы Текста в марке

Автор Тема: Границы Текста в марке  (Прочитано 3266 раз)

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

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Границы Текста в марке
« : 25-03-2019, 17:19:04 »
Как получить границы текста марки  на 3D виде (мне нужно создать солид в Ревит , контур которого образуют эти линии)?




Отмечено как Решение enot 26-03-2019, 11:17:43

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Границы Текста в марке
« Ответ #1 : 25-03-2019, 18:25:02 »
В общем случае, к сожалению, никак.

Под конкретное семейство марки можно реализовать следующее.

1) Зная, из каких параметров собирается текст - получить маркируемый элемент, значения этих параметров, собрать текст.
- Во временной транзакции -
2) Создать временный чертёжный вид, установить масштаб 1:1
3) Зная шрифт, размер и прочие параметры создать TextNoteType, затем TextNote с текстом из п.1.
4) doc.Regenerate()
5) Получить размеры созданной в п.3 TextNote
- RollBack временной транзакции -

Дальше из вида взять Right, Up, View direction, из марки - TagHeadPosition - создать Transform, использовать его для преобразований линий Sketch-а будущего Solid-а, не забывая про view.Scale.

В общем, всё сложно под каждую марку прийдется настраивать, к тому же учитывая положение текста в самом семействе марки.

Если ещё TextElement-ы можно получить из семейства, учесть их координаты, то самая засада в том, что сейчас пока нельзя получить из чего состоит значение параметра "Метка" (в самом семействе марки задается, из каких параметров она состоит, пробелы, префиксы, суффиксы и т.д.

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Границы Текста в марке
« Ответ #2 : 25-03-2019, 18:42:07 »
самая засада в том, что сейчас пока нельзя получить из чего состоит значение параметра "Метка" (в самом семействе марки задается, из каких параметров она состоит, пробелы, префиксы, суффиксы и т.д.
Ага, можем только получить Tag.Text как слипнувшийся текст из всех параметров

Ну , ок . Примем что геометрию будем брать не из инстансов меток в модели, а просто возьмем контур текста внутри основного семейства (т.е. везде одинаковый).
Далее я создал метод , который вернет нам эту геометрию


Код - C# [Выбрать]
  1.         public static Solid GET_TEXT_SOLID_FROM_IndependentTag(IndependentTag independentTag)
  2.         {
  3.  
  4.             Solid Sum_solid = null;
  5.  
  6.             Document doc = independentTag.Document;
  7.  
  8.             FamilySymbol tagType = independentTag.Document.GetElement(independentTag.GetTypeId()) as FamilySymbol;
  9.  
  10.             Family family = tagType.Family;
  11.  
  12.             Document familyDoc = doc.EditFamily(family);
  13.            
  14.             if (null != familyDoc && familyDoc.IsFamilyDocument == true)
  15.             {              
  16.                 var collector = new FilteredElementCollector(familyDoc).OfClass(typeof(TextElement)).Cast<TextElement>();
  17.                
  18.                 var familyView = new FilteredElementCollector(familyDoc).OfClass(typeof(Autodesk.Revit.DB.View)).Cast<Autodesk.Revit.DB.View>().FirstOrDefault();
  19.                
  20.                 foreach (TextElement x in collector)
  21.                 {
  22.                     var bb =x.get_BoundingBox(familyView);                                    
  23.                                                  
  24.                     Solid solid = CreateSolidFromBoundingBox(bb);
  25.  
  26.                     if (Sum_solid == null)
  27.                     {
  28.                         Sum_solid = solid;
  29.                     }
  30.  
  31.                     else
  32.                     {
  33.                         try
  34.                         {
  35.                             Sum_solid = BooleanOperationsUtils.ExecuteBooleanOperation(Sum_solid, solid, BooleanOperationsType.Union);
  36.                         }
  37.  
  38.                         catch { }
  39.                     }                    
  40.                 }
  41.             }
  42.             return Sum_solid;
  43.         }
  44.  

В итоге получу солиды в модели , не привязанные к расположению конкретной марки и лежащие в плоскости XY.
Далее вопрос: как мне эти солиды "совместить" со своей маркой на 3D виде?


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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Границы Текста в марке
« Ответ #3 : 25-03-2019, 18:47:28 »
Дальше из вида взять Right, Up, View direction, из марки - TagHeadPosition - создать Transform

Это из 3D-вида в проекте

Используйте метод SolidUtils.CreateTransformed. Не забудьте только ещё про масштаб вида

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Границы Текста в марке
« Ответ #4 : 25-03-2019, 19:27:51 »
Пока удалось переместить солид в точку метки

Код - C# [Выбрать]
  1.   Solid preTrans_solid = CreateSolidFromBoundingBox(bb);            
  2.  
  3.    var transform_Translation = Transform.CreateTranslation(independentTag.TagHeadPosition);
  4.    var solid_Translation = SolidUtils.CreateTransformed(preTrans_solid, transform_Translation);

далее как использовать
Цитировать
Дальше из вида взять Right, Up, View direction
в SolidUtils ?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Границы Текста в марке
« Ответ #5 : 25-03-2019, 21:16:31 »
в SolidUtils ?

Из 3D вида

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Границы Текста в марке
« Ответ #6 : 25-03-2019, 21:21:51 »
Из 3D вида
получил из 3D вида , далее нужно использовать в 
var transform = Transform.CreateTranslation( ...?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Границы Текста в марке
« Ответ #7 : 25-03-2019, 21:37:26 »
Код - C# [Выбрать]
  1. var transform = Transform.Identity;
  2. transform.BasisX = view.RightDirection;
  3. ...

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Границы Текста в марке
« Ответ #8 : 26-03-2019, 09:58:34 »
Спасибо :) это получилось
осталось масштабировать объект , подскажите как это сделать правильно?
пробую как то так (ничего не меняется):
Код - C# [Выбрать]
  1. transform.ScaleBasisAndOrigin ( doc.ActiveView.Scale);

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Границы Текста в марке
« Ответ #9 : 26-03-2019, 11:06:04 »
пробую как то так (ничего не меняется):
Код - C# [Выбрать]

    transform.ScaleBasisAndOrigin ( doc.ActiveView.Scale);


этот метод возвращает новый Transform, а не меняет свойства в текущем, плюс, наверное, нужен только scale basis, иначе Origin улетит далеко

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Re: Границы Текста в марке
« Ответ #10 : 26-03-2019, 11:10:50 »
нужен только scale basis

этот метод возвращает новый Transform, а не меняет свойства в текущем

Все , понял, спасибо! Все получилось  :D