首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防止Opencascade写入控制台

防止Opencascade写入控制台
EN

Stack Overflow用户
提问于 2020-11-19 13:13:47
回答 1查看 258关注 0票数 1

在使用OpenCascade C++库时,某些函数会打印出对控制台/终端的一些状态或响应。例如,作者:执行()将打印出如下内容:

代码语言:javascript
运行
复制
*******************************************************************
******        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

到控制台去。有什么办法可以防止这种情况发生吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-19 16:28:03

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

因此,在您的案例中有几种选择:

  • 通过删除默认信使中的所有打印机来抑制所有OCCT消息。这可能不是一个好主意,因为这也会隐藏一些错误信息,用于故障分析。
代码语言:javascript
运行
复制
  Message::DefaultMessenger()->RemovePrinters (STANDARD_TYPE(Message_PrinterOStream))
  • 通过更改邮件重力筛选器,仅在默认信使中打印关键消息。默认筛选器是Message_Info,这意味着除了指定用于详细或调试输出的Message_Trace之外,所有消息都将被打印出来。
代码语言:javascript
运行
复制
  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控件中。
代码语言:javascript
运行
复制
  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()
代码语言:javascript
运行
复制
  STEPCAFControl_Writer aWriter;
  Handle(Message_Messenger) aMessenger = new Message_Messenger();
  aMessenger->ChangePrinters().Clear();
  aMessenger->AddPrinter (new MyPrinter());
  aWriter.ChangeWriter().WS()->TransferWriter()->FinderProcess()->SetMessenger (aMessenger);
  ...

下面是一个显示具有不同颜色(自OCCT7.5.0以来的Message_PrinterOStream默认行为)的不同重力的消息的截屏截图--强红色错误 (Message_Alarm/Message_Fail),强黄色警告 (Message_ConsoleColor_Yellow),强绿色<代码>E 240用于信息(Message_ConsoleColor_Green),以及E 142瘦黄色<代码>E 243用于详细/调试消息(Message_ConsoleColor_Yellow)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64912439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档