Секция конструкции
Следующий пример по созданию секции конструкции был реализован Andrzej Trelinski из команды разработчиков Revit, за что ему большое спасибо.
В примере демонстрируется, как можно программно создать секцию конструкции для балки. Интересной особенностью, является то, что метод FamilySymbol.HasStructuralSection, не смотря на свое название (имеет секцию конструкции – прим. переводчика), возвращает ИСТИНА, в том случае, если типоразмер лишь может содержать в себе секцию конструкции.
Наконец, важным является то, что через API можно создать только StructuralSectionPipeStandard и StructuralSectionRoundHSS элементы секции конструкции.
Ниже приведен пример кода по созданию:
- [Transaction(TransactionMode.Manual)]
- public class Command : IExternalCommand
- {
- public Result Execute(
- ExternalCommandData commandData,
- ref string message,
- ElementSet elements)
- {
- UIApplication uiApp = commandData.Application;
- Application app = uiApp.Application;
- UIDocument uiDoc = uiApp.ActiveUIDocument;
- Document doc = uiDoc.Document;
- var collector = new FilteredElementCollector(doc);
- collector.OfCategory(BuiltInCategory.OST_StructuralFraming);
- if (uiDoc.Selection.GetElementIds().Count < 1)
- {
- TaskDialog.Show("Предупреждение", "Не выбраны подходящие элементы!" +
- " Выберите элемент категории Каркас несущий, например, балку");
- return Result.Cancelled;
- }
- using (Transaction tran = new Transaction(doc,
- "Добавление секции конструкции"))
- {
- tran.Start();
- foreach (ElementId id in uiDoc.Selection.GetElementIds())
- {
- Element elem = doc.GetElement(id);
- if (!(elem is FamilyInstance))
- {
- TaskDialog.Show("Предупреждение", string.Format(
- "Элемент с ID='{0}' не является экземпляром семейства. " +
- "Только экземпляры семейства могут иметь секцию конструкции",
- elem.Id.IntegerValue));
- return Result.Cancelled;
- }
- FamilyInstance famInst = elem as FamilyInstance;
- // Метод HasStructuralSection() проверяет
- // может ли элемент иметь секцию конструкции или нет
- if (!famInst.Symbol.Family.HasStructuralSection())
- {
- TaskDialog.Show("Предупреждение", string.Format(
- "Элемент с ID='{0}' Не может содержать в себе секцию конструкции. " +
- "Выберите элемент другого семейства",
- elem.Id.IntegerValue));
- return Result.Cancelled;
- }
- {
- // создаем новую секцию конструкции
- double diameter = 5.25;
- double sectionArea = 3.14159265358979 * diameter * diameter;
- double perimeter = 3.14159265358979 * diameter;
- double centroidHorizontal = 2.5;
- double centroidVertical = 1.5;
- double principalAxesAngle = 1.57;
- double elasticModulusStrongAxis = 10e7;
- double elasticModulusWeakAxis = 9e7;
- double momentOfInertiaStrongAxis = 100;
- double momentOfInertiaWeakAxis = 80;
- double nominalWeight = 1023;
- double plasticModulusStrongAxis = 120;
- double plasticModulusWeakAxis = 55;
- double shearAreaStrongAxis = 1;
- double shearAreaWeakAxis = 2;
- double torsionalModulus = 10;
- double torsionalMomentOfInertia = 15;
- double warpingConstant = 5;
- double wallDesignThickness = 1.2;
- double wallNominalThickness = 1.1978;
- StructuralSectionPipeStandard SSPipeStandard =
- new StructuralSectionPipeStandard(
- diameter, centroidHorizontal,
- centroidVertical, principalAxesAngle,
- wallNominalThickness, wallDesignThickness,
- sectionArea, perimeter, nominalWeight,
- momentOfInertiaStrongAxis,
- momentOfInertiaWeakAxis, elasticModulusStrongAxis,
- elasticModulusWeakAxis, plasticModulusStrongAxis,
- plasticModulusWeakAxis, torsionalMomentOfInertia,
- torsionalModulus, warpingConstant,
- shearAreaStrongAxis, shearAreaWeakAxis);
- famInst.Symbol.SetStructuralSection(SSPipeStandard);
- }
- }
- if (tran.Commit() != TransactionStatus.Committed)
- {
- TaskDialog.Show("Ошибка", "Ошибка при подтверждении транзакции");
- return Result.Failed;
- }
- }
- return Result.Succeeded;
- }
Источник: http://adndevblog.typepad.com/aec/2014/07/structural-section.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=869
Опубликовано 22.07.2014Отредактировано 23.07.2014 в 11:03:01