class UIOpenCvBaseNode(UINodeBase): def __init__(self, raw_node): super(UIOpenCvBaseNode, self).__init__(raw_node) self.imagePin = self._rawNode.getPinByName("img") if not self.imagePin: for pin in self._rawNode.outputs.values(): if pin.dataType == "ImagePin": self.imagePin = pin break if self.imagePin: self.actionViewImage = self._menu.addAction("ViewImage") self.actionViewImage.triggered.connect(self.viewImage) self.actionViewImage.setData( NodeActionButtonInfo( os.path.dirname(__file__) + "/resources/ojo.svg", ViewImageNodeActionButton)) self.actionRefreshImage = self._menu.addAction( "RefreshCurrentNode") self.actionRefreshImage.triggered.connect(self.refreshImage) self.actionRefreshImage.setData( NodeActionButtonInfo( os.path.dirname(__file__) + "/resources/reload.svg", NodeActionButtonBase)) self.displayImage = False self.resizable = True self.Imagelabel = QLabel("noImage") self.pixmap = QtGui.QPixmap() self.addWidget(self.Imagelabel) self.Imagelabel.setVisible(False) self.updateSize() self._rawNode.computed.connect(self.updateImage) @property def collapsed(self): return self._collapsed @collapsed.setter def collapsed(self, bCollapsed): if bCollapsed != self._collapsed: self._collapsed = bCollapsed self.aboutToCollapse(self._collapsed) for i in range(0, self.inputsLayout.count()): inp = self.inputsLayout.itemAt(i) inp.setVisible(not bCollapsed) for o in range(0, self.outputsLayout.count()): out = self.outputsLayout.itemAt(o) out.setVisible(not bCollapsed) for cust in range(0, self.customLayout.count()): out = self.customLayout.itemAt(cust) out.setVisible(not bCollapsed) if not self.displayImage: self.Imagelabel.setVisible(False) self.updateNodeShape() def updateImage(self, *args, **kwargs): if self.displayImage and not self.collapsed: if self.imagePin: img = self.imagePin.getData() self.setNumpyArray(img.image) def refreshImage(self): if self.imagePin: self._rawNode.processNode() if self.displayImage and not self.collapsed: if self.imagePin: img = self.imagePin.getData() self.setNumpyArray(img.image) self.Imagelabel.setVisible(True) else: self.Imagelabel.setVisible(False) def viewImage(self): self.displayImage = not self.displayImage self.refreshImage() self.updateNodeShape() self.updateSize() def setNumpyArray(self, image): if image.__class__.__name__ == "UMat": image = cv2.UMat.get(image) image = toQImage(image) self.pixmap = QtGui.QPixmap.fromImage(image, QtCore.Qt.ThresholdAlphaDither) self.updateSize() def paint(self, painter, option, widget): self.updateSize() super(UIOpenCvBaseNode, self).paint(painter, option, widget) def updateSize(self): if not self.pixmap.isNull(): scaledPixmap = self.pixmap.scaledToWidth( self.customLayout.geometry().width()) self.Imagelabel.setMaximumWidth( self.customLayout.geometry().width()) self.Imagelabel.setPixmap(scaledPixmap) def updateNodeShape(self): super(UIOpenCvBaseNode, self).updateNodeShape() self.updateSize() self.update()
class Second(QMainWindow): def __init__(self): super(Second, self).__init__() self.setWindowTitle("Add new device") self.nameLabel = QLabel(self) self.nameLabel.move(10, 10) self.nameLabel.setText("Device name") self.nameEntry = QLineEdit(self) self.nameEntry.move(10, 40) self.nameEntry.resize(100, 30) self.colorLabel = QLabel(self) self.colorLabel.move(120, 10) self.colorLabel.setText("Color cameras") self.colorEntry = QLineEdit(self) self.colorEntry.move(140, 40) self.colorEntry.resize(70, 30) self.colorEntry.setValidator(QtGui.QIntValidator()) self.monoLabel = QLabel(self) self.monoLabel.move(230, 10) self.monoLabel.setText("Mono cameras") self.monoEntry = QLineEdit(self) self.monoEntry.move(250, 40) self.monoEntry.resize(70, 30) self.monoEntry.setValidator(QtGui.QIntValidator()) self.depthPresent = QCheckBox("Include depth", self) self.depthPresent.move(10, 80) self.depthPresent.resize(150, 30) self.depthPresent.stateChanged.connect(self.toggle_depth) self.leftfovLabel = QLabel(self) self.leftfovLabel.move(10, 120) self.leftfovLabel.setText("Left FOV deg.") self.leftfovEntry = QLineEdit(self) self.leftfovEntry.move(180, 120) self.leftfovEntry.resize(140, 30) self.leftfovEntry.setValidator(QtGui.QDoubleValidator()) self.rightfovLabel = QLabel(self) self.rightfovLabel.move(10, 160) self.rightfovLabel.setText("Right FOV deg.") self.rightfovEntry = QLineEdit(self) self.rightfovEntry.move(180, 160) self.rightfovEntry.resize(140, 30) self.rightfovEntry.setValidator(QtGui.QDoubleValidator()) self.rgbfovLabel = QLabel(self) self.rgbfovLabel.move(10, 200) self.rgbfovLabel.setText("RGB FOV deg.") self.rgbfovEntry = QLineEdit(self) self.rgbfovEntry.move(180, 200) self.rgbfovEntry.resize(140, 30) self.rgbfovEntry.setValidator(QtGui.QDoubleValidator()) self.lrdistanceLabel = QLabel(self) self.lrdistanceLabel.move(10, 240) self.lrdistanceLabel.resize(200, 30) self.lrdistanceLabel.setText("Left - Right distance cm.") self.lrdistanceEntry = QLineEdit(self) self.lrdistanceEntry.move(180, 240) self.lrdistanceEntry.resize(140, 30) self.lrdistanceEntry.setValidator(QtGui.QDoubleValidator()) self.lrgbdistanceLabel = QLabel(self) self.lrgbdistanceLabel.move(10, 280) self.lrgbdistanceLabel.resize(200, 30) self.lrgbdistanceLabel.setText("Left - RGB distance cm.") self.lrgbdistanceEntry = QLineEdit(self) self.lrgbdistanceEntry.move(180, 280) self.lrgbdistanceEntry.resize(140, 30) self.lrgbdistanceEntry.setValidator(QtGui.QDoubleValidator()) self.saveButton = QPushButton("Save", self) self.saveButton.resize(100, 30) self.saveButton.clicked.connect(self.save) self.cancelButton = QPushButton("Cancel", self) self.cancelButton.resize(100, 30) self.cancelButton.clicked.connect(self.cancel) self.toggle_depth(False) def toggle_depth(self, checked): if checked: self.leftfovLabel.setVisible(True) self.leftfovEntry.setVisible(True) self.rightfovLabel.setVisible(True) self.rightfovEntry.setVisible(True) self.rgbfovLabel.setVisible(True) self.rgbfovEntry.setVisible(True) self.lrdistanceLabel.setVisible(True) self.lrdistanceEntry.setVisible(True) self.lrgbdistanceLabel.setVisible(True) self.lrgbdistanceEntry.setVisible(True) self.saveButton.move(200, 330) self.cancelButton.move(30, 330) self.resize(330, 380) else: self.leftfovLabel.setVisible(False) self.leftfovEntry.setVisible(False) self.rightfovLabel.setVisible(False) self.rightfovEntry.setVisible(False) self.rgbfovLabel.setVisible(False) self.rgbfovEntry.setVisible(False) self.lrdistanceLabel.setVisible(False) self.lrdistanceEntry.setVisible(False) self.lrgbdistanceLabel.setVisible(False) self.lrgbdistanceEntry.setVisible(False) self.saveButton.move(200, 120) self.cancelButton.move(30, 120) self.resize(330, 170) def save(self, *args, **kwargs): try: data = { "name": self.nameEntry.text(), "color_count": int(self.colorEntry.text()), "mono_count": int(self.monoEntry.text()), } if self.depthPresent.isChecked(): data.update({ "depth": True, "left_fov_deg": float(self.leftfovEntry.text()), "right_fov_deg": float(self.rightfovEntry.text()), "rgb_fov_deg": float(self.rgbfovEntry.text()), "left_to_right_distance_cm": float(self.lrdistanceEntry.text()), "left_to_rgb_distance_cm": float(self.lrgbdistanceEntry.text()), }) append_to_json( data, Path(__file__).parent.parent / Path('custom_devices.json')) self.close() INITIALIZE() self.instance.getRegisteredTools(['NodeBoxTool'])[0].refresh() except Exception as e: QMessageBox.warning(self, "Warning", str(e)) def cancel(self): self.close()
class MetaCard(base.BaseWidget, object): def __init__(self, extra=False, parent=None): self._extra = extra super(MetaCard, self).__init__(parent=parent) self.setAttribute(Qt.WA_StyledBackground) # ================================================================================================================= # OVERRIDES # ================================================================================================================= def get_main_layout(self): main_layout = layouts.VerticalLayout(spacing=0, margins=(1, 1, 1, 1)) return main_layout def ui(self): super(MetaCard, self).ui() self._title_layout = layouts.HorizontalLayout() self._cover_label = QLabel() self._cover_label.setFixedSize(QSize(200, 200)) self._avatar = avatar.Avatar() self._title_label = label.BaseLabel().h4() self._description_label = label.BaseLabel().secondary() self._description_label.setWordWrap(True) self._description_label.theme_elide_mode = Qt.ElideRight self._extra_btn = buttons.BaseToolButton( parent=self).image('more').icon_only() self._title_layout.addWidget(self._title_label) self._title_layout.addStretch() self._title_layout.addWidget(self._extra_btn) self._extra_btn.setVisible(self._extra) content_lyt = layouts.FormLayout(margins=(5, 5, 5, 5)) content_lyt.addRow(self._avatar, self._title_layout) content_lyt.addRow(self._description_label) self._btn_lyt = layouts.HorizontalLayout() self.main_layout.addWidget(self._cover_label) self.main_layout.addLayout(content_lyt) self.main_layout.addLayout(self._btn_lyt) self.main_layout.addStretch() # ================================================================================================================= # BASE # ================================================================================================================= def get_more_button(self): """ Returns more button :return: buttons.BaseToolButton """ return self._extra_button def setup_data(self, data_dict): if data_dict.get('title'): self._title_label.setText(data_dict.get('title')) self._title_label.setVisible(True) else: self._title_label.setVisible(False) if data_dict.get('description'): self._description_label.setText(data_dict.get('description')) self._description_label.setVisible(True) else: self._description_label.setVisible(False) if data_dict.get('avatar'): self._avatar.image = data_dict.get('avatar') self._avatar.setVisible(True) else: self._avatar.setVisible(False) if data_dict.get('cover'): fixed_height = self._cover_label.width() self._cover_label.setPixmap( data_dict.get('cover').scaledToWidth(fixed_height, Qt.SmoothTransformation)) self._cover_label.setVisible(True) else: self._cover_label.setVisible(False)