本次咱们探讨模型颜色操做,正如您已经注意到的模型在默认状况下具备合理的图形表示形式。这是从 IFC 模型, 它应该在全部的工具看起来相同, 它应该看起来像在您或您的用户的创做环境。可是,有时可以对这种表示进行修改以向用户报告某种结果 (分类, 错误报告, 冲突检测等) 很是重要。javascript
咱们将使用在HTML 元素的onclick 属性中定义的Javascript函数使用难看的代码,这是不推荐的作法,但为了清晰和简单起见,鼓励您遵循这些准则来 编写可持续和清晰的Web应用程序。css
首先有必要定义本身的风格,有简单的函数 defineStyle()来作到这一点。您最多能够定义224种样式。咱们将在如下代码中为每种产品类型定义新颜色:html
<button onclick="Recolour()">按类型从新着色</button> <button onclick="if (viewer) viewer.resetStyles();">重置</button> <script type="text/javascript"> function Recolour() { if (!viewer) return; var index = 0; for (var i in xProductType) { var type = xProductType[i]; var colour = [Math.random() * 255, Math.random() * 255, Math.random() * 255, 255]; viewer.defineStyle(index, colour); viewer.setStyle(index, type); index++; } }; </script>
您能够根据须要扩展此示例。只需定义0 - 224种颜色样式,并将其设置为产品或产品类型的覆盖样式。若是您想将样式重置为其默认使用的resetStyles()函数。java
还有一个视觉特征,那就是突出显示。你能够把它看做是一个选择,但这样作并非太好。它将全部最终的选择逻辑留给你。这只是一种视觉表现。canvas
<select id="cmbSelection"> <option value="noAction">无</option> <option value="select">选择</option> </select> <button onclick="if (viewer) viewer.resetStates()">重置</button> <script type="text/javascript"> function initHighlighting() { viewer.on('pick', function (args) { var cmb = document.getElementById('cmbSelection'); var option = cmb.value; switch (option) { case 'select': viewer.setState(xState.HIGHLIGHTED, [args.id]); break; case 'hide': viewer.setState(xState.HIDDEN, [args.id]); break; default: break; } }); }; </script>
这种方法的好处在于突出显示与其余视觉外观是分开的。您不能同时突出显示和隐藏产品,但这是有道理的。重要的是您能够显示分析结果并同时进行选择。若是你放弃选择,你仍然有一个有效的结果表示。您一般能够以任何方式组合样式和状态。浏览器
总体的HTML 代码 以下:dom
<link href="styles/xviewer-styles.css" rel="stylesheet" /> <script src="scripts/xbim-viewer.debug.bundle.js"></script>
<body> <div id="main"> <div> <div class="xviewer-control"> <button onclick="Recolour()">按类型从新着色</button> <button onclick="if (viewer) viewer.resetStyles();">重置样式</button> <script type="text/javascript"> function Recolour() { if (!viewer) return; var index = 0; for (var i in xProductType) { var type = xProductType[i]; var colour = [Math.random() * 255, Math.random() * 255, Math.random() * 255, 255]; viewer.defineStyle(index, colour); viewer.setStyle(index, type); index++; } }; </script> </div> <div class="xviewer-control"> 选择操做: <select id="cmbSelection"> <option value="noAction">无</option> <option value="select">选择</option> <option value="hide">隐藏</option> </select> <button onclick="if (viewer) viewer.resetStates()">重置</button> <script type="text/javascript"> function initHighlighting() { viewer.on('pick', function (args) { var cmb = document.getElementById('cmbSelection'); var option = cmb.value; switch (option) { case 'select': viewer.setState(xState.HIGHLIGHTED, [args.id]); break; case 'hide': viewer.setState(xState.HIDDEN, [args.id]); break; default: break; } }); }; </script> </div> </div> <canvas id="viewer" width="500" height="300"></canvas> <div> 您选择产品的编号: <span id="productId">model</span>. </div> <div id="errors"></div> <script type="text/javascript"> //检查 var check = xViewer.check(); var viewer = null; var pickedId = null; if (check.noErrors) { viewer = new xViewer('viewer'); viewer.on('loaded', function () { initHighlighting(); viewer.start(); }); viewer.on('error', function (arg) { var container = document.getElementById('errors'); if (container) { //相关的错误 container.innerHTML = "<pre style='color:red;'>" + arg.message + "</pre> <br />" + container.innerHTML; } }); viewer.on('pick', function (args) { var id = args.id; var span = document.getElementById('productId'); if (span) { span.innerHTML = id ? id : 'model'; } }); viewer.load('data/SampleHouse.wexbim'); } else { var msg = document.getElementById('errors'); for (var i in check.errors) { var error = check.errors[i]; msg.innerHTML += "<pre style='color: red;'>" + error + "</pre> <br />"; } } </script> </div>