| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > Revit 2019. Делаем макрос для получения размеров пластин

Revit 2019. Делаем макрос для получения размеров пластин

Ответ
Поиск в этой теме
Непрочитано 23.04.2018, 19:41 1 | #1
Revit 2019. Делаем макрос для получения размеров пластин
YarUnderoaker
 
Негропроект, инженегр-конструктор
 
Черкассы
Регистрация: 16.02.2008
Сообщений: 903

Как известно новый тип элементов в Revit 2019 - плистины, не имеет размеров кроме толщины.
Для того что-бы получить размеры минимального паралелепипеда в котрый вписана пластина надо имея солид пластины найти object oriented bounding box.
У меня пока не установлен Ревит 2019, поэтому желающим быстрее начать работать с новым функционалом предланаю код
Клас для получения OOBB

Код:
[Выделить все]
    class OOBB
    {
    	static XYZ Min(XYZ a, XYZ b)
    	{
    		double x, y, z;
    		if (a.X < b.X) { x = a.X; } else { x = b.X; }
    		if (a.Y < b.Y) { y = a.Y; } else { y = b.Y; }
    		if (a.Z < b.Z) { z = a.Z; } else { z = b.Z; }
    		return new XYZ(x, y, z);
    	}
    	
     	static XYZ Max(XYZ a, XYZ b)
    	{
    		double x, y, z;
    		if (a.X > b.X) { x = a.X; } else { x = b.X; }
    		if (a.Y > b.Y) { y = a.Y; } else { y = b.Y; }
    		if (a.Z > b.Z) { z = a.Z; } else { z = b.Z; }
    		return new XYZ(x, y, z);
    	}
     	
    	public static BoundingBoxXYZ GetOOBB(Element source)
    	{
			Autodesk.Revit.DB.Options options = new Options();
			GeometryElement geo = source.get_Geometry(options);        	
			if (geo == null) return null;
			
			IList<Solid> solids = new List<Solid>();
			foreach(GeometryObject obj in geo)
            {
            	Solid solid = obj as Solid;
            	if (solid != null) solids.Add(solid);
			}
			
			if (solids.Count == 0) return null;			
			
		    IList<XYZ> vertices = new List<XYZ>();
		    IList<PlanarFace> faces = new List<PlanarFace>();
		    
		    BoundingBoxXYZ AABB = new BoundingBoxXYZ();
				    
    		foreach(Solid sld in solids)
    		{
    			
    			foreach(Face face in sld.Faces)
    			{
    				// filter only planar faces
    				if (face is PlanarFace) { faces.Add(face as PlanarFace); }
    				
				    Mesh mesh = face.Triangulate();
				    
				    for (int i = 0; i < mesh.NumTriangles; i++)
				    {
				        MeshTriangle triangle = mesh.get_Triangle(i);
				        XYZ p = triangle.get_Vertex(0); vertices.Add(p);
				        XYZ q = triangle.get_Vertex(1); vertices.Add(q);
				        XYZ r = triangle.get_Vertex(2); vertices.Add(r);
				        
				        AABB.Min = Min(AABB.Min, p); AABB.Max = Max(AABB.Max, p);
				        AABB.Min = Min(AABB.Min, q); AABB.Max = Max(AABB.Max, q);
				        AABB.Min = Min(AABB.Min, r); AABB.Max = Max(AABB.Max, r);
				    }
    			}
    		}
    		
    		faces.OrderByDescending( f => f.Area );
    		
	
			BoundingBoxXYZ minBB = new BoundingBoxXYZ();
			
			int count = 0;
			XYZ sizes = AABB.Max - AABB.Min;
			double volume = sizes.X * sizes.Y * sizes.Z;
			bool lessAABB = false;
			
			foreach(Face face in faces)
			{
				// Some optimization
				if (count > 24) break;
				count++;
				
				Transform tf = face.ComputeDerivatives(new UV()).Inverse;
				
				BoundingBoxXYZ bb = new BoundingBoxXYZ();
				bb.Min = new XYZ(1e10, 1e10, 1e10);
				bb.Max = new XYZ(-1e10, -1e10, -1e10);
				
				foreach(XYZ v in vertices)
				{
					XYZ tv = tf.OfPoint(v);
					bb.Min = Min(bb.Min, tv); 
					bb.Max = Max(bb.Max, tv);
				}
				
				XYZ sizes_ = bb.Max - bb.Min;
				double volume_ = sizes_.X * sizes_.Y * sizes_.Z;
				
				if (volume_ < volume) 
				{
					volume = volume_;
					minBB = bb;
					lessAABB = true;
				}
			}
    	
			if (lessAABB) { return minBB; } else { return AABB; }
    	}
    }
Пример использования
Код:
[Выделить все]
        private XYZ GetSizes(BoundingBoxXYZ bb)
        {
                        double x = bb.Max.X - bb.Min.X;
 	 		double y = bb.Max.Y - bb.Min.Y;
 	 		double z = bb.Max.Z - bb.Min.Z;
 	 		double e;
 	 		if (z > y) { e = z; z = y; y = e;}
 	 		if (y > x) { e = y; y = x; x = e;}
 	 		if (z > y) { e = z; z = y; y = e;}
 	 		return new XYZ(x, y, z);
        }
//-----------------------------------------------------------------------------
        BoundingBoxXYZ bb = OOBB.GetOOBB( plate);
     
         XYZ sizes = GetSizes(bb);
         double thikness = Math.Round( UnitUtils.Convert(sizes.Z, DisplayUnitType.DUT_FEET_FRACTIONAL_INCHES, DisplayUnitType.DUT_MILLIMETERS) );
         double width = Math.Round( UnitUtils.Convert(sizes.Y, DisplayUnitType.DUT_FEET_FRACTIONAL_INCHES, DisplayUnitType.DUT_MILLIMETERS) );
         double length = Math.Round( UnitUtils.Convert(sizes.X, DisplayUnitType.DUT_FEET_FRACTIONAL_INCHES, DisplayUnitType.DUT_MILLIMETERS) );
Просмотров: 38462
 
Непрочитано 24.04.2018, 03:59
#2
erednimras

конструктор
 
Регистрация: 14.06.2010
Ukraine, Lemberg
Сообщений: 25
<phrase 1=


А можно поподробнее ,куда этот код вставлять - если в динамо phyton script то через какие параметры?

Последний раз редактировалось erednimras, 24.04.2018 в 04:21.
erednimras вне форума  
 
Непрочитано 24.04.2018, 06:23
#3
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


В МКЭ среди жесткостных характеристик тоже нет размеров пластин, а толщина есть.
Setvar вне форума  
 
Непрочитано 24.04.2018, 06:40
#4
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Setvar Посмотреть сообщение
В МКЭ среди жесткостных характеристик тоже нет размеров пластин, а толщина есть.
А причем тут МКЭ? В Ревит 2019 появился встроенный МКЭ решатель?
Boxa вне форума  
 
Непрочитано 24.04.2018, 07:09
#5
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от Boxa Посмотреть сообщение
В Ревит 2019 появился встроенный МКЭ решатель?
Не знаю. Тему же о нововведениях в Revit 2019 прикрыли. Возможно, самому Revit,у и не нужны предопределенные размеры пластин, они, возможно, определяются автоматически в модели. Вот в AutoCAD'е вообще нет никаких доступных через палитру свойств 3D-тел (например, полученных при экспорте из Revit в AutoCAD) и приходится их определять через boundary box...
Setvar вне форума  
 
Автор темы   Непрочитано 24.04.2018, 08:37
#6
YarUnderoaker

Негропроект, инженегр-конструктор
 
Регистрация: 16.02.2008
Черкассы
Сообщений: 903


Цитата:
Сообщение от erednimras Посмотреть сообщение
А можно поподробнее ,куда этот код вставлять - если в динамо phyton script то через какие параметры?
Это кусок кода, что бы легче было написать свой макрос на С#.
Мне динамо как-то не зашел, но думаю, это там тоже пригодится.
YarUnderoaker вне форума  
 
Непрочитано 24.04.2018, 11:28
#7
extraneous

Не верблюд
 
Регистрация: 07.06.2010
Москва
Сообщений: 1,152


YarUnderoaker, глянь еще вот эту тему, если не сложно
__________________
Мой блог по Revit
extraneous вне форума  
 
Автор темы   Непрочитано 24.04.2018, 12:44
#8
YarUnderoaker

Негропроект, инженегр-конструктор
 
Регистрация: 16.02.2008
Черкассы
Сообщений: 903


Смотрел, но пока посоветовать ничего не могу. Надо эксперементировать.

Нельзя ли все пластины проекта получить фильтром категории или класса?

Кстати из солида можно понять к какой категории его элемент соответствует
Код:
[Выделить все]
                foreach(Solid sld in solids)
                {
                	GraphicsStyle gStyle = doc.GetElement(sld.GraphicsStyleId) as GraphicsStyle;
                	if (gStyle.GraphicsStyleCategory.Id.IntegerValue == (int)BuiltInCategory.OST_StructConnectionPlates) 
                	{

                	}
                }
YarUnderoaker вне форума  
 
Непрочитано 24.04.2018, 12:56
#9
extraneous

Не верблюд
 
Регистрация: 07.06.2010
Москва
Сообщений: 1,152


YarUnderoaker, нет, коллектор собирает только Element, а эти пластины - Subelement, он наследован напрямую от Object.
Получить категорию из солида - идея!

Код по получение размеров пластины потестирую, спасибо.
__________________
Мой блог по Revit
extraneous вне форума  
 
Непрочитано 24.04.2018, 14:38
#10
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Интересно. А каким образом создается пластина в Revit 2019? Вручную к примеру. Я не знаток API Revit, но если пластина была создана, к примеру через эскиз, то значительно разумнее было бы программно искать этот самый эскиз на основании которого была создана пластина, а не солид полученный в итоге.
румата вне форума  
 
Автор темы   Непрочитано 24.04.2018, 15:37
#11
YarUnderoaker

Негропроект, инженегр-конструктор
 
Регистрация: 16.02.2008
Черкассы
Сообщений: 903


Насколько я знаю доступа к эскизным линиям к элементам типа перекрытие, крыша через API нет, наверное и к пластине нет.
YarUnderoaker вне форума  
 
Непрочитано 24.04.2018, 16:00
#12
h5r32


 
Регистрация: 28.12.2011
СПб
Сообщений: 843


А как же тогда работает пример AreaReinforcement из sdk. Армируют же перекрытия и стены любой формы.
h5r32 вне форума  
 
Непрочитано 24.04.2018, 16:10
#13
румата


 
Регистрация: 06.04.2015
Сообщений: 2,673


Цитата:
Сообщение от YarUnderoaker Посмотреть сообщение
Насколько я знаю доступа к эскизным линиям к элементам типа перекрытие, крыша через API нет, наверное и к пластине нет.
Странно это все. Получается вручную можно получить доступ к эскизу плиты, а через API нельзя. Тогда совершенно не понятно для чего нужен такой API.
румата вне форума  
 
Автор темы   Непрочитано 24.04.2018, 20:06
#14
YarUnderoaker

Негропроект, инженегр-конструктор
 
Регистрация: 16.02.2008
Черкассы
Сообщений: 903


Можно создать новый объект из набора линий, но отредактировать существующий нельзя (хотя есть недокументированый хак).
YarUnderoaker вне форума  
 
Непрочитано 25.04.2018, 03:52
#15
erednimras

конструктор
 
Регистрация: 14.06.2010
Ukraine, Lemberg
Сообщений: 25
<phrase 1=


Спасибо Александру, он написал макрос который считает объём и массу пластин, даже тех которые входят в динамический узел (его можно взорвать). Посмотреть можно здесь. После тестирования можно сказать что:
1. После каждого изменения в геометрии нужно заходить в вкладку макрос и выполнять его вручную.
2. Макрос иногда глючит и выдает ошибку отказываясь пересчитывать последние изменения. Для нормального пересчета нужно сменить геометрию любой пластины, или поменять количество отверстий - потом поменять назад
3. Учитывается точный объём с учетом отверстий обычных и тех которые делают болты.
4. Пластины могут быть с любого материала - стекло, медь, дерево, но если в материале не заданы физические свойства, то есть нет плотности- макрос выдает ошибку.

также возникли проблемы при попытке перенести макрос в другой файл - ругается что Имя типа или пространства имен "AdvanceSteel" отсутствует в пространстве имен "Autodesk" (пропущена ссылка на сборку?)(CS0234)
erednimras вне форума  
 
Непрочитано 25.04.2018, 10:56
#16
Egorex


 
Регистрация: 25.09.2009
Сообщений: 169


Ребят, вы меня извините, я Revit 2019 еще не смотрел, но ваш ажиотаж относительно расчетов и выводов каких то параметров пластин мне совершенно непонятен.

В приложении семейство доски, фанеры для сборки опалубочного щита, и собственно сам опалубочный щит, категория "Генеральный план", сделано в версии 2016. Все обсуждаемые вами параметры получаются с помощью "параметров для отчетов". Не знаю, что там в 2019 намутили, могу только предположить, что соединения узлов стало делать еще проще.
Вложения
Тип файла: rar Семейства.rar (937.6 Кб, 169 просмотров)
Egorex вне форума  
 
Непрочитано 25.04.2018, 11:56
#17
madragor

инженер-конструктор
 
Регистрация: 06.07.2012
Киев
Сообщений: 69


Цитата:
Сообщение от Egorex Посмотреть сообщение
Ребят, вы меня извините, я Revit 2019 еще не смотрел, но ваш ажиотаж относительно расчетов и выводов каких то параметров пластин мне совершенно непонятен.

В приложении семейство доски, фанеры для сборки опалубочного щита, и собственно сам опалубочный щит, категория "Генеральный план", сделано в версии 2016. Все обсуждаемые вами параметры получаются с помощью "параметров для отчетов". Не знаю, что там в 2019 намутили, могу только предположить, что соединения узлов стало делать еще проще.

Вся суть проблемы в том что в узлах металлоконструкций уже нет отдельных семейств. Пластины рисуются прямо в программе, не открывая отдельного семейства, по типу как вы рисуете перекрытие или фундаментную плиту. И вот автодеск пошутил над всеми конструкторами сделав доступным только один параметр этого элемента, а именно толщину. Но для того чтоб посчитать спецификации этого мало. Добавить можно только глобальные параметры, но я уже пытался через них как то повлиять на эскиз пластины, не получилось.

Вот люди знакомые с программированием пытаются всякими окольными путями таки получить эти заветные длина-ширина , для того чтоб можно было все обсчитать в спецификациях.

П.С. Надеюсь в экстеншене что-то добавят или в патч-фиксе каком-то.
madragor вне форума  
 
Непрочитано 25.04.2018, 13:02
#18
Egorex


 
Регистрация: 25.09.2009
Сообщений: 169


Цитата:
Сообщение от madragor Посмотреть сообщение
Вот люди знакомые с программированием пытаются всякими окольными путями таки получить эти заветные длина-ширина , для того чтоб можно было все обсчитать в спецификациях.
А, ну ясно. Тогда обращаю ваше внимание что Dynamo является неотъемлемой частью Revit, и представляет собой достаточно простой (по крайней мере, для человека с высшим строительным образованием) инструмент визуального программирования. С помощью которого можно быстро получить все необходимые параметры и прописать их куда надо.
Egorex вне форума  
 
Непрочитано 25.04.2018, 13:54
| 1 #19
Nels

конструктор, строитель
 
Регистрация: 08.10.2006
Уфа
Сообщений: 651
<phrase 1=


Цитата:
Сообщение от Egorex Посмотреть сообщение
Тогда обращаю ваше внимание что Dynamo является неотъемлемой частью Revit
Вряд ли так уж быстро появятся ноды для динамо, с помощью которых можно будет определять размеры пластин и передавать их в общие параметры. Тут пока работают напрямую с API.
Nels вне форума  
 
Непрочитано 25.04.2018, 18:22
#20
miko2009

Инженер-конструктор
 
Регистрация: 13.10.2011
Москва
Сообщений: 2,359


Цитата:
Сообщение от YarUnderoaker Посмотреть сообщение
Насколько я знаю доступа к эскизным линиям к элементам типа перекрытие, крыша через API нет
Increase Size Decrease Size Нажмите для просмотра
https://www.youtube.com/watch?v=Lbe0MaeKZ44&t=392s3:35
Цитата:
Сообщение от Nels Посмотреть сообщение
Вряд ли так уж быстро появятся ноды для динамо, с помощью которых можно будет определять размеры пластин и передавать их в общие параметры. Тут пока работают напрямую с API.
DYnamo работает напрямую с API
miko2009 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Библиотека функций > Revit 2019. Делаем макрос для получения размеров пластин

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос VBA Excel для извлечения таблиц из линий, полилиний, текста из DWG файлов в Excel с помощью NanoCAD/AutoCAD JZY Готовые программы 8 14.07.2016 06:31
Использование Revit MEP для проектирования промышленных объектов. andr_g Revit 6 29.10.2015 20:59
Использование Revit Structure для конструирования мостов AlexYoung Revit 26 20.02.2012 20:21
Заменимость Revit Architecture Revit Structure'м cardinalus Revit 4 30.06.2011 10:58
Балки в Revit MEP. Revit и СПДС Минька Revit 1 25.04.2011 05:51