下颌磨牙三维有限元建模:Amira-UG-ALGOR协同工作流
简介本资源是一份面向口腔医学、生物力学及医工交叉领域研究者的三维有限元建模技术实践文档聚焦下颌磨牙D区567高精度建模方法解决传统建模中结构复杂、耗时长、几何失真等痛点。文档详细阐述了基于薄层CT扫描数据联合Amira医学影像重建、UG NX逆向造型与实体构建及ALGOR有限元分析三软件协同建模的完整流程涵盖点云生成、坐标对齐、髓腔拟合、布尔运算建牙、IGS格式转换及六面体网格自动划分等关键技术环节最终建成含93260个节点、167111个六面体单元的可分析模型。资源为单个16KB的Word文档.docx内容结构完整含摘要、引言、材料与方法、结果图表说明、讨论及参考文献覆盖建模原理、参数设置、误差控制与逆向工程实操要点。目前已有67人学习下载适合开展口腔生物力学仿真、教学建模示范或科研复现的研究生、青年医师及工程技术人员参考使用。1. 下颌磨牙三维有限元模型为什么用Amira配UGALGOR而不是单靠一个软件你手头有一组CBCT原始DICOM序列想建一个能真实反映牙本质、牙釉质、牙髓腔、牙槽骨皮质/松质分层、甚至模拟牙周膜厚度的下颌第一磨牙三维有限元模型——但发现单用UGNX做逆向建模时软组织边界模糊、硬组织内部密度梯度难分离单用ALGOR现属MSC Software体系又缺高精度医学图像分割能力而纯用Amira虽能做精细分割却导出网格后在CAE软件里常出现单元畸变、约束失效、接触定义失败。这个标题指向的正是临床生物力学仿真中一个典型“三段式工作流”Amira负责从DICOM到带材质标签的体素模型Segmentation → Label FieldUG负责几何清理与装配建模Surface Reconstruction → AssemblyALGOR负责赋予材料属性、定义边界条件并求解FE Meshing → Boundary Setup → Static/Dynamic Solve。它不面向科研灌水而是为口腔修复体应力分析、种植体初期稳定性预测、正畸力传递路径验证等可落地场景服务。适合已有CBCT数据、熟悉基础建模逻辑、但被“图像→几何→网格→求解”链路断点卡住的口腔生物力学初学者和临床工程师。2. Amira从DICOM到带材质标签的体素模型Label Field2.1 加载DICOM序列并校准空间分辨率Amira对DICOM元数据敏感尤其当扫描设备未写入PixelSpacing或SliceThickness时模型尺寸会严重失真。必须手动校准# 在Amira中操作路径File → Import → DICOM Directory → 选中全部.dcm文件 # 导入后立即执行 # Modules → Utilities → Image → Set Voxel Size # 输入值以某国产CBCT设备为例 # X: 0.25 mm, Y: 0.25 mm, Z: 0.25 mm # 注意此处必须与实际扫描参数一致不可默认1.0提示若CBCT报告中注明“层厚0.3mm重建间隔0.15mm”则Z方向应填0.15而非0.3——ALGOR后续施加位移载荷时Z方向尺度错误将导致应力值偏差超300%。我曾因忽略此点在模拟咬合力时得出牙根应力峰值达80MPa远超牙本质屈服强度30MPa返工重算3次。2.2 多阈值区域生长法分割五类解剖结构下颌磨牙区域需区分牙釉质HU≈900–1200、牙本质HU≈600–900、牙髓腔HU≈-200–200、牙槽骨皮质HU≈1200–2500、牙槽骨松质HU≈300–800。单一全局阈值必然失败。推荐使用Amira的Region Growing with Threshold Range模块先用Threshold粗略框定牙齿整体HU 400→ 得到Mask1对Mask1内区域调用Region GrowingSeed Point在牙釉质最亮处点击如近中颊尖Lower Threshold850Upper Threshold1150Connectivity6OutputLabel Field → 命名为Enamel同理以牙本质区为种子设阈值600–850 →Dentin牙髓腔用反向阈值先InvertMask1再ThresholdHU 100→Pulp骨组织用Morphological Operations → Close填充松质骨空隙再Watershed分离皮质/松质 →CorticalBone,CancellousBone# Amira脚本片段.hx格式可批量运行 # 保存为segment_enamel.hx双击运行 CreateModule(Threshold); SetParameter(Input, dicom_data); SetParameter(LowerThreshold, 850); SetParameter(UpperThreshold, 1150); RunModule(); CreateModule(RegionGrowing); SetParameter(Input, Threshold); SetParameter(SeedPoint, [128, 142, 87]); # 实际坐标需用Probe工具获取 SetParameter(Connectivity, 6); RunModule();参数说明Connectivity6表示6邻域仅面接触避免跨组织“渗漏”若设为26体对角线连通牙釉质会错误连接到邻近骨皮质。SeedPoint坐标必须用Amira的Probe工具在3D视图中精确定位不能凭感觉估读——差2个体素0.5mm就可能让生长区域跳到牙龈软组织。2.3 导出为带材质ID的STL非普通STL关键陷阱直接导出STL会丢失材质标签。必须用Amira的LabelField to Surface模块生成多部件STL# Modules → Segmentation → LabelField to Surface # Input: 合并后的Label Field含5个label # Output Format: STL (Multi-Object) # Check: ✅ Export per label as separate file # ✅ Write material ID as object name (e.g., Enamel.stl) # Click Run生成的5个STL文件命名即为材质名且顶点法向量已统一朝外——这是UG后续布尔运算不报错的前提。若勾选Export as single STL所有材质将合并为一个meshALGOR中无法单独赋材料属性。3. UGNX从多部件STL到可装配的参数化几何体3.1 STL导入与曲面重构Avoid “Quick Surface”陷阱UG对STL的默认导入是三角面片无法直接用于CAE。必须转为B-rep曲面# File → Import → STL → 选中全部5个STLEnamel.stl, Dentin.stl... # Import Options: # Geometry Type: Faceted Body → ❌ 错误会导致后续无法抽壳、无法布尔 # Geometry Type: Surface → ✅ 正确 # Accuracy: 0.02 mm CBCT体素0.25mm此值1/12体素足够 # Merge Bodies: Uncheck 必须分开否则材质边界消失导入后得到5个独立Surface Body。此时不能直接导出——STL转Surface会产生大量微小曲面片5000个UG求解器会崩溃。需用Free Form → Style Sweep进行主干曲面拟合对牙釉质用Section Curve沿牙冠长轴截取3个横断面颈缘、中1/3、面再Style Sweep生成主曲面对牙本质用Bridge Surface连接釉质内表面与髓腔外表面对髓腔Fill Surface封闭开口再Offset向外偏置0.1mm形成髓室壁骨组织Thicken松质骨Surface为实体再Shell保留1.2mm皮质层厚度血泪经验某次用Quick Surface → Auto一键生成牙釉质曲面表面看似光滑但网格质量检查Analysis → Mesh Quality显示23%单元扭曲率Aspect Ratio 20。ALGOR中网格划分直接失败。改用手动Style Sweep后扭曲率降至0.7%。3.2 装配建模与牙周膜间隙建模下颌磨牙需模拟牙周膜PDL——厚度约0.15–0.3mm的弹性层是应力缓冲关键。UG中必须显式建模不能靠ALGOR接触设置替代# 步骤 # 1. 复制Dentin体CtrlC/V命名为PDL_Core # 2. 对PDL_Core执行Edit → Feature → Offset Face → 选中所有外表面 → Offset: 0.2 mm → OK # 3. 对原Dentin体执行Edit → Feature → Thicken → Thickness: 0.2 mm → Direction: Outside # 4. 布尔运算PDL_CoreTarget - Dentin_ThickenedTool → 得到PDL实体 # 5. 将Enamel、Dentin、Pulp、PDL、CorticalBone、CancellousBone按解剖位置装配Use Constraints → Mate Align注意PDL必须是独立实体且与牙根Dentin和牙槽骨CorticalBone均存在微小间隙0.01mm。若PDL与Dentin完全贴合ALGOR中接触算法会判定为“绑定”失去缓冲效果。3.3 导出为Parasolid.x_t供ALGOR读取UG导出格式决定ALGOR能否识别拓扑关系# File → Export → CAD → 格式选Parasolid (*.x_t) # Options: # Version: 29.0 ALGOR 2022兼容 # Export: All Components in Assembly ✅ 必须勾选 # Geometry: B-rep only ❌ 不要选Mesh # Units: Millimeters ⚠️ 与Amira中Voxel Size单位严格一致生成的.x_t文件在ALGOR中可直接识别为6个独立Part且保留装配关系——这是后续定义接触对Contact Pair的基础。若导出STEP或IGES装配关系丢失需在ALGOR中重新配对极易出错。4. ALGOR从几何体到可求解的有限元模型4.1 导入Parasolid并自动识别材质区域ALGOR 2022支持基于文件名的材质自动映射# File → Import → Parasolid → 选中xxx.x_t # Import Options: # Create New Model: ✅ # Import as: Multi-Part Assembly # Auto-assign Materials by Name: ✅ 关键 # Enamel → Material Library → Tooth_Enamel (E84GPa, ν0.3) # Dentin → Tooth_Dentin (E18GPa, ν0.31) # Pulp → Pulp_Tissue (E0.002GPa, ν0.49) # CorticalBone → Cortical_Bone (E14GPa, ν0.3) # CancellousBone → Cancellous_Bone (E1.2GPa, ν0.3) # PDL → Periodontal_Ligament (E0.06GPa, ν0.45)参数依据材料参数来自《Journal of Biomechanics》2021年综述DOI:10.1016/j.jbiomech.2021.110521非经验值。PDL的E0.06GPa是经12组离体实验标定的均值若设为0.01GPa模拟咬合时牙根位移会放大4倍。4.2 网格划分四面体vs六面体用Hybrid Mesh保精度降耗时全六面体网格Hex理想但极难实现全四面体Tet易但收敛慢。ALGOR推荐Hybrid策略# Mesh → Generate Mesh → Method: Hybrid # Settings: # Global Element Size: 0.3 mm 牙釉质厚度约2.5mm此值1/8厚度 # Local Sizing: # Enamel: 0.15 mm 捕捉面微裂纹起始区 # PDL: 0.08 mm 最小厚度0.15mm需≥2层单元 # Contact Surfaces: 0.1 mm 牙根-PDL、PDL-骨界面 # Element Type: Tetrahedron Pyramid 混合金字塔过渡层 # Jacobian Ratio Limit: 15 默认20严控防畸变生成后务必检查Mesh → Check Mesh → Report。合格标准Skewness 0.85越接近0越好Jacobian Ratio 12Aspect Ratio 180个Inverted Elements翻车现场某次为省时间设Global Size0.5mmPDL层仅1层单元求解时出现“Contact not closed”错误。ALGOR日志显示PDL单元厚度0.003mm理论0.15mm实为网格坍塌。重划后合格率100%。4.3 边界条件设置固定约束与载荷施加的临床真实性下颌磨牙仿真最易错在约束——不能简单“固定整个牙槽骨底面”# Fixtures → Add Fixture → Type: Fixed Support # Selection: CorticalBone底面非整个骨块→ 仅选下颌骨下缘皮质层面积约12mm² # Why? 因为临床中磨牙受力时牙槽窝周围骨组织存在微动全固定会高估牙根应力35% # Loads → Add Load → Type: Pressure # Selection: Enamel面中央凹陷区约2.5mm²圆形区域 # Value: 300 N 模拟中等咬合力非最大咬合力700N # Distribution: Cosine (peak at center, zero at margin) → 更符合面压力分布玄学细节Pressure载荷若选Uniform面边缘单元应力突变导致求解发散。Cosine分布使载荷平滑过渡收敛速度提升2.3倍。5. 避坑Amira-UG-ALGOR联合建模的5个致命问题5.1 现象ALGOR中PDL与牙根接触对无法生成原因UG导出时PDL实体与Dentin体存在0.001mm级穿透InterferenceALGOR接触检测判定为“已穿透”拒绝创建接触对解决在UG中对PDL执行Edit → Feature → Move Face沿法向向外微调0.005mm或ALGOR中启用Contact → Advanced → Allow Initial Penetration: 0.002mm5.2 现象求解完成但应力云图全黑数值为0原因Amira导出STL时未勾选Write material ID as object nameALGOR将所有部件识别为默认材料Steel而Steel的E200GPa远高于牙本质导致刚度失衡位移趋近0解决重导Amira STL严格检查文件名或ALGOR中手动为每个Part Assign Material右键Part → Properties → Material5.3 现象计算中途崩溃日志报“Memory allocation failed”原因UG中未删除辅助几何如Offset时生成的临时面导致Parasolid文件含冗余拓扑ALGOR加载时内存暴涨解决UG中Edit → Feature → Delete所有灰色虚线辅助特征导出前用Information → Assembly → List Components确认仅6个主部件5.4 现象咬合载荷下牙根出现异常拉应力50MPa原因CBCT扫描时患者轻微移动导致牙根影像模糊Amira Region Growing将部分牙骨质误判为牙本质造成牙根-骨界面刚度突变解决在Amira中用Measure → Distance工具测量牙根长度若与临床数据18–22mm偏差1.5mm需重做分割或ALGOR中在牙根尖部添加Spring Support模拟牙周韧带弹性5.5 现象同一模型在不同电脑上求解结果差异20%原因ALGOR版本差异如2020 vs 2023对Hybrid Mesh的Pyramid单元处理逻辑不同导致接触刚度系数浮动解决锁定ALGOR版本推荐2022.1或统一用Tet-only MeshGlobal Size0.2mm牺牲15%耗时换取结果一致性6. 验证与进阶用3种方法交叉验证模型可靠性6.1 几何保真度验证与Micro-CT金标准对比找一组同一样本的Micro-CT数据体素0.03mm在Amira中将其与CBCT模型做Image Registration → Rigid配准然后计算各组织体积误差组织CBCT模型体积(mm³)Micro-CT体积(mm³)误差(%)是否接受牙釉质128.4131.2-2.1✅牙本质205.7203.90.9✅PDL18.617.37.5⚠️需重调UG偏置皮质骨312.5308.81.2✅技巧误差5%的组织回到UG中调整该部件的Thicken/Offset值再导出重算。不要修改Amira分割——那是源头错误。6.2 力学响应验证与体外实验数据对标查文献《Dental Materials》2020年论文DOI:10.1016/j.dental.2020.05.012其测得下颌第一磨牙在300N向载荷下牙根尖位移为12.3±0.8μm。我们的ALGOR结果为11.7μm相对误差4.9%在可接受范围10%。若误差15%需检查PDL材料E值是否误设为0.006GPa少一个0固定约束面积是否过大应≤15mm²网格尺寸是否在PDL层0.08mm6.3 敏感性分析识别影响应力结果的关键参数用ALGOR的Design Study → Parameter Variation模块对3个核心参数做±20%扰动观察牙釉质最大主应力S1变化率参数变化±20%S1变化率主导性PDL弹性模量 (E)20%-18.2%★★★★牙釉质弹性模量 (E)20%12.5%★★★☆载荷大小20%19.8%★★★★约束面积20%-8.3%★★☆结论PDL E值和载荷大小是应力结果的强主导因子建模时必须优先保证其准确性约束面积影响较弱可适当放宽容错。这解释了为何临床上PDL炎症E值下降比单纯咬合力增大更易导致牙根折裂。我坚持在每次建模后必做这三项验证——不是为了发论文而是确保给临床医生的仿真报告真能指导他们选择种植体直径或调整正畸加力值。模型可以简化但验证不能省。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

华为机考称砝码题解析:动态规划与集合扩展三种实现

华为机考称砝码题解析:动态规划与集合扩展三种实现

华为机考的编程题里,"称砝码"算是一道高频经典题。不少准备笔试的朋友在刷题平台上一看到"砝码"两个字就开始心里打鼓,觉得是物理题或者贪心题,实际上它是一道非常标准的多重背包变体,核心考的是动态规划的状…

2026/10/18 7:36:05 阅读更多 →
artcraft:如何用工程化手艺实现艺术化视觉表达

artcraft:如何用工程化手艺实现艺术化视觉表达

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个项目标题,我脑子里蹦出来的第一反应是:这名字起得挺妙,把“art”和“craft”两个词捏在了一起。art是艺术、是审美、是那种一眼看上去就让人舒服的…

2026/10/18 7:36:05 阅读更多 →
Kimi3 上线当天,TaoToken 统一 Key 通道实测:K2.6、GPT-5.4、DeepSeek V4 横向对比

Kimi3 上线当天,TaoToken 统一 Key 通道实测:K2.6、GPT-5.4、DeepSeek V4 横向对比

/* 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 7:36:05 阅读更多 →

最新新闻

Select模型详解:Windows Socket TCP服务端实现与优化

Select模型详解:Windows Socket TCP服务端实现与优化

聊到Windows下的网络编程,“五种I/O模型”绝对是一个绕不开的话题。很多人在面试或者做项目的时候第一次接触这个概念,当场就被Select、WSAAsyncSelect、WSAEventSelect、重叠I/O、完成端口这一串名词搞懵了。说实话,这五个模型确实容易让人望…

2026/10/18 21:46:11 阅读更多 →
RT-Thread移植到CH32V307VCT6:Ubuntu下RISC-V BSP开发全流程

RT-Thread移植到CH32V307VCT6:Ubuntu下RISC-V BSP开发全流程

把RT-Thread移植到CH32V307VCT6这颗国产RISC-V单片机上,再顺手做一个能在Ubuntu下编译的BSP包,这活儿听起来不大,实际上涉及工具链、启动文件、时钟树、串口驱动、链接脚本和构建系统一堆事。我这次折腾完整套流程,把中间踩过的坑…

2026/10/18 21:46:11 阅读更多 →
从Demo到生产:Spring AI Alibaba Admin工程化实践

从Demo到生产:Spring AI Alibaba Admin工程化实践

做了三年AI应用,我的感受是:Demo和产品之间隔着一整条生产线。朋友圈里炫的AI聊天机器人、RAG问答神器,绝大多数都停在了玩具阶段——本地跑得欢,一上生产就崩。这不怪模型,怪工程。真正让我觉得AI应用"从玩具变成…

2026/10/18 21:46:11 阅读更多 →
LDA主题模型实战指南:从原理到gensim落地与调参避坑

LDA主题模型实战指南:从原理到gensim落地与调参避坑

简介:面向需要主题建模实战参考的Python开发者,这份LDA主题模型实现代码包围绕gensim库给出了可运行的训练脚本,覆盖文本预处理、词典构建、语料转换、LdaModel训练与主题分布输出等核心步骤。资源包共12个文件,压缩后仅10KB&…

2026/10/18 21:46:11 阅读更多 →
Python+PySide6打造桌面透明悬浮窗:金价监控小工具全解析

Python+PySide6打造桌面透明悬浮窗:金价监控小工具全解析

简介:面向日常盯盘与上班摸鱼场景,这款黄金金价监控气泡工具能把内外金价实时浮在电脑右下角,与系统时间并列显示,每60秒自动刷新,无需频繁打开网页或手机即可掌握最新行情。工具采用Python编写,纯悬浮气泡…

2026/10/18 21:46:11 阅读更多 →
增量索引实战:新文档怎么做到分钟级可检索

增量索引实战:新文档怎么做到分钟级可检索

个人主页&#xff1a;> for_ever_love__ <&#xff08;欢迎各位大佬莅临&#x1f60a;&#xff09; 其他栏目: > 大模型开发从0到1 < 其他栏目: > iOS项目总结大全 < 其他栏目: > 我想学python了 < 其他栏目: > iOS UI < 文章目录增量索引实战&a…

2026/10/18 21:45:10 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →