想象这样的一些场景:
你是一位建筑设计师,需要与你配合的结构工程师确认和修改模型的细节。而工程师并不在你身边站着,也没有跟你共享这个模型,那你需要把整个Revit模型拷贝给他,他把修改后的模型返还后,你去对照修正合并两个模型。或者一开始就截图说明发个邮件阐述问题,根据他的回复自己去修改模型。
或者你还是一位建筑设计师,你有个模型细节需要甲方去敲定和修改,比起打电话和发邮件,语言和文字的阐述,不如让对方在模型上改动或圈点最直接,然而对方电脑上并没有Revit,也不会操作Revit。
或者你此刻在工地现场,也许是个旧建筑改造项目,你发现实际现场的构件位置与你模型中建模的位置不一致。你不想等,那一刻就想修改一下模型,要么是怕自己忘了,要么在办公室里有同事正在这个模型上工作,你想及时通知他。可是你此刻并没有电脑,只有一部能上网的手机或者平板。
如果以上这些场景会发生,如果这样的场景给一些人甚至就是你带来了困扰和麻烦,那有没有什么方式解决呢?
这篇文章希望能探索一种思路。
还是先假定一个简单的场景:我是一个结构工程师,正在设计一面墙,或是使用轻钢或者木结构,最终排布的立柱位置如下图蓝色高亮的部分。这里再假设我需要找一位设备工程师来确认这些立柱的位置是否与他的设计冲突,而他使用CAD出图,没有Revit模型,也不在同一家公司可以叫到工位旁边,甚至说我自己也不想把完整的Revit的模型分享给他。
好吧,现在开始解决问题。
首先要解决的是解除对于Revit环境的依赖。
因为在以上场景中要么对方没有Revit,要么自己因为信息的敏感性也不愿意共享自己的Revit模型。基于这样的需求,似乎云共享模型的想法已经呼之欲出了。
我这里解决的方案是用Node.js简单搭建了一个网页APP,前端显示的部分和后端模型数据处理采用Autodesk Forge提供的工具,鉴于是Revit的原生模型,这样是非常省力的。其实如果场景的需求不高,自己从头用WebGL搭建也是可行的。
完成这一步,就可以得到如下图的一个网页端APP了。既然是网页端的,而且是Revit脱敏模型,那么回想之前所列的各种场景:害怕对方拷贝模型的我,与我不在同一间办公室的工程师,电脑没有Revit的甲方,在工地现场只有一部手机的工程师。
他们都只需要打开网页浏览器,即可看到我电脑上Revit模型,并且在网页上对构件进行测量定位。
如果把之前的需求分为需要对方“确认”和“修改”两个部分,其实到上面一步“确认”的问题就解决了。
而如果需要对方还能修改这个模型怎么办呢?
首先从网页端就要实现模型的可修改。
鉴于Forge是不提供修改功能的,这里需要通过其提供的extension接口,自己实现构件的修改与移动。如下图,最右边的图标则是自己制作的构件移动扩展功能,当按下按钮后,点选构件,会在构件上显示三维坐标系,此时网页端的构件变成可以移动的了。
然而网页端的修改,是无法储存的,此时刷新这个页面,会发现上图移动过的构件又恢复原先的位置了。这是因为Autodesk Forge只提供展示功能,并不支持修改,我们需要自己建立一个存储方式,来记录构件的修改信息和新的位置。我是通过Node.js把网页app上构件位置的信息,发送到云端数据库,例如MongoDB上。
由于最终目的是把网页端的修改,反映到本地的Revit 模型上。那么接下来一步。只需要把MongoDB 上的数据,拉取到Revit模型中即可。这听起来就是写一个Revit插件就能解决的事:
然而在开始编写Revit插件的时候,发现如何获取网页端改变的通知是一个挑战。
直觉上,只需要在Revit插件中增加一个轮询,每隔一个时间段去访问检查云端数据库,比较云端数据与本地模型的差别即可,原理如下图:
但实际做出来后,发现有个致命的问题,就是这个插件明显拖慢了Revit的运行速度…
经过一些比较和尝试,发现使用Websocket技术,能有效的缓解轮询带来的运行速度拖慢问题。
解决了如上的这些问题,最终的效果用这个动图来说明吧。通过操作左边网页上的立柱,右边本地Revit模型里的立柱位置跟随改变。到此,实现了一个通过修改网页模型,联动修改本地Revit模型的方案雏形。
加入QQ群,我们一起来探索YJK-GAMA的
无限可能!
转自:非解构-公众号