NX二次开发:相对路径转绝对路径的踩坑与实现方案

做NX二次开发,最先让人上头的往往不是建模逻辑,而是路径问题。那个“相对路径转绝对路径”的需求,看起来一句话就能讲清楚,但真正落到代码里,坑是一个接一个。我第一次遇到是在做某公司的批量导出工具,程序读取配置资源时一直报错“找不到文件”,可文件明明就放在插件目录里。查了一下午才发现,NX启动后的当前工作目录根本不固定,代码里写死的那种相对路径全都在瞎指。后来我把相对路径换成“取基准目录 + 归一化拼接”的处理方式,问题才彻底解决。这篇就把我的排查思路、代码方案和踩坑记录完整整理出来,给同样被NX路径折磨的人一个参考。

1. 先搞清楚NX二次开发里相对路径的三个常见来源

1.1 资源文件跟着工具包走,当前目录却一直在变

NX二次开发的项目,不管是C++写的dll还是C#写的插件,基本都会带一批配套资源:按钮图标、模板prt、JSON配置文件、CSV参数表。常见的放法是放在插件目录的icons、templates、config子目录里,代码里习惯写icons/main.bmp、config/export.json这类相对路径。

这个写法在调试一两次时没问题,因为NX进程启动后,工作目录其实并不固定。用户可能用快捷方式启动,可能通过批处理启动,还可能有人在NX里执行了脚本把当前目录切到了别的地方。一旦当前目录不是插件目录,所有相对路径全部失效。

我遇到的那个导出工具就是这样一个典型场景。日志里报“无法打开config/export.json”,我一开始怀疑是打包漏了文件,后来在工具里加了一行打印当前工作目录的调试代码,发现目录指向了系统临时文件夹,和插件目录八竿子打不着。从那以后,我给自己定了个规矩:所有读取菜单图标、模板、配置文件的代码,一律先定位dll所在目录,再拼接相对路径,而不是依赖工作目录。

1.2 装配组件名里藏着相对路径

NX装配处理组件时有个容易忽略的细节:组件路径不一定以绝对路径保存。创建装配时如果勾选了“保存相对路径”之类的选项,那么组件记录里存的就是相对主模型文件目录的路径,比如subassembly/valve.prt。通过UF接口读取组件数据时,拿到的part_name字段可能就是这种相对路径。

这个情况在做装配自动化、批量替换组件、导出BOM时非常常见。如果不做任何转换,直接把这个字符串交给文件操作逻辑,轻则找不到文件,重则在错误位置创建出一堆莫名其妙的目录结构。

所以拿到组件路径字符串时,第一反应不应该是“当绝对路径用”,而是先想清楚:这个路径相对于哪个目录?是在主模型所在目录解析,还是在装配根目录解析?这个前提搞不清楚,后面的拼接都是白搭。

1.3 配置文件、用户输入、日志里传进来的路径五花八门

最后一个来源最不起眼,但最烦人:配置文件和用户输入。有些人是把路径维护在Excel表里,可能带前后空格,还带着中文引号;有些是配置文件里写死的相对路径,写的人自己都没搞明白相对的是谁;还有些是从日志或命令行参数里捞出来的路径片段。

这些路径的共同特点是:不能直接用。必须先做清洗(去空格、去引号、统一分隔符),再做绝对路径转换。我见过太多因为一个空格导致文件找不到的案例,排查半天,人眼看着路径是对的,机器却找不到。这种问题尤其容易出现在中文环境里,全角半角符号混用,肉眼完全看不出区别。

2. 动手转换前,先判断字符串并选对基准目录

2.1 判断绝对路径的规则,先写成一个函数

转换的第一步是判断这个字符串本身是不是绝对路径。Windows环境下判定条件比较清晰:

  • 以盘符开头,如C:、D:
  • 以\\开头的UNC网络路径
  • 以/开头的路径,NX部分接口会返回正斜杠风格,虽然少见,但最好兼容

但要注意,不能只依赖Path.IsPathRooted这类现成判断,它对C:foo.txt这种带盘符但无根目录的路径也会返回true,这会干扰后面的逻辑。我习惯自己写一个干净的判断函数,先把空白字符、引号剥掉,再做判断。

判断的目的很简单:如果本来就是绝对路径,直接规范化后返回;如果不是,才进入“基准目录 + 相对路径”的拼接逻辑。我通常把这个函数命名为EnsureAbsolutePath,放在所有路径处理工具的最前面,作为一个公共入口。

2.2 基准目录到底用哪个?按场景而不是按习惯

很多人拿到相对路径,第一反应是拿GetCurrentDirectory或者os.getcwd()去拼。这是最大的坑。NX进程当前工作目录是个不稳定值,用户换个启动方式、在NX里运行一次别的脚本,都可能改变它。

我建议按场景选择基准目录:

路径来源场景推荐的基准目录
插件自带资源文件dll所在目录
当前工作部件相关文件当前部件的FullPath所在目录
装配组件路径主模型文件所在目录
用户自定义环境或配置根环境变量指向的目录

这里要特别强调装配场景:组件记录是保存在装配里的,它的相对基准被定义为装配文件所在目录,而不是当前打开的工作部件目录。如果你拿工作部件的目录去解析组件相对路径,结果必然错乱,这个问题我在实际项目里纠正过好几次。

2.3 环境变量与相对路径拼接时的小心机

NX自身提供了一些环境变量,比如UGII_BASE_DIR表示NX安装根目录,UGII_USER_DIR表示用户目录。二次开发里经常出现%UGII_BASE_DIR%/custom/config.ini这类写法,同样需要转成绝对路径。

我通常是先getenv取变量值,注意它可能返回空指针;然后把变量值作为基准目录,与后面的相对片段拼接;最后统一规范化。容易疏忽的是:环境变量值末尾可能带反斜杠,也可能不带,拼接前先做一次分隔符规整,否则会出现C:\Program Files\\custom这种双反斜杠路径,虽然Windows有时能容忍,但日志输出和后续字符串比较都会出问题。

3. 分C/C++、C#、Python三种场景给出可抄的转换代码

3.1 C/C++实现:获取dll目录再拼路径

C++代码里我一般用GetModuleHandle定位当前模块,配合GetModuleFileName取完整路径,再截取目录。核心代码大致是这样的:

#include <windows.h> #include <shlwapi.h> #include <string> // 获取指定模块所在目录,带结尾反斜杠 std::wstring getModuleDir(const wchar_t* moduleName) { wchar_t buffer[MAX_PATH] = {0}; HMODULE hMod = moduleName ? GetModuleHandleW(moduleName) : nullptr; DWORD len = GetModuleFileNameW(hMod ? hMod : GetModuleHandleW(nullptr), buffer, MAX_PATH); std::wstring path(buffer, len); size_t pos = path.find_last_of(L"\\/"); return path.substr(0, pos + 1); } // 相对路径转绝对路径 std::wstring makeAbsolutePath(const std::wstring& baseDir, const std::wstring& relPath) { wchar_t full[MAX_PATH] = {0}; PathCombineW(full, baseDir.c_str(), relPath.c_str()); std::wstring result(full); // 建议再做一次规范化,清理 . 和 .. 片段 return result; }

要提醒的是,NX自带C++环境在老项目里未必支持C++17,std::filesystem虽然方便,但很多历史代码仍停留在PathCombine和手写字符串处理的阶段,需要迁就现有工程。

还有一个高频失误:GetModuleFileName传错句柄。如果传了别的dll名称,取到的路径可能不是你期望的插件dll,而是系统加载的某个同名模块。最稳妥的做法是传当前模块明确的名称,并在启动时把取到的路径和预期路径做一次校验。

3.2 C#实现:Native层之外最省事的方案

C#相对简单很多,核心就是Assembly.GetExecutingAssembly().Location和Path.GetFullPath。注意Location属性拿到的是dll完整路径,取目录用Path.GetDirectoryName。下面这段可以直接抄:

using System; using System.IO; using System.Reflection; public static class PathUtil { // 获取当前插件程序集所在目录 public static string GetPluginDir() { string location = Assembly.GetExecutingAssembly().Location; return Path.GetDirectoryName(location) ?? AppDomain.CurrentDomain.BaseDirectory; } // 以插件目录为基准,转绝对路径 public static string MakeAbsolute(string relativePath) { return Path.GetFullPath(Path.Combine(GetPluginDir(), relativePath)); } // 以显式基准目录,转绝对路径 public static string MakeAbsolute(string baseDir, string relativePath) { return Path.GetFullPath(Path.Combine(baseDir, relativePath)); } }

这里有个关键点:Path.GetFullPath会把路径里的.和..一起规范化,分隔符也会统一成当前平台风格,省去不少麻烦。所以在C#场景下,重点不是字符串拼接,而是把基准目录选对。

另一个容易踩的坑:在NX的.NET环境里,Assembly.GetExecutingAssembly()有时拿到的不是你的插件程序集,而是CLR加载的其他上下文。更稳妥的方法是传一个确定的类型,比如typeof(YourClass).Assembly.Location,这样定位一定准确。

3.3 Python实现:适合快速验证和日志工具

NX自带的Journal环境支持Python,日常调试、数据清洗时我经常用。路径处理核心是os.path模块:

import os def make_absolute(base_dir, relative_path): # join之后用abspath规范化,会自动展开 . 和 .. return os.path.abspath(os.path.join(base_dir, relative_path)) def get_current_part_dir(): # NXOpen中获取当前工作部件路径 import NXOpen the_session = NXOpen.Session.GetSession() work_part = the_session.Parts.Work if work_part is None: raise RuntimeError("当前没有打开的工作部件") full_path = work_part.FullPath return os.path.dirname(full_path)

Python版写起来轻快,适合快速验证。但要注意两点:一是NXPython脚本里os.getcwd()几乎不可靠,别拿去当基准;二是work_part.FullPath在部件尚未保存时可能是空字符串,取目录前要做判断。其实这个获取当前部件目录的思路,在C#里也一样:workPart.FullPath加Directory.GetParent,思路完全相同。

3.4 建议统一封装成一个转换函数

不管哪种语言,我都建议封装一个统一入口,让项目里所有路径处理都走这个函数。大致逻辑是:

  1. 清洗原始字符串,去掉首尾空格、引号
  2. 判断是否已经是绝对路径
  3. 如果是,规范化后直接返回
  4. 如果不是,用调用方传入的基准目录拼接,规范化后返回

把逻辑收拢到一处的好处是:排查问题只看一个函数;路径规则全局一致;新增场景只改基准目录的获取逻辑,不用动拼接代码。我还会在函数里加一个可选的日志开关,把入参、基准目录、最终结果全部输出,出问题翻日志就能还原现场。

4. 装配组件路径、dll资源路径两个高频场景的完整处理流程

4.1 装配组件相对路径的完整转换流程

处理装配组件路径时,我建议按这个顺序走:

  1. 获取主模型文件路径,算出主模型所在目录
  2. 通过UF_ASSEM_ask_component_data获取组件记录里的路径字符串
  3. 判断该字符串是绝对还是相对路径
  4. 若为相对路径,以主模型目录为基准转绝对路径
  5. 转换后检查文件是否存在,若不存在,继续去装配加载选项的搜索目录列表里查找

C++风格的伪代码大致是:

UF_ASSEM_component_data_t compData; UF_ASSEM_ask_component_data(instanceTag, &compData); char partName[MAX_FSPEC_BUFSIZE] = {0}; strcpy(partName, compData.part_name); // baseDir 为主模型所在目录 char fullPath[MAX_FSPEC_BUFSIZE] = {0}; if (isAbsolutePath(partName)) normalizePath(partName, fullPath); else combinePath(baseDir, partName, fullPath);

为什么要强调主模型目录而不是当前工作部件目录?因为组件记录是保存在装配文件里的,它的相对基准被定义为装配文件所在目录。如果你拿工作部件的目录去解析,结果必然错乱,这个细节我栽过跟头。

如果第一步就拿到绝对路径,问题简单得多,但依然要规范化,因为路径里可能混有..或者大小写不一致。另外,组件名里可能包含英文点号,不要随手按split拆字段,否则会误拆文件名。

4.2 dll资源路径的完整处理流程

处理插件自带资源,我强烈建议先固定目录结构,比如:

plugin_root/ plugin.dll icons/ main.bmp config/ export.json templates/ template.prt

所有资源的获取路径都定义为:plugin_root + 固定子目录 + 文件名。获取plugin_root的方式前面已经介绍过,C++、C#、Python各有对应。做完这一步,所有资源访问都变成绝对路径,不再受当前目录影响。

这里有两个容易忽略的点。第一,插件目录尽量别用../plugins这种跨目录引用,用户换了安装位置很容易失效。第二,资源文件缺失时的报错信息里,一定要带完整的绝对路径,不要只写“找不到icons/main.bmp”。否则用户拿着日志来问,你还得反查半天代码才能确定资源在哪个目录。

4.3 装配加载选项里的搜索目录机制

NX装配加载时有个“搜索目录”机制,也就是Load Options里的Search Directories。组件在主模型目录找不到时,NX会按搜索目录列表逐个找。这个机制在二次开发里也可以借力。

我的做法是:路径转换完成后先做一次File.Exists判断,如果文件不存在,不急着报错,而是把搜索目录列表拉出来,按顺序再做一轮查找。这一步能把很多“路径转换好像错了”的问题,转化为“文件确实不在预期位置”的清晰结论,排查效率高很多。

实现上,C++里可以通过UF_ASSEM_ask_load_options拿到search_directories字段,循环拼接尝试;C#里也有对应对象。这个功能不复杂,但能显著提升工具在复杂装配场景下的适应能力。

5. 踩过的坑与排查技巧:路径转换容易翻车的几个细节

5.1 高频翻车点速查

我长期维护了一个问题速查表,每次踩到新坑就补一行:

现象原因建议处理
路径看起来对但打不开字符串里有不可见空格或引号先Trim再处理
Windows下偶尔能找到文件盘符大小写不一致统一转大写比较
一直找不到..路径下的文件只拼接没有规范化拼接后必须清理.和..
中文路径乱码窄字符API与本地编码不匹配统一使用宽字符/UTF-8
网络路径正常但映射盘访问失败盘符映射随登录会话失效优先使用UNC形式
组件路径转完还是错基准目录选错确认基准是主模型目录
切换NX启动方式后全部失效用了当前工作目录当基准改用dll/部件/模型目录

5.2 日志与调试的实用技巧

路径问题排查,最快的方法是让程序把参与转换的所有路径都打出来。我一般在转换函数里输出三行日志:

  • 原始字符串,用[]包裹,方便发现不可见空格
  • 基准目录
  • 转换后的绝对路径

单看其中任意两样往往不够,三样齐了才能还原现场。还有个技巧:在路径转换后立刻做一次文件存在性检查,并把检查结果一并写入日志。这样能立刻区分是“转换逻辑错了”还是“文件本身不在预期位置”,排查方向完全不一样。

5.3 给新手的额外提醒

如果你是第一次写NX二次开发的路径处理,我的建议是:不要在项目里到处散落Path.Combine、字符串加法这类代码,先把路径工具统一起来。哪怕一开始只支持最简单的拼接,也比各写各的强。等真实问题出现了,再迭代这个工具函数也不迟。统一入口还有个好处:代码评审时,别人一眼就能看到所有路径处理的逻辑,不用翻遍整个项目。

6. 顺手埋下的几个扩展点

相对路径转绝对路径这件事本身不难,但做好之后还能往上加不少能力。比如支持路径模板,把{PLUGIN_DIR}、{WORK_PART_DIR}这类占位符替换成实际目录;再比如在批量工具里记录每次转换的基准目录快照,方便问题回放。

还有一个思路是把路径转换和文件存在性校验、自动搜索顺序绑定在一起。先在主模型目录找,找不到再去装配搜索目录找,再找不到去全局配置的搜索列表找。很多文件缺失问题其实不是路径转换错了,而是文件根本不在预期位置,有了搜索顺序,容错能力强很多。

我在实际项目中还发现,路径工具函数往往能沉淀成整个工具链的公共底层。后续做批量导出、装配检查、模板刷新,全部复用同一个路径入口,接口一致性好了,团队协作的沟通成本也明显下降。

这些经验不是一次总结出来的,是反复被路径问题折磨后才沉淀下来的。最后分享一个我觉得最实用的小习惯:每次接手新的NX二次开发项目,第一件事就是全局搜索代码里的裸相对路径字符串,发现有就直接替换成统一的转换函数。这个功夫花得非常值,后面能省下无数个排查文件的夜晚。

相关新闻

小模型智能体:离线推理与数据主权驱动的本地化AI实践

小模型智能体:离线推理与数据主权驱动的本地化AI实践

1. 当算力从云端退回桌面&#xff1a;小模型智能体到底在解决什么问题过去两年&#xff0c;大家已经习惯了一个固定套路&#xff1a;想要用上稍微聪明一点的 AI 能力&#xff0c;第一反应就是打开浏览器、连上网络、把数据传到某个远端服务里&#xff0c;等它算完再把结果送回来…

2026/10/20 3:45:12 阅读更多 →
GCN链路预测在Cora和Citeseer上的实战避坑指南

GCN链路预测在Cora和Citeseer上的实战避坑指南

简介&#xff1a;这份资源面向图神经网络与链路预测方向的初学者及进阶学习者&#xff0c;聚焦在Cora和Citeseer两个经典学术文献网络上&#xff0c;用图卷积神经网络完成节点间未知引用关系的预测任务。包内共3个Python文件&#xff0c;压缩包约7KB&#xff0c;涵盖数据读取与…

2026/10/20 3:45:12 阅读更多 →
YOLOv12实战:太阳能电池板EL图像缺陷检测系统全解析

YOLOv12实战:太阳能电池板EL图像缺陷检测系统全解析

1. 为什么太阳能电池板缺陷检测非要“可视化自动化”不可光伏组件的出厂质量直接决定电站全生命周期的发电收益&#xff0c;这个账在行业里越算越清。一组隐裂组件用肉眼几乎看不见&#xff0c;但一旦装机后热斑效应持续放大&#xff0c;轻则发电效率打折扣&#xff0c;重则引发…

2026/10/20 3:45:12 阅读更多 →

最新新闻

HuggingFace下载量统计生变:缓存、统计口径与排查思路

HuggingFace下载量统计生变:缓存、统计口径与排查思路

HuggingFace 下载量统计疑生变——这个话题最近在开发者社群里悄悄发酵了。好几位朋友跟我说&#xff0c;自己模型的下载量数据突然出现了奇怪的波动&#xff0c;有的是连续几天新增归零&#xff0c;有的是冷门模型一夜之间暴涨。作为一个常年把模型托管在HuggingFace上、靠下载…

2026/10/20 4:34:44 阅读更多 →
React 19迁移实战:Compiler与Server Components的工程落地

React 19迁移实战:Compiler与Server Components的工程落地

从"rea"这个需求说起吧。我接到的需求卡片上只有这三个字母&#xff0c;正文空白、关键词空白、摘要空白&#xff0c;乍一看像消息没发完。真实开发里这种"半截标题"很常见&#xff0c;可能只是随手敲下的前缀&#xff0c;也可能背后藏着一个完整的React相…

2026/10/20 4:34:44 阅读更多 →
电商后台商品模块设计:品牌管理、状态修改、图片上传与校验异常处理

电商后台商品模块设计:品牌管理、状态修改、图片上传与校验异常处理

1. 电商后台商品模块的整体设计思路拆解做电商后台系统&#xff0c;商品模块永远是绕不开的一座大山。我前后参与过几个不同规模的电商项目&#xff0c;从早期单体架构到后来的微服务拆分&#xff0c;商品中心这块的复杂度始终排在前列。这次拿一个典型的商品管理场景来聊——品…

2026/10/20 4:34:44 阅读更多 →
转导vs归纳:大模型推理的范式转变与工程实践

转导vs归纳:大模型推理的范式转变与工程实践

1. 内容整体设计与思路拆解1.1 为什么"转导"突然成了AI圈的高频词先聊聊我最近观察到的一个现象&#xff1a;在好几个技术社区的讨论帖里&#xff0c;"转导"&#xff08;Transduction&#xff09;这个词的出现频率明显上来了。很多人在讨论大模型推理能力的…

2026/10/20 4:34:44 阅读更多 →
Flask+Vue前后端分离酒店管理系统开发实战与权限设计

Flask+Vue前后端分离酒店管理系统开发实战与权限设计

先说明一点&#xff0c;这套"三个角色的酒店管理系统"我前后做过两个版本&#xff0c;第一版用 Django 模板渲染&#xff0c;第二版改成 Flask 提供接口、Vue 做页面&#xff0c;也就是标题里提到的那一套组合。整个过程踩了不少坑&#xff0c;也把 Flask 和 Django …

2026/10/20 4:34:44 阅读更多 →
智能驾驶感知算法岗面试:核心考点、避坑经验与备考方法论

智能驾驶感知算法岗面试:核心考点、避坑经验与备考方法论

智能驾驶感知算法这个岗位&#xff0c;面试难度这几年肉眼可见地在涨。很多准备者把精力全花在刷LeetCode和堆模型名词上&#xff0c;结果一到项目深挖和原理推导环节就露馅。这篇文章我想从面试官视角、核心考点、实战复盘、避坑经验到行业走向&#xff0c;完整拆一遍“智能驾…

2026/10/20 4:33:43 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →