Example #1
0
    def fixSegment(self, segment, slab_poly):
        e1, e2 = segment.End1.PntCoord, segment.End2.PntCoord
        pnt1 = Pnt(e1.x, e1.y)
        pnt2 = Pnt(e2.x, e2.y)
        end1 = pnt1.copy()
        end2 = pnt2.copy()
        if not pnt1.isInPolygon(slab_poly):
            end1 = self.get_closest_intersection(pnt1, pnt2, slab_poly)

        if not pnt2.isInPolygon(slab_poly):
            end2 = self.get_closest_intersection(pnt2, pnt1, slab_poly)

        if end1 is not None and end2 is None:
            print((e1.x, e1.y, e2.x, e2.y))
            print("polygon")
            for pnt in slab_poly.points:
                print((pnt.x(), pnt.y()))
            raise Exception

        if end1 is None and end2 is not None:
            print((e1.x, e1.y, e2.x, e2.y))
            print("polygon")
            for pnt in slab_poly.points:
                print((pnt.x(), pnt.y()))
            raise Exception

        # start
        # for poly
        #     ('(-1.82486794037,-1.03558377118)', '(-5.12486794037,-1.03558377118)')
        # ('(-9.12486794037,-5.63558377118)', '(-9.12486794037,-0.960583771182)')
        # ('result', '(-9.12486794037,-1.03558377118)')
        # ('outcome', None)
        # ('(-1.82486794037,-1.03558377118)', '(-5.12486794037,-1.03558377118)')
        # ('(-9.12486794037,-0.960583771182)', '(-4.94986794037,-0.960583771182)')
        # ('result', 'None')
        # ('outcome', None)
        # ('(-1.82486794037,-1.03558377118)', '(-5.12486794037,-1.03558377118)')
        # ('(-4.94986794037,-0.960583771182)', '(-4.94986794037,-5.63558377118)')
        # ('result', '(-4.94986794037,-1.03558377118)')
        # ('outcome', None)
        # ('(-1.82486794037,-1.03558377118)', '(-5.12486794037,-1.03558377118)')
        # ('(-4.94986794037,-5.63558377118)', '(-9.12486794037,-5.63558377118)')
        # ('result', 'None')
        # ('outcome', None)
        # (-5.124867940372748, -1.0355837711820652, -1.824867940372748, -1.0355837711820652)
        # polygon
        # (-9.12486794037277, -5.63558377118204)
        # (-9.12486794037277, -0.9605837711820402)
        # (-4.949867940372769, -0.9605837711820402)
        # (-4.949867940372769, -5.63558377118204)
        if end1 is None or end1.minus(end2).magn() == 0:
            return None
        return Segment(EndOfSegment(end1.pnt), EndOfSegment(end2.pnt),
                       segment.Open)
Example #2
0
    def __init__(self, parent=None, wallShapes=None, slabShapes=None):
        super(Launcher, self).__init__()
        self.constraints = {
            "ecc_w": -0.5,
            "area_w": 1,
            "length_w": 1,
            "ratio": 1,
            "d": 1,
        }
        self.levels = Level.generateLevelsFromShapes(wallShapes, slabShapes)
        print("INFO INIT: DONE GENERATING LEVELS FROM SHAPES")
        self.levels.sort(key=lambda lvl: lvl.getHeight())

        self.skeletonLevels = [
            LevelSkeleton.createSkeletonFromLevel(level)
            for level in self.levels
        ]
        self.levelsHash = dict(list(zip(self.levels, self.skeletonLevels)))
        self.skeletonLevelsHash = dict(
            list(zip(self.skeletonLevels, self.levels)))
        print("INFO INIT: DONE GENERATING LEVELSKELETONS FROM LEVELS")
        baseSlabHeight = 0
        for level in self.levels:
            if not len(self.levelsHash[level].getPolys()
                       ):  # or level.getHeight() <= 0:
                baseSlabHeight = level.getHeight()
            else:
                break

        for i, levelSkeleton in enumerate(self.skeletonLevels):
            prevLevels = self.skeletonLevelsHash[
                levelSkeleton].getRightLowerLevels()
            if not prevLevels:
                continue

            prevLevels = [
                self.levelsHash[level] for level in prevLevels
                if level.getHeight() > baseSlabHeight
            ]
            if not len(prevLevels):
                continue
            levelSkeleton.restrictLevelUsableWalls(prevLevels)

        self.storey_mode = False
        self.levels = [
            level for level in self.levels
            if len(self.levelsHash[level].getPolys())
        ]
        self.skeletonLevels = [
            levelSkeleton for levelSkeleton in self.skeletonLevels
            if len(levelSkeleton.getPolys())
        ]
        self.storeySkeletons = []
        heights = []
        for levelSkeleton in self.skeletonLevels:
            height = levelSkeleton.level.getHeight()
            if height not in heights:
                skeletons = [levelSkeleton]
                heights.append(height)
                for ls in self.skeletonLevels:
                    if ls.level.getHeight() == height:
                        skeletons.append(ls)

                self.storeySkeletons.append(StoreySkeleton(skeletons))
        self.solutions = {}
        self.solutions = {}

        self.selectedRow = 1
        self.pend = True

        # Vertical Loads
        Sdiv = SlabDivision(self.storeySkeletons[0])
        # Sdiv.importWalls(self.skeletonLevels[0])
        # Seg = Sdiv.createSlabSegments()
        # f2 = plt.figure(3,)
        # for segment in Sdiv.createSlabSegments():
        #     segment.End1.plotEnd()
        #     segment.End2.plotEnd()
        #     segment.PlotSeg()

        for room in Sdiv.rooms:
            # 0x7fd0cba0b9e0 >
            print(("room", room))
            fig, ax = plt.subplots()
            color = (random(), random(), random())
            color2 = (random(), random(), random())
            for segment in room.get_segments():
                e1, e2 = segment.End1.PntCoord, segment.End2.PntCoord
                pnt1 = Pnt(e1.x, e1.y)
                pnt2 = Pnt(e2.x, e2.y)
                c = color if pnt1.isInPolygon(room.slab_poly) else "r"
                segment.End1.plot(c, (fig, ax))
                c2 = color if pnt2.isInPolygon(room.slab_poly) else "r"
                segment.End2.plot(c2, (fig, ax))
                segment.plot(color, (fig, ax))
            room.plot(color2, figax=(fig, ax))
            # axes = ax.gca()
            ax.set_xlim([-10, 10])
            ax.set_ylim([-8, 8])
            plt.show()