xBIM 实战02 在浏览器中加载IFC模型文件并设置特效
在模型浏览器中加载模型后,可以对模型做一些特殊操作。下图是常用的设置。
都是通过 xbim-viewer.js 中的 API 来设置以达到一定的效果。代码如下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>xViewer</title> 5 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> 6 7 <script src="Content/Libs/gl-matrix.js"></script> 8 <script src="Content/Libs/webgl-utils.js"></script> 9 <script type="text/javascript" src="Content/Viewer/xbim-product-type.debug.js"></script> 10 <script type="text/javascript" src="Content/Viewer/xbim-state.debug.js"></script> 11 <script type="text/javascript" src="Content/Viewer/xbim-shaders.debug.js"></script> 12 <script type="text/javascript" src="Content/Viewer/xbim-model-geometry.debug.js"></script> 13 <script type="text/javascript" src="Content/Viewer/xbim-model-handle.debug.js"></script> 14 <script type="text/javascript" src="Content/Viewer/xbim-binary-reader.debug.js"></script> 15 <script type="text/javascript" src="Content/Viewer/xbim-triangulated-shape.debug.js"></script> 16 <script type="text/javascript" src="Content/Viewer/xbim-viewer.debug.js"></script> 17 18 <script src="Content/Plugins/NavigationCube/xbim-navigation-cube-shaders.debug.js"></script> 19 <script src="Content/Plugins/NavigationCube/xbim-navigation-cube.debug.js"></script> 20 <script src="Content/Plugins/NavigationCube/xbim-navigation-cube-textures.debug.js"></script> 21 22 <script src="Content/Plugins/NavigationHome/xbim-navigation-home-textures.debug.js"></script> 23 <script src="Content/Plugins/NavigationHome/xbim-navigation-home.debug.js"></script> 24 <script src="Content/Libs/jquery.js"></script> 25 <style> 26 html, body { 27 height: 100%; 28 padding: 0; 29 margin: 0; 30 } 31 32 canvas { 33 display: block; 34 border: none; 35 margin-left: auto; 36 margin-right: auto; 37 } 38 39 #operate { 40 display: inline; 41 border: 1px; 42 margin-top: 20px; 43 margin-left: 20px; 44 margin-right: auto; 45 padding-top: 20px; 46 } 47 48 .select { 49 margin-top: 20px; 50 margin-left: 20px; 51 } 52 </style> 53 </head> 54 <body> 55 <div id="msg"></div> 56 <div class="select"> 57 <input type="file" id="input" accept=".wexbim" /> 58 </div> 59 <div style="float: left; margin: 20px;"><canvas id="xBIM-viewer" width="750" height="500"></canvas></div> 60 <div id="operate"> 61 <div> </div> 62 <div> 63 <div> 64 Selected ID: <span id="coords"></span> 65 </div> 66 <div> 67 帧数 (FPS): <span id="fps"></span> 68 </div> 69 </div> 70 <div> </div> 71 <div> 72 导航模式: 73 <button onclick="setNavigation('zoom');">缩放</button> 74 <button onclick="setNavigation('pan');">平移</button> 75 <button onclick="setNavigation('fixed-orbit');">固定动态观察</button> 76 <button onclick="setNavigation('free-orbit');">自由动态观察</button> 77 <button onclick="setNavigation('none');">无</button> 78 </div> 79 <div> </div> 80 <div> 81 观察视角: 82 <button onclick="setShow('front');">前</button> 83 <button onclick="setShow('back');">后</button> 84 <button onclick="setShow('top');">上</button> 85 <button onclick="setShow('bottom');">下</button> 86 <button onclick="setShow('left');">左</button> 87 <button onclick="setShow('right');">右</button> 88 </div> 89 <div> </div> 90 <div> 91 局部: 92 <button onclick="clip();">剖切</button> 93 <button onclick="unclip();">复原</button> 94 </div> 95 <div> </div> 96 <div> 97 相机: 98 <button onclick="setCamera('perspective');">透视</button> 99 <button onclick="setCamera('orthogonal');">正交</button> 100 </div> 101 <div> </div> 102 <div> 103 渲染模式: 104 <label> 105 <input type="radio" name="radioRenderingMode" value="normal" checked="checked" onchange="setRenderingMode('normal');" /> Normal 106 </label> 107 <label> 108 <input type="radio" name="radioRenderingMode" value="xray" onchange="setRenderingMode('x-ray');" /> X-Ray 109 </label> 110 </div> 111 <div> </div> 112 <div> 113 其他: 114 <button onclick="selectAllWalls();">选中所有墙</button> 115 <button onclick="resetWalls();">复原</button> 116 <button onclick="hideWalls();">隐藏所有墙</button> 117 </div> 118 <div> </div> 119 <div> 120 设置状态: 121 <button onclick="setStateShowAll();">显示所有</button> 122 <button onclick="setStateGlass();">设置滤镜效果</button> 123 <button onclick="setStateWhite();">设置为白色</button> 124 <button onclick="setStateDefault();">设置默认</button> 125 <button onclick="setStateHideSpace();">隐藏空格</button> 126 <button onclick="setStateShowSpace();">显示空格</button> 127 </div> 128 </div> 129 <script type="text/javascript"> 130 var modelId = -9999; 131 var check = xViewer.check(); 132 if (check.noErrors) { 133 var viewer = new xViewer("xBIM-viewer"); 134 viewer.background = [0, 0, 0]; //设置模型浏览器的背景色 135 136 viewer.on("error", 137 function (arg) { 138 var container = viewer._canvas.parentNode; 139 if (container) { 140 container.innerHTML = "<pre style='color:red;'>" + arg.message + "</pre>" + container.innerHTML; 141 } 142 }); //实时监控异常发生事件 143 144 viewer.show("back"); 145 146 viewer.on("loaded", function (model) { 147 modelId = model.id; //第一次加载的是0,第二次加载的1,每次递增 148 }); 149 150 viewer.on("pick", function (arg) { 151 var span = document.getElementById("coords"); 152 if (span) { 153 span.innerHTML = arg.id; 154 } 155 }); 156 viewer.on("mouseDown", function (arg) { 157 viewer.setCameraTarget(arg.id); 158 }); 159 viewer.on("fps", function (fps) { 160 var span = document.getElementById("fps"); 161 if (span) { 162 span.innerHTML = fps; 163 } 164 }); 165 var span = document.getElementById("fpt"); 166 if (span) { 167 span.innerHTML = viewer._fpt != null; 168 } 169 170 //viewer.load("Content/tests/data/rac_advanced_sample_project.wexbim"); //加载模型文件 171 //viewer.start(); //使用此函数可以启动模型的动画。如果在加载几何图形之前启动动画,它将等待内容呈现。此函数绑定到屏幕的浏览器帧速率,因此如果切换到其他选项卡,它将停止消耗任何资源。 172 173 $("#input").change(function () { 174 if (!input.files) return; 175 176 var file = this.files[0]; 177 if (!file) return; 178 179 if (modelId !== -9999) { 180 viewer.unload(modelId); //如果之前已经加载过模型,则将模型卸载掉 181 } 182 183 viewer.load(file, file.name);//重新加载新的模型 184 viewer.start(); 185 186 var cube = new xNavigationCube(); 187 viewer.addPlugin(cube); // 添加立方体导航 188 189 var home = new xNavigationHome(); 190 viewer.addPlugin(home); // 添加首页导航 191 }); 192 193 // 设置导航模式 194 var setNavigation = function (mode) { 195 viewer.navigationMode = mode; 196 } 197 198 // 设置观察视角 199 var setShow = function (direction) { 200 viewer.show(direction); 201 } 202 203 // 剖切 204 var clip = function () { 205 viewer.clip(); 206 } 207 208 // 还原 209 var unclip = function () { 210 viewer.unclip(); 211 } 212 213 // 设置相机模式 214 var setCamera = function (mode) { 215 viewer.camera = mode; 216 } 217 218 // 设置渲染模式 219 var setRenderingMode = function (mode) { 220 viewer.renderingMode = mode; 221 } 222 223 var types = xProductType; 224 var states = xState; 225 viewer.defineStyle(0, [255, 0, 0, 255]); //red 226 viewer.defineStyle(1, [0, 0, 255, 100]); //semitransparent blue 227 viewer.defineStyle(2, [255, 255, 255, 255]); //white 228 229 // 选中所有墙 230 var selectAllWalls = function () { 231 viewer.setState(states.HIGHLIGHTED, types.IFCWALLSTANDARDCASE); 232 viewer.setState(states.HIGHLIGHTED, types.IFCCURTAINWALL); 233 viewer.setState(states.HIGHLIGHTED, types.IFCWALL); 234 } 235 236 // 隐藏所有墙 237 var hideWalls = function () { 238 viewer.setState(states.HIDDEN, types.IFCWALLSTANDARDCASE); 239 viewer.setState(states.HIDDEN, types.IFCCURTAINWALL); 240 viewer.setState(states.HIDDEN, types.IFCWALL); 241 } 242 243 // 复原 244 var resetWalls = function () { 245 viewer.setState(states.UNDEFINED, types.IFCWALLSTANDARDCASE); 246 viewer.setState(states.UNDEFINED, types.IFCCURTAINWALL); 247 viewer.setState(states.UNDEFINED, types.IFCWALL); 248 } 249 250 // 设置状态,显示所有 251 var setStateShowAll = function() { 252 for (var i in types) { 253 if (types[i] !== types.IFCSPACE) { 254 viewer.setState(states.UNDEFINED, types[i]); 255 } 256 } 257 } 258 259 // 设置状态,滤镜效果 260 var setStateGlass = function() { 261 for (var i in types) { 262 if (types[i] !== types.IFCSPACE) { 263 viewer.setStyle(1, types[i]); 264 } 265 } 266 } 267 268 // 设置状态,白色效果 269 var setStateWhite = function() { 270 for (var i in types) { 271 if (types[i] !== types.IFCSPACE) { 272 viewer.setStyle(2, types[i]); 273 } 274 } 275 } 276 277 // 设置状态,默认效果 278 var setStateDefault = function() { 279 for (var i in types) { 280 if (types[i] !== types.IFCSPACE) { 281 viewer.setStyle(xState.UNSTYLED, types[i]); 282 } 283 } 284 } 285 286 // 设置状态,隐藏空格 287 var setStateHideSpace = function() { 288 viewer.setState(states.HIDDEN, types.IFCSPACE); 289 } 290 291 // 设置状态,显示空格 292 var setStateShowSpace = function() { 293 viewer.setState(states.UNDEFINED, types.IFCSPACE); 294 } 295 296 } else { 297 alert("您浏览器版本过低,不支持WebGL技术。请升级浏览器。"); 298 299 var msg = document.getElementById("msg"); 300 for (var i in check.errors) { 301 var error = check.errors[i]; 302 msg.innerHTML += "<div style='color: red;'>" + error + "</div>"; 303 } 304 } 305 </script> 306 </body> 307 </html>
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!