Open CASCADE学习|ApplicationFramework 框架使用指南
在现代 CAD(计算机辅助设计)应用开发中,构建一个高效、可扩展且用户友好的应用程序框架是至关重要的。Open CASCADE(简称 OCC)提供了一个功能强大的 ApplicationFramework(应用程序框架),它为开发者提供了一套完整的工具集,用于构建基于文档 - 视图架构的 CAD 应用程序。本文将深入探讨 Open CASCADE 的 ApplicationFramework 框架,并通过一个完整的代码示例来展示其使用方法。
一、引言
随着 CAD 技术的发展,应用程序的复杂性不断增加。开发者需要处理大量的图形数据、用户交互以及复杂的几何运算。Open CASCADE 的 ApplicationFramework 框架为这些问题提供了标准化的解决方案。它基于文档 - 视图模式,允许开发者将数据管理与用户界面分离,从而提高了代码的可维护性和可扩展性。
二、ApplicationFramework 框架概述
ApplicationFramework 是 Open CASCADE 中一个高级的应用程序开发框架,它集成了文档管理、视图渲染、命令处理和资源管理等多个方面。以下是其核心组件的简要介绍:
-
文档管理(Document Management)
- 文档是数据的容器,用于存储 CAD 模型及相关属性。TDocStd_Document 类提供了文档的基本功能,可以扩展来自定义文档类型。
-
视图渲染(View Rendering)
- 视图负责显示文档中的数据。V3d_Viewer 和 V3d_View 类提供了 3D 视图的创建和管理功能,AIS_InteractiveContext 类用于处理交互式图形显示。
-
命令处理(Command Processing)
- 命令系统允许用户通过界面或脚本执行操作。TFunction_Framework 提供了命令的定义和执行机制,支持撤销 / 重做功能。
-
资源管理(Resource Management)
- 资源管理涉及用户界面元素(如菜单、工具栏)的定义和本地化。ApplicationFramework 提供了资源文件的加载和管理功能。
三、基于 ApplicationFramework 的 CAD 应用程序开发
接下来,我们将通过一个示例来展示如何使用 Open CASCADE 的 ApplicationFramework 构建一个简单的 CAD 应用程序。该示例将实现基本的图形创建、显示和交互功能。
3.1 示例代码分析
以下是完整的示例代码,展示了如何实现一个具有简单图形创建和交互功能的 CAD 应用程序:
#include <windows.h>
#include <vector>
#include <commctrl.h>
#include <TDocStd_Application.hxx>
#include <TDocStd_Document.hxx>
#include <TDataStd_Name.hxx>
#include <TNaming_Builder.hxx>
#include <TNaming_NamedShape.hxx>
#include <TPrsStd_AISViewer.hxx>
#include <XCAFDoc_DocumentTool.hxx>
#include <AIS_InteractiveContext.hxx>
#include <V3d_Viewer.hxx>
#include <V3d_View.hxx>
#include <OpenGl_GraphicDriver.hxx>
#include <WNT_Window.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepPrimAPI_MakeSphere.hxx>
#include <BRepPrimAPI_MakeCone.hxx>
#include <AIS_Shape.hxx>
#include <Standard_DefineHandle.hxx>
#include <Standard_Transient.hxx>
#include <Standard_Type.hxx>
#include <TDF_Label.hxx>
#include <TDF_ChildIterator.hxx>
#include <Quantity_Color.hxx>
#include <Aspect_TypeOfTriedronPosition.hxx>
#include <TopTools_HSequenceOfShape.hxx>
#include <TopoDS_Shape.hxx>#pragma comment(lib, "comctl32.lib")enum class AppCommand {CMD_NONE,CMD_CREATE_BOX = 1001, // 使用更大的ID值避免冲突CMD_CREATE_SPHERE,CMD_CREATE_CONE,CMD_DELETE_OBJ,CMD_ZOOM_ALL
};class CADDocument : public TDocStd_Document {
public:CADDocument(const TCollection_ExtendedString& format): TDocStd_Document(format) {}void AddShape(const TopoDS_Shape& shape, const TCollection_AsciiString& name) {TDF_Label rootLabel = Main();TDF_Label shapeLabel = rootLabel.FindChild(1, Standard_True);TNaming_Builder builder(shapeLabel);builder.Generated(shape);TDataStd_Name::Set(shapeLabel, name);}
};class CADApplicationFramework {
public:CADApplicationFramework(HINSTANCE hInst): hInstance(hInst) {InitApplication();}void InitApplication() {app = new TDocStd_Application();TCollection_AsciiString format("CADDocument");app->NewDocument(format, myDocument);myGraphicDriver = new OpenGl_GraphicDriver(nullptr);myViewer = new V3d_Viewer(myGraphicDriver);myContext = new AIS_InteractiveContext(myViewer);InitMainWindow();InitToolbar();}void InitMainWindow() {WNDCLASSW wc = { 0 };wc.lpfnWndProc = MainWndProc;wc.hInstance = hInstance;wc.lpszClassName = L"CADAppWindow";wc.hCursor = LoadCursor(NULL, IDC_ARROW);RegisterClassW(&wc);hMainWnd = CreateWindowW(L"CADAppWindow", L"CAD Application",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,800, 600, NULL, NULL, hInstance, this);Create3DView();ShowWindow(hMainWnd, SW_SHOW);}void Create3DView() {myView = myViewer->CreateView();Handle(WNT_Window) wntWindow = new WNT_Window(hMainWnd);myView->SetWindow(wntWindow);myView->SetBackgroundColor(Quantity_NOC_GRAY40);myView->MustBeResized();myView->TriedronDisplay(Aspect_TOTP_LEFT_LOWER, Quantity_NOC_WHITE, 0.1);}void InitToolbar() {hToolbar = CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL,WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_TOP | CCS_NODIVIDER,0, 0, 0, 0, hMainWnd, (HMENU)1, hInstance, NULL);SendMessageW(hToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);SendMessageW(hToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(60, 24));TBBUTTON tbButtons[] = {{0, (int)AppCommand::CMD_CREATE_BOX, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)L"Box"},{1, (int)AppCommand::CMD_CREATE_SPHERE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)L"Sphere"},{2, (int)AppCommand::CMD_CREATE_CONE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)L"Cone"},{0, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},{3, (int)AppCommand::CMD_DELETE_OBJ, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)L"Delete"},{0, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},{4, (int)AppCommand::CMD_ZOOM_ALL, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)L"Zoom"}};SendMessageW(hToolbar, TB_ADDBUTTONS, sizeof(tbButtons) / sizeof(TBBUTTON), (LPARAM)&tbButtons);SendMessageW(hToolbar, TB_AUTOSIZE, 0, 0);}void CreateBox() {BRepPrimAPI_MakeBox boxMaker(30, 30, 30);Handle(AIS_Shape) aisShape = new AIS_Shape(boxMaker.Shape());myContext->Display(aisShape, Standard_True);myView->FitAll();}void CreateSphere() {BRepPrimAPI_MakeSphere sphereMaker(20);Handle(AIS_Shape) aisShape = new AIS_Shape(sphereMaker.Shape());myContext->Display(aisShape, Standard_True);myView->FitAll();}void CreateCone() {BRepPrimAPI_MakeCone coneMaker(15, 5, 25);Handle(AIS_Shape) aisShape = new AIS_Shape(coneMaker.Shape());myContext->Display(aisShape, Standard_True);myView->FitAll();}void DeleteSelected() {myContext->InitSelected();if (myContext->MoreSelected()) {Handle(AIS_Shape) shape = Handle(AIS_Shape)::DownCast(myContext->SelectedInteractive());myContext->Remove(shape, Standard_True);myView->Redraw();}}static LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {CADApplicationFramework* pThis = nullptr;if (msg == WM_CREATE) {pThis = static_cast<CADApplicationFramework*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pThis));}else {pThis = reinterpret_cast<CADApplicationFramework*>(GetWindowLongPtr(hWnd, GWLP_USERDATA));}if (pThis) {switch (msg) {case WM_COMMAND: {if (HIWORD(wParam) == BN_CLICKED) {switch (LOWORD(wParam)) {case (int)AppCommand::CMD_CREATE_BOX:pThis->CreateBox();break;case (int)AppCommand::CMD_CREATE_SPHERE:pThis->CreateSphere();break;case (int)AppCommand::CMD_CREATE_CONE:pThis->CreateCone();break;case (int)AppCommand::CMD_DELETE_OBJ:pThis->DeleteSelected();break;case (int)AppCommand::CMD_ZOOM_ALL:pThis->myView->FitAll();break;}}break;}case WM_SIZE: {SendMessageW(pThis->hToolbar, TB_AUTOSIZE, 0, 0);RECT rcClient;GetClientRect(hWnd, &rcClient);RECT rcToolbar;GetWindowRect(pThis->hToolbar, &rcToolbar);int toolbarHeight = rcToolbar.bottom - rcToolbar.top;rcClient.top += toolbarHeight;pThis->myView->MustBeResized();Handle(WNT_Window) wntWindow = Handle(WNT_Window)::DownCast(pThis->myView->Window());if (!wntWindow.IsNull()) {wntWindow->SetPos(rcClient.left, rcClient.top,rcClient.right - rcClient.left,rcClient.bottom - rcClient.top);}break;}case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, msg, wParam, lParam);}return 0;}return DefWindowProc(hWnd, msg, wParam, lParam);}private:HINSTANCE hInstance;HWND hMainWnd;HWND hToolbar;Handle(TDocStd_Application) app;Handle(TDocStd_Document) myDocument;Handle(OpenGl_GraphicDriver) myGraphicDriver;Handle(V3d_Viewer) myViewer;Handle(AIS_InteractiveContext) myContext;Handle(V3d_View) myView;
};int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR lpCmdLine,_In_ int nCmdShow) {INITCOMMONCONTROLSEX icex;icex.dwSize = sizeof(INITCOMMONCONTROLSEX);icex.dwICC = ICC_BAR_CLASSES;InitCommonControlsEx(&icex);CADApplicationFramework app(hInstance);MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return (int)msg.wParam;
}
3.2 代码解析
-
文档类(CADDocument)
- 继承自 TDocStd_Document,用于存储 CAD 模型数据。
AddShape
方法将形状添加到文档的数据框架中,并为其设置名称。
-
应用程序框架类(CADApplicationFramework)
- 构造函数中初始化应用程序,包括创建文档、图形驱动、视图和交互上下文。
InitMainWindow
和InitToolbar
方法分别初始化主窗口和工具栏,设置窗口过程函数以处理用户交互。Create3DView
方法创建 3D 视图并设置其显示参数。CreateBox
、CreateSphere
和CreateCone
方法用于创建基本几何体并将其显示在视图中。DeleteSelected
方法用于删除选中的图形对象。
-
窗口过程函数(MainWndProc)
- 处理窗口消息,如命令点击、窗口大小调整和销毁消息。
- 根据不同的命令 ID 调用相应的图形创建或操作方法。
-
主函数(wWinMain)
- 初始化公共控件,创建 CADApplicationFramework 实例,并进入消息循环。
四、应用程序架构建议
-
分层架构
- 数据层:负责数据的存储和管理,主要基于 TDF(Toolkit for Data Framework)。
- 业务逻辑层:包含应用程序的核心功能,如几何计算、数据处理等。
- 用户界面层:处理用户交互,展示图形和数据。
-
模块化设计
- 将不同的功能模块化,如图形创建、编辑、显示等,便于维护和扩展。
-
资源管理
- 使用资源文件管理用户界面元素,支持多语言和本地化。
-
命令模式
- 将用户操作封装为命令对象,支持撤销 / 重做功能。
五、常见问题及解决方案
-
图形显示问题
- 问题:图形显示不正确或不更新。
- 解决方案:确保在窗口大小调整后调用
MustBeResized
和Redraw
方法;检查视图的背景色和显示模式设置。
-
文档保存和加载
- 问题:保存的文档无法正确加载。
- 解决方案:确保所有数据都正确提交到文档的数据框架;检查文件路径和权限。
-
命令执行失败
- 问题:执行命令时出现异常或未按预期工作。
- 解决方案:检查命令是否正确注册;确保所有依赖的对象(如文档、视图)已正确初始化。
六、进阶功能
-
多文档界面(MDI)
- 支持同时打开和编辑多个文档,实现文档间的切换和比较。
-
高级图形交互
- 实现复杂的交互操作,如拖拽、旋转、缩放等,提升用户体验。
-
插件系统
- 开发插件系统,允许第三方扩展应用程序的功能。
-
网络协作
- 实现多用户协同编辑功能,支持实时数据同步。
七、总结
Open CASCADE 的 ApplicationFramework 提供了一个强大的基础,用于构建功能丰富的 CAD 应用程序。通过合理利用其文档 - 视图架构、命令处理机制和资源管理功能,开发者可以高效地构建出满足不同需求的 CAD 软件。本文提供的示例代码展示了 ApplicationFramework 的基本使用方法,开发者可以在此基础上进一步扩展和优化,以实现更复杂的应用场景。
在实际开发中,建议深入研究 Open CASCADE 的官方文档和示例代码,结合具体需求进行定制化开发。同时,关注性能优化和用户体验,确保应用程序在各种硬件配置和使用场景下都能稳定运行。
相关文章:
Open CASCADE学习|ApplicationFramework 框架使用指南
在现代 CAD(计算机辅助设计)应用开发中,构建一个高效、可扩展且用户友好的应用程序框架是至关重要的。Open CASCADE(简称 OCC)提供了一个功能强大的 ApplicationFramework(应用程序框架)&#x…...
hadoop中的序列化和反序列化(3)
3. Java的序列化 Java提供了内置的序列化机制,通过java.io.Serializable接口实现。 3.1 如何实现Java序列化 让类实现Serializable接口。 使用ObjectOutputStream进行序列化。 使用ObjectInputStream进行反序列化。 示例代码 序列化 java 复制 import jav…...
PostgreSQL给新用户授权select角色
✅ 切换到你的数据库并以超级用户登录(例如 postgres): admin#localhost: ~$ psql -U postgres -d lily✅ 创建登录的账号机密吗 lily> CREATE USER readonly_user WITH PASSWORD xxxxxxxxxxx; ✅ 确认你授予了这个表的读取权限…...
MySQL 8.0 OCP(1Z0-908)英文题库(1-10)
目录 第1题题目解析正确答案 第2题题目解析正确答案 第3题题目解析正确答案 第4题题目解析正确答案 第5题题目解析正确答案 第6题题目解析正确答案 第7题题目解析正确答案 第8题题目解析正确答案 第9题题目解析正确答案 第10题题目解析正确答案: 第1题 Your MySQL …...
南京市出台工作方案深化“智改数转网联”,物联网集成商从“困局”到“蓝海”!
为落实《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划(2025-2027年)》,南京市近日出台“工作方案”,部署五大行动17项重点任务,进一步深化全市制造业智能化改造、数字化转型、网络化联接(以…...
系统思考:教育焦虑恶性循环分析
今天和团队的小伙伴一起拆解了一个父母教育焦虑与报班行为之间的系统环路图,报班越多 ➡ 孩子自由时间越少 ➡ 情绪调节力下降 ➡ 学习效率更低 ➡ 成绩不理想 ➡ 家长更焦虑 ➡ 继续加码报班…… 一圈一圈,像是陷入了“焦虑的恶性循环”。 这也是我一直…...
(已完结)完美解决C盘拓展卷是灰色的无法扩容的问题以及如何正确地在WINDOS上从一个盘扩容到C盘
众所周知,window系统在“计算机”管理中自带了一个磁盘管理系统 但是在使用过程中会出现各种各样无法扩容的毛病。 第一:首先排查,大多数人在扩容之前忽视了一点就是,我们现代的很多新机器都是默认开启BitLocker加密的ÿ…...
优选算法系列(8.多源BFS)
简介: 01 矩阵(medium): 题目链接:542. 01 矩阵 - 力扣(LeetCode) 算法: 对于求的最终结果,我们有两种方式: 第⼀种方式:从每⼀个 1 开始&#…...
迈向AI辅助数据分析代码生成的透明性与知识共享
李升伟 摘译 生成式人工智能(AI)及尤其大型语言模型(LLMs)正在改变我们进行数据科学研究的方式. 最显著的例子包括科学家使用该技术与科学数据交互, 回答数据分析问题, 生成数据分析代码以及(重新)撰写科研手稿. 然而遗憾的是&am…...
autojs和冰狐智能辅助该怎么选择?
最近打算做自动化脚本,在autojs和冰狐智能辅助中做选择,不知道该怎么选。没办法只能花费大量时间仔细研究了autojs和冰狐智能辅助,综合考虑功能需求、开发复杂度、编程经验及项目规模等因素。以下是两者的核心对比及选择建议,仅供…...
小数的二进制表示
相信很多人都知道整数的二进制表示方法,但是小数的二进制就不一定了。 想来简单说一下整数的,就是不断的除以2取余数, 大致这样 从下往上取,这里42的结果就是101010 而且每个整数都有他对应的二进制数,但是小数转二…...
信息系统项目管理师-软考高级(软考高项)2025最新(十)
个人笔记整理---仅供参考 第十章项目进度管理 10.1管理基础 10.2项目进度管理过程 10.3规划进度管理 10.4定义活动 选C 10.5排列活动顺序 10.6估算活动持续时间 10.7制订进度计划 制订进度计划4个步骤(背,案例可能会考!) 10.8控制…...
Linux内核初始化机制全解析:从pure_initcall到late_initcall
引言 Linux内核的启动过程是一个高度有序的初始化流程,涉及数百个模块和子系统的协同工作。为了确保依赖关系正确、硬件资源按需分配,内核通过一系列初始化宏(如pure_initcall、subsys_initcall、late_initcall等)将函数划分为不同的优先级,按严格顺序执行。本文将深入探…...
pcie协议复位
pcie协议复位共有4中情况;cold reset;warm reset;hot reset;function level reset; 分类: 依据spec 6.6: Conventional reset(传统复位):cold,…...
boost笔记: Cannot open include file: ‘boost/mpl/aux_/preprocessed/plain/.hpp‘
1. 问题描述 因为一下库定义了宏and,导致boost的文件包含and.hpp展开成&.hpp,所以出现以下错误 Cannot open include file: ‘boost/mpl/aux_/preprocessed/plain/&.hpp’ 2. 解决方案 在定义宏之前包含boost文件,但这种方案的缺点…...
Xilinx XCKU11P-2FFVA1156I 赛灵思 FPGA AMD Kintex UltraScale+
XCKU11P-2FFVA1156I 属于 AMD Kintex UltraScale™ FPGA 家族,采用 TSMC 20 nm FinFET 工艺,兼顾高性能与功耗效率,提供约 653 100 个逻辑单元、2 928 个 DSP 切片、21.1 Mb Block RAM 和 22.5 Mb UltraRAM,可广泛应用于网络加速、…...
hadoop中的序列化和反序列化(4)
4. Hadoop的序列化 Hadoop提供了自己的序列化机制,用于高效地处理分布式计算中的数据传输。Hadoop的序列化机制比Java的序列化更高效,更适合大规模数据处理。 4.1 Hadoop序列化的特点 高效:Hadoop的序列化格式紧凑,适合大规模数…...
实现引用计数线程安全的shared_ptr
c11引入了三个智能指针,用来自动管理内存,使用智能指针可以有效地减少内存泄漏。 其中,shared_ptr是共享智能指针,可以被多次拷贝,拷贝时其内部的引用计数1,被销毁时引用计数-1,如果引用计数为…...
今日行情明日机会——20250507
指数今天放量上涨,政策层面也释放出重大利好消息~ 上证缺口已补,大盘股表现总体较好 深证60分钟缺口依然未补,等待后续走势~ 2025年5月7日涨停股主要行业方向分析 一、核心主线方向 军工(政策催化地缘驱动) • 涨停…...
配置Hadoop集群-测试使用
(一)上传小文件 上传文件的时候,我们传一个大一点的(>128M),再传一个小一点的。对于大一点的文件,我们要去看看它是否会按128M为单位去拆分这个大文件,而拆分成大文件之后&#…...
MEGA3:分子进化遗传学分析和序列比对集成软件
李升伟 摘译 摘要 在分子进化和群体遗传学的理论基础稳固确立后,比较DNA和蛋白质序列分析在重建物种和多基因家族的进化历史、估计分子进化速率以及推断塑造基因和基因组进化的性质和程度方面发挥了核心作用。随着高通量测序技术和新颖的统计及计算方法的发展&…...
21. LangChain金融领域:合同审查与风险预警自动化
引言:当AI成为24小时不眠的法律顾问 2025年某商业银行的智能合同系统,将百万级合同审查时间从平均3周缩短至9分钟,风险条款识别准确率达98.7%。本文将基于LangChain的金融法律框架,详解如何构建合规、精准、可追溯的智能风控体系…...
7D-AI系列:模型微调之mlx-lm
大模型的出现,导致信息量太大,只有静心动手操作,才能得到真理。 文章目录 环境要求安装示例mlx-lm微调工具参数准备数据集下载模型微调模型合并模型验证结果验证微调前的模型验证微调后的模型 环境要求 macbook pro m系列芯片mlx环境已安装 …...
数据可视化:php+echarts实现数据可视化(包含echart安装引入)
一、实现效果 实现动态时间,多列柱状图,单列柱状图,普通表格,表格动画等效果 二、实现 1、动态时间显示 通过php获取当前时间 设置计时器来动态显示时间秒数 <!-- 时间动画 --> <script>// 动态更新时间中的秒数function updateTime() {const now = new D…...
《Python星球日记》 第47天:聚类与KMeans
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏:《Python星球日记》,限时特价订阅中ing 目录 一、聚类与…...
linux(centos)联网情况下部署
nginx部署 1.linux(centos)联网情况下部署 1.下载nginx所需依赖 # 安装开发工具组(若未安装) sudo yum groupinstall "Development Tools"# 安装 OpenSSL 开发包 sudo yum install openssl-devel# 安装 PCRE 开发包 sudo yum install pcre-…...
Kubernetes生产级资源管理实战:从QoS策略到OOM防御体系
一、资源限制的本质:不是成本控制,而是稳定性保障 当集群中某个节点的内存耗尽时,Kubernetes会像冷酷的交通警察一样,根据Pod的"优先级证件"(QoS类别)决定哪些Pod需要被驱逐。这种机制直接关系到…...
gcc的使用
gcc 是 GNU Compiler Collection(GNU 编译器套件)的缩写,是 GNU 项目开发的编程语言编译器集合,支持多种编程语言(如 C、C、Objective-C、Fortran、Ada 等)。以下是关于 gcc 的核心信息: 1. 主要…...
聊一聊Qwen3思考模式实现以及背后原理探讨
Qwen3思考模式切换实现 硬开关 我们先通过官方的示例代码来体验一下,如何实现在思考模式和非思考模式之间切换 通过tokenizer.apply_chat_template的enable_thinking参数来实现 默认情况下,Qwen3 启用了思考功能,类似于 QwQ-32B。这意味着…...
spark行动算子
在 Apache Spark 中,行动算子(Action)用于触发对 RDD 的实际计算,并将结果返回给驱动程序(Driver)或保存到外部存储系统中。与转换算子(Transformation)不同,行动算子会立…...
电商双十一美妆数据分析(代码)
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import jieba # 数据读取 df pd.read_csv(双十一_淘宝美妆数据.csv) # 数据清洗 # 处理重复值 data df.drop_duplicates(inplaceFalse) data data.reset_index(in…...
STM32裸机开发问题汇总
一、代码编写 1. keil中某个文件无法修改 keil中某个文件无法修改,不能输入_keil5 h文件无法修改-CSDN博客 2.编译报错declaration may not appear after executable statement in block STM32常见错误error: #268: declaration may not appear after executabl…...
C语言复习笔记--自定义类型
今天我们来复习一下自定义类型.自定义类型大概分为结构体,枚举,联合体,数组这几种.数组在之前就介绍过.今天我们来看下其他三种. 结构体 首先来看结构体. 结构体类型的声明 之前在操作符的地方简单认识过结构体.下面我们回顾一下. 结构体回顾 结构是⼀些值的集合,这…...
做 iOS 调试时,我尝试了 5 款抓包工具
日常做开发的人,特别是和客户端接口打交道的同学,应该对“抓包”这件事不陌生。 调试登录流程、分析接口格式、排查错误返回、分析网络性能、甚至研究第三方 App 的数据通信……说到底,都绕不开“抓 HTTPS 包”这一步。 而这一步࿰…...
html css js网页制作成品——HTML+CSS珠海网页设计网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
FID和IS的区别
📊 生成模型评估:你选 IS 还是 FID? 在评估 GAN、Diffusion 等图像生成模型时,两个最常被提到的指标是: 🔹IS (Inception Score) 🔹FID (Frchet Inception Distance) 🧠 Inception…...
前端三大件--HTML
引言 在互联网的世界里,每一个绚丽多彩的网页背后,都离不开 HTML 的支撑。HTML(Hyper Text Markup Language,超文本标记语言)作为网页开发的基础语言,就像是搭建高楼大厦的砖块,是所有 Web 开发…...
Node.js 的 child_process 模块详解
Node.js 的 child_process 模块提供了创建子进程的能力,使 Node.js 应用能够执行系统命令、运行其他程序或脚本。这个模块非常强大,可以帮助我们实现很多复杂的功能。 1. exec - 执行 shell 命令 exec 方法用于执行 shell 命令,并缓冲任何产生的输出。 特点 创建 shell 来…...
日常知识点之随手问题整理(虚函数 虚函数表 继承的使用场景)
新来的同事提到一个虚函数解耦头文件的问题,就想起来对虚函数进行一些回顾。 他的问题是,通过纯虚函数,如何实现不包含头文件即可真正调用到子类的实际接口。 》这里肯定是不合理的,需要一个中间管理类,对纯虚函数和相…...
【软件设计师:数据结构】2.数据结构基础(二)
一、树 树是n(n≥0)个结点的有限集合,n=0时称为空树,在任一非空树中 ● 有且仅有一个称为根的结点。 ● 其余的结点可分为m(m≥0)个互不相交的子集T1,T2…,Tm,其中每个子集本身又是一棵树,并称其为根结点的子树。 1、树的基本概念 ● 双亲和孩子 ● 兄弟:具有相同双…...
Python训练营打卡——DAY18(2025.5.7)
目录 一、基于聚类进一步推断类型 1. 聚类分析 2. 簇的总结与定义 二、作业 1. 聚类分析 2. 簇的总结与定义 3. 模型效果提升 一、基于聚类进一步推断类型 选用昨天kmeans得到的效果进行聚类,进而推断出每个簇的实际含义。 1. 聚类分析 # 先运行之前预处理…...
初学Python爬虫
文章目录 前言一、 爬虫的初识1.1 什么是爬虫1.2 爬虫的核心1.3 爬虫的用途1.4 爬虫分类1.5 爬虫带来的风险1.6. 反爬手段1.7 爬虫网络请求1.8 爬虫基本流程 二、urllib库初识2.1 http和https协议2.2 编码解码的使用2.3 urllib的基本使用2.4 一个类型六个方法2.5 下载网页数据2…...
【CSS】Grid 的 auto-fill 和 auto-fit 内容自适应
CSS Grid 的 auto-fill 和 auto-fit /* 父元素 */ .grid {display: grid;/* 定义「网格容器」里有多少列,以及每列的宽度 *//* repeat 是个「重复函数」,表示后面的模式会被重复多次 *//* auto-fit 是一个特殊值,自动根据容器宽度ÿ…...
绕线机的制作与研究
绕线机的制作与研究 摘要 本文详细阐述了绕线机的制作过程,涵盖从设计规划到实际制作的各个环节。通过对绕线机工作原理的深入分析,确定了关键技术参数,并依此完成机械结构与控制系统的设计。在制作阶段,运用多种加工工艺完成零件制造与设备组装。经测试,自制绕线机性能…...
引用的使用
引用的语法 作用:起别名 引用的本质是指针常量 数据类型 &别名原名; 引用必须要初始化 引用一旦初始化,不能修改 不能返回局部变量的引用 引用做形参 #include<iostream> #include<string> using namespace std; //通过引用…...
css animation 动画属性
animation // 要绑定的关键帧规则名称 animation-name: slidein;// 定义动画完成一个周期所需的时间,秒或毫秒 animation-duration: 3s;// 定义动画速度曲线 animation-timing-function: ease;// 定义动画开始前的延迟时间 animation-delay: 1s;// 定义动画播放次数…...
Nacos源码—Nacos集群高可用分析(二)
4.集群节点的健康状态变动时的数据同步 (1)Nacos后台管理的集群管理模块介绍 在集群管理模块下,可以看到每个节点的状态和元数据。节点IP就是节点的IP地址以及端口,节点状态就是标识当前节点是否可用,节点元数据就是相关的Raft信息。 其中节点…...
SRAM详解
一、SRAM基础原理 定义与结构 SRAM(Static Random-Access Memory,静态随机存取存储器)是一种基于触发器(Flip-Flop)结构的易失性内存,通过交叉耦合的反相器(6晶体管,6T单元ÿ…...
JavaWeb:MySQL进阶
多表设计 一对多(多对一) 外键 一对一 多对多 多表查询 内连接 外连接 子查询 -- 查询员工表 select * from emp;-- 查询部门表 select * from dept;-- 查询员工和部门 select * from emp, dept; -- 笛卡尔积select * from emp, dept where emp.dept_i…...
Golang 接口 vs Rust Trait:一场关于抽象的哲学对话
一、引言 在现代编程语言中,接口(Interface) 和 Trait 是实现多态和抽象行为的关键机制。它们允许我们定义行为契约,让不同的类型共享相同的语义接口,从而提升代码的复用性和扩展性。 Go 和 Rust 分别代表了两种截然…...