MeshLab源码阅读笔记

记录阅读MeshLab源码时的笔记:


重要的ui文件:

  • LayerDialog是渲染窗口设置页面的ui文件。MainWindow主界面(软件主界面)没有UI文件,是代码实现UI。

  • LayerDialog部分ui内容在ui文件中预设,并留有空白的QGroupBox,用于在代码中完成渲染选项卡的ui内容声明实现。


主程序部分:

  • main函数入口:
    打开MeshLab的控制台命令包括三种跟随文件格式:都能对应到MainWindow的函数功能中
    (1)打开项目文件,。
    (2)打开配置文件,对应摄像机镜头位置。
    (3)打开模型文件。

  • MeshLabApplication:
    MeshLabApplication是继承于QApplication的一个类,比QApplication额外多了什么呢?
    (1)首先是一些应用程序信息(名字,位数,版本等)。
    (2)获取插件和着色器的绝对地址信息。


参数数值部分:

  • value.h:
    自定义的数据类型和相关存取等基本功能函数,是对int,float这些基本数据类型的二次封装。

  • RichParameter:
    MeshLab中参数的抽象类,封装了Value,能提供参数的名称,描述等,构建可以通过构建(参数名+参数字+参数描述+提示信息)。

  • RichParameterList:
    (1)RichParameterList是存储参数的容器,是存储全局参数的参数列表。因为RichParameter是抽象类,没法直接创建对象实例,要从list中获取引用。提供容器操作。需要设置和提取参数时,都是对RichParameterList操作,而非RichParameter。
    (2)类里面没有给定有什么预设参数,需要通过addParam加入参数进入表中。
    (3)RichParameterList使用单例模式,由globals.h中声明创建获取,确保运行时只有一个RichParameterList对象。


插件部分:

  • MeshLabPlugin:
    MeshLabPlugin是插件抽象类,作为具体插件的基类,定义的都是插件的信息,以及启用状态。作为接口。Plugin有好多种,每种都继承MeshLabPlugin,包括:DecoratePlugin,EditPlugin,FilterPlugin,IOmeshPlugin,IOrasterPlugin,RenderPlugin(每个都是抽象类)。

  • FilterPlugin:
    FilterPlugin继承自MeshLabPlugin,各种filter插件的抽象类,作为接口。包括插件的具体细节,信息参数。具体每种filter插件都继承FilterPlugin类。

  • FilterPluginContainer:
    存放管理FilterPlugin的容器,内部用vector存储插件,并定义了遍历的iterator遍历器作为内部类。

  • PluginManager:
    (1)单例模式,由globals.h中声明创建获取
    (2)是无继承的,自己编写的插件管理器,包括检查、加载、卸载、使能等功能。
    (3)里面存储管理不同类型的插件容器,调用插件的时候,都要通过PluginManager去完成。(PluginManager的成员是FilterPluginContainer等,FilterPluginContainer的成员是继承FilterPlugin)。


主界面部分:

  • MainWindow.h:
    (1)头文件中定义了类MainWindowSetting,用于系统参数初始化和更新(gpu数量,精度,最大贴图内存等)
    (2)看看MainWindow窗口类中有什么:
    正常声明了信号和槽,信号很少,槽很多。正常声明成员函数和成员变量(包括菜单、工具栏和QAction操作,没有其他控件),都是主界面里的ui内容。 可以打开MeshLab软件对照着看,窗口上的元素都是在MainWindow窗口类中声明的成员变量,例如各种可以点击的元素,都是QAction类型的。

  • MainWindow_Init.cpp:(就是MainWindow类的实现,部分实现在MainWindow_Runtime.cpp文件中)
    (1)用于初始化的MainWindow,参数列表和插件管理器都以单例模式传入到构造函数参数中。
    (2)以下操作都是在构造函数中完成:创建QMdiArea,LayerDialog的ui控件。
    (3)接着加载插件管理器,通过调用PluginManager的加载函数完成,读取并获得插件文件所在的绝对路径来识别加载插件。
    (4)进行窗口图标的设置。
    (5)后续是设置ui上各个QAction的图标和文本,然后绑定槽函数。
    (6)在构造函数中调用创建窗口菜单的函数(实际上是把菜单部分的ui实现代码放到一个函数中),然后在函数中编辑菜单内容,调用填充菜单的函数,填充菜单项,菜单变量(QMenu)是MainWindow类的私有成员。
    (7)通过遍历插件管理器中的插件,将filter插件另外存入mapFilterPlugin这个map容器中。
    std::map<QString, FilterPlugin*> mapFilterPlugin)。不同类型的插件存入对应的map容器中。
    (8)再重新遍历mapFilterPlugin,对每个filterAction(每个filter都是一个QAction)设置filter提示等信息,然后再连接到startFilter槽函数(startFilter是同一个槽函数)。
    (9)然后判断插件类型(判断是Remesh还是Selection这些类型),并插入到对应的类别菜单控件下。
    (10)startFilter槽函数用于设置对话框ui和询问参数。(相当于触发filter这个QAction后,startFilter负责显示对应的参数设置窗口)
    (11)startFilter执行时会最先关闭编辑功能并更新菜单(实际上是菜单的使能操作)。利用sender函数获取发送信号的QAction,从而找出对应的FilterPlugin。
    (12)点击插件后创建的插件窗口是MeshlabStdDialog类

  • LayerDialog:
    (1)LayerDialog继承自QDockWidget,可以拖拽的窗口。该对话框是模型信息窗口,包括视角、渲染选项、层级等。
    (2)首先设置了不可见。选项卡窗口是使用QAction生成选项卡总数,然后根据QAction数量决定tab数量,再生成相应的页面。
    (3)根据点击的QAction来显示相应的参数设置页面,每个页面对应单独一个类(都放在同一个头文件中),控制切换的槽函数是在主页面MainWindow类中声明的槽函数(通过在LayerDialog构造函数创建一个MainWindow的引用,从而实现获取主页面类的槽函数)。


插件窗口部分:

  • MeshlabStdDialog:
    (1)MeshlabStdDialog是插件的窗口类,继承自QDockWidget。创建管理QFrame(内容是插件中具体的参数),其中loadFrameContent函数用来读取并填充插件参数窗口QFrame中的信息。
    (2)利用RichParameterListFrame类自动创建参数框架,并将框架加入到窗口layout中。
    (3)插件窗口分三大件,首先是QLabel的插件描述,然后是参数列表QFrame,最后是四个按钮QPushButton以及连接按钮相应的槽函数。
    (4)当前什么插件,执行时是什么功能,都通过插件窗口MeshlabStdDialog该对话框类里面的指针指着当前的函数。但是执行插件QAction的函数声明和代码是在MainWindow类下,供当前类调用(创建MainWindow的引用),执行插件的函数需要传入具体QAction和参数进去。

模型部分:

  • 模型是使用容器负责存储,每次修改完得到的新模型,都会加入到容器中。然后再调用MainWindow的GLA()等相关函数负责更新渲染窗口的内容。

  • MeshModel:
    无继承的模型类,具体模型的表示借助了第三方库vcg来实现。

  • MeshDocument:
    管理MeshModel的容器,内部使用list容器来存储,定义了存取和遍历等管理的函数。程序中实际是用到该容器来访问模型。


  • MeshLab重要的部分大致如下图,差不多总结了以上内容。

MeshLab源码阅读笔记相关推荐

  1. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  2. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  3. 代码分析:NASM源码阅读笔记

    NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...

  4. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http:// ...

  5. Yii源码阅读笔记 - 日志组件

    2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...

  6. AQS源码阅读笔记(一)

    AQS源码阅读笔记 先看下这个类张非常重要的一个静态内部类Node.如下: static final class Node {//表示当前节点以共享模式等待锁static final Node SHA ...

  7. 【Flink】Flink 源码阅读笔记(20)- Flink 基于 Mailbox 的线程模型

    1.概述 转载:Flink 源码阅读笔记(20)- Flink 基于 Mailbox 的线程模型 相似文章:[Flink]Flink 基于 MailBox 实现的 StreamTask 线程模型 Fl ...

  8. 【Flink】Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

    1.概述 转载:Flink 源码阅读笔记(18)- Flink SQL 中的流和动态表

  9. 【Flink】Flink 源码阅读笔记(16)- Flink SQL 的元数据管理

    1.概述 转载:Flink 源码阅读笔记(16)- Flink SQL 的元数据管理 Flink 源码阅读笔记(17)- Flink SQL 中的时间属

  10. 【Flink】Flink 源码阅读笔记(15)- Flink SQL 整体执行框架

    1.概述 转载:Flink 源码阅读笔记(15)- Flink SQL 整体执行框架 在数据处理领域,无论是实时数据处理还是离线数据处理,使用 SQL 简化开发将会是未来的整体发展趋势.尽管 SQL ...

最新文章

  1. python简单装饰器_python装饰器的简单示例
  2. WCF学习之旅—第三个示例之二(二十八)
  3. CAP BASE 最终一致性
  4. CCIE基础知识之EIGRP 二
  5. Linux操作命令(一)
  6. 源码阅读:SDWebImage(五)——SDWebImageFrame
  7. numpy.mgrid的用法图解
  8. 高校智慧教室建设方案
  9. 阿里月饼事件,猿方怎么看?
  10. 华硕Z99jc安装win7出现安装程序无法定位现有系统分区,也无法创建新的系统分区解决办法...
  11. 代码主题darcula_设置IntelliJ主题和字体方法
  12. Android 9 wifi PNO 扫描
  13. 如何对Windows 2000中出现的“Stop 0x0000007B”错误信息进行故障诊断 1
  14. linux关于安装tar、tar.gz、tar.xz等文件的贴士
  15. java 爬楼梯算法_动态规划-爬楼梯问题java实现
  16. 【阅读心得】Python编程无师自通——专业程序员的养成
  17. uniapp开发微信小程序保存图片带权限判断
  18. html中的单引号、双引号及其转义使用
  19. Docker搭建Mesos体系
  20. Intel CET 安全防御机制深度解析

热门文章

  1. python聊天室详细教程_python编写简易聊天室实现局域网内聊天功能
  2. 【工具推荐】Adobe Reader 设置高亮颜色及深浅
  3. 20大中国式弱点营销
  4. php李炎恢笔记,一步步学习php笔记 李炎恢瓢城web俱乐部
  5. 6-28小组会议记录
  6. 汉字录入到计算机的过程,如何快速把书中文字录入到电脑中
  7. 第一章 Visual Basic入门
  8. linux安装2870无线网卡,告诉你Ubuntu 12.04下RT5370无线网卡驱动安装的方法及命令
  9. 局域网游戏联机原理解析
  10. VARCHART XGantt 甘特图中的日期和夏令时