文档总览
以下文档均来自仓库 Document/ 目录,按所属模块分组,点击卡片可直接打开或下载对应文件。
Document/…。把站点文件放在仓库根目录即可直接生效;
若站点位于子目录,全局替换成 ../Document/…。
入门与开源
来源:Document/DemoDocument/
平台与架构
来源:Document/NUCASDocument/
内核与建模
来源:Document/ncsKernelDocument/
几何与曲面
来源:Document/CASISGeomDocument/、CASISNurbsDocument/、CASISSurfDocument/
专业模块
来源:Document/CASISDrawDocument/、CASISBasicDocument/、CASISElmeDocument/、CASISGadesDocument/、LinesDBDocument/、IETMOSDocument/
文档模板
来源:Document/DemoDocument/各类文档模板/
功能示例
来源:Document/DemoDocument/具体功能示例/
开源模块清单
来源:开源仓库(Gitcode)· 核心层 5 + 平台层 7 + 基础层 6,共 30+ 可编译工程
核心层 ncsKernel → ncsBasic → BaseCtrl → ncsStore;
平台层 ncsDB → ncsDBCtrl → AdvCtrl → ncsFunc;
基础层 CASISGeom → CASISDraw → CASISNurbs → CASISSolid → ncsDXF → ncsStep。
ncsKernel
核心层最基础的模型架构:模型本体 CObj、代理 GModule、模型树、智能指针 HObj/HModule、模型队列 HObjs。
NcsBasic
核心层核心模型算法与控件库(含虚拟控件),由 NcsBasicCtrl、NcsBasicFunc、NcsBasicObj 三个包组成。
BaseCtrl
核心层最基础的界面控件库,提供永久类的创建、初始化等方法。
ncsStore
核心层负责文件的存储与读写。
ncsDB
平台层关系型数据库模块核心层,定义数据库连接。
ncsDBCtrl
平台层继承 ncsDB,实现具体的数据库驱动。
AdvCtrl
平台层BaseCtrl 基础上的界面控制扩展库,含 Property 属性窗口等,拓展为 ProCtrl。
ncsFunc
平台层封装核心算法与业务逻辑。
CASISComm
平台层通信中间件模块,由 CASISComm、casiscomm、CommFunc、CommObj 组成,几何等模块已与其解耦。
TestKernel / TestBaseCtrl
测试核心层对应的测试模块,用于验证 ncsKernel 与 BaseCtrl 的功能。
ncsDBTest
测试数据库测试层,验证数据库模块功能。
TestAdv
测试平台层测试模块。
CASISGeom
基础层几何建模核心:几何对象 GeomObj、几何数据 GeomData、几何控制 GeomCtrl、几何接口 ncsGI、OpenGL 端口 portGL。
CASISDraw
基础层二维绘图与显示模块,含绘图对象 DrawObj、绘图控制 DrawCtrl,派生层为 AdvDraw。
CASISNurbs
基础层NURBS 曲线曲面造型,含 NurbsObj、NurbsCtrl,派生层为 AdvNurbs。
CASISSolid
基础层三维实体造型,含 SolidObj、SolidCtrl,派生层为 AdvSolid。
ncsDXF
基础层DXF 文件的导入与导出接口,随模块提供 DXFTest 验证工程。
ncsStep
基础层STEP 模型的导入与导出接口,随模块提供 TestStep 验证工程。
新人手册 · 从零到第一个模块
两条上手路径:用「新人模板」向导一键生成,或按手册手动搭建。下面先看模板,再讲原理。
新人模板:三步生成可运行模块
在 VS2019 新建项目时选择「NuCAS New Person Module」,向导会让你填三个字段,其余代码与资源配置自动生成。
模块在系统里显示的中文名,写入 DECLARE_TEST 第二参
「开始」菜单里出现的菜单项文字
菜单资源 ID,对应 ADD_SYSMENU 与 ON_COMMAND
向导自动生成的核心代码(以「外板面积计算」模块为例)
// pch.h —— 模块身份(由向导自动填写)
#define SYSNAME "MyModule" // 模块 ID,须与 .dlc 文件名一致
#define NCS_FREEMODULE
// Test.cpp —— 模块注册与菜单挂载
DECLARE_TEST("MyModule", "外板面积计算", MyModule) // 英文名 / 中文名 / id
BEGIN_UPDATE(MyTestUnit)
ADD_SYSMENU(IDR_面向船舶行业的交互式电子技术手册软件_MENU); // 菜单资源 ID
POP_PANE("Start")
END_UPDATE()C:\Users\用户名\Documents\Visual Studio 2019\Templates\ProjectTemplates
即可在 VS2019 中选择模板
MFC 基础 · 调试快捷键
01 MFC 基础
两种经典程序形态,是看懂模块代码的前提。
- 基于 Dialog 对话框:
CWinApp是程序入口,CDialog派生类管理对话框资源与控件消息。 - 基于 MDI 多文档:在视图类
OnDraw中绘制,在文档类中存储数据。
重要思路:数据是核心,算法是关键,成功靠应用界面。
02 调试快捷键
MFC / VS2019 常用调试操作速查。
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 设置断点 | F9 | 代码行左侧点击或按 F9 |
| 开始调试 | F5 | 启动并停在断点处 |
| 逐语句 | F11 | 进入函数内部 |
| 逐过程 | F10 | 执行当前行,不进入函数 |
| 跳出 | Shift+F11 | 执行完当前函数返回调用处 |
手动创建模块(原理)
1 新建解决方案
新建 MFC DLL 项目,向导选「MFC 扩展 DLL」。
- 新建项目 →
MFC DLL - DLL 类型选择
MFC 扩展 DLL - 位置设为面向船舶行业的交互式电子技术手册软件主目录
2 添加属性表
在属性管理器中添加主目录的 .props 文件。
Debug|x64→NuCASDebugMacro_x64.propsRelease|x64→NuCASReleaseMacro_x64.props- 输出目录
$(NuCASExePath)/
3 更改属性
关键属性与平台按需切换。
- 目标文件扩展名
.dlc(图形界面模块) - 字符集
多字节字符集 - 附加库目录
$(NuCASLibPath)/ - 调试命令
$(OutDir)NuCAS.exe
4 编译并注册
生成 .dlc 后在宿主里注册。
- 重新生成解决方案
- 运行
NuCAS.exe - 菜单「编辑模块 → 重新注册」
二次开发 · 观察者机制
03 核心思路
以「外板面积计算」为例,讲清面向船舶行业的交互式电子技术手册软件动态加载与数据联动。
- 用
OProp/OTb宏声明「可观察属性」与对应回调 - 用
OInit把绑定注册到框架通知系统 - 属性变化时框架自动派发,触发
Refresh/Flush_Refresh完成 UI 刷新或联动更新
04 数据层示例
外板面积计算的对象类,继承自 CObj。
class MyShellCalc : public CObj {
DECLARE_OBJ(MyShellCalc)
VARIABLE(double, Fore); // 前端
VARIABLE(double, Aft); // 后端
VARIABLE(double, Bottom); // 下端
VARIABLE(double, Top); // 上端
VARIABLE(double, Area); // 面积
VARIABLE(double, Length); // 周长
};进阶实战 · 新手教程2
在「新手教程1」MFC 基础上,用观察者机制完成三维视图、文件导入与完整业务模块。以「轮轨计算(MyWheelCalc)」为例。
步骤
- 属性页 C/C++ 常规 → 附加包含目录加入
../CasisInc/CASISGeom - 链接器输入 → 附加依赖项加入
CASISGeom.libGeomObj.libGeomCtrl.lib MyObserve.cpp引入#include "BaseGLView.h",声明资源观察者- 菜单响应里调用
calc.Open()打开窗口,重新生成并运行
核心代码
#include "BaseGLView.h"
class MoXingFindResource : public OFindResource {
DECLARE_OBSERVE(MoXingFindResource)
protected:
DECLARE_WRITE_MAP()
BOOL OnMyWheelCalc(const HObj& o) const;
};
IMPLEMENT_OBSERVE(MoXingFindResource)
BEGIN_WRITE_MAP(MoXingFindResource, OFindResource)
ON_WRITE(MyWheelCalc, OnMyWheelCalc)
END_WRITE_MAP()
BOOL MoXingFindResource::OnMyWheelCalc(const HObj& /*o*/) const {
m_FrameClass = RUNTIME_CLASS(NChildWnd);
m_ViewClass = RUNTIME_CLASS(NBaseGLView);
return TRUE;
}
// 菜单响应里打开三维窗口:
calc.Open();步骤
- 包含目录加
../CasisInc/ncsTest../CasisInc/ncsStep;链接加ncsGL.libncsStep.lib - 数据类加字段:
OBJ(HObj, STEP),SERIALIZE_WITHVER(STEP, 2),OBSERVE(STEP)UPDATEOBJ(STEP) - 资源视图加按钮并设
ID_STEP - 菜单响应里调用
ncsStepCtrl::Import(path)导入
核心代码
class LoadStepGLViewer : public GLViewer {
DECLARE_OBSERVE(LoadStepGLViewer)
protected:
DECLARE_WRITE_MAP()
BOOL OnMyWheelCalc(const HObj& obj) const;
};
IMPLEMENT_OBSERVE(LoadStepGLViewer)
BEGIN_WRITE_MAP(LoadStepGLViewer, GLViewer)
ON_WRITE(MyWheelCalc, OnMyWheelCalc)
END_WRITE_MAP()
BOOL LoadStepGLViewer::OnMyWheelCalc(const HObj& o) const {
HMyWheelCalc obj = o;
Write(obj->STEP());
return TRUE;
}
// 菜单响应(POBJUnit::OnOurStep):
HObj obj = ncsStepCtrl::Import(path);
HMyWheelCalc calc = GetObj();
calc->STEP(obj); calc.Update();步骤
- 数据类
MyWheelCalc继承CObj,用VARIABLE声明字段 - 用
OMaxMin/OProp/OTb/OInit观察者宏声明属性联动 - 菜单 cpp 中用
POBJUnit(CObjUnit)+WheelRegUnit(ORegUnit)挂载单元 - 重新生成解决方案并运行,在宿主里重新注册
核心代码
// 包围盒联动:导入 STEP 后自动算外接盒
class WheelCalcMaxMin : public OMaxMin {
DECLARE_OBSERVE(WheelCalcMaxMin)
protected:
DECLARE_WRITE_MAP()
BOOL OnWheelCalc(const HObj& obj) const;
};
IMPLEMENT_OBSERVE(WheelCalcMaxMin)
BEGIN_WRITE_MAP(WheelCalcMaxMin, OMaxMin)
ON_WRITE(MyWheelCalc, OnWheelCalc)
END_WRITE_MAP()
BOOL WheelCalcMaxMin::OnWheelCalc(const HObj& o) const {
HMyWheelCalc obj = o;
gBox box = obj->STEP().MaxMin();
m_Box = box;
return TRUE;
}文档持续完善中,发现问题欢迎到 社区 反馈 Issue 或直接提交修订。