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

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

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

Ответ
Поиск в этой теме
Непрочитано 23.04.2018, 19:41 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
 
Автор темы   Непрочитано 27.04.2018, 08:53
#21
YarUnderoaker

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


На идее станции появилась идея добавить пластинам площадь и вес, голосуем колеги, куму не лень Plate schedule with area and weight
YarUnderoaker вне форума  
 
Автор темы   Непрочитано 27.04.2018, 16:31
1 | #22
YarUnderoaker

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


Немного доработал макрос Александра, добавил ширину/длину
Миниатюры
Нажмите на изображение для увеличения
Название: Plastinki.png
Просмотров: 299
Размер:	34.0 Кб
ID:	201678  
Вложения
Тип файла: rvt Revit2019 plates weigth plus.rvt (908.0 Кб, 106 просмотров)
YarUnderoaker вне форума  
 
Непрочитано 02.05.2018, 17:52
#23
madragor

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


Теперь бы привязать это к общим параметрам из шаблона Александра (Рзм.Длина, Рзм.Ширина, Рзм.Толщина) и тогда по идее уже можно будет засунуть их в спецификацию.
madragor вне форума  
 
Автор темы   Непрочитано 10.05.2018, 11:30
#24
YarUnderoaker

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


Делаю сейчас марку АБ на небольшой навес. Практика показала еще несколько проблем:
1) Пластинам в составе соединения нельзя задавать значения параметров и выделять через спецификацию. Нельзя менять значения параметров через метки.
2) У пластин в составе соединения нет параметром марка и изготовитель


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

В общем есть неудобства.
YarUnderoaker вне форума  
 
Непрочитано 30.05.2018, 11:04
#25
madragor

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


Доброго дня YarUnderoaker
Пытаюсь использовать ваш макрос в другом документе, при сборке выдает 2 ошибки:

C:\ProgramData\Autodesk\Revit\Macros\2019\Revit\AppHookup\Plate\Source\Plate\ThisApplication.cs(161,11) : Ошибка CS0246: Не удалось найти имя типа или пространства имен "FilerObject" (пропущена директива using или ссылка на сборку?)
C:\ProgramData\Autodesk\Revit\Macros\2019\Revit\AppHookup\Plate\Source\Plate\ThisApplication.cs(205,10) : Ошибка CS0118: "Plate" является "пространство имен", но используется как "тип"

Так как ранее макросы никогда не писал , и к сожалению совсем не разбираюсь в программировании, прошу помочь мне решить эту проблему.

Макрос ваш просто скопировал. В принципе если делать сборку вашего макроса у меня на компьютере, то он тоже не собирается с теми же ошибками + добавляется 5 ошибок связанных с AdvanceSteel.
madragor вне форума  
 
Непрочитано 30.05.2018, 11:24
#26
h5r32


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


madragor, Скопируй в новый документ все что у него в файле в самом верху сборки начинается с using
h5r32 вне форума  
 
Автор темы   Непрочитано 30.05.2018, 11:26
#27
YarUnderoaker

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


Для начала надо добавить ссылки на библиотеки


Для этого зайдите в Project->Add References -> .NET Assembly Browser -> Browse...


Добавить файлы dll с такими же названиями из папки
C:\Program Files\Autodesk\Revit 2019\AddIns\SteelConnections\

По ошибкам пока не понятно, возможно из-за отсутствия ссылок.
Миниатюры
Нажмите на изображение для увеличения
Название: References.png
Просмотров: 1008
Размер:	10.2 Кб
ID:	202901  Нажмите на изображение для увеличения
Название: References 2.png
Просмотров: 992
Размер:	8.0 Кб
ID:	202902  
YarUnderoaker вне форума  
 
Автор темы   Непрочитано 30.05.2018, 12:30
#28
YarUnderoaker

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


Могу еще поделится более усовершенсвованым макросом уровня приложения
Распакуйте архив и закиньте в папку C:\ProgramData\Autodesk\Revit\Macros\2019\Revit\AppHookup

Но надо будет добавлять пластинам и каркасу параметры как в примере
Вложения
Тип файла: rar Primer.rar (9.18 Мб, 155 просмотров)
Тип файла: rar SteelSupp.rar (3.40 Мб, 158 просмотров)

Последний раз редактировалось YarUnderoaker, 16.08.2018 в 16:32.
YarUnderoaker вне форума  
 
Непрочитано 30.05.2018, 12:31
#29
madragor

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


Огромное спасибо все получилось, действительно не хватало библиотек.

----- добавлено через ~5 ч. -----
Цитата:
Сообщение от YarUnderoaker Посмотреть сообщение
Могу еще поделится более усовершенсвованым макросом уровня приложения
Спасибо большое. Но как всегда у меня на компе есть ряд проблем .

Даже если я использую этот макрос в вашем примере у меня сначала запрашивает ЗД вид, кое как догадался что открыть надо ЗД конструктив . Далее оно выдает ошибку что у пластин нет необходимых общих параметров. Может я опять чего то не подключил ?
madragor вне форума  
 
Автор темы   Непрочитано 31.05.2018, 09:29
#30
YarUnderoaker

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


Извиняюсь не тот файл приложил, вот правильный
Вложения
Тип файла: rar Primer.rar (9.18 Мб, 107 просмотров)
YarUnderoaker вне форума  
 
Непрочитано 31.05.2018, 11:01
#31
madragor

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


Доброе утро.
Спасибо все заработало. Кстати очень просто перегоняются общие параметры пластин - просто копирую "Параметры проекта" из вашего примера. И все макрос работает как надо
Еще раз большое спасибо!!!
madragor вне форума  
 
Автор темы   Непрочитано 31.05.2018, 12:18
#32
YarUnderoaker

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


Незачто. Приходится приспосабливаться к тому что нам дають разработчики.
Но все таки мне кажется есть толк от этих новшеств, можно немного упростить себе работу.
YarUnderoaker вне форума  
 
Непрочитано 31.05.2018, 13:14
#33
madragor

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


Позволил себе немного изменить ваш макрос, приспособил его под шаблон Александра Зуева. Точно так же измененный макрос в архиве и файл примера .

Пример.rvt

SteelSupp.rar

Один вопрос остался непонятным - как то с помощью вашего макроса можно перенести параметр "Толщина" в общий параметр "Рзм.Толщина" ?
madragor вне форума  
 
Автор темы   Непрочитано 31.05.2018, 13:43
#34
YarUnderoaker

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


Добавить код, там где остальные такие параметры переносятся
Код:
[Выделить все]
 
if(param.Name == "Рзм.Толщина")
{
	DoubleParameterValue dpv = new DoubleParameterValue(pij.plate.Thickness/304.8);
	subelem.SetParameterValue(paramId, dpv);
}
YarUnderoaker вне форума  
 
Непрочитано 31.05.2018, 13:54
#35
madragor

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


Пробовал, ругается при сборке.
madragor вне форума  
 
Автор темы   Непрочитано 31.05.2018, 14:25
#36
YarUnderoaker

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


У меня не ругается. Значит где-то у вас косяк в синтаксисе. Бывает такое что скопировав с форума кусок кода он потом криво вставляется, попробуйте вручну написать.
YarUnderoaker вне форума  
 
Непрочитано 31.05.2018, 14:41
#37
madragor

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


Скопировал данный вами код и все сработало. До этого брал в этом блоке за пример параметр "Ширина" корректировал его под "Толщину" и ругалось.
Спасибо за помощь.
madragor вне форума  
 
Непрочитано 04.06.2018, 15:28
#38
madragor

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


Доброго дня. Опять у меня какая то ошибка. Вот такое вот сообщение выдает при попытке использовать макрос:
Нажмите на изображение для увеличения
Название: Сообщение об ошибке.jpg
Просмотров: 115
Размер:	54.4 Кб
ID:	203085

Пересобирать макрос пробовал все идет без ошибок. Единственное что заметил, так то что в самих пластинах поменялись местами кое-какие параметры. Подскажите в чем может быть проблема?
madragor вне форума  
 
Автор темы   Непрочитано 04.06.2018, 23:33
#39
YarUnderoaker

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


Ошибка такая бывает когда переменная не определена (null), а с ней пытаються что-то сделать. Но где это происходит не понятно. Надо делать пошаговую отладку, что бы найти точное место ошибки.
YarUnderoaker вне форума  
 
Непрочитано 05.06.2018, 09:35
#40
madragor

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


Постараюсь описать как так получилось.
Работал с вашим макросом без проблем, ни каких ошибок не выдавало. Потом сделал в одном узле колонне "Укоротить", выставил угол необходимого среза и хотел на ту плоскость прилепить пластину. Прилепил, после этого начало выдавать вот эту ошибку. Также в параметрах экземпляра пластин в графе "Идентификация" появились стандартные параметры: "Изображение", "Коментарии", "Марка"(ранее их не было, в пластинах которые были созданы до этого тоже нет). В графе "Материалы и отделка" подтянутый мной общий параметр "О_Материал" поменялся местами с стандартным "Материал несущих конструкций". Пластины которые были созданы до этого и добавлены в стандартные узлы остались без изменений, но если разорвать связь этих пластин с узлами они становятся как новые - добавляются стандартные параметры в графе "Идентификация" и меняются местами параметры материала. Если удалить все пластины с такими параметрами то макрос работает как всегда. Если есть хоть одна пластина с измененными параметрами, выдает вот ту ошибку. По факту вышло так - все что создавалось до момента обрезки колонны работает с вашим макросом, все что создавалось или изменялось после этого не работает.
Далее провожу эксперименты: Сделал новую пластину, вышло все так как описал выше - новые параметры и так далее - макрос не работает. Но когда добавил эту пластину в сборку с стандартным узлом параметры стали так как надо и макрос заработал. Я так понимаю что макрос не работает с пластинами которые не входят в сборки с узлами или узлы?
madragor вне форума  
Ответ
Вернуться   Форум 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