Beispiel #1
0
    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)
Beispiel #2
0
    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