C++ vtkSTLReader仅读取执行文件夹中的文件

C++ vtkSTLReader仅读取执行文件夹中的文件,c++,vtk,C++,Vtk,注:该问题无效,我犯了一个完全不同的错误,请参见最后的编辑 我只想使用vtkSTLReader类读取STL文件。我的代码如下所示: vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New(); reader->SetFileName(path.c_str()); reader->Update(); vtkS

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

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

        vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
        reader->SetFileName(path.c_str());
        reader->Update();
        vtkSmartPointer<vtkPolyData> poly_data = reader->GetOutput();
结果完全一样

正如我的路径所示,我在linux下工作。
我试图如上所述说明一个绝对路径,一个来自执行位置的相对路径,还有一个来自可执行文件的相对路径(以防万一)。
对于相对路径,我尝试了我认为它可能需要的各种变体,带前导的
/
,带前导的和不带前导的
/

对于绝对路径,我尝试用反斜杠替换所有斜杠,因为它可能使用windows样式的路径

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

有人有过这样的经验吗?这是vtk的特点吗?
如果它很重要,我使用VTK5.6.1(由于一些兼容性要求,无法切换到更高的版本)


编辑:我意识到我犯了一个非常简单的错误,在我的原始代码中,我没有使用
path.c_str()
而是使用
file.c_str()
,而
file
是一个组合
path
的变量。我在键入上述代码时没有犯错误,这使得问题无效。

出于好奇,我在github中钻研了一点

这就是我发现的:

int vtkSTLReader::RequestData()
,第96…110行):

(第88…122行):

//
//设置字符串。创建成员集“名称”()
//(例如,SetFilename(char*));
//
#定义vtkSetStringMacro(名称)\
虚拟空集##名称(常量字符*_参数)\
{ \
vtkDebugMacro(GetClassName()name;}\
如果(_arg)\
{ \
尺寸n=strlen(_arg)+1\
char*cp1=新字符[n]\
常量字符*cp2=(_arg)\
此->名称=cp1\
do{*cp1++=*cp2++;}而(--n)\
} \
否则\
{ \
此->名称=空\
} \
此->已修改()\
} 
//
//获取字符串。创建成员获取“名称”()
//(例如,char*GetFilename());
//
#定义vtkGetStringMacro(名称)\
虚拟字符*获取##名称(){\

vtkDebugMacro(GetClassName()这仅仅是关于STL文件的,还是您可以为其他文件类型重现您的奇怪问题?什么类型是
path
?最初,我假设
std::string
(由于
path.c_str()
)但实际上,它也可能有某种自定义的
文件名
类型,这导致了您的问题。@Scheff和其他文件类型:我在VTK Legacy中进行了某种程度的尝试,我认为也会发生同样的情况,但我还没有确认。我可能在将来尝试此操作。
路径的ad类型
:我尝试了两种
字符串
QString
,没有自定义类型。我还直接尝试在某个点对路径进行编码(因此,纯
char*
).Ugh,结果是我在实际代码中犯了一个错误,我有一个变量文件,它只包含文件名,然后被组装到path中,我使用了另一个变量,但没有意识到它,因为它看起来是正确的。我的调试输出使用了正确的变量,因此没有显示错误。我甚至没有犯那个错误在我的问题中键入代码时。无论如何,感谢您深入研究代码,实际上让我重新阅读了代码,从而找到了错误。@Aziuth这是一个受欢迎的借口,可以深入研究VTK代码(他们是如何做的)。令人满意的是,最奇怪的效果通常有一个简单的原因——你只是看错了方向。(我对此有一些个人经验。)最后但并非最不重要的是,令人惊讶的是,我的老母亲再次被证明是对的:“最后,你做错了什么。”(不用说,她对计算机一无所知。);-)
        path = "/dsgsdmklgmoeg/" + path;
  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;
    }
  // Description:
  // Specify file name of stereo lithography file.
  vtkSetStringMacro(FileName);
  vtkGetStringMacro(FileName);
//
// 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; \
  }