def draw(self): d = self._path() self.arrow = svg.path(d=d) self.arrow.bind('click', self.switch) self.arrow.classList.add('switch') self.arrow.classList.add('switch-' + dirtext(self)) return self.arrow
def draw(self): self.path = svg.path( d=rail_segment_d(self.left_node, self.right_node) ) self.path.classList.add('rail') if self.crossings: self.path.classList.add('crossed') self.left_node.redraw() self.right_node.redraw() return self.path
def drag_started(self, event): if self.drag_origin: return print('drag started') self.drag_origin = self.grid.closest_node_screen(event.x, event.y) self.drag_origin.show_build_endpoint() if self.drag_path: self.drag_path.remove() self.drag_path = svg.path() self.drag_path.classList.add('build-path') self.layer <= self.drag_path self.drag_nodes = [] self.drag_current = None
def draw(self, svg_interface): self.svg_interface = svg_interface self.builder_layer = self.builder.draw() self.grid_layer = self.draw_grid() self.rail_layer = svg.g(id='raillayer') self.node_layer = self.draw_nodes() self.exit_layer = svg.g(id='exitlayer') Exit.highlighter = svg.path(id='routehighlighter') Exit.highlighter.classList.add('highlighted') self.exit_layer <= Exit.highlighter self.aux_pt = self.svg_interface.createSVGPoint() return [ self.builder_layer, self.grid_layer, self.rail_layer, self.node_layer, self.exit_layer, ]
class Switch: MARKER = svg.marker( id='switcharrow', markerWidth=3, markerHeight=2, refX=2, refY=1, orient='auto', markerUnits='strokeWidth', ) MARKER <= svg.path(d='M0,0 L0,2 L3,1 L0,0') enabled = False LENGTH_FRACTION = 0.4 def __init__(self, node, left): self.node = node self.left = left self.arrow = None def draw(self): d = self._path() self.arrow = svg.path(d=d) self.arrow.bind('click', self.switch) self.arrow.classList.add('switch') self.arrow.classList.add('switch-' + dirtext(self)) return self.arrow def _path(self): target = self.node.get_link(self.left) part = self.LENGTH_FRACTION / (abs(target.col - self.node.col) ** .75) return rail_segment_d(self.node, target, part, relative=True) def redraw(self): if self.arrow is None: return self.draw() def switch(self, event=None): if self.enabled: self.node.flip_switch(self.left) self.arrow.attrs['d'] = self._path() def __repr__(self): return '<{}Switch{}({})>'.format( dirtext(self).capitalize(), self.node, self.position )
def pathCreation(pos_from, pos_to): x1, y1 = map(int, pos_from) x2, y2 = map(int, pos_to) dx = abs(int((x1 - x2))) dy = abs(int((y1 - y2))) if dx > dy: mx1, my1 = int((x1 + x2) / 2), y1 mx2, my2 = int((x1 + x2) / 2), y2 else: mx1, my1 = x1, int((y1 + y2) / 2) mx2, my2 = x2, int((y1 + y2) / 2) if x1 == x2: mx1 += 1 mx2 += 1 if y1 == y2: my1 += 1 my2 += 1 d = f'M {x1} {y1} C {mx1} {my1} {mx2} {my2} {x2} {y2}' line = svg.path(d=d) return line