防止 Opencascade 写入控制台

Preventing Opencascade to write to console

使用 OpenCascade C++ 库时,某些函数会打印出一些状态或对 console/terminal 的响应。 例如 STEPCAFControl_Writer::perform() 将打印出如下内容:

*******************************************************************
******        Statistics on Transfer (Write)                 ******

*******************************************************************
******        Transfer Mode = 0  I.E.  As Is       ******
******        Transferring Shape, ShapeType = 0                      ******
** WorkSession : Sending all data
 Step File Name : <file-name>  Write  Done

到控制台。 有什么办法可以避免这种情况吗?

通常 OCCT 不会直接将消息打印到控制台,而是依赖于 Message_Messenger 接口。默认实现注册 Message_PrinterOStream 打印机,它将所有消息放入控制台,并根据消息重力分配颜色。

因此,您的情况有多种选择:

  • 通过删除默认 Messenger 中的所有打印机来禁止所有 OCCT 消息。这可能不是一个好主意,因为这也会隐藏一些用于故障分析的错误消息。
  Message::DefaultMessenger()->RemovePrinters (STANDARD_TYPE(Message_PrinterOStream))
  • 通过更改消息重力过滤器,仅在默认 Messenger 中打印关键消息。默认过滤器是 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";
    }
  };
  • 说到具体的classSTEPCAFControl_Writer,需要注意的是这个class打印消息到Transfer_TransferProcess::Messenger(),设置为全局[=22] =] messenger 默认情况下,但如果特定算法输出应该被抑制/重定向,则可以被应用程序覆盖。这将需要深入研究 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 的屏幕截图,显示具有不同颜色的不同重力的消息(自 OCCT 7.5.0 以来 Message_PrinterOStream 的默认行为)- 浓红色 用于错误(Message_Alarm/Message_Fail),深黄色 用于警告 (Message_ConsoleColor_Yellow),深绿色 用于信息(Message_ConsoleColor_Green), 细黄色 用于 verbose/debug 条消息 (Message_ConsoleColor_Yellow)。