def draw_polyline_nice_corners(cr, points, arrow_degrees, arrow_len, arrow_start = False, arrow_end = False): ex, ey = points[-1] prev = points[0] if arrow_start: cr.move_to(prev[0],prev[1]) draw_arrow(cr, utils.make_vector(points[1], points[0]), arrow_degrees, arrow_len) cr.move_to(prev[0],prev[1]) for i in xrange(1, len(points) - 1): a = utils.make_vector(points[i-1], points[i]) b = utils.make_vector(points[i], points[i + 1]) la = utils.vector_len(a) lb = utils.vector_len(b) if la < 0.01 or lb < 0.01: continue v = utils.vector_mul_scalar(utils.normalize_vector(a), min(la, 20.0)) w = utils.vector_mul_scalar(utils.normalize_vector(b), min(lb, 20.0)) t = utils.vector_diff(points[i], v) cr.line_to(t[0], t[1]) cr.rel_curve_to(v[0], v[1], v[0], v[1], v[0] + w[0], v[1] + w[1]) cr.line_to(ex,ey) cr.stroke() if arrow_end: cr.move_to(ex, ey) draw_arrow(cr, utils.make_vector(points[-2], points[-1]), arrow_degrees, arrow_len)
def draw_polyline_nice_corners(cr, points, arrow_degrees, arrow_len, arrow_start=False, arrow_end=False): ex, ey = points[-1] prev = points[0] if arrow_start: cr.move_to(prev[0], prev[1]) draw_arrow(cr, utils.make_vector(points[1], points[0]), arrow_degrees, arrow_len) cr.move_to(prev[0], prev[1]) for i in xrange(1, len(points) - 1): a = utils.make_vector(points[i - 1], points[i]) b = utils.make_vector(points[i], points[i + 1]) la = utils.vector_len(a) lb = utils.vector_len(b) if la < 0.01 or lb < 0.01: continue v = utils.vector_mul_scalar(utils.normalize_vector(a), min(la, 20.0)) w = utils.vector_mul_scalar(utils.normalize_vector(b), min(lb, 20.0)) t = utils.vector_diff(points[i], v) cr.line_to(t[0], t[1]) cr.rel_curve_to(v[0], v[1], v[0], v[1], v[0] + w[0], v[1] + w[1]) cr.line_to(ex, ey) cr.stroke() if arrow_end: cr.move_to(ex, ey) draw_arrow(cr, utils.make_vector(points[-2], points[-1]), arrow_degrees, arrow_len)
def draw(self, cr): NetEditCanvasConfig.draw(self, cr) if self.start_position: cr.set_source_rgba(1,1,1,0.5) px, py = self.start_position sx, sy = utils.vector_diff(self.mouse_position, self.start_position) cr.rectangle(px, py, sx, sy) cr.fill() cr.set_line_width(0.5) cr.set_source_rgb(0,0,0) cr.rectangle(px, py, sx, sy) cr.stroke()
def is_at_position(self, position): p1 = self.point1.get_position() p2 = self.point2.get_position() return utils.position_on_rect(position, p1, utils.vector_diff(p2, p1), 5)
def set_position(self, position): self.position = utils.vector_diff(position, self.parent_placement.get_position())