def createScene(self): # Root entity self.rootEntity = Qt3DCore.QEntity() # Material self.material = Qt3DExtras.QPhongMaterial(self.rootEntity) # Torus self.torusEntity = Qt3DCore.QEntity(self.rootEntity) self.torusMesh = Qt3DExtras.QTorusMesh() self.torusMesh.setRadius(5) self.torusMesh.setMinorRadius(1) self.torusMesh.setRings(100) self.torusMesh.setSlices(20) self.torusTransform = Qt3DCore.QTransform() self.torusTransform.setScale3D(QVector3D(1.5, 1, 0.5)) self.torusTransform.setRotation(QQuaternion.fromAxisAndAngle(QVector3D(1, 0, 0), 45)) self.torusEntity.addComponent(self.torusMesh) self.torusEntity.addComponent(self.torusTransform) self.torusEntity.addComponent(self.material) # Sphere self.sphereEntity = Qt3DCore.QEntity(self.rootEntity) self.sphereMesh = Qt3DExtras.QSphereMesh() self.sphereMesh.setRadius(3) self.sphereTransform = Qt3DCore.QTransform() self.controller = OrbitTransformController(self.sphereTransform) self.controller.setTarget(self.sphereTransform) self.controller.setRadius(20) self.sphereRotateTransformAnimation = QPropertyAnimation(self.sphereTransform) self.sphereRotateTransformAnimation.setTargetObject(self.controller) self.sphereRotateTransformAnimation.setPropertyName(b"angle") self.sphereRotateTransformAnimation.setStartValue(0) self.sphereRotateTransformAnimation.setEndValue(360) self.sphereRotateTransformAnimation.setDuration(10000) self.sphereRotateTransformAnimation.setLoopCount(-1) self.sphereRotateTransformAnimation.start() self.sphereEntity.addComponent(self.sphereMesh) self.sphereEntity.addComponent(self.sphereTransform) self.sphereEntity.addComponent(self.material)
def __init__(self, view: Qt3DExtras.Qt3DWindow) -> None: """ Initialize a new instance. Args: view: where to render the planetary sphere. """ self.root_entity = Qt3DCore.QEntity() ce = self.camera_entity = view.camera() ce.lens().setPerspectiveProjection(45.0, 1.0, 0.1, 1000.0) ce.setPosition(V3(0, 8, 8)) ce.setUpVector(V3(0, 1, 0)) ce.setViewCenter(V3(0, 0, 0)) self.light = Qt3DCore.QEntity(self.root_entity) self.point_light = Qt3DRender.QPointLight(self.light) self.point_light.setColor("white") self.point_light.setIntensity(1.0) self.light.addComponent(self.point_light) # Move the light to the camera's position - on-camera 'flash'! t = self.light_transform = Qt3DCore.QTransform(self.light) t.setTranslation(ce.position()) self.light.addComponent(t) self.mesh = Qt3DExtras.QSphereMesh() self.mesh.setRings(30) self.mesh.setSlices(30) self.mesh.setRadius(2) t = self.transform = Qt3DCore.QTransform() t.setScale(1.3) t.setTranslation(V3(0.0, 0.0, 0.0)) m = self.material = Qt3DExtras.QDiffuseSpecularMaterial() m.setAmbient(QColor(200, 200, 255)) m.setShininess(20.0) self.entity = Qt3DCore.QEntity(self.root_entity) self.entity.addComponent(self.mesh) self.entity.addComponent(self.material) self.entity.addComponent(self.transform) view.setRootEntity(self.root_entity) self.entity.setEnabled(True)
def _setup_neutrons(self): neutron_radius = 0.1 for i in range(self._num_neutrons): mesh = Qt3DExtras.QSphereMesh(self.root_entity) mesh.setRadius(neutron_radius) transform = Qt3DCore.QTransform(self.root_entity) transform.setMatrix( self._get_sphere_transformation_matrix( self._neutron_offsets[i])) neutron_material = create_material(QColor("black"), QColor("grey"), self.root_entity) entity = create_qentity([mesh, neutron_material, transform], self.root_entity) self.entities.append(( entity, self._get_sphere_transformation_matrix( self._neutron_offsets[i]), ))
def add_sphere(self, radius, x, y, z, rings=10, slices=10): sphereEntity = Qt3DCore.QEntity(self.rootEntity) # Mesh sphereMesh = Qt3DExtras.QSphereMesh() sphereMesh.setRadius(radius) sphereMesh.setRings(rings) sphereMesh.setSlices(slices) # Transforms sphereTransform = Qt3DCore.QTransform() sphereTransform.setTranslation(QVector3D(x, y, z)) sphereEntity.addComponent(sphereMesh) sphereEntity.addComponent(self.material) sphereEntity.addComponent(sphereTransform) self.spheres.append(sphereEntity) self.meshes.append(sphereMesh) self.transforms.append(sphereTransform)
def createScene(self): # Root entity self.rootEntity = Qt3DCore.QEntity() # Material self.material = Qt3DExtras.QPhongMaterial(self.rootEntity) # Torus self.torusEntity = Qt3DCore.QEntity(self.rootEntity) self.torusMesh = Qt3DExtras.QTorusMesh() self.torusMesh.setRadius(5) self.torusMesh.setMinorRadius(1) self.torusMesh.setRings(100) self.torusMesh.setSlices(20) self.torusTransform = Qt3DCore.QTransform() self.torusTransform.setScale3D(QVector3D(1.5, 1, 0.5)) self.torusTransform.setRotation( QQuaternion.fromAxisAndAngle(QVector3D(1, 0, 0), 45)) self.torusEntity.addComponent(self.torusMesh) self.torusEntity.addComponent(self.torusTransform) self.torusEntity.addComponent(self.material) # Sphere self.sphereEntity = Qt3DCore.QEntity(self.rootEntity) self.sphereMesh = Qt3DExtras.QSphereMesh() self.sphereMesh.setRadius(3) self.sphereTransform = Qt3DCore.QTransform() self.controller = OrbitTransformController(self.sphereTransform) self.controller.setTarget(self.sphereTransform) self.controller.setRadius(20) self.sphereEntity.addComponent(self.sphereMesh) self.sphereEntity.addComponent(self.sphereTransform) self.sphereEntity.addComponent(self.material)
def __init__(self): super(Sphere, self).__init__() self._type = ComponentType.Sphere self._component = Qt3DExtras.QSphereMesh() self._component.setRadius(5)
def __init__(self, parent, fs_subject="sample"): super(MeshDisplayWidget, self).__init__(parent) self.config = parent.config self.fs_subject = fs_subject self.view = Qt3DExtras.Qt3DWindow() self.view.defaultFrameGraph().setClearColor(QtGui.QColor("#4d4d4f")) self.container = QtWidgets.QWidget.createWindowContainer(self.view, self) screen_size = self.view.screen().size() self.container.setMinimumSize(QtCore.QSize(600, 100)) self.container.setMaximumSize(screen_size) #h_layout = QtWidgets.QHBoxLayout(self) #h_layout.addWidget(self.container) self.addWidget(self.container) self.tableView = QtWidgets.QTableView(self) self.tableView.setObjectName("tableView") v_layout = QtWidgets.QVBoxLayout() v_layout.addWidget(self.tableView) self.overlay_btn = QtWidgets.QPushButton("Update and overlay digitized points") self.overlay_btn.clicked.connect(self.update_acquisition_overlay) v_layout.addWidget(self.overlay_btn) subject_name_layout = QtWidgets.QHBoxLayout() subject_name_layout.addWidget(QtWidgets.QLabel("Subject name:")) self.subject_name_wgt = QtWidgets.QComboBox() subject_name_layout.addWidget(self.subject_name_wgt) self.new_subject_wgt = QtWidgets.QPushButton("New subject") self.new_subject_wgt.clicked.connect(self.new_subject) subject_name_layout.addWidget(self.new_subject_wgt) self.mute_sound_wgt = QtWidgets.QCheckBox("Mute sound") subject_name_layout.addWidget(self.mute_sound_wgt) v_layout.addLayout(subject_name_layout) if "subject_dir" not in self.config["DEFAULT"]: self.config["DEFAULT"]["subject_dir"] = str(Path(__file__).parent.absolute() / "subjects_data") subject_dir_layout = QtWidgets.QHBoxLayout() subject_dir_layout.addWidget(QtWidgets.QLabel("Subject dir:")) self.subject_dir_wgt = QtWidgets.QLineEdit(self.config["DEFAULT"]["subject_dir"]) self.subject_dir_wgt.setReadOnly(False) subject_dir_layout.addWidget(self.subject_dir_wgt) select_subject_dir_btn = QtWidgets.QPushButton("...") subject_dir_layout.addWidget(select_subject_dir_btn) select_subject_dir_btn.clicked.connect(self.open_subject_dir_dlg) v_layout.addLayout(subject_dir_layout) self.subject_dir_wgt.textChanged.connect(self.set_subject_dir) if not Path(self.config["DEFAULT"]["subject_dir"]).exists(): msgBox = QtWidgets.QMessageBox() msgBox.setIcon(QtWidgets.QMessageBox.Information) msgBox.setText(f"The chosen subject directory (i.e. {self.config['DEFAULT']['subject_dir']}) does not " "exist. Do you want to create it or to select a new directory?") msgBox.setWindowTitle("Non-existent subject directory") button_create = msgBox.addButton("Create it!", QtWidgets.QMessageBox.YesRole); msgBox.addButton("Select a different directory", QtWidgets.QMessageBox.NoRole) msgBox.exec_() if msgBox.clickedButton() == button_create: Path(self.config["DEFAULT"]["subject_dir"]).mkdir(exist_ok=True, parents=True) else: self.open_subject_dir_dlg() #h_layout.addLayout(v_layout) v_layout_widget = QtWidgets.QWidget(self) v_layout_widget.setLayout(v_layout) self.addWidget(v_layout_widget) self.data = QtCore.QUrl.fromLocalFile(str(Path(__file__).parent.absolute() / f"{self.fs_subject}_head.obj")) self.root_entity = Qt3DCore.QEntity() self.material = Qt3DExtras.QPhongMaterial() self.material.setDiffuse(QtGui.QColor(254, 254, 254)) self.camera = self.view.camera() self.camera.lens().setPerspectiveProjection(400.0, 16.0/9.0, 100, 1200.0) self.camera.setPosition(QtGui.QVector3D(0, 500, 0)) self.camera.setUpVector(QtGui.QVector3D(0, 0, 1)) self.lightEntities = {} self.lights = {} self.lightTransforms = {} for trans_x in [200, -200]: for trans_y in [200, -200]: self.lightEntities[(trans_x, trans_y)] = Qt3DCore.QEntity(self.root_entity) self.lights[(trans_x, trans_y)] = Qt3DRender.QPointLight(self.lightEntities[(trans_x, trans_y)]) self.lights[(trans_x, trans_y)].setColor("white") self.lights[(trans_x, trans_y)].setIntensity(0.4) self.lightEntities[(trans_x, trans_y)].addComponent(self.lights[(trans_x, trans_y)]) self.lightTransforms[(trans_x, trans_y)] = Qt3DCore.QTransform(self.lightEntities[(trans_x, trans_y)]) self.lightTransforms[(trans_x, trans_y)].setTranslation(QtGui.QVector3D(trans_x, trans_y, 100.0)) self.lightEntities[(trans_x, trans_y)].addComponent(self.lightTransforms[(trans_x, trans_y)]) # Get co-registered head, fiducials and electrodes data_path = Path(mne.datasets.sample.data_path()) fs_subjects_dir = data_path / 'subjects' trans_fname = data_path / 'MEG' / 'sample' / 'sample_audvis_raw-trans.fif' trans = mne.read_trans(trans_fname) montage = mne.channels.make_standard_montage('GSN-HydroCel-129') info = mne.create_info(montage.ch_names, 100, ch_types='eeg') raw = mne.io.RawArray(np.zeros((len(montage.ch_names), 100)), info) raw.set_montage(montage) eeg, fid, surf = get_aligned_artifacts(raw.info, subject=self.fs_subject, trans=trans, subjects_dir=fs_subjects_dir, coord_frame='mri') self.head_surf = surf path_out = Path(str(Path(__file__).parent.absolute() / f"{self.fs_subject}_head.obj")) if True: #not path_out.exists(): mesh = trimesh.Trimesh(surf["rr"] * 1000, surf["tris"]) open3d_mesh = open3d.geometry.TriangleMesh(vertices=open3d.utility.Vector3dVector(mesh.vertices), triangles=open3d.utility.Vector3iVector(mesh.faces)) mesh = open3d_mesh.simplify_quadric_decimation(int(20000)) mesh = trimesh.Trimesh(np.asarray(mesh.vertices), np.asarray(mesh.triangles)) with path_out.open('w') as file_obj: file_obj.write(trimesh.exchange.obj.export_obj(mesh)) # Head self.data = QtCore.QUrl.fromLocalFile(str(path_out)) self.head_entity = Qt3DCore.QEntity(self.root_entity) self.head_mesh = Qt3DRender.QMesh() self.head_mesh.setMeshName(str(path_out)) self.head_mesh.setSource(self.data) self.head_entity.addComponent(self.head_mesh) self.head_entity.addComponent(self.material) self.camController = Qt3DExtras.QOrbitCameraController(self.head_mesh) self.camController.setCamera(self.camera) self.camController.setLinearSpeed(self.camController.linearSpeed()*100) self.mesh_center_of_mass = np.median(surf['rr'], 0)*1000 self.camera.setViewCenter(QtGui.QVector3D(*(self.mesh_center_of_mass))) self.camera.viewCenterChanged.connect(self.cam_view_center_changed) ## EEG electrodes and Fiducials self.electrode_material = Qt3DExtras.QPhongMaterial(diffuse=QtGui.QColor("#665423")) self.fid_material = Qt3DExtras.QPhongMaterial(diffuse=QtGui.QColor("#0000FF")) self.selected_material = Qt3DExtras.QPhongMaterial(diffuse=QtGui.QColor("#FF0000")) self.edited_material = Qt3DExtras.QPhongMaterial(diffuse=QtGui.QColor("#FFFF00")) self.acq_material = Qt3DExtras.QPhongMaterial(diffuse=QtGui.QColor("#00FF00")) self.selected_item = None self.coordinate_meshes = {} self.coordinate_entities = {} self.coordinate_transforms = {} self.coordinate_materials = {} for kind, var in zip(["fid", "elec"], [fid, eeg]): for label, pos in var.iterrows(): pos = pos.values*1000 self.coordinate_meshes[label] = Qt3DExtras.QSphereMesh(rings=20, slices=20, radius=3) self.coordinate_entities[label] = Qt3DCore.QEntity(self.root_entity) self.coordinate_transforms[label] = Qt3DCore.QTransform(self.coordinate_meshes[label]) self.coordinate_transforms[label].setTranslation(QtGui.QVector3D(*pos)) self.coordinate_entities[label].addComponent(self.coordinate_meshes[label]) self.coordinate_entities[label].addComponent(self.coordinate_transforms[label]) self.acq_coordinate_meshes = {} self.acq_coordinate_entities = {} self.acq_coordinate_transforms = {} self.df_montage = pd.concat([fid, eeg]) self.df_montage.columns = ["x", "y", "z"] self.df_acq = pd.concat([self.df_montage.copy().rename(columns={"x": f"x{i+1}", "y": f"y{i+1}", "z": f"z{i+1}"}) for i in range(4)], axis=1) model = DataFrameModel(self.df_acq) self.tableView.setModel(model) self.df_acq.loc[:, :] = np.nan self.set_table_view_selection(0) self.view.setRootEntity(self.root_entity) self.subject_name_wgt.currentTextChanged.connect(self.load_subject) self.update_subject_lst()