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

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

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

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

Как известно новый тип элементов в 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) );
Просмотров: 19783
 
Автор темы   Непрочитано 27.04.2018, 08:53
#21
YarUnderoaker

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


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

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


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

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


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

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


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


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

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

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


Доброго дня 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
СПб
Сообщений: 776


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

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


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


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


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

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

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


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

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

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

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


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

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

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

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


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

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


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

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


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

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


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

Пример.rvt

SteelSupp.rar

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

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


Добавить код, там где остальные такие параметры переносятся
Код:
[Выделить все]
 
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
Киев
Сообщений: 63


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

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


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

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


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

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


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

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

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


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

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


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