1

当使用 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

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

4

1 回答 1

4

通常 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)。 OCCT 彩色消息

于 2020-11-19T16:28:03.367 回答