c# Revit API 具有多行计数元素的任务对话框
c# Revit API task dialog with multiple lines counting elements
我有一个简单的 Revit 插件可以按类别计算多个元素并在任务对话框中显示总数。该代码适用于一个类别。当我在第一行 returns 之后添加更多那 1 行来计算多个类别时,结果为 0,如下图所示。我可以单独 运行 以下 3 个类别中的任何一个,并返回正确的结果。为什么多行不显示结果有什么想法吗?感谢您的帮助!
using System;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
namespace MyRevitCommands
{
[TransactionAttribute(TransactionMode.ReadOnly)]
public class SomeData : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//Get UIDocument
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
//Create Filtered Element Collector
FilteredElementCollector collector = new FilteredElementCollector(doc);
//Create Filter
ElementCategoryFilter lineFilter = new ElementCategoryFilter(BuiltInCategory.OST_Lines);
ElementCategoryFilter tagFilter = new ElementCategoryFilter(BuiltInCategory.OST_Tags);
ElementCategoryFilter wallFilter = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
//Apply Filter
IList<Element> lines = collector.WherePasses(lineFilter).WhereElementIsNotElementType().ToElements();
int lineCount = lines.Count;
IList<Element> tags = collector.WherePasses(tagFilter).WhereElementIsNotElementType().ToElements();
int tagCount = tags.Count;
IList<Element> walls = collector.WherePasses(wallFilter).WhereElementIsNotElementType().ToElements();
int wallCount = walls.Count;
**TaskDialog.Show("Model Data", string.Format(
"Lines: " + lineCount
+ Environment.NewLine + "Tags: " + tagCount
+ Environment.NewLine + "Walls: " + wallCount
));**
return Result.Succeeded;
}
}
}
首先,您对 string.Format
的调用完全没有效果,因为您正在使用 +
运算符组装结果字符串。
其次,您组装的字符串绝对显示您获得的正确结果。
tagCount
和 wallCount
的值确实总是零。
这是因为您在没有重新初始化的情况下多次重复使用相同的过滤元素收集器。
您添加到收集器中的每个过滤器都会添加到之前的所有过滤器中。
因此,首先你得到行数。
其次,统计所有也是标签元素的行元素,即为零。
三、所有既是标记元素又是墙的线元素的计数,即为零。
这是 The Building Coder on the need to Reinitialise the Filtered Element Collector 最近的解释。
我有一个简单的 Revit 插件可以按类别计算多个元素并在任务对话框中显示总数。该代码适用于一个类别。当我在第一行 returns 之后添加更多那 1 行来计算多个类别时,结果为 0,如下图所示。我可以单独 运行 以下 3 个类别中的任何一个,并返回正确的结果。为什么多行不显示结果有什么想法吗?感谢您的帮助!
using System;
using System.Collections.Generic;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
namespace MyRevitCommands
{
[TransactionAttribute(TransactionMode.ReadOnly)]
public class SomeData : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//Get UIDocument
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
//Create Filtered Element Collector
FilteredElementCollector collector = new FilteredElementCollector(doc);
//Create Filter
ElementCategoryFilter lineFilter = new ElementCategoryFilter(BuiltInCategory.OST_Lines);
ElementCategoryFilter tagFilter = new ElementCategoryFilter(BuiltInCategory.OST_Tags);
ElementCategoryFilter wallFilter = new ElementCategoryFilter(BuiltInCategory.OST_Walls);
//Apply Filter
IList<Element> lines = collector.WherePasses(lineFilter).WhereElementIsNotElementType().ToElements();
int lineCount = lines.Count;
IList<Element> tags = collector.WherePasses(tagFilter).WhereElementIsNotElementType().ToElements();
int tagCount = tags.Count;
IList<Element> walls = collector.WherePasses(wallFilter).WhereElementIsNotElementType().ToElements();
int wallCount = walls.Count;
**TaskDialog.Show("Model Data", string.Format(
"Lines: " + lineCount
+ Environment.NewLine + "Tags: " + tagCount
+ Environment.NewLine + "Walls: " + wallCount
));**
return Result.Succeeded;
}
}
}
首先,您对 string.Format
的调用完全没有效果,因为您正在使用 +
运算符组装结果字符串。
其次,您组装的字符串绝对显示您获得的正确结果。
tagCount
和 wallCount
的值确实总是零。
这是因为您在没有重新初始化的情况下多次重复使用相同的过滤元素收集器。
您添加到收集器中的每个过滤器都会添加到之前的所有过滤器中。
因此,首先你得到行数。
其次,统计所有也是标签元素的行元素,即为零。
三、所有既是标记元素又是墙的线元素的计数,即为零。
这是 The Building Coder on the need to Reinitialise the Filtered Element Collector 最近的解释。