【autodesk】浏览器中渲染rvt模型

news2024/9/30 21:31:12

使用Forge完成渲染

Forge是什么 为什么能够渲染出来rvt模型

  • Forge是由Autodesk开发的一套云端开发平台和工具集。
  • 在Forge平台中,有一个名为"Model Derivative"的服务,它可以将包括RVT(Revit)在内的多种BIM(Building Information Modeling)文件格式转换为可在Web上浏览和渲染的格式。
  • 具体来说,"Model Derivative"服务可以将RVT(Revit)文件转换为SVF(Scalable Vector Graphics)格式。
  • SVF是一种基于Web的轻量级3D模型表示格式,可以实现高性能的3D模型渲染和交互。通过将RVT文件转换为SVF格式,可以在Web端使用Forge提供的Viewer组件加载和展示RVT模型

Forge与Autodesk的关系

  • Autodesk是一家设计软件公司,Forge可以视为Autodesk的云端扩展

渲染步骤:

首先要注册autodesk平台,并创建项目 获取自己的client_id与client_secret

官网地址:Autodesk Platform Services (formerly Forge)

如下图:

配置postman环境 

下面我们演示通过postman上传模型到Forge云端,然后配置Forge的js渲染出来

post环境文件:

BIM.postman collection.json

{
	"info": {
		"_postman_id": "aedeb5db-ab5a-4b0e-ba31-d329f6ef66ba",
		"name": "Beijing-Workshop",
		"schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json",
		"_exporter_id": "24665034"
	},
	"item": [
		{
			"name": "1获取access token",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"var data = JSON.parse(responseBody);",
							"postman.setEnvironmentVariable(\"access_token\", data.access_token);",
							"postman.setEnvironmentVariable(\"expires_in\", data.expires_in);",
							"postman.setEnvironmentVariable(\"token_type\", data.token_type);"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Content-Type",
						"value": "application/x-www-form-urlencoded"
					}
				],
				"body": {
					"mode": "urlencoded",
					"urlencoded": [
						{
							"key": "client_id",
							"value": "{{client_id}}",
							"type": "text"
						},
						{
							"key": "client_secret",
							"value": "{{client_secret}}",
							"type": "text"
						},
						{
							"key": "grant_type",
							"value": "client_credentials",
							"type": "text"
						},
						{
							"key": "scope",
							"value": "data:read data:write bucket:create bucket:read",
							"type": "text"
						},
						{
							"key": "expires_in",
							"value": "360000",
							"type": "text"
						}
					]
				},
				"url": "{{base_domain}}/authentication/v1/authenticate"
			},
			"response": []
		},
		{
			"name": "2创建的存储桶(bucket)",
			"event": [
				{
					"listen": "prerequest",
					"script": {
						"exec": [
							"if (request.data) {",
							"    var requestData = JSON.parse(request.data);",
							"    postman.setEnvironmentVariable(\"bucketKey\", requestData.bucketKey);",
							"    postman.setEnvironmentVariable(\"bucketPolicy\", requestData.policyKey);",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					},
					{
						"key": "Content-Type",
						"value": "application/json"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n  \"bucketKey\":\"ac-persistent-bucket-test8\",\n  \"policyKey\":\"persistent\"\n}"
				},
				"url": "{{base_domain}}/oss/v2/buckets"
			},
			"response": []
		},
		{
			"name": "3 查看bucket是否创建成功",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": {
					"raw": "{{base_domain}}/oss/v2/buckets?limit=10",
					"host": [
						"{{base_domain}}"
					],
					"path": [
						"oss",
						"v2",
						"buckets"
					],
					"query": [
						{
							"key": "limit",
							"value": "10"
						}
					]
				}
			},
			"response": []
		},
		{
			"name": "4往bucket里放置object模型",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"if (responseCode.code === 200) {",
							"    var data = JSON.parse(responseBody);",
							"    postman.setEnvironmentVariable(\"urn\", data.objectId);",
							"    postman.setEnvironmentVariable(\"urnBase64\", window.btoa(data.objectId));",
							"    postman.setEnvironmentVariable(\"file_location\", data.location);",
							"}",
							""
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "PUT",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"body": {
					"mode": "file",
					"file": {
						"src": "/C:/Users/ac135/Desktop/rvtText/data/textOne.rvt"
					}
				},
				"url": "{{base_domain}}/oss/v2/buckets/{{bucketKey}}/objects/aggregate-1.rvt"
			},
			"response": []
		},
		{
			"name": "5检查对象模型是否成功上传",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": "{{base_domain}}/oss/v2/buckets/{{bucketKey}}/objects"
			},
			"response": []
		},
		{
			"name": "6将模型在云端转换成SVF格式",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							"var data = JSON.parse(responseBody);",
							"",
							"var setEnvVar = function (tar, src) {",
							"    if (!src) {",
							"        return;",
							"    }",
							"    postman.setEnvironmentVariable(tar, src);",
							"}",
							"",
							"if (data) {",
							"    if (data.urn) {",
							"        setEnvVar(\"urnBase64\", data.urn);",
							"    }",
							"}"
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					},
					{
						"key": "Content-Type",
						"value": "application/json"
					},
					{
						"key": "x-ads-force",
						"value": "true"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n    \"input\": {\n        \"urn\": \"{{urnBase64}}\" \n    },\n    \"output\": {\n        \"destination\": {\n            \"region\": \"us\"\n        },\n        \"formats\": [\n        {\n            \"type\": \"svf\",\n            \"views\":[\"2d\", \"3d\"]\n        }]\n    }\n}"
				},
				"url": "{{base_domain}}/modelderivative/v2/designdata/job"
			},
			"response": []
		},
		{
			"name": "7检查模型是否转化完成",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					},
					{
						"key": "Accept",
						"value": "application/vnd.api+json,application/json"
					}
				],
				"url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/manifest"
			},
			"response": []
		},
		{
			"name": "04-POST job",
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"var data = JSON.parse(responseBody);",
							"",
							"",
							"if (data) {",
							"    if (data.urn) {",
							"        postman.setEnvironmentVariable(\"urnBase64\", data.urn);",
							"    }",
							"}"
						]
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					},
					{
						"key": "Content-Type",
						"value": "application/json"
					},
					{
						"key": "x-ads-force",
						"value": "true"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\n    \"input\": {\n        \"urn\": \"{{urnBase64}}\" \n    },\n    \"output\": {\n        \"destination\": {\n            \"region\": \"us\"\n        },\n        \"formats\": [\n        {\n            \"type\": \"svf\",\n            \"views\":[\"2d\", \"3d\"]\n        }]\n    }\n}"
				},
				"url": "{{base_domain}}/modelderivative/v2/designdata/job"
			},
			"response": []
		},
		{
			"name": "06-GET metadata",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/metadata"
			},
			"response": []
		},
		{
			"name": "07-GET metadata/​:guid",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					},
					{
						"key": "Accept-Encoding",
						"value": "gzip"
					}
				],
				"url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/metadata/{{metadata_guid}}"
			},
			"response": []
		},
		{
			"name": "08-GET :urn/metadata/:guid/properties",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": "{{base_domain}}/modelderivative/v2/designdata/{{urnBase64}}/metadata/{{metadata_guid}}/properties"
			},
			"response": []
		},
		{
			"name": "09-bucket details",
			"event": [
				{
					"listen": "test",
					"script": {
						"type": "text/javascript",
						"exec": [
							"if (responseCode.code === 200 && responseBody) {",
							"    var data = JSON.parse(responseBody);",
							"    postman.setEnvironmentVariable(\"bucketKey\", data.bucketKey);",
							"}"
						]
					}
				}
			],
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": "{{base_domain}}/oss/v2/buckets/{{bucketKey}}/details"
			},
			"response": []
		},
		{
			"name": "12-GET formats",
			"request": {
				"method": "GET",
				"header": [
					{
						"key": "Authorization",
						"value": "Bearer {{access_token}}"
					}
				],
				"url": "{{base_domain}}/modelderivative/v2/designdata/formats"
			},
			"response": []
		}
	]
}

BIM.postman environment,.json

{
	"id": "63cf71cf-bae6-411f-8e53-7319cf62fd9a",
	"name": "Beijing-Workshop",
	"values": [
		{
			"key": "base_domain",
			"value": "https://developer.api.autodesk.com",
			"type": "text",
			"enabled": true
		},
		{
			"key": "client_id",
			"value": "xxxxxxxxx",
			"type": "text",
			"enabled": true
		},
		{
			"key": "client_secret",
			"value": "xxxxxxxxxxx",
			"type": "text",
			"enabled": true
		},
		{
			"key": "urnBase64",
			"value": "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6YWMtcGVyc2lzdGVudC1idWNrZXQtdGVzdDMvYWdncmVnYXRlLTEucnZ0",
			"type": "text",
			"enabled": true
		},
		{
			"key": "access_token",
			"value": "eyJhbGciOiJIUzI1NiIsImtpZCI6Imp3dF9zeW1tZXRyaWNfa2V5In0.eyJjbGllbnRfaWQiOiJNbDhXdWJFdW52WVRaRk1za2xpQ200YnZCM0dkREVibyIsImV4cCI6MTUyNjExNDc3OCwic2NvcGUiOlsiZGF0YTpyZWFkIiwiZGF0YTp3cml0ZSIsImJ1Y2tldDpjcmVhdGUiLCJidWNrZXQ6cmVhZCJdLCJhdWQiOiJodHRwczovL2F1dG9kZXNrLmNvbS9hdWQvand0ZXhwNjAiLCJqdGkiOiIxMEV2aEVpcGhQMGszTm9FNkFOa2NnR1pKOVJUaUhDazA3dXhWMDFFc1R1M2twS2tVNnB4a2d5d3A5QXBFakpDIn0.prPXmCc9e1oxZcPFSEgPOlonHG8po16RdzDciborQlg",
			"type": "text",
			"enabled": true
		},
		{
			"key": "guid",
			"value": "57873878-6d98-b389-aa22-fead1053823f",
			"type": "text",
			"enabled": true
		},
		{
			"key": "bucketKey",
			"value": "xiaodong-persistent-bucket-test8",
			"type": "text",
			"enabled": true
		},
		{
			"key": "guid",
			"value": "e22cc916-cabd-4b97-9ccd-1ab1e613f707",
			"type": "text",
			"enabled": true
		},
		{
			"key": "objectKey",
			"value": "RevitNative.rvt",
			"type": "text",
			"enabled": true
		},
		{
			"key": "expires_in",
			"value": "3599",
			"type": "text",
			"enabled": true
		},
		{
			"key": "token_type",
			"value": "Bearer",
			"type": "text",
			"enabled": true
		},
		{
			"key": "bucketPolicy",
			"value": "persistent",
			"type": "text",
			"enabled": true
		},
		{
			"key": "urn",
			"value": "urn:adsk.objects:os.object:xiaodong-persistent-bucket-test8/workshop-2.rvt",
			"type": "text",
			"enabled": true
		},
		{
			"key": "file_location",
			"value": "https://developer.api.autodesk.com/oss/v2/buckets/xiaodong-persistent-bucket-test8/objects/workshop-2.rvt",
			"type": "text",
			"enabled": true
		}
	],
	"_postman_variable_scope": "environment",
	"_postman_exported_at": "2023-07-15T15:06:21.850Z",
	"_postman_exported_using": "Postman/10.16.0"
}

 client_secret与client_id记住改成自己的,然后就开始用postman请求上传了

获取access token

https://developer.api.autodesk.com/authentication/v1/authenticate

是用于获取 Autodesk API 的访问令牌(access token)的认证

请求中包含必要的认证信息

  • 客户端 ID(client_id)
  • 客户端密钥(client_secret) 
  • grant_type:授权类型,通常为 "client_credentials"(客户端凭据模式)
  • scope:请求的权限范围,用空格分隔多个权限(如 "data:read data:write")
  • expires_in:设置合适的过期时间,单位毫秒

响应结果:

创建 Autodesk Forge 中的存储桶(bucket) 

https://developer.api.autodesk.com/oss/v2/buckets

请求中包含必要的认证信息:

  • Authorization:Authorization: Bearer {{access_token}}
  • bucketKey:存储桶的唯一标识符,它必须是全局唯一的。可以使用小写字母、数字、连字符 - 和下划线 _ 来命名。长度应在3到128个字符之间。
  • policyKey:存储桶的访问策略。默认为 transient,表示存储桶中的对象在30天后过期; persistent,表示永久保存

 响应结果:

 查看bucket是否创建成功

https://developer.api.autodesk.com/oss/v2/buckets

请求中包含必要的认证信息:

  • Authorization:Authorization: Bearer {{access_token}}

请求可选的参数信息:

  • limit:指定要返回的存储桶数量的限制。例如,返回最多 10 个存储桶,默认为 10

 响应结果:

 往bucket里放置object模型

https://developer.api.autodesk.com/oss/v2/buckets/{bucketKey}/objects/{objectName}

 请求中包含必要的认证信息:

  • Authorization:Authorization: Bearer {{access_token}}
  • 选择需要放置的rvt模型
  • objectName:每个文件在存储桶中都有一个唯一的标识符

 响应结果:

 检查对象模型是否成功上传到 Autodesk Forge 存储桶(bucket)中

https://developer.api.autodesk.com/oss/v2/buckets/{{bucketKey}}/objects

请求中包含必要的认证信息:

  • Authorization:Authorization: Bearer {{access_token}}
  • bucketKey:查询的存储桶的实际标识符

 响应结果:

将模型在云端转换成SVF格式 

https://developer.api.autodesk.com/modelderivative/v2/designdata/job

请求中包含必要的认证信息:

  • Authorization:Authorization: Bearer {{access_token}}
  • input:指定要转换的对象的 URN(Uniform Resource Name)。将 object_id 的 URN 作为输入。
  • output:指定要生成的输出格式和文件类型。在这里,你可以指定 SVF 格式作为输出。例如,{"formats": [{"type": "svf", "views": ["2d", "3d"]}]}

备注:input中的urn是 objectId转化为Base64格式

响应结果:

检查模型是否转化完成

https://developer.api.autodesk.com/modelderivative/v2/designdata/{base64_urn}/manifest

请求中包含必要的认证信息:

  • Authorization:Authorization: Bearer {{access_token}}
  • base64_urn:经过 Base64 编码的 URN

响应结果:

 图一表示进度,图二代表成功

浏览器渲染:

html渲染模板   将accessToken与documentId替换掉就行

<!DOCTYPE html>
<html>

<head>
    <title>Autodesk Forge: 3D Viewer App Sample</title>

    <meta http-equiv="cache-control" content="max-age=0" />
    <meta http-equiv="cache-control" content="no-cache" />
    <meta http-equiv="expires" content="0" />
    <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
    <meta http-equiv="pragma" content="no-cache" />
    <!-- Third Party package -->
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <!-- Autodesk Forge Viewer files (IMPORTANT) -->
    <link rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.51/style.min.css"
        type="text/css">
    <script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.51/viewer3D.min.js"></script>

    <style>
        /** Just simple CSS styling to make this page a little nicer **/
        body {
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<body>

    <!-- The Viewer will be instantiated here -->
    <div id="MyViewerDiv"></div>

    <!-- Custom script -->
    <script>
        var viewer;
        var options = {
            env: 'AutodeskProduction',
            api: 'derivativeV2', // TODO: for models uploaded to EMEA change this option to 'derivativeV2_EU'
            // getAccessToken: getForgeToken
            accessToken: 'eyJhbGciOiJSUzI1NiIsImtpZCI6IlU3c0dGRldUTzlBekNhSzBqZURRM2dQZXBURVdWN2VhIiwicGkuYXRtIjoiN3ozaCJ9.eyJzY29wZSI6WyJkYXRhOnJlYWQiLCJkYXRhOndyaXRlIiwiYnVja2V0OmNyZWF0ZSIsImJ1Y2tldDpyZWFkIl0sImNsaWVudF9pZCI6IkpCcldjc3p3RVZCQ0dNMm5sY1J6N0tIZXZTbXpYUXM0IiwiYXVkIjoiaHR0cHM6Ly9hdXRvZGVzay5jb20vYXVkL2Fqd3RleHA2MCIsImp0aSI6ImJjWXBRalcwekh5aTZyUEd3QU1kNjdjamlWS1Q2dDZIYXNqcjFmOXR4OUExeGhZY05JWkhINVlibkdDeHVaTWoiLCJleHAiOjE2ODk5MTI0ODB9.JdpIFQAmWmsGc-t2g3tpU677G1Y11RwF4ndTxbwSa4hE5tOjYtLsMK7pR-jGGWIHAEHUkScvDixQWFIUG_o5UWpwhAdH7r06126QhGFNk_Wf1d8OvoDknqdKt9aXns_1xvxucOdPs3VkJ8BWH6j65B3fxZ7GB5jub3zeF7sGuYd1zBL9FdAcQ5_uQUBpEXh8uP4yZ_Y3yDe_mnTx2OxTMyRXsHw7quWjtxXDQXweGq0xDn3ENayOTkYnsru3_GJmGXUE4b-Zl1csHENJyyegkDqrfbaLbMeKagCWxY-RnCikmg80iWDqOd6KvIejRbQdqpjdQWz4i3Qx6Wnj6Lzf4w'
        };
        // var documentId = 'urn:' + getUrlParameter('urn');
        var documentId = 'urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6YWMtcGVyc2lzdGVudC1idWNrZXQtdGVzdDMvYWdncmVnYXRlLTEucnZ0'
        // 初始化和加载文档的部分
        Autodesk.Viewing.Initializer(options, function onInitialized() {
            // Find the element where the 3d viewer will live.    
            var htmlElement = document.getElementById('MyViewerDiv');
            if (htmlElement) {
                // Create and start the viewer in that element    
                viewer = new Autodesk.Viewing.GuiViewer3D(htmlElement);
                viewer.start();
                // Load the document into the viewer.
                Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);
                $('.adsk-viewing-viewer').css('height', '80%')
                $('.adsk-viewing-viewer').css('width', '42%')
            }
        });

        /**
        * 加载模型的回调函数
        */
        function onDocumentLoadSuccess(doc) {
            // Load the default viewable geometry into the viewer.
            // Using the doc, we have access to the root BubbleNode,
            // which references the root node of a graph that wraps each object from the Manifest JSON.
            var viewable = doc.getRoot().getDefaultGeometry();
            if (viewable) {
                viewer.loadDocumentNode(doc, viewable).then(function (result) {
                    console.log('Viewable Loaded!');
                }).catch(function (err) {
                    console.log('Viewable failed to load.');
                    console.log(err);
                }
                )
            }
        }

        /**
        * 文档加载失败时的回调函数
        */
        function onDocumentLoadFailure(viewerErrorCode) {
            console.error('onDocumentLoadFailure() - errorCode: ' + viewerErrorCode);
            jQuery('#MyViewerDiv').html('<p>Translation in progress... Please try refreshing the page.</p>');
        }

    </script>
</body>

</html>

效果图如下:

其他资源分享:

视频教程:通过Forge十分钟实现Web端3D模型浏览_哔哩哔哩_bilibili

有其他问题可以留言 或者私信 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【无线电力传输】12 V 直流风扇无线电力传输系统的实现(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华为OD机试 - 最长的指定瑕疵度的元音子串 - 正则表达式(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

高速电路设计笔记----第一章

一、需求。 1、电路设计首先要做的是明确需求。 2、明确需求后需要对CPU进行选型、电源的选型、退耦电容选型。 3、画原理图需要兼顾PCB上的器件布局。中间电阻电容如果是靠近下一级&#xff0c;在原理图中画的时候也应该是靠近下一级处画。 4、按照PCB上电容的排列顺序绘制…

Java复习-25-单例设计模式

单例设计模式 目的&#xff08;使用场景&#xff09; 在实际开发下&#xff0c;会存在一种情况&#xff1a;某一种类在程序的整个生命周期中&#xff0c;只需要实例化一次就足够了。例如&#xff0c;系统数据类&#xff0c;由于操作系统只有一个&#xff0c;因此在程序初始化…

【PMO项目管理】深入了解项目管理 | Stakeholder 利益相关者 | 利益相关者之间的立场差异

&#x1f4ad; 写在前面&#xff1a;本文将带您深入了解项目管理的核心概念和关键要素。我们将从项目管理的基本理解开始&#xff0c;逐步探讨其领域、复杂性和变化的重点&#xff0c;以及项目管理的具体过程。我们还将研究项目的性质以及成功项目所必备的条件。在此过程中&…

PandaGPT部署演示

PandaGPT 是一种通用的指令跟踪模型&#xff0c;可以看到和听到。实验表明&#xff0c;PandaGPT 可以执行复杂的任务&#xff0c;例如生成详细的图像描述、编写受视频启发的故事以及回答有关音频的问题。更有趣的是&#xff0c;PandaGPT 可以同时接受多模态输入并自然地组合它们…

ClickHouse 存算分离改造:小红书自研云原生数据仓库实践

ClickHouse 作为业界性能最强大的 OLAP 系统&#xff0c;在小红书内部被广泛应用于广告、社区、直播和电商等多个业务领域。然而&#xff0c;原生 ClickHouse 的 MPP 架构在运维成本、弹性扩展和故障恢复方面存在较大局限性。为应对挑战&#xff0c;小红书数据流团队基于开源 C…

C++提高篇:深入理解纯虚函数和抽象类

在C中&#xff0c;纯虚函数和抽象类是面向对象编程中重要的概念。本文将会深入探讨这两个概念的含义、如何定义和使用它们&#xff0c;以及它们在实际开发中的应用。 一、什么是纯虚函数&#xff1f; 在C中&#xff0c;纯虚函数是指在基类中声明但没有实现的虚函数。纯虚函数的…

算法通关村第十七关:青铜挑战-贪心其实很简单

青铜挑战-贪心其实很简单 1. 难以解释的贪心算法 贪心学习法则&#xff1a;直接做题&#xff0c;不考虑贪不贪心 贪心(贪婪)算法 是指在问题尽心求解时&#xff0c;在每一步选择中都采取最好或者最优&#xff08;最有利&#xff09;的选择&#xff0c;从而希望能够导致结果最…

zabbix -- 安装

Zabbix zabbix除了可以监控linux服务器之外&#xff0c;还可以监控路由器、交换机、容器等&#xff0c;全方位监控 Zabbix对服务器的监控是通过在服务器上部署“间谍”程序zabbix-agent获取数据&#xff0c;但对于路由器、交换机等机器的监控不能进行部署&#xff0c;这个时候…

空气净化器上亚马逊美国站需要办理什么认证?空气净化器UL867测试报告如何办理?

空气净化器又称“空气清洁器”、空气清新机、净化器&#xff0c;是指能够吸附、分解或转化各种空气污染物&#xff08;一般包括PM2.5、粉尘、花粉、异味、甲醛之类的装修污染、细菌、过敏原等&#xff09;&#xff0c;有效提高空气清洁度的产品&#xff0c;主要分为家用 、商用…

高忆管理:六连板捷荣技术或难扛“华为概念股”大旗

在本钱商场上名不见经传的捷荣技术&#xff08;002855.SZ&#xff09;正扛起“华为概念股”大旗。 9月6日&#xff0c;捷荣技术已拿下第六个连续涨停板&#xff0c;短短七个生意日&#xff0c;股价累积涨幅逾越90%。公司已连发两份股票生意异动公告。 是炒作&#xff0c;还是…

智能感测型静电消除器通常具备哪些特点

智能感测型静电消除器是一种利用高压电源产生的离子来中和空气中的静电&#xff0c;从而达到消除静电的目的的设备。它通过内置的感测装置来监测环境中的静电水平&#xff0c;并根据实时数据自动调节工作状态&#xff0c;以确保静电消除效果更好。 智能感测型静电消除器通常具…

Turf.js介绍

目录 1&#xff0c;使用场景2&#xff0c;安装 Turf.js3&#xff0c;在 Vue 3 组件中使用 Turf.js4&#xff0c;主要功能4.1&#xff0c;点、线、面的创建4.2&#xff0c;缓冲区计算&#xff08;Buffer Analysis&#xff09;4.3&#xff0c;点与线的相交判断4.4&#xff0c;多边…

MATLAB创建avi文件

简介 MATLAB可以对音频和视频文件进行处理&#xff0c;这里简单说明一下MATLAB创建avi文件的用法。 常用函数 aviinfo 测试用用例&#xff0c;如下所示 用于avi格式的音频视频文件&#xff0c;返回一个对该文件的描述&#xff0c;只能用于avi格式的音频视频文件。 仔细看…

网络技术十二:子网划分

子网划分 A类地址 ⑴ A类地址第1字节为网络地址&#xff0c;其它3个字节为主机地址。另外第1个字节的最高位固定为0。 ⑵ A类地址范围&#xff1a;1.0.0.1到126.255.255.254。 ⑶ A类地址中的私有地址和保留地址&#xff1a; ①10.0.0.0到10.255.255.255是私有地址&#xff0…

mockito框架使用总结

目录 一、mock测试1.1 mock测试1.2 相关概念1.3 mock的好处 二、Mockito框架2.1 快速入门2.2 基础语法2.2.1 生成mock对象2.2.2 设置预期2.2.3 检验调用结果2.2.4 参数匹配器2.2.5 参数捕捉器2.2.6 mock静态方法调用 三、集成junit3.1 集成junit43.2 集成junit4spring3.1 集成j…

java 编程 7个简单的调优技巧

你的Java性能调优有救了&#xff01;分享7个简单实用的Java性能调优技巧 一、以编程方式连接字符串 在Java中有很多不同的连接字符串的选项。比如&#xff0c;可以使用简单的或、良好的旧StringBuffer或StringBuilder。 那么&#xff0c;应该选择哪种方法&#xff1f; 答案取…

CSS basics

CSS(Cascading Style Sheets&#xff0c;层叠样式表)是样式化web内容的代码。CSS基础将引导您开始所需的内容。我们将回答这样的问题:我如何把文本变成红色?我如何使内容显示在(网页)布局的某个位置?我如何用背景图片和颜色装饰我的网页? 1、What is CSS? 像HTML一样&…

Android Jetpack架构组件库:Hilt

一、开发者官网关于Hilt库使用链接如下 使用 Hilt 实现依赖项注入 Hilt版本说明 二、工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;LearnJetpack-hilt&#xff1a;hilt版本2.48 代…