Revit API:维护多个 API 版本的代码

问题描述 投票:0回答:2

我有一些为 Revit 2019 或以下版本编写的 Revit 插件。现在我正在尝试升级Revit 2020的工具,但API方法似乎有一些重大变化。幸运的是,其中一些是向后兼容的,因此我只需使用新的 API 方法更新代码并将其用于 Revit 2020 和 2019。但是,其中一些仅适用于 Revit 2020。(例如)

ImageInstance.Create(Document, View, ElementId, ImagePlacementOptions

在这种情况下,保持相同代码库与不同 Revit 版本兼容的最佳方法是什么?我可以很容易地想象使用 If 语句来确定每个 Revit 版本的正确 API 方法,但它对于工具的维护似乎并不理想。

如有任何建议,我们将不胜感激!

revit-api revit revitpythonshell pyrevit
2个回答
1
投票

自 Revit 2015 版以来,我一直在编写和管理插件,并使用

if
语句来确保向后兼容。他们还没有变得太失控......

值得编写一个小函数来将 Revit 版本作为字符串返回给您的

if
语句:

def revitVersion(): # returns '2020'
     return app.VersionName[-4:]

您还可以将

lists
放在一起以帮助检查功能:

revitsWithoutBIM360 = ['2015', '2016', '2017', '2018']

if revitVersion() in revitsWithoutBIM360:
     print 'This version or Revit can't access BIM360 projects'
else:
     # your code here

可能不是最优雅的处理方式,但对我有用。


0
投票

我从 Revit 2017 开始,直到 2021 年,我一直在使用几乎所有内容都有基本方法的库,运行良好。我采取了向项目添加新平台的方式(Revit2017、Revit2018 itd..)。 每年,所有这些 revit 都会有越来越多的编译选项,而我的磁盘上的内存越来越少(目前我有 7 个 revit)。 它一直有效,直到他们开始不仅改变一些小事情或添加新方法,当他们开始删除一些选项而没有任何办法解决这个问题时,问题就开始了。 现在,当他们将 Id 从 int 更改为 long 时,就更难了,甚至对枚举也这样做,这会导致转换出现一些问题,有时无法正常工作,编译器无法接受有时这个枚举来自 int 的想法并且在与 long 不同的版本中(不确定为什么会发生这种情况,但解决了 int 需求,例如愚蠢的铸造量) 另一个问题是我必须在每个版本中保存所有这些系列和模板,有些模板需要 15 分钟才能在新版本中保存,而且文件只有 100mb。 最大的问题是从枚举到 ForgeTypeId,过去你可以有一个很好的枚举开关,现在你有一大堆 if 语句,你需要用 ForgeTypeId 知道它是什么,而拥有它们的类描述得很糟糕,甚至通过创建 String 类和 Integer 类来创建一个巨大的 fopa。

但是回到一点,这是可能的,但这将是大量的工作,你需要的是让它最能让你的理智接受的是:

  • 在项目中创建自己的默认平台时,需要您自己将其写入项目文件中。
  • 在项目文件中设置语句,以在更改平台时更改对 Revitapi dll 的引用,这将帮助您更轻松地发现 api 问题
  • 为每个平台设置符号
  • 大多数方法都会有每个版本的编译选项
  • 以为每个版本制作 dll 的方式构建您的库,在您的应用程序中引用您所需的版本(在 Revit 中检查版本并不难) 它在基础上的工作方式类似于这些具有文件夹 x64 x86 的框架。

记住:如果你的项目不大(少于 2000 行),这会很好用,如果你有大项目,最好为最旧的版本留下一个(对我来说是 2017 年),然后跟上最后两个版本Revit。

© www.soinside.com 2019 - 2024. All rights reserved.