75 lines
2.2 KiB
Python
Executable File
75 lines
2.2 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
|
|
|
import math
|
|
|
|
|
|
class Command:
|
|
inicoms = ("IN", "SP", "LT") # nicht benutzt
|
|
scalecoms = ("PA", "PD", "PR", "PU", "CI") # Liste skalierbarer HPGL-Befehle
|
|
movecoms = ("PA", "PD", "PU") # Liste verschiebbarer HPGL-Befehle
|
|
abscoms = ("PA", "PD", "PU")
|
|
relcoms = ("PR")
|
|
arccoms = ("CI", "AA")
|
|
|
|
def __init__(self, name, *args):
|
|
self.name = name
|
|
self.args = args
|
|
|
|
@property
|
|
def scalable(self):
|
|
return self.name in Command.scalecoms and self.args
|
|
|
|
@property
|
|
def movable(self):
|
|
return self.name in Command.movecoms and self.args
|
|
|
|
@property
|
|
def x(self):
|
|
return self.args[0] if self.args else None
|
|
|
|
@property
|
|
def y(self):
|
|
return self.args[-1] if self.args else None
|
|
|
|
def __trunc__(self):
|
|
return Command(self.name, *[int(arg) for arg in self.args])
|
|
|
|
def __len__(self):
|
|
return len(str(self))
|
|
|
|
def __str__(self):
|
|
return self.name + ",".join(str(int(arg)) for arg in self.args) + ";"
|
|
|
|
def __mul__(self, factor):
|
|
if not self.scalable:
|
|
return self
|
|
if type(factor) == type(0) or type(factor) == type(0.0):
|
|
factor = (factor, factor)
|
|
return Command(self.name, (self.args[0] * factor[0]), (self.args[1] * factor[1])) \
|
|
if len(self.args) > 1 else \
|
|
Command(self.name, (self.args[0] * factor[0]))
|
|
|
|
def __add__(self, addend):
|
|
if not self.movable:
|
|
return self
|
|
if type(addend) == type(0) or type(addend) == type(0.0):
|
|
addend = (addend, addend)
|
|
return Command(self.name, (self.x + addend[0]), (self.y + addend[1]))
|
|
|
|
def __sub__(self, addend):
|
|
if type(addend) == type(0) or type(addend) == type(0.0):
|
|
addend = (addend, addend)
|
|
return self + (-addend[0], -addend[1])
|
|
|
|
def rotate(self, angl):
|
|
if not self.movable:
|
|
return self
|
|
cosa = math.cos(angl * math.pi / 180)
|
|
sina = math.sin(angl * math.pi / 180)
|
|
return Command(self.name, (self.x * cosa - self.y * sina), (self.y * cosa + self.x * sina))
|
|
|
|
def flip(self):
|
|
if not self.movable:
|
|
return self
|
|
return Command(self.name, self.x, -self.y)
|