def build_freeform(self, start_x=0, start_y=0, scale=1.0): """Return |FreeformBuilder| object to specify a freeform shape. The optional *start_x* and *start_y* arguments specify the starting pen position in local coordinates. They will be rounded to the nearest integer before use and each default to zero. The optional *scale* argument specifies the size of local coordinates proportional to slide coordinates (EMU). If the vertical scale is different than the horizontal scale (local coordinate units are "rectangular"), a pair of numeric values can be provided as the *scale* argument, e.g. `scale=(1.0, 2.0)`. In this case the first number is interpreted as the horizontal (X) scale and the second as the vertical (Y) scale. A convenient method for calculating scale is to divide a |Length| object by an equivalent count of local coordinate units, e.g. `scale = Inches(1)/1000` for 1000 local units per inch. """ try: x_scale, y_scale = scale except TypeError: x_scale = y_scale = scale return FreeformBuilder.new(self, start_x, start_y, x_scale, y_scale)
def local_fixture(self, shape_offset_x_prop_, shape_offset_y_prop_): local_x, local_y = 123, 456 shape_offset_x_prop_.return_value = 23 shape_offset_y_prop_.return_value = 156 builder = FreeformBuilder(None, None, None, None, None) expected_value = (100, 300) return builder, local_x, local_y, expected_value
def it_can_add_straight_line_segments(self, request, close): _add_line_segment_ = method_mock(request, FreeformBuilder, "_add_line_segment") _add_close_ = method_mock(request, FreeformBuilder, "_add_close") builder = FreeformBuilder(None, None, None, None, None) return_value = builder.add_line_segments(((1, 2), (3, 4), (5, 6)), close) assert _add_line_segment_.call_args_list == [ call(builder, 1, 2), call(builder, 3, 4), call(builder, 5, 6), ] assert _add_close_.call_args_list == ([call(builder)] if close else []) assert return_value is builder
def it_can_start_a_new_path_to_help(self, request, _dx_prop_, _dy_prop_): _local_to_shape_ = method_mock(request, FreeformBuilder, "_local_to_shape", return_value=(101, 202)) sp = element("p:sp/p:spPr/a:custGeom") start_x, start_y = 42, 24 _dx_prop_.return_value, _dy_prop_.return_value = 1001, 2002 builder = FreeformBuilder(None, start_x, start_y, None, None) path = builder._start_path(sp) _local_to_shape_.assert_called_once_with(builder, start_x, start_y) assert sp.xml == xml( "p:sp/p:spPr/a:custGeom/a:pathLst/a:path{w=1001,h=2002}/a:moveTo" "/a:pt{x=101,y=202}") assert path is sp.xpath(".//a:path")[-1]
def it_provides_a_constructor(self, new_fixture): shapes_, start_x, start_y, x_scale, y_scale = new_fixture[:5] _init_, start_x_int, start_y_int = new_fixture[5:] builder = FreeformBuilder.new(shapes_, start_x, start_y, x_scale, y_scale) _init_.assert_called_once_with( builder, shapes_, start_x_int, start_y_int, x_scale, y_scale ) assert isinstance(builder, FreeformBuilder)
def sp_fixture(self, _left_prop_, _top_prop_, _width_prop_, _height_prop_): origin_x, origin_y = 42, 24 spTree = element("p:spTree") shapes = SlideShapes(spTree, None) _left_prop_.return_value, _top_prop_.return_value = 12, 34 _width_prop_.return_value, _height_prop_.return_value = 56, 78 builder = FreeformBuilder(shapes, None, None, None, None) expected_xml = snippet_seq("freeform")[0] return builder, origin_x, origin_y, spTree, expected_xml
def it_provides_a_constructor(self, new_fixture): shapes_, start_x, start_y, x_scale, y_scale = new_fixture[:5] _init_, start_x_int, start_y_int = new_fixture[5:] builder = FreeformBuilder.new(shapes_, start_x, start_y, x_scale, y_scale) _init_.assert_called_once_with(builder, shapes_, start_x_int, start_y_int, x_scale, y_scale) assert isinstance(builder, FreeformBuilder)
def start_path_fixture(self, _dx_prop_, _dy_prop_, _local_to_shape_): sp = element("p:sp/p:spPr/a:custGeom") start_x, start_y = 42, 24 _dx_prop_.return_value, _dy_prop_.return_value = 1001, 2002 _local_to_shape_.return_value = 101, 202 builder = FreeformBuilder(None, start_x, start_y, None, None) expected_xml = xml( "p:sp/p:spPr/a:custGeom/a:pathLst/a:path{w=1001,h=2002}/a:moveTo" "/a:pt{x=101,y=202}") return builder, sp, _local_to_shape_, start_x, start_y, expected_xml
def shape_offset_y_fixture(self, request): start_y, ys, expected_value = request.param drawing_ops = [] for y in ys: if y is None: drawing_ops.append(_Close()) else: drawing_ops.append(_BaseDrawingOperation(None, None, y)) builder = FreeformBuilder(None, None, start_y, None, None) builder._drawing_operations.extend(drawing_ops) return builder, expected_value
def dx_fixture(self, request): start_x, xs, expected_value = request.param drawing_ops = [] for x in xs: if x is None: drawing_ops.append(_Close()) else: drawing_ops.append(_BaseDrawingOperation(None, x, None)) builder = FreeformBuilder(None, start_x, None, None, None) builder._drawing_operations.extend(drawing_ops) return builder, expected_value
def convert_fixture(self, shapes_, apply_operation_to_, _add_freeform_sp_, _start_path_, shape_): origin_x, origin_y = 42, 24 sp, path = element("p:sp"), element("a:path") drawing_ops = ( _BaseDrawingOperation(None, None, None), _BaseDrawingOperation(None, None, None), ) shapes_._shape_factory.return_value = shape_ _add_freeform_sp_.return_value = sp _start_path_.return_value = path builder = FreeformBuilder(shapes_, None, None, None, None) builder._drawing_operations.extend(drawing_ops) calls = [call(drawing_ops[0], path), call(drawing_ops[1], path)] return (builder, origin_x, origin_y, sp, apply_operation_to_, calls, shape_)
def left_fixture(self, request, shape_offset_x_prop_): offset_x, x_scale, expected_value = request.param shape_offset_x_prop_.return_value = offset_x builder = FreeformBuilder(None, None, None, x_scale, None) return builder, expected_value
def width_fixture(self, request, _dx_prop_): dx, x_scale, expected_value = request.param _dx_prop_.return_value = dx builder = FreeformBuilder(None, None, None, x_scale, None) return builder, expected_value
def top_fixture(self, request, shape_offset_y_prop_): offset_y, y_scale, expected_value = request.param shape_offset_y_prop_.return_value = offset_y builder = FreeformBuilder(None, None, None, None, y_scale) return builder, expected_value
def move_to_fixture(self, _MoveTo_new_, move_to_): x, y = 42, 24 _MoveTo_new_.return_value = move_to_ builder = FreeformBuilder(None, None, None, None, None) return builder, x, y, _MoveTo_new_, move_to_
def add_close_fixture(self, _Close_new_, close_): _Close_new_.return_value = close_ builder = FreeformBuilder(None, None, None, None, None) return builder, _Close_new_, close_
def add_seg_fixture(self, _LineSegment_new_, line_segment_): x, y = 4, 2 _LineSegment_new_.return_value = line_segment_ builder = FreeformBuilder(None, None, None, None, None) return builder, x, y, _LineSegment_new_, line_segment_
def height_fixture(self, request, _dy_prop_): dy, y_scale, expected_value = request.param _dy_prop_.return_value = dy builder = FreeformBuilder(None, None, None, None, y_scale) return builder, expected_value
def add_segs_fixture(self, request, _add_line_segment_, _add_close_): close, close_calls = request.param vertices = ((1, 2), (3, 4), (5, 6)) builder = FreeformBuilder(None, None, None, None, None) add_calls = [call(1, 2), call(3, 4), call(5, 6)] return builder, vertices, close, add_calls, close_calls