当前位置:首页>python>Python开源网格生成工具 | 视图区交互操作:从拾取到几何创建的设计实现

Python开源网格生成工具 | 视图区交互操作:从拾取到几何创建的设计实现

  • 2026-01-29 18:07:15
Python开源网格生成工具 | 视图区交互操作:从拾取到几何创建的设计实现

前言

在三维几何建模软件中,视图区的交互操作是用户体验的核心环节。PyMeshGen作为一个基于Python的网格生成工具,在视图区交互方面实现了一套实用的解决方案。本文将深入解析其几何拾取、点拾取、几何创建和删除等核心功能的实现原理与技术细节。

一、几何元素拾取系统

1.1 功能设计

- 支持几何元素(点、线、面、体)拾取模式
- 可通过工具栏按钮开启拾取模式
- 左键选中元素
- 右键取消选择
- Enter键确认选择
- Delete键删除已选元素
- Esc键退出拾取模式
- 支持ALT+左键框选(相交选中)
- 支持ALT+右键框选(包含选中)

1.2 系统架构

PyMeshGen的几何拾取系统基于VTK(Visualization Toolkit)的拾取器实现,核心类是GeometryPickingHelper。该类封装了点、线、面、体等几何元素的鼠标拾取功能,提供了灵活的回调机制和状态管理。

classGeometryPickingHelper:def__init__(self, mesh_display, gui=None,                 on_pick=None, on_unpick=None,                 on_confirm=None, on_cancel=None, on_delete=None):        self.mesh_display = mesh_display        self.gui = gui        self._on_pick = on_pick        self._on_unpick = on_unpick        self._on_confirm = on_confirm        self._on_cancel = on_cancel        self._on_delete = on_delete        self._enabled = False

1.3 VTK拾取器配置

系统使用了三种VTK拾取器,分别针对不同的拾取场景:

  • vtkCellPicker:用于拾取几何元素(点、线、面、体)
  • vtkWorldPointPicker:用于在世界坐标系中拾取点
  • vtkRenderedAreaPicker:用于区域选择
self._picker = vtk.vtkCellPicker()self._picker.SetTolerance(0.01)self._point_picker = vtk.vtkCellPicker()self._point_picker.SetTolerance(0.02)self._world_picker = vtk.vtkWorldPointPicker()self._area_picker = vtk.vtkRenderedAreaPicker()

1.4 事件监听机制

拾取系统通过VTK的观察者模式(Observer Pattern)实现事件监听。当拾取功能启用时,系统会注册三个关键事件:

defenable(self):    interactor = self._get_interactor()    self._observer_id = interactor.AddObserver("LeftButtonPressEvent", self._on_left_button_press)    self._observer_right_id = interactor.AddObserver("RightButtonPressEvent", self._on_right_button_press)    self._observer_key_id = interactor.AddObserver("KeyPressEvent", self._on_key_press)    self._enabled = True

1.5 左键拾取实现

左键按下事件是拾取的核心逻辑,系统会根据拾取模式执行不同的操作:

def_on_left_button_press(self, obj, event):    interactor = self._get_interactor()    renderer = self.mesh_display.renderer    click_pos = interactor.GetEventPosition()    picked = self._picker.Pick(click_pos[0], click_pos[1], 0, renderer)if picked:        cell = self._picker.GetCell()        actor = self._picker.GetActor()        element_type, element_obj, element_index = \            self._identify_geometry_element(cell, actor)if element_type and element_obj:            self._handle_pick(element_type, element_obj, element_index)

拾取过程包括以下步骤:

  1. 获取鼠标点击位置
  2. 使用CellPicker进行拾取
  3. 识别拾取到的几何元素类型
  4. 处理拾取结果(高亮显示、回调通知)

1.6 右键取消拾取

右键点击用于取消上一次的拾取操作:

def_on_right_button_press(self, obj, event):if self._highlighted_actors:for actor, data in list(self._highlighted_actors.items()):            self._unhighlight_actor(actor, data)        self._highlighted_actors.clear()if self._on_unpick:        element_type, element_obj, element_index = \            self._get_last_picked_element()if element_type:            self._on_unpick(element_type, element_obj, element_index)

1.7 键盘快捷键

键盘事件提供了快速确认(Enter)、取消(Esc)和删除元素(Delete)的途径:

def_on_key_press(self, obj, event):    interactor = self._get_interactor()    key = interactor.GetKeySym()if key in ("Return""Enter"):if self._on_confirm:            self._on_confirm()elif key in ("Escape""Esc"):if self._on_cancel:            self._on_cancel()elif key == "Delete":if self._on_delete:            self._on_delete()

二、点拾取与磁吸功能

2.1 点拾取模式

点拾取是几何创建的基础,系统提供了独立的点拾取模式:

defstart_point_pick(self, on_pick=None, on_confirm=None,                     on_cancel=None, on_exit=None):    interactor = self._get_interactor()    self._point_pick_observer_id = interactor.AddObserver("LeftButtonPressEvent", self._on_point_pick_press)    self._point_pick_right_id = interactor.AddObserver("RightButtonPressEvent", self._on_point_pick_right_press)    self._point_pick_key_id = interactor.AddObserver("KeyPressEvent", self._on_point_pick_key_press)    self._point_pick_move_id = interactor.AddObserver("MouseMoveEvent", self._on_point_pick_move)    self._point_pick_enabled = True

2.2 磁吸功能实现

磁吸功能允许用户在拾取点时自动吸附到现有的几何点,提高了几何创建的精度。实现原理如下:

2.2.1 几何点缓存

系统在启用磁吸时会预先缓存所有几何点的世界坐标:

def_update_geometry_points_cache(self):    elements = self._get_all_geometry_elements()    vertices = elements.get("vertices", [])from OCC.Core.BRep import BRep_Tool    new_cache = []for vertex_index, vertex_obj in vertices:try:            pnt = BRep_Tool.Pnt(vertex_obj)            new_cache.append((pnt.X(), pnt.Y(), pnt.Z()))except Exception:continue    self._geometry_points_cache = new_cache

2.2.2 坐标转换

磁吸的核心在于屏幕坐标与世界坐标的转换:

def_world_to_display_coords(self, world_point, renderer):    coord = vtk.vtkCoordinate()    coord.SetCoordinateSystemToWorld()    coord.SetValue(world_point[0], world_point[1], world_point[2])    display_point = coord.GetComputedDisplayValue(renderer)return (display_point[0], display_point[1])

2.2.3 最近点查找

基于屏幕位置查找最近的几何点:

def_find_nearest_point_from_screen_pos(self, screen_pos, renderer,                                       pixel_tolerance=None):if pixel_tolerance isNone:        pixel_tolerance = self._snap_pixel_tolerance    min_pixel_dist_sq = float('inf')    nearest_point = None    tolerance_sq = pixel_tolerance ** 2for cached_point in self._geometry_points_cache:        cached_display = self._world_to_display_coords(            cached_point, renderer)if cached_display isNone:continue        pixel_dist_sq = (screen_pos[0] - cached_display[0]) ** 2 + \                       (screen_pos[1] - cached_display[1]) ** 2if pixel_dist_sq < min_pixel_dist_sq:            min_pixel_dist_sq = pixel_dist_sq            nearest_point = cached_pointif min_pixel_dist_sq <= tolerance_sq:return nearest_pointreturnNone

2.2.4 点拾取与磁吸

点拾取时会优先尝试磁吸:

def_on_point_pick_press(self, obj, event):    click_pos = interactor.GetEventPosition()    world_pos = self._pick_on_plane(click_pos, renderer)    self._is_snapped = False    final_pos = world_pos    vertex_obj = None    vertex_index = Noneif self._snap_enabled:        nearest_point = self._find_nearest_point_from_screen_pos(            click_pos, renderer)if nearest_point:            final_pos = nearest_point            self._is_snapped = True            result = self._find_vertex_by_point(final_pos)if result:                vertex_obj, vertex_index = result    actor = self._show_picked_point_highlight(        final_pos[0], final_pos[1], final_pos[2])    self._picked_points.append(        (final_pos[0], final_pos[1], final_pos[2], vertex_obj))    self._on_point_pick(final_pos, vertex_obj)

2.3 右键取消拾取

点拾取模式下,右键用于取消上一次拾取的点:

def_on_point_pick_right_press(self, obj, event):if self._picked_points:        self._remove_last_picked_point()    style = interactor.GetInteractorStyle()if style:        style.OnRightButtonDown()

三、几何创建系统

3.1 几何创建对话框

GeometryCreateDialog类提供了完整的几何创建界面,支持多种几何类型:

classGeometryCreateDialog(QDialog):def__init__(self, parent=None):        super().__init__(parent)        self.gui = parent        self.setWindowTitle("创建几何")        self._current_pick_target = None        self._picked_points_history = []        self._create_widgets()        self._connect_signals()

3.2 支持的几何类型

系统支持创建以下几何类型:

2D几何

  • 直线
  • 圆/圆弧
  • 曲线(样条)
  • 多段线/折线
  • 矩形
  • 多边形
  • 椭圆/椭圆弧

3D几何

  • 长方体
  • 圆球
  • 圆柱

3.3 坐标输入与拾取

每个几何类型都需要输入坐标参数,系统提供了两种输入方式:

3.3.1 手动输入坐标

def_create_coord_input_with_pick(self):    widget = QWidget()    layout = QHBoxLayout(widget)    line_edit = QLineEdit()    line_edit.setPlaceholderText("x, y, z")    pick_btn = QPushButton("拾取")    pick_btn.setMaximumWidth(60)    layout.addWidget(line_edit, 1)    layout.addWidget(pick_btn, 0)    widget.line_edit = line_edit    widget.pick_btn = pick_btnreturn widget, pick_btn

3.3.2 鼠标拾取坐标

点击"拾取"按钮后,系统会启动点拾取模式:

def_start_single_pick(self, target_line_edit):    self._current_pick_target = target_line_editif self.gui and hasattr(self.gui, "view_controller"):        snap_enabled = self.snap_checkbox.isChecked()        self.gui.view_controller.start_point_pick(            on_pick=self._on_point_picked,            on_cancel=self._on_point_pick_cancel,            snap_enabled=snap_enabled        )

拾取完成后,坐标会自动填充到输入框:

def_on_point_picked(self, point_coords, vertex_obj):if self._current_pick_target:        coord_str = f"{point_coords[0]:.6f}{point_coords[1]:.6f}{point_coords[2]:.6f}"        self._current_pick_target.setText(coord_str)        self._picked_points_history.append(            (self._current_pick_target, point_coords))

3.4 磁吸选项

系统提供了磁吸功能的开关:

options_group = QGroupBox("拾取选项")options_layout = QHBoxLayout(options_group)self.snap_checkbox = QCheckBox("启用磁吸")self.snap_checkbox.setChecked(True)self.snap_checkbox.setToolTip("启用后,拾取点时会自动吸附到附近的几何点")options_layout.addWidget(self.snap_checkbox)

3.5 动态点数量管理

对于曲线、折线和多边形等需要多个点的几何类型,系统提供了动态增加/减少点的功能:

def_add_point_input(self, mode):if mode == "curve":        widgets_list = self.curve_point_widgets        inputs_layout = self.curve_point_inputs_layout        num_spin = self.curve_num_pointselif mode == "polyline":        widgets_list = self.polyline_point_widgets        inputs_layout = self.polyline_point_inputs_layout        num_spin = self.polyline_num_pointselif mode == "polygon":        widgets_list = self.polygon_point_widgets        inputs_layout = self.polygon_point_inputs_layout        num_spin = self.polygon_num_pointselse:return    widget, btn = self._create_coord_input_with_pick()    widgets_list.append((widget, btn))    inputs_layout.addWidget(widget)    btn.clicked.connect(lambda checked=False, w=widget: self._start_single_pick(w.line_edit))    num_spin.setValue(num_spin.value() + 1)

3.6 几何创建流程

完整的几何创建流程如下:

  1. 用户选择几何类型
  2. 输入或拾取坐标参数
  3. 点击"创建"按钮
  4. 系统验证参数并创建几何
  5. 更新视图显示
def_create_geometry(self):    mode = self._get_current_mode()if mode == "点":        coords = self._parse_coords(self.p_coord_widget.line_edit.text())if coords:            self._create_point(coords)elif mode == "直线":        p1 = self._parse_coords(self.l1_coord_widget.line_edit.text())        p2 = self._parse_coords(self.l2_coord_widget.line_edit.text())if p1 and p2:            self._create_line(p1, p2)# ... 其他几何类型的创建逻辑

四、几何删除系统

4.1 删除几何的工作流程

PyMeshGen的几何删除功能采用拾取模式的设计理念,工作流程如下:

  1. 启动拾取模式:通过工具条按钮启动拾取模式
  2. 拾取几何元素:在视图中左键点击要删除的几何元素(点、线、面、体)
  3. 执行删除操作:按Enter键或Delete键删除已拾取的元素
  4. 退出拾取模式:按Esc键退出删除模式

这种设计符合现代CAD软件的交互习惯,用户可以在视图中直观地选择要删除的几何元素。

4.2 启动删除拾取模式

4.2.1 工具条方式

点击几何选项卡中的"删除几何"按钮,系统会启动删除拾取模式:

defopen_geometry_delete_dialog(self):"""进入几何删除拾取模式"""    self._start_delete_geometry_mode()def_start_delete_geometry_mode(self):if self._delete_geometry_mode_active:        self.update_status("删除几何: 已在拾取模式")returnifnot hasattr(self, 'view_controller'):returnif hasattr(self, 'model_tree_widget'and hasattr(self.model_tree_widget, 'tree'):        self.model_tree_widget.tree.clearSelection()    self._delete_geometry_mode_active = True    self._geometry_delete_elements_cache = {}    self.view_controller.start_geometry_pick(        on_pick=self._on_delete_geometry_pick,        on_unpick=self._on_delete_geometry_unpick,        on_confirm=self._on_delete_geometry_confirm,        on_cancel=self._on_delete_geometry_cancel,        on_delete=self._delete_geometry_from_pick,    )    hint = "删除几何: 左键拾取,右键取消,Enter键确认删除,Delete键删除已选元素,Esc退出"    self.log_info(hint)    self.update_status(hint)

启动拾取模式时,系统会:

  • 清除模型树的选择状态
  • 初始化删除元素缓存
  • 注册拾取回调函数
  • 显示操作提示信息

4.2.2 模型树方式

在模型树中右键点击几何节点,选择"删除几何"菜单项,同样会启动删除拾取模式。

4.3 拾取几何元素

进入删除拾取模式后,用户可以在视图中直接拾取要删除的几何元素。

4.3.1 左键拾取元素

左键点击几何元素时,系统会将该元素添加到待删除缓存中:

def_on_delete_geometry_pick(self, element_type, element_obj, element_index):    key_map = {"vertex""vertices","edge""edges","face""faces","body""bodies",    }    key = key_map.get(element_type)if key isNone:return    self._geometry_delete_elements_cache.setdefault(key, set()).add(element_obj)

拾取的元素会被高亮显示,用户可以清楚地看到已选择的元素。

4.3.2 右键取消拾取

右键点击已拾取的元素可以取消选择:

def_on_delete_geometry_unpick(self, element_type, element_obj, element_index):    key_map = {"vertex""vertices","edge""edges","face""faces","body""bodies",    }    key = key_map.get(element_type)if key isNone:returnif key in self._geometry_delete_elements_cache:        self._geometry_delete_elements_cache[key].discard(element_obj)

取消选择后,元素的高亮显示会被移除。

4.4 执行删除操作

拾取完成后,用户可以通过快捷键执行删除操作。

4.4.1 Enter键确认删除

def_on_delete_geometry_confirm(self):    self._delete_geometry_from_pick()

4.4.2 Delete键直接删除

def_delete_geometry_from_pick(self):ifnot self._delete_geometry_mode_active:        self._start_delete_geometry_mode()    element_map = self._collect_picked_geometry_elements()ifnot element_map ornot any(element_map.values()):        element_map = {key: list(values)for key, values in self._geometry_delete_elements_cache.items()}ifnot element_map ornot any(element_map.values()):        self.update_status("删除几何: 未选中元素")returnFalse    success = self.delete_geometry_elements(element_map)if success and hasattr(self, 'view_controller'):        helper = getattr(self.view_controller, '_picking_helper'None)if helper isnotNoneand hasattr(helper, 'clear_selection'):            helper.clear_selection()        self._geometry_delete_elements_cache = {}return success

删除操作包括以下步骤:

  1. 收集已拾取的几何元素
  2. 调用删除函数执行删除
  3. 清除选择状态和缓存
  4. 更新视图显示

4.5 退出删除拾取模式

按Esc键可以退出删除拾取模式:

def_on_delete_geometry_cancel(self):    self._stop_delete_geometry_mode()def_stop_delete_geometry_mode(self):ifnot self._delete_geometry_mode_active:return    self._delete_geometry_mode_active = False    self._geometry_delete_elements_cache = {}if hasattr(self, 'view_controller'):        self.view_controller.stop_geometry_pick(restore_display_mode=True)    self.update_status("删除几何: 已退出")

退出时会:

  • 清除删除模式标志
  • 清空元素缓存
  • 停止拾取功能
  • 恢复视图显示模式

4.6 操作提示与快捷键

系统在状态栏显示详细的操作提示:

删除几何: 左键拾取,右键取消,Enter键确认删除,Delete键删除已选元素,Esc退出

快捷键说明

  • 左键:拾取几何元素
  • 右键:取消拾取
  • Enter:确认删除
  • Delete:直接删除
  • Esc:退出删除模式

4.7 拾取模式的特点

PyMeshGen的删除拾取模式具有以下特点:

  1. 直观性:用户直接在视图中选择要删除的元素,无需切换到对话框
  2. 灵活性:支持多次拾取,可以批量删除多个元素
  3. 可撤销:右键可以取消上一次的拾取操作
  4. 快捷键支持:提供完整的快捷键支持,提高操作效率
  5. 状态反馈:实时显示操作提示和选择状态

五、技术亮点总结

5.1 模块化设计

  • GeometryPickingHelper:专注于拾取功能,提供通用的拾取接口
  • GeometryCreateDialog:专注于几何创建,支持多种几何类型
  • 几何删除模式:集成在主窗口中,提供多种删除方式

5.2 回调机制

系统采用回调函数模式,实现了松耦合的交互逻辑:

defset_callbacks(self, on_pick=None, on_unpick=None,                 on_confirm=None, on_cancel=None, on_delete=None):    self._on_pick = on_pick    self._on_unpick = on_unpick    self._on_confirm = on_confirm    self._on_cancel = on_cancel    self._on_delete = on_delete

5.3 磁吸功能

磁吸功能通过以下技术实现:

  • 预缓存几何点坐标
  • 屏幕坐标与世界坐标转换
  • 像素级距离计算
  • 最近点查找算法

5.4 状态管理

系统完善的状态管理包括:

  • 拾取启用/禁用状态
  • 高亮显示状态
  • 历史记录状态
  • 选择状态

5.5 用户体验优化

  • 可视化反馈:拾取时高亮显示
  • 快捷键支持:Enter确认、Esc取消、Delete删除
  • 磁吸功能:提高拾取精度
  • 历史记录:支持取消操作
  • 状态栏提示:实时显示操作状态

六、总结

PyMeshGen的视图区交互系统通过VTK拾取器、PyQt5界面和OpenCASCADE几何内核的有机结合,实现了一套完整的几何拾取、创建和删除功能。系统的模块化设计、灵活的回调机制和优秀的用户体验,为高阶网格生成提供了一定的交互基础。

本文详细介绍了几何元素拾取、点拾取与磁吸、几何创建和删除等核心功能的实现原理,希望能为相关领域的开发者提供参考和借鉴。

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


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

😁😁

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

👇👇


【往期回顾】

Python + VTK + PyQt5:开源网格生成工具PyMeshGen GUI实现详解
Python开源网格生成工具的GUI模型树设计:从零构建三维数据管理组件
引入PythonOCC实现几何模型导入导出及渲染
Ansys Fluent网格文件cas和msh的读取实例及代码
想入门网格生成算法?建议你看看PyMeshGen
用 Python + VTK + Tkinter 打造自己的 3D 模型查看器

我用DeepSeek-V3.1做了一下PDE编程求解,来看看结果怎么样

使用Qwen Code实现CFD开发自动化AI工作流

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

使用Qwen3-Coder求解一维扩散方程

PyFR求解结果后处理之ParaView使用记录

开源高阶求解器PyFR2.1安装使用记录(CUDA并行版本)

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 01:23:20 HTTP/2.0 GET : https://f.mffb.com.cn/a/468743.html
  2. 运行时间 : 0.130512s [ 吞吐率:7.66req/s ] 内存消耗:4,624.66kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=2b8970282f8383b9f09cc2ec2c65472f
  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.000583s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000744s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000361s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000305s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000656s ]
  6. SELECT * FROM `set` [ RunTime:0.000277s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000681s ]
  8. SELECT * FROM `article` WHERE `id` = 468743 LIMIT 1 [ RunTime:0.021051s ]
  9. UPDATE `article` SET `lasttime` = 1770485000 WHERE `id` = 468743 [ RunTime:0.003937s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000317s ]
  11. SELECT * FROM `article` WHERE `id` < 468743 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.004131s ]
  12. SELECT * FROM `article` WHERE `id` > 468743 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006285s ]
  13. SELECT * FROM `article` WHERE `id` < 468743 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001817s ]
  14. SELECT * FROM `article` WHERE `id` < 468743 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.013888s ]
  15. SELECT * FROM `article` WHERE `id` < 468743 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.007482s ]
0.132010s