def columnSearch(self): self.potentialColumns, self.haxes, self.vaxes = WallSkeleton.Columns( self.skeletonLevels, 0) axes = [self.haxes, self.vaxes] nlvls = len(self.skeletonLevels) self.axesSolution = tabu_search(self.potentialColumns, axes, self.skeletonLevels[nlvls - 1].slabSkeleton, limit=20) print("Haxis solution:") for axis in self.axesSolution.axes[0]: print(axis.bounds) print("Vaxis solution:") for axis in self.axesSolution.axes[1]: print(axis.bounds) Columns = [] for Haxis in self.axesSolution.axes[0]: for Vaxis in self.axesSolution.axes[1]: column = linestring.BaseGeometry.intersection(Haxis, Vaxis) if column not in Columns: Columns.append(column) Distances = WallSkeleton.ColumnDistances(Columns) for i in range(len(Columns)): print("Distance of the column", i, "(", Columns[i].x, Columns[i].y, ")", Distances[0][i], Distances[1][i]) print("Total Height here:", self.totalHeight) self.Columns, self.ColumnsLength = LevelSkeleton.CreateColumnShapes( Distances, self.totalHeight, Columns) for Column in self.Columns: # VDim = round(Column.poly.MaxCoords().y()-Column.poly.MinCoods().y()) # Hdim = round(Column.poly.MaxCoords().x()-Column.poly.MinCoods().x()) print("Column:", Column.centroid, "Vdim:", Column.bounds)
def mergeWalls(wallSkeleton1, wallSkeleton2): #select random space from both walls voiles1 = wallSkeleton1.getVoilesBetween() voiles2 = wallSkeleton2.getVoilesBetween() resVoiles = mergeVoiles(voiles1, voiles2) resWall = WallSkeleton(wallSkeleton1.poly.copy()) for voile in resVoiles: resWall.attachVoile(voile) return resWall
def restrictLevelUsableWalls(self, levelSkeletons): restrictWalls = [] for levelSkeleton in levelSkeletons: toAdd = [] upperLvlsPolys = [ lvl.level.slab.getBasePolygon().poly for lvl in levelSkeletons if lvl.level.getHeight() > levelSkeleton.level.getHeight() ] upperPoly = cascaded_union(upperLvlsPolys) for wallSkeleton in levelSkeleton.wallSkeletons: intersection = wallSkeleton.poly.poly.intersection(upperPoly) if type( intersection ) is not Polygon or intersection.area != wallSkeleton.poly.area( ): toAdd.append(wallSkeleton) restrictWalls += toAdd resultWalls = [] for wallSkeleton in restrictWalls: for wallSkeleton2 in self.wallSkeletons: intersection = wallSkeleton.poly.intersection( wallSkeleton2.poly) if intersection: resultWalls.append(WallSkeleton(intersection)) self.wallSkeletons = resultWalls
def createNewSkeletonfromLevel(level,SolutionAxes): slabSkeleton = SlabSkeleton.createSkeletonFromSlab(level.slab) wallSkeletons = [] lowerlevel = level.getLowerLevel() lowZ = None if lowerlevel is None else lowerlevel.slab.getHighestZ() print("for ", level, "lowz is: ", lowZ) test=False if lowZ is None: lowZ = 0 for axis in SolutionAxes.axes[0]: print("here axis",axis.coords[0][1]) for wall in level.walls: wallSkeletons += WallSkeleton.createSkeletonsFromWall(wall, lowZ, level.slab.getLowestZ()) # for wall in level.walls: # wallSkeleton = WallSkeleton.createSkeletonFromWall(wall) # x = round(wallSkeleton.poly.centroid().x,2) # y = round(wallSkeleton.poly.centroid().y,2) # for axis in SolutionAxes.axes[0]: # if y==axis.coords[0][1]: # wallSkeletons += WallSkeleton.createSkeletonsFromWall(wall, # lowZ, # level.slab.getLowestZ()) # test = True # for axis in SolutionAxes.axes[1]: # if x==axis.coords[0][0]: # # print("I am here Vertical",mid,"\n",axis) # wallSkeletons += WallSkeleton.createSkeletonsFromWall(wall, # lowZ, # level.slab.getLowestZ()) # test = True # if test == False: level.walls.remove(wall) return LevelSkeleton(wallSkeletons, slabSkeleton, level)
def createSkeletonFromLevel(level): slabSkeleton = SlabSkeleton.createSkeletonFromSlab(level.slab) wallSkeletons = [] lowerlevel = level.getLowerLevel() lowZ = None if lowerlevel is None else lowerlevel.slab.getHighestZ() for wall in level.walls: wallSkeletons += WallSkeleton.createSkeletonsFromWall( wall, lowZ, level.slab.getLowestZ()) # wallSkeletons = [WallSkeleton.createSkeletonFromWall(wall) for wall in level.walls] return LevelSkeleton(wallSkeletons, slabSkeleton, level)
def showLowerFun(self): if self.selectedRow is not None: from matplotlib import pyplot as plt levelSkeleton = self.skeletonLevels[self.selectedRow] if levelSkeleton in self.solutions: levelSkeleton = self.solutions[levelSkeleton].levelSkeleton polys, colors = self.getPolygonsFromLevelSkeletons(levelSkeleton) colors = [[c.red() / 255., c.green() / 255., c.blue() / 255., 0.8] for c in colors] c = colors[-1] # Plotter.plotPolys(polys, self.selectedRow, "plan", colors) # plt.savefig('try1.png', bbox_inches='tight') polys = [poly.poly for poly in polys] alphas = [1 for poly in polys] c1 = levelSkeleton.getCenterFromSlab() c2 = levelSkeleton.getCenterFromShear() polys += [ Point(c1.x(), c1.y()).buffer(0.1), Point(c2.x(), c2.y()).buffer(0.1) ] colors += [[0, 1, 0], [1, 0, 0]] alphas += [1, 1] # Plotter.plotShapely(polys, colors, alphas, 30, title="plan") boxes = [ voileSkeleton.getSurrondingBox(self.constraints['d']) for wallSkeleton in levelSkeleton.wallSkeletons for voileSkeleton in wallSkeleton.getAllVoiles() ] polys += boxes alphas += [0.2 for poly in boxes] PotentialColumns, haxes, vaxes = WallSkeleton.Columns( self.skeletonLevels, self.selectedRow) for PotentialColumn in PotentialColumns: polys += [ Point(PotentialColumn.x, PotentialColumn.y).buffer(0.1) ] colors += [[1, 0, 0]] alphas += [1, 1] axes = haxes + vaxes for column in self.Columns: polys += [column] colors += [[1, 0, 0]] alphas += [1, 1] Plotter.plotShapely(polys, colors, alphas, 20) for axe in axes: plt.plot(*axe.xy, color='red', linestyle='dashed', linewidth=1) plt.show()
def crossWalls(wallSkeleton1, wallSkeleton2, crossPoint=0.5): print "cross Point: " + str(crossPoint) #select random space from both walls voiles1 = wallSkeleton1.getVoilesBetween(0, crossPoint) voiles2 = wallSkeleton2.getVoilesBetween(crossPoint, 1) resVoiles = mergeVoiles(voiles1, voiles2) resWall1 = WallSkeleton(wallSkeleton1.poly.copy()) for voile in resVoiles: resWall1.attachVoile(voile) voiles1 = wallSkeleton2.getVoilesBetween(0, crossPoint) voiles2 = wallSkeleton1.getVoilesBetween(crossPoint, 1) resVoiles = mergeVoiles(voiles1, voiles2) resWall2 = WallSkeleton(wallSkeleton1.poly.copy()) for voile in resVoiles: resWall2.attachVoile(voile) return resWall1, resWall2
def removeUnwantedWalls(LevelSkeletons,SolutionAxes,Columns): for levelSkeleton in LevelSkeletons: newWallSkeletons1 = [] newWallSkeletons4 = [] print("number of level", LevelSkeletons.index(levelSkeleton)) for wallskeleton in levelSkeleton.wallSkeletons: y = round(wallskeleton.poly.centroid().y, 2) x = round(wallskeleton.poly.centroid().x, 2) print("here wall ",levelSkeleton.wallSkeletons.index(wallskeleton),":",x,y) for axis in SolutionAxes.axes[0]: # print("here axis:",axis) if y==axis.coords[0][1] : newWallSkeletons1.append(wallskeleton) # print("added horizontal") for axis in SolutionAxes.axes[1]: if x==axis.coords[0][0] : newWallSkeletons1.append(wallskeleton) # if not test: levelSkeleton.wallSkeletons.remove(wallskeleton) for wallsklt in LevelSkeleton.removeColumnIntersections(newWallSkeletons1,Columns): newWallSkeletons4.append(wallsklt) for Column in Columns: pnts = Column.exterior.coords Pnts = [] for i in range(len(pnts)): Pnts.append(Pnt(pnts[i][0], pnts[i][1])) wall = Poly(Pnts) wallsklt = WallSkeleton.createSkeletonFromPoly(wall) wallsklt.iscolumnParent = True newWallSkeletons4.append(wallsklt) NewWallSkeletons = [] for wall in newWallSkeletons4: if wall not in NewWallSkeletons: NewWallSkeletons.append(wall) levelSkeleton.wallSkeletons = copy.deepcopy(NewWallSkeletons) return LevelSkeletons
def Addnewpolys(polygon): newwallsklt = WallSkeleton.createSkeletonFromPoly(polygon) return newwallsklt
def multiSearch(self): def mygen2(): c = { "rad_w": 0, "ecc_w": -0.5, "area_w": 3, "length_w": 1, "ratio": 1, "d": 1, } area_w = [0.1, 0.5, 1, 1.5, 2] length_w = [0.1, 0.5, 1, 1.5, 2] for aw in area_w: c['area_w'] = aw yield c c['area_w'] = 1 for lw in length_w: c['length_w'] = lw yield c def mygenprov(): c = { "rad_w": 0, "ecc_w": 0.5, "area_w": 5, "length_w": 0, "ratio": 1, "d": 1, } yield c def mygen(): c = { "rad_w": 1, "ecc_w": -0.5, "area_w": 1, "length_w": 5, "ratio": 1, "d": 1, } area_w = [1.5, 2, 3, 4, 10] d_ratios = [0.25, 0.5, 0.75] for d in d_ratios: c['d'] = d for w in area_w: c['area_w'] = w yield c break break count = 1 for consts in mygenprov(): dirname = 'savedWrong/constraints' + str(count) + '/' if not os.path.exists(dirname): os.makedirs(dirname) open( dirname + 'constraints.txt', 'w').write("Torsional radius weight: " + str(consts['rad_w']) + "Eccentricity weight: " + str(consts['ecc_w']) + "\nShear Wall length weight: " + str(consts['length_w']) + "\nShear Wall cover area weight: " + str(consts['area_w'])) self.constraints = consts self.init_skeletons(ind=1) self.solutions = {} froot = dirname + '/' if not os.path.exists(froot): os.makedirs(froot) f = open(froot + 'Scores.txt', 'w') scores = [] for levelSkeleton in self.skeletonLevels[::-1]: if self.skeletonLevels.index(levelSkeleton) == len( self.skeletonLevels) - 1: self.ColumnsVoileSkeleton = WallSkeleton.ColumnToVoile( self.Columns, levelSkeleton.wallSkeletons) levelSkeleton.addColumnsAsVoiles(self.ColumnsVoileSkeleton) level = self.skeletonLevelsHash[levelSkeleton] prevs = [ self.solutions[self.levelsHash[p]].levelSkeleton for p in level.getUpperLevels() if self.levelsHash[p] in self.solutions ] print(("PREVS LENGTH IS", len(prevs))) if len(prevs): levelSkeleton.copyLevelsVoiles(prevs) i = self.skeletonLevels.index(levelSkeleton) distributionScore = 0.6 SYM = 0 # overlapscore = 1 j = 1 w = [0.5, 1, 1.5, 2] combs = [] [combs.append(p) for p in itertools.product(w, repeat=4)] # combs = [[1,0.5,1,2]] l = 1 for comb in combs: print('Progress', l / len(combs) * 100, '%', '_', l) l = l + 1 # while j==1 : solution = None for i in range(1): if self.skeletonLevels.index(levelSkeleton) == len( self.skeletonLevels) - 1: while True: try: solution = search( levelSkeleton, filename="leve" + str(i), constraints=self.constraints, Comb=comb) except: continue break else: LS = self.skeletonLevels[len(self.skeletonLevels) - 1] solution = self.solutions[LS] fitness = solution.getFitness( constraints=self.constraints) scores.append([ fitness['sym'], fitness['area'], fitness['rad'], fitness['distribution'], fitness['totalScore'] ]) distributionScore = fitness['distribution'] SYM = fitness['sym'] print('result gave ', distributionScore, SYM) # j = 2 # overlapscore = fitness['overlapped'] # print("here condition out", distributionScore, overlapscore ) self.solutions[levelSkeleton] = solution for l in range(len(scores)): if (l % 2) == 0: score = scores[l] f.write( str(score[0]) + "/" + str(score[1]) + "/" + str(score[2]) + "/" + str(score[3]) + "/" + str(score[4]) + "\n") self.saveSkeletons(dirname) count += 1