Exemple #1
0
 def updateCurrentPosition(self, coords: Sequence[Tuple[float, float]]):
     """Update the current coordinate for a point."""
     for i, c in enumerate(coords):
         if type(c[0]) == float:
             text = f"({c[0]}, {c[1]})"
         else:
             text = "; ".join(f"({x}, {y})" for x, y in c)
         item = QTableWidgetItem(text)
         item.setToolTip(text)
         self.setItem(i, 6, item)
Exemple #2
0
 def update_current_position(self, coords: Sequence[Union[_Coord, Tuple[_Coord, _Coord]]]):
     """Update the current coordinate for a point."""
     for i, c in enumerate(coords):
         if type(c[0]) == float:
             text = f"({c[0]:.06f}, {c[1]:.06f})"
         else:
             text = "; ".join(f"({x:.06f}, {y:.06f})" for x, y in c)
         item = QTableWidgetItem(text)
         item.setToolTip(text)
         self.setItem(i, 6, item)
Exemple #3
0
 def updateCurrentPosition(self, coords: Tuple[Tuple[Tuple[float, float]]]):
     """Update the current coordinate for a point."""
     for i, c in enumerate(coords):
         if type(c[0]) == float:
             text = "({}, {})".format(*c)
         else:
             text = "; ".join("({}, {})".format(x, y) for x, y in c)
         item = QTableWidgetItem(text)
         item.setToolTip(text)
         self.setItem(i, 6, item)
Exemple #4
0
    def addCommit(self, commit: CommitModel):
        """Add commit data to all widgets.
        
        + Commit ID
        + Date
        + Description
        + Author
        + Previous commit
        + Branch
        + Add to table widget.
        """
        row = self.CommitTable.rowCount()
        self.CommitTable.insertRow(row)

        self.commit_current_id.setValue(commit.id)
        button = LoadCommitButton(commit.id, self)
        button.loaded.connect(self.loadCommitID)
        self.load_id.connect(button.isLoaded)
        self.CommitTable.setCellWidget(row, 0, button)

        date = ("{t.year:02d}-{t.month:02d}-{t.day:02d} " +
                "{t.hour:02d}:{t.minute:02d}:{t.second:02d}").format(
                    t=commit.date)

        self.CommitTable.setItem(row, 2, QTableWidgetItem(commit.description))

        author_name = commit.author.name
        all_authors = [
            self.AuthorList.item(row).text()
            for row in range(self.AuthorList.count())
        ]
        if author_name not in all_authors:
            self.AuthorList.addItem(author_name)

        if commit.previous:
            previous_id = "#{}".format(commit.previous.id)
        else:
            previous_id = "None"

        branch_name = commit.branch.name
        all_branchs = [
            self.BranchList.item(row).text()
            for row in range(self.BranchList.count())
        ]
        if branch_name not in all_branchs:
            self.BranchList.addItem(branch_name)
        self.branch_current.setText(branch_name)

        for i, text in enumerate(
            [date, commit.description, author_name, previous_id, branch_name]):
            item = QTableWidgetItem(text)
            item.setToolTip(text)
            self.CommitTable.setItem(row, i + 1, item)
Exemple #5
0
 def writeTable(Integers: List[Tuple[str, str, str]],
                Floats: List[Tuple[str, str, str]]):
     """Use to write table data."""
     i = 0
     for Types, box, maxV in zip([Integers, Floats],
                                 [QSpinBox, QDoubleSpinBox], [9, 10.]):
         for name, vname, tooltip in Types:
             self.APTable.insertRow(i)
             name_cell = QTableWidgetItem(name)
             name_cell.setToolTip(tooltip)
             self.APTable.setItem(i, 0, name_cell)
             spinbox = box()
             spinbox.setMaximum(maxV)
             spinbox.setToolTip(vname)
             self.APTable.setCellWidget(i, 1, spinbox)
             i += 1
Exemple #6
0
 def writeTable(Length: List[Tuple[str, str, str]],
                Degrees: List[Tuple[str, str, str]]):
     """Use to write table data."""
     i = 0
     for Types, maxV, minV in zip([Length, Degrees], [1000., 360.],
                                  [0.1, 0.]):
         for name, vname, tooltip in Types:
             self.PLTable.insertRow(i)
             name_cell = QTableWidgetItem(name)
             name_cell.setToolTip(tooltip)
             self.PLTable.setItem(i, 0, name_cell)
             spinbox = QDoubleSpinBox()
             spinbox.setMaximum(maxV)
             spinbox.setMinimum(minV)
             spinbox.setToolTip(vname)
             self.PLTable.setCellWidget(i, 1, spinbox)
             i += 1
Exemple #7
0
    def __add_commit(self, commit: CommitModel):
        """Add commit data to all widgets.

        + Commit ID
        + Date
        + Description
        + Author
        + Previous commit
        + Branch
        + Add to table widget.
        """
        row = self.CommitTable.rowCount()
        self.CommitTable.insertRow(row)

        self.commit_current_id.setValue(commit.id)
        button = LoadCommitButton(commit.id, self)
        button.loaded.connect(self.__load_commit_id)
        self.load_id.connect(button.set_loaded)
        self.CommitTable.setCellWidget(row, 0, button)

        self.CommitTable.setItem(row, 2, QTableWidgetItem(commit.description))

        author_name = commit.author.name
        for row in range(self.AuthorList.count()):
            if author_name == self.AuthorList.item(row).text():
                break
        else:
            self.AuthorList.addItem(author_name)

        branch_name = commit.branch.name
        for row in range(self.BranchList.count()):
            if branch_name == self.BranchList.item(row).text():
                break
        else:
            self.BranchList.addItem(branch_name)
        self.branch_current.setText(branch_name)
        t = commit.date
        for i, text in enumerate(
            (f"{t.year:02d}-{t.month:02d}-{t.day:02d} "
             f"{t.hour:02d}:{t.minute:02d}:{t.second:02d}", commit.description,
             author_name,
             f"#{commit.previous.id}" if commit.previous else "None",
             branch_name)):
            item = QTableWidgetItem(text)
            item.setToolTip(text)
            self.CommitTable.setItem(row, i + 1, item)
Exemple #8
0
 def write_table(integers: Optional[List[Tuple[str, str, str]]] = None,
                 floats: Optional[List[Tuple[str, str, str]]] = None):
     """Use to write table data."""
     if integers is None:
         integers = []
     if floats is None:
         floats = []
     i = 0
     for options, box, max_value in ((integers, QSpinBox, 9),
                                     (floats, QDoubleSpinBox, 10.)):
         for name, tooltip, tooltip in options:
             self.alg_table.insertRow(i)
             name_cell = QTableWidgetItem(name)
             name_cell.setToolTip(tooltip)
             self.alg_table.setItem(i, 0, name_cell)
             spinbox = box()
             spinbox.setMaximum(max_value)
             spinbox.setToolTip(tooltip)
             self.alg_table.setCellWidget(i, 1, spinbox)
             i += 1
Exemple #9
0
 def set_expr(
     self,
     exprs: ExpressionStack,
     data_dict: Dict[str, Union[Coordinate, float]],
     unsolved: Tuple[int, ...]
 ):
     """Set the table items for new coming expression."""
     exprs = exprs.as_list()
     if exprs != self.exprs:
         self.clear()
         self.setRowCount(len(exprs) + len(unsolved))
     row = 0
     for expr in exprs:
         # Target
         self.setItem(row, self.columnCount() - 1, QTableWidgetItem(expr[-1]))
         # Parameters
         for column, e in enumerate(expr[:-1]):
             if e in data_dict:
                 if type(data_dict[e]) == float:
                     # Pure digit
                     text = f"{e}:{data_dict[e]:.02f}"
                 else:
                     # Coordinate
                     c = data_dict[e]
                     text = f"{e}:({c.x:.02f}, {c.y:.02f})"
             else:
                 # Function name
                 text = e
             item = QTableWidgetItem(text)
             item.setToolTip(text)
             self.setItem(row, column, item)
         row += 1
     for p in unsolved:
         # Declaration
         self.setItem(row, 0, QTableWidgetItem("Unsolved"))
         # Target
         self.setItem(row, self.columnCount() - 1, QTableWidgetItem(f"P{p}"))
         row += 1
     self.exprs = exprs
Exemple #10
0
    def __set_profile(self, profile_name: str, params: Dict[str, Any]):
        """Set profile to sub-widgets."""
        self.__clear_settings()
        self.mech_params = deepcopy(params)
        expression: str = self.mech_params['Expression']
        self.expression_string.setText(expression)
        target: Dict[int, List[_Coord]] = self.mech_params['Target']
        for name in sorted(target):
            self.target_points.addItem(f"P{name}")
            path = target[name]
            if path:
                self.path[name] = path.copy()
            else:
                self.path[name] = []
        if self.target_points.count():
            self.target_points.setCurrentRow(0)

        # Parameter of link length and input angle.
        link_list = set()
        for vlink in parse_vlinks(expression):
            if len(vlink.points) < 2:
                continue
            a = vlink.points[0]
            b = vlink.points[1]
            link_list.add(f"P{a}<->P{b}")
            for c in vlink.points[2:]:
                for d in (a, b):
                    link_list.add(f"P{c}<->P{d}")
        link_count = len(link_list)

        angle_list = set()
        input_list: List[Tuple[int, int]] = self.mech_params['input']
        for b, d in input_list:
            angle_list.add(f"P{b}->P{d}")
        angle_count = len(angle_list)

        self.parameter_list.setRowCount(0)
        placement: Dict[int, Tuple[float, float,
                                   float]] = self.mech_params['Placement']
        self.parameter_list.setRowCount(
            len(placement) + link_count + angle_count)

        def spinbox(v: float,
                    *,
                    minimum: float = 0.,
                    maximum: float = 9999.,
                    prefix: bool = False) -> QDoubleSpinBox:
            double_spinbox = QDoubleSpinBox()
            double_spinbox.setMinimum(minimum)
            double_spinbox.setMaximum(maximum)
            double_spinbox.setSingleStep(10.0)
            double_spinbox.setValue(v)
            if prefix:
                double_spinbox.setPrefix("±")
            return double_spinbox

        # Position.
        pos_list = parse_pos(expression)
        same: Dict[int, int] = self.mech_params['same']
        for node, ref in sorted(same.items()):
            pos_list.insert(node, pos_list[ref])
        pos: Dict[int, _Coord] = dict(enumerate(pos_list))

        row = 0
        for name in sorted(placement):
            coord = placement[name]
            self.parameter_list.setItem(row, 0, QTableWidgetItem(f"P{name}"))
            self.parameter_list.setItem(row, 1, QTableWidgetItem('Placement'))
            x, y = pos[name]
            for i, s in enumerate([
                    spinbox(coord[0] if coord else x, minimum=-9999.),
                    spinbox(coord[1] if coord else y, minimum=-9999.),
                    spinbox(coord[2] if coord else 25., prefix=True),
            ]):
                s.valueChanged.connect(self.update_range)
                self.parameter_list.setCellWidget(row, i + 2, s)
            row += 1

        # Default value of upper and lower.
        for name in ('upper', 'lower'):
            if name not in self.mech_params:
                self.mech_params[name] = [0.] * (link_count + angle_count)

        upper_list: List[float] = self.mech_params['upper']
        lower_list: List[float] = self.mech_params['lower']

        def set_by_center(
                index: int,
                get_range: Callable[[], float]) -> Callable[[float], None]:
            """Return a slot function use to set limit value by center."""
            @Slot(float)
            def func(value: float):
                range_value = get_range()
                upper_list[index] = value + range_value
                lower_list[index] = value - range_value

            return func

        def set_by_range(
                index: int,
                get_value: Callable[[], float]) -> Callable[[float], None]:
            """Return a slot function use to set limit value by range."""
            @Slot(float)
            def func(value: float):
                center = get_value()
                upper_list[index] = center + value
                lower_list[index] = center - value

            return func

        for i, name in enumerate(sorted(link_list) + sorted(angle_list)):
            name_item = QTableWidgetItem(name)
            name_item.setToolTip(name)
            self.parameter_list.setItem(row, 0, name_item)
            if name in link_list:
                type_name = "Link"
            else:
                type_name = "Input"
            self.parameter_list.setItem(row, 1, QTableWidgetItem(type_name))
            # Set values (it will be same if not in the 'mech_params').
            upper = upper_list[i]
            if upper == 0.:
                upper = 100. if name in link_list else 360.
            lower = lower_list[i]
            if lower == 0. and name in link_list:
                lower = 0.
            upper_list[i] = upper
            lower_list[i] = lower
            # Spin box.
            error_range = (upper - lower) / 2
            default_value = error_range + lower
            if name in link_list:
                s1 = spinbox(default_value)
            else:
                s1 = spinbox(default_value, maximum=360.)
            self.parameter_list.setCellWidget(row, 2, s1)
            s2 = spinbox(error_range, prefix=True)
            self.parameter_list.setCellWidget(row, 4, s2)
            # Signal connections.
            s1.valueChanged.connect(set_by_center(i, s2.value))
            s2.valueChanged.connect(set_by_range(i, s1.value))
            row += 1

        self.preview_canvas.from_profile(self.mech_params)
        self.update_range()

        self.profile_name.setText(profile_name)

        # Default value of algorithm option.
        if 'settings' in self.mech_params:
            self.alg_options.update(self.mech_params['settings'])
        else:
            self.__set_algorithm_default()

        self.__able_to_generate()