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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Revit API. как вставить семейство?

Revit API. как вставить семейство?

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 24.03.2016, 10:47 #1
Revit API. как вставить семейство?
SNIIP
 
Регистрация: 04.05.2010
Сообщений: 320

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

Задался вопросом как вставить семейство в проект да еще и настроить его параметры?

Задача делится на следующие этапы:
1) Научиться вставлять семейства
2) Научиться создавать диалог с пользователем (Например спрашиваю какой нужен швеллер у пользователя?, он говорит 20У (или выбирает) )
3) и собственно 3й пункт: создать типоразмер семейства с нужными мне параметрами из п.2


Начал разбираться с п1 (если подскажете куда копать в п2 буду очень признателен т.к. вообще не представляю как создать подобие формы ввода данных в ревит )

тут прочитал как вставлять семейство и получается такой код:
Код:
[Выделить все]
String fileName = @"C:\Documents and Settings\All Users\Application Data\Autodesk\RST 2011\Imperial Library\Furniture\TableDining
Round w Chairs.rfa";
// try to load family
Family family = null;
if (!document.LoadFamily(fileName, out family))
{
throw new Exception("Unable to load " + fileName);
}
// Loop through table symbols and add a new table for each
FamilySymbolSetIterator symbolItor = family.Symbols.ForwardIterator();
double x = 0.0, y = 0.0;
while (symbolItor.MoveNext())
{
FamilySymbol symbol = symbolItor.Current as FamilySymbol;
XYZ location = new XYZ(x, y, 10.0);
// Do not use the overloaded NewFamilyInstance() method that contains
// the Level argument, otherwise Revit cannot show the instances
// correctly in 3D View, for the table is not level-based component.
FamilyInstance instance = document.Create.NewFamilyInstance(location, symbol, StructuralType.NonStructural);
x += 10.0;
}
компилятор выдает ошибку на этой строчке: FamilySymbolSetIterator symbolItor = family.Symbols.ForwardIterator();
.... DB.Family не содержит определния для Symbols...

Почему так получилось? Это я где то накосячил или в исходник не правильный?
Просмотров: 7164
 
Непрочитано 24.03.2016, 11:17
#2
YarUnderoaker

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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
FamilySymbolSetIterator symbolItor = family.Symbols.ForwardIterator();
Это просто устарелый код (с каждой версией ревита часть функций делают устарелой + добавляют более эфективную альтернативу, а в следующей версии устарлое выпиливают)
Сейчас чтобы получить все типы семейства сначало надо получить список айдишек через family.GetFamilySymbolIds()
Придется тебе подучить С# - замени ForwardIterator и while (symbolItor.MoveNext()) на foreach
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.03.2016, 13:37
#3
Владимир_М


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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
Задача делится на следующие этапы:
1) Научиться вставлять семейства
2) Научиться создавать диалог с пользователем (Например спрашиваю какой нужен швеллер у пользователя?, он говорит 20У (или выбирает) )
3) и собственно 3й пункт: создать типоразмер семейства с нужными мне параметрами из п.2


Начал разбираться с п1 (если подскажете куда копать в п2 буду очень признателен т.к. вообще не представляю как создать подобие формы ввода данных в ревит )
Начинайте разбираться с Revit 20ХХ SDK. (скачивается бесплатно)
В основной папке есть куча всяческих примеров. Даже на уровне макросов (папка Macro Samples) есть уже вполне приличный пример на подобие Вашей задачки - CreateBeamsColumnsBraces. Там и выбор в диалоговом окне нужных семейств с нужными типоразмерами и сборка из этих семейств 3d конструкции.
Владимир_М вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 24.03.2016, 14:24
#4
SNIIP


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


Пока качаю SDK поковырял код. На этой строчке : FamilyInstance instance = document.Create.NewFamilyInstance(location, symbolItor.First, StructuralType.NonStructural);

Вылетает ошибка: StructuralType недоступен из за его уровня защиты. А как это победить?
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 24.03.2016, 14:41
#5
YarUnderoaker

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


Может StructuralType из какого-то другого неймспейса. Наведите на него курсор и посмотрите откуда он берется.
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 27.04.2016, 11:02
#6
SNIIP


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


Вот код вставки семейства:
Код:
[Выделить все]
public void q1()
		{
			UIApplication uiApp = this.Application;
			Document doc = uiApp.ActiveUIDocument.Document; 
			string FamilyPut = @"Z:\Tools\RevitTools\Семейства\Элементы узлов\";
			FilteredElementCollector a = new FilteredElementCollector(doc).OfClass( typeof( Family ) );
			string FamilyName ="2012_Область разрыва";
			Family family = a.FirstOrDefault<Element>( e => e.Name.Equals( FamilyName ) ) as Family;
			if( null == family )
            {
				string FamilyPath= FamilyPut + FamilyName + ".rfa"; 

			    // Загрузка семейства из файла.
			    using( Transaction tx = new Transaction( doc ) )
			    {
			      tx.Start( "Загрузка семейства" );
			      doc.LoadFamily( FamilyPath, out family );
			     
			      tx.Commit();
			    }
			 }
			

			      ISet<ElementId> elementSet = family.GetFamilySymbolIds();
			       FamilySymbol familyType=doc.GetElement(elementSet.First()) as FamilySymbol;
			      XYZ location = new XYZ(0, 0, 10.0);
			  
                            using( Transaction tx = new Transaction( doc ) )
			    {
			      tx.Start( "вставка семейства" );
			      
                              FamilyInstance instance = doc.Create.NewFamilyInstance(location, familyType, doc.ActiveView);
			      tx.Commit();
			    }
	
		}
следующие вопросы появились:
1) как вместо XYZ location = new XYZ(0, 0, 10.0); мне сделать так, чтобы пользователь тыкнул точку вставки?
2) как размещать семейство у которого 2 точки вставки? например балка, когда в ревите мы ее задаем, указываем 2 точки... Как это реализуется с помощью API?
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.04.2016, 11:23
#7
YarUnderoaker

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


Как то так
Код:
[Выделить все]
public void PickPoint(UIDocument uidoc)
{
    ObjectSnapTypes snapTypes = ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections;
    XYZ point = uidoc.Selection.PickPoint(snapTypes, "Select an end point or intersection");

    string strCoords = "Selected point is " + point.ToString();

    TaskDialog.Show("Revit", strCoords);
}
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 27.04.2016, 11:47
#8
SNIIP


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


Все отлично работает, спасибо остался открытый второй вопрос:
2) как размещать семейство у которого 2 точки вставки? например балка, когда в ревите мы ее задаем, указываем 2 точки... Как это реализуется с помощью API?


параллельно осваивать начал создание новых типоразмеров и дана такая функция записи длин в мм:
Код:
[Выделить все]
void SetElementParameterInMm(Element e, string parameter_name, double lengthInMm )
				 {
				   e.get_Parameter(parameter_name).Set(Util.MmToFoot(lengthInMm));
				 }
говорит Util отсутсувует в текущем контексте... это то что то в Uses подключить нужно?

Последний раз редактировалось SNIIP, 27.04.2016 в 12:12.
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.04.2016, 15:34
#9
YarUnderoaker

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


Если в справке по API нет такой функции, то это какой-то левый утиль.
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 27.04.2016, 17:31
#10
Владимир_М


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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
2) как размещать семейство у которого 2 точки вставки? например балка, когда в ревите мы ее задаем, указываем 2 точки... Как это реализуется с помощью API?
По двум точкам балку, можно так:
Код:
[Выделить все]
        private void PlaceBeam(Autodesk.Revit.DB.UV point2D1, Autodesk.Revit.DB.UV point2D2, Level topLevel, FamilySymbol beamType)
        {
            double height = topLevel.Elevation+1130/304.8;
            XYZ startPoint = new XYZ(point2D1.U, point2D1.V, height);
            XYZ endPoint = new XYZ(point2D2.U, point2D2.V, height);

            Line line = Line.CreateBound(startPoint, endPoint);
            STRUCTURALTYPE structuralType = Autodesk.Revit.DB.Structure.StructuralType.Beam;
            m_revit.ActiveUIDocument.Document.Create.NewFamilyInstance(line, beamType, topLevel, structuralType);
        }

Последний раз редактировалось Владимир_М, 27.04.2016 в 18:27.
Владимир_М вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 27.04.2016, 17:34
#11
SNIIP


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


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

Цитата:
Сообщение от Владимир_М Посмотреть сообщение
По двум точкам балку, можно так:
1)Построить по 2 точкам получилось, но снова ругался на STRUCTURALTYPE я выкрутился без него но что эта за вещь и почему не могу его использовать?

2) Как вставлять семейства и чтобы при задании линии например отображалась эта линия? или например при вставки семейства подсвечивалось это семейство?

3) Как все таки программно взять определенный параметр семейства и изменить его? а вернее параметр типа семейства? (копировать научился, когда все закончу выложу все итоговые правильные варианты)

4) вот еще вопрос: при вставке типоразмера который еще ни разу не был в проекте выдает оишбку symbol is not active... почему такое возникает? если вручную 1 раз разместить дальше работает...

Последний раз редактировалось SNIIP, 29.04.2016 в 11:42.
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.04.2016, 12:10
1 | #12
YarUnderoaker

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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
1)Построить по 2 точкам получилось, но снова ругался на STRUCTURALTYPE я выкрутился без него но что эта за вещь и почему не могу его использовать?
Вместо него подставляйте в NewFamilyInstance Autodesk.Revit.DB.Structure.StructuralType.Beam
Цитата:
Сообщение от SNIIP Посмотреть сообщение
2) Как вставлять семейства и чтобы при задании линии например отображалась эта линия? или например при вставки семейства подсвечивалось это семейство?
Вроде никак, но есть способ вызвать любую команду ревита, например, размещение балок, правда я не знаю как установить текущим какое-то семейство перед установкой.
Смотри в справке PostCommand
Цитата:
Сообщение от SNIIP Посмотреть сообщение
3) Как все таки программно взять определенный параметр семейства и изменить его? а вернее параметр типа семейства? (копировать научился, когда все закончу выложу все итоговые правильные варианты)
FamilyInstance e;
e.Symbol.get_Parameter
или фильтровать проект на класс FamilySymbol
Цитата:
Сообщение от SNIIP Посмотреть сообщение
4) вот еще вопрос: при вставке типоразмера который еще ни разу не был в проекте выдает оишбку symbol is not active... почему такое возникает? если вручную 1 раз разместить дальше работает...
Такого прежде не встречал.
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 29.04.2016, 12:54
#13
SNIIP


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


Огромное спасибо, почти все получилось... осталось последнее: Как мне спросить у пользователя (а лучше чтобы он выбрал из выпадающего списка) какой например Швеллер ему нужен...
Возможно ли вообще что то типа combobox а в панели использовать? или пользовательские формы какие нить создать? какие вообще мысли по этому поводу?
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.04.2016, 13:34
#14
Владимир_М


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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
Как мне спросить у пользователя (а лучше чтобы он выбрал из выпадающего списка) какой например Швеллер ему нужен...
Возможно ли вообще что то типа combobox а в панели использовать? или пользовательские формы какие нить создать?
пост #3
Цитата:
Revit 20ХХ SDK. ... есть уже вполне приличный пример на подобие Вашей задачки - CreateBeamsColumnsBraces.
по памяти... там все элементы балок и проч. выбираются из combobox'ов (на пользовательской форме).
Код, по поводу вставки балки, что я приводил выше, оттуда же...

Последний раз редактировалось Владимир_М, 29.04.2016 в 13:40.
Владимир_М вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 29.04.2016, 13:50
#15
YarUnderoaker

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


Самый просто способ - пользовательская форма. Их можно даже в макросах делать.
Пример, вроде тут форма есть, сейчас не могу проверить.
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 04.05.2016, 14:07
#16
SNIIP


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


Подскажиет как из формы (я наприер пробовал из события клика по кнопке) выполнить какой-нить макрос.

Выполняя вот такой код:

Код:
[Выделить все]
Form1.ActiveForm.Visible = false;
			ThisDocument doc = new ThisDocument();
			doc.выводящий();
получаю такую ошибку

Код:
[Выделить все]
************** Текст исключения **************
Autodesk.Revit.Exceptions.InvalidOperationException: Starting a transaction from an external application running outside of API context is not allowed.
   в Autodesk.Revit.DB.Transaction.Start(String name)
причем если выполнить сам макрос выводящий() то все идет без ошибок...
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 04.05.2016, 14:22
#17
YarUnderoaker

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


Не совсем понятно что ты делаешь.
У тебя два макроса, один запускает форму с кнопкой по нажатию которой запускается второй?
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 05.05.2016, 05:41
#18
SNIIP


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


Ну идея такая, что на форме например 10 кнопок и по каждой кнопке запускается свой макрос. Или может вообще можно в самом обработчике события онклик кнопки управлять работой ревита? код макроса не стал работать в онклик() кнопки формы с множеством ошибок... как то можно форму подружить с активным документом? ну если нет то просто по кнопке запускать макросы.

P.s. да есть еще 1 макрос просто отображающий форму...

а вот еще вопрос возник.... запустил макрос .... в макросе запустилась форма... макрос ждет закрытия формы прежде чем идти дальше? или выполняется сам весь а форма потом отдельно висит?
___________________________________________________________________________________________________________________________________________________________
еще кстати не решена проблема: ошибка - Symbol not activate

вот код:
Код:
[Выделить все]
UIApplication uiApp = this.Application;
			Document doc = uiApp.ActiveUIDocument.Document; 
			string FamilyPut = @"C:\REVIAPI\R\ME_2D\Sem\";
			FilteredElementCollector a = new FilteredElementCollector(doc).OfClass( typeof( Family ) );
			string FamilyName ="2012_Линия разрыва";
			Family family = a.FirstOrDefault<Element>( e => e.Name.Equals( FamilyName ) ) as Family;
			//загрузка семейства
			if( null == family )
				            {
								string FamilyPath= FamilyPut + FamilyName + ".rfa"; 
							    // Загрузка семейства из файла.
							    using( Transaction tx = new Transaction( doc ) )
							    {
							      tx.Start( "Загрузка семейства" );
							      doc.LoadFamily( FamilyPath, out family );
							     
							      tx.Commit();
							    }
							 }
			          
			 		ISet<ElementId> elementSet = family.GetFamilySymbolIds();
			     	 Selection sel = uiApp.ActiveUIDocument.Selection;
			     	 FamilySymbol familyType=doc.GetElement(elementSet.First()) as FamilySymbol;
			    	 ObjectSnapTypes snapTypes = ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections;
			     	 XYZ location = sel.PickPoint(snapTypes, "Введите точку вставки");
			 using( Transaction tx = new Transaction( doc ) )
			    {
			      tx.Start( "вставка семейства" );
			      FamilyInstance instance = doc.Create.NewFamilyInstance(location, familyType, doc.ActiveView);
                  tx.Commit();
			    }
Если 1 раз самом вставить семейство то ошибок нет

Нашел сам лечение: familyType.Activate();

Еще нерешенный вопрос: когда вставляешь семейство обычно вручную появляются подсказки.. как бы натягиваешь семейство, видишь что за семейство, привязываешься к точкам... когда программно я спрашиваю 2 точки и они никак не связаны... получается все сикось-накось... как вывести эти подсказки?
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 29
Размер:	6.0 Кб
ID:	169873

Последний раз редактировалось SNIIP, 05.05.2016 в 08:22.
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 05.05.2016, 08:50
#19
YarUnderoaker

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


Цитата:
Сообщение от SNIIP Посмотреть сообщение
Ну идея такая, что на форме например 10 кнопок и по каждой кнопке запускается свой макрос. Или может вообще можно в самом обработчике события онклик кнопки управлять работой ревита? код макроса не стал работать в онклик() кнопки формы с множеством ошибок... как то можно форму подружить с активным документом? ну если нет то просто по кнопке запускать макросы.

P.s. да есть еще 1 макрос просто отображающий форму...
Это не есть правильно.
Если делать макросами, то на каждое действие свой макрос, который запускается через диспетчер макросов.
Если это макрос с формой и кнопками, то действия кнопок - это часть приватных функций макроса. Тут надо быть аккуратным с транзакциями, делать отдельные на разные участки кода.
Если нужна своя панель инструментов, то это уже надо писать свой аддон в вижуал студио.


Цитата:
Сообщение от SNIIP Посмотреть сообщение
Еще нерешенный вопрос: когда вставляешь семейство обычно вручную появляются подсказки.. как бы натягиваешь семейство, видишь что за семейство, привязываешься к точкам... когда программно я спрашиваю 2 точки и они никак не связаны... получается все сикось-накось... как вывести эти подсказки?
Не знаю такого способа. Тут проще сделать свое семейство на основе линии и размещать его стандартными средствами. Автоматизация заключалась бы в выборе типа в зависимости от масштаба (если это возможно).
YarUnderoaker вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 06.05.2016, 05:43
#20
SNIIP


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


Цитата:
Сообщение от YarUnderoaker Посмотреть сообщение
Это не есть правильно.
Если делать макросами, то на каждое действие свой макрос, который запускается через диспетчер макросов.
Если это макрос с формой и кнопками, то действия кнопок - это часть приватных функций макроса. Тут надо быть аккуратным с транзакциями, делать отдельные на разные участки кода.
Если нужна своя панель инструментов, то это уже надо писать свой аддон в вижуал студио.
Ну задачу, которую пытаюсь решить я описывал в первом посте. Постараюсь сформулировать ее более четко:
Есть набор семейств - 20-30 2D элементов с помощью которых я делаю КМ. Достаточно неудобно и много времени занимает поиск нужного семейства в дереве объектов. При том если нет нужного типоразмера приходится лезть в сортамент и создавать его. Еще в автокаде у меня был блок Двутавров, блок уголков и т.д. в котором из выпадающего списка выбиралось нужное мне. + была сделана панель на которой по кнопке нужный блок вставлялся.

Хочу сделать аналог в Revit. способ не важен, важно лишь удобство использования.

Теперь отвечу на вопрос:
1) Макросами? ну неудобно каждый раз лазить в диспетчер макросов и выискивать нужный мне макрос. в принципе не сложнее дерева объектов только можно прописать автоматическую подстановку данных из сортамента. Плюс вопрос как организовать выбор? Итог: Не то
2) Макрос с формой и кнопкой. Решаем вопрос с выбором обычным комбобоксом. Но не решена проблема как же и обработчика события кнопки вызвать определенный макрос.
3) Аддон в вижуал студио я писал с кнопкой, все ок, но опять же, там же не сделать комбо бокс?
SNIIP вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Revit API. как вставить семейство?

РЕВЕРС. Автоматическая пакетная печать множества рамок (форматов) из пространства модели и листов
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отредактировать системное семейство трубы в Revit Mep? Kirzaa Revit 14 10.09.2015 08:27
Семейство Г-образных рам в Revit Jarat Revit 3 31.01.2012 13:47
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59
Autodesk Revit Sett Revit 37 10.09.2009 11:41

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