000FreeCAD源码学习--MainGui.cpp

目录

1 MainGui.cpp源代码

2 int main()函数分析

3 编译运行截图


 

FreeCADMain项目下的MainGui.cpp

1 MainGui.cpp源代码
int main( int argc, char ** argv )
{
#if defined (FC_OS_LINUX) || defined(FC_OS_BSD)setlocale(LC_ALL, ""); // use native environment settings// Make sure to setup the Qt locale system before setting LANG and LC_ALL to C.// which is needed to use the system locale settings.(void)QLocale::system();// See https://forum.freecad.org/viewtopic.php?f=18&t=20600// See Gui::Application::runApplication()putenv("LC_NUMERIC=C");putenv("PYTHONPATH=");
#elif defined(FC_OS_MACOSX)(void)QLocale::system();putenv("PYTHONPATH=");
#elif defined(__MINGW32__)const char* mingw_prefix = getenv("MINGW_PREFIX");const char* py_home = getenv("PYTHONHOME");if (!py_home && mingw_prefix)_putenv_s("PYTHONHOME", mingw_prefix);
#else_putenv("PYTHONPATH=");// https://forum.freecad.org/viewtopic.php?f=4&t=18288// https://forum.freecad.org/viewtopic.php?f=3&t=20515const char* fc_py_home = getenv("FC_PYTHONHOME");if (fc_py_home)_putenv_s("PYTHONHOME", fc_py_home);else_putenv("PYTHONHOME=");
#endif#if defined (FC_OS_WIN32)// we need to force Coin not to use Freetype in order to find installed fonts on Windows// see https://forum.freecad.org/viewtopic.php?p=485142#p485016_putenv("COIN_FORCE_FREETYPE_OFF=1");int argc_ = argc;QVector<QByteArray> data;QVector<char *> argv_;// get the command line arguments as unicode string{QCoreApplication app(argc, argv);QStringList args = app.arguments();for (QStringList::iterator it = args.begin(); it != args.end(); ++it) {data.push_back(it->toUtf8());argv_.push_back(data.back().data());}argv_.push_back(0); // 0-terminated string}
#endif// Name and Version of the ApplicationApp::Application::Config()["ExeName"] = "FreeCAD";App::Application::Config()["ExeVendor"] = "FreeCAD";App::Application::Config()["AppDataSkipVendor"] = "true";App::Application::Config()["MaintainerUrl"] = "http://www.freecad.org/wiki/Main_Page";// set the banner (for logging and console)App::Application::Config()["CopyrightInfo"] = sBanner;App::Application::Config()["AppIcon"] = "freecad";App::Application::Config()["SplashScreen"] = "freecadsplash";App::Application::Config()["AboutImage"] = "freecadabout";App::Application::Config()["StartWorkbench"] = "StartWorkbench";//App::Application::Config()["HiddenDockWindow"] = "Property editor";App::Application::Config()["SplashAlignment" ] = "Bottom|Left";App::Application::Config()["SplashTextColor" ] = "#8aadf4"; // light blueApp::Application::Config()["SplashInfoColor" ] = "#8aadf4"; // light blue App::Application::Config()["SplashInfoPosition" ] = "6,75";QGuiApplication::setDesktopFileName(QStringLiteral("org.freecad.FreeCAD.desktop"));try {// Init phase ===========================================================// sets the default run mode for FC, starts with gui if not overridden in InitConfig...App::Application::Config()["RunMode"] = "Gui";App::Application::Config()["Console"] = "0";App::Application::Config()["LoggingConsole"] = "1";// Inits the Application
#if defined (FC_OS_WIN32)App::Application::init(argc_, argv_.data());
#elseApp::Application::init(argc, argv);
#endif
#if defined(_MSC_VER)// create a dump file when the application crashesstd::string dmpfile = App::Application::getUserAppDataDir();dmpfile += "crash.dmp";InitMiniDumpWriter(dmpfile);
#endifstd::map<std::string, std::string>::iterator it = App::Application::Config().find("NavigationStyle");if (it != App::Application::Config().end()) {ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View");// if not already defined do it now (for the very first start)std::string style = hGrp->GetASCII("NavigationStyle", it->second.c_str());hGrp->SetASCII("NavigationStyle", style.c_str());}Gui::Application::initApplication();// Only if 'RunMode' is set to 'Gui' do the replacementif (App::Application::Config()["RunMode"] == "Gui")Base::Interpreter().replaceStdOutput();}catch (const Base::UnknownProgramOption& e) {QApplication app(argc,argv);QString appName = QString::fromLatin1(App::Application::Config()["ExeName"].c_str());QString msg = QString::fromLatin1(e.what());QString s = QLatin1String("<pre>") + msg + QLatin1String("</pre>");QMessageBox::critical(nullptr, appName, s);exit(1);}catch (const Base::ProgramInformation& e) {QApplication app(argc,argv);QString appName = QString::fromLatin1(App::Application::Config()["ExeName"].c_str());QString msg = QString::fromUtf8(e.what());QString s = QLatin1String("<pre>") + msg + QLatin1String("</pre>");QMessageBox msgBox;msgBox.setIcon(QMessageBox::Information);msgBox.setWindowTitle(appName);msgBox.setDetailedText(msg);msgBox.setText(s);msgBox.exec();exit(0);}catch (const Base::Exception& e) {// Popup an own dialog box instead of that one of WindowsQApplication app(argc,argv);QString appName = QString::fromLatin1(App::Application::Config()["ExeName"].c_str());QString msg;msg = QObject::tr("While initializing %1 the following exception occurred: '%2'\n\n""Python is searching for its files in the following directories:\n%3\n\n""Python version information:\n%4\n").arg(appName, QString::fromUtf8(e.what()),QString::fromUtf8(Py_EncodeLocale(Py_GetPath(),nullptr)), QString::fromLatin1(Py_GetVersion()));const char* pythonhome = getenv("PYTHONHOME");if (pythonhome) {msg += QObject::tr("\nThe environment variable PYTHONHOME is set to '%1'.").arg(QString::fromUtf8(pythonhome));msg += QObject::tr("\nSetting this environment variable might cause Python to fail. ""Please contact your administrator to unset it on your system.\n\n");} else {msg += QObject::tr("\nPlease contact the application's support team for more information.\n\n");}QMessageBox::critical(nullptr, QObject::tr("Initialization of %1 failed").arg(appName), msg);exit(100);}catch (...) {// Popup an own dialog box instead of that one of WindowsQApplication app(argc,argv);QString appName = QString::fromLatin1(App::Application::Config()["ExeName"].c_str());QString msg = QObject::tr("Unknown runtime error occurred while initializing %1.\n\n""Please contact the application's support team for more information.\n\n").arg(appName);QMessageBox::critical(nullptr, QObject::tr("Initialization of %1 failed").arg(appName), msg);exit(101);}// Run phase ===========================================================Base::RedirectStdOutput stdcout;Base::RedirectStdLog    stdclog;Base::RedirectStdError  stdcerr;std::streambuf* oldcout = std::cout.rdbuf(&stdcout);std::streambuf* oldclog = std::clog.rdbuf(&stdclog);std::streambuf* oldcerr = std::cerr.rdbuf(&stdcerr);try {// if console option is set then run in cmd modeif (App::Application::Config()["Console"] == "1")App::Application::runApplication();if (App::Application::Config()["RunMode"] == "Gui" ||App::Application::Config()["RunMode"] == "Internal")Gui::Application::runApplication();elseApp::Application::runApplication();}catch (const Base::SystemExitException& e) {exit(e.getExitCode());}catch (const Base::Exception& e) {e.ReportException();exit(1);}catch (const std::exception& e) {Base::Console().Error("Application unexpectedly terminated: %s\n", e.what());exit(1);}catch (...) {Base::Console().Error("Application unexpectedly terminated\n");exit(1);}std::cout.rdbuf(oldcout);std::clog.rdbuf(oldclog);std::cerr.rdbuf(oldcerr);// Destruction phase ===========================================================Base::Console().Log("%s terminating...\n",App::Application::Config()["ExeName"].c_str());// cleans upApp::Application::destruct();Base::Console().Log("%s completely terminated\n",App::Application::Config()["ExeName"].c_str());return 0;
}
2 int main()函数分析
int main( int argc, char ** argv )  
{  // 如果操作系统是Linux或BSD,则设置本地化环境为当前环境设置  
#if defined (FC_OS_LINUX) || defined(FC_OS_BSD)  setlocale(LC_ALL, ""); // use native environment settings  // 在将LANG和LC_ALL设置为C之前,确保设置了Qt的本地化系统,  // 这样才能使用系统本地化设置。  // See https://forum.freecad.org/viewtopic.php?f=18&t=20600  // See Gui::Application::runApplication()  putenv("LC_NUMERIC=C");  putenv("PYTHONPATH=");  
#elif defined(FC_OS_MACOSX)  // 对于Mac OS X,同样设置本地化系统,并且设置PYTHONPATH环境变量为空  (void)QLocale::system();  putenv("PYTHONPATH=");  
#elif defined(__MINGW32__)  // 对于MinGW,获取MINGW_PREFIX环境变量,并获取PYTHONHOME环境变量,  // 如果PYTHONHOME未设置且MINGW_PREFIX存在,则将PYTHONHOME设置为MINGW_PREFIX  const char* mingw_prefix = getenv("MINGW_PREFIX");  const char* py_home = getenv("PYTHONHOME");  if (!py_home && mingw_prefix)  _putenv_s("PYTHONHOME", mingw_prefix);  
#else  // 对于其他操作系统,将PYTHONPATH环境变量设置为空,并获取FC_PYTHONHOME环境变量,  // 如果存在,则将PYTHONHOME设置为FC_PYTHONHOME;否则,将PYTHONHOME环境变量设置为空  _putenv("PYTHONPATH=");  // https://forum.freecad.org/viewtopic.php?f=4&t=18288  // https://forum.freecad.org/viewtopic.php?f=3&t=20515  const char*fc_py_home = getenv("FC_PYTHONHOME");  if (fc_py_home)  _putenv_s("PYTHONHOME",fc_py_home);  else  _putenv("PYTHONHOME=");  
#endif  #if defined (FC_OS_WIN32)  // 我们需要强制Coin不使用Freetype来找到Windows上已安装的字体,  // 见 https://forum.freecad.org/viewtopic.php?p=485142#p485016  // 设置COIN_FORCE_FREETYPE_OFF环境变量为1,强制Coin不使用Freetype  _putenv("COIN_FORCE_FREETYPE_OFF=1");  // 对于Windows,我们创建一个新的命令行参数数组,并将其转换为unicode字符串格式  int argc_ = argc;  QVector<QByteArray> data;  QVector<char *> argv_;  // 获取命令行参数并将其转换为unicode字符串格式  {  QCoreApplication app(argc, argv);  // 使用QCoreApplication来获取命令行参数列表  QStringList args = app.arguments();  // 获取命令行参数列表(包括程序名称)  for (QStringList::iterator it = args.begin(); it != args.end(); ++it) {  // 遍历参数列表并转换为utf-8格式的字节数组并存入data中  data.push_back(it->toUtf8());  // 转换参数为utf-8格式的字节数组并存入data中  argv_.push_back(data.back().data()); argv_.push_back(0); // 0-terminated string}
#endif// 应用程序的名称和版本  App::Application::Config()["ExeName"] = "FreeCAD"; // 应用程序名称  App::Application::Config()["ExeVendor"] = "FreeCAD"; // 应用程序供应商  App::Application::Config()["AppDataSkipVendor"] = "true"; // 跳过应用程序数据供应商  App::Application::Config()["MaintainerUrl"] = "http://www.freecad.org/wiki/Main_Page"; // 维护者URL  // 设置横幅(用于日志记录和控制台)  App::Application::Config()["CopyrightInfo"] = sBanner; // 版权信息  App::Application::Config()["AppIcon"] = "freecad"; // 应用程序图标  App::Application::Config()["SplashScreen"] = "freecadsplash"; // 启动画面  App::Application::Config()["AboutImage"] = "freecadabout"; // 关于图像  App::Application::Config()["StartWorkbench"] = "StartWorkbench"; // 启动工作台  
//App::Application::Config()["HiddenDockWindow"] = "Property editor"; // 隐藏停靠窗口  App::Application::Config()["SplashAlignment" ] = "Bottom|Left"; // 启动画面对齐方式  App::Application::Config()["SplashTextColor" ] = "#8aadf4"; // 启动画面文本颜色(浅蓝色)  App::Application::Config()["SplashInfoColor" ] = "#8aadf4"; // 启动画面信息颜色(浅蓝色)  App::Application::Config()["SplashInfoPosition" ] = "6,75"; // 启动画面信息位置  QGuiApplication::setDesktopFileName(QStringLiteral("org.freecad.FreeCAD.desktop")); // 设置桌面文件名  try {  // 初始化阶段 ===========================================================  // 设置FC的默认运行模式,如果没有在InitConfig中覆盖,则从GUI开始  App::Application::Config()["RunMode"] = "Gui"; // 运行模式(GUI)  App::Application::Config()["Console"] = "0"; // 控制台模式(0-无,1-有)  App::Application::Config()["LoggingConsole"] = "1"; // 日志记录到控制台(1-是,0-否)  // 初始化应用程序  
#if defined (FC_OS_WIN32)  App::Application::init(argc_, argv_.data()); // 在Windows平台上初始化应用程序  
#else  App::Application::init(argc, argv); // 在其他平台上初始化应用程序  
#endif  
#if defined(_MSC_VER)  // 当应用程序崩溃时创建一个转储文件  std::string dmpfile = App::Application::getUserAppDataDir(); // 获取用户应用程序数据目录  dmpfile += "crash.dmp"; // 添加文件后缀名  InitMiniDumpWriter(dmpfile); // 初始化MiniDumpWriter,用于生成.dmp文件,有助于程序崩溃后的调试  
#endif
#if defined(_MSC_VER)  // 当应用程序崩溃时创建一个转储文件  // create a dump file when the application crashes  std::string dmpfile = App::Application::getUserAppDataDir();  dmpfile += "crash.dmp";  InitMiniDumpWriter(dmpfile);  
#endif  // 查找配置文件中的 "NavigationStyle" 键值对  std::map<std::string, std::string>::iterator it = App::Application::Config().find("NavigationStyle");  if (it != App::Application::Config().end()) {  // 通过路径获取用户参数组,并设置 "NavigationStyle" 的值  ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View");  // 如果未定义,则立即定义(对于第一次启动)  std::string style = hGrp->GetASCII("NavigationStyle", it->second.c_str());  hGrp->SetASCII("NavigationStyle", style.c_str());  }  // 初始化应用程序  Gui::Application::initApplication();  // 如果 'RunMode' 被设置为 'Gui',则替换标准输出  // Only if 'RunMode' is set to 'Gui' do the replacement  if (App::Application::Config()["RunMode"] == "Gui")  Base::Interpreter().replaceStdOutput();  }  catch (const Base::UnknownProgramOption& e) {  // 捕获异常,用于处理未知的程序选项问题  QApplication app(argc,argv);  QString appName = QString::fromLatin1(App::Application::Config()["ExeName"].c_str());  QString msg = QString::fromLatin1(e.what());  QString s = QLatin1String("<pre>") + msg + QLatin1String("</pre>");  QMessageBox::critical(nullptr, appName, s);  exit(1);  }  catch (const Base::ProgramInformation& e) {  // 捕获异常,用于处理程序信息问题  QApplication app(argc,argv);  QString appName = QString::fromLatin1(App::Application::Config()["ExeName"].c_str());  QString msg = QString::fromUtf8(e.what());  QString s = QLatin1String("<pre>") + msg + QLatin1String("</pre>");  QMessageBox msgBox;  msgBox.setIcon(QMessageBox::Information);  msgBox.setWindowTitle(appName);  msgBox.setDetailedText(msg);  msgBox.setText(s);  msgBox.exec();  exit(0);  }catch (const Base::Exception& e) {  // 捕获Base::Exception类型的异常  // 弹出自定义的对话框,而不是Windows的对话框  // Popup an own dialog box instead of that one of Windows  QApplication app(argc,argv);  QString appName = QString::fromLatin1(App::Application::Config()        ["ExeName"].c_str());  QString msg;  // 使用占位符构建错误消息,其中%1表示应用名称,%2表示异常信息,%3表示Python正在搜索的目录,%4表示Python版本信息  msg = QObject::tr("While initializing %1 the following exception occurred: '%2'\n\n"  "Python is searching for its files in the following directories:\n%3\n\n"  "Python version information:\n%4\n")  .arg(appName, QString::fromUtf8(e.what()),  QString::fromUtf8(Py_EncodeLocale(Py_GetPath(),nullptr)), QString::fromLatin1(Py_GetVersion()));  const char* pythonhome = getenv("PYTHONHOME");  if (pythonhome) {  // 如果环境变量PYTHONHOME被设置,则添加相应的错误消息  msg += QObject::tr("\nThe environment variable PYTHONHOME is set to '%1'.")  .arg(QString::fromUtf8(pythonhome));  msg += QObject::tr("\nSetting this environment variable might cause Python to fail. "  "Please contact your administrator to unset it on your system.\n\n");  } else {  // 如果环境变量PYTHONHOME没有被设置,则添加相应的错误消息  msg += QObject::tr("\nPlease contact the application's support team for more information.\n\n");  }  // 显示错误消息的对话框,标题为应用名称,内容为错误消息,然后退出程序并返回错误码100  QMessageBox::critical(nullptr, QObject::tr("Initialization of %1 failed").arg(appName), msg);  exit(100);  }
// 捕获任何异常,用于处理未知的运行时错误  
catch (...) {  // 弹出自定义的对话框,而不是Windows的系统对话框  // Popup an own dialog box instead of that one of Windows  QApplication app(argc,argv);  QString appName = QString::fromLatin1(App::Application::Config()["ExeName"].c_str());  QString msg = QObject::tr("Unknown runtime error occurred while initializing %1.\n\n"  "Please contact the application's support team for more information.\n\n").arg(appName);  // 显示错误消息的对话框,标题为应用名称,内容为错误消息,然后退出程序并返回错误码101  QMessageBox::critical(nullptr, QObject::tr("Initialization of %1 failed").arg(appName), msg);  exit(101);  
}  // 运行阶段 ===========================================================  
// 重定向标准输出流、标准日志流和标准错误流  Base::RedirectStdOutput stdcout;  Base::RedirectStdLog    stdclog;  Base::RedirectStdError  stdcerr;  
// 保存旧的cout、clog和cerr缓冲区指针,用于后续恢复  std::streambuf* oldcout = std::cout.rdbuf(&stdcout);  std::streambuf* oldclog = std::clog.rdbuf(&stdclog);  std::streambuf* oldcerr = std::cerr.rdbuf(&stdcerr);  try {  // 如果设置了控制台选项,则在命令行模式下运行应用程序  // if console option is set then run in cmd mode  if (App::Application::Config()["Console"] == "1")  App::Application::runApplication();  // 如果运行模式为Gui或Internal,则在GUI模式下运行应用程序  if (App::Application::Config()["RunMode"] == "Gui" ||  App::Application::Config()["RunMode"] == "Internal")  Gui::Application::runApplication();  // 否则,在默认模式下运行应用程序  else  App::Application::runApplication();  
}  
// 捕获Base::SystemExitException异常,根据其退出码退出程序  
catch (const Base::SystemExitException& e) {  exit(e.getExitCode());  
}  
// 捕获Base::Exception异常,报告异常并退出程序,返回状态码1  
catch (const Base::Exception& e) {  e.ReportException();  exit(1);  
}  
// 捕获std::exception异常,输出错误信息并退出程序,返回状态码1  
catch (const std::exception& e) {  Base::Console().Error("Application unexpectedly terminated: %s\n", e.what());  exit(1);  
}  
// 捕获其他所有异常,输出错误信息并退出程序,返回状态码1  
catch (...) {  Base::Console().Error("Application unexpectedly terminated\n");  exit(1);  
}  // 恢复旧的cout、clog和cerr缓冲区指针,以便后续正常输出流控制恢复正常状态  std::cout.rdbuf(oldcout);  std::clog.rdbuf(oldclog);  std::cerr.rdbuf(oldcerr);
// 销毁阶段 ===========================================================  
// 记录应用程序终止信息  Base::Console().Log("%s terminating...\n",App::Application::Config()    ["ExeName"].c_str());  // 清理资源  
// cleans up  App::Application::destruct();  // 记录应用程序完全终止信息  Base::Console().Log("%s completely terminated\n",App::Application::Config()    ["ExeName"].c_str());  // 返回0,表示程序正常结束  return 0;
}
3 编译运行截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/199219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用pyscenedetect进行视频场景切割

1. 简介 在视频剪辑有转场一词&#xff1a;一个视频场景转换到另一个视频场景&#xff0c;场景与场景之间的过渡或转换&#xff0c;就叫做转场。 本篇介绍一个强大的开源工具PySceneDetect&#xff0c;它是一款基于opencv的视频场景切换检测和分析工具&#xff0c;项目地址: h…

龙迅#LT8311X3 USB中继器应用描述!

1. 概述 LT8311X3是一款USB 2.0高速信号中继器&#xff0c;用于补偿ISI引起的高速信号衰减。通过外部下拉电阻器选择的编程补偿增益有助于提高 USB 2.0 高速信号质量并通过 CTS 测试。 2. 特点 • 兼容 USB 2.0、OTG 2.0 和 BC 1.2• 支持 HS、FS、LS 信令 • 自动检测和补偿 U…

界面控件DevExpress WPF导航组件,助力升级应用程序用户体验!(上)

DevExpress WPF的Side Navigation&#xff08;侧边导航&#xff09;、TreeView、导航面板组件能帮助开发者在WPF项目中添加Windows样式的资源管理器栏或Outlook NavBar&#xff08;导航栏&#xff09;&#xff0c;DevExpress WPF NavBar和Accordion控件包含了许多开发人员友好的…

Python OS模块常用方法整理

os模块包含了普遍的操作系统和文件目录方法 引入类库 首先需要引入类库 import os 常用方法 OS模块方法 获取操作系统类型 nt->window:Microsoft Windows NT posix->Linux/Mac OS: Portable Operating System Interface of UNIX&#xff08;可移植操作系统接口&…

深入理解Java核心技术:Java工程师的实用干货笔记

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在Java工程师的职业生涯中&#xff0c;深入理解…

K8S部署nginx并且使用NFS存储数据

安装NFS 在master安装NFS systemctl start nfs-server修改配置 /etc/exports /data *(rw,no_root_squash,no_all_squash,sync)目录为 /data 允许所有地址访问 验证下 [rootmaster nginx]# showmount -e 192.168.57.61 Export list for 192.168.57.61: /data *共享可以正常…

基于 springboot + vue 健身房管理系统 毕业设计-附源码

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

使用 husky 和 lint-staged 配置代码检查工作流

提交代码前做代码检查 如果我们不做代码检查&#xff0c;有时候有代码错误&#xff0c;我们不能及时发现&#xff0c;只有打开代码块才知道&#xff0c;这样在提交仓库时也会忽略&#xff0c;很危险。 1、初始化 git仓库&#xff0c;执行 git init 即可 2、初始化 husky 工具配…

12月5日作业

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

面向注解编程—Spring 注解看这一篇就够了(2)

面向注解编程—Spring注解大全&#xff08;AOP篇&#xff09; AOP英文全称&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白 了&#xff0c;面向切面编程就是面向特定方法编程。 AOP的作用&#xff1a;在程序…

排序的概念及其运用

1.排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序…

⭐ Unity里 用Shader 去做实时动态绿幕抠图

1.先看一下效果 a.这是背景图片 b.抠完图之后(这里用的是扣去白色的) 2.shader代码如下 Shader "UniversalChromaKey" {Properties{_MainTex("Base (RGB)", 2D) "white" {}_Sens("Sensibilidad", Range(0,.9)) .3_Cutoff("R…

java:slf4j、log4j、log4j2、logback日志框架的区别与示例

文章目录 背景SLF4J - 简单日志门面:Log4j - 强大而古老的日志框架:Log4j2 - Log4j的升级版:Logback - Log4j的继任者:比较Springboot集成slf4j、log4j2参考 背景 在Java开发中&#xff0c;日志记录是一个不可或缺的组成部分。为了满足不同的需求&#xff0c;Java社区涌现出多…

selenium python 实现基本自动化测试的示例代码

安装selenium 打开命令控制符输入&#xff1a;pip install -U selenium 火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0c;调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件&#xff0c;实现简单的浏览器操 作的录制与回…

nodejs+vue+elementui校园演出赞助艺术资源管理系统

系统主要分为系统管理员和学生、校外人员三个部分&#xff0c;系统管理员主要功能包括&#xff1a;首页、个人中心、学生管理、校外人员管理、社团信息管理、校内演出管理、校外商演管理、系统管理&#xff1b;基本上实现了整个基于vue的校园艺术资源管理系统的设计与实现信息管…

$sformat在仿真中打印文本名的使用

在仿真中&#xff0c;定义队列&#xff0c;使用任务进行函数传递&#xff0c;并传递文件名&#xff0c;传递队列&#xff0c;进行打印 $sformat(filename, “./data_log/%0d_%0d_%0d_0.txt”, f_num, lane_num,dt); 使用此函数可以自定义字符串&#xff0c;在仿真的时候进行文件…

EA电源维修EA-PS 9750-60直流电源维修Elektro-Autοmαtik

德国EA Elektro-Autοmαtik全系列电源维修EA-PS 80003U系列 这些μ-处理器控制和可编程重型的实验室电源提供了一个灵活的“自动量程”无论是高电压或高电流在额定功率输出&#xff0c;允许使用。配件包括数字编码器可用于设置电压&#xff0c;电流和功率&#xff0c;完整的4…

nodejs+vue+ElementUi小区社区公寓宿舍智能访客预约系统

该系统将采用B/S结构模式&#xff0c;前端部分主要使用html、css、JavaScript等技术&#xff0c;使用Vue和ElementUI框架搭建前端页面&#xff0c;后端部分将使用Nodejs来搭建服务器&#xff0c;并使用MySQL建立后台数据系统&#xff0c;通过axios完成前后端的交互&#xff0c;…

绘制纹理C++

用数学和C绘制一些纹理 sin(x * x y * y) int main() {int width 400; // 宽度int height 400; // 高度Mat texture Mat::zeros(height, width, CV_8UC1);for (int y 0; y < height; y) {for (int x 0; x < width; x) {int value static_cast<int>(255 * …

基于go文件同步工具的升级迭代

介绍 同样&#xff0c;该工具适用于多个项目不同版本的维护&#xff0c;文件更新和新增的同步(自动创建目录)&#xff0c;支持自动提交svn。 升级迭代 之前的文件同步工具&#xff0c;依赖chrome和http包&#xff0c;有时候js加载页面不太稳定&#xff0c;所以有空闲就升级迭…