Spaces:
Sleeping
Sleeping
| import os | |
| import json | |
| import requests | |
| import argparse | |
| API_URL = "http://localhost:8000/buildings/add_model/" | |
| MODELS_FOLDER = "/mnt/c/Users/KMult/Desktop/Praca_inzynierska/models/modele_rdy" | |
| METADATA_FILE = "./metadata.json" | |
| def load_buildings(json_file): | |
| with open(json_file, "r", encoding="utf-8") as f: | |
| buildings_list = json.load(f) | |
| return {b["name"]: b for b in buildings_list.values()} | |
| def save_buildings(json_file, buildings_dict): | |
| with open(json_file, "w", encoding="utf-8") as f: | |
| json.dump(buildings_dict, f, indent=4, ensure_ascii=False) | |
| def send_building_data(building_data, model_file_path): | |
| """ | |
| Sends building metadata and a single 3D model file to the API endpoint. | |
| Args: | |
| building_data (dict): Dictionary containing building metadata. | |
| model_file_path (str): File path to the 3D model (.glb or .fbx). | |
| """ | |
| model_filename = os.path.basename(model_file_path) | |
| mime_type = "application/octet-stream" | |
| if model_filename.lower().endswith(".glb"): | |
| mime_type = "model/gltf-binary" | |
| elif model_filename.lower().endswith(".fbx"): | |
| mime_type = "application/octet-stream" | |
| try: | |
| file_handle = open(model_file_path, "rb") | |
| files = { | |
| "model_file": (model_filename, file_handle, mime_type) | |
| } | |
| data = { | |
| "building": json.dumps(building_data) | |
| } | |
| response = requests.post(API_URL, data=data, files=files) | |
| return response | |
| except FileNotFoundError: | |
| return None | |
| except Exception: | |
| return None | |
| finally: | |
| if 'file_handle' in locals() and not file_handle.closed: | |
| file_handle.close() | |
| def main(force=False): | |
| buildings = load_buildings(METADATA_FILE) | |
| index = 0 | |
| MAXIMUM = 10000 | |
| MODEL_EXTENSIONS = (".glb", ".fbx") | |
| for name, building in buildings.items(): | |
| name = building.get("name") | |
| location = building.get("location") | |
| height = building.get("height") | |
| width = building.get("width") | |
| depth = building.get("depth") | |
| should_skip = building.get("should_skip", False) | |
| if should_skip and not force: | |
| continue | |
| model_file = None | |
| for ext in MODEL_EXTENSIONS: | |
| expected_file_path = os.path.join(MODELS_FOLDER, name + ext) | |
| if os.path.exists(expected_file_path): | |
| model_file = expected_file_path | |
| break | |
| if not model_file: | |
| continue | |
| building_data = { | |
| "name": name, | |
| "location": location, | |
| "height": height, | |
| "width": width, | |
| "depth": depth | |
| } | |
| response = send_building_data(building_data, model_file) | |
| index += 1 | |
| if response.status_code == 200: | |
| building["should_skip"] = True | |
| save_buildings(METADATA_FILE, buildings) | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser(description="Send building data and renders.") | |
| parser.add_argument( | |
| "--force", | |
| action="store_true", | |
| help="Ignore should_skip flag and process all buildings" | |
| ) | |
| args = parser.parse_args() | |
| main(force=args.force) | |