Пример #1
0
    def placePoly(self, index):
        adjoin = self.polygons[index]
        # 是否垂直
        if self.vertical == True:
            ifr = packing.PackingUtil.getInnerFitRectangle(
                self.polygons[index], self.width, self.length)
        else:
            ifr = packing.PackingUtil.getInnerFitRectangle(
                self.polygons[index], self.length, self.width)
        differ_region = Polygon(ifr)

        for main_index in range(0, index):
            main = self.polygons[main_index]
            if self.NFPAssistant == None:
                nfp = NFP(main, adjoin, rectangle=self.rectangle).nfp
            else:
                nfp = self.NFPAssistant.getDirectNFP(main, adjoin)
            nfp_poly = Polygon(nfp)
            try:
                differ_region = differ_region.difference(nfp_poly)
            except:
                print('NFP failure, polys and nfp are:')
                print([main, adjoin])
                print(nfp)
                self.showAll()
                self.showPolys([main] + [adjoin] + [nfp])
                print('NFP loaded from: ', self.NFPAssistant.history_path)

        differ = GeoFunc.polyToArr(differ_region)
        differ_index = self.getBottomLeft(differ)
        refer_pt_index = GeoFunc.checkTop(adjoin)
        GeoFunc.slideToPoint(self.polygons[index], adjoin[refer_pt_index],
                             differ[differ_index])
Пример #2
0
    def run(self):
        self.cur_polys.append(GeoFunc.getSlide(self.polys[0], 1000,
                                               1000))  # 加入第一个形状
        self.border_left, self.border_right, self.border_bottom, self.border_top = 0, 0, 0, 0  # 初始化包络长方形
        self.border_height, self.border_width = 0, 0
        for i in range(1, len(self.polys)):
            # 更新所有的边界情况
            self.updateBound()

            # 计算NFP的合并情况
            feasible_border = Polygon(self.cur_polys[0])
            for fixed_poly in self.cur_polys:
                nfp = self.NFPAssistant.getDirectNFP(fixed_poly, self.polys[i])
                feasible_border = feasible_border.union(Polygon(nfp))

            # 获得所有可行的点
            feasible_point = self.chooseFeasiblePoint(feasible_border)

            # 获得形状的左右侧宽度
            poly_left_pt, poly_bottom_pt, poly_right_pt, poly_top_pt = GeoFunc.checkBoundPt(
                self.polys[i])
            poly_left_width, poly_right_width = poly_top_pt[0] - poly_left_pt[
                0], poly_right_pt[0] - poly_top_pt[0]

            # 逐一遍历NFP上的点,选择可行且宽度变化最小的位置
            min_change = 999999999999
            target_position = []
            for pt in feasible_point:
                change = min_change
                if pt[0] - poly_left_width >= self.border_left and pt[
                        0] + poly_right_width <= self.border_right:
                    # 形状没有超出边界,此时min_change为负
                    change = min(self.border_left - pt[0],
                                 self.border_left - pt[0])
                elif min_change > 0:
                    # 形状超出了左侧或右侧边界,若变化大于0,则需要选择左右侧变化更大的值
                    change = max(self.border_left - pt[0] + poly_left_width,
                                 pt[0] + poly_right_width - self.border_right)
                else:
                    # 有超出且min_change<=0的时候不需要改变
                    pass

                if change < min_change:
                    min_change = change
                    target_position = pt

            # 平移到最终的位置
            reference_point = self.polys[i][GeoFunc.checkTop(self.polys[i])]
            self.cur_polys.append(
                GeoFunc.getSlide(self.polys[i],
                                 target_position[0] - reference_point[0],
                                 target_position[1] - reference_point[1]))

        self.slideToBottomLeft()
        self.showResult()
Пример #3
0
 def getLength(self):
     _max = 0
     for i in range(0, len(self.polygons)):
         if self.vertical == True:
             extreme_index = GeoFunc.checkTop(self.polygons[i])
             extreme = self.polygons[i][extreme_index][1]
         else:
             extreme_index = GeoFunc.checkRight(self.polygons[i])
             extreme = self.polygons[i][extreme_index][0]
         if extreme > _max:
             _max = extreme
     self.contain_length = _max
     # PltFunc.addLine([[0,self.contain_length],[self.width,self.contain_length]],color="blue")
     return _max