def test_transformation(self): t = Transform(matrix=((1, 2, 3), (4, 5, 6))) first = Vector2d() prev = Vector2d(31, 97) prev_prev = Vector2d(5, 7) for Cmd in (Line, Move, Curve, Smooth, Quadratic, TepidQuadratic, Arc): random_seg = self.get_random_cmd(Cmd) self.assertTrue(random_seg.transform(t) is not random_seg) # transform returns copy self.assertEqual( random_seg.transform(t).name, Cmd.name) # transform does not change Command type T = Transform() T.add_translate(10, 20) A = [ T.apply_to_point(p) for p in random_seg.control_points(first, prev, prev_prev) ] first2, prev2, prev_prev2 = (T.apply_to_point(p) for p in (first, prev, prev_prev)) B = list( random_seg.translate(Vector2d(10, 20)).control_points( first2, prev2, prev_prev2)) self.assertAlmostTuple(A, B) T = Transform() T.add_scale(10, 20) A = [ T.apply_to_point(p) for p in random_seg.control_points(first, prev, prev_prev) ] first2, prev2, prev_prev2 = (T.apply_to_point(p) for p in (first, prev, prev_prev)) B = list( random_seg.scale( (10, 20)).control_points(first2, prev2, prev_prev2)) self.assertAlmostTuple(A, B) T = Transform() T.add_rotate(35, 15, 28) A = [ T.apply_to_point(p) for p in random_seg.control_points(first, prev, prev_prev) ] first2, prev2, prev_prev2 = (T.apply_to_point(p) for p in (first, prev, prev_prev)) B = list( random_seg.rotate(35, Vector2d(15, 28)).control_points( first2, prev2, prev_prev2)) self.assertAlmostTuple(A, B)
def getHpgl(self): """Return the HPGL instructions""" # dryRun to find edges transform = Transform( [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, 0.0], [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, 0.0]]) transform.add_rotate(int(self.options.orientation)) self.vData = [['', 'False', 0], ['', 'False', 0], ['', 'False', 0], ['', 'False', 0]] self.process_group(self.doc, transform) if self.divergenceX == 'False' or self.divergenceY == 'False' or self.sizeX == 'False' or self.sizeY == 'False': raise NoPathError("No paths found") # live run self.dryRun = False # move drawing according to various modifiers if self.options.autoAlign: if self.options.center: self.offsetX -= (self.sizeX - self.divergenceX) / 2 self.offsetY -= (self.sizeY - self.divergenceY) / 2 else: self.divergenceX = 0.0 self.divergenceY = 0.0 if self.options.center: if self.options.orientation == '0': self.offsetX -= (self.docWidth * self.scaleX) / 2 self.offsetY += (self.docHeight * self.scaleY) / 2 if self.options.orientation == '90': self.offsetY += (self.docWidth * self.scaleX) / 2 self.offsetX += (self.docHeight * self.scaleY) / 2 if self.options.orientation == '180': self.offsetX += (self.docWidth * self.scaleX) / 2 self.offsetY -= (self.docHeight * self.scaleY) / 2 if self.options.orientation == '270': self.offsetY -= (self.docWidth * self.scaleX) / 2 self.offsetX -= (self.docHeight * self.scaleY) / 2 else: if self.options.orientation == '0': self.offsetY += self.docHeight * self.scaleY if self.options.orientation == '90': self.offsetY += self.docWidth * self.scaleX self.offsetX += self.docHeight * self.scaleY if self.options.orientation == '180': self.offsetX += self.docWidth * self.scaleX if not self.options.center and self.toolOffset > 0.0: self.offsetX += self.toolOffset self.offsetY += self.toolOffset # initialize transformation matrix and cache transform = Transform( [[ self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, -float(self.divergenceX) + self.offsetX ], [ 0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, -float(self.divergenceY) + self.offsetY ]]) transform.add_rotate(int(self.options.orientation)) self.vData = [['', 'False', 0], ['', 'False', 0], ['', 'False', 0], ['', 'False', 0]] # add move to zero point and precut if self.toolOffset > 0.0 and self.options.precut: if self.options.center: # position precut outside of drawing plus one time the tooloffset if self.offsetX >= 0.0: precutX = self.offsetX + self.toolOffset else: precutX = self.offsetX - self.toolOffset if self.offsetY >= 0.0: precutY = self.offsetY + self.toolOffset else: precutY = self.offsetY - self.toolOffset self.processOffset('PU', Vector2d(precutX, precutY), self.options.pen, self.options.speed, self.options.force) self.processOffset( 'PD', Vector2d(precutX, precutY + self.toolOffset * 8), self.options.pen, self.options.speed, self.options.force) else: self.processOffset('PU', Vector2d(0, 0), self.options.pen, self.options.speed, self.options.force) self.processOffset('PD', Vector2d(0, self.toolOffset * 8), self.options.pen, self.options.speed, self.options.force) # start conversion self.process_group(self.doc, transform) # shift an empty node in in order to process last node in cache if self.toolOffset > 0.0 and not self.dryRun: self.processOffset('PU', Vector2d(0, 0), 0, 0, 0) return self.hpgl