首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用Transfer()时,Opencascade崩溃

调用Transfer()时,Opencascade崩溃
EN

Stack Overflow用户
提问于 2019-07-17 14:31:42
回答 1查看 734关注 0票数 3

我已测试了两宗个案:

我使用STEPCAFControl_Reader然后STEPControl_Reader来读取我的step文件,但是当我调用STEPCAFControl_Reader::Transfer时,这两种方法都会崩溃,重新命名为STEPControl_Reader::TransferRoots。

通过使用STEPControl_Reader,我在控制台上显示了一个日志,然后有如下消息:

1 F:(BOUNDED_SURFACE、B_SPLINE_SURFACE、B_SPLINE_SURFACE_WITH_KNOTS、GEOMETRIC_REPRESENTATION_ITEM、RATIONAL_B_SPLINE_SURFACE、REPRESENTATION_ITEM、SURFACE):representation_item的参数计数不是1

编辑:

TransferRoots()方法中有一个空引用。

代码语言:javascript
运行
复制
const Handle(Transfer_TransientProcess) &proc = thesession->TransferReader()->TransientProcess();
if (proc->GetProgress().IsNull())
{
   //This condition does not exist from the source code
   std::cout << "GetProgress is null" << std::endl;
   return 0;
 }    
Message_ProgressSentry PS ( proc->GetProgress(), "Root", 0, nb, 1 );

我的应用程序和FreeCAD崩溃,但如果我使用哪个OCC官方查看器,它加载。

EN

回答 1

Stack Overflow用户

发布于 2020-02-13 19:07:16

看起来评论已经给出了问题的答案,或者更准确地说是答案。

  • STEPCAFControl_Reader::ReadFile()返回读取状态,应该在调用STEPCAFControl_Reader::Transfer().之前检查该状态。
  • 通常,将OCCT算法应用于尝试/捕获块并检查OCCT异常(Standard_Failure)是一种很好的做法。
  • 在try语句开头添加OCC_CATCH_SIGNALS (仅在Linux上需要)和在工作线程创建中添加OSD::SetSignal(false),以便将异常情况(访问冲突、空引用等)重定向到C++异常(OSD_Signal是Standard_Failure的子类)。这可能会与混合环境中的其他信号处理程序发生冲突--因此也请检查应用程序使用的其他框架的文档。
  • 如果在调用带有有效参数的OCCT算法时捕捉到诸如NULL取消引用之类的失败--这是OCCT中的一个bug,它是希望以某种方式修复的,即使输入步骤文件包含触发此类问题的语法/逻辑错误。在OCCT Bugtracker上报告问题,提供足够的信息来复制bug,包括示例文件--这对开发人员仅仅说OCCT在某个地方崩溃是没有帮助的。还可以考虑通过调试OCCT代码和建议修补程序来为这个开源项目做出贡献。
  • 检查步骤文件读取日志,以查看文件本身中可能出现的错误。考虑向生成损坏文件的系统报告问题,即使主文件内容可以由分步读取器加载。

在基于OSD::SetSignal()的应用程序(如CAD )中使用OCCT来提高其对应用程序/OCCT代码中非致命错误的鲁棒性是一种常见的做法。它更方便用户报告内部错误消息,而不是默默地崩溃。

但是需要注意的是,OSD::SetSignal()不能保证应用程序不会崩溃,也不能保证应用程序在捕捉到这样的故障后能够正常工作--由于某些信号的异步性质,内存在C++异常被引发时可能已经损坏,从而导致各种不想要的行为。由于这个原因,最好不要忽略这种异常,即使它看起来像应用程序可以很好地处理它们。

代码语言:javascript
运行
复制
  OSD::SetSignal(false); // should be called ones at application startup
  STEPCAFControl_Reader aReader;
  try
  {
    OCC_CATCH_SIGNALS // necessary for redirecting signals on Linux
    if (aReader.ReadFile (theFilePath) != IFSelect_RetDone) { return false; }
    if (!aReader.Transfer (myXdeDoc)) { return false; }
  }
  catch (Standard_Failure const& theFailure)
  {
    std::cerr << "STEP import failed: " << theFailure.GetMessageString() << "\n";
    return false;
  }
  return true;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57078323

复制
相关文章

相似问题

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