Dynamo For Revit:官方如何开发C#节点

前言

Revit 2021 发布了10个 Dynamo 新节点,刚好借此机会看一下 Dynamo 是如何开发的。

介绍

从官网说明,Revit Nodes for Dynamo 2.5,找到提示的 GitHub 入口,最终来到:https://github.com/DynamoDS/DynamoRevit/pull/2454。
从这个界面上看到,如果要提交新的 Node,至少需要以下几个部分:

  1. 节点本身的介绍
  2. 单元测试,自己写,并且通过测试
  3. 声明你的节点有百益而无一害

如何真正开发节点

如何真正开发节点?节点的实现 + 单元测试。
以新发的节点 Element.AreJoined 为例。

节点的实现

首先,你需要实现。这里是最简单的例子,因为原来已经有了 Element 类,所以只需要在它里面添加即可。
public 方法会直接被系统调用,并且变成一个节点,具体过程不必纠结,应该是通过 C# 的反射机制来完成的。实际上,其它的 ZeroTouch 节点也是通过反射来获得的。

// src/Libraries/RevitNodes/Elements/Element.cs
namespace Revit.Elements
{
    //[SupressImportIntoVM]
    public abstract class Element : IDisposable, IGraphicItem, IFormattable
    {
    	// 其它代码
    	// ...
    	
        public bool AreJoined(Element otherElement)
        {
            return JoinGeometryUtils.AreElementsJoined(
                Document,
                this.InternalElement,
                otherElement.InternalElement);
        }
    }
}

单元测试

有了节点的实现之后,必须写测试,以防以后功能坏了。
这里写了两个测试,CanCheckIfTwoElementsAreJoinedCanSuccessfullyCheckIfTwoElementsAreJoined

CanCheckIfTwoElementsAreJoined

Element 的测试已经有一些了,所以不用自己写一个测试类,只需要添加测试即可。不过如果想要自己添加也是可以的,继承 RevitSystemTestBase
测试模型,如果有的话可以加上,这样跑测试的时候希望打开这个模型, [TestModel(@".\Element\elementJoin.rvt")]
如果你的测试直接是一个脚本,那么也是可以的,打开 ViewModel.OpenCommand.Execute(testPath),运行 RunCurrentModel()
最后判断一下结果。"b29dc14336bc4c9382f9acc5036d632f"可从脚本里面找到, test/System/Element/canCheckIfTwoElementsAreJoined.dyn

// test/Libraries/RevitIntegrationTests/ElementTests.cs
namespace RevitSystemTests
{
    [TestFixture]
    class ElementTests : RevitSystemTestBase
    {
        [Test]
        [TestModel(@".\Element\elementJoin.rvt")]
        public void CanCheckIfTwoElementsAreJoined()
        {
            // Arange
            string samplePath = Path.Combine(workingDirectory, @".\Element\canCheckIfTwoElementsAreJoined.dyn");
            string testPath = Path.GetFullPath(samplePath);

             ViewModel.OpenCommand.Execute(testPath);
            RunCurrentModel();

             // Act - Get values of the two IsJoined nodes
            // first one should return false as it is checking two elements that are not joined
            // second one should return true as it test two joined elements
            var isJoinedFalse = GetPreviewValue("b29dc14336bc4c9382f9acc5036d632f");
            var isJoinedTrue = GetPreviewValue("b49a72f29d504acdb524ab0953623ea5");

             // Assert
            Assert.AreEqual(true, isJoinedTrue);
            Assert.AreEqual(false, isJoinedFalse);
        }
    }
}

CanSuccessfullyCheckIfTwoElementsAreJoined

这个测试和前一个不同点在于,它不是打开一个 dyn 文件来运行,然后查看结果是否符合预期,而是直接用代码来判断。
它的逻辑是打开一个文件,.\Element\elementJoin.rvt,选择,然后用代码,bool arejoined = element.AreJoined(otherElement),来判断结果。

// test/Libraries/RevitIntegrationTests/ElementTests.cs
namespace RevitSystemTests
{
    [TestFixture]
    class ElementTests : RevitSystemTestBase
    {
        [Test]
        [TestModel(@".\Element\elementJoin.rvt")]
        public void CanSuccessfullyCheckIfTwoElementsAreJoined()
        {
            var wall1 = ElementSelector.ByElementId(184176, true);
            var wall2 = ElementSelector.ByElementId(207960, true);
            var floor = ElementSelector.ByElementId(208259, true);
            var beam1 = ElementSelector.ByElementId(208422, true);
            var beam2 = ElementSelector.ByElementId(208572, true);

             // Check if different kinds of elements are joined
            // wall1 and wall2 are joined
            AssertElementsAreJoined(wall1, wall2, true);
            // wall1 and floor are joined
            AssertElementsAreJoined(wall1, floor, true);
            // wall2 and floor are not joined
            AssertElementsAreJoined(wall2, floor, false);
            // wall1 and beam1 are joined
            AssertElementsAreJoined(wall1, beam1, true);
            // wall2 and beam2 are not joined
            AssertElementsAreJoined(wall2, beam2, false);
            // beam1 and beam2 are joined
            AssertElementsAreJoined(beam1, beam2, true);
            // beam1 and floor are joined
            AssertElementsAreJoined(beam1, floor, true);
        }
        private static void AssertElementsAreJoined(Element element, Element otherElement, bool expected)
        {
            bool arejoined = element.AreJoined(otherElement);
            Assert.AreEqual(expected, arejoined);
        }
    }
}

总结

从这个提交里面看到,Dynamo 的开发流程还是很严格的,测试代码比实现代码多很多,还需要自己提供测试脚本和文件。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客BIM工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值