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
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)
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)
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)]
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)]