コード例 #1
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()
コード例 #2
0
 def getAllNFP(self):
     nfp_multi=False 
     if nfp_multi==True:
         tasks=[(main,adjoin) for main in self.polys for adjoin in self.polys]
         res=pool.starmap(NFP,tasks)
         for k,item in enumerate(res):
             i=k//len(self.polys)
             j=k%len(self.polys)
             self.nfp_list[i][j]=GeoFunc.getSlide(item.nfp,-self.centroid_list[i][0],-self.centroid_list[i][1])
     else:
         for i,poly1 in enumerate(self.polys):
             for j,poly2 in enumerate(self.polys):
                 nfp=NFP(poly1,poly2).nfp
                 #NFP(poly1,poly2).showResult()
                 self.nfp_list[i][j]=GeoFunc.getSlide(nfp,-self.centroid_list[i][0],-self.centroid_list[i][1])
     if self.store_nfp==True:
         self.storeNFP()
コード例 #3
0
 def getNFP(self, j, i):
     # j是固定位置,i是移动位置
     row = j * 192 + i * 16 + self.poly_status[j][2] * 4 + self.poly_status[
         i][2]
     bottom_pt = LPAssistant.getBottomPoint(self.polys[j])
     delta_x, delta_y = bottom_pt[0], bottom_pt[1]
     nfp = GeoFunc.getSlide(json.loads(self.all_nfp["nfp"][row]), delta_x,
                            delta_y)
     return nfp
コード例 #4
0
 def getResult(self, placement_points):
     self.final_polys, self.final_poly_status = [], copy.deepcopy(
         self.poly_status)
     for i, poly in enumerate(self.polys):
         self.final_polys.append(
             GeoFunc.getSlide(poly, placement_points[i][0] - self.Xi[i],
                              placement_points[i][1] - self.Yi[i]))
         self.final_poly_status[i][1] = [
             placement_points[i][0], placement_points[i][1]
         ]
コード例 #5
0
    def getInnerFitRectangle(poly,x,y):
        left_index,bottom_index,right_index,top_index=GeoFunc.checkBound(poly) # 获得边界
        new_poly=GeoFunc.getSlide(poly,-poly[left_index][0],-poly[bottom_index][1]) # 获得平移后的结果

        refer_pt=[new_poly[top_index][0],new_poly[top_index][1]]
        ifr_width=x-new_poly[right_index][0]
        ifr_height=y-new_poly[top_index][1]

        IFR=[refer_pt,[refer_pt[0]+ifr_width,refer_pt[1]],[refer_pt[0]+ifr_width,refer_pt[1]+ifr_height],[refer_pt[0],refer_pt[1]+ifr_height]]
        return IFR
コード例 #6
0
    def __init__(self,polys,**kw):
        self.polys=PolyListProcessor.deleteRedundancy(copy.deepcopy(polys))
        self.area_list,self.first_vec_list,self.centroid_list=[],[],[] # 作为参考
        for poly in self.polys:
            P=Polygon(poly)
            self.centroid_list.append(GeoFunc.getPt(P.centroid))
            self.area_list.append(int(P.area))
            self.first_vec_list.append([poly[1][0]-poly[0][0],poly[1][1]-poly[0][1]])
        self.nfp_list=[[0]*len(self.polys) for i in range(len(self.polys))]
        self.load_history=False
        self.history_path=None
        self.history=None
        if 'history_path' in kw:
            self.history_path=kw['history_path']

        if 'load_history' in kw:
            if kw['load_history']==True:
                # 从内存中加载history 直接传递pandas的df对象 缩短I/O时间
                if 'history' in kw:
                    self.history=kw['history']
                self.load_history=True
                self.loadHistory()
        
        self.store_nfp=False
        if 'store_nfp' in kw:
            if kw['store_nfp']==True:
                self.store_nfp=True
        
        self.store_path=None
        if 'store_path' in kw:
            self.store_path=kw['store_path']

        if 'get_all_nfp' in kw:
            if kw['get_all_nfp']==True and self.load_history==False:
                self.getAllNFP()
        
        if 'fast' in kw: # 为BLF进行多进程优化
            if kw['fast']==True:
                self.res=[[0]*len(self.polys) for i in range(len(self.polys))]
                #pool=Pool()
                for i in range(1,len(self.polys)):
                    for j in range(0,i):
                        # 计算nfp(j,i)
                        #self.res[j][i]=pool.apply_async(getNFP,args=(self.polys[j],self.polys[i]))
                        self.nfp_list[j][i]=GeoFunc.getSlide(getNFP(self.polys[j],self.polys[i]),-self.centroid_list[j][0],-self.centroid_list[j][1])
コード例 #7
0
 def getDirectNFP(self,poly1,poly2,**kw):
     if 'index' in kw:
         i=kw['index'][0]
         j=kw['index'][1]
         centroid=GeoFunc.getPt(Polygon(self.polys[i]).centroid)
     else:
         # 首先获得poly1和poly2的ID
         i=self.getPolyIndex(poly1)
         j=self.getPolyIndex(poly2)
         centroid=GeoFunc.getPt(Polygon(poly1).centroid)
     # 判断是否计算过并计算nfp
     if self.nfp_list[i][j]==0:
         nfp=NFP(poly1,poly2).nfp
         #self.nfp_list[i][j]=GeoFunc.getSlide(nfp,-centroid[0],-centroid[1])
         if self.store_nfp==True:
             with open("record/nfp.csv","a+") as csvfile:
                 writer = csv.writer(csvfile)
                 writer.writerows([[poly1,poly2,nfp]])
         return nfp
     else:
         return GeoFunc.getSlide(self.nfp_list[i][j],centroid[0],centroid[1])