Esempio n. 1
0
    def addImage(self, image):

        fr = sorted(self.free_rect, key=lambda rect: rect.area())
        print fr

        fr = filter(lambda rect: rect.area() > image.crop.area(), fr)
        print fr

        for rect in fr:
            s, r1, r2, rotate = rect.split(image.crop, Rect.RULE_PICK_BOTH)

            if s > 0:
                image.origin = rect.origin
                image.rotated = rotate

                if s == 1:
                    del fr[rect]
                    fr += [r1]
                    return Bin.addImage(self, image=image)

                elif s == 2:
                    del fr[rect]
                    fr += [r1, r2]
                    return Bin.addImage(self, image=image)

                else:
                    raise SystemError('Error')

        return False
    def __init__(self, size=DEFAULT_BIN_SIZE, origin=Point(), bin_parameters=None):
        Bin.__init__(self, size=size, origin=origin, bin_parameters=bin_parameters)

        self.select_variant = self.bin_parameters['selection_variant']
        self.select_heuristic = self.bin_parameters['selection_heuristic']
        self.split_rule = self.bin_parameters['split_rule']

        self.free_rects = [Rect(size=self.size)]
    def addImage(self, image):

        # Проходим по каждой полке ...
        for shelf in self.shelfs:

            # ... и пробуем добавить изображение ...
            if shelf.addImage(image):
                # ... если получается добавляем изображение в контейнер ...
                return Bin.addImage(self, image)
        else:
            # Если не в одну полку изображение не вошло создаём новую полку и добавляем изображение в
            # контейнер если изображение входит в эту полку, в противном случае, оно не
            # входит в контейнер
            return Bin.addImage(self, image) if self._newShelf().addImage(image) else False
    def addImage(self, image):

        af = lambda x: x.area()
        ssf = lambda x: min(x.size.width - image.size.width, x.size.height - image.size.height)
        lsf = lambda x: max(x.size.width - image.size.width, x.size.height - image.size.height)

        # Сортируем
        rects = sorted(self.free_rects, key=[af, ssf, lsf][self.select_heuristic], reverse=bool(self.select_variant))

        # Проходим по свободным прямоугольникам
        for rect in rects:
            # Делим прямоугольник обрезанным прямоугольником из нашего изображения
            s, rs1, rs2, rotate = rect.split(image.crop, self.split_rule)

            # Если разрезание прошло успешно ...
            if s > 0:

                # ... в изображение записываем новые, смещение и поворот
                image.origin = rect.origin
                image.rotated = rotate

                # Если разрезало на 2 части ...
                if s == 2:
                    # ... удаляем текущий прямоугольник ...
                    self.free_rects.remove(rect)
                    # ... и вставляем 2 новых
                    self.free_rects += [rs1, rs2]
                    # Добавляем изображение в контейнер
                    return Bin.addImage(self, image)

                # Если отрезало одну часть
                elif s == 1:
                    # ... удаляем текущий прямоугольник ...
                    self.free_rects.remove(rect)
                    # ... добавляем новый
                    self.free_rects += [rs1]
                    # Добавляем изображение в контейнер
                    return Bin.addImage(self, image)

                # Такого не может быть ...
                else:
                    raise RuntimeError(u'Пиздёж и провокация')

        # Если мы прошли по всем свободным прямоугольникам в изображении и никуда изображение не вошло ...
        else:
            # Возвращаем False
            return False
Esempio n. 5
0
    def test_fillLevel(self):
        b = Bin(Size(256, 256), Point(0, 0))

        self.assertTrue(b.addImage(Rect(Point(0, 0), Size(10, 10))))
        self.assertLess(math.fabs(b.fillLevel() - (10. * 10.) / (256. * 256.)), 1e-6)

        self.assertTrue(b.addImage(Rect(Point(0, 0), Size(20, 20))))
        self.assertLess(math.fabs(b.fillLevel() - (10. * 10. + 20. * 20.) / (256. * 256.)), 1e-6)

        self.assertTrue(b.addImage(Rect(Point(0, 0), Size(40, 40))))
        self.assertLess(math.fabs(b.fillLevel() - (10. * 10. + 20. * 20. + 40. * 40.) / (256. * 256.)), 1e-6)
Esempio n. 6
0
    def test_append1(self):
        b = Bin(Size(256, 256), Point(0, 0))

        self.assertTrue(b.addImage(Rect(Point(0, 0), Size(10, 10))))
        self.assertEqual(len(b.images), 1)
        # area = 100

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(100, 100))))
        self.assertEqual(len(b.images), 2)
        # area == 10100

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(100, 100))))
        self.assertEqual(len(b.images), 3)
        # area == 20100

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(100, 100))))
        self.assertEqual(len(b.images), 4)
        # area == 30100

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(100, 100))))
        self.assertEqual(len(b.images), 5)
        # area == 40100

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(50, 50))))
        self.assertEqual(len(b.images), 6)
        # area == 42600

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(50, 50))))
        self.assertEqual(len(b.images), 7)
        # area == 45100

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(50, 50))))
        self.assertEqual(len(b.images), 8)
        # area == 47600

        self.assertTrue(b.addImage(Rect(Point(10, 10), Size(50, 50))))
        self.assertEqual(len(b.images), 9)
        # area == 50100

        # assert b.addImage(Rect(Point(10, 10), Size(100, 100)))
        # assert len(b.images) == 10

        self.assertFalse(b.addImage(Rect(Point(0, 0), Size(512, 512))))
        self.assertEqual(len(b.images), 9)
Esempio n. 7
0
    def __init__(self, size=DEFAULT_BIN_SIZE, origin=Point(), bin_parameters=None):
        Bin.__init__(self, size=size, origin=origin, bin_parameters=bin_parameters)

        self.free_rect = [Rect(size=self.size)]
Esempio n. 8
0
    def __init__(self, size=DEFAULT_BIN_SIZE, origin=Point(0, 0), bin_parameters=None):
        Bin.__init__(self, size=size, origin=origin, bin_parameters=bin_parameters)

        self.shelfs = [Shelf(self.size)]