阻止 Opencascade 写入控制台

rem*_*emi 2 c++ console logging opencascade

使用 OpenCascade C++ 库时,某些函数会向控制台/终端打印一些状态或响应。例如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
Run Code Online (Sandbox Code Playgroud)

到控制台。有办法防止这种情况吗?

gkv*_*311 5

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

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

  • 通过删除默认信使中的所有打印机来禁止所有 OCCT 消息。这可能不是一个好主意,因为这也会隐藏少量错误消息以进行故障分析。
  Message::DefaultMessenger()->RemovePrinters (STANDARD_TYPE(Message_PrinterOStream))
Run Code Online (Sandbox Code Playgroud)
  • 通过更改消息重力过滤器,仅打印默认信使中的关键消息。默认过滤器为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);
  }
Run Code Online (Sandbox Code Playgroud)
  • 删除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";
    }
  };
Run Code Online (Sandbox Code Playgroud)
  • 当涉及到特定的类时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);
  ...
Run Code Online (Sandbox Code Playgroud)

下面是 Draw Harness 的屏幕截图,显示具有不同颜色的不同重力的消息(Message_PrinterOStream自 OCCT 7.5.0 起的默认行为) -深红色表示错误 ( Message_Alarm/ Message_Fail),深黄色表示警告 ( Message_ConsoleColor_Yellow),深绿色表示信息 ( Message_ConsoleColor_Green),细黄色表示详细/调试消息 ( Message_ConsoleColor_Yellow)。 OCCT 彩色消息

  • 专门针对“STEPCAFControl_Writer”重写信使看起来非常h​​ackish,并且看起来不像任何人真正使用的那样定义明确的API。我已在答案中添加了代码示例。 (2认同)