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)
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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]
Esempio n. 5
0
    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)
Esempio n. 6
0
    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
Esempio n. 7
0
    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)
Esempio n. 8
0
    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
Esempio n. 9
0
    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
Esempio n. 10
0
    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
Esempio n. 11
0
    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_)
Esempio n. 12
0
    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
Esempio n. 13
0
    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
Esempio n. 14
0
    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
Esempio n. 15
0
    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_
Esempio n. 16
0
 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_
Esempio n. 17
0
    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_
Esempio n. 18
0
    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
Esempio n. 19
0
 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