示例#1
0
    def __on_molecules_current_text_changed(self, *_args):
        molecule = MoleculeMeta(self.molecules_current_molecule.currentText())
        if not molecule.is_populated():
            return

        if self.molecule_info is not None:
            for i in reversed(range(self.molecule_container.count())):
                self.molecule_container.itemAt(i).widget().setParent(None)
        self.molecule_info = MoleculeInfoWidget(self.molecules_current_molecule.currentText(), self)
        self.molecule_container.addWidget(self.molecule_info)
def generate_availability_():
    Config.data_folder = "__temp_data"
    hapi.db_begin(Config.data_folder)

    records = dict()
    for molecule_id in range(0, 100):
        molecule = MoleculeMeta(molecule_id)
        if not molecule.is_populated():
            continue
        records[molecule.id] = check_availability(molecule)

    with open(f"res/parameters/availability.json", "w+") as f:
        f.write(json.dumps(records, indent=2, sort_keys=True))

    print(records)

    sys.exit(0)
示例#3
0
class MoleculeInfoWidget(QWidget):
    FIELDS = ['Formula', 'InChI', 'InChIKey', 'HITRANonline_ID', 'Aliases']

    def __init__(self, molecule_name, parent):
        QWidget.__init__(self, parent)

        self.molecule = MoleculeMeta(molecule_name)

        if not self.molecule.is_populated():
            raise Exception("Don't make a molecule info widget with an invalid molecule")

        self.fetch_widget: FetchWidget = FetchWidget.FETCH_WIDGET_INSTANCE
        self.xsc_widget: CrossSectionFetchWidget = \
            CrossSectionFetchWidget.CROSS_SECTION_FETCH_WIDGET_INSTANCE
        self.main_gui = parent

        self.parent = parent
        self.setWindowIcon(program_icon())

        def create_field(text):
            field_name = text.lower()
            label = QLabel(f'<b>{text}:</b>')
            value = QLabel()
            value.setTextInteractionFlags(Qt.TextSelectableByMouse)
            label.setTextFormat(Qt.RichText)
            value.setWordWrap(True)
            value.setTextFormat(Qt.RichText)

            self.__dict__[field_name + "_label"] = label
            self.__dict__[field_name] = value

        self.setObjectName('MoleculeInfoWidget')

        self.name = \
            QLabel(f"<span style='font-size: 16pt'><i><b>{self.molecule.name}</b></i></span>")

        self.button_style = "padding: .1em .2em .1em .2em;"
        self.get_xsc_button = QPushButton("Get cross-sections")
        self.get_xsc_button.pressed.connect(self.__open_cross_sections)
        self.get_xsc_button.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))
        self.get_xsc_button.setStyleSheet(self.button_style)

        self.get_lbl_button = QPushButton("Get line-by-line data")
        self.get_lbl_button.pressed.connect(self.__open_line_by_line)
        self.get_lbl_button.setSizePolicy(QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum))
        self.get_lbl_button.setStyleSheet(self.button_style)

        self.img = QWidget()
        self.img.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed))

        if Config.high_dpi:
            self.img.setFixedWidth(300)
            self.img.setFixedHeight(300)
        else:
            self.img.setFixedWidth(400)
            self.img.setFixedHeight(400)

        # Have to call list because map is lazy
        list(map(create_field, MoleculeInfoWidget.FIELDS))

        self.aliases.setWordWrap(True)

        self.form_layout = QFormLayout()

        list(map(lambda x: self.form_layout.addRow(self.__dict__[x.lower() + '_label'],
                                                   self.__dict__[x.lower()]),
                 MoleculeInfoWidget.FIELDS))

        self.button_container = QHBoxLayout()

        if self.molecule.has_lbl_data:
            self.button_container.addWidget(self.get_lbl_button)
        if len(CrossSectionMeta(self.molecule.id).metas) > 0:
            self.button_container.addWidget(self.get_xsc_button)

        self.button_spacer = QSpacerItem(1, 1, QSizePolicy.Expanding, QSizePolicy.Preferred)
        self.button_container.addSpacerItem(self.button_spacer)

        self.img_layout = QVBoxLayout()
        self.img_layout.addWidget(self.img)
        self.img_layout.addSpacerItem(QSpacerItem(1, 1, QSizePolicy.Fixed, QSizePolicy.Expanding))

        self.info_layout = QVBoxLayout()
        self.info_layout.addWidget(self.name)
        self.info_layout.addLayout(self.button_container)
        self.info_layout.addLayout(self.form_layout)
        self.info_layout.addSpacerItem(QSpacerItem(1, 1, QSizePolicy.Fixed, QSizePolicy.Expanding))

        self.central_layout = QHBoxLayout()
        self.central_layout.addLayout(self.img_layout)
        self.central_layout.addSpacerItem(QSpacerItem(50, 1, QSizePolicy.Fixed, QSizePolicy.Fixed))
        self.central_layout.addLayout(self.info_layout)
        self.central_layout.addSpacerItem(
                QSpacerItem(1, 1, QSizePolicy.Expanding, QSizePolicy.Expanding))

        self.setLayout(self.central_layout)

        if not Config.online:
            self.get_xsc_button.setDisabled(True)
            self.get_lbl_button.setDisabled(True)

        formula = self.molecule.formula
        if self.molecule.is_populated():
            self.img.setAttribute(Qt.WA_StyledBackground)
            self.img.setStyleSheet(
                f'border-image: url("res/img/molecules/{formula}.gif") 0 0 0 0 stretch stretch;')
            self.img.show()

            try:
                self.formula.setText(self.molecule.html)
                self.hitranonline_id.setText(str(self.molecule.id))
                self.inchi.setText(self.molecule.inchi)
                self.inchikey.setText(self.molecule.inchikey)

                alias_text = ''
                for alias in self.molecule.aliases:
                    alias_text = f'{alias_text}<i>{alias.alias}</i><hr>'
                self.aliases.setText(alias_text)

            except Exception as e:
                err_log(f'Encountered error \'{str(e)}\' - likely a malformed molecule json file')

            self.adjustSize()

    def __open_cross_sections(self, *_args):
        self.xsc_widget.molecule.setCurrentText(self.molecule.name)
        self.main_gui.tab_widget.setCurrentWidget(self.main_gui.cross_section_tab)

    def __open_line_by_line(self, *_args):
        self.fetch_widget.set_molecule_id(self.molecule.name)
        self.main_gui.tab_widget.setCurrentWidget(self.main_gui.fetch_tab)