如何在OMNeT++序列图轴上显示文本与颜色?
在OMNeT++序列图轴上添加文本与颜色(参考INET MAC状态效果)
核心实现逻辑
OMNeT++序列图的轴文本/颜色标注,依赖模块状态变化时触发的标注事件,INET中MAC层的状态显示就是基于这个机制实现的——在状态切换时调用可视化API,向序列图轴添加带颜色的状态文本。
具体步骤
1. 在模块代码中触发状态标注
在目标模块(比如自定义MAC模块)的状态切换函数中,调用OMNeT++环境API添加序列图标注:
#include <omnetpp.h> #include <inet/common/INETDefs.h> using namespace omnetpp; using namespace inet; class YourMacModule : public cSimpleModule { private: enum MacState { MAC_IDLE, MAC_TRANSMITTING, MAC_RECEIVING } currentState; public: virtual void initialize() override; void changeMacState(MacState newState); }; void YourMacModule::changeMacState(MacState newState) { currentState = newState; // 映射状态到文本和颜色 std::string stateText; cFigure::Color stateColor; switch(newState) { case MAC_IDLE: stateText = "Idle"; stateColor = cFigure::Color("limegreen"); break; case MAC_TRANSMITTING: stateText = "Transmitting"; stateColor = cFigure::Color("royalblue"); break; case MAC_RECEIVING: stateText = "Receiving"; stateColor = cFigure::Color("darkorange"); break; } // 向序列图轴添加标注 getEnvir()->addSequenceChartAnnotation(this, stateText.c_str(), stateColor); }
addSequenceChartAnnotation()参数说明:- 第一个参数:当前模块指针(
this),指定标注绑定的轴 - 第二个参数:状态文本内容
- 第三个参数:轴背景颜色(支持颜色名、RGB值等)
- 第一个参数:当前模块指针(
2. 仿真配置.ini文件设置
确保启用事件日志记录(序列图依赖事件日志),并配置默认显示选项:
[General] network = YourCustomNetwork record-eventlog = true eventlog-file = ${resultdir}/${configname}-${runnumber}.elog # 序列图默认显示配置(也可在仿真后手动调整) seqchart-defaults = "showAxisAnnotations=true; axisAnnotationHeight=22; axisAnnotationFont=Arial,10"
3. 查看效果
启动仿真后,打开Sequence Chart窗口(菜单栏:Window > Sequence Chart),选中目标模块的轴,即可看到状态文本与对应颜色的背景条,和INET示例的MAC状态效果一致。
进阶:自定义标注样式
如果需要更精细的样式控制(比如字体加粗、文本对齐),可以使用带Display String的重载API:
std::string displayStr = fmt::format( "text={}; bgColor={}; font=Arial,10,bold; textAlign=center", stateText, stateColor.str() ); getEnvir()->addSequenceChartAnnotation(this, displayStr.c_str());
内容的提问来源于stack exchange,提问作者AMan
相关产品推荐
相关产品推荐

