ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

forge viewer 使用的方法小总结:从 dbid 到构件颜色与模型视角的实操梳理

forge viewer 使用的方法小总结:从 dbid 到构件颜色与模型视角的实操梳理 1. 从模型树到构件高亮forge viewer 的 dbid 定位与视角控制实操刚接触 Autodesk Platform Services原 Forge的 Viewer 时最容易卡住的不是加载模型而是加载完之后不知道下一步该干什么。模型在屏幕上转起来了但你想点一个构件让它变色、想按属性反查它的 dbid、想把相机固定到某个俯视角度这些操作在官方文档里散落在不同章节搜出来的示例又常常缺上下文。这篇就把我实际项目里反复用到的几组方法串起来围绕模型树结构、dbid 定位、构件颜色和模型视角控制讲清楚每个片段都能直接贴进你的 Viewer 初始化脚本里跑。先明确几个概念不然后面代码容易看晕。dbid 是 Viewer 给模型里每个构件分配的内部整数编号它跟构件在原始模型里的 GUID 不是一回事但可以通过属性接口互相映射。模型树结构instance tree是 Viewer 解析模型后生成的一棵层级树根节点是模型整体往下是楼层、系统、构件。构件颜色在 Viewer 里有两套机制一套是材质本身的颜色一套是主题色theming color后者专门用来做高亮、状态标记不会破坏原始材质这也是为什么改颜色推荐用 setThemingColor。模型视角控制则依赖相机对象Viewer 封装了 autocam 和 navigation 两套接口前者适合保存和恢复视角后者适合实时读取相机参数。适合谁看已经能跑起一个最简 Viewer 页面、拿到 viewer 实例但还没系统梳理过这些 API 的前端开发者。如果你连 Viewer 都还没初始化建议先把官方 Getting Started 跑通再回来对照这篇。2. TaoToken 前置给 Viewer 项目配一个稳定的模型对话与调试入口做 Viewer 开发时除了看模型经常还需要一个能快速问 API 用法、贴报错、让它帮忙解释回调参数的地方。我自己的习惯是开一个模型对话窗口放在旁边遇到getProperties返回结构看不懂、或者goToView参数对不上直接贴进去问比翻文档快。这里用 TaoToken 的模型对话入口就够它支持多模型切换适合边写 Viewer 代码边查。配置上不需要动你的 Viewer 项目它跟 Viewer 是两套独立的东西。你只需要在浏览器里打开对话页面把当前遇到的代码片段和报错贴进去。如果你打算把这类能力接进自己的开发工具链比如在 VS Code 里用插件调用那就需要拿到 API Key走的是 OpenAI 兼容的接口格式。具体来说TaoToken 的 API 地址是https://taotoken.net/api兼容 OpenAI 的/v1/chat/completions路径。你在任何支持自定义 Base URL 的客户端里把 Base URL 填成这个再填上在控制台生成的 Key就能调用。模型 ID 按你需要的选比如做代码解释用通用对话模型做长上下文分析用支持大窗口的模型。这里给一个最小可用的请求示例你可以用 curl 先验证 Key 是否正常curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: gpt-4o-mini, messages: [ {role: user, content: Viewer 的 setThemingColor 第二个参数为什么用 THREE.Vector4} ] }返回里如果有choices[0].message.content说明 Key 和网络都通了。这一步的意义在于后面你在调 Viewer 的 dbid 相关接口时遇到不确定的参数类型可以随时开一个对话确认不用中断编码节奏。如果你更偏向在编辑器里直接问TaoToken 也提供了 Coding Plan 这类面向长期编码场景的方案适合把模型调用嵌进日常开发流。控制台里可以管理 API Keys文档里有各语言的接入示例。这些入口我都放在文末的 CTA 里按需取用。需要提醒的是TaoToken 在这里的角色是你的模型调用入口不是 Viewer 的替代品也不是模型数据的存储方。Viewer 的模型加载、dbid 解析、渲染全部在浏览器端完成跟模型服务是两条线别混在一起理解。3. 可复制配置dbid 查询、构件着色与视角控制的完整代码片段这一节是全文的核心我把几组操作拆成独立片段你可以按需拼进自己的 Viewer 初始化逻辑里。所有片段都假设你已经有了viewer实例并且模型已经加载完成监听Autodesk.Viewing.GEOMETRY_LOADED_EVENT之后再执行。3.1 获取当前选中构件的 dbid最直接的方式是监听选择变化事件。用户点击构件时getSelection()返回当前选中集的 dbid 数组viewer.addEventListener( Autodesk.Viewing.SELECTION_CHANGED_EVENT, function (event) { const dbIds viewer.getSelection(); console.log(当前选中的 dbid, dbIds); } );注意getSelection()返回的是数组因为 Viewer 支持框选和多选。如果你只想处理单选取dbIds[0]即可但要先判断数组长度。3.2 通过属性值反查 dbid有时候你手里没有 dbid只有构件的某个属性值比如 GUID 或者自定义的编码。这时候用viewer.searchviewer.search( 1234, function (dbIds) { console.log(匹配到的 dbid, dbIds); }, function (error) { console.error(搜索出错, error); }, [guid] );第四个参数是属性名数组告诉 Viewer 在哪些属性里找。这个接口适合做「输入构件编号定位到模型位置」这类功能。3.3 改变构件颜色推荐用主题色不破坏原始材质。颜色用THREE.Vector4四个分量是 RGBA取值 0 到 1const color new THREE.Vector4(0 / 255, 102 / 255, 25 / 255, 1); viewer.setThemingColor(dbId, color);如果要在模型加载完成后立即给某些构件上色把这段放进GEOMETRY_LOADED_EVENT回调里。注意setThemingColor的 dbId 可以是单个数字也可以是数组批量上色直接传数组更高效。3.4 保存与恢复模型视角先把相机调到你想要的角度然后读取当前视角参数const currentView viewer.autocam.getCurrentView(); console.log(currentView);拿到结构后把里面的position、up、center、pivot、fov、worldUp、isOrtho存下来。恢复时构造一个同样结构的对象调goToViewconst defaultViewer { position: new THREE.Vector3(-508.81, -280.32, 266.78), up: new THREE.Vector3(0.388, 0.128, 0.912), center: new THREE.Vector3(-446.59, -254.75, 236.66), pivot: new THREE.Vector3(-464.94, -217.88, 230.05), fov: 53.13, worldUp: new THREE.Vector3(0, 0, 1), isOrtho: false }; viewer.autocam.goToView(defaultViewer);这些数值是我从一次实际调试里抓出来的你替换成自己getCurrentView()的输出即可。isOrtho为 false 表示透视相机如果你的模型用正交相机这里要改成 true。3.5 切换标准视图顶视、前视、左视等Viewer 内置了 ViewCube 的接口可以直接切viewer.setViewCube(front,top,left);参数顺序是前后、上下、左右你可以按需要组合。这个调用建议放在GEOMETRY_LOADED_EVENT之后加一个短延时更稳viewer.addEventListener( Autodesk.Viewing.GEOMETRY_LOADED_EVENT, function () { setTimeout(function () { viewer.setViewCube(front,top,left); }, 100); } );3.6 隐藏、显示与获取隐藏构件viewer.hide(614); viewer.hide([614, 615, 616]); viewer.show(614); const hiddenDbIds viewer.getHiddenNodes(); console.log(当前隐藏的构件, hiddenDbIds);hide和show都支持单个 dbid 或数组。getHiddenNodes()返回当前所有被隐藏的 dbid适合做「一键恢复全部显示」的功能。3.7 获取模型树结构模型树是递归结构用instanceTree遍历function buildModelTree(model) { function _build(node) { const it model.getData().instanceTree; it.enumNodeChildren(node.dbId, function (childId) { node.children node.children || []; const childNode { dbId: childId, name: it.getNodeName(childId) }; node.children.push(childNode); _build(childNode); }); } const it model.getData().instanceTree; const rootId it.getRootId(); const rootNode { dbId: rootId, name: it.getNodeName(rootId) }; _build(rootNode); return rootNode; } const tree buildModelTree(viewer.model); console.log(tree);拿到树之后你可以渲染成左侧的目录面板点击节点时用viewer.isolate(dbId)或viewer.select(dbId)联动。3.8 获取构件属性const sel viewer.getSelection(); viewer.getProperties(sel[0], function (objProp) { if (objProp) { objProp.properties.forEach(function (prop) { console.log(name: prop.displayName value: prop.displayValue); }); } });getProperties是异步的回调里的objProp.properties是属性数组每项有displayName和displayValue。这个接口常用来做属性面板。3.9 加载时改变背景色viewer.setBackgroundColor(0, 0, 60, 0, 157, 191);前三个参数是顶部颜色 RGB后三个是底部颜色 RGB形成渐变。放在初始化阶段调用即可。4. 验证请求与成功结果逐项确认每个接口真的生效代码贴进去不代表生效Viewer 的很多接口是异步的而且依赖模型加载状态。这一节给你一套逐项验证的动作照着做能快速定位是哪一步没通。先验证 dbid 获取。打开浏览器控制台在模型上点一个构件看是否打印出 dbid 数组。如果打印的是空数组检查事件名是否拼错SELECTION_CHANGED_EVENT是常量建议直接用Autodesk.Viewing.SELECTION_CHANGED_EVENT而不是手写字符串。再验证着色。调setThemingColor后构件应该立刻变色。如果没变先确认 dbId 是数字不是字符串再确认颜色分量在 0 到 1 之间。常见错误是写成new THREE.Vector4(0, 102, 25, 1)这样 102 和 25 会被当成超出范围的值颜色会异常。验证视角恢复。调goToView后相机应该平滑过渡到目标位置。如果画面没动检查position和center是否都是THREE.Vector3实例传普通对象有时不生效。另外goToView的第二个参数可以控制过渡动画默认是平滑的。验证模型树。buildModelTree返回的对象应该有dbId、name、children三层结构。如果children是 undefined说明enumNodeChildren没遍历到子节点检查model.getData().instanceTree是否存在。验证属性查询。getProperties回调里如果objProp是 null通常是 dbid 无效。先用getSelection()确认选中的 dbid 是有效的再传进去。验证隐藏与显示。调hide后构件应该消失getHiddenNodes()应该返回刚才隐藏的 dbid。如果getHiddenNodes()返回空检查是不是在hide之后又调了showAll之类的接口把状态清了。验证背景色。setBackgroundColor调用后画布背景应该变成渐变。如果没变确认调用时机在 Viewer 初始化之后而不是在new Autodesk.Viewing.GuiViewer3D之前。这套验证做完你基本能确认每个接口都通了。如果某一步卡住把控制台报错和对应代码片段贴到模型对话里问通常几分钟能定位。5. 本篇常见错排查401、local proxy failed、reading choices 与 OAuth 报错对照这一节集中处理你在接入和调试过程中最可能撞上的几类报错。注意这些报错分属两个层面一类是 Viewer 本身的一类是模型调用链路的。别混着排查。先说 Viewer 侧的。如果你在加载模型时看到Autodesk.Viewing相关报错最常见的是 token 过期。Viewer 加载模型需要一个 access token这个 token 有有效期过期后会报 401。解决方式是重新走一遍认证流程拿新 token而不是去改 Viewer 代码。如果你用的是双 token 模式检查 refresh token 是否还有效。另一类 Viewer 报错是reading choices这种。这个通常不是 Viewer 抛的而是你在 Viewer 页面里同时调了模型接口返回结构不符合预期。比如你期望返回choices数组但实际返回的是错误对象。排查方法是先把请求单独用 curl 跑一遍确认返回结构再对照代码里的解析逻辑。local proxy failed一般出现在你本地起了代理转发但目标地址不通。如果你在开发环境里配了本地代理去转发模型请求检查代理配置里的目标地址是否写成了https://taotoken.net/api以及代理进程是否真的在监听。这个报错跟 Viewer 无关是网络链路问题。OAuth 相关报错通常出现在你尝试用 OAuth 方式获取模型访问权限时。检查回调地址是否跟控制台里配置的一致以及 scope 是否包含了你需要的权限。如果报错信息里有invalid_grant多半是授权码过期或重复使用重新走一遍授权流程即可。还有一类容易忽略的Viewer 的getProperties回调里报Cannot read property properties of undefined。这是因为objProp为 null 时你直接访问了.properties。加一层判断viewer.getProperties(dbId, function (objProp) { if (!objProp || !objProp.properties) { console.warn(未获取到属性, dbId); return; } // 正常处理 });如果你在接入模型调用时用的是 Codex 这类工具它的auth.json里需要配好 Base URL、Key 和 Model ID 三件套。Base URL 填https://taotoken.net/apiKey 填控制台生成的Model ID 按你选的模型填。这三项缺一个都会报认证失败。同理如果你用 Cline 的 MCP 配置也是这三项写在对应的配置文件里。排查顺序建议先确认 Viewer 本身能加载模型并响应点击再确认模型调用链路通最后才去查业务逻辑。这样能避免在两条线之间来回跳。6. 把 dbid 和视角控制用起来从能跑到好用的下一步上面这些片段拼起来你已经能做一个「点击构件高亮 属性面板 视角切换 模型树联动」的查看器了。但能跑和好用之间还有一段距离这里说几个我实际踩过的点。第一setThemingColor是叠加的不是覆盖的。如果你先给一个构件上了红色再上绿色它会变成两种颜色的混合。要清除主题色调viewer.clearThemingColors()或者对单个构件传null。做状态切换时记得先清再设。第二goToView的过渡动画在构件很多的大模型上可能卡顿。如果模型体量大可以在goToView的第二个参数里关掉动画直接跳转。具体参数查一下当前版本的 API 文档不同版本略有差异。第三模型树的递归遍历在超大模型上可能耗时。如果树层级很深考虑改成懒加载点开某个节点时再遍历它的子节点而不是一次性构建整棵树。第四viewer.search的属性名数组要跟模型里的属性名完全匹配大小写敏感。不确定属性名时先用getProperties看一个构件的属性列表把displayName抄下来。第五背景色和主题色是两回事别指望setBackgroundColor能改构件颜色也别指望setThemingColor能改画布背景。如果你在把这些片段接进自己的项目时遇到具体报错或者想确认某个接口在当前 Viewer 版本里的行为可以开一个模型对话把代码和报错贴进去问比翻版本变更日志快。需要 API Key 的话在控制台生成接入文档里有各语言的完整示例。长期做 Viewer 开发的话Coding Plan 这类方案能把模型调用嵌进日常流程省去反复切换工具的时间。最后留一个实用技巧把常用的视角参数存成一个 JSON 文件按视图名称索引切换时直接读文件调goToView。这样产品经理说「我要看东立面的标准视角」你不用现场调相机读配置就行。
返回列表