我正在尝试使用vtk读取和呈现目录中的多个文件(当它们组合在一起形成一个对象时)。但是到目前为止,我收到以下错误:
set(value)
到目前为止,我一直尝试只读取1个文件而不是多个文件,但是我仍然遇到上面提到的错误。
这是我正在处理的编码:
@get:Bindable // We make getter method bindable for data-binding
val email = MutableLiveData<String>()
get() { // Try to provide getter method like this
return field as LiveData<String>
}
set(data) { // Try to provide setter method like this
if(field.value != data.value) // To avoid infinite loop
field.value = data.value
}
我想念什么?我尝试使用其他类型的文件,但仍无法使用此方法读取和呈现任何内容。
答案 0 :(得分:1)
当您列出文件夹中的文件时,它看起来像第一个条目是“。”。 (这是正常的),因此您尝试打开的文件的路径为“ D:\ 3d模型\ Dist \”。它不是vtkXMLPolyDataReader的有效文件。
您应仅尝试打开用vtkXMLPolyDataWriter编写的vtk文件。 例如,通过检查扩展名为“ .vtp”(或用于保存包含vtkPolyData模型的文件的任何扩展名)。
在循环的第一部分检查扩展名:
for (int i = 0; i < numberOfFiles; i++)
{
std::string fileString = directoryName;
////fileString += "/";
fileString += directory->GetFile(i);
std::string ext = vtksys::SystemTools::GetFilenameLastExtension(fileString);
std::cout << fileString.c_str() << " extension: " << ext << std::endl;
// add this line here to skip "." and "..", also fix the extension if not .xml
if (ext.find(".vtp") == std::string::npos) continue;
(...)
我还怀疑您正在尝试使用vtkXMLPolyDataReader,而您应该使用vtkPolyDataReader(这实际上取决于用来生成文件的编写器)。 vtkXMLPolyDataReader是.vtp文件的标准阅读器。
最后,您正在循环中创建一个渲染器,一个渲染窗口和一个摄像头:这意味着每个对象一个窗口。这很罕见,是您想要的吗?
长话短说:您至少需要一个渲染器和一个窗口来显示一个或多个模型。每个模型都由一个actor表示:窗口是渲染器绘制(一个或多个)actor的地方。渲染器是一个渲染过程:当然,每个演员可以拥有一个渲染过程,但是除非您确定需要,否则就不需要。
这是您的代码,正如我在您的位置所做的那样修改:
int main(int argc, char *argv[])
{
std::string directoryName = "D:\\3d models\\Dist\\" ;
vtkSmartPointer<vtkOpenVRRenderer> renderer =
vtkSmartPointer<vtkOpenVRRenderer>::New();
vtkSmartPointer<vtkOpenVRRenderWindow> renderWindow =
vtkSmartPointer<vtkOpenVRRenderWindow>::New();
renderWindow->AddRenderer(renderer);
vtkSmartPointer<vtkOpenVRRenderWindowInteractor> renderWindowInteractor =
vtkSmartPointer<vtkOpenVRRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);
vtkNew<vtkOpenVRCamera> cam;
renderer->SetActiveCamera(cam);
renderer->SetBackground(.2, .3, .4);
vtkSmartPointer<vtkDirectory> directory = vtkSmartPointer<vtkDirectory>::New();
int opened = directory->Open(directoryName.c_str());
if(!opened)
{
std::cout << "No es posible abrir este directorio!" << std::endl;
return EXIT_FAILURE;
}
int numberOfFiles = directory->GetNumberOfFiles();
std::cout << "NUmero de archivos: " << numberOfFiles << std::endl;
for (int i = 0; i < numberOfFiles; i++)
{
std::string fileString = directoryName;
////fileString += "/";
fileString += directory->GetFile(i);
std::string ext = vtksys::SystemTools::GetFilenameLastExtension(fileString);
std::cout << fileString.c_str() << " extension: " << ext << std::endl;
if (ext.find(".vtp") == std::string::npos) continue;
std::string name = vtksys::SystemTools::GetFilenameWithoutLastExtension(fileString);
std::cout << "nombre: " << name << std::endl;
const char*cstr = fileString.c_str();
std::cout << cstr << endl;
vtkSmartPointer<vtkXMLPolyDataReader> reader =
vtkSmartPointer<vtkXMLPolyDataReader>::New();
reader->SetFileName(cstr);
reader->Update();
reader->GetOutput();
vtkSmartPointer<vtkTransform> transform =
vtkSmartPointer<vtkTransform>::New();
transform->Scale(.005, .005, .005);
vtkSmartPointer<vtkTransformFilter> transformFilter =
vtkSmartPointer<vtkTransformFilter>::New();
transformFilter->SetInputConnection(reader->GetOutputPort());
transformFilter->SetTransform(transform);
// Visualizar
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(transformFilter->GetOutputPort());
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();
actor->SetPosition(1.1, .5, .1);
actor->SetMapper(mapper);
renderer->AddActor(actor);
}
renderWindow->Render();
renderWindowInteractor->Start();
return EXIT_SUCCESS;
}