• 在View and Data API中更改指定元素的颜色


    大家在使用View and Data API开发过程中,经常会用到的就是改变某些元素的颜色已区别显示。比如根据某些属性做不同颜色的专题显示,或者用不同颜色表示施工进度,或者只是简单的以颜色变化来提醒用户以示区别。作为开发者,一定会喜欢看的这样的API:

    //load the extension 
    viewer.loadExtension('Autodesk.ADN.Viewing.Extension.Color');
    // an array of node Id
    var elementIds= [1735, 1736];
    //set color to red
    viewer.setColorMaterial(elementIds,0xff0000);  
    //restore to original color 
    viewer.restoreColorMaterial(elementIds);

    可惜View and Data API中并没有提供这样的API,不过我们可以自己来做。下面就是一个这样的扩展,如果你正好需要,可以直接拿去用。

    ///////////////////////////////////////////////////////////////////////////////
    // Autodesk.ADN.Viewing.Extension.Color
    //
    ///////////////////////////////////////////////////////////////////////////////
    AutodeskNamespace("Autodesk.ADN.Viewing.Extension");
    Autodesk.ADN.Viewing.Extension.Color = function(viewer, options) {
    
        Autodesk.Viewing.Extension.call(this, viewer, options);
    
        var overlayName = "temperary-colored-overlay";
        var _self = this;
    
        _self.load = function() {
    
            console.log('Autodesk.ADN.Viewing.Extension.Color loaded');
            ///////////////////////////////////////////////////////////////////////////
            // Generate GUID
            //
            ///////////////////////////////////////////////////////////////////////////
            function newGuid() {
                var d = new Date().getTime();
                var guid = 'xxxx-xxxx-xxxx-xxxx-xxxx'.replace(/[xy]/g, function(c) {
                    var r = (d + Math.random() * 16) % 16 | 0;
                    d = Math.floor(d / 16);
                    return (c == 'x' ? r : (r & 0x7 | 0x8)).toString(16);
                });
                return guid;
            };
    
            ///////////////////////////////////////////////////////////////////////////
            // add new material
            //
            ///////////////////////////////////////////////////////////////////////////
            function addMaterial(color) {
                var material = new THREE.MeshPhongMaterial({
                    color: color
                });
                //viewer.impl.matman().addMaterial(newGuid(), material);
                viewer.impl.createOverlayScene(overlayName, material, material);
                return material;
            }
    
            ///////////////////////////////////////////////////////////////////////////
            // Set color for nodes
            // objectIds should be an array of dbId
            // 
            //
            ///////////////////////////////////////////////////////////////////////////
            Autodesk.Viewing.Viewer3D.prototype.setColorMaterial = function(objectIds, color) {
                var material = addMaterial(color);
    
                for (var i=0; i<objectIds.length; i++) {
    
                    var dbid = objectIds[i];
    
                    //from dbid to node, to fragid
                    var it = viewer.model.getData().instanceTree;
    
                    it.enumNodeFragments(dbid, function (fragId) {
    
                        
                        var renderProxy = viewer.impl.getRenderProxy(viewer.model, fragId);
                        
                        renderProxy.meshProxy = new THREE.Mesh(renderProxy.geometry, renderProxy.material);
    
                        renderProxy.meshProxy.matrix.copy(renderProxy.matrixWorld);
                        renderProxy.meshProxy.matrixWorldNeedsUpdate = true;
                        renderProxy.meshProxy.matrixAutoUpdate = false;
                        renderProxy.meshProxy.frustumCulled = false;
    
                        viewer.impl.addOverlay(overlayName, renderProxy.meshProxy);
                        viewer.impl.invalidate(true);
                        
                    }, false);
                }
    
            }
    
    
            Autodesk.Viewing.Viewer3D.prototype.restoreColorMaterial = function(objectIds) {
           
                for (var i=0; i<objectIds.length; i++) {
    
                    var dbid = objectIds[i];
    
    
                    //from dbid to node, to fragid
                    var it = viewer.model.getData().instanceTree;
    
                    it.enumNodeFragments(dbid, function (fragId) {
    
                        
                         var renderProxy = viewer.impl.getRenderProxy(viewer.model, fragId);
    
                        if(renderProxy.meshProxy){
    
                          //remove all overlays with same name
                          viewer.impl.clearOverlay(overlayName);
                          //viewer.impl.removeOverlay(overlayName, renderProxy.meshProxy);
                          delete renderProxy.meshProxy;
                          
    
                          //refresh the sence
                          
                          viewer.impl.invalidate(true);
    
    
                        }
                                             
                    }, true);
                }
    
      
            }
    
            _self.unload = function() {
                console.log('Autodesk.ADN.Viewing.Extension.Color unloaded');
                return true;
            };
        };
    };
    Autodesk.ADN.Viewing.Extension.Color.prototype = Object.create(Autodesk.Viewing.Extension.prototype);
    Autodesk.ADN.Viewing.Extension.Color.prototype.constructor = Autodesk.ADN.Viewing.Extension.Color;
    Autodesk.Viewing.theExtensionManager.registerExtension('Autodesk.ADN.Viewing.Extension.Color', Autodesk.ADN.Viewing.Extension.Color);
     

    这段代码我也在我的IoT示例中使用,源代码在 github 上。

  • 相关阅读:
    ant build打包
    在JAVA中如何获取当前源文件名以及代码的行号
    react以组件为中心的代码分割和懒加载
    java中针对 try和finally一些总结
    JS强制关闭浏览器页签并且不提示关闭信息
    由[].slice.call()引发的思考
    JS类型判断
    nginx的location配置
    DBCP连接池
    java/Servlet
  • 原文地址:https://www.cnblogs.com/junqilian/p/5031333.html
Copyright © 2020-2023  润新知