0

我使用了 if 语句来检查检索模式的方法是否为 null,这是一个单独的表单,其中包含要填充的 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;
    }
4

3 回答 3

0

每个 Revit 项目的 GUID 很可能不同。

目前尚不清楚您如何为您的 retSchemaBICMethod 提供 guid,因此这似乎很可能是您的问题的原因。

我会从 GetEntity 调用中取出 Schema.Lookup 并首先检查您的值是否有效,因为我怀疑这是您的空引用发生的地方。

我还认为 Revit 处理多个文档和可扩展存储的方式存在问题。在打开第二个文档并就该问题向 Revit 提交错误报告时,我遇到了许多问题。

于 2014-05-28T02:24:47.470 回答
0

要检索字段数据,您必须检查是否存在可扩展存储模式。为此,您必须首先了解整个结构。

数据存储 -> 架构 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");
        }
于 2019-05-09T06:51:43.753 回答
0

要检查模式是否存在,我使用以下name模式的名称。如果使用!= null它将在运行时产生错误。

Schema s = Schema.ListSchemas().FirstOrDefault(q => q.SchemaName == name);
if (s == null)
{
    // no schema found, create one
}
else
{
    // schema found, use it
}
于 2017-07-14T00:31:38.730 回答