Пример #1
0
    def setup_monitors(self):
        ui = self.ui.monitors
        # Grab a fresh copy, may have been updated
        self.monitors_region_dict = self.ui.regions.get_region_dict()

        # Mark regions which are in use (this gets reset each time we get here)
        #for (i, data) in self.monitors.items():
        #    region = data['region']
        #    if region in self.monitors_region_dict:
        #        self.monitors_region_dict[region]['available'] = False
        self.fixup_monitors_table()
        row = get_selected_row(ui.tablewidget_regions)
        # Autoselect if only 1 row
        if row is None and ui.tablewidget_regions.rowCount() == 1:
            row = 0
            ui.tablewidget_regions.setCurrentCell(row, COLUMN_REGION)
        enabled = (row is not None)
        for item in (ui.toolbutton_delete, ui.bottom_frame):
            item.setEnabled(enabled)

        mon = self.monitors_current_index
        enable_phase = self.monitor_requires_phase(mon)

        #**Fluid phase tab**
        b = ui.pushbutton_fluid
        b.setText(self.fluid_phase_name)
        font = b.font()
        font.setBold(self.monitors_current_tab == FLUID_TAB)
        b.setFont(font)
        w = b.fontMetrics().boundingRect(b.text()).width() + 20
        b.setMaximumWidth(w)
        b.setEnabled(not enable_phase)

        #**Solids Phase Tab** *(Requires TFM Solids)*
        #Each solid phase will have its own tab. The tab name should be the name of the solid
        solids_names = list(self.solids.keys())
        if self.monitors_saved_solids_names != solids_names:
            # Clear out the old ones
            n_cols = ui.tab_layout.columnCount()
            for i in range(n_cols - 1, 0, -1):
                item = ui.tab_layout.itemAtPosition(0, i)
                if not item:
                    continue
                widget = item.widget()
                if not widget:
                    continue
                if widget in (ui.pushbutton_fluid, ui.pushbutton_scalar,
                              ui.pushbutton_reactions, ui.pushbutton_phase):
                    continue
                ui.tab_layout.removeWidget(widget)
                widget.setParent(None)
                widget.deleteLater()
            # And make new ones
            for (i, solid_name) in enumerate(solids_names, 1):
                b = QPushButton(text=solid_name)
                w = b.fontMetrics().boundingRect(solid_name).width() + 20
                b.setMaximumWidth(w)
                b.setFlat(True)
                font = b.font()
                font.setBold(self.monitors_current_tab == SOLIDS_TAB
                             and i == self.monitors_current_solid)
                b.setFont(font)
                b.pressed.connect(
                    lambda i=i: self.monitors_change_tab(SOLIDS_TAB, i))
                ui.tab_layout.addWidget(b, 0, i)

        # Only TFM solids
        for i in range(1, 1 + len(self.solids)):
            enabled = self.project.get_value(
                'solids_model', args=[i]) == 'TFM' and not enable_phase
            item = ui.tab_layout.itemAtPosition(0, i)
            if item:
                widget = item.widget()
            if widget:
                widget.setEnabled(enabled)

        #Scalar (tab) - Tab only available if scalar equations are solved
        # Move the 'Scalar' button to the right of all solids, if needed
        b = ui.pushbutton_scalar
        font = b.font()
        font.setBold(self.monitors_current_tab == SCALAR_TAB)
        b.setFont(font)
        nscalar = self.project.get_value('nscalar', default=0)
        enabled = (nscalar > 0) and not enable_phase
        b.setEnabled(enabled)
        if len(self.solids) != len(self.monitors_saved_solids_names):
            ui.tab_layout.removeWidget(b)
            ui.tab_layout.addWidget(b, 0, 1 + len(self.solids))

        #Reactions (tab) - Tab only available if  nrr > 0
        # Move the 'Reactions' button to the right of all solids, if needed
        b = ui.pushbutton_reactions
        font = b.font()
        font.setBold(self.monitors_current_tab == REACTIONS_TAB)
        b.setFont(font)
        nrr = self.project.get_value('nrr', default=0)
        enabled = (nrr > 0) and not enable_phase
        if nrr == 0 and not enable_phase:
            b.setToolTip("Requires nrr > 0")
        else:
            b.setToolTip('')
        b.setEnabled(enabled)
        if len(self.solids) != len(self.monitors_saved_solids_names):
            ui.tab_layout.removeWidget(b)
            ui.tab_layout.addWidget(b, 0, 2 + len(self.solids))

        # Move the 'Phase' button to the right of all solids, if needed
        b = ui.pushbutton_phase
        font = b.font()
        font.setBold(self.monitors_current_tab == PHASE_TAB)
        b.setFont(font)
        b.setEnabled(enable_phase)
        if len(self.solids) != len(self.monitors_saved_solids_names):
            ui.tab_layout.removeWidget(b)
            ui.tab_layout.addWidget(b, 0, 3 + len(self.solids))

        self.monitors_saved_solids_names = solids_names
        self.P = self.monitors_current_solid

        if mon is None:
            #Construct the GUI, even though disabled (species checkboxes, etc)
            self.monitors_setup_current_tab()
            return

        key = 'monitor_name'
        le = ui.lineedit_keyword_monitor_name_args_MONITOR
        val = self.project.get_value(key, args=[mon])
        if val is None:  # Construct from region name
            val = self.monitor_default_name(self.monitors_current_region)
            self.update_keyword(key, val, args=[mon])
        le.updateValue(key, val)
        # Update table too
        tw = ui.tablewidget_regions
        for i in range(tw.rowCount()):
            data = tw.item(i, 0).data(UserRole)
            index, name = data
            if index == mon:
                tw.item(i, COLUMN_FILENAME).setText(val)

        #Specify write interval
        key = 'monitor_dt'
        default = 0.05
        le = ui.lineedit_keyword_monitor_dt_args_MONITOR
        val = self.project.get_value(key, args=[mon])
        if val is None:
            val = default
            self.update_keyword(key, val, args=[mon])
        le.updateValue(key, val)

        # Don't stay on a disabled tab
        index = self.monitors_tab_to_index(self.monitors_current_tab,
                                           self.monitors_current_solid)
        item = None if index is None else ui.tab_layout.itemAtPosition(
            0, index)
        b = item.widget() if item else None
        if ui.isEnabled() and not (b and b.isEnabled()):
            self.monitors_change_tab(*self.monitors_find_valid_tab())
        else:
            self.monitors_setup_current_tab()

        # make sure underline is in the right place, as # of solids may
        # have changed (lifted from animate_stacked_widget, which we
        # don't want to call here)
        tab = self.monitors_current_tab
        line_to = self.monitors_tab_to_index(tab, self.monitors_current_solid)
        line = ui.tab_underline
        btn_layout = ui.tab_layout
        if line_to is not None:
            btn_layout.addItem(btn_layout.takeAt(btn_layout.indexOf(line)), 1,
                               line_to)
Пример #2
0
    def setup_pss(self):
        ui = self.ui.point_sources

        # Grab a fresh copy, may have been updated
        self.pss_region_dict = self.ui.regions.get_region_dict()

        # Mark regions which are in use (this gets reset each time we get here)
        for (i, data) in self.pss.items():
            region = data['region']
            if region in self.pss_region_dict:
                self.pss_region_dict[region]['available'] = False

        self.fixup_pss_table(ui.tablewidget_regions)
        row = get_selected_row(ui.tablewidget_regions)
        # Autoselect if only 1 row
        if row is None and ui.tablewidget_regions.rowCount() == 1:
            row = 0
            ui.tablewidget_regions.setCurrentCell(row, 0)
        enabled = (row is not None)
        for item in (ui.toolbutton_delete, ui.bottom_frame):
            item.setEnabled(enabled)

        #Tabs group point source parameters for phases. Tabs are unavailable if no input
        #is required from the user.
        #    Fluid tab - Unavailable if the fluid phase was disabled.
        b = ui.pushbutton_fluid
        b.setText(self.fluid_phase_name)
        b.setEnabled(not self.fluid_solver_disabled)
        font = b.font()
        font.setBold(self.pss_current_tab == 0)
        b.setFont(font)

        # Each solid phase will have its own tab. The tab name should be the name of the solid
        solids_names = list(self.solids.keys())
        if self.pss_saved_solids_names != solids_names:
            # Clear out the old ones
            n_cols = ui.tab_layout.columnCount()
            for i in range(n_cols - 1, 0, -1):
                item = ui.tab_layout.itemAtPosition(0, i)
                if not item:
                    continue
                widget = item.widget()
                if not widget:
                    continue
                if widget == ui.pushbutton_fluid:
                    continue
                ui.tab_layout.removeWidget(widget)
                widget.setParent(None)
                widget.deleteLater()
            # And make new ones
            for (i, solid_name) in enumerate(solids_names, 1):
                b = QPushButton(text=solid_name)
                w = b.fontMetrics().boundingRect(solid_name).width() + 20
                b.setMaximumWidth(w)
                b.setFlat(True)
                font = b.font()
                font.setBold(self.pss_current_tab == SOLIDS_TAB
                             and i == self.pss_current_solid)
                b.setFont(font)
                ui.tab_layout.addWidget(b, 0, i)
                b.pressed.connect(
                    lambda i=i: self.pss_change_tab(SOLIDS_TAB, i))

        for (i, solid_name) in enumerate(self.solids.keys(), 1):
            model = self.project.get_value('solids_model', args=[i])
            #At this time, only TFM solids can be defined with point sources.
            #At some point in the future, this could be extended to PIC solids, but never DEM.
            b = ui.tab_layout.itemAtPosition(0, i).widget()
            if model == 'TFM':
                b.setEnabled(True)
                b.setToolTip(None)
            else:
                b.setEnabled(False)
                b.setToolTip("Only TFM solids can be defined as point sources"
                             "")

        self.pss_saved_solids_names = solids_names
        self.P = self.pss_current_solid

        # Don't stay on a disabled tab
        index = self.pss_tab_to_index(self.pss_current_tab,
                                      self.pss_current_solid)
        item = None if index is None else ui.tab_layout.itemAtPosition(
            0, index)
        b = item.widget() if item else None
        if ui.isEnabled() and not (b and b.isEnabled()):
            self.pss_change_tab(*self.pss_find_valid_tab())
        else:
            self.pss_setup_current_tab()

        # make sure underline is in the right place, as # of solids may
        # have changed (lifted from animate_stacked_widget, which we
        # don't want to call here)
        tab = self.pss_current_tab
        line_to = self.pss_tab_to_index(tab, self.pss_current_solid)
        line = ui.tab_underline
        btn_layout = ui.tab_layout
        if line_to is not None:
            btn_layout.addItem(btn_layout.takeAt(btn_layout.indexOf(line)), 1,
                               line_to)