在检索可扩展存储架构的字段之前检查其是否存在



我使用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");
        }

相关内容

  • 没有找到相关文章

最新更新