Установите идентификатор экземпляра стены в идентификатор параметра стены - PullRequest
0 голосов
/ 20 июня 2019

Я хотел бы указать идентификаторы стен в свойствах стен.

Код строит, но не помещает идентификатор стены в идентификатор стены параметров для всех стен.

Я пробовал без транзакций и с. У меня сложилось впечатление, что это должно быть выполнено с их использованием, но я не получаю правильный результат (или любой другой результат).

public void InsertWallID () {

        Document doc = this.ActiveUIDocument.Document; 

        FilteredElementCollector collector =    new FilteredElementCollector(doc);

        ICollection<Element> WallEls =  collector.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_Walls).ToElements();


using (Transaction trans = new Transaction(doc, "Change wall parameters values"))
{
    trans.Start();

        int WallIDValue;

    foreach(Element WallEl in WallEls)
        {           
        ElementId WallId = WallEl.Id;
        WallIDValue = WallId.IntegerValue;
        if(WallEl.LookupParameter("WallID")==null)
        {


        Parameter wallparam = WallEl.LookupParameter("WallID") as Parameter;
            wallparam.Set(WallIDValue);
        }
            }
          trans.Commit();
        }
    }
}

}

Ожидаемый результат: Каждый экземпляр имеет свой идентификатор в своих параметрах. который позволил бы мне запланировать стены и их идентификаторы стен

Фактический результат: Без изменений в параметре WallID, поскольку он все еще пуст.

1 Ответ

1 голос
/ 20 июня 2019

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

Прежде чем что-либо программировать, вы должны использовать RevitLookup и другие инструменты исследования баз данных, чтобы убедиться, что вы ищете нужную вещь.

Если вы взглянете на стену, вы увидите, что она не является элементом FamilyInstance.

Существует специальный класс Wall для стен.

Если вы просто отфильтруете по OfClass(typeof(Wall)), вы получите их.

Кроме того, вызов ToElements является пустой тратой времени и памяти. Просто удалите его.

Я очень часто это обсуждал на Кодер здания .

Нет необходимости использовать ToElements, если вы просто хотите перебрать результаты сборщика отфильтрованных элементов.

Вы можете выполнять итерацию непосредственно над самим коллектором.

Использование ToElements создает копию информации и использует время и пространство без причины, ср., FindElement и оптимизация коллектора .

...