def __init__(self, is_fwd, pre_xover_item): """ Args: is_fwd (bool): True if forward strand base, False if reverse. pre_xover_item (TYPE): Description """ super(Triangle, self).__init__(pre_xover_item) color = pre_xover_item.color self.adapter = PropertyWrapperObject(self) self.setAcceptHoverEvents(True) self.setFiltersChildEvents(True) self._click_area = click_area = QGraphicsRectItem(PXI_RECT, self) click_area.setAcceptHoverEvents(True) click_area.setPen(getNoPen()) click_area.hoverMoveEvent = self.hoverMoveEvent if is_fwd: # grad = QLinearGradient(0., 0., 0., 1.) # grad.setColorAt(0, getColorObj(color)) # grad.setColorAt(1, Qt.black) # self.setBrush(grad) self.setBrush(getBrushObj(color, alpha=128)) self.setPath(FWDPXI_PP) self.setPen(getNoPen()) self._click_area.setPos(-0.5 * IW, -0.75 * IW) else: self.setPath(REVPXI_PP) self.setPen(getPenObj(color, 0.25, alpha=128)) # grad = QLinearGradient(0., 0., 0., -1.) # grad.setColorAt(1, getColorObj(color)) # grad.setColorAt(0, Qt.black) # self.setPen(getNoPen()) # self.setBrush(grad) self._click_area.setPos(-0.5 * IW, -0.25 * IW)
def __init__(self, is_fwd, pre_xover_item): """ Args: is_fwd (bool): True if forward strand base, False if reverse. pre_xover_item (TYPE): Description """ super(Triangle, self).__init__(pre_xover_item) color = pre_xover_item.color self.adapter = PropertyWrapperObject(self) self.setAcceptHoverEvents(True) self.setFiltersChildEvents(True) self._click_area = click_area = QGraphicsRectItem(PXI_RECT, self) click_area.setAcceptHoverEvents(True) click_area.setPen(getNoPen()) click_area.hoverMoveEvent = self.hoverMoveEvent if is_fwd: # grad = QLinearGradient(0., 0., 0., 1.) # grad.setColorAt(0, getColorObj(color)) # grad.setColorAt(1, Qt.black) # self.setBrush(grad) self.setBrush(getBrushObj(color, alpha=128)) self.setPath(FWDPXI_PP) self.setPen(getNoPen()) self._click_area.setPos(-0.5*IW, -0.75*IW) else: self.setPath(REVPXI_PP) self.setPen(getPenObj(color, 0.25, alpha=128)) # grad = QLinearGradient(0., 0., 0., -1.) # grad.setColorAt(1, getColorObj(color)) # grad.setColorAt(0, Qt.black) # self.setPen(getNoPen()) # self.setBrush(grad) self._click_area.setPos(-0.5*IW, -0.25*IW)
def __init__(self, rect, parent=None): super(QGraphicsEllipseItem, self).__init__(rect, parent) self._parent = parent self.setPen(getNoPen()) iw = _ITEM_WIDTH = 3 x = _RECT.width() - 2*rect_gain - 2*styles.SLICE_HELIX_STROKE_WIDTH - 1 y = _RECT.center().y() prexo_items = {} fwd_angles = [0, 240, 120] fwd_colors = ['#cc0000', '#00cc00', '#0000cc'] for i in range(len(fwd_angles)): item = QGraphicsEllipseItem(x, y, iw, iw, self) item.setPen(getNoPen()) item.setBrush(getBrushObj(fwd_colors[i])) item.setTransformOriginPoint(_RECT.center()) item.setRotation(fwd_angles[i]) prexo_items[i] = item rev_angles = [150, 30, 270] rev_colors = ['#800000cc', '#80cc0000', '#8000cc00'] # rev_colors = ['#ff00ff', '#3399ff', '#ff6600'] for i in range(len(fwd_angles)): item = QGraphicsEllipseItem(x, y, iw, iw, self) item.setPen(getPenObj(rev_colors[i],0.5)) item.setBrush(getNoBrush()) item.setTransformOriginPoint(_RECT.center()) item.setRotation(rev_angles[i]) prexo_items[i] = item
def __init__(self, model_part, part_item): super(QGraphicsRectItem, self).__init__(BASE_RECT, part_item) # self.setAcceptHoverEvents(True) # self.setBrush(getNoBrush()) self.setBrush(getBrushObj(styles.BLUE_FILL, alpha=12)) self.setPen(getNoPen()) self.setZValue(styles.ZWORKPLANE) self._model_part = model_part self._part_item = part_item self._idx_low, self._idx_high = model_part.getProperty('workplane_idxs') self._low_drag_bound = 0 # idx, not pos self._high_drag_bound = model_part.getProperty('max_vhelix_length') # idx, not pos self.outline = PathWorkplaneOutline(self) self.resize_handle_group = ResizeHandleGroup(self.rect(), self._HANDLE_SIZE, styles.BLUE_STROKE, True, HandleType.LEFT | HandleType.RIGHT, self, translates_in=Axis.X) # Minimum size hint (darker internal rect, visible during resizing) self.model_bounds_hint = m_b_h = QGraphicsRectItem(self) m_b_h.setBrush(getBrushObj(styles.BLUE_FILL, alpha=64)) m_b_h.setPen(getNoPen()) m_b_h.hide() # Low and high idx labels self.resize_handle_group.updateText(HandleType.LEFT, self._idx_low) self.resize_handle_group.updateText(HandleType.RIGHT, self._idx_high)
def __init__(self, model_part_instance, viewroot, parent): """parent should always be pathrootitem Args: model_part_instance (TYPE): Description viewroot (TYPE): Description parent (TYPE): Description """ super(PathNucleicAcidPartItem, self).__init__(model_part_instance, viewroot, parent) self.setAcceptHoverEvents(True) self._getActiveTool = viewroot.manager.activeToolGetter self.active_virtual_helix_item = None m_p = self._model_part self._controller = NucleicAcidPartItemController(self, m_p) self.prexover_manager = PreXoverManager(self) self._virtual_helix_item_list = [] self._initModifierRect() self._proxy_parent = ProxyParentItem(self) self._proxy_parent.setFlag(QGraphicsItem.ItemHasNoContents) self._scale_2_model = m_p.baseWidth() / _BASE_WIDTH self._scale_2_Qt = _BASE_WIDTH / m_p.baseWidth() # self._rect = QRectF() self._vh_rect = QRectF() # self.setPen(getPenObj(styles.ORANGE_STROKE, 0)) self.setPen(getNoPen()) # self.setRect(self._rect) self.outline = outline = PathRectItem(self) outline.setFlag(QGraphicsItem.ItemStacksBehindParent) self.setZValue(styles.ZPART) self._proxy_parent.setZValue(styles.ZPART) outline.setZValue(styles.ZDESELECTOR) self.outline.setPen(getPenObj(m_p.getColor(), _DEFAULT_WIDTH)) o_rect = self._configureOutline(outline) model_color = m_p.getColor() self.resize_handle_group = ResizeHandleGroup( o_rect, _HANDLE_SIZE, model_color, True, # HandleType.LEFT | HandleType.RIGHT, self) self.model_bounds_hint = m_b_h = QGraphicsRectItem(self) m_b_h.setBrush(getBrushObj(styles.BLUE_FILL, alpha=32)) m_b_h.setPen(getNoPen()) m_b_h.hide() self.workplane = PathWorkplaneItem(m_p, self) self.hide() # show on adding first vh
def __init__(self, part_instance: ObjectInstance, viewroot: PathRootItemT): """parent should always be ``PathRootItem`` Args: part_instance: ``ObjectInstance`` of the ``Part`` viewroot: ``PathRootItem`` and parent object """ super(PathNucleicAcidPartItem, self).__init__(part_instance, viewroot) self.setAcceptHoverEvents(True) self._getActiveTool = viewroot.manager.activeToolGetter self.active_virtual_helix_item: PathVirtualHelixItem = None m_p = self._model_part self._controller = NucleicAcidPartItemController(self, m_p) self.prexover_manager: PreXoverManager = PreXoverManager(self) self._virtual_helix_item_list = [] self._initModifierRect() self._proxy_parent = ProxyParentItem(self) self._proxy_parent.setFlag(QGraphicsItem.ItemHasNoContents) self._scale_2_model: float = m_p.baseWidth() / _BASE_WIDTH self._scale_2_Qt: float = _BASE_WIDTH / m_p.baseWidth() self._vh_rect: QRectF = QRectF() self.setPen(getNoPen()) self.outline: PathRectItem = PathRectItem(self) outline = self.outline outline.setFlag(QGraphicsItem.ItemStacksBehindParent) self.setZValue(styles.ZPART) self._proxy_parent.setZValue(styles.ZPART) outline.setZValue(styles.ZDESELECTOR) self.outline.setPen(getPenObj(m_p.getColor(), _DEFAULT_WIDTH)) o_rect = self._configureOutline(outline) model_color = m_p.getColor() self.resize_handle_group: ResizeHandleGroup = ResizeHandleGroup( o_rect, _HANDLE_SIZE, model_color, True, # HandleEnum.LEFT | HandleEnum.RIGHT, self) self.model_bounds_hint = m_b_h = QGraphicsRectItem(self) m_b_h.setBrush(getBrushObj(styles.BLUE_FILL, alpha=32)) m_b_h.setPen(getNoPen()) m_b_h.hide() self.hide() # show on adding first vh
def __init__(self, part_instance: ObjectInstance, viewroot: PathRootItemT): """parent should always be ``PathRootItem`` Args: part_instance: ``ObjectInstance`` of the ``Part`` viewroot: ``PathRootItem`` and parent object """ super(PathNucleicAcidPartItem, self).__init__(part_instance, viewroot) self.setAcceptHoverEvents(True) self._getActiveTool = viewroot.manager.activeToolGetter self.active_virtual_helix_item: PathVirtualHelixItem = None m_p = self._model_part self._controller = NucleicAcidPartItemController(self, m_p) self.prexover_manager: PreXoverManager = PreXoverManager(self) self._virtual_helix_item_list = [] self._initModifierRect() self._proxy_parent = ProxyParentItem(self) self._proxy_parent.setFlag(QGraphicsItem.ItemHasNoContents) self._scale_2_model: float = m_p.baseWidth()/_BASE_WIDTH self._scale_2_Qt: float = _BASE_WIDTH / m_p.baseWidth() self._vh_rect: QRectF = QRectF() self.setPen(getNoPen()) self.outline: PathRectItem = PathRectItem(self) outline = self.outline outline.setFlag(QGraphicsItem.ItemStacksBehindParent) self.setZValue(styles.ZPART) self._proxy_parent.setZValue(styles.ZPART) outline.setZValue(styles.ZDESELECTOR) self.outline.setPen(getPenObj(m_p.getColor(), _DEFAULT_WIDTH)) o_rect = self._configureOutline(outline) model_color = m_p.getColor() self.resize_handle_group: ResizeHandleGroup = ResizeHandleGroup( o_rect, _HANDLE_SIZE, model_color, True, # HandleEnum.LEFT | HandleEnum.RIGHT, self) self.model_bounds_hint = m_b_h = QGraphicsRectItem(self) m_b_h.setBrush(getBrushObj(styles.BLUE_FILL, alpha=32)) m_b_h.setPen(getNoPen()) m_b_h.hide() self.hide() # show on adding first vh
def __init__(self, from_virtual_helix_item: PathVirtualHelixItemT, is_fwd: bool, from_index: int, nearby_idxs: List[int], to_vh_id_num: int, prexoveritem_manager: PreXoverManagerT): """Summary Args: from_virtual_helix_item: Description is_fwd: is this a forward strand? from_index: index of the Virtual Helix this xover is coming from nearby_idxs: to_vh_id_num: Virtual Helix number this Xover point might connect to prexoveritem_manager: Manager of the PreXoverItems """ super(QGraphicsRectItem, self).__init__(BASE_RECT, from_virtual_helix_item) self.adapter = PropertyWrapperObject(self) self._tick_marks = QGraphicsPathItem(self) self._tick_marks.setAcceptHoverEvents(True) self._bond_item = QGraphicsPathItem(self) self._bond_item.hide() self._label = PreXoverLabel(is_fwd, self) self._path = QGraphicsPathItem() self.setZValue(styles.ZPREXOVERITEM) self.setPen(getNoPen()) self.resetItem(from_virtual_helix_item, is_fwd, from_index, nearby_idxs, to_vh_id_num, prexoveritem_manager) self._getActiveTool = from_virtual_helix_item.viewroot().manager.activeToolGetter
def __init__(self, from_virtual_helix_item: PathVirtualHelixItemT, is_fwd: bool, from_index: int, nearby_idxs: List[int], to_vh_id_num: int, prexoveritem_manager: PreXoverManagerT): """Summary Args: from_virtual_helix_item: Description is_fwd: is this a forward strand? from_index: index of the Virtual Helix this xover is coming from nearby_idxs: to_vh_id_num: Virtual Helix number this Xover point might connect to prexoveritem_manager: Manager of the PreXoverItems """ super(QGraphicsRectItem, self).__init__(BASE_RECT, from_virtual_helix_item) self.adapter = PropertyWrapperObject(self) self._tick_marks = QGraphicsPathItem(self) self._tick_marks.setAcceptHoverEvents(True) self._bond_item = QGraphicsPathItem(self) self._bond_item.hide() self._label = PreXoverLabel(is_fwd, self) self._path = QGraphicsPathItem() self.setZValue(styles.ZPREXOVERITEM) self.setPen(getNoPen()) self.resetItem(from_virtual_helix_item, is_fwd, from_index, nearby_idxs, to_vh_id_num, prexoveritem_manager) self._getActiveTool = from_virtual_helix_item.viewroot( ).manager.activeToolGetter
def __init__(self, step_idx, twist_per_base, bases_per_repeat, color, pre_xover_item_group, is_fwd=True): """Summary Args: step_idx (int): the base index within the virtual helix twist_per_base (float): (turns per repeat)*360/(base per repeat) bases_per_repeat (int): number of bases that will be displayed color (str): hexadecimal color code in the form: `#RRGGBB` pre_xover_item_group (TYPE): Description is_fwd (bool, optional): Description """ super(PreXoverItem, self).__init__(pre_xover_item_group) self.step_idx = step_idx self.color = color self.is_fwd = is_fwd self.pre_xover_item_group = pre_xover_item_group self.phos_item = Triangle(is_fwd, self) self.phos_item.setScale((bases_per_repeat - step_idx)/(2*bases_per_repeat) + 0.5) self.theta0 = rot = twist_per_base/2 if is_fwd else -twist_per_base/2 self.phos_item.setRotation(rot) self.is_active5p = self.is_active3p = False self.item_5p = None self.item_3p = None self._default_bond_3p = QLineF() self._default_p2_3p = QPointF(0, 0) self.bond_3p = PhosBond(is_fwd, self) self.setAcceptHoverEvents(True) self.setFiltersChildEvents(True) self.setRect(self.phos_item.boundingRect()) self.setPen(getNoPen())
def __init__(self, diameter, parent): nd = 2*self._RADIUS offset = -0.5*nd + diameter/2 super(ClickArea, self).__init__(offset, offset, nd, nd, parent=parent) self.parent_obj = parent self.setAcceptHoverEvents(True) self.setPen(getNoPen())
def __init__(self, diameter, parent): nd = 2 * self._RADIUS offset = -0.5 * nd + diameter / 2 super(ClickArea, self).__init__(offset, offset, nd, nd, parent=parent) self.parent_obj = parent self.setAcceptHoverEvents(True) self.setPen(getNoPen())
def __init__(self, strand_item, virtual_helix_item): """ strand_item is a the model representation of the 5prime most strand of a Xover Args: strand_item (TYPE): Description virtual_helix_item (cadnano.views.pathview.virtualhelixitem.VirtualHelixItem): Description """ super(XoverItem, self).__init__(virtual_helix_item.partItem()) self._strand_item = strand_item self._virtual_helix_item = virtual_helix_item self._strand5p = None self._node5 = None self._node3 = None self.hide() # for easier mouseclick self._click_area = c_a = QGraphicsRectItem(self) # self._click_area.setAcceptHoverEvents(True) # c_a.hoverMoveEvent = self.hoverMoveEvent c_a.mousePressEvent = self.mousePressEvent c_a.mouseMoveEvent = self.mouseMoveEvent c_a.setPen(getNoPen()) self._getActiveTool = strand_item._getActiveTool
def __init__(self, part_instance: ObjectInstance, viewroot: GridRootItemT): """Summary Args: part_instance: ``ObjectInstance`` of the ``Part`` viewroot: ``GridRootItem`` parent: Default is ``None`` """ super(GridNucleicAcidPartItem, self).__init__(part_instance, viewroot) self._getActiveTool = viewroot.manager.activeToolGetter m_p = self._model_part self._controller = NucleicAcidPartItemController(self, m_p) self.scale_factor: float = self._RADIUS / m_p.radius() self.active_virtual_helix_item: GridVirtualHelixItem = None self.prexover_manager = PreXoverManager(self) self.hide() # hide while until after attemptResize() to avoid flicker # set this to a token value self._rect: QRectF = QRectF(0., 0., 1000., 1000.) self.boundRectToModel() self.setPen(getNoPen()) self.setRect(self._rect) self.setAcceptHoverEvents(True) # Cache of VHs that were active as of last call to activeGridChanged # If None, all grids will be redrawn and the cache will be filled. # Connect destructor. This is for removing a part from scenes. # initialize the NucleicAcidPartItem with an empty set of old coords self.setZValue(styles.ZPARTITEM) outline = QGraphicsRectItem(self) self.outline: QGraphicsRectItem = outline o_rect = self._configureOutline(outline) outline.setFlag(QGraphicsItem.ItemStacksBehindParent) outline.setZValue(styles.ZDESELECTOR) model_color = m_p.getColor() outline.setPen(getPenObj(model_color, _DEFAULT_WIDTH)) GC_SIZE = 10 self.grab_cornerTL: GrabCornerItem = GrabCornerItem( GC_SIZE, model_color, True, self) self.grab_cornerTL.setTopLeft(o_rect.topLeft()) self.grab_cornerBR: GrabCornerItem = GrabCornerItem( GC_SIZE, model_color, True, self) self.grab_cornerBR.setBottomRight(o_rect.bottomRight()) self.griditem: GridItem = GridItem(self, self._model_props['grid_type']) self.griditem.setZValue(1) self.grab_cornerTL.setZValue(2) self.grab_cornerBR.setZValue(2) # select upon creation for part in m_p.document().children(): if part is m_p: part.setSelected(True) else: part.setSelected(False) self.show()
def resetItem(self, from_virtual_helix_item, is_fwd, from_index, to_vh_id_num, prexoveritemgroup, color): """Summary Args: from_virtual_helix_item (cadnano.gui.views.pathview.virtualhelixitem.VirtualHelixItem): Description is_fwd (TYPE): Description from_index (TYPE): Description to_vh_id_num (TYPE): Description prexoveritemgroup (TYPE): Description color (TYPE): Description Returns: TYPE: Description """ self.setParentItem(from_virtual_helix_item) self.resetTransform() self._id_num = from_virtual_helix_item.idNum() self.idx = from_index self.is_fwd = is_fwd self.to_vh_id_num = to_vh_id_num self._color = color self.prexoveritemgroup = prexoveritemgroup self._bond_item.hide() self._label_txt = lbt = None if to_vh_id_num is None else str( to_vh_id_num) self.setLabel(text=lbt) self._label.resetItem(is_fwd, color) phos = self._phos_item bonditem = self._bond_item if is_fwd: phos.setPath(FWDPHOS_PP) phos.setTransformOriginPoint(0, phos.boundingRect().center().y()) phos.setPos(0.5 * BASE_WIDTH, BASE_WIDTH) phos.setPen(getNoPen()) phos.setBrush(getBrushObj(color)) bonditem.setPen(getPenObj(color, styles.PREXOVER_STROKE_WIDTH)) self.setPos(from_index * BASE_WIDTH, -BASE_WIDTH) else: phos.setPath(REVPHOS_PP) phos.setTransformOriginPoint(0, phos.boundingRect().center().y()) phos.setPos(0.5 * BASE_WIDTH, 0) phos.setPen(getPenObj(color, 0.25)) phos.setBrush(getNoBrush()) bonditem.setPen( getPenObj(color, styles.PREXOVER_STROKE_WIDTH, penstyle=Qt.DotLine, capstyle=Qt.RoundCap)) self.setPos(from_index * BASE_WIDTH, 2 * BASE_WIDTH) if to_vh_id_num is not None: inactive_alpha = PROX_ALPHA self.setBrush(getBrushObj(color, alpha=inactive_alpha)) else: self.setBrush(getBrushObj(color, alpha=0)) self.show()
def __init__(self, parent: QGraphicsItem = None): """ Args: parent: default is ``None`` """ super(PathWorkplaneOutline, self).__init__(parent) self.setPen(getNoPen()) self._path = QGraphicsPathItem(self) self._path.setBrush(getNoBrush()) self._path.setPen(newPenObj(styles.BLUE_STROKE, 0))
def resetItem(self, from_virtual_helix_item, is_fwd, from_index, to_vh_id_num, prexoveritemgroup, color): """Summary Args: from_virtual_helix_item (cadnano.gui.views.pathview.virtualhelixitem.VirtualHelixItem): Description is_fwd (TYPE): Description from_index (TYPE): Description to_vh_id_num (TYPE): Description prexoveritemgroup (TYPE): Description color (TYPE): Description Returns: TYPE: Description """ self.setParentItem(from_virtual_helix_item) self.resetTransform() self._id_num = from_virtual_helix_item.idNum() self.idx = from_index self.is_fwd = is_fwd self.to_vh_id_num = to_vh_id_num self._color = color self.prexoveritemgroup = prexoveritemgroup self._bond_item.hide() self._label_txt = lbt = None if to_vh_id_num is None else str(to_vh_id_num) self.setLabel(text=lbt) self._label.resetItem(is_fwd, color) phos = self._phos_item bonditem = self._bond_item if is_fwd: phos.setPath(FWDPHOS_PP) phos.setTransformOriginPoint(0, phos.boundingRect().center().y()) phos.setPos(0.5*BASE_WIDTH, BASE_WIDTH) phos.setPen(getNoPen()) phos.setBrush(getBrushObj(color)) bonditem.setPen(getPenObj(color, styles.PREXOVER_STROKE_WIDTH)) self.setPos(from_index*BASE_WIDTH, -BASE_WIDTH) else: phos.setPath(REVPHOS_PP) phos.setTransformOriginPoint(0, phos.boundingRect().center().y()) phos.setPos(0.5*BASE_WIDTH, 0) phos.setPen(getPenObj(color, 0.25)) phos.setBrush(getNoBrush()) bonditem.setPen(getPenObj(color, styles.PREXOVER_STROKE_WIDTH, penstyle=Qt.DotLine, capstyle=Qt.RoundCap)) self.setPos(from_index*BASE_WIDTH, 2*BASE_WIDTH) if to_vh_id_num is not None: inactive_alpha = PROX_ALPHA self.setBrush(getBrushObj(color, alpha=inactive_alpha)) else: self.setBrush(getBrushObj(color, alpha=0)) self.show()
def __init__(self, diameter: float, parent: GridPoint): """ Args: diameter: defines the size of the clickarea. parent: the item. """ nd = 2 * self._RADIUS offset = -0.5 * nd + diameter / 2 super(ClickArea, self).__init__(offset, offset, nd, nd, parent=parent) self.parent_obj = parent self.setAcceptHoverEvents(True) self.setPen(getNoPen())
def __init__(self, diameter: float, parent: GridPoint): """ Args: diameter: defines the size of the clickarea. parent: the item. """ nd = 2*self._RADIUS offset = -0.5*nd + diameter/2 super(ClickArea, self).__init__(offset, offset, nd, nd, parent=parent) self.parent_obj = parent self.setAcceptHoverEvents(True) self.setPen(getNoPen())
def __init__(self, model_part: NucleicAcidPartT, part_item: PathNucleicAcidPartItemT): """ Args: model_part: part_item: """ super(QGraphicsRectItem, self).__init__(BASE_RECT, part_item.proxy()) self.setAcceptHoverEvents(True) self.setBrush(getBrushObj(styles.BLUE_FILL, alpha=12)) self.setPen(getNoPen()) self.setZValue(styles.ZWORKPLANE) self._model_part = model_part self._part_item = part_item self._low_drag_bound = 0 # idx, not pos self._high_drag_bound = model_part.getProperty('max_vhelix_length') # idx, not pos self._moving_via_handle = False self.outline = PathWorkplaneOutline(self) self.resize_handle_group = ResizeHandleGroup(self.rect(), self._HANDLE_SIZE, styles.BLUE_STROKE, True, HandleEnum.LEFT | HandleEnum.RIGHT, self, translates_in=AxisEnum.X) # Minimum size hint (darker internal rect, visible during resizing) self.model_bounds_hint = m_b_h = QGraphicsRectItem(self) m_b_h.setBrush(getBrushObj(styles.BLUE_FILL, alpha=64)) m_b_h.setPen(getNoPen()) m_b_h.hide() # Low and high idx labels self.resize_handle_group.updateText(HandleEnum.LEFT, self._idx_low) self.resize_handle_group.updateText(HandleEnum.RIGHT, self._idx_high)
def __init__(self, radius, rect, pre_xover_item_group): """parent could be a PreXoverItemGroup or a VirtualHelixItem Args: radius (TYPE): Description rect (TYPE): Description pre_xover_item_group (TYPE): Description """ super(WedgeGizmo, self).__init__(pre_xover_item_group) self._radius = radius self._rect = rect self.pre_xover_item_group = pre_xover_item_group self.setPen(getNoPen()) self.setZValue(styles.ZWEDGEGIZMO - 10) self._last_params = None
def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: QWidget = None): """ Args: painter: Description option: Description widget: Default is ``None`` """ AbstractPathTool.paint(self, painter, option, widget) painter.setPen(getNoPen()) painter.setBrush(_BRUSH) if self._is_top_strand: painter.drawPath(_FWD_A) else: painter.drawPath(_REV_A)
def __init__(self, radius, rect, virtual_helix_item, is_active): """Summary Args: radius (TYPE): Description rect (TYPE): Description virtual_helix_item (VirtualHelixItem): Description is_active (TYPE): Description """ super(PreXoverItemGroup, self).__init__(rect, virtual_helix_item) self._radius = radius self._rect = rect self.virtual_helix_item = virtual_helix_item self.model_part = virtual_helix_item.part() self.id_num = virtual_helix_item.idNum() self.is_active = is_active self.active_wedge_gizmo = WedgeGizmo(radius, rect, self) self.fwd_prexover_items = fwd_pxis = {} self.rev_prexover_items = rev_pxis = {} self._colors = self._getColors() self.addItems() self.setPen(getNoPen()) z = styles.ZPXIGROUP + 10 if is_active else styles.ZPXIGROUP self.setZValue(z) self.setTransformOriginPoint(rect.center()) bpr, tpr, eulerZ = virtual_helix_item.getProperty(['bases_per_repeat', 'turns_per_repeat', 'eulerZ']) self.setRotation(-eulerZ) # add 180 # for baseNearestPoint fwd_pos, rev_pos = [], [] step_size = self.virtual_helix_item.getProperty('bases_per_repeat') for i in range(int(step_size)): fwd_pos.append((fwd_pxis[i].scenePos().x(), fwd_pxis[i].scenePos().y())) rev_pos.append((rev_pxis[i].scenePos().x(), rev_pxis[i].scenePos().y())) self.fwd_pos_array = np.asarray(fwd_pos) self.rev_pos_array = np.asarray(rev_pos) self.baseNearLine = QGraphicsLineItem(self) self.baseNearLine.setPen(getPenObj("#000000", 0.25, capstyle=Qt.RoundCap))
def __init__(self, radius, rect, virtual_helix_item, is_active): """Summary Args: radius (TYPE): Description rect (TYPE): Description virtual_helix_item (VirtualHelixItem): Description is_active (TYPE): Description """ super(PreXoverItemGroup, self).__init__(rect, virtual_helix_item) self._radius = radius self._rect = rect self.virtual_helix_item = virtual_helix_item self.model_part = virtual_helix_item.part() self.id_num = virtual_helix_item.idNum() self.is_active = is_active self.active_wedge_gizmo = WedgeGizmo(radius, rect, self) self.fwd_prexover_items = fwd_pxis = {} self.rev_prexover_items = rev_pxis = {} self._colors = self._getColors() self.addItems() self.setPen(getNoPen()) z = styles.ZPXIGROUP + 10 if is_active else styles.ZPXIGROUP self.setZValue(z) self.setTransformOriginPoint(rect.center()) bpr, tpr, eulerZ = virtual_helix_item.getProperty( ['bases_per_repeat', 'turns_per_repeat', 'eulerZ']) self.setRotation(-eulerZ) # add 180 # for baseNearestPoint fwd_pos, rev_pos = [], [] step_size = self.virtual_helix_item.getProperty('bases_per_repeat') for i in range(int(step_size)): fwd_pos.append( (fwd_pxis[i].scenePos().x(), fwd_pxis[i].scenePos().y())) rev_pos.append( (rev_pxis[i].scenePos().x(), rev_pxis[i].scenePos().y())) self.fwd_pos_array = np.asarray(fwd_pos) self.rev_pos_array = np.asarray(rev_pos) self.baseNearLine = QGraphicsLineItem(self) self.baseNearLine.setPen( getPenObj("#000000", 0.25, capstyle=Qt.RoundCap))
def paint(self, painter, option, widget=None): """Summary Args: painter (TYPE): Description option (TYPE): Description widget (None, optional): Description Returns: TYPE: Description """ AbstractPathTool.paint(self, painter, option, widget) painter.setPen(getNoPen()) painter.setBrush(_BRUSH) if self._is_top_strand: painter.drawPath(_FWD_A) else: painter.drawPath(_REV_A)
def __init__(self, from_virtual_helix_item, is_fwd, from_index, to_vh_id_num, prexoveritemgroup, color): """Summary Args: from_virtual_helix_item (cadnano.gui.views.pathview.virtualhelixitem.VirtualHelixItem): Description is_fwd (TYPE): Description from_index (TYPE): Description to_vh_id_num (TYPE): Description prexoveritemgroup (TYPE): Description color (TYPE): Description """ super(QGraphicsRectItem, self).__init__(BASE_RECT, from_virtual_helix_item) self.adapter = PropertyWrapperObject(self) self._bond_item = QGraphicsPathItem(self) self._bond_item.hide() self._label = PreXoverLabel(is_fwd, color, self) self._phos_item = Triangle(FWDPHOS_PP, self) self.setPen(getNoPen()) self.resetItem(from_virtual_helix_item, is_fwd, from_index, to_vh_id_num, prexoveritemgroup, color)
def __init__(self, part_item: PathNucleicAcidPartItemT): """ Args: part_item: Description """ super(QGraphicsRectItem, self).__init__(part_item) self.part_item = part_item self.virtual_helix_item = None self.setPen(getNoPen()) self._colors = [] # dictionary of tuple of a (PreXoverItem, List[PreXoverItem]) # for activating on hover events self.prexover_item_map = {} self.neighbor_prexover_items = {} # just a dictionary of neighbors self.hovered_items = [] self._key_press_dict = {} # for reuse of PreXoverItem objects self.pxi_pool = deque() self.active_pxis = {}
def __init__(self, from_virtual_helix_item, is_fwd, from_index, nearby_idxs, to_vh_id_num, prexoveritem_manager): """Summary Args: from_virtual_helix_item (cadnano.views.pathview.virtualhelixitem.VirtualHelixItem): Description is_fwd (TYPE): Description from_index (TYPE): Description to_vh_id_num (TYPE): Description prexoveritem_manager (TYPE): Description """ super(QGraphicsRectItem, self).__init__(BASE_RECT, from_virtual_helix_item) self.adapter = PropertyWrapperObject(self) self._tick_marks = QGraphicsPathItem(self) self._tick_marks.setAcceptHoverEvents(True) self._bond_item = QGraphicsPathItem(self) self._bond_item.hide() self._label = PreXoverLabel(is_fwd, self) self._path = QGraphicsPathItem() self.setZValue(styles.ZPREXOVERITEM) self.setPen(getNoPen()) self.resetItem(from_virtual_helix_item, is_fwd, from_index, nearby_idxs, to_vh_id_num, prexoveritem_manager)
def __init__(self, virtual_helix_item, xover_item, strand3p, idx): """Summary Args: virtual_helix_item (VirtualHelixItem): Description xover_item (TYPE): Description strand3p (Strand): reference to the 3' strand idx (int): the base index within the virtual helix """ super(XoverNode3, self).__init__(virtual_helix_item) self._vhi = virtual_helix_item self._xover_item = xover_item self._idx = idx self.is_forward = strand3p.strandSet().isForward() self.setPartnerVirtualHelix(strand3p) self.setPen(getNoPen()) self._label = None self.setBrush(_NO_BRUSH) self.setRect(_RECT) self.setZValue(styles.ZXOVERITEM)
def __init__(self, part_instance: ObjectInstance, viewroot: GridRootItemT): """Summary Args: part_instance: ``ObjectInstance`` of the ``Part`` viewroot: ``GridRootItem`` parent: Default is ``None`` """ super(GridNucleicAcidPartItem, self).__init__( part_instance, viewroot) self._getActiveTool = viewroot.manager.activeToolGetter m_p = self._model_part self._controller = NucleicAcidPartItemController(self, m_p) self.scale_factor: float = self._RADIUS / m_p.radius() self.active_virtual_helix_item: GridVirtualHelixItem = None self.prexover_manager = PreXoverManager(self) self.hide() # hide while until after attemptResize() to avoid flicker # set this to a token value self._rect: QRectF = QRectF(0., 0., 1000., 1000.) self.boundRectToModel() self.setPen(getNoPen()) self.setRect(self._rect) self.setAcceptHoverEvents(True) # Cache of VHs that were active as of last call to activeGridChanged # If None, all grids will be redrawn and the cache will be filled. # Connect destructor. This is for removing a part from scenes. # initialize the NucleicAcidPartItem with an empty set of old coords self.setZValue(styles.ZPARTITEM) outline = QGraphicsRectItem(self) self.outline: QGraphicsRectItem = outline o_rect = self._configureOutline(outline) outline.setFlag(QGraphicsItem.ItemStacksBehindParent) outline.setZValue(styles.ZDESELECTOR) model_color = m_p.getColor() outline.setPen(getPenObj(model_color, _DEFAULT_WIDTH)) GC_SIZE = 10 self.grab_cornerTL: GrabCornerItem = GrabCornerItem(GC_SIZE, model_color, True, self) self.grab_cornerTL.setTopLeft(o_rect.topLeft()) self.grab_cornerBR: GrabCornerItem = GrabCornerItem(GC_SIZE, model_color, True, self) self.grab_cornerBR.setBottomRight(o_rect.bottomRight()) self.griditem: GridItem = GridItem(self, self._model_props['grid_type']) self.griditem.setZValue(1) self.grab_cornerTL.setZValue(2) self.grab_cornerBR.setZValue(2) # select upon creation for part in m_p.document().children(): if part is m_p: part.setSelected(True) else: part.setSelected(False) self.show()
from cadnano.gui.palette import getPenObj, getBrushObj, getNoPen from PyQt5.QtCore import QRectF, Qt, QPointF, QEvent from PyQt5.QtGui import QBrush, QPen, QFont, QColor, QFontMetricsF, QPainterPath from PyQt5.QtGui import QTransform, QTextCursor from PyQt5.QtWidgets import QGraphicsItem, QGraphicsPathItem, QGraphicsRectItem from PyQt5.QtWidgets import QGraphicsTextItem, QLabel _BASE_WIDTH = _BW = styles.PATH_BASE_WIDTH _HALF_BASE_WIDTH = _HBW = _BASE_WIDTH / 2 _OFFSET1 = _BASE_WIDTH / 4 _DEFAULT_RECT = QRectF(0, 0, _BW, _BW) _B_PEN = getPenObj(styles.BLUE_STROKE, styles.INSERTWIDTH) _R_PEN = getPenObj(styles.RED_STROKE, styles.SKIPWIDTH) _NO_PEN = getNoPen() def _insertGen(path, start, c1, p1, c2): path.moveTo(start) path.quadTo(c1, p1) path.quadTo(c2, start) # end def _PATH_START = QPointF(_HBW, _HBW) _PATH_MID_UP = QPointF(_HBW, -_BW) _PATH_UP_UP_CTRL_PT = QPointF(-_HBW, -_BW) _PATH_UP_DOWN_CTRL_PT = QPointF(1.5 * _BW, -_BW) _PATH_MID_DOWN = QPointF(_HBW, 2 * _BW) _PATH_DOWN_DOWN_CTRL_PT = QPointF(-_HBW, 2 * _BW) _PATH_DOWN_UP_CTRL_PT = QPointF(1.5 * _BW, 2 * _BW)
def __init__(self, diameter: float, parent: GridPoint): nd = 2 * self._RADIUS offset = -0.5 * nd + diameter / 2 super(ClickArea, self).__init__(offset, offset, nd, nd, parent=parent) self.parent_obj = parent self.setPen(getNoPen())
def __init__(self, model_part_instance, viewroot, parent=None): """Summary Args: model_part_instance (TYPE): Description viewroot (TYPE): Description parent (None, optional): Description """ super(SliceNucleicAcidPartItem, self).__init__(model_part_instance, viewroot, parent) self._getActiveTool = viewroot.manager.activeToolGetter m_p = self._model_part self._controller = NucleicAcidPartItemController(self, m_p) self.scale_factor = self._RADIUS / m_p.radius() self.active_virtual_helix_item = None self.prexover_manager = PreXoverManager(self) self.hide() # hide while until after attemptResize() to avoid flicker self._rect = QRectF(0., 0., 1000., 1000.) # set this to a token value self.boundRectToModel() self.setPen(getNoPen()) self.setRect(self._rect) self.setAcceptHoverEvents(True) # Cache of VHs that were active as of last call to activeSliceChanged # If None, all slices will be redrawn and the cache will be filled. # Connect destructor. This is for removing a part from scenes. # initialize the NucleicAcidPartItem with an empty set of old coords self.setZValue(styles.ZPARTITEM) self.outline = outline = QGraphicsRectItem(self) o_rect = self.configureOutline(outline) outline.setFlag(QGraphicsItem.ItemStacksBehindParent) outline.setZValue(styles.ZDESELECTOR) model_color = m_p.getColor() self.outline.setPen(getPenObj(model_color, _DEFAULT_WIDTH)) GC_SIZE = 20 self.grab_cornerTL = GrabCornerItem(GC_SIZE, model_color, True, self) self.grab_cornerTL.setTopLeft(o_rect.topLeft()) self.grab_cornerBR = GrabCornerItem(GC_SIZE, model_color, True, self) self.grab_cornerBR.setBottomRight(o_rect.bottomRight()) self.griditem = GridItem(self, self._model_props['grid_type']) self.griditem.setZValue(1) self.grab_cornerTL.setZValue(2) self.grab_cornerBR.setZValue(2) self.vhi_hint_item = QGraphicsEllipseItem(_DEFAULT_RECT, self) self.vhi_hint_item.setPen(_MOD_PEN) self.vhi_hint_item.setZValue(styles.ZPARTITEM) # select upon creation for part in m_p.document().children(): if part is m_p: part.setSelected(True) else: part.setSelected(False) self.show()
def __init__(self, parent=None): super(PathWorkplaneOutline, self).__init__(parent) self.setPen(getNoPen()) self._path = QGraphicsPathItem(self) self._path.setBrush(getNoBrush()) self._path.setPen(newPenObj(styles.BLUE_STROKE, 0))
def __init__(self, model_part_instance, viewroot, parent=None): """Summary Args: model_part_instance (TYPE): Description viewroot (TYPE): Description parent (None, optional): Description """ super(SliceNucleicAcidPartItem, self).__init__(model_part_instance, viewroot, parent) self.shortest_path_start = None self.neighbor_map = dict() self.coordinates_to_vhid = dict() self.coordinates_to_xy = dict() self._last_hovered_item = None self._highlighted_path = [] self.spa_start_vhi = None self.last_mouse_position = None self._translated_x = 0.0 self._translated_y = 0.0 self._getActiveTool = viewroot.manager.activeToolGetter m_p = self._model_part self._controller = NucleicAcidPartItemController(self, m_p) self.scale_factor = self._RADIUS / m_p.radius() self.inverse_scale_factor = m_p.radius() / self._RADIUS self.active_virtual_helix_item = None self.prexover_manager = PreXoverManager(self) self.hide() # hide while until after attemptResize() to avoid flicker self._rect = QRectF(0., 0., 1000., 1000.) # set this to a token value self.boundRectToModel() self.setPen(getNoPen()) self.setRect(self._rect) self.setAcceptHoverEvents(True) self.shortest_path_add_mode = False # Cache of VHs that were active as of last call to activeSliceChanged # If None, all slices will be redrawn and the cache will be filled. # Connect destructor. This is for removing a part from scenes. # initialize the NucleicAcidPartItem with an empty set of old coords self.setZValue(styles.ZPARTITEM) self.outline = outline = QGraphicsRectItem(self) o_rect = self._configureOutline(outline) outline.setFlag(QGraphicsItem.ItemStacksBehindParent) outline.setZValue(styles.ZDESELECTOR) model_color = m_p.getColor() self.outline.setPen(getPenObj(model_color, _DEFAULT_WIDTH)) self.model_bounds_hint = QGraphicsRectItem(self) self.model_bounds_hint.setBrush(getBrushObj(model_color, alpha=12)) self.model_bounds_hint.setPen(getNoPen()) self.resize_handle_group = ResizeHandleGroup( o_rect, _HANDLE_SIZE, model_color, True, HandleType.TOP | HandleType.BOTTOM | HandleType.LEFT | HandleType.RIGHT | HandleType.TOP_LEFT | HandleType.TOP_RIGHT | HandleType.BOTTOM_LEFT | HandleType.BOTTOM_RIGHT, self, show_coords=True) self.griditem = GridItem(self, self._model_props['grid_type']) self.griditem.setZValue(1) self.resize_handle_group.setZValue(2) self.x_axis_line = QGraphicsLineItem(0, 0, self._RADIUS, 0, self) self.x_axis_line.setPen(getPenObj('#cc0000', _DEFAULT_WIDTH)) self.x_axis_line.setZValue(styles.ZAXIS) self.y_axis_line = QGraphicsLineItem(0, 0, 0, -self._RADIUS, self) self.y_axis_line.setPen(getPenObj('#007200', _DEFAULT_WIDTH)) self.y_axis_line.setZValue(styles.ZAXIS) # select upon creation for part in m_p.document().children(): if part is m_p: part.setSelected(True) else: part.setSelected(False) self.show()
from PyQt5.QtWidgets import QGraphicsLineItem, QGraphicsSimpleTextItem from cadnano import getBatch from cadnano.controllers.stranditemcontroller import StrandItemController from cadnano.gui.palette import getColorObj, getPenObj, getBrushObj, getNoPen from cadnano.views.pathview import pathstyles as styles from .decorators.insertionitem import InsertionItem from .endpointitem import EndpointItem from .xoveritem import XoverItem # import logging # logger = logging.getLogger(__name__) _BASE_WIDTH = styles.PATH_BASE_WIDTH _DEFAULT_RECT = QRectF(0, 0, _BASE_WIDTH, _BASE_WIDTH) _NO_PEN = getNoPen() SELECT_COLOR = "#ff3333" class StrandItem(QGraphicsLineItem): FILTER_NAME = "strand" __slots__ = ('_model_strand', '_virtual_helix_item', '_viewroot', '_getActiveTool', '_controller', 'is_forward', '_strand_filter', '_insertion_items', '_low_cap', '_high_cap', '_dual_cap', '_seq_label', '_click_area', 'xover_3p_end') def __init__(self, model_strand, virtual_helix_item, viewroot): """The parent should be a VirtualHelixItem.""" super(StrandItem, self).__init__(virtual_helix_item) self._model_strand = model_strand
def __init__(self, diameter: float, parent: GridPoint): nd = 2*self._RADIUS offset = -0.5*nd + diameter/2 super(ClickArea, self).__init__(offset, offset, nd, nd, parent=parent) self.parent_obj = parent self.setPen(getNoPen())