将 Revit 中的构件逻辑带入到编程中
Revit的二次开发中,很多开发者会首先使用Revit软件,然后再进行开发。这种方式通过将Revit中的结构和操作映射到代码设计中,可以在前期帮助开发者理解并快速实现需求。Revit中的构件逻辑分为族、族类别和构件三个层级,利用这些层级关系,可以很好地控制构件的配置、生成和放置。

在程序设计中,我们也可以借鉴这种层级思想。为了减少代码之间的耦合性 。
通常情况下,我们会在同一个文件下创建多个方法类,在这些方法类中,我们像在建模中一样逐步找到需要创建的族,并按指定的步骤进行构建。举个例子,假设我们需要在代码中绘制一面墙,可以像这样编写代码:
// Build a location line for the wall creation
XYZ start = new XYZ(0, 0, 0);
XYZ end = new XYZ(10, 10, 0);
Line geomLine = Line.CreateBound(start, end);
// Create a wall using the location line
Wall.Create(document, geomLine, level.Id, true);
这段代码中,我们首先定义了墙体的起点和终点坐标,然后调用 Wall.Create() 方法来创建墙体。这与Revit中的操作非常相似,体现了如何将Revit的概念和操作直接映射到编程逻辑中。
这是一个简单的逻辑映射,可能会有点抽象,但是当我们首先接触Revit在学习C#的时候就可以将一些Revit里面的概念带入进去,可以让我们更深的理解程序设计和逻辑。
切换所见即所得的思维
很多工程领域的从业者或学生在学习编程时,常常将“所见即所得”的思维模式直接应用到编程逻辑中。这样做的一个显著问题是,在测试模型和场景时看似没有问题,但一旦进入新项目或新的环境,就可能出现错误。这种情况通常发生在初学者忽视了一些潜在问题,将一些几何显示的细节理所当然地视为正确。
例如下面这个楼梯剖面标注的案例:

很多初学者再开始编写这个程序的时候会将逻辑梳理为:
- 找到设计师点击的鼠标左键位置
- 将平面坐标映射到Revit中
- 放置标记,完成整个功能
这种逻辑在正交视图中通常没有问题,但在处理斜视图时可能会出现偏差。虽然我们通常看到的视图是二维的,这是因为计算机显示器的屏幕本质上是一个二维平面,它只能呈现物体的投影,而无法显示实际的三维空间。
实际上,在建筑设计和建模中,视图往往是通过投影将三维物体压缩到一个平面上,这就导致了二维显示与三维空间之间的差异。当我们在正交视图中操作时,坐标位置是精确的,但在斜视图或三维剖面视图中,坐标的映射关系会受到视角变化的影响,从而产生误差。
下面是一个示意,左侧为正视图,右侧为斜视图:

因此,实际的坐标转换过程中,设计程序时如果仅仅依赖屏幕上的二维显示而忽略了斜视角度,可能会导致我们获取的用户点击位置与实际目标位置不符,产生偏差。

这就是一个典型的被“所见即所得”显示模式误导的案例。尽管我们在屏幕上看到的视图是正交显示,但在三维空间中,偏移问题不可忽视。
因此,在设计程序时,我们不仅要借鉴Revit的操作思路,还需要考虑到实际的三维情况,避免仅凭肉眼所见的二维效果来推断坐标转换逻辑,这种情况再很多几何操作和判定中会时常出现,为了避免会出现各种计算错误,需要提前考虑到这种情况,并进行规避才能更完善的编写运行程序。
如果您觉得这篇博客对您有所帮助或启发,请点赞👍
如果您有任何疑问或想法,请在评论区留言👇
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.