通常 OCCT 不会将消息直接打印到控制台,而是依赖于Message_Messenger
接口。默认实现注册Message_PrinterOStream
打印机,它将所有消息放入控制台,并根据消息的重要性分配颜色。
因此,您的情况有几种选择:
- 通过删除默认信使中的所有打印机来抑制所有 OCCT 消息。这可能不是一个好主意,因为这也会隐藏一些错误消息以进行故障分析。
Message::DefaultMessenger()->RemovePrinters (STANDARD_TYPE(Message_PrinterOStream))
- 通过更改消息重力过滤器仅打印默认信使中的关键消息。默认过滤器是
Message_Info
,这意味着将打印除Message_Trace
指定用于详细或调试输出之外的所有消息。
Message_Gravity aGravity = Message_Alarm;
for (Message_SequenceOfPrinters::Iterator aPrinterIter (Message::DefaultMessenger()->Printers());
aPrinterIter.More(); aPrinterIter.Next())
{
aPrinterIter.Value()->SetTraceLevel (aGravity);
}
- 删除并注册您自己的具有所需行为
Message_PrinterOStream
的打印机实现接口。Message_Printer
通常,GUI 应用程序不会将消息打印到控制台,而是根据用户偏好将它们打印到专用的 GUI 控件。
class MyPrinter : public Message_Printer
{
protected:
virtual void send (const TCollection_AsciiString& theString, const Message_Gravity theGravity) const override
{
std::cerr << "[GRAV: " << theGravity << "] " << theString << "\n";
}
};
- 当涉及到特定类
STEPCAFControl_Writer
时,应注意该类将消息打印到默认情况下Transfer_TransferProcess::Messenger()
设置为全局Message::DefaultMessenger()
信使,但如果应抑制/重定向特定算法输出,则可以由应用程序覆盖。这需要深入STEPCAFControl
研究内部逻辑,因为它看起来不像应用程序代码可以轻松访问的 API……而且似乎有些消息Message::DefaultMessenger()
无论如何都会被打印出来。
STEPCAFControl_Writer aWriter;
Handle(Message_Messenger) aMessenger = new Message_Messenger();
aMessenger->ChangePrinters().Clear();
aMessenger->AddPrinter (new MyPrinter());
aWriter.ChangeWriter().WS()->TransferWriter()->FinderProcess()->SetMessenger (aMessenger);
...
下面是 Draw Harness 的屏幕截图,显示具有不同颜色的具有不同重力的消息(Message_PrinterOStream
自 OCCT 7.5.0 起的默认行为)-深红色表示错误 ( Message_Alarm
/ Message_Fail
),深黄色表示警告 ( Message_ConsoleColor_Yellow
),深绿色表示信息 ( Message_ConsoleColor_Green
),细黄色表示详细/调试消息 ( Message_ConsoleColor_Yellow
)。