5 changed files with 699 additions and 0 deletions
			
			
		@ -0,0 +1,19 @@ | 
				
			|||
from PyQt5.QtCore import * | 
				
			|||
 | 
				
			|||
class ConstrainedOpt(QThread): | 
				
			|||
    signal_update_voxels = pyqtSignal(str) | 
				
			|||
 | 
				
			|||
    def __init__(self, model,index): | 
				
			|||
        QThread.__init__(self) | 
				
			|||
        self.model = model['model'] | 
				
			|||
        # self.model = model | 
				
			|||
        self.name = model['name'] | 
				
			|||
 | 
				
			|||
        self.index = index | 
				
			|||
 | 
				
			|||
    def run(self): | 
				
			|||
#        while True: | 
				
			|||
            self.update_voxel_model() | 
				
			|||
 | 
				
			|||
    def update_voxel_model(self): | 
				
			|||
        self.signal_update_voxels.emit('update_voxels') | 
				
			|||
@ -0,0 +1,14 @@ | 
				
			|||
import sys | 
				
			|||
import qdarkstyle | 
				
			|||
from gui_main import MainWindow | 
				
			|||
from PyQt5.QtWidgets import * | 
				
			|||
 | 
				
			|||
if __name__ == "__main__": | 
				
			|||
    app = QApplication(sys.argv) | 
				
			|||
    desktopWidget = QApplication.desktop() | 
				
			|||
    screenRect = desktopWidget.screenGeometry() | 
				
			|||
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) | 
				
			|||
    window = MainWindow(screenRect.width(),screenRect.height()) | 
				
			|||
    window.setWindowTitle("model_view") | 
				
			|||
    window.show() | 
				
			|||
    sys.exit(app.exec_()) | 
				
			|||
@ -0,0 +1,354 @@ | 
				
			|||
import os | 
				
			|||
import scipy.io as sio | 
				
			|||
 | 
				
			|||
from gui_viewer import * | 
				
			|||
from ConstrainedOpt import ConstrainedOpt | 
				
			|||
 | 
				
			|||
from PyQt5.QtWidgets import * | 
				
			|||
from PyQt5.QtCore import * | 
				
			|||
from PyQt5.QtGui import * | 
				
			|||
 | 
				
			|||
import sys | 
				
			|||
import qdarkstyle | 
				
			|||
 | 
				
			|||
class MySubWindow(QMdiSubWindow): | 
				
			|||
    signal_save_image = pyqtSignal(str) | 
				
			|||
 | 
				
			|||
class MainWindow(QMainWindow): | 
				
			|||
    signal_save_images = pyqtSignal(str) | 
				
			|||
    signal_setCamera = pyqtSignal(float, float, float) | 
				
			|||
 | 
				
			|||
    def __init__(self, width, height, parent=None): | 
				
			|||
        QMainWindow.__init__(self, parent) | 
				
			|||
        self.width = width | 
				
			|||
        self.height = height | 
				
			|||
        self.resize(width, height) | 
				
			|||
        self.mdi_Area = QMdiArea() | 
				
			|||
        self.mdi_Area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) | 
				
			|||
        self.mdi_Area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) | 
				
			|||
 | 
				
			|||
        self.camerax = 0 | 
				
			|||
        self.cameray = 0 | 
				
			|||
        self.cameraz = 0 | 
				
			|||
 | 
				
			|||
        self.files = list() | 
				
			|||
        self.models = list() | 
				
			|||
        self.models_count = 0 | 
				
			|||
 | 
				
			|||
        self.setCentralWidget(self.mdi_Area) | 
				
			|||
 | 
				
			|||
        self.mdi_Win = list() | 
				
			|||
        self.frame = list() | 
				
			|||
        self.viewerWidget = list() | 
				
			|||
 | 
				
			|||
        self.banch = 8 | 
				
			|||
        self.current_index = -1 | 
				
			|||
 | 
				
			|||
        self.file_ind = 0 | 
				
			|||
 | 
				
			|||
        # create openAction | 
				
			|||
        openAction = QAction("&Open", self) | 
				
			|||
        openAction.setShortcut(QKeySequence.Open) | 
				
			|||
        openAction.setToolTip("Open files") | 
				
			|||
        openAction.setStatusTip("Open files") | 
				
			|||
        openAction.triggered.connect(self.open_file) | 
				
			|||
 | 
				
			|||
        openoneAction = QAction("&Openone", self) | 
				
			|||
        openoneAction.setShortcut(QKeySequence.Open) | 
				
			|||
        openoneAction.setToolTip("Open a file") | 
				
			|||
        openoneAction.setStatusTip("Open a file") | 
				
			|||
        openoneAction.triggered.connect(self.open_one_file) | 
				
			|||
 | 
				
			|||
        # preAction = QAction("&PreGroup", self) | 
				
			|||
        # preAction.setShortcut(QKeySequence.Open) | 
				
			|||
        # preAction.setToolTip("Show pre group model") | 
				
			|||
        # preAction.setStatusTip("Show pre group model") | 
				
			|||
        # preAction.triggered.connect(self.pre_group) | 
				
			|||
        # # self.connect(preAction, SIGNAL("triggered()"), self.pre_group) | 
				
			|||
 | 
				
			|||
        nextAction = QAction("&NextGroup", self) | 
				
			|||
        nextAction.setShortcut(QKeySequence.Open) | 
				
			|||
        nextAction.setToolTip("Show next group model") | 
				
			|||
        nextAction.setStatusTip("Show next group model") | 
				
			|||
        nextAction.triggered.connect(self.next_group) | 
				
			|||
 | 
				
			|||
        saveAction = QAction("&SaveAll", self) | 
				
			|||
        saveAction.setShortcut(QKeySequence.Open) | 
				
			|||
        saveAction.setToolTip("Save all models as Image") | 
				
			|||
        saveAction.setStatusTip("Save all models as Image") | 
				
			|||
        saveAction.triggered.connect(self.save_group) | 
				
			|||
 | 
				
			|||
        saveOneAction = QAction("&SaveCurrent", self) | 
				
			|||
        saveOneAction.setShortcut(QKeySequence.Open) | 
				
			|||
        saveOneAction.setToolTip("Save current model") | 
				
			|||
        saveOneAction.setStatusTip("Save current model") | 
				
			|||
        saveOneAction.triggered.connect(self.save_one) | 
				
			|||
 | 
				
			|||
        # create toolbar | 
				
			|||
        toolbar = self.addToolBar("tool") | 
				
			|||
        toolbar.setMovable(False) | 
				
			|||
        toolbar.setObjectName("ToolBar") | 
				
			|||
        toolbar.addAction(openAction) | 
				
			|||
        toolbar.addAction(openoneAction) | 
				
			|||
        toolbar.addAction(nextAction) | 
				
			|||
        toolbar.addAction(saveAction) | 
				
			|||
        toolbar.addAction(saveOneAction) | 
				
			|||
 | 
				
			|||
        # toolbar.addAction(preAction) | 
				
			|||
 | 
				
			|||
    def closeEvent(self, event): | 
				
			|||
        for i in range(len(self.mdi_Win)): | 
				
			|||
            self.mdi_Win[i].opt_engine.quit() | 
				
			|||
 | 
				
			|||
    def open_all_file_for_model(self, file_name): | 
				
			|||
        mat_list = [] | 
				
			|||
        dir_name = "" | 
				
			|||
        for i in range (5): | 
				
			|||
            file_path = dir_name + file_name + "_" + str(i) + ".mat" | 
				
			|||
            data = sio.loadmat(file_path) | 
				
			|||
            mat_list.append(data) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    def get_object_model(self, dir_path): | 
				
			|||
        mat_file_list = [] | 
				
			|||
        transform_file_list = [] | 
				
			|||
        for file_name in os.listdir(dir_path): | 
				
			|||
            if file_name.endswith('.mat'): | 
				
			|||
                mat_file_list.append(file_name) | 
				
			|||
            elif file_name.endswith('.txt'): | 
				
			|||
                transform_file_list.append(file_name) | 
				
			|||
 | 
				
			|||
        if len(mat_file_list) != len(transform_file_list): | 
				
			|||
            raise KeyError("The number of mat files don't match the number of transform files") | 
				
			|||
 | 
				
			|||
        label_list = [] | 
				
			|||
        for mat_file in mat_file_list: | 
				
			|||
            cur_label = mat_file[-5: -4] | 
				
			|||
            label_list.append(cur_label) | 
				
			|||
 | 
				
			|||
        if len(mat_file_list[0]) == 5 and mat_file_list[0][0].isdigit(): | 
				
			|||
            testing_samples = True | 
				
			|||
        else: | 
				
			|||
            testing_samples = False | 
				
			|||
 | 
				
			|||
        models = [] | 
				
			|||
        cur_file_name = mat_file_list[0][0:-6] | 
				
			|||
        for cur_label in label_list: | 
				
			|||
            c_label = int(cur_label) | 
				
			|||
 | 
				
			|||
            if testing_samples: | 
				
			|||
                current_mat_file_name = "%d.mat" % (c_label) | 
				
			|||
                current_transform_file_name = "%d_transform_info.txt" % (c_label) | 
				
			|||
            else: | 
				
			|||
                current_transform_file_name = "%s_%d_transform_info.txt" % (cur_file_name, c_label) | 
				
			|||
                current_mat_file_name = "%s_%d.mat" % (cur_file_name, c_label) | 
				
			|||
 | 
				
			|||
            part_name = "%s_%d" % (cur_file_name, c_label) | 
				
			|||
 | 
				
			|||
            current_mat_file_path = "%s/%s" % (dir_path, current_mat_file_name) | 
				
			|||
            current_transform_file_path = "%s/%s" % (dir_path, current_transform_file_name) | 
				
			|||
 | 
				
			|||
            file = open(current_transform_file_path, 'r') | 
				
			|||
 | 
				
			|||
            is_bbox_vector = False | 
				
			|||
            is_min_max_value = False | 
				
			|||
 | 
				
			|||
            file_lines = file.readlines() | 
				
			|||
            for line in file_lines: | 
				
			|||
                if line == "\r\n": | 
				
			|||
                    is_bbox_vector = False | 
				
			|||
                    is_min_max_value = False | 
				
			|||
                    continue | 
				
			|||
                if line.find("vector for representation") != -1: | 
				
			|||
                    is_min_max_value = True | 
				
			|||
                    is_bbox_vector = False | 
				
			|||
                    continue | 
				
			|||
                if line.find("Min_Max Value") != -1: | 
				
			|||
                    is_bbox_vector = False | 
				
			|||
                    is_min_max_value = True | 
				
			|||
                    continue | 
				
			|||
                if is_bbox_vector: | 
				
			|||
                    value_list = line.split(' ') | 
				
			|||
                if is_min_max_value: | 
				
			|||
                    line = line.strip() | 
				
			|||
                    line = line.strip(' \t\n\r') | 
				
			|||
                    value_list = line.split(' ') | 
				
			|||
                    break | 
				
			|||
 | 
				
			|||
            translate_vector = [float(value_list[0]), float(value_list[1]), float(value_list[2])] | 
				
			|||
 | 
				
			|||
            value_list[3] = abs(float(value_list[3])) | 
				
			|||
            value_list[4] = abs(float(value_list[4])) | 
				
			|||
            value_list[5] = abs(float(value_list[5])) | 
				
			|||
 | 
				
			|||
            min_max_value_list = [(float(value_list[0]) - float(value_list[3]) / 2), | 
				
			|||
                                  (float(value_list[1]) - float(value_list[4]) / 2), | 
				
			|||
                                  (float(value_list[2]) - float(value_list[5]) / 2), | 
				
			|||
                                  (float(value_list[0]) + float(value_list[3]) / 2), | 
				
			|||
                                  (float(value_list[1]) + float(value_list[4]) / 2), | 
				
			|||
                                  (float(value_list[2]) + float(value_list[5]) / 2)] | 
				
			|||
 | 
				
			|||
            # These three values represent the length, width, height of a bounding box | 
				
			|||
            dim_list = [float(value_list[3]), float(value_list[4]), float(value_list[5])] | 
				
			|||
 | 
				
			|||
            mat_data = sio.loadmat(current_mat_file_path) | 
				
			|||
            array = mat_data['voxels3D'] | 
				
			|||
            model = {'name': part_name, 'model': array, 'translate_vector': translate_vector, | 
				
			|||
                     'dim_vecetor': dim_list, 'min_max_value': min_max_value_list} | 
				
			|||
            models.append(model) | 
				
			|||
 | 
				
			|||
        model_dict = {'name': cur_file_name, 'model': models} | 
				
			|||
        # self.models.append(model_dict) | 
				
			|||
 | 
				
			|||
        return model_dict | 
				
			|||
 | 
				
			|||
    def open_one_file(self): | 
				
			|||
        self.models_count = 0 | 
				
			|||
        dir_ = QFileDialog.getExistingDirectory(None, 'Select a folder:', '.', QFileDialog.ShowDirsOnly) | 
				
			|||
        self.files.append(dir_) | 
				
			|||
 | 
				
			|||
        model_dict = self.get_object_model(dir_) | 
				
			|||
        self.models.append(model_dict) | 
				
			|||
        self.models_count = 1 | 
				
			|||
        self.current_index = self.current_index + 1 | 
				
			|||
        self.banch = 1 | 
				
			|||
        self.view_model() | 
				
			|||
 | 
				
			|||
    def open_file(self): | 
				
			|||
        self.banch = 8 | 
				
			|||
        self.models_count = 0 | 
				
			|||
        dir_ = QFileDialog.getExistingDirectory(None, 'Select a folder:', '.', QFileDialog.ShowDirsOnly) | 
				
			|||
        for filename in os.listdir(dir_): | 
				
			|||
            self.files.append(dir_ + '/' + filename) | 
				
			|||
        obj_names = [f_path for f_path in os.listdir(dir_) if os.path.isdir(os.path.join(dir_, f_path))] | 
				
			|||
        obj_names.sort() | 
				
			|||
 | 
				
			|||
        # fileList contains all the file pathes beyond a certain category | 
				
			|||
        obj_file_pathes = [os.path.join(dir_, f_path) for f_path in obj_names if os.path.isdir(os.path.join(dir_, f_path))] | 
				
			|||
        self.files = obj_file_pathes | 
				
			|||
 | 
				
			|||
        if obj_names[0].find('iter_') != -1: | 
				
			|||
            def key_word(item): | 
				
			|||
                return int(item.split('_')[-1]) | 
				
			|||
 | 
				
			|||
            self.files.sort(key=key_word) | 
				
			|||
 | 
				
			|||
        for idx in range(0, self.banch): | 
				
			|||
            if (len(self.files) > 0): | 
				
			|||
                obj_file_path = self.files.pop() | 
				
			|||
                obj_file_path = obj_file_path.strip(' \t\n\r') | 
				
			|||
                print( 'current path: ' + obj_file_path) | 
				
			|||
                model_dict = self.get_object_model(obj_file_path) | 
				
			|||
                self.models.append(model_dict) | 
				
			|||
                self.models_count = self.models_count + 1 | 
				
			|||
 | 
				
			|||
        self.current_index = 0 | 
				
			|||
        self.banch = self.models_count | 
				
			|||
        self.view_model() | 
				
			|||
 | 
				
			|||
    # TODO This function is important | 
				
			|||
    def view_model(self): | 
				
			|||
        start = self.current_index | 
				
			|||
        banch = self.banch | 
				
			|||
        end = start + banch | 
				
			|||
 | 
				
			|||
        width = (self.width * 2 / 8) * 0.95 | 
				
			|||
        height = (self.height / 2) * 0.95 | 
				
			|||
        mainWidth = width + 10 | 
				
			|||
        mainHeight = height + 10 | 
				
			|||
        self.setWindowTitle("model_view      models_count:" + str(len(self.files))) | 
				
			|||
 | 
				
			|||
        for index in range(start, end): | 
				
			|||
            if (len(self.models) <= 0): | 
				
			|||
                break | 
				
			|||
            # Obtain one new model to display | 
				
			|||
            model = self.models.pop() | 
				
			|||
            # Update the number of models to show | 
				
			|||
            self.models_count = self.models_count - 1 | 
				
			|||
            # Add one more sub-frame to the main window | 
				
			|||
            self.frame.append(QFrame()) | 
				
			|||
            self.mdi_Win.append(MySubWindow()) | 
				
			|||
            self.mdi_Win[index].opt_engine = ConstrainedOpt(model, index) | 
				
			|||
            self.mdi_Win[index].setWindowTitle("model_" + model['name']) | 
				
			|||
            self.mdi_Win[index].setGeometry(0, 0, mainWidth, mainHeight) | 
				
			|||
 | 
				
			|||
            self.viewerWidget.append( | 
				
			|||
                GUIViewer(self.frame[index], self.mdi_Win[index].opt_engine)) | 
				
			|||
            self.viewerWidget[index].resize(width, height) | 
				
			|||
 | 
				
			|||
            viewerBox = QVBoxLayout() | 
				
			|||
            viewerBox.addWidget(self.viewerWidget[index]) | 
				
			|||
            self.frame[index].setLayout(viewerBox) | 
				
			|||
            self.mdi_Win[index].setWidget(self.frame[index]) | 
				
			|||
 | 
				
			|||
            self.viewerWidget[index].interactor.Initialize() | 
				
			|||
 | 
				
			|||
            self.mdi_Win[index].opt_engine.signal_update_voxels.connect(self.viewerWidget[index].update_actor) | 
				
			|||
            self.mdi_Win[index].signal_save_image.connect(self.viewerWidget[index].save_image2) | 
				
			|||
            self.signal_save_images.connect(self.viewerWidget[index].save_image1) | 
				
			|||
 | 
				
			|||
            self.mdi_Win[index].opt_engine.start() | 
				
			|||
            self.mdi_Area.addSubWindow(self.mdi_Win[index]) | 
				
			|||
            self.mdi_Win[index].show() | 
				
			|||
            print('success') | 
				
			|||
 | 
				
			|||
    # def pre_group(self): | 
				
			|||
    #     self.current_index = self.current_index - self.banch | 
				
			|||
    #     if self.current_index < 0: | 
				
			|||
    #         self.current_index = 0 | 
				
			|||
    #     for i in range(len(self.mdi_Win)): | 
				
			|||
    #         self.mdi_Win[i].close() | 
				
			|||
    #     self.mdi_Win[:] = [] | 
				
			|||
    #     self.frame[:] = [] | 
				
			|||
    #     self.viewerWidget[:] = [] | 
				
			|||
    #     self.view_model() | 
				
			|||
    #     # self.models_count = 0 | 
				
			|||
 | 
				
			|||
    def next_group(self): | 
				
			|||
        self.banch = 8 | 
				
			|||
        for i in range(len(self.mdi_Win)): | 
				
			|||
            self.mdi_Win[i].close() | 
				
			|||
        self.mdi_Win[:] = [] | 
				
			|||
        self.frame[:] = [] | 
				
			|||
        self.viewerWidget[:] = [] | 
				
			|||
        self.models[:] = [] | 
				
			|||
 | 
				
			|||
        for idx in range(0, self.banch): | 
				
			|||
            if (len(self.files) > 0): | 
				
			|||
                file_path = self.files.pop() | 
				
			|||
                print( 'current path: ' + file_path) | 
				
			|||
                file_path = file_path.strip(' \t\n\r') | 
				
			|||
                model_dict = self.get_object_model(file_path) | 
				
			|||
                self.models.append(model_dict) | 
				
			|||
                self.models_count = 1 + self.models_count | 
				
			|||
 | 
				
			|||
        self.current_index = 0 | 
				
			|||
        self.banch = self.models_count | 
				
			|||
        self.view_model() | 
				
			|||
 | 
				
			|||
    def save_group(self): | 
				
			|||
        file_path = QFileDialog.getExistingDirectory(self, "Open a folder", ".", QFileDialog.ShowDirsOnly) | 
				
			|||
        self.signal_save_images.emit(file_path) | 
				
			|||
 | 
				
			|||
    def save_one(self): | 
				
			|||
        self.mdi_Area.currentSubWindow().signal_save_image.emit('save_image') | 
				
			|||
 | 
				
			|||
    def setCamera(self): | 
				
			|||
        self.camerax = float(unicode(self.valuex.text())) | 
				
			|||
        self.cameray = float(unicode(self.valuey.text())) | 
				
			|||
        self.cameraz = float(unicode(self.valuez.text())) | 
				
			|||
        valuex = self.camerax | 
				
			|||
        valuey = self.cameray | 
				
			|||
        valuez = self.cameraz | 
				
			|||
        self.signal_setCamera.emit(valuex, valuey, valuez) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
if __name__ == "__main__": | 
				
			|||
    app = QApplication(sys.argv) | 
				
			|||
    desktopWidget = QApplication.desktop() | 
				
			|||
    screenRect = desktopWidget.screenGeometry() | 
				
			|||
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5()) | 
				
			|||
    window = MainWindow(screenRect.width(),screenRect.height()) | 
				
			|||
    window.setWindowTitle("model_view") | 
				
			|||
    window.show() | 
				
			|||
    sys.exit(app.exec_()) | 
				
			|||
								
									Binary file not shown.
								
							
						
					@ -0,0 +1,312 @@ | 
				
			|||
import vtk | 
				
			|||
from PyQt5.QtWidgets import * | 
				
			|||
# import PyQt5 | 
				
			|||
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor | 
				
			|||
 | 
				
			|||
class Color: | 
				
			|||
    def __init__(self, r, g, b, alpha): | 
				
			|||
        self.r = r | 
				
			|||
        self.g = g | 
				
			|||
        self.b = b | 
				
			|||
        self.a = alpha | 
				
			|||
 | 
				
			|||
class GUIViewer(QVTKRenderWindowInteractor): | 
				
			|||
    def __init__(self, parent, engine): | 
				
			|||
        QVTKRenderWindowInteractor.__init__(self, parent) | 
				
			|||
 | 
				
			|||
        self.part_num = 0 | 
				
			|||
        self.part_list = [] | 
				
			|||
        self.point_list = [] | 
				
			|||
        self.color_list = [] | 
				
			|||
        self.glyph3D_list = [] | 
				
			|||
 | 
				
			|||
        self.engine = engine | 
				
			|||
        self.resetCamera = True | 
				
			|||
        self.renderer = vtk.vtkRenderer() | 
				
			|||
        self.GetRenderWindow().AddRenderer(self.renderer) | 
				
			|||
        self.interactor = self.GetRenderWindow().GetInteractor() | 
				
			|||
        self.create_actor() | 
				
			|||
 | 
				
			|||
        self.renderer.SetBackground(255, 255, 255) | 
				
			|||
        camera = self.renderer.GetActiveCamera() | 
				
			|||
        camera.SetViewUp(0.5, 0, 0) | 
				
			|||
        camera.SetPosition(0.1245, 0.1139, 0.2932) | 
				
			|||
        self.renderer.SetActiveCamera(camera) | 
				
			|||
 | 
				
			|||
        transform = vtk.vtkTransform() | 
				
			|||
        transform.Translate(0.0, 0.0, 0.0) | 
				
			|||
 | 
				
			|||
        axes = vtk.vtkAxesActor() | 
				
			|||
        #  The axes are positioned with a user transform | 
				
			|||
        axes.SetUserTransform(transform) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    def create_voxel(self): | 
				
			|||
        numberOfVertices = 8 | 
				
			|||
 | 
				
			|||
        points = vtk.vtkPoints() | 
				
			|||
        points.InsertNextPoint(0, 0, 0) | 
				
			|||
        points.InsertNextPoint(1, 0, 0) | 
				
			|||
        points.InsertNextPoint(0, 1, 0) | 
				
			|||
        points.InsertNextPoint(1, 1, 0) | 
				
			|||
        points.InsertNextPoint(0, 0, 1) | 
				
			|||
        points.InsertNextPoint(1, 0, 1) | 
				
			|||
        points.InsertNextPoint(0, 1, 1) | 
				
			|||
        points.InsertNextPoint(1, 1, 1) | 
				
			|||
 | 
				
			|||
        voxel = vtk.vtkVoxel() | 
				
			|||
        for i in range(0, numberOfVertices): | 
				
			|||
            voxel.GetPointIds().SetId(i, i) | 
				
			|||
 | 
				
			|||
        ugrid = vtk.vtkUnstructuredGrid() | 
				
			|||
        ugrid.SetPoints(points) | 
				
			|||
        ugrid.InsertNextCell(voxel.GetCellType(), voxel.GetPointIds()) | 
				
			|||
 | 
				
			|||
        gfilter = vtk.vtkGeometryFilter() | 
				
			|||
        gfilter.SetInputData(ugrid) | 
				
			|||
        gfilter.Update() | 
				
			|||
        return gfilter | 
				
			|||
 | 
				
			|||
    def create_actor(self): | 
				
			|||
        self.part_num = len(self.engine.model) | 
				
			|||
        for i in range(self.part_num): | 
				
			|||
            # Set up point_list and color_list | 
				
			|||
            self.point_list.append(vtk.vtkPoints()) | 
				
			|||
            self.color_list.append(vtk.vtkUnsignedCharArray()) | 
				
			|||
            self.color_list[i].SetName("colors") | 
				
			|||
            self.color_list[i].SetNumberOfComponents(4) | 
				
			|||
 | 
				
			|||
            # Create polydata by setting up points information and color information | 
				
			|||
            polydata = vtk.vtkPolyData() | 
				
			|||
            polydata.SetPoints(self.point_list[i]) | 
				
			|||
            polydata.GetPointData().SetScalars(self.color_list[i]) | 
				
			|||
 | 
				
			|||
            # create cell | 
				
			|||
            voxel = self.create_voxel() | 
				
			|||
 | 
				
			|||
            # Set up Glyph3D data representation: color, data representation form, input data and et. | 
				
			|||
            self.glyph3D_list.append(vtk.vtkGlyph3D()) | 
				
			|||
            self.glyph3D_list[i].SetColorModeToColorByScalar() | 
				
			|||
            # self.glyph3D_list[i].SetSource(voxel.GetOutput())       # Set up data representation form | 
				
			|||
            self.glyph3D_list[i].SetSourceConnection(voxel.GetOutputPort())       # Set up data representation form | 
				
			|||
            # self.glyph3D_list[i].SetInput(polydata)     # Set input data | 
				
			|||
            self.glyph3D_list[i].SetInputData(polydata)     # Set input data | 
				
			|||
            self.glyph3D_list[i].ScalingOff() | 
				
			|||
            self.glyph3D_list[i].Update() | 
				
			|||
 | 
				
			|||
            # mapper | 
				
			|||
            mapper = vtk.vtkPolyDataMapper() | 
				
			|||
            # mapper.SetInput(self.glyph3D_list[i].GetOutput()) | 
				
			|||
            mapper.SetInputConnection(self.glyph3D_list[i].GetOutputPort()) | 
				
			|||
 | 
				
			|||
            # actor | 
				
			|||
            actor = vtk.vtkActor() | 
				
			|||
            actor.SetMapper(mapper) | 
				
			|||
            actor.GetProperty() | 
				
			|||
            self.renderer.AddActor(actor) | 
				
			|||
            self.part_list.append(actor) | 
				
			|||
 | 
				
			|||
        transform = vtk.vtkTransform() | 
				
			|||
        transform.Translate(0.0, 0.0, 0.0) | 
				
			|||
        axes = vtk.vtkAxesActor() | 
				
			|||
        #  The axes are positioned with a user transform | 
				
			|||
        axes.SetUserTransform(transform) | 
				
			|||
 | 
				
			|||
        # the actual text of the axis label can be changed: | 
				
			|||
        axes.SetXAxisLabelText("") | 
				
			|||
        axes.SetYAxisLabelText("") | 
				
			|||
        axes.SetZAxisLabelText("") | 
				
			|||
 | 
				
			|||
        # self.renderer.AddActor(axes) | 
				
			|||
 | 
				
			|||
    def set_bb_color(self, model, ind, n, x_zero_index, y_zero_index, z_zero_index, r, g, b): | 
				
			|||
        # alpha = 255 | 
				
			|||
        alpha = 173 | 
				
			|||
        for i in range(len(model[0])): | 
				
			|||
            self.point_list[ind].InsertNextPoint(0 - x_zero_index, 0 - y_zero_index, i - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n, r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(0 - x_zero_index, len(model[0]) - y_zero_index, i - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n, r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(len(model[0]) - x_zero_index, 0 - y_zero_index, i - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n, r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(len(model[0]) - x_zero_index, len(model[0]) - y_zero_index, | 
				
			|||
                                                 i - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(0 - x_zero_index, i - y_zero_index, 0 - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(0 - x_zero_index, i - y_zero_index, len(model[0]) - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(len(model[0]) - x_zero_index, i - y_zero_index, 0 - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(len(model[0]) - x_zero_index, i - y_zero_index, | 
				
			|||
                                                 len(model[0]) - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(i - x_zero_index, 0 - y_zero_index, 0 - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n, r, g, b, alpha) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(i - x_zero_index, 0 - y_zero_index, len(model[0]) - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, 173) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(i - x_zero_index, len(model[0]) - y_zero_index, 0 - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, 173) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
            self.point_list[ind].InsertNextPoint(i - x_zero_index, len(model[0]) - y_zero_index, | 
				
			|||
                                                 len(model[0]) - z_zero_index) | 
				
			|||
            self.color_list[ind].InsertTuple4(n,  r, g, b, 173) | 
				
			|||
            n = n + 1 | 
				
			|||
 | 
				
			|||
    def update_actor(self): | 
				
			|||
        models = self.engine.model | 
				
			|||
 | 
				
			|||
        colors = [] | 
				
			|||
        colors.append(Color(241, 95, 45, 255))  # 0 | 
				
			|||
        # colors.append(Color(246, 102, 39, 255)) # .........if(chair_2_legs),open this.......... # | 
				
			|||
        colors.append(Color(0, 202, 122, 255))  # 1 | 
				
			|||
        colors.append(Color(0, 141, 237, 255))  # 2 | 
				
			|||
        colors.append(Color(36, 160, 191, 255))  # 3 | 
				
			|||
        colors.append(Color(255, 130, 58, 255))  # 4 | 
				
			|||
        colors.append(Color(140, 255, 128, 255))  # 5 | 
				
			|||
 | 
				
			|||
        for ind in range(len(models)): | 
				
			|||
            self.point_list[ind].Reset() | 
				
			|||
            self.color_list[ind].Reset() | 
				
			|||
 | 
				
			|||
            model = models[ind]['model'] | 
				
			|||
 | 
				
			|||
            part_name = models[ind]['name'] | 
				
			|||
            part_label = int(part_name[-1]) | 
				
			|||
 | 
				
			|||
            translate_vector = models[ind]['translate_vector'] | 
				
			|||
            dims_vector = models[ind]['dim_vecetor'] | 
				
			|||
 | 
				
			|||
            x_zero_index = 0 | 
				
			|||
            y_zero_index = 0 | 
				
			|||
            z_zero_index = 0 | 
				
			|||
 | 
				
			|||
            print( len(model[0]), len(model[0]), len(model[0])) | 
				
			|||
            n = 0 | 
				
			|||
            for i in range(len(model[0])): | 
				
			|||
                for j in range(len(model[1])): | 
				
			|||
                    for k in range(len(model[2])): | 
				
			|||
                        c = model[i, j, k] | 
				
			|||
                        if c > 0.5: | 
				
			|||
                            if part_label == 0: | 
				
			|||
                                self.point_list[ind].InsertNextPoint(i - x_zero_index, j - y_zero_index, | 
				
			|||
                                                                     k - z_zero_index) | 
				
			|||
                                self.color_list[ind].InsertTuple4(n, 241, 95, 45, 200) | 
				
			|||
                            if part_label == 1: | 
				
			|||
                                self.point_list[ind].InsertNextPoint(i - x_zero_index, j - y_zero_index, | 
				
			|||
                                                                     k - z_zero_index) | 
				
			|||
                                self.color_list[ind].InsertTuple4(n, 0, 202, 122, 200) | 
				
			|||
                            if part_label == 2: | 
				
			|||
                                self.point_list[ind].InsertNextPoint(i - x_zero_index, j - y_zero_index, | 
				
			|||
                                                                     k - z_zero_index) | 
				
			|||
                                self.color_list[ind].InsertTuple4(n, 0, 141, 237, 200) | 
				
			|||
                            if part_label == 3: | 
				
			|||
                                self.point_list[ind].InsertNextPoint(i - x_zero_index, j - y_zero_index, | 
				
			|||
                                                                     k - z_zero_index) | 
				
			|||
                                self.color_list[ind].InsertTuple4(n, 36, 160, 191, 200) | 
				
			|||
                            if part_label == 4: | 
				
			|||
                                self.point_list[ind].InsertNextPoint(i - x_zero_index, j - y_zero_index, | 
				
			|||
                                                                     k - z_zero_index) | 
				
			|||
                                self.color_list[ind].InsertTuple4(n, 255, 130, 58, 200) | 
				
			|||
                            if part_label == 5: | 
				
			|||
                                self.point_list[ind].InsertNextPoint(i - x_zero_index, j - y_zero_index, | 
				
			|||
                                                                     k - z_zero_index) | 
				
			|||
                                self.color_list[ind].InsertTuple4(n, 140, 255, 128, 200) | 
				
			|||
                            if part_label == 6: | 
				
			|||
                                self.point_list[ind].InsertNextPoint(i - x_zero_index, j - y_zero_index, | 
				
			|||
                                                                     k - z_zero_index) | 
				
			|||
                                self.color_list[ind].InsertTuple4(n, 200, 240, 255, 200) | 
				
			|||
                            n = n + 1 | 
				
			|||
                        pass | 
				
			|||
 | 
				
			|||
            self.set_bb_color(model, ind, n, x_zero_index, y_zero_index, z_zero_index, colors[part_label].r, colors[part_label].g, colors[part_label].b) | 
				
			|||
 | 
				
			|||
            trans = vtk.vtkTransform() | 
				
			|||
            transformMatrix = vtk.vtkMatrix4x4() | 
				
			|||
            for i in range(0, 4): | 
				
			|||
                for j in range(0, 4): | 
				
			|||
                    if i == j and (i == 1 or i == 2 or i == 0): | 
				
			|||
                        transformMatrix.SetElement(i, j, float(dims_vector[i]) / 32.0) | 
				
			|||
                    elif j == 3 and i <= 2: | 
				
			|||
                        transformMatrix.SetElement(i, j, float(translate_vector[i]) - float(dims_vector[i]) / 2) | 
				
			|||
                    elif i == 3 and j == 3: | 
				
			|||
                        transformMatrix.SetElement(i, j, 1) | 
				
			|||
                    elif i == 3 and j <= 2: | 
				
			|||
                        transformMatrix.SetElement(i, j, 0) | 
				
			|||
            trans.SetMatrix(transformMatrix) | 
				
			|||
            self.part_list[ind].SetUserTransform(trans) | 
				
			|||
 | 
				
			|||
            print( translate_vector[0], translate_vector[1], translate_vector[2]) | 
				
			|||
 | 
				
			|||
            print( "part index: %r center: %r" % (ind, self.part_list[ind].GetCenter())) | 
				
			|||
            print( "part index: %r position: %r" % (ind, self.part_list[ind].GetPosition())) | 
				
			|||
            print( "part index: %r xRange: %r" % (ind, self.part_list[ind].GetXRange())) | 
				
			|||
            print( "part index: %r length: %r" % (ind, self.part_list[ind].GetLength())) | 
				
			|||
            print( "part index: %r translate_vector: %r" % (ind, translate_vector)) | 
				
			|||
            print( "part index: %r dims_vector: %r" % (ind, dims_vector)) | 
				
			|||
 | 
				
			|||
        # self.glyph3D.Modified() | 
				
			|||
        for i in range(len(self.glyph3D_list)): | 
				
			|||
            self.glyph3D_list[i].Modified() | 
				
			|||
 | 
				
			|||
        if self.resetCamera: | 
				
			|||
            self.renderer.ResetCamera() | 
				
			|||
 | 
				
			|||
            self.resetCamera = False | 
				
			|||
        self.update() | 
				
			|||
        QApplication.processEvents() | 
				
			|||
 | 
				
			|||
        for i in range(len(self.part_list)): | 
				
			|||
            print( self.part_list[i].GetPosition()) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    def save_image2(self): | 
				
			|||
        file_path = QFileDialog.getSaveFileName(self, "saveFlle", str(self.engine.name) + ".png", | 
				
			|||
                                                filter="png (*.png *.)") | 
				
			|||
        current_file_path = file_path[0] | 
				
			|||
        window_to_image_filter = vtk.vtkWindowToImageFilter() | 
				
			|||
        # window_to_image_filter.SetInput(self.GetRenderWindow()) | 
				
			|||
        window_to_image_filter.SetInput(self.GetRenderWindow()) | 
				
			|||
        window_to_image_filter.Update() | 
				
			|||
        writer = vtk.vtkPNGWriter() | 
				
			|||
        # # writer.SetFileName(unicode(current_file_path)) | 
				
			|||
        writer.SetFileName(str(current_file_path)) | 
				
			|||
        writer.SetInputConnection(window_to_image_filter.GetOutputPort()) | 
				
			|||
        writer.Write() | 
				
			|||
 | 
				
			|||
    def save_image1(self, file_path): | 
				
			|||
        window_to_image_filter = vtk.vtkWindowToImageFilter() | 
				
			|||
        # window_to_image_filter.SetInput(self.GetRenderWindow()) | 
				
			|||
        window_to_image_filter.SetInput(self.GetRenderWindow()) | 
				
			|||
        window_to_image_filter.Update() | 
				
			|||
        writer = vtk.vtkPNGWriter() | 
				
			|||
        # writer.SetFileName(unicode(file_path) + '/image_' + str(self.engine.index) + '.png') | 
				
			|||
        writer.SetFileName(str(file_path) + '/image_' + str(self.engine.index) + '.png') | 
				
			|||
        writer.SetInputConnection(window_to_image_filter.GetOutputPort()) | 
				
			|||
        writer.Write() | 
				
			|||
 | 
				
			|||
    def set_camera(self, x, y, z): | 
				
			|||
        camera = self.renderer.GetActiveCamera() | 
				
			|||
        camera.SetViewUp(x, y, z) | 
				
			|||
        self.renderer.SetActiveCamera(camera) | 
				
			|||
					Loading…
					
					
				
		Reference in new issue