我有一些为 Revit 2019 或以下版本编写的 Revit 插件。现在我正在尝试升级Revit 2020的工具,但API方法似乎有一些重大变化。幸运的是,其中一些是向后兼容的,因此我只需使用新的 API 方法更新代码并将其用于 Revit 2020 和 2019。但是,其中一些仅适用于 Revit 2020。(例如)
ImageInstance.Create(Document, View, ElementId, ImagePlacementOptions
)
在这种情况下,保持相同代码库与不同 Revit 版本兼容的最佳方法是什么?我可以很容易地想象使用 If 语句来确定每个 Revit 版本的正确 API 方法,但它对于工具的维护似乎并不理想。
如有任何建议,我们将不胜感激!
自 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
可能不是最优雅的处理方式,但对我有用。
我从 Revit 2017 开始,直到 2021 年,我一直在使用几乎所有内容都有基本方法的库,运行良好。我采取了向项目添加新平台的方式(Revit2017、Revit2018 itd..)。 每年,所有这些 revit 都会有越来越多的编译选项,而我的磁盘上的内存越来越少(目前我有 7 个 revit)。 它一直有效,直到他们开始不仅改变一些小事情或添加新方法,当他们开始删除一些选项而没有任何办法解决这个问题时,问题就开始了。 现在,当他们将 Id 从 int 更改为 long 时,就更难了,甚至对枚举也这样做,这会导致转换出现一些问题,有时无法正常工作,编译器无法接受有时这个枚举来自 int 的想法并且在与 long 不同的版本中(不确定为什么会发生这种情况,但解决了 int 需求,例如愚蠢的铸造量) 另一个问题是我必须在每个版本中保存所有这些系列和模板,有些模板需要 15 分钟才能在新版本中保存,而且文件只有 100mb。 最大的问题是从枚举到 ForgeTypeId,过去你可以有一个很好的枚举开关,现在你有一大堆 if 语句,你需要用 ForgeTypeId 知道它是什么,而拥有它们的类描述得很糟糕,甚至通过创建 String 类和 Integer 类来创建一个巨大的 fopa。
但是回到一点,这是可能的,但这将是大量的工作,你需要的是让它最能让你的理智接受的是:
记住:如果你的项目不大(少于 2000 行),这会很好用,如果你有大项目,最好为最旧的版本留下一个(对我来说是 2017 年),然后跟上最后两个版本Revit。