在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 上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是在上面的代码加入使用B站API的步骤和代码: 1. 导入所需的模块和设置API请求头部信息 ```python import requests import json import pandas as pd from datetime import datetime # 设置请求头部信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } ``` 2. 修改爬虫函数,使用B站API获取视频详细信息 ```python def crawl_bilibili_top_rank(url): # 发送请求获取页面内容 resp = requests.get(url, headers=headers) # 使用BeautifulSoup解析页面 soup = BeautifulSoup(resp.text, 'html.parser') # 获取视频列表 video_list = soup.select('.rank-list > .rank-item') # 定义用于存储结果的列表 result = [] # 遍历视频列表,获取每个视频的详细信息 for video in video_list: # 获取视频标题 title = video.select_one('.title > a')['title'] # 获取视频链接 link = 'https:' + video.select_one('.title > a')['href'] # 获取视频的AV号 aid = link.split('/')[-1] # 获取视频的API链接 api_url = 'https://api.bilibili.com/x/web-interface/view?aid=' + aid # 发送请求获取视频的详细信息 api_resp = requests.get(api_url, headers=headers) # 解析API响应的JSON数据 api_data = json.loads(api_resp.text) # 获取视频的发布时间 pub_time = datetime.fromtimestamp(api_data['data']['pubdate']).strftime('%Y-%m-%d %H:%M:%S') # 获取视频的UP主名称 up_name = api_data['data']['owner']['name'] # 获取视频的播放量 view_count = api_data['data']['stat']['view'] # 获取视频的点赞量 like_count = api_data['data']['stat']['like'] # 获取视频的投币数 coin_count = api_data['data']['stat']['coin'] # 获取视频的收藏数 favorite_count = api_data['data']['stat']['favorite'] # 获取视频的标签 tags = ','.join([tag['name'] for tag in api_data['data']['tags']]) # 获取视频的介绍 desc = api_data['data']['desc'] # 将结果添加到列表 result.append([title, link, pub_time, up_name, view_count, like_count, coin_count, favorite_count, tags, desc]) # 返回结果列表 return result ``` 3. 调用爬虫函数并将结果写入CSV文件 ```python # 定义排行榜页面的链接 url = 'https://www.bilibili.com/v/popular/rank/food' # 调用爬虫函数 result = crawl_bilibili_top_rank(url) # 将结果转换为DataFrame格式 df = pd.DataFrame(result, columns=['标题', '链接', '发布时间', 'UP主', '播放量', '点赞量', '投币数', '收藏数', '标签', '介绍']) # 将DataFrame写入CSV文件 df.to_csv('bilibili_food_top_rank.csv', index=False) ``` 这样就完成了使用B站API爬取B站美食区排行榜视频信息并写入CSV文件的任务。注意,使用B站API需要注册B站开放平台并获取相应的API Key,具体的操作请参考B站开放平台的文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值