TypeError: unbound method requires a vtkRenderingCorePython.vtkAbstractMapper as the first argument 에러가 뭔가요???

조회수 1059회

3D 오브젝트를 잘라 단면을 보려고 합니다.

그 과정중에 AddClippingPlane함수를 사용하려는데

TypeError: unbound method requires a vtkRenderingCorePython.vtkAbstractMapper as the first argument

이런 에러가 뜨네요..

어떻게 고쳐야하나요..?

Error는 boneMapper = vtk.vtkAbstractMapper.AddClippingPlane(plane1) 여기서 발생합니다.

import vtk
import sys
from PyQt5 import QtCore,QtWidgets
from PyQt5.QtGui import  *
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt5.QtWidgets import QMainWindow, QApplication
from foo import Ui_MainWindow
from PyQt5 import Qt

class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setMouseTracking(True)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.OpenVTK)
        self.pushButton2.clicked.connect(
            QtCore.QCoreApplication.instance().quit)


    def OpenVTK(self):
        self.setMouseTracking(True)

        self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
        self.vl = Qt.QVBoxLayout()
        self.vl.addWidget(self.vtkWidget)
        self.ren = vtk.vtkRenderer()
        self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
        self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()

        reader = vtk.vtkDICOMImageReader()
        reader.SetDirectoryName("C:\\Users\\admin\\Documents\\MEGAGEN\\sample case(test)\\sample2")

        reader.Update()
        colors = vtk.vtkNamedColors()
        colors.SetColor("BkgColor", [51, 77, 102, 255])
        boneExtractor = vtk.vtkMarchingCubes()
        boneExtractor.SetInputConnection(reader.GetOutputPort())
        boneExtractor.SetValue(0, 1000)
        boneStripper = vtk.vtkStripper()
        boneStripper.SetInputConnection(boneExtractor.GetOutputPort())
        boneMapper = vtk.vtkPolyDataMapper()
        boneMapper.SetInputConnection(boneStripper.GetOutputPort())
        boneMapper.ScalarVisibilityOff()

        plane1 = vtk.vtkPlane()
        plane1.SetOrigin(0.05, 0.0, 0.0)  # [*1]
        plane1.SetNormal(-1.0, 0.0, 0.0)

        bone = vtk.vtkActor()
        bone.SetMapper(boneMapper)
        bone.GetProperty().SetDiffuseColor(colors.GetColor3d("Ivory"))       

        boneMapper = vtk.vtkAbstractMapper.AddClippingPlane(plane1)

        bwLut = vtk.vtkLookupTable()
        bwLut.SetTableRange(0, 2000)
        bwLut.SetSaturationRange(0, 1)
        bwLut.SetHueRange(0, 0)
        bwLut.SetValueRange(0, 1)
        bwLut.Build()

        sagittalColors = vtk.vtkImageMapToColors()
        sagittalColors.SetInputConnection(reader.GetOutputPort())
        sagittalColors.SetLookupTable(bwLut)
        sagittalColors.Update()

        sagittal = vtk.vtkImageActor()
        sagittal.GetMapper().SetInputConnection(sagittalColors.GetOutputPort())
        sagittal.SetDisplayExtent(250, 250, 0, 501, 0, 500)

        aCamera = vtk.vtkCamera()
        aCamera.SetViewUp(0, 0, -1)
        aCamera.SetPosition(0, -1, 0)
        aCamera.SetFocalPoint(0, 0, 0)
        aCamera.ComputeViewPlaneNormal()
        aCamera.Azimuth(0.0)
        aCamera.Elevation(0.0)


        self.ren.AddActor(sagittal)
        self.ren.AddActor(bone)
        self.ren.SetActiveCamera(aCamera)
        self.show()
        self.ren.ResetCamera()
        self.frame.setLayout(self.vl)
        aCamera.Dolly(1.0)

        self.ren.ResetCameraClippingRange()
        self.show()
        self.iren.Initialize()
        self.iren.Start()





if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 에러 메시지에 보면 어디에서 문제인지 집어주는 부분하고 코드까지 올리셔야 답변이 가능할 것 같습니다. nowp 2019.5.27 17:10
  • 네 수정해서 올렸습니다. 알 수 없는 사용자 2019.5.27 17:17
  • 에러메세지를 보고 추측해 보면 AddClippingPlane 함수가 vtkAbstractMapper 클래스의 멤버함수인데 클래스의 인스턴스 객체를 통하지 않고 바로 호출하기 때문에 unbound 메소드 호출을 했다고 뜨는것 같네요. 보통 클래스 멤버 함수에는 첫 번째 인자로 self 넣어주잖아요. 보통 정상적으로 인스턴스화 하고 메소드를 호출하면 이 첫 번째 인자가 인스턴스 자신을 가르키게되어 정상적으로 동작하지만, 작성하신 코드처럼 클래스 멤버함수를 바로 호출하는 경우에는 자기자신이 바인딩 되지 않은 상태니까 에러가 나는거죠. vtkAbstractMapper 클래스 인스턴스를 첫 번째 매개변수로 넣으라고 요구하는 메세지 같습니다. 클래스를 인스턴스화 하여 호출해 보세요. doodoji 2019.5.27 20:21

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)