kopia lustrzana https://github.com/EmbroidePy/pyembroidery
moved fractal pattern to test patterns
rodzic
f818135751
commit
f135d66f44
|
|
@ -1,5 +1,63 @@
|
|||
from pyembroidery import *
|
||||
|
||||
import math
|
||||
|
||||
|
||||
def evaluate_lsystem(symbol, rules, depth):
|
||||
if depth <= 0 or symbol not in rules:
|
||||
symbol()
|
||||
else:
|
||||
for produced_symbol in rules[symbol]:
|
||||
evaluate_lsystem(produced_symbol, rules, depth - 1)
|
||||
|
||||
|
||||
class Turtle:
|
||||
def __init__(self, pattern):
|
||||
self.pattern = pattern
|
||||
self.angle = 0
|
||||
self.x = 0
|
||||
self.y = 0
|
||||
import math
|
||||
self.turn_amount = math.pi / 3
|
||||
|
||||
def forward(self, distance):
|
||||
self.x += distance * math.cos(self.angle)
|
||||
self.y += distance * math.sin(self.angle)
|
||||
self.pattern.add_stitch_absolute(STITCH, self.x, self.y)
|
||||
# self.pattern.add_stitch_absolute(SEQUIN_EJECT, self.x, self.y)
|
||||
|
||||
def turn(self, angle):
|
||||
self.angle += angle
|
||||
|
||||
def move(self, distance):
|
||||
self.x += distance * math.cos(self.angle)
|
||||
self.y += distance * math.sin(self.angle)
|
||||
|
||||
def add_gosper(self):
|
||||
a = lambda: self.forward(20)
|
||||
b = lambda: self.forward(20)
|
||||
l = lambda: self.turn(self.turn_amount)
|
||||
r = lambda: self.turn(-self.turn_amount)
|
||||
initial = lambda: None
|
||||
rules = {
|
||||
initial: [a],
|
||||
a: [a, l, b, l, l, b, r, a, r, r, a, a, r, b, l],
|
||||
b: [r, a, l, b, b, l, l, b, l, a, r, r, a, r, b]
|
||||
}
|
||||
evaluate_lsystem(initial, rules, 3) # 4
|
||||
|
||||
def add_serp(self):
|
||||
a = lambda: self.forward(20)
|
||||
b = lambda: self.forward(20)
|
||||
l = lambda: self.turn(self.turn_amount)
|
||||
r = lambda: self.turn(-self.turn_amount)
|
||||
initial = lambda: None
|
||||
rules = {
|
||||
initial: [a],
|
||||
a: [b, l, a, l, b],
|
||||
b: [a, r, b, r, a]
|
||||
}
|
||||
evaluate_lsystem(initial, rules, 3) # 6
|
||||
|
||||
def get_big_pattern():
|
||||
pattern = EmbPattern()
|
||||
|
|
@ -81,11 +139,11 @@ def get_simple_pattern():
|
|||
return pattern
|
||||
|
||||
|
||||
def get_random_pattern_large():
|
||||
def get_random_pattern_large(count=1000):
|
||||
pattern = EmbPattern()
|
||||
import random
|
||||
|
||||
for i in range(0, 1000):
|
||||
for i in range(0, count):
|
||||
pattern.add_block(
|
||||
[(random.uniform(-500, 500), random.uniform(-500, 500)),
|
||||
(random.uniform(-500, 500), random.uniform(-500, 500)),
|
||||
|
|
@ -115,3 +173,26 @@ def get_random_pattern_small_halfs():
|
|||
(random.randint(-500, 500) / 2.0, random.randint(-500, 500) / 2.0)],
|
||||
random.randint(0x000000, 0xFFFFFF))
|
||||
return pattern
|
||||
|
||||
|
||||
def get_fractal_pattern():
|
||||
pattern = EmbPattern()
|
||||
turtle = Turtle(pattern)
|
||||
turtle.add_gosper()
|
||||
pattern.add_command(COLOR_BREAK)
|
||||
turtle.move(500)
|
||||
turtle.add_serp()
|
||||
pattern.add_command(SEQUENCE_BREAK)
|
||||
pattern.add_command(STOP)
|
||||
turtle.move(50)
|
||||
turtle.add_serp()
|
||||
pattern.add_command(SEQUENCE_BREAK)
|
||||
turtle.turn(-math.pi / 3)
|
||||
turtle.move(500)
|
||||
turtle.add_serp()
|
||||
pattern.add_command(COLOR_BREAK)
|
||||
turtle.turn(-math.pi / 3)
|
||||
turtle.move(500) # 260, -450
|
||||
turtle.add_gosper()
|
||||
pattern.add_command(END)
|
||||
return pattern
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import unittest
|
|||
from pyembroidery import *
|
||||
from pattern_for_tests import *
|
||||
|
||||
|
||||
class TestConverts(unittest.TestCase):
|
||||
|
||||
def position_equals(self, stitches, j, k):
|
||||
|
|
|
|||
|
|
@ -88,3 +88,5 @@ class TestOverloads(unittest.TestCase):
|
|||
m2.post_scale(2)
|
||||
m2.post_rotate(30)
|
||||
self.assertEqual(catted, m2)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,15 +4,13 @@ import unittest
|
|||
|
||||
from pyembroidery import *
|
||||
from pattern_for_tests import *
|
||||
from pattern_fractal_for_test import *
|
||||
|
||||
|
||||
class TestTrims(unittest.TestCase):
|
||||
|
||||
def test_dst_trims(self):
|
||||
file0 = "trim.dst"
|
||||
pattern = EmbPattern()
|
||||
generate(pattern)
|
||||
pattern = get_fractal_pattern()
|
||||
write_dst(pattern, file0)
|
||||
loaded_pattern = read_dst(file0)
|
||||
self.assertIsNotNone(loaded_pattern)
|
||||
|
|
@ -21,8 +19,7 @@ class TestTrims(unittest.TestCase):
|
|||
|
||||
def test_dst_trims_fail(self):
|
||||
file0 = "trim.dst"
|
||||
pattern = EmbPattern()
|
||||
generate(pattern)
|
||||
pattern = get_fractal_pattern()
|
||||
write_dst(pattern, file0)
|
||||
loaded_pattern = read_dst(file0, {"trim_at": 50}) # Lines beyond 50 jumps get a trim.
|
||||
self.assertIsNotNone(loaded_pattern)
|
||||
|
|
@ -31,8 +28,7 @@ class TestTrims(unittest.TestCase):
|
|||
|
||||
def test_dst_trims_success(self):
|
||||
file0 = "trim.dst"
|
||||
pattern = EmbPattern()
|
||||
generate(pattern)
|
||||
pattern = get_fractal_pattern()
|
||||
write_dst(pattern, file0, {"trim_at": 50}) # We make trim jumps big enough.
|
||||
loaded_pattern = read_dst(file0, {"trim_at": 50, "clipping": False}) # Lines beyond 50 jumps get a trim.
|
||||
self.assertIsNotNone(loaded_pattern)
|
||||
|
|
@ -41,8 +37,7 @@ class TestTrims(unittest.TestCase):
|
|||
|
||||
def test_jef_trims(self):
|
||||
file0 = "trim.jef"
|
||||
pattern = EmbPattern()
|
||||
generate(pattern)
|
||||
pattern = get_fractal_pattern()
|
||||
write_jef(pattern, file0)
|
||||
loaded_pattern = read_jef(file0)
|
||||
self.assertIsNotNone(loaded_pattern)
|
||||
|
|
@ -51,8 +46,7 @@ class TestTrims(unittest.TestCase):
|
|||
|
||||
def test_jef_trims_off(self):
|
||||
file0 = "trim.jef"
|
||||
pattern = EmbPattern()
|
||||
generate(pattern)
|
||||
pattern = get_fractal_pattern()
|
||||
write_jef(pattern, file0)
|
||||
loaded_pattern = read_jef(file0, {"trim_distance": None})
|
||||
self.assertEqual(loaded_pattern.count_stitch_commands(JUMP), 15)
|
||||
|
|
@ -62,8 +56,7 @@ class TestTrims(unittest.TestCase):
|
|||
|
||||
def test_jef_trims_commands(self):
|
||||
file0 = "trim.jef"
|
||||
pattern = EmbPattern()
|
||||
generate(pattern)
|
||||
pattern = get_fractal_pattern()
|
||||
write_jef(pattern, file0, {"trims": True})
|
||||
loaded_pattern = read_jef(file0, {"trim_distance": None})
|
||||
self.assertEqual(loaded_pattern.count_stitch_commands(JUMP), 15)
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue