【问题标题】:Revit API reopen form an keep dataRevit API 重新打开表单并保留数据
【发布时间】:2021-01-22 23:57:06
【问题描述】:

我想制作一个插件,用户可以在其中选择源元素,然后选择目标元素并获取所有参数及其值。

我的问题是:在我选择了源元素并将所有参数和值放入组合框中后,我选择了目标(通过另一个按钮)。为此,表单再次关闭,并且在选择并重新打开源元素中的所有数据后消失了。

这样做的正确方法是什么? 此时两个按钮都关闭表单运行另一个 ExternalEvent 来选择元素并收集数据。

我可以缓存这些数据(列表、带有列表的字典、带有列表的字典的字典)还是必须将其写入文件还是有其他方法?

当表单关闭和重新打开时,我如何保留/记住我收集的数据?

感谢您的帮助 菲利普

【问题讨论】:

    标签: revit-api


    【解决方案1】:

    我猜有多种方法可以做到这一点。它更多的是一般编程而不是 API 问题。您基本上需要将数据保存在 WPF 窗口之外的内存中。

    我脑海中的一些选项是

    1. 将数据保存到临时文件夹中的文件中,并在需要时读取(可能是一个混乱的解决方案)
    2. 使用数据创建和实例化一个类以保存在内存中并在不同窗口等之间进行通信。
    3. 拥有一个具有适当属性的静态类。选择一个元素后,将其分配给属性。这应该在 Revit 会话中持续存在。 Static Class

    选项 3 应该是最容易使用的。

    【讨论】:

    • 谢谢 Coolicky,我会尝试你的建议
    【解决方案2】:

    只需使用属性 -> 应用程序设置来存储实体的 ID。然后在启动时获取组合框以自动填充是否可以找到 ID。

    只有在编辑模型时才需要外部事件。

    这是假设您使用 Visual Studio 而不是快速开发。如果您仍在使用Sharp Develop,那么是时候转向真正的IDE了。

    【讨论】:

      【解决方案3】:

      我认为有几个选择。您可以使用 Revit 模型提供的内置 DataStorage。在这里,我创建了一个数据存储实体来存储项目的 GUID...

      public Guid schemaGuid = new Guid("{5F374308-9C59-42AE-ACC3-A77EF45EC146}");    
      public DataStorage dataStorage;
      public string schemaName = "UniqueProjectId";
      public DataStorage dataStorage;
      public string SimpleField = "MyProjects_GUID";
      
      public Schema CreateNewDataStorage()
                  {
                      Guid newProjectGuid = Guid.NewGuid();
          
                      Transaction t = new Transaction(doc, "Make internal storage");
                      t.Start();
                      dataStorage = DataStorage.Create(doc);
                      dataStorage.Name = schemaName;
                      
          
                      SchemaBuilder schemaBuilder = new SchemaBuilder(schemaGuid);
                      schemaBuilder.SetSchemaName(schemaName);
                      schemaBuilder.AddSimpleField(SimpleField, typeof(Guid));
                      schema = schemaBuilder.Finish();
          
                      entity = new Entity(schema);
          
                      entity.Set(SimpleField, newProjectGuid);
                      dataStorage.SetEntity(entity);
                      t.Commit();
          
                      return schema;
                  }
      

      另一种方法是写入外部数据库或文本文件。对于一些小事,SQlite 很简单。临时文本文件也是一种非常简单的临时存储数据的方法。

      最后,您可以使用 Idling 事件并保持对话框处于活动状态。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 2012-05-14
        • 2016-12-28
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        相关资源
        最近更新 更多