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