我使用if语句检查检索模式的方法是否为空,这是在一个单独的表单中,其中包含要填充的checkedListBox。代码如下,我已经标记了检查这个的条件。我的问题是;要确保每次在新的.rvt文件中运行revit外接程序时,在尝试检索模式之前模式记录已经存在,最有效的方法是什么?当事情出错时,在尝试访问空模式时会发生空引用错误。
//CheckedListBox for filter01 this exists in the form and calls the main
class function to retrieve the record.
checkedListBox1.DataSource = WS.categoryList(rvtDoc, intSwitch = 1);
Filter01_CategoryList = new List<BuiltInCategory>();
**if (WS.retSchemaBICMethod(rvtDoc) != null)**
{
TaskDialog.Show("Schema 1 ", " exists");
Filter01_CategoryList = WS.retSchemaBICMethod(rvtDoc);
}
else
{
TaskDialog.Show("Schema 1 "," has not been created");
//Update stored schema field values
inputBIC = checkedListBox1.CheckedItems.Cast<BuiltInCategory>
().ToList<BuiltInCategory>();
WS.getSetBIC(rvtDoc, inputBIC);
WS.storeSchema(rvtDoc, WS.projectInfoElement, inputBIC,
out WS.retrieveBIC);
//set checkedlistbox 1
Filter01_CategoryList = WS.retSchemaBICMethod(rvtDoc);
}
//this code returns the retrieved schema from the main class
public List<BuiltInCategory>retSchemaBICMethod(Document doc)
{
Element piElement = projectInfoFilter(doc);
// Read back the data from ProjInfo
Entity retrievedEntity = piElement.GetEntity(Schema.Lookup(schemaGuid));
IList<int> retrievedData = retrievedEntity.Get<IList<int>>
(Schema.Lookup(schemaGuid).GetField("BuiltInCatIds"));
//cast int list back to built-in category list
retSchemaBIC = retrievedData.Cast<BuiltInCategory>
().ToList<BuiltInCategory>();
return retSchemaBIC;
}
每个Revit项目的GUID很可能是不同的。
不清楚您是如何为您的retSchemaBICMethod提供向导的,因此看起来这很可能是您的问题的原因。
我会选择Schema。查找GetEntity调用,并首先检查您是否有一个有效值,因为我怀疑这就是您的空引用发生的地方。
我还认为Revit处理多个文档和可扩展存储的方式存在问题。我有一些问题发生在第二个文件被打开,并提交了一个bug报告与Revit的问题。
要检查模式是否存在,我使用以下命令,其中name
是模式的名称。如果您使用!= null
,它将在运行时产生一个错误。
Schema s = Schema.ListSchemas().FirstOrDefault(q => q.SchemaName == name);
if (s == null)
{
// no schema found, create one
}
else
{
// schema found, use it
}
要检索字段数据,必须检查是否存在可扩展存储模式。为此,您必须首先了解整个结构。
数据存储->模式GUID ->模式->实体->字段
首先您必须检查数据存储是否存在。您可以通过FilteredElementCollector进行检查。
FilteredElementCollector collector = new FilteredElementCollector(doc);
var dataStorage = collector.OfClass(typeof(DataStorage)).FirstElement();
if (dataStorage == null)
{
TaskDialog.Show("No data storage found");
return null;
}
每个模式都有唯一的GUID。根据项目中存储的每个模式检索GUID。
IList<Guid> SchemaGuids = dataStorage.GetEntitySchemaGuids();
现在您可以通过schema . lookup (guid)方法获取模式。获取模式后,您可以轻松地获取存储在模式中的实体及其值。
foreach (Guid guid in SchemaGuids)
{
Schema schema = Schema.Lookup(guid);
Entity entity = dataStorage.GetEntity(schema);
tokenValue = entity.Get<string>("Token");
}