C # Revit API, как создать простую стену с помощью ExternalCommand? - PullRequest
0 голосов
/ 25 декабря 2018

Я просто хотел изучить Revit API и создать простую стену, используя ExternalCommand.Но я не могу понять ... Я думаю, что моя проблема здесь:

var symbolId = document.GetDefaultFamilyTypeId(new ElementId(BuiltInCategory.OST_Walls));

Когда я отлаживаю это symbolId всегда -1.

Можете ли выпомогите мне, что не так с этим фрагментом кода?

public Autodesk.Revit.UI.Result Execute(
    Autodesk.Revit.UI.ExternalCommandData command_data,
    ref string message,
    Autodesk.Revit.DB.ElementSet elements)
{
    var document = command_data.Application.ActiveUIDocument.Document;

    var level_id = new ElementId(1526);
    // create line
    XYZ point_a = new XYZ(-10, 0, 0);
    XYZ point_b = new XYZ(10, 10, 10);
    Line line = Line.CreateBound(point_a, point_b);

    using (var transaction = new Transaction(doc))
    {
        transaction.Start("create walls");

        Wall wall = Wall.Create(doc, line, level_id, false);
        var position = new XYZ(0, 0, 0);
        var symbolId = document.GetDefaultFamilyTypeId(new ElementId(BuiltInCategory.OST_Walls));
        if (symbolId == ElementId.InvalidElementId) {
            transaction.RollBack();
            return Result.Failed;
        }

        var symbol = document.GetElement(symbolId) as FamilySymbol;
        var level = (Level)document.GetElement(wall.LevelId);
        document.Create.NewFamilyInstance(position, symbol, wall, level, StructuralType.NonStructural);

        transaction.Commit();
    }

    return Result.Succeeded;
}

1 Ответ

0 голосов
/ 25 декабря 2018

Работа с Revit API, материал для начала работы , и все будет объяснено.Это избавит вас и других от многих дополнительных вопросов и ответов.

Чтобы ответить на этот конкретный вопрос в любом случае, GetDefaultFamilyTypeId, вероятно, не делает того, что вы ожидаете от элементов стены.В документации API метода GetDefaultFamilyTypeId он используется для структурных столбцов, стандартного загружаемого семейства, размещенного в отдельных файлах RFA.Стены имеют встроенную систему семейства и ведут себя по-разному.Возможно, GetDefaultFamilyTypeId работает только для несистемных семейств.

Чтобы извлечь произвольный (не по умолчанию) тип стены, используйте сборщик фильтрованных элементов, чтобы получить все элементы WallType и выбрать первый найденный элемент.

Вот фрагмент кода, который выбирает первый с определенным именем из Кодер здания обсуждение Создание лицевой стены и массового пола :

WallType wType = new FilteredElementCollector( doc )
  .OfClass( typeof( WallType ) )
  .Cast<WallType>().FirstOrDefault( q
    => q.Name == "Generic - 6\" Masonry" );
...