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

Вернуться   Форум 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) );
Просмотров: 38666
 
Непрочитано 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,154


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,154


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

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


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


Интересно. А каким образом создается пластина в 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,676


Цитата:
Сообщение от 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 Кб, 171 просмотров)
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