Completed
Push — master ( 44ec51...0333f2 )
by Erik
15s queued 11s
created

pypen.drawing.pypen_class.PyPen.ellipse()   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
nop 8
dl 0
loc 8
rs 10
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
import ctypes
2
3
from pypen.drawing.color import Color
4
from pypen.utils.math import TAU
5
from pypen.settings import default_settings 
6
import cairo
7
from pyglet import gl, image
8
9
class PyPen():
10
    def __init__(self, user_sketch):
11
        self.user_sketch = user_sketch
12
13
        self.surface_data = None
14
        self.surface = None
15
        self.context = None
16
17
        self.update_settings()
18
        self._fix_primitive_functions()
19
20
    def _fix_primitive_functions(self):
21
        self.user_sketch.fill_screen = self.fill_screen
22
        self.user_sketch.clear_screen = self.clear_screen
23
        self.user_sketch.clear = self.clear
24
25
        self.user_sketch.rectangle = self.rectangle
26
        self.user_sketch.circle = self.circle
27
        self.user_sketch.ellipse = self.ellipse
28
        self.user_sketch.arc = self.arc
29
30
        self.user_sketch.arc = self.arc
31
32
        self.user_sketch.rotate = self.rotate
33
        self.user_sketch.translate = self.translate
34
        self.user_sketch.scale = self.scale
35
        self.user_sketch.save = self.save
36
        self.user_sketch.restore = self.restore
37
38
        self.user_sketch.reset_style = self.reset_style
39
40
    def _fill(self, unparsed_fill_color):
41
        if unparsed_fill_color != "":
42
            self.user_sketch.settings.fill_color = unparsed_fill_color
43
44
        fill_color = Color.from_user_input(self.user_sketch.settings.fill_color)
45
        self.context.set_source_rgba(*fill_color.rgba())
46
        self.context.fill()
47
48
    def _stroke(self, unparsed_stroke_color, unparsed_stroke_width):
49
        if unparsed_stroke_color != "":
50
            self.user_sketch.settings.stroke_color = unparsed_stroke_color
51
52
        if unparsed_stroke_width >= 0:
53
            self.user_sketch.settings.stroke_width = unparsed_stroke_width
54
55
        stroke_color = Color.from_user_input(self.user_sketch.settings.stroke_color)
56
        stroke_width = self.user_sketch.settings.stroke_width
57
58
        self.context.set_line_width(stroke_width)
59
        self.context.set_source_rgba(*stroke_color.rgba())
60
        self.context.stroke_preserve()
61
62
    def rotate(self, angle=0):
63
        self.context.rotate(angle)
64
65
    def translate(self, x=0, y=0):
66
        self.context.translate(x, y)
67
68
    def scale(self, factor=1):
69
        self.context.scale(factor)
70
71
    def save(self):
72
        self.context.save()
73
74
    def restore(self):
75
        self.context.restore()
76
77
    def reset_style(self):
78
        self.user_sketch.settings.fill_color = default_settings.fill_color
79
        self.user_sketch.settings.stroke_color = default_settings.stroke_color
80
        self.user_sketch.settings.stroke_width = default_settings.stroke_width
81
82
    def update_settings(self):
83
        self.surface_data = (ctypes.c_ubyte * (self.user_sketch.settings.width * self.user_sketch.settings.height * 4))()
84
        self.surface = cairo.ImageSurface.create_for_data(self.surface_data,
85
                                                          cairo.FORMAT_ARGB32,
86
                                                          self.user_sketch.settings.width,
87
                                                          self.user_sketch.settings.height,
88
                                                          self.user_sketch.settings.width * 4)
89
        self.context = cairo.Context(self.surface)
90
        self.texture = image.Texture.create_for_size(gl.GL_TEXTURE_2D, self.user_sketch.settings.width, self.user_sketch.settings.height, gl.GL_RGBA)
91
92
    def clear_screen(self):
93
        self.fill_screen("default_background_color")
94
95
    def clear(self):
96
        self.clear_screen()
97
98
    def fill_screen(self, color="default_background_color"):
99
        background_color = Color.from_user_input(color)
100
        self.context.save()
101
        self.context.scale(self.user_sketch.settings.width, self.user_sketch.settings.height)
102
        self.context.rectangle(0, 0, 1, 1)
103
        self.context.set_source_rgba(*background_color.rgba())
104
        self.context.fill()
105
        self.context.restore()
106
107
    def rectangle(self, x, y, width, height, fill_color="", stroke_color="", stroke_width=-1):
108
        self.context.rectangle(x, y, width, height)
109
        self._stroke(stroke_color, stroke_width)
110
        self._fill(fill_color)
111
112
    def circle(self, x, y, radius, fill_color="", stroke_color="", stroke_width=-1):
113
        self.context.arc(x, y, radius, 0, TAU)
114
        self._stroke(stroke_color, stroke_width)
115
        self._fill(fill_color)
116
117
    def ellipse(self, x, y, width, height, fill_color="", stroke_color="", stroke_width=-1):
118
        ratio = height/width
119
        self.save()
120
        self.context.scale(1, ratio)
121
        self.context.arc(x, y/ratio, width, 0, TAU)
122
        self.restore()
123
        self._stroke(stroke_color, stroke_width)
124
        self._fill(fill_color)
125
126
    def arc(self, x, y, radius, start_angle, stop_angle, fill_color="", stroke_color="", stroke_width=-1):
127
        self.context.arc(x, y, radius, start_angle, stop_angle)
128
        self._stroke(stroke_color, stroke_width)
129
        self._fill(fill_color)
130