dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

YarUnderoaker вне форума Вставить имя

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

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


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

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


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


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


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

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


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


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

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


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


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


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

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


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


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


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

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

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


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

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

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


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


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

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

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

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


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


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


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

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


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


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


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

Пример.rvt

SteelSupp.rar

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

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


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


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

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


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


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


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


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


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

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

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


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


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


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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||