def test_subsite_intersects_with_site(self):
     self.mainsite.drop_child(self.subsite)
     subsite = SiteNode(rect(-1, -1, 7, 5),
                        id="{Intersecting subsite}",
                        parent_site=self.mainsite)
     with self.assertRaises(RuntimeError) as cm:
         builder.recursively_merge_all_subsites(self.mainsite)
     self.assertEqual(
         str(cm.exception),
         'SiteNode #{Intersecting subsite} is not strictly '
         'contained in main site')
 def test_multipolygon_infrastructure_landtake(self):
     site_rect = rect(1, 1, 12, 12)
     mainsite = SiteNode(site_rect, id="{Main site}")
     rec, tri = rect(9, 9, 10, 10), [(2, 2), (2, 4), (3, 4)]
     building = InfrastructureLandtake(rec,
                                       tri,
                                       parent_site=mainsite,
                                       id="{multipolygon building}")
     coords = list(map(list, building._coords))
     expected_coords = [
         [(9, 9), (10, 9), (10, 10), (9, 10), (9, 9)],
         [(2, 2), (2, 4), (3, 4), (2, 2)],
     ]
     self.assertEqual(coords, expected_coords)
     cleaner = builder.recursively_merge_all_subsites(mainsite)
     msite = cleaner.merged_site()
     mbuilder = builder.MeshBuilder(msite)
     alti = mbuilder._build_altimetric_base()
     bmesh = mbuilder._build_triangulation(alti)
     mbuilder._compute_informations(bmesh)
     vertices = [
         list(map(bmesh.py_vertex, vertices_groups))
         for vertices_groups in mbuilder.vertices_for_feature[building.id]
     ]
     assert_array_equal(vertices, expected_coords)
Example #3
0
 def test_build_altimetric_base(self):
     cleaner = builder.recursively_merge_all_subsites(self.mainsite)
     for id_ in ["{Mainsite ref altitude}", "{Subsub level curve}"]:
         self.assertIn(id_, cleaner.equivalent_site.features_by_id)
         self.assertIn(id_, cleaner.geom)
     msite = cleaner.merged_site()
     alti = builder.MeshBuilder(msite)._build_altimetric_base()
     common_expectations = [((0, 0), {'altitude': self.altitude_A})]
     self.check_vertices_props(alti, common_expectations)
Example #4
0
 def test_build_triangulation(self):
     cleaner = builder.recursively_merge_all_subsites(self.mainsite)
     msite = cleaner.merged_site()
     mbuilder = builder.MeshBuilder(msite)
     alti = mbuilder._build_altimetric_base()
     bmesh = mbuilder._build_triangulation(alti)
     mbuilder._compute_informations(bmesh)
     self.check_vertices_props(bmesh, [
         ((1, 1), {
             'altitude': self.altitude_A,
             'ids': set(['{Grass area}', '{Level curve A}'])
         }),
         ((1, 9), {
             'altitude': mesh.UNSPECIFIED_ALTITUDE,
             'ids': set(['{Grass area}'])
         }),
     ])
Example #5
0
    def test_vertices_by_feature(self):
        coords = rect(9, 9, 10, 10)
        self.building = InfrastructureLandtake(coords,
                                               parent_site=self.mainsite,
                                               id="{some building}")
        cleaner = builder.recursively_merge_all_subsites(self.mainsite)
        msite = cleaner.merged_site()
        mbuilder = builder.MeshBuilder(msite)
        alti = mbuilder._build_altimetric_base()
        bmesh = mbuilder._build_triangulation(alti)
        mbuilder._compute_informations(bmesh)

        vertices = mbuilder.vertices_for_feature[self.building.id]

        for i, v in enumerate(vertices):
            self.assertEquals(v.point(),
                              mesh.to_cgal_point(coords[i % len(coords)]))
 def test_intersecting_level_curves_error(self):
     # build a new level curve that intersects site landtake level curve and
     # has a different altitude
     other_level_curve_coords = [(-2, -3), (1, 2)]
     level_curve = LevelCurve(other_level_curve_coords,
                              altitude=20.,
                              parent_site=self.mainsite,
                              id="{Other level curve}")
     cleaner = builder.recursively_merge_all_subsites(self.mainsite)
     msite = cleaner.merged_site()
     mbuilder = builder.MeshBuilder(msite)
     with self.assertRaises(InconsistentGeometricModel) as cm:
         bmesh = mbuilder.build_mesh(refine=False)
     self.assertEqual(
         str(cm.exception),
         "Intersecting constraints with different altitudes: "
         "['{Mainsite ref altitude}', '{Other level curve}'] at (0.0, 0.33333333333333337)"
     )
Example #7
0
    def test_compute_elevations(self):
        cleaner = builder.recursively_merge_all_subsites(self.mainsite)
        msite = cleaner.merged_site()
        mbuilder = builder.MeshBuilder(msite)
        alti = mbuilder._build_altimetric_base()
        bmesh = mbuilder._build_triangulation(alti)
        mbuilder._compute_informations(bmesh)
        pM = (8.5, 6.5)  # in the corner of Level curve B
        vM = bmesh.insert_point(pM)
        mbuilder._compute_elevations(bmesh, alti)

        self.check_vertices_props(bmesh, [
            ((1, 1), {
                'altitude': self.altitude_A,
                'ids': set(['{Grass area}', '{Level curve A}'])
            }),
            (pM, {
                'altitude': self.level_curve_B.altitude,
            }),
        ])
Example #8
0
    def test_plot_landtake_flooding(self):
        cleaner = builder.recursively_merge_all_subsites(self.mainsite)
        site = cleaner.merged_site()
        mbuilder = builder.MeshBuilder(msite)
        bmesh = mbuilder.build_mesh(refine=False)

        mfiller = builder.MeshFiller(bmesh, mbuilder.vertices_for_feature)
        flood_seeds = mfiller._fill_polygonal_feature(self.building,
                                                      mesh.LandtakeFaceFlooder)

        plotter = visu.MeshedCDTPlotter(bmesh, title=self._testMethodName)
        cleaner.equivalent_site.plot(plotter.ax, alt_geom_map=cleaner.geom)
        plotter.plot_edges()

        for fh in flood_seeds:
            marks = [bmesh.point_for_face(f) for f in flood_seeds]
            visu.plot_points_seq(plotter.ax, marks, marker='*')
        material_by_face = builder.material_by_face(
            mfiller.fill_material_and_landtakes(self.mainsite, cleaner))
        for fh in bmesh.cdt.finite_faces():
            material = material_by_face.get(fh)
            if material is None: continue
            plotter.plot_face(fh, material_id=material.id)
        plotter.show()