c++ - vtkSTLReader 只读取执行文件夹中的文件

标签 c++ vtk

注意:问题无效,我犯了一个完全不同的错误,请参阅最后的编辑。

我只想使用 vtkSTLReader 类读取 STL 文件。我的代码如下所示:

        vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
        reader->SetFileName(path.c_str());
        reader->Update();
        vtkSmartPointer<vtkPolyData> poly_data = reader->GetOutput();

然后代码继续显示多边形数据。

这在某种 程度上有效。代码将忽略 path 中除文件名之外的任何内容,然后在我执行程序的任何位置查找该文件。

例如,如果我像 path =/home/local/users/myusername/file.STL 一样,让程序位于 /some_path/somefolder/myprogram在位于 /some_path/ 的控制台中调用它时,只有当(且仅当)/some_path/file.STL 中有文件拷贝时,它才会起作用.
我是否应该从 /some_path/somefolder 中执行程序,只有当存在 /some_path/somefolder/file.STL 时它才会工作。

我什至去尝试了如果我添加一行代码会发生什么

        path = "/dsgsdmklgmoeg/" + path;

结果完全一样。

正如我的路径所暗示的,我在 linux 下工作。
我试着像上面那样声明一个绝对路径,一个从执行位置开始的相对路径,还有一个从可执行文件开始的相对路径(以防万一)。
对于相对路径,我尝试了我认为它可能想要的各种变体,有前导./,有和没有前导/.
对于绝对路径,我尝试用反斜杠替换所有斜杠,因为它可能使用 Windows 样式路径。

我意识到一个快速的解决方法是简单地将文件复制到所需的位置,但这肯定不是永久的解决方案。

有人有这方面的经验吗?这是 vtk 的一些特性吗?
如果它很重要,我使用 vtk 5.6.1(并且由于某些兼容性要求无法切换到更高版本)。

编辑:我意识到我犯了一个非常简单的错误,在我的原始代码中我有 file.c_str() 而不是 path.c_str()file 是从中组装 path 的变量。我在输入上面的代码时没有出错,使问题无效。

最佳答案

出于好奇,我深入了解了 github。

这是我发现的:

VTK/vtkSTLReader.cxx at v5.6.1 (int vtkSTLReader::RequestData(),第 96 ... 110 行):

  if (!this->FileName || (this->FileName && (0==strlen(this->FileName))))
    {
    vtkErrorMacro(<<"A FileName must be specified.");
    this->SetErrorCode( vtkErrorCode::NoFileNameError );
    return 0;
    }

  // Initialize
  //
  if ((fp = fopen(this->FileName, "r")) == NULL)
    {
    vtkErrorMacro(<< "File " << this->FileName << " not found");
    this->SetErrorCode( vtkErrorCode::CannotOpenFileError );
    return 0;
    }

VTK/vtkSTLReader.h at v5.6.1 (第 57 到 60 行):

  // Description:
  // Specify file name of stereo lithography file.
  vtkSetStringMacro(FileName);
  vtkGetStringMacro(FileName);

VTK/vtkSetGet.h at v5.6.1 (第 88 行 ... 122 行):

//
// Set character string.  Creates member Set"name"() 
// (e.g., SetFilename(char *));
//
#define vtkSetStringMacro(name) \
virtual void Set##name (const char* _arg) \
  { \
  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " << #name " to " << (_arg?_arg:"(null)") ); \
  if ( this->name == NULL && _arg == NULL) { return;} \
  if ( this->name && _arg && (!strcmp(this->name,_arg))) { return;} \
  if (this->name) { delete [] this->name; } \
  if (_arg) \
    { \
    size_t n = strlen(_arg) + 1; \
    char *cp1 =  new char[n]; \
    const char *cp2 = (_arg); \
    this->name = cp1; \
    do { *cp1++ = *cp2++; } while ( --n ); \
    } \
   else \
    { \
    this->name = NULL; \
    } \
  this->Modified(); \
  } 

//
// Get character string.  Creates member Get"name"() 
// (e.g., char *GetFilename());
//
#define vtkGetStringMacro(name) \
virtual char* Get##name () { \
  vtkDebugMacro(<< this->GetClassName() << " (" << this << "): returning " << #name " of " << (this->name?this->name:"(null)")); \
  return this->name; \
  } 

查看这段代码(恕我直言,这是 OP 问题的相关代码),我找不到任何提示,表明目录已从 SetFileName() 给出的文件路径中删除。

我不知道实际上是什么导致了只考虑当前目录中的文件的 OP 问题。但是,我很难相信 VTK 应该为此负责。

因此,我建议在上方和下方进一步搜索:

  • 以上:SetFileName() 中提供的路径是否正确? (简单的部分)
  • 下面:这种奇怪的行为是由 fopen()(或 fopen() 中调用的东西)引起的吗?

关于c++ - vtkSTLReader 只读取执行文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58728087/

相关文章:

C++ mysqlpp::storequeryresult 和 std::vector

c++ - 如何使用抽象类的 Polymorphy 2D-Array 创建?

c++ - 如何使用Makefile使用VTK库编译项目?

for-loop - 如何在找到每个点的最近邻居时迭代 VTK 中的点?

c++ - Boost图在子图中找到边

c++ - 什么是 "stack alignment"?

c++ - std::map with key as templated structs with enum member

python - 将 vtkTimerCallback 与 QVTKRenderWindowInteractor 一起使用不起作用

c++ - Vtk图表在QT中中断, “no override found for ' vtkContextDevice2D”

c++ - 带有2个渲染器的VTK摄像机剪辑