当前位置:首页>python>Python开源网格工具 | Delaunay网格生成 | 开源库 + Bowyer-Watson算法

Python开源网格工具 | Delaunay网格生成 | 开源库 + Bowyer-Watson算法

  • 2026-07-02 03:47:46
Python开源网格工具 | Delaunay网格生成 | 开源库 + Bowyer-Watson算法

Delaunay 三角剖分是计算几何中的经典算法,广泛应用于网格生成、地形建模和计算机图形学。本文将深入解析 PyMeshGen 中的 Delaunay 模块,揭示如何基于 Gmsh 的 Bowyer-Watson 算法实现高质量的二维三角网格生成。

一、引言

在计算流体力学(CFD)和有限元分析(FEA)中,三角网格是最基础的非结构网格类型。Delaunay 三角剖分因其独特的空圆特性(Empty Circumcircle Property)而成为网格生成的首选方法:

  • 最优角度:最大化最小内角,避免狭长三角形
  • 唯一性:给定一组点,Delaunay 三角剖分在非退化情况下唯一
  • 局部优化:任意两三角形组成的四边形中,对角线是最优选择

PyMeshGen 的 delaunay\ 模块实现了完整的二维 Delaunay 三角剖分系统,支持两种后端:

  1. Bowyer-Watson 后端:基于 Gmsh 风格的增量插入算法
  2. Triangle 后端:封装 Jonathan Shewchuk 的经典 Triangle 程序

本文将重点解析 Bowyer-Watson 后端的实现原理。

全局参数设置
Bowyer-Watson backend生成结果1
Bowyer-Watson backend生成结果2
Triangle三方库后端1
Triangle三方库后端2
Triangle三方库后端3
Triangle三方库后端4

:网格质量仍有优化空间,但是边界恢复正确。

二、算法总体框架

2.1 模块架构

PyMeshGen 的 Delaunay 模块采用分层设计,将输入归一化、核心算法、后处理解耦:

delaunay/├── __init__.py              # 包入口,公开接口├── bw_utils.py              # 输入归一化与后端分发├── bw_core_stable.py        # Bowyer-Watson 主算法├── bw_cavity.py             # 空腔搜索与重连├── bw_types.py              # Gmsh 风格数据结构├── bw_predicates.py         # 几何谓词├── triangle_backend.py      # Triangle 后端├── postprocess.py           # 轻量后处理└── validation.py            # 测试验证工具

分层职责

层次
文件
职责
公共入口层
bw_utils.py
从 front 提取边界点、边、孔洞;后端分发
算法核心层
bw_core_stable.py
Gmsh 风格 Bowyer-Watson、边界恢复、拓扑清理
空腔算法层
bw_cavity.py
Cavity 搜索、star-shaped 校验、插点后重连
数据结构层
bw_types.py
MTri3、EdgeXFace、TriangulationState
几何谓词层
bw_predicates.py
orient2d、incircle、外接圆计算
替代后端层
triangle_backend.py
Triangle 可执行文件封装
后处理层
postprocess.py
数组级边翻转恢复、拓扑检查

2.2 典型调用链

Delaunay 模块并不是独立入口,而是 core.py 的一个子系统:

core.generate_mesh()  -> QuadtreeSizing(...)                    # 构建尺寸场  -> create_bowyer_watson_mesh(...)         # delaunay 公共入口      -> bw_utils._build_boundary_input()   # front -> 点/边/孔洞      -> backend dispatch         -> BowyerWatsonMeshGenerator       # Bowyer-Watson 后端         -> create_triangle_mesh            # Triangle 后端  -> core._recover_delaunay_boundary_edges()  # 轻量边翻转补恢复  -> Unstructured_Grid.from_cells()           # 统一转网格对象

2.3 公共入口

业务层只需调用一个函数:

from delaunay import create_bowyer_watson_meshpoints, simplices, boundary_mask = create_bowyer_watson_mesh(    boundary_front=front,    sizing_system=sizing,    backend="bowyer_watson",  # 或 "triangle")

该入口负责:

  1. 接收 boundary_front 和 QuadtreeSizing
  2. 归一化边界输入为 BoundaryInput
  3. 自动识别孔洞与外边界
  4. 根据 backend 参数选择后端
  5. 统一返回 (points, simplices, boundary_mask) 三元组

设计原则:上层不需要知道 Bowyer-Watson 内部拓扑如何组织,只关心统一数组输出;后端切换不改变返回格式。

三、边界输入归一化

3.1 BoundaryInput 结构

算法核心不直接理解 front 对象,而是通过 BoundaryInput 接收归一化的边界信息:

BoundaryInput├── boundary_points   # 去重后的边界点坐标├── boundary_edges    # 边界边索引对├── holes             # 孔洞环列表└── outer_boundary    # 主外边界点环

3.2 归一化流程

boundary_front  -> _build_front_graph()           # 以 node.hash 为图节点,阵面为无向边  -> _trace_boundary_loops()        # 从 front 图中提取闭合 loop  -> _classify_boundary_loops()     # 基于面积与重心包含关系判别外边界/孔洞  -> _extract_boundary_points_and_edges()  # 索引稳定化  -> BoundaryInput

关键处理点

  1. front 图重建:以 node.hash 为图节点,以阵面为无向边构建图结构
  2. 边界环追踪:从 front 图中提取所有闭合的边界环
  3. 外边界/孔洞判别:基于面积大小与重心包含关系,面积最大的环为外边界,被外边界包含的环为孔洞
  4. 索引稳定化:所有边界边在进入核心算法前重映射到连续索引

这样做的好处是:算法核心不需要理解 front 对象;Triangle 后端与 Bowyer-Watson 后端可共享同一边界输入;测试与调试时可以直接输出边界点/边,不依赖原始 front 结构。

四、核心数据结构

4.1 MTri3 —— Gmsh 风格的三角形包装类

MTri3 是 Bowyer-Watson 主路径的核心数据结构,直接参考 Gmsh 的 MTri3 类设计:

classMTri3:    __slots__ = ['vertices',        # tuple: 排序后的顶点索引 (v0, v1, v2)'neighbors',       # list[MTri3|None]: 三个邻居三角形'circumcenter',    # np.ndarray: 外接圆心 [x, y]'circumradius',    # float: 外接圆半径'deleted',         # bool: 懒删除标记'idx',             # int: 三角形唯一标识'quality',         # float: 质量度量 (0-1)    ]

关键设计

  1. 懒删除(Lazy Deletion)

    • 空腔搜索、边翻转、局部修复时避免频繁从容器中物理移除
    • 通过 deleted 标记逻辑删除,统一压缩时再物理移除
  2. 显式邻接(Explicit Adjacency)

    • neighbors[3] 维护三角形邻接关系,支持 O(1) 的邻居访问
    • Cavity 搜索和边恢复可以直接走邻接关系,无需重建边索引
  3. 缓存几何量

    • circumcenter 和 circumradius 缓存外接圆信息
    • 避免重复计算,circumradius 同时作为三角形质量度量
  4. 顶点索引排序

    • vertices 自动按升序存储,简化三角形相等性判断
    • __eq__ 和 __hash__ 基于顶点集合

4.2 EdgeXFace —— 边-面关系结构

EdgeXFace 表示"边-面"关系,主要用于空腔 shell 收集和约束边标识:

classEdgeXFace:    __slots__ = ['triangle''local_edge_idx''is_constrained''neighbor']
  • triangle + local_edge_idx 唯一标识一条边
  • is_constrained 标记约束边,防止被删除或翻转
  • neighbor 指向相邻的 EdgeXFace

4.3 TriangulationState —— 常驻拓扑索引层

TriangulationState 是在 MTri3 之上的常驻索引缓存,用于替代反复现建现用的临时 edge map / vertex map:

classTriangulationState:    __slots__ = ['triangles',           # 三角形列表'triangle_by_id',      # ID -> 三角形映射'edge_to_tris',        # 边 -> 关联三角形列表'vertex_to_tris',      # 顶点 -> 关联三角形列表'vertex_to_neighbors'# 顶点 -> 邻点集合    ]

职责

  1. 邻接重建:用一次边遍历同时完成 neighbors 回填和 edge index 构建
  2. 高频查询:查询边是否存在、某边 incident triangles、某顶点 incident triangles、某顶点邻点集合
  3. 懒删除压缩:在需要时统一物理压缩 deleted triangles,并刷新索引

几乎所有局部操作都依赖这层索引:cavity 扩张、边翻转、边界恢复、局部 strip 搜索。

五、几何谓词与数值稳健性

5.1 核心谓词

Delaunay 三角剖分依赖两个基本几何谓词:

1. orient2d —— 方向测试

判断点 p 相对于有向直线 (a→b) 的位置:

deforient2d(ax, ay, bx, by, px, py) -> float:"""返回:      > 0:p 在直线左侧      = 0:p 在直线上      < 0:p 在直线右侧    """return (bx - ax) * (py - ay) - (by - ay) * (px - ax)

2. incircle —— 圆内测试

判断点 p 是否在三角形 (a, b, c) 的外接圆内:

defincircle(ax, ay, bx, by, cx, cy, px, py) -> float:"""返回:      > 0:p 在圆内      = 0:p 在圆上      < 0:p 在圆外    """    adx = ax - px; ady = ay - py    bdx = bx - px; bdy = by - py    cdx = cx - px; cdy = cy - py    alift = adx*adx + ady*ady    blift = bdx*bdx + bdy*bdy    clift = cdx*cdx + cdy*cdy    det = (adx*(bdy*clift - cdy*blift)          - ady*(bdx*clift - cdx*blift)          + alift*(bdx*cdy - cdx*bdy))    orient = (bx-ax)*(cy-ay) - (by-ay)*(cx-ax)return det * orient

5.2 稳健性策略

几何谓词的数值稳定性是 Delaunay 算法的核心挑战。PyMeshGen 采用多层防护:

策略
实现
应用场景
Shewchuk 谓词
incircle()
 行列式计算
点在圆内判断
快速版本
incircle_fast()
 numpy 数组
性能敏感路径
高精度算术
circumcenter_precise()
 Decimal
外接圆心计算
自适应容差
compute_tolerance()
各向异性度量空间
退化防护
极小面积检测
共线/近共线情况

为什么单独拆文件

  1. 算法逻辑与几何数值分离
  2. 可以在不同实现中复用
  3. 便于将来替换更强的鲁棒谓词实现

六、Bowyer-Watson 核心算法

6.1 算法概述

Bowyer-Watson 算法是一种增量插入的 Delaunay 三角剖分方法,核心思想是:

1. 创建超级三角形(包含所有点)2. 逐个插入新点:   a. 找到包含新点的三角形   b. 搜索空腔(所有外接圆包含新点的三角形)   c. 删除空腔内的三角形   d. 用空腔边界与新点重新连接3. 删除含超级顶点的三角形

6.2 BowyerWatsonMeshGenerator 主流程

BowyerWatsonMeshGenerator 是 backend="bowyer_watson" 的唯一实现,设计上更接近 Gmsh meshGFaceDelaunayInsertion.cpp 的二维思路。

主入口阶段顺序

阶段 1: 初始三角剖分  ├─ 创建超级三角形  ├─ 按顺序插入所有边界点  ├─ 使用 cavity 搜索删除被新点破坏的三角形  ├─ 用 shell 边与新点重新连接  ├─ 删除含超级顶点的三角形  └─ 立即恢复初始剖分中缺失的受保护边阶段 2: Gmsh 风格迭代插点  ├─ 优先级队列(按外接圆半径排序)  ├─ 尺寸场驱动(target_size = sizing_system.spacing_at(tri_center))  ├─ 质量阈值(边界区与内区使用不同阈值)  ├─ 早停策略(定期全量检查剩余不满足要求的单元数量)  └─ 压缩与重建(deleted 积累到一定规模后压缩容器并重建队列)阶段 2.5: CDT 边界恢复  └─ swap-first 的精确受保护边恢复阶段 2.6~2.95: 孔洞/域外清理 + 再恢复  ├─ 清理孔洞内三角形  ├─ 清理域外三角形  └─ 必要时再次做 CDT 恢复阶段 3: Laplacian 平滑  └─ 节点位置优化阶段 3.5: 重叠/重复/退化/交叉清理  ├─ 重叠三角形清理  ├─ 重复三角形清理  ├─ 严格相交三角形清理  ├─ 退化三角形清理  ├─ 被隔离边界点修复  └─ 孔洞侧 boundary-fan 清理输出压缩与导出

6.3 初始三角剖分

初始剖分的目标不是得到最终高质量网格,而是建立一个:

  • 覆盖整个域
  • 邻接正确
  • 边界点完整
  • 可继续细化的初始三角网格
# 伪代码def_initial_triangulation(self):# 1. 创建超级三角形    super_tri = self._create_super_triangle(boundary_points)# 2. 逐个插入边界点for point in boundary_points:        cavity = self._find_cavity(point)        shell = self._collect_cavity_shell(cavity)        self._delete_cavity(cavity)        self._reconnect(shell, point)# 3. 删除含超级顶点的三角形    self._remove_super_triangles()# 4. 恢复缺失的受保护边    self._recover_protected_edges()

6.4 迭代细化策略

细化主循环 _insert_points_iteratively() 的核心元素:

1. 优先级队列

# 按外接圆半径排序,优先处理"坏三角形"bad_triangles = sorted(triangles, key=lambda t: t.circumradius, reverse=True)

2. 尺寸场驱动

target_size = sizing_system.spacing_at(tri_center)if tri.circumradius > target_size:# 需要细化

3. 质量阈值

边界区与内区使用不同阈值:

  • 边界区:更宽松,减少边界恢复压力
  • 内区:更严格,保证网格质量

4. 早停策略

定期全量检查剩余不满足要求的单元数量,避免无限循环。

5. 压缩与重建

deleted 三角形积累到一定规模后,压缩容器并重建队列,避免内存膨胀。

6.5 细化点选择

候选点选择由 _select_refinement_point() 完成:

def_select_refinement_point(self, triangle):# 1. 若是靠近受保护边的低质量三角形,优先尝试 off-centerif self._near_protected_edge(triangle):        candidate = self._off_center(triangle)# 2. 否则默认使用 circumcenterelse:        candidate = triangle.circumcenter# 3. 若候选点不满足域内/孔洞/最小间距要求,则拒绝ifnot self._is_valid_insertion(candidate):returnNonereturn candidate

off-center 策略:对边界附近使用更保守的插点,减少边界恢复压力;对内部维持 Delaunay 细化效率。

七、空腔搜索与重连

7.1 Cavity 搜索算法

bw_cavity.py 实现空腔算法:

start_tri  -> recur_find_cavity()      -> 沿邻接递归扩张      -> 碰到受保护边时停止      -> 收集 cavity triangles      -> 收集 shell edges  -> insert_vertex()      -> 新点连接 shell      -> 建立新三角形      -> 更新邻接

核心约束

  • 受保护边不能跨越
  • shell 必须能包围 cavity
  • 失败时必须恢复 deleted 标记和临时点

7.2 Shell 收集

空腔边界(Shell)的收集是重连的关键:

defcollect_cavity_shell(cavity_triangles: List[MTri3]) -> List[EdgeXFace]:"""收集空腔的边界边(Shell)。    算法:    - 遍历空腔中所有三角形的所有边    - 如果某条边只被一个空腔三角形拥有,则是边界边    """    edge_count = {}    edge_to_tris = {}for tri in cavity_triangles:for i in range(3):            edge_key = tri.get_edge_sorted(i)            edge_count[edge_key] = edge_count.get(edge_key, 0) + 1            edge_to_tris[edge_key] = (tri, i)# 边界边是只出现一次的边    shell = []for edge_key, count in edge_count.items():if count == 1:            tri, local_idx = edge_to_tris[edge_key]            shell.append(EdgeXFace(tri, local_idx))return shell

7.3 失败回滚

_rollback_failed_cavity_insertion() 与 _insert_refinement_point() 负责:

  • 回滚 deleted 三角形
  • 删除失败插入产生的临时点
  • 防止留下"孤儿点""空洞"或不完整局部拓扑

这是当前实现区别于早期版本的重要稳健性增强点。

八、边界恢复

8.1 两层边界恢复

模块中存在两层边界恢复:

1. 核心恢复bw_core_stable.py

def_constrained_delaunay_triangulation(self):"""面向受保护边执行 swap-first 的精确恢复"""for protected_edge in self.protected_edges:ifnot self._edge_exists(protected_edge):            self._recover_edge(protected_edge)

2. 轻量恢复postprocess.py

defrecover_boundary_edges_by_swaps(points, simplices, boundary_edges):"""对数组级三角形做边翻转恢复"""# 在 core.py 中作为数组级补恢复使用

设计目的:核心算法内部尽量保证精确约束边;上层在最终三角数组层面还有一次便宜的补救机会。

8.2 边界恢复顺序

Gmsh 主路径中的孔洞处理顺序非常关键:

1. 先完整细化2. 再恢复边界3. 再清理孔洞与域外三角形4. 必要时再次做 CDT 恢复

原因

  • 若过早删洞,局部 cavity 不完整,边界恢复会更困难
  • 若清理后不再恢复,某些真实边界边可能被再次丢失

九、孔洞与域清理

9.1 孔洞识别与清理

孔洞清理的核心是判断三角形是否在孔洞内部:

def_is_in_hole(self, triangle, holes):"""判断三角形重心是否在任意孔洞内"""    center = triangle.circumcenterfor hole in holes:if self._point_in_polygon(center, hole):returnTruereturnFalse

9.2 多边界环场景

当前实现已经显式支持通过边界连通分量区分不同边界环:

  • 同一边界环上的 boundary fan 三角形可放宽尺寸细化
  • 跨外边界/孔洞边界的桥接三角形仍允许内部细化

这一点对环域类算例(如 quad_quad)尤其关键。

十、拓扑清理

10.1 最终输出前的清理

最终输出前,Gmsh 主路径会执行:

def_cleanup_topology(self):# 1. 重叠三角形清理    self._remove_overlapping_triangles()# 2. 重复三角形清理    self._remove_duplicate_triangles()# 3. 严格相交三角形清理    self._remove_intersecting_triangles()# 4. 退化三角形清理    self._remove_degenerate_triangles()# 5. 被隔离边界点修复    self._repair_isolated_boundary_points()# 6. 孔洞侧 boundary-fan 清理    self._cleanup_boundary_fans()

这一步是"结果正确性"的最后保障层。

10.2 拓扑验证

validation.py 提供单元测试和验收检查:

defcheck_boundary_edges(points, simplices, boundary_edges):"""检查边界边是否完全恢复"""defcheck_hole_cleanup(points, simplices, holes):"""检查孔洞是否完全清理"""defcheck_topology_clean(points, simplices):"""检查是否存在严格交叉"""

核心思路:重新解析输入 CAS 边界,将输入边界与输出网格建立节点映射,检查边界是否恢复、孔洞是否为空、是否存在严格交叉。

十一、Triangle 后端

11.1 设计目标

triangle_backend.py 为 Jonathan Shewchuk 的 Triangle 提供本地包装:

  • 不修改第三方源码
  • 使用 CLI 而非 DLL/ctypes 桥接
  • 继续复用项目已有尺寸场和边界 front 体系

11.2 工作流

QuadtreeSizing  -> 内部点采样  -> 写 mesh.poly  -> 调用 triangle.exe  -> 解析 mesh.1.node / mesh.1.ele  -> 返回 (points, simplices, boundary_mask)

11.3 内部点采样策略

支持两种策略:

策略
描述
特点
cartesian
叶节点中心 + 四分点
保持原始网格点云风格
equilateral
近似三角晶格采样
更偏向等边三角形

Triangle 后端本质上是:边界与尺寸场仍由 PyMeshGen 控制,三角剖分核心委托给 Triangle

十二、后处理与验证

12.1 postprocess.py

提供两类轻量工具:

1. recover_boundary_edges_by_swaps()

对数组级三角形做边翻转恢复,不依赖 MTri3

2. is_topology_valid()

检查:

  • 是否存在超过 2 个单元共边
  • 网格连通性
  • 严格边交叉

它的定位是:便于 core.py 在统一结果层面做补检查。

12.2 与主流程的集成

core.py 里 mesh_type=4 的职责分工如下:

# core.py 伪代码defgenerate_mesh():# 1. 读取输入网格并构造初始 front    front = self._build_initial_front()# 2. 构造 QuadtreeSizing    sizing = QuadtreeSizing(front, params)# 3. 决定是否先生成边界层if has_boundary_layer:        front = self._generate_boundary_layer(front)# 4. 调用 create_bowyer_watson_mesh()    points, simplices, boundary_mask = create_bowyer_watson_mesh(        boundary_front=front,        sizing_system=sizing,        backend=params.delaunay_backend,    )# 5. 对非 Triangle 后端做轻量边翻转恢复if params.delaunay_backend != "triangle":        points, simplices = recover_boundary_edges_by_swaps(...)# 6. 转成 Unstructured_Grid    mesh = Unstructured_Grid.from_cells(points, simplices)return mesh

十三、配置参数与行为控制

与 delaunay\ 强相关的参数主要有:

参数
来源
作用
mesh_typeParameters4
 时启用 Delaunay 主流程
delaunay_backendParameters
 / case JSON
选择 bowyer_watson 或 triangle
triangle_point_strategyParameters
 / case JSON
Triangle 内部点采样策略
sizing_decayParameters
 / case JSON
控制 QuadtreeSizing 尺寸场衰减
smoothing_iterations
调用参数
控制 Bowyer-Watson 输出前的 Laplacian 平滑
target_triangle_count
调用参数
限制目标细化规模
seed
调用参数
控制可重复性

行为补充规则:带边界层时,上层可能强制切换到 Triangle 后端。

十四、总结

PyMeshGen 的 Delaunay 模块的核心设计思想可以概括为:

  1. 输入统一:front 先归一化成点/边/孔洞
  2. 后端可切换:Bowyer-Watson 与 Triangle 共用同一上层接口
  3. 核心算法分层:几何谓词、cavity、数据结构、后处理分开实现
  4. 结果优先:边界恢复、孔洞清理、拓扑清理构成多层保障
  5. 集成友好:始终以 (points, simplices, boundary_mask) 作为对上层的稳定契约

这套设计使得模块既能服务于当前项目的工程化网格生成,又保留了继续对齐 Gmsh / Triangle / 本项目自定义策略的扩展空间。

👇点击左下方“阅读原文”访问项目!


全文结束,感谢观看,创作不易。

😁😁

欢迎关注、留言、点赞、分享、推荐!

👇👇


【往期回顾】

Python + VTK + PyQt5:开源网格生成工具PyMeshGen GUI实现详解
Python开源网格工具 | 混合网格生成 | Advancing Front算法详解
Python开源网格工具 | 边界层网格生成 | 层推进与多方向推进算法详解
Python开源网格工具 | 线网格生成与区域创建方法
Python开源网格生成工具 | 视图区交互操作:从拾取到几何创建的设计实现
Python开源网格生成工具的GUI模型树设计:从零构建三维数据管理组件
引入PythonOCC实现几何模型导入导出及渲染
Ansys Fluent网格文件cas和msh的读取实例及代码
想入门网格生成算法?建议你看看PyMeshGen
用 Python + VTK + Tkinter 打造自己的 3D 模型查看器

我用Qwen3-Coder做了一下PDE编程求解,3轮对话就完成!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 09:45:10 HTTP/2.0 GET : https://f.mffb.com.cn/a/489772.html
  2. 运行时间 : 0.152914s [ 吞吐率:6.54req/s ] 内存消耗:4,489.44kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=cfcf5e8c2646257dc21a5df6e5bc6ea7
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000603s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000768s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.017056s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000307s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000639s ]
  6. SELECT * FROM `set` [ RunTime:0.000202s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000579s ]
  8. SELECT * FROM `article` WHERE `id` = 489772 LIMIT 1 [ RunTime:0.017517s ]
  9. UPDATE `article` SET `lasttime` = 1783043110 WHERE `id` = 489772 [ RunTime:0.006091s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.002222s ]
  11. SELECT * FROM `article` WHERE `id` < 489772 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.005783s ]
  12. SELECT * FROM `article` WHERE `id` > 489772 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.003472s ]
  13. SELECT * FROM `article` WHERE `id` < 489772 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002480s ]
  14. SELECT * FROM `article` WHERE `id` < 489772 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.014155s ]
  15. SELECT * FROM `article` WHERE `id` < 489772 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000687s ]
0.154459s