2015-11-02 39 views
1

我在使用Python中的VTK讀取OBJ文件時遇到了一個奇怪的問題。下面的代碼示例適用於我。vtkOBJReader不能在qt主循環中工作

reader = vtk.vtkOBJReader() 
reader.SetFileName('cube.obj') 
reader.Update() 
inputP = reader.GetOutput() 

app = QtGui.QApplication(sys.argv) 

window = MainWindow(inputP) 

sys.exit(app.exec_()) 

但如果我第一初始化的QApplication,然後vtkOBJReader拋出的錯誤消息:

ERROR: In /build/vtk/src/VTK-6.1.0/IO/Geometry/vtkOBJReader.cxx, line 192 vtkOBJReader (0x56396fd14fa0): Error reading 'v' at line 5

實施例的代碼不顯示如下工作:

app = QtGui.QApplication(sys.argv) 

reader = vtk.vtkOBJReader() 
reader.SetFileName('cube.obj') 
reader.Update() 
inputP = reader.GetOutput() 

window = MainWindow(inputP) 

sys.exit(app.exec_()) 

我如果我用C++編寫這個程序,會有同樣的問題。 你有什麼建議,如何強制vtkOBJReader在QT應用程序內工作?

回答

1

我有同樣的確切問題,研究從vtkObjectReader代碼(鏈接:https://github.com/Kitware/VTK/blob/master/IO/Geometry/vtkOBJReader.cxx#L264),你可以看到錯誤消息,這個片段內產生:

// this is a vertex definition, expect three floats, separated by whitespace: 
if (sscanf(pLine, "%f %f %f", xyz, xyz+1, xyz+2) == 3) 
    { 
    points->InsertNextPoint(xyz); 
    numPoints++; 
    } 
    else 
    { 
    vtkErrorMacro(<<"Error reading 'v' at line " << lineNr); 
    everything_ok = false; 
    } 

的問題是由於的sscanf給人一種不同的輸出如果它在qt初始化之前或之後被調用。 有了這些信息,我發現這裏的解決方案:Why does Qt change behaviour of sscanf()?

使用Qt用於解析行區域是同一系統的(我是意大利人,因此期待「」作爲一個小數分頻器不是「」所以它未能識別浮點類型)。

如果你改變了區域的定義後,你的QApplication它按預期工作,即:

QApplication a(argc, argv); 
setlocale(LC_NUMERIC,"C"); 
0

那麼,它可能會幫助別人。在初始化QtGui.QApplication(sys.argv)之前加載目標文件。

+0

我想允許用戶通過QFileDialog選擇OBJ文件。所以它根本沒有幫助。 – 2man