From d549bf81c8242e0b5d752837863464e416fe4ca0 Mon Sep 17 00:00:00 2001 From: Luc-Sol Date: Thu, 4 Sep 2025 11:05:57 +0200 Subject: [PATCH 1/5] Save_and_Load_in_EHub_Dashboard --- Zero_Interface-Loader.alpx | 8 + _alp/Agents/UI_EnergyHub/AOC.UI_EnergyHub.xml | 8 + _alp/Agents/UI_EnergyHub/Code/Functions.java | 337 +++++++++++++++++- _alp/Agents/UI_EnergyHub/Code/Functions.xml | 233 ++++++++++++ .../UI_EnergyHub/Levels/Level.level.xml | 259 +++++++++++++- _alp/Agents/UI_EnergyHub/Variables.xml | 56 +++ .../Agents/Zero_Interface/Code/Functions.java | 10 +- _alp/Agents/Zero_Loader/AOC.Zero_Loader.xml | 5 +- _alp/Agents/Zero_Loader/Code/Functions.java | 18 +- _alp/Agents/Zero_Loader/Code/Functions.xml | 20 ++ .../Agents/Zero_Loader/Levels/Level.level.xml | 44 ++- _alp/Agents/tabEHub/Levels/Level.level.xml | 2 +- .../tabElectricity/Levels/Level.level.xml | 2 +- _alp/Classes/Class.J_ModelSave.java | 2 + _alp/ModelResources.xml | 64 ++-- load_icon.png | Bin 0 -> 26058 bytes save_icon.png | Bin 0 -> 6805 bytes uplux.jar | Bin 0 -> 20090214 bytes 18 files changed, 1009 insertions(+), 59 deletions(-) create mode 100644 load_icon.png create mode 100644 save_icon.png create mode 100644 uplux.jar diff --git a/Zero_Interface-Loader.alpx b/Zero_Interface-Loader.alpx index 306dc0aa..f811c718 100644 --- a/Zero_Interface-Loader.alpx +++ b/Zero_Interface-Loader.alpx @@ -387,6 +387,14 @@ true false + + + zerointerfaceloader + uplux.jar + + true + false + ebade042-5518-4162-8eb5-f55439c67c64 diff --git a/_alp/Agents/UI_EnergyHub/AOC.UI_EnergyHub.xml b/_alp/Agents/UI_EnergyHub/AOC.UI_EnergyHub.xml index eb1d0478..cc1de2e4 100644 --- a/_alp/Agents/UI_EnergyHub/AOC.UI_EnergyHub.xml +++ b/_alp/Agents/UI_EnergyHub/AOC.UI_EnergyHub.xml @@ -3,6 +3,14 @@ 1709049506453 1754045666929 + false 1709049506460 diff --git a/_alp/Agents/UI_EnergyHub/Code/Functions.java b/_alp/Agents/UI_EnergyHub/Code/Functions.java index bdfffabc..bda65951 100644 --- a/_alp/Agents/UI_EnergyHub/Code/Functions.java +++ b/_alp/Agents/UI_EnergyHub/Code/Functions.java @@ -338,10 +338,343 @@ else if (members.size() > 8) { double f_initializeUserSavedScenarios() {/*ALCODESTART::1756395572049*/ -String userIdToken = zero_Interface.user.userIdToken(); +//String userIdToken = zero_Interface.user.userIdToken(); +String userIdToken = "6b87f0f9-fdf6-4c05-9e0f-b75e46950113"; + +var repository = UserScenarioRepository.builder() + //.userId(UUID.fromString("6b87f0f9-fdf6-4c05-9e0f-b75e46950113")) + .userId(UUID.fromString(userIdToken)) + .modelName("ModelTestName") + .build(); + +var scenarioList = repository.listUserScenarios(); +int nbScenarios = scenarioList.size(); +String[] scenarioNames = new String[nbScenarios]; +for (int i = 0; i < nbScenarios; i++) { + scenarioNames[i] = scenarioList.get(i).getName(); +} + +combobox_selectScenario.setItems(scenarioNames); +/*ALCODEEND*/} + +double f_loadScenario(int index) +{/*ALCODESTART::1756805429105*/ +pauseSimulation(); +// Collect GIS_Objects into hashmap, to link to new EnergyModel. +zero_Interface.energyModel.pop_GIS_Buildings.forEach(x->{c_GISregions.put(x.p_id, x.gisRegion);}); +zero_Interface.energyModel.pop_GIS_Objects.forEach(x->{c_GISregions.put(x.p_id, x.gisRegion);}); +zero_Interface.energyModel.pop_GIS_Parcels.forEach(x->{c_GISregions.put(x.p_id, x.gisRegion);}); + +try { + v_objectMapper = new ObjectMapper(); + f_addMixins(); + + String userIdToken = "6b87f0f9-fdf6-4c05-9e0f-b75e46950113"; //user.userIdToken(); + + var repository = UserScenarioRepository.builder() + //.userId(UUID.fromString("6b87f0f9-fdf6-4c05-9e0f-b75e46950113")) + .userId(UUID.fromString(userIdToken)) + .modelName("ModelTestName") + .build(); + + var scenarioList = repository.listUserScenarios(); + for (var scenario : scenarioList) { + System.out.println(scenario.getName()); + } + + + // Deserialize the JSON into a new EnergyModel instance: + var jsonStream = repository.fetchUserScenarioContent(scenarioList.get(index).getId()); + J_ModelSave saveObject = v_objectMapper.readValue(jsonStream, J_ModelSave.class); + //J_ModelSave saveObject = v_objectMapper.readValue(new File("ModelSave.json"), J_ModelSave.class); + + EnergyModel deserializedEnergyModel = saveObject.energyModel; + + // Reconstruct all Agents + f_reconstructEnergyModel(deserializedEnergyModel); + + + f_reconstructGridConnections(deserializedEnergyModel); + f_reconstructActors(deserializedEnergyModel); + f_reconstructGridNodes(deserializedEnergyModel, saveObject.c_gridNodes); + + f_reconstructGIS_Objects(deserializedEnergyModel, saveObject.c_GISObjects); + + // Get profilePointer tableFunctions from 'original' energyModel + deserializedEnergyModel.c_profiles.forEach(x->{ + J_ProfilePointer origProfile = zero_Interface.energyModel.f_findProfile(x.name); + x.setTableFunction(origProfile.getTableFunction()); + }); + + f_setEngineInputDataAfterDeserialisation(deserializedEnergyModel); + + zero_Interface.energyModel = deserializedEnergyModel; + zero_Interface.uI_Results.energyModel = deserializedEnergyModel; + + // Reinitialize energy model + deserializedEnergyModel.b_isInitialized = false; + deserializedEnergyModel.f_initializeEngine(); + + // Putting back the ordered collections in the interface + f_reconstructOrderedCollections(saveObject); + + zero_Interface.f_clearSelectionAndSelectEnergyModel(); + zero_Interface.uI_Tabs.f_initializeUI_Tabs(zero_Interface.energyModel.f_getGridConnectionsCollectionPointer(), zero_Interface.energyModel.f_getPausedGridConnectionsCollectionPointer()); + zero_Interface.f_updateMainInterfaceSliders(); + + zero_Interface.f_resetSettings(); + //zero_Interface.f_updateOrderedListsAfterDeserialising(deserializedEnergyModel); + +} catch (IOException e) { + e.printStackTrace(); +} + + +/*ALCODEEND*/} + +double f_saveScenario(String scenarioName) +{/*ALCODESTART::1756805443177*/ +traceln("Starting model serialisation..."); +J_ModelSave saveObject = new J_ModelSave(); +saveObject.energyModel = zero_Interface.energyModel; + +zero_Interface.energyModel.pop_gridNodes.forEach(x->saveObject.c_gridNodes.add(x)); +zero_Interface.energyModel.pop_GIS_Buildings.forEach(x->{saveObject.c_GISObjects.add(x); c_GISregions.put(x.p_id, x.gisRegion);x.f_writeStyleStrings();}); +zero_Interface.energyModel.pop_GIS_Objects.forEach(x->{saveObject.c_GISObjects.add(x); c_GISregions.put(x.p_id, x.gisRegion);x.f_writeStyleStrings();}); +zero_Interface.energyModel.pop_GIS_Parcels.forEach(x->{saveObject.c_GISObjects.add(x); c_GISregions.put(x.p_id, x.gisRegion);x.f_writeStyleStrings();}); + +saveObject.c_orderedPVSystemsCompanies = zero_Interface.c_orderedPVSystemsCompanies; +saveObject.c_orderedPVSystemsHouses = zero_Interface.c_orderedPVSystemsHouses; +saveObject.c_orderedVehicles = zero_Interface.c_orderedVehicles; +saveObject.c_orderedHeatingSystemsCompanies = zero_Interface.c_orderedHeatingSystemsCompanies; +saveObject.c_orderedHeatingSystemsHouses = zero_Interface.c_orderedHeatingSystemsHouses; +saveObject.c_orderedVehiclesPrivateParking = zero_Interface.c_orderedVehiclesPrivateParking; +saveObject.c_orderedParkingSpaces = zero_Interface.c_orderedParkingSpaces; +saveObject.c_orderedV1GChargers = zero_Interface.c_orderedV1GChargers; +saveObject.c_orderedV2GChargers = zero_Interface.c_orderedV2GChargers; +saveObject.c_orderedPublicChargers = zero_Interface.c_orderedPublicChargers; +//saveObject.c_mappingOfVehiclesPerCharger = zero_Interface.c_mappingOfVehiclesPerCharger; + +v_objectMapper = new ObjectMapper(); +f_addMixins(); +v_objectMapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); + +try { + traceln("Trying to save to file"); + //v_objectMapper.writeValue(new File("energyModel.json"), energyModel); + + //v_objectMapper.writeValue(new File("ModelSave.json"), saveObject); + + String userIdToken = "6b87f0f9-fdf6-4c05-9e0f-b75e46950113"; //user.userIdToken(); + + var repository = UserScenarioRepository.builder() + //.userId(UUID.fromString("6b87f0f9-fdf6-4c05-9e0f-b75e46950113")) + .userId(UUID.fromString(userIdToken)) + .modelName("ModelTestName") + .build(); + + repository.saveUserScenario( + scenarioName, + v_objectMapper.writeValueAsBytes(saveObject) + ); + + +} catch (IOException e) { + e.printStackTrace(); +} + +/*ALCODEEND*/} + +double f_addMixins() +{/*ALCODESTART::1756806431955*/ +v_objectMapper.addMixIn(Agent.class, AgentMixin.class); +v_objectMapper.addMixIn(AgentArrayList.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(EnergyModel.class, EnergyModelMixin.class); +v_objectMapper.addMixIn(Actor.class, ActorMixin.class); +v_objectMapper.addMixIn(DataSet.class, DataSetMixin.class); +v_objectMapper.addMixIn(TextFile.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(EnergyDataViewer.class, IgnoreClassMixin.class); + +v_objectMapper.addMixIn(com.anylogic.engine.TableFunction.class, IgnoreClassMixin.class); +//objectMapper.addMixIn(com.anylogic.engine.TableFunction.class, TableFunctionMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.GISRegion.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.presentation.ViewArea.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.AgentSpacePosition.class, IgnoreClassMixin.class); + +// Weirdness regarding material handling toolbox +v_objectMapper.addMixIn(com.anylogic.engine.AgentSpacePosition.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.AbstractWall.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.RailwayTrack.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.PalletRack.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.RoadNetwork.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.AreaNode.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.AbstractFluidMarkup.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.Lift.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.ConveyorNode.class, IgnoreClassMixin.class); +v_objectMapper.addMixIn(com.anylogic.engine.markup.Node.class, IgnoreClassMixin.class); + +/*ALCODEEND*/} + +double f_setEngineInputDataAfterDeserialisation(EnergyModel deserializedEnergyModel) +{/*ALCODESTART::1756806501010*/ +deserializedEnergyModel.p_truckTripsCsv = zero_Interface.energyModel.p_truckTripsCsv; +deserializedEnergyModel.p_householdTripsCsv = zero_Interface.energyModel.p_householdTripsCsv; +deserializedEnergyModel.p_cookingPatternCsv = zero_Interface.energyModel.p_cookingPatternCsv; + +//deserializedEnergyModel.avgc_data = zero_Interface.energyModel.avgc_data; +deserializedEnergyModel.c_defaultHeatingStrategies = zero_Interface.energyModel.c_defaultHeatingStrategies; +/*ALCODEEND*/} + +double f_reconstructGridConnections(EnergyModel deserializedEnergyModel) +{/*ALCODESTART::1756806501019*/ +ArrayList allConnections = new ArrayList<>(); +allConnections.addAll(deserializedEnergyModel.c_gridConnections); +allConnections.addAll(deserializedEnergyModel.c_pausedGridConnections); + +for(GridConnection GC : allConnections){ + GC.energyModel = deserializedEnergyModel; + if (GC instanceof GCHouse){ + //toMove.add(GC); + f_reconstructAgent(GC, deserializedEnergyModel.Houses, deserializedEnergyModel); + } else if (GC instanceof GCEnergyProduction) { + f_reconstructAgent(GC, deserializedEnergyModel.EnergyProductionSites, deserializedEnergyModel); + } else if (GC instanceof GCEnergyConversion) { + f_reconstructAgent(GC, deserializedEnergyModel.EnergyConversionSites, deserializedEnergyModel); + } else if (GC instanceof GCGridBattery) { + f_reconstructAgent(GC, deserializedEnergyModel.GridBatteries, deserializedEnergyModel); + } else if (GC instanceof GCNeighborhood) { + f_reconstructAgent(GC, deserializedEnergyModel.Neighborhoods, deserializedEnergyModel); + } else if (GC instanceof GCPublicCharger) { + f_reconstructAgent(GC, deserializedEnergyModel.PublicChargers, deserializedEnergyModel); + } else if (GC instanceof GCUtility) { + f_reconstructAgent(GC, deserializedEnergyModel.UtilityConnections, deserializedEnergyModel); + } + GC.f_startAfterDeserialisation(); +} + + +/*ALCODEEND*/} + +double f_reconstructEnergyModel(EnergyModel energyModel) +{/*ALCODESTART::1756806501029*/ +// Code Instead of Agent.goToPopulation() (which resets all parameters to default!) +/* +try{ // Reflection trick to get to Agent.owner private field + energyModel.forceSetOwner(energyModel, pop_energyModels); +} catch (Exception e) { + e.printStackTrace(); +} +*/ + +Agent root = zero_Interface.getRootAgent(); +traceln("root: " + root); +energyModel.restoreOwner(root); + +energyModel.setEngine(getEngine()); +energyModel.instantiateBaseStructure_xjal(); +energyModel.setEnvironment(this.getEnvironment()); + +traceln("EnergyModel owner: %s", energyModel.getOwner()); + +energyModel.create(); +energyModel.f_startAfterDeserialisation(); +//energyModel.start(); // Why is this needed? +/*ALCODEEND*/} + +double f_reconstructAgent(Agent agent,AgentArrayList pop,EnergyModel energyModel) +{/*ALCODESTART::1756806501040*/ +/* // Code Instead of Agent.goToPopulation() (which resets many variables to default!) +try{ // Reflection trick to get to Agent.owner private field + if (agent instanceof GridNode) { + ((GridNode)agent).forceSetOwner(agent,pop); + } else if (agent instanceof GridConnection) { + ((GridConnection)agent).forceSetOwner(agent,pop); + } else if (agent instanceof Actor) { + ((Actor)agent).forceSetOwner(agent,pop); + } else if (agent instanceof GIS_Object) { + ((GIS_Object)agent).forceSetOwner(agent,pop); + } +} catch (Exception e) { + e.printStackTrace(); +}*/ + +agent.restoreOwner(energyModel); // simply sets agent.d = root, should replace reflection hack +agent.restoreCollection_xjal(pop); // simple sets agent.j = pop, should replace reflection hack + +agent.setEngine(getEngine()); +agent.instantiateBaseStructure_xjal(); +agent.setEnvironment(pop.getEnvironment()); + +pop._add(agent); // Add to the population +//int popSize = pop.size(); +//pop.callCreate(agent, popSize); // Update population object +agent.create(); +/*ALCODEEND*/} + +double f_reconstructActors(EnergyModel deserializedEnergyModel) +{/*ALCODESTART::1756806501050*/ +for(Actor AC : deserializedEnergyModel.c_actors){ + + if (AC instanceof ConnectionOwner) { + ((ConnectionOwner)AC).energyModel = deserializedEnergyModel; + f_reconstructAgent(AC, deserializedEnergyModel.pop_connectionOwners, deserializedEnergyModel); + } else if (AC instanceof EnergySupplier) { + ((EnergySupplier)AC).energyModel = deserializedEnergyModel; + f_reconstructAgent(AC, deserializedEnergyModel.pop_energySuppliers, deserializedEnergyModel); + } else if (AC instanceof EnergyCoop) { + ((EnergyCoop)AC).energyModel = deserializedEnergyModel; + f_reconstructAgent(AC, deserializedEnergyModel.pop_energyCoops, deserializedEnergyModel); + ((EnergyCoop)AC).f_startAfterDeserialisation(); + } else if (AC instanceof GridOperator) { + ((GridOperator)AC).energyModel = deserializedEnergyModel; + f_reconstructAgent(AC, deserializedEnergyModel.pop_gridOperators, deserializedEnergyModel); + } + } + +/*ALCODEEND*/} -if(userIdToken != null){ +double f_reconstructGIS_Objects(EnergyModel deserializedEnergyModel,ArrayList c_GISObjects) +{/*ALCODESTART::1756806501060*/ +for(GIS_Object GO : c_GISObjects){ + GO.gisRegion = c_GISregions.get(GO.p_id); + if (GO instanceof GIS_Building) { + ((GIS_Building)GO).energyModel = deserializedEnergyModel; + f_reconstructAgent(GO, deserializedEnergyModel.pop_GIS_Buildings, deserializedEnergyModel); + } else if (GO instanceof GIS_Parcel) { + ((GIS_Parcel)GO).energyModel = deserializedEnergyModel; + f_reconstructAgent(GO, deserializedEnergyModel.pop_GIS_Parcels, deserializedEnergyModel); + } else { + GO.energyModel = deserializedEnergyModel; + f_reconstructAgent(GO, deserializedEnergyModel.pop_GIS_Objects, deserializedEnergyModel); + //GO.f_startAfterDeserialisation(); + } + GO.f_resetStyle(); +} +/*ALCODEEND*/} + +double f_reconstructGridNodes(EnergyModel deserializedEnergyModel,ArrayList c_gridNodes) +{/*ALCODESTART::1756806501070*/ +for(GridNode GN : c_gridNodes){ + GN.energyModel = deserializedEnergyModel; + f_reconstructAgent(GN, deserializedEnergyModel.pop_gridNodes, deserializedEnergyModel); } + +/*ALCODEEND*/} + +double f_reconstructOrderedCollections(J_ModelSave saveObject) +{/*ALCODESTART::1756806501080*/ +zero_Interface.c_orderedPVSystemsCompanies = saveObject.c_orderedPVSystemsCompanies; +zero_Interface.c_orderedPVSystemsHouses = saveObject.c_orderedPVSystemsHouses; +zero_Interface.c_orderedVehicles = saveObject.c_orderedVehicles; +zero_Interface.c_orderedHeatingSystemsCompanies = saveObject.c_orderedHeatingSystemsCompanies; +zero_Interface.c_orderedHeatingSystemsHouses = saveObject.c_orderedHeatingSystemsHouses; +zero_Interface.c_orderedVehiclesPrivateParking = saveObject.c_orderedVehiclesPrivateParking; +zero_Interface.c_orderedParkingSpaces = saveObject.c_orderedParkingSpaces; +zero_Interface.c_orderedV1GChargers = saveObject.c_orderedV1GChargers; +zero_Interface.c_orderedV2GChargers = saveObject.c_orderedV2GChargers; +zero_Interface.c_orderedPublicChargers = saveObject.c_orderedPublicChargers; +//zero_Interface.c_mappingOfVehiclesPerCharger = saveObject.c_mappingOfVehiclesPerCharger; + /*ALCODEEND*/} diff --git a/_alp/Agents/UI_EnergyHub/Code/Functions.xml b/_alp/Agents/UI_EnergyHub/Code/Functions.xml index e46f44f1..db698e49 100644 --- a/_alp/Agents/UI_EnergyHub/Code/Functions.xml +++ b/_alp/Agents/UI_EnergyHub/Code/Functions.xml @@ -194,4 +194,237 @@ true + + VOID + double + 1756805429105 + + -370 + 360 + + false + true + true + + + + + + + + VOID + double + 1756805443177 + + -370 + 380 + + false + true + true + + + + + + + + VOID + double + 1756806431955 + + -710 + 370 + + false + true + true + + + + VOID + double + 1756806501010 + + + -987 + 310 + + false + true + true + + + + + + + + VOID + double + 1756806501019 + + -986.667 + 352 + + false + true + true + + + + + + + + VOID + double + 1756806501029 + + -986.667 + 332 + + false + true + true + + + + + + + + VOID + double + 1756806501040 + + -975 + 429 + + false + true + true + + + + + + + + + + + + + + + + VOID + double + 1756806501050 + + -987 + 372 + + false + true + true + + + + + + + + VOID + double + 1756806501060 + + -987 + 412 + + false + true + true + + + + + + + ]]> + + + + + VOID + double + 1756806501070 + + -987 + 392 + + false + true + true + + + + + + + ]]> + + + + + VOID + double + 1756806501080 + + -990 + 450 + + false + true + true + + + + + + diff --git a/_alp/Agents/UI_EnergyHub/Levels/Level.level.xml b/_alp/Agents/UI_EnergyHub/Levels/Level.level.xml index ad85015d..40d5da7a 100644 --- a/_alp/Agents/UI_EnergyHub/Levels/Level.level.xml +++ b/_alp/Agents/UI_EnergyHub/Levels/Level.level.xml @@ -129,7 +129,7 @@ 1747228569476 10 - 140 + 90