000FreeCAD源码学习--MainGui.cpp

news2025/2/25 13:26:47

目录

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=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)
    // 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 Application
    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";

    // 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 blue
    App::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());
#else
        App::Application::init(argc, argv);
#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
        std::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 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) {
        // 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;
        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 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);
        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 mode
        if (App::Application::Config()["Console"] == "1")
            App::Application::runApplication();
        if (App::Application::Config()["RunMode"] == "Gui" ||
            App::Application::Config()["RunMode"] == "Internal")
            Gui::Application::runApplication();
        else
            App::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 up
    App::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.coloradmin.cn/o/1278860.html

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

相关文章

【C++干货铺】继承 | 多继承 | 虚继承

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 继承的概念及定义 继承的概念 继承的定义 继承基类成员访问方式的变化 基类和派生类的赋值转化 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造…

判断是否有环形链表

问题描述&#xff1a; 给定一个链表&#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;我们使用整数pos来表示链表尾连接到链表中的位置&#xff08;索引从0…

抖音视频如何无水印保存?抖音视频无水印保存教程

抖音视频如何无水印保存&#xff1f;当下短视频盛行时代&#xff0c;抖音作为当下主流短视频平台之一&#xff0c;每天都有数以亿计的用户在抖音上分享自己的创作&#xff0c;然后当我们遇到感兴趣的视频&#xff0c;下载保存后会发现带有水印&#xff0c;那么抖音视频如何无水…

scrapy介绍,并创建第一个项目

一、scrapy简介 scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使用了Twisted异步网络框架&#xff0c;可以加快我们的下载速度。 Scrapy文档地址&#xff1a;http://scrapy-chs.readthedocs.io/z…

LangChain 17 LangSmith调试、测试、评估和监视基于任何LLM框架构建的链和智能代理

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

kubernetes中YAML介绍;API资源对象Pod;Pod原理和生命周期;Pod资源限制

YAML介绍&#xff1b;API资源对象Pod&#xff1b;Pod原理和生命周期&#xff1b;Pod资源限制 1&#xff09;认识YAML 官网&#xff08;https://yaml.org/&#xff09; YAML 语言创建于 2001 年&#xff0c;比 XML 晚了三年。YAML虽然在名字上模仿了XML&#xff0c;但实质上与…

剑指 Offer(第2版)面试题 14:剪绳子

剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子 剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子解法1&#xff1a;动态规划解法2&#xff1a;数学 剑指 Offer&#xff08;第2版&#xff09;面试题 14&#xff1a;剪绳子 题目来源…

隐形内嵌!触想智能发布全新B款内嵌式工控一体机及内嵌式工业显示器

近日&#xff0c;触想智能发布全新B款内嵌式工控系列TPC-19.该系列可支持显示器和一体机等多种品类、多级配置的灵活选购。标志性的2.5mm矮阶窄边面板设计&#xff0c;适配隐形内嵌式安装&#xff0c;专为机柜类设备应用打造&#xff0c;以高契合的物理结构&#xff0c;带动稳定…

Mybatis 操作续集2(结合上文)

Mybatis 是一个持久层框架,用于简化数据库的操作,和Spring 没有任何关系,我们现在能使用它是因为 Spring Boot 把Mybatis 的依赖给引入进来了,在 pom.xml 里面 Mybatis 如何进行重命名? 看最后两行代码,这样就能重命名了 package com.example.mybatisdemo.mapper;import com…

Leetcode144. 二叉树的前序遍历-C语言

文章目录 题目介绍题目分析解题思路1.创建一个数组来储存二叉树节点的值2.根据二叉树的大小来开辟数组的大小3.边前序遍历边向创建的数组中存入二叉树节点的值 完整代码 题目介绍 题目分析 题目要求我们输出二叉树按前序遍历排列的每个节点的值。 解题思路 1.创建一个数组来…

详解SpringAop开发过程中的坑

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

在 ArcGIS 软件中添加左斜宋体(东体)的方法与步骤

河流水系在作图时一般设置为左斜宋体&#xff08;东体&#xff09;、蓝色&#xff0c;比如黄河、青海湖等&#xff0c;如下图所示&#xff1a; 标准地图水系注记 下面讲解如何在 ArcGIS 软件中添加左斜宋体&#xff08;东体&#xff09;&#xff0c;首先需要下载左斜宋体&#…

使用 OpenFunction 在任何基础设施上运行 Serverless 工作负载

作者&#xff1a; 霍秉杰&#xff1a;KubeSphere 可观测性、边缘计算和 Serverless 团队负责人&#xff0c;Fluent Operator 和 OpenFunction 项目的创始人&#xff0c;还是多个可观测性开源项目包括 Kube-Events、Notification Manager 等的作者&#xff0c;热爱云原生技术&am…

STM32F407-14.3.8-01强制输出模式

强制输出模式 在输出模式&#xff08;TIMx_CCMRx 寄存器中的 CCxS② 位 00&#xff09;下&#xff0c;可直接由软件将每个输出比较信号&#xff08;OCxREF④ 和 OCx⑥/OCxN⑦&#xff09;强制设置为有效电平或无效电平&#xff0c;而无需考虑输出比较寄存器和计数器之间的任何…

springboot 整合 Spring Security 上篇

1.创建springBoot 项目工程(spring6.0的底层、JDK17) 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置完成启动访问controller会出现登录…

JS 实现一键复制文本内容

1、演示&#xff1a; 2、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一键复制</title&g…

如何用Java实现扑克牌(附源码)

目录 一.扑克牌的数据结构 二.买牌(扑克牌的初始化) 三.洗牌 四.发牌 五.完整代码 Card.java CardList.java 六.测试 输出结果 一.扑克牌的数据结构 首先&#xff0c;扑克牌是一幅一幅的&#xff0c;除去大小王以外一共有52张&#xff0c;我们可以考虑用数组来存储…

常用装备生产ERP有哪几种?有哪些作用

装备生产业务涉及原材料采购、车间排产、班组生产评估、派工单、接单报价、委外发料、库存盘点、设备台账、图纸设计等诸多环节&#xff0c;而各环节数据的共享问题普遍存在于装备生产企业内部&#xff0c;同时也直接影响企业的生产效率和整体效益等。 企业外部环境的变化和行…

linux安装KingbaseES(人大金仓数据库)

KingbaseES V8 数据库简介 金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司[简称人大金仓]的核心产品&#xff0c;具有大型通用、"三高"&#xff08;高可靠、高性能、高安全&#xff09;、"三易"&#xff08;易管理、易使用、易扩…

记录华为云服务器(Linux 可视化 宝塔面板)-- 防火墙篇

文章目录 前言安装防火墙防火墙设置防火墙操作1.设置开机启动防火墙2.查看防火墙开放哪些端口3.重载防火墙配置&#xff08;修改配置后重新启动才生效&#xff09;4.查看防火墙状态5.开启防火墙6.关闭防火墙 若遇到无法开启查询已开放的端口查询端口是否开放&#xff08;80&…