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