Quantcast
Channel: Active questions tagged qpainter - Stack Overflow
Viewing all articles
Browse latest Browse all 58

Pyqt6 draw double and triple bonds around an atom

$
0
0

I'm trying to draw possible bonds around a selected atom.
I am using cos and sin to find the positions of the possible new atoms in steps of 45° so I get 8 different positions , which works fine. When it comes to actually drawing the double or triple bonds, the bonds at 135° (top left) and 315° (bottom right) are shown as single bond lines, instead of double or triple.

Screenshot of the output

Does anyone have an idea why this bug might occur or how to solve it?

This is a part of my paintEvent function:

# Calculate possible positions for new atoms in 360° around the selected atomif self.selected_atom is not None:    potential_positions = self.calc_potential_positions(self.selected_atom)    for pos in potential_positions:        # If atoms at position don't overlap, draw the potential bonds and atoms in different colour        if not self.check_atom_overlap(pos[0], pos[1]):            if self.bond_order == 2:                self.draw_double_bond(self.selected_atom.x_coords, self.selected_atom.y_coords, pos[0],                                      pos[1], False)            elif self.bond_order == 3:                self.draw_triple_bond(self.selected_atom.x_coords, self.selected_atom.y_coords,                                      pos[0], pos[1], False)            else:                self.draw_single_bond(self.selected_atom.x_coords, self.selected_atom.y_coords,                                      pos[0], pos[1], False)            self.draw_atom_circle(pos[0], pos[1], self.selected_atom.x_coords,                                  self.selected_atom.y_coords)            self.draw_atom(pos[0], pos[1], self.element.SYMBOL, True)            self.draw_center_atom(self.selected_atom.x_coords, self.selected_atom.y_coords,                                  self.selected_atom.symbol)
@staticmethoddef calc_potential_positions(atom: chem_editor_logic.Atom) -> list[tuple[int, int]]:"""    :param atom:    :return: list of tuples containing x and y coordinates of potential positions for new atoms"""    x = atom.x_coords    y = atom.y_coords    distance = 40    # Calculate coordinates for angles in steps of 45 degrees from 0 to 360    coordinates_list = []    for angle_degrees in range(0, 360, 45):        angle_radians = math.radians(angle_degrees)        new_x = x + distance * math.cos(angle_radians)        new_y = y + distance * math.sin(angle_radians)        coordinates_list.append((int(new_x), int(new_y)))    print(x, y)    print(coordinates_list)    return coordinates_listdef draw_single_bond(self, atom1_x: int, atom1_y: int, atom2_x: int, atom2_y: int, actual_bond: bool) -> None:    painter = QPainter(self)    pen = QPen()    # Set colour black    pen.setColor(QColor(0, 0, 0))    pen.setWidth(2)    if not actual_bond:        # Set colour red        pen.setColor(QColor(255, 0, 0))    painter.setPen(pen)    painter.drawLine(QPoint(atom1_x, atom1_y), QPoint(atom2_x, atom2_y))def draw_double_bond(self, atom1_x: int, atom1_y: int, atom2_x: int, atom2_y: int, actual_bond: bool) -> None:    painter = QPainter(self)    pen = QPen()    # Set colour black    pen.setColor(QColor(0, 0, 0))    pen.setWidth(2)    if not actual_bond:        # Set colour red        pen.setColor(QColor(255, 0, 0))    painter.setPen(pen)    # Draw two lines for a double bond    offset = 3    painter.drawLine(QPoint(atom1_x - offset, atom1_y - offset),                     QPoint(atom2_x - offset, atom2_y - offset))    painter.drawLine(QPoint(atom1_x + offset, atom1_y + offset),                     QPoint(atom2_x + offset, atom2_y + offset))def draw_triple_bond(self, atom1_x: int, atom1_y: int, atom2_x: int, atom2_y: int, actual_bond: bool) -> None:    painter = QPainter(self)    pen = QPen()    # Set colour black    pen.setColor(QColor(0, 0, 0))    pen.setWidth(2)    if not actual_bond:        # Set colour red        pen.setColor(QColor(255, 0, 0))    painter.setPen(pen)    # Draw three lines for a triple bond    offset = 4    painter.drawLine(QPoint(atom1_x, atom1_y),                     QPoint(atom2_x, atom2_y))    painter.drawLine(QPoint(atom1_x - offset, atom1_y - offset),                     QPoint(atom2_x - offset, atom2_y - offset))    painter.drawLine(QPoint(atom1_x + offset, atom1_y + offset),                     QPoint(atom2_x + offset, atom2_y + offset))

Those are the functions in use here.


Viewing all articles
Browse latest Browse all 58

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>