vtkSTLReader 只读取执行文件夹中的文件
vtkSTLReader reads only files in folder of execution
注意:问题无效,我犯了一个完全不同的错误,见最后的编辑。
我只想使用 vtkSTLReader class 读取 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/
的控制台中调用它,它只有在(且仅if) /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
是 [=12] 的变量=] 组装。上面的代码我没有输入错误,导致题目无效。
出于好奇,我深入研究了 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()
中调用的东西)引起的吗?
注意:问题无效,我犯了一个完全不同的错误,见最后的编辑。
我只想使用 vtkSTLReader class 读取 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/
的控制台中调用它,它只有在(且仅if) /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
是 [=12] 的变量=] 组装。上面的代码我没有输入错误,导致题目无效。
出于好奇,我深入研究了 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()
中调用的东西)引起的吗?