def test_wrongNumberOfDict(self): rpk = asset_file('extrusion_rule.rpk') attrs_1 = { 'ruleFile': 'bin/extrusion_rule.cgb', 'startRule': 'Default$Footprint' } attrs_2 = { 'ruleFile': 'bin/extrusion_rule.cgb', 'startRule': 'Default$Footprint', 'minBuildingHeight': 30.0 } shape_geometry_1 = pyprt.InitialShape( [0, 0, 0, 0, 0, 100, 100, 0, 100, 100, 0, 0]) shape_geometry_2 = pyprt.InitialShape( [0, 0, 0, 0, 0, -10, -10, 0, -10, -10, 0, 0, -5, 0, -5]) shape_geometry_3 = pyprt.InitialShape( [0, 0, 0, 0, 0, -10, 10, 0, -10, 10, 0, 0, -5, 0, -5]) m = pyprt.ModelGenerator( [shape_geometry_1, shape_geometry_2, shape_geometry_3]) model = m.generate_model([attrs_1, attrs_2], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': False, 'emitGeometry': True }) self.assertEqual(len(model), 0)
def test_path_geometry_initshapes(self): rpk = asset_file('extrusion_rule.rpk') attrs = { 'ruleFile': 'bin/extrusion_rule.cgb', 'startRule': 'Default$Footprint' } shape_geo = pyprt.InitialShape([ -10.0, 0.0, 10.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 10.0, 0.0, 10.0 ]) shape_geo_from_obj = pyprt.InitialShape( asset_file('building_parcel.obj')) m1 = pyprt.ModelGenerator([shape_geo]) m2 = pyprt.ModelGenerator([shape_geo_from_obj]) m3 = pyprt.ModelGenerator([shape_geo, shape_geo_from_obj]) model1 = m1.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) model2 = m2.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) model3 = m3.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) self.assertEqual(model1[0].get_report(), model3[0].get_report()) self.assertEqual(model2[0].get_report(), model3[1].get_report()) self.assertListEqual(model1[0].get_vertices(), model3[0].get_vertices()) self.assertListEqual(model2[0].get_vertices(), model3[1].get_vertices())
def convert_to_slpk(self): x_coord = self.get_argument("x_coordinate") y_coord = self.get_argument("y_coordinate") elev = self.get_argument("elevation") if DBG: print( f'Setting georef to ({round(float(x_coord),2)}, {round(float(y_coord),2)}) (Web Mercator) with elevation {int(float(elev))} meters' ) # Model Generator Instance mod_generator1 = pyprt.ModelGenerator( [pyprt.InitialShape(self.file_path)]) shape_attributes = {} model = mod_generator1.generate_model([shape_attributes], RPK, 'com.esri.pyprt.PyEncoder', {'emitReport': False}) # Shift to right location mod_vertices = model[0].get_vertices() mod_vertices_shift = georef_shift_vertices(mod_vertices, float(x_coord), float(y_coord), float(elev)) shifted_shape = pyprt.InitialShape(mod_vertices_shift, model[0].get_indices(), model[0].get_faces()) mod_generator2 = pyprt.ModelGenerator([shifted_shape]) slpk_encoder = 'com.esri.prt.codecs.I3SEncoder' slpk_encoder_options = { 'sceneType': "Local", 'baseName': self.basename, 'sceneWkid': "3857", 'layerTextureEncoding': ["2"], 'layerEnabled': [True], 'layerUID': ["1"], 'layerName': ["1"], 'layerTextureQuality': [1.0], 'layerTextureCompression': [9], 'layerTextureScaling': [1.0], 'layerTextureMaxDimension': [2048], 'layerFeatureGranularity': ["0"], 'layerBackfaceCulling': [False], 'outputPath': OUTPUT_PATH } mod_generator2.generate_model([shape_attributes], RPK, slpk_encoder, slpk_encoder_options) self.filename_slpk = os.path.join(OUTPUT_PATH, self.basename + '.slpk')
def test_PathAndGeometryInitShapes(self): rpk = asset_file('extrusion_rule.rpk') attrs = {} shape_geo = pyprt.InitialShape([ -10.0, 0.0, 10.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 10.0, 0.0, 10.0 ]) shape_geo_from_obj = pyprt.InitialShape( asset_file('building_parcel.obj')) m = pyprt.ModelGenerator([shape_geo, shape_geo_from_obj]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) modelb = m.generate_model([attrs]) self.assertEqual(model[0].get_report(), modelb[0].get_report()) self.assertEqual(model[1].get_report(), modelb[1].get_report()) self.assertListEqual(model[0].get_vertices(), modelb[0].get_vertices()) self.assertListEqual(model[1].get_vertices(), modelb[1].get_vertices())
def test_oneDictPerInitialShapeType(self): rpk = asset_file('extrusion_rule.rpk') attrs_1 = {} attrs_2 = {'minBuildingHeight': 30.0} shape_geometry_1 = pyprt.InitialShape([ -7.666, 0.0, -0.203, -7.666, 0.0, 44.051, 32.557, 0.0, 44.051, 32.557, 0.0, -0.203 ]) shape_geometry_2 = pyprt.InitialShape( asset_file('building_parcel.obj')) m = pyprt.ModelGenerator([shape_geometry_1, shape_geometry_2]) model = m.generate_model([attrs_1, attrs_2], rpk, 'com.esri.pyprt.PyEncoder', {}) self.assertNotEqual(model[0].get_report()['Min Height.0_avg'], model[1].get_report()['Min Height.0_avg'])
def test_oneDictForAll(self): rpk = asset_file('extrusion_rule.rpk') attrs = {} shape_geometry_1 = pyprt.InitialShape( [0, 0, 0, 0, 0, 100, 100, 0, 100, 100, 0, 0]) shape_geometry_2 = pyprt.InitialShape( [0, 0, 0, 0, 0, -10, -10, 0, -10, -10, 0, 0, -5, 0, -5]) shape_geometry_3 = pyprt.InitialShape( [0, 0, 0, 0, 0, -10, 10, 0, -10, 10, 0, 0, -5, 0, -5]) m = pyprt.ModelGenerator( [shape_geometry_1, shape_geometry_2, shape_geometry_3]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': False, 'emitGeometry': True }) self.assertEqual(len(model), 3)
def test_slpk(self): if os.path.isfile(asset_output_file('Unittest4SLPK.slpk')): os.remove(asset_output_file('Unittest4SLPK.slpk')) encoder_options = { 'outputPath': os.path.dirname(asset_output_file(''))} os.makedirs(encoder_options['outputPath'], exist_ok=True) shape_geo_from_obj = pyprt.InitialShape( asset_file('building_parcel.obj')) rpk = asset_file('envelope2002.rpk') attrs = {'ruleFile': 'rules/typology/envelope2002.cgb', 'startRule': 'Default$Lot', 'report_but_not_display_green': True} slpk_options = {'layerTextureEncoding': ['2'], 'layerEnabled': [True], 'layerUID': ['1'], 'layerName': ['Salut'], 'layerTextureQuality': [1.0], 'layerTextureCompression': [9], 'layerTextureScaling': [1.0], 'layerTextureMaxDimension': [2048], 'layerFeatureGranularity': ['0'], 'layerBackfaceCulling': [False], 'baseName': 'Unittest4SLPK'} slpk_options.update(encoder_options) m = pyprt.ModelGenerator([shape_geo_from_obj]) m.generate_model( [attrs], rpk, 'com.esri.prt.codecs.I3SEncoder', slpk_options) self.assertTrue(os.path.isfile( asset_output_file('Unittest4SLPK.slpk'))) self.assertGreater( os.stat(asset_output_file('CGAReport.txt')).st_size, 0)
def test_arrayAttributes(self): with tempfile.TemporaryDirectory() as output_path: rpk = asset_file('arrayAttrs.rpk') attrs = { 'ruleFile': 'bin/arrayAttrs.cgb', 'startRule': 'Default$Init', 'arrayAttrFloat': [0.0, 1.0, 2.0], 'arrayAttrBool': [False, False, True], 'arrayAttrString': ['foo', 'bar', 'baz'] } initial_shape = pyprt.InitialShape([ -7.666, 0.0, -0.203, -7.666, 0.0, 44.051, 32.557, 0.0, 44.051, 32.557, 0.0, -0.203 ]) m = pyprt.ModelGenerator([initial_shape]) m.generate_model([attrs], rpk, 'com.esri.prt.codecs.OBJEncoder', {'outputPath': output_path}) expected_file = os.path.join(output_path, 'CGAPrint.txt') expected_content = ("arrayAttrFloat = (3)[0,1,2]\n" "arrayAttrBool = (3)[false,false,true]\n" "arrayAttrString = (3)[foo,bar,baz]\n") self.assertTrue(os.path.exists(expected_file)) with open(expected_file, 'r') as cga_print_file: cga_print = cga_print_file.read() self.assertEqual(cga_print, expected_content)
def test_noReport(self): rpk = asset_file('extrusion_rule.rpk') attrs = {} shape_geo = pyprt.InitialShape( [-10.0, 0.0, 5.0, -5.0, 0.0, 6.0, 20.0, 0.0, 5.0, 15.0, 0.0, 3.0]) m = pyprt.ModelGenerator([shape_geo]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {'emitReport': False}) self.assertDictEqual(model[0].get_report(), {})
def test_noGeometry(self): rpk = asset_file('extrusion_rule.rpk') attrs = {} shape_geo = pyprt.InitialShape( [-10.0, 0.0, 5.0, -5.0, 0.0, 6.0, 20.0, 0.0, 5.0, 15.0, 0.0, 3.0]) m = pyprt.ModelGenerator([shape_geo]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {'emitGeometry': False}) self.assertListEqual(model[0].get_vertices(), [])
def test_correctExecution(self): rpk = asset_file('extrusion_rule.rpk') attrs_1 = {} attrs_2 = {'minBuildingHeight': 30.0} attrs_3 = {'text': 'hello'} shape_geometry_1 = pyprt.InitialShape( [0, 0, 0, 0, 0, 100, 100, 0, 100, 100, 0, 0]) shape_geometry_2 = pyprt.InitialShape( [0, 0, 0, 0, 0, -10, -10, 0, -10, -10, 0, 0, -5, 0, -5]) shape_geometry_3 = pyprt.InitialShape( [0, 0, 0, 0, 0, -10, 10, 0, -10, 10, 0, 0, -5, 0, -5]) m = pyprt.ModelGenerator( [shape_geometry_1, shape_geometry_2, shape_geometry_3]) model = m.generate_model([attrs_1, attrs_2, attrs_3], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': False, 'emitGeometry': True }) self.assertEqual(len(model), 3)
def test_facesNber_candler(self): rpk = asset_file('candler.rpk') attrs = {} shape_geo_from_obj = pyprt.InitialShape( asset_file('candler_footprint.obj')) m = pyprt.ModelGenerator([shape_geo_from_obj]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': False, 'emitGeometry': True }) self.assertEqual(len(model[0].get_faces()), 47202)
def test_faces_data(self): rpk = asset_file('candler.rpk') attrs = {} shape_geo_from_obj = pyprt.InitialShape( asset_file('candler_footprint.obj')) m = pyprt.ModelGenerator([shape_geo_from_obj]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {'emitReport': False}) cnt = 0 for f in model[0].get_faces(): cnt += f self.assertEqual(cnt, len(model[0].get_indices()))
def test_cga_prints_green(self): rpk = asset_file('envelope2002.rpk') attrs = {'report_but_not_display_green': True, 'seed': 2} shape_geo_from_obj = pyprt.InitialShape( asset_file('building_parcel.obj')) m = pyprt.ModelGenerator([shape_geo_from_obj]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': True, 'emitGeometry': False }) self.assertEqual(model[0].get_cga_prints(), str(attrs['seed']) + "\n")
def test_cga_errors_holes(self): rpk = asset_file('FacesHolesVerticesrule.rpk') attrs = {} shape_with_hole_with_error = pyprt.InitialShape([ 0, 0, 0, 0, 0, 10, 10, 0, 10, 10, 0, 0, 2, 0, 2, 8, 0, 8, 2, 0, 8 ], [0, 1, 2, 3, 4, 5, 6], [4, 3], [[0, 1, 1]]) m = pyprt.ModelGenerator([shape_with_hole_with_error]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': True, 'emitGeometry': False }) self.assertEqual(len(model[0].get_cga_errors()), 1)
def test_buildingHeight(self): rpk = asset_file('extrusion_rule.rpk') attrs = {} attrs2 = {'minBuildingHeight': 23.0, 'maxBuildingHeight': 23.0} shape_geo = pyprt.InitialShape([ -10.0, 0.0, 10.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 10.0, 0.0, 10.0 ]) m = pyprt.ModelGenerator([shape_geo]) m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) model2 = m.generate_model([attrs2]) z_coord = [round(b, 1) for b in model2[0].get_vertices()[1:-1:3]] for z in z_coord: if z: self.assertAlmostEqual(abs(z), 23.0)
def test_verticesNber_candler(self): rpk = asset_file('candler.rpk') attrs = { 'ruleFile': 'bin/candler.cgb', 'startRule': 'Default$Footprint' } shape_geo_from_obj = pyprt.InitialShape( asset_file('candler_footprint.obj')) m = pyprt.ModelGenerator([shape_geo_from_obj]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': False, 'emitGeometry': True }) self.assertEqual(len(model[0].get_vertices()), 97050 * 3)
def test_report_green(self): rpk = asset_file('envelope2002.rpk') attrs = { 'ruleFile': 'rules/typology/envelope2002.cgb', 'startRule': 'Default$Lot', 'report_but_not_display_green': True, 'seed': 666 } shape_geo_from_obj = pyprt.InitialShape( asset_file('building_parcel.obj')) m = pyprt.ModelGenerator([shape_geo_from_obj]) model = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitReport': True, 'emitGeometry': False }) ground_truth_dict = { 'Floor area_n': 20.0, 'Greenery Area_n': 574.0, 'Number of trees_n': 114.0, 'green area_n': 460.0, 'total report for optimisation_n': 20.0, 'Floor area_sum': 10099.37, 'Floor area_avg': 504.97, 'Greenery Area_sum': 2123.40, 'Greenery Area_avg': 3.70, 'Number of trees_sum': 114.0, 'Number of trees_avg': 1.0, 'green area_sum': 1553.40, 'green area_avg': 3.38, 'total report for optimisation_sum': 807.95, 'total report for optimisation_avg': 40.40, 'Floor area_min': 294.37, 'Floor area_max': 874.87, 'Greenery Area_min': 0.49, 'Greenery Area_max': 408.27, 'Number of trees_min': 1.0, 'Number of trees_max': 1.0, 'green area_min': 0.49, 'green area_max': 408.27, 'total report for optimisation_min': 23.55, 'total report for optimisation_max': 69.99 } rep = model[0].get_report() rep_round = {x: round(z, 2) for x, z in rep.items()} self.assertEqual(rep_round, ground_truth_dict)
def test_multiGenerations(self): rpk = asset_file('extrusion_rule.rpk') attrs = {'ruleFile': 'bin/extrusion_rule.cgb', 'startRule': 'Default$Footprint'} shape_geo = pyprt.InitialShape( [-10.0, 0.0, 10.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 10.0, 0.0, 10.0]) m = pyprt.ModelGenerator([shape_geo]) model1 = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) model2 = m.generate_model([attrs]) model3 = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {'emitReports': True, 'emitGeometry': False}) model4 = m.generate_model([attrs]) self.assertDictEqual(model1[0].get_report(), model2[0].get_report()) self.assertDictEqual(model1[0].get_report(), model3[0].get_report()) self.assertListEqual(model1[0].get_vertices(), model2[0].get_vertices()) self.assertListEqual(model3[0].get_vertices(), model4[0].get_vertices())
def arcgis_to_pyprt(feature_set): """arcgis_to_pyprt(feature_set) -> List[InitialShape] This function allows converting an ArcGIS FeatureSet into a list of PyPRT InitialShape instances. You then typically call the ModelGenerator constructor with the return value if this function as parameter. Parameters: feature_set: FeatureSet Returns: List[InitialShape] """ initial_geometries = [] for feature in feature_set.features: try: geo = Geometry(feature.geometry) if geo.type == 'Polygon': coord = geo.coordinates()[0] coord_remove_last = coord[:-1] coord_inverse = np.flip(coord_remove_last, axis=0) if coord.shape[1] == 2: # we have to add a dimension coord_inverse[:, 1] *= -1 coord_add_dim = np.insert(coord_inverse, 1, 0, axis=1) coord_fin = np.reshape( coord_add_dim, (1, coord_add_dim.shape[0] * coord_add_dim.shape[1])) elif coord.shape[1] == 3: # need to swap the 1 and 2 columns coord_inverse[:, 1] *= -1 coord_swap_dim = coord_inverse.copy() temp = np.copy(coord_swap_dim[:, 1]) coord_swap_dim[:, 1] = coord_swap_dim[:, 2] coord_swap_dim[:, 2] = temp coord_fin = np.reshape( coord_swap_dim, (1, coord_swap_dim.shape[0] * coord_swap_dim.shape[1])) initial_geometry = pyprt.InitialShape(coord_fin.tolist()[0]) initial_geometries.append(initial_geometry) except: print("This feature is not valid: ") print(feature) print() return initial_geometries
def test_initial_shape_with_hole(self): rpk = asset_file('FacesHolesVerticesrule.rpk') attrs = {} shape_with_hole = pyprt.InitialShape([ 0, 0, 0, 0, 0, 10, 10, 0, 10, 10, 0, 0, 2, 0, 2, 8, 0, 8, 2, 0, 8 ], [0, 1, 2, 3, 4, 5, 6], [4, 3], [[0, 1]]) encoder_options = { 'outputPath': os.path.dirname(asset_output_file('')) } os.makedirs(encoder_options['outputPath'], exist_ok=True) m = pyprt.ModelGenerator([shape_with_hole]) m.generate_model([attrs], rpk, 'com.esri.prt.codecs.OBJEncoder', encoder_options) expected_file = os.path.join(encoder_options['outputPath'], 'CGAPrint.txt') expected_content = ("14\n" "9\n" "2\n") self.assertTrue(os.path.exists(expected_file)) with open(expected_file, 'r') as cga_print_file: cga_print = cga_print_file.read() self.assertEqual(cga_print, expected_content)
return os.path.join(CS_FOLDER, 'data', filename) # PRT Initialization print('\nInitializing PRT.') pyprt.initialize_prt() if not pyprt.is_prt_initialized(): raise Exception('PRT is not initialized') # Data rpk = asset_file('extrusion_rule.rpk') attrs = {} # STEP 1: Initial Shape (vertices coordinates) initial_shape1 = pyprt.InitialShape( [0, 0, 0, 0, 0, 100, 100, 0, 100, 100, 0, 0]) # PRT Generation print('\nFirst Generation:\n') m1 = pyprt.ModelGenerator([initial_shape1]) model1 = m1.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) visualize_prt_results(model1) # STEP 2: Initial Shape (OBJ file) initial_shape2 = pyprt.InitialShape(asset_file('building_parcel.obj')) # PRT Generation print('\nSecond Generation:\n') m2 = pyprt.ModelGenerator([initial_shape2]) model2 = m2.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) visualize_prt_results(model2)
return os.path.join(CS_FOLDER, 'data', filename) # PRT Initialization print('\nInitializing PRT.') pyprt.initialize_prt() if not pyprt.is_prt_initialized(): raise Exception('PRT is not initialized') # Data rpk = asset_file('candler.rpk') attrs = {} # Initial Shapes shape_geometry_1 = pyprt.InitialShape( [0, 0, 0, 0, 0, 100, 100, 0, 100, 100, 0, 0]) shape_geometry_2 = pyprt.InitialShape( [0, 0, 0, 0, 0, -10, -10, 0, -10, -10, 0, 0, -5, 0, -5]) # PRT Generation m = pyprt.ModelGenerator([shape_geometry_2, shape_geometry_1]) encoder_options = {'outputPath': '/tmp/pyprt_output'} os.makedirs(encoder_options['outputPath'], exist_ok=True) models = m.generate_model([attrs], rpk, 'com.esri.prt.codecs.OBJEncoder', encoder_options) print('\nGenerated models located in ' + encoder_options['outputPath']) # PRT End pyprt.shutdown_prt()
return os.path.join(CS_FOLDER, 'data', filename) # PRT Initialization print('\nInitializing PRT.') pyprt.initialize_prt() if not pyprt.is_prt_initialized(): raise Exception('PRT is not initialized') # Data rpk = asset_file('extrusion_rule.rpk') attrs = {} # Initial Shape initial_shape = pyprt.InitialShape( [0, 0, 0, 0, 0, 100, 100, 0, 100, 100, 0, 0]) m = pyprt.ModelGenerator([initial_shape]) # STEP 1: PRT Generation print('\nFirst Generation: generated geometry + report\n') model1 = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitGeometry': True, 'emitReport': True}) visualize_prt_results(model1) # STEP 2: PRT Generation print('\nSecond Generation: generated geometry\n') model2 = m.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', { 'emitGeometry': True, 'emitReport': False}) visualize_prt_results(model2) # PRT End
s = scene.Markers(pos=generated_data[k]) self.view.add(s) self.freeze() if __name__ == '__main__': print('\nInitializing PRT.') pyprt.initialize_prt() if not pyprt.is_prt_initialized(): raise Exception('PRT is not initialized') initial_geometry = pyprt.InitialShape( np.array([0, 0, 0, 0, 0, 2, 1, 0, 1, 1, 0, 0], dtype='f')) initial_geometry2 = pyprt.InitialShape( np.array([4, 0, 0, 4, 0, 2, 5, 0, 1, 5, 0, 0], dtype='f')) rpk = asset_file('extrusion_rule.rpk') attrs = {} mod = pyprt.ModelGenerator([initial_geometry, initial_geometry2]) generated_mod = mod.generate_model([attrs], rpk, 'com.esri.pyprt.PyEncoder', {}) all_vertices = [] all_faces = [] for model in generated_mod: if model: geo = model.get_vertices() ind = model.get_indices()