From 6c97bc57f7304a80266d017175f1e7845840c010 Mon Sep 17 00:00:00 2001 From: hqnghi88 Date: Mon, 19 Oct 2020 15:26:30 +0700 Subject: [PATCH] first try for comodeling when using different gis in micromodel --- .../gama/kernel/experiment/ExperimentPlan.java | 5 ----- .../gama/kernel/simulation/SimulationAgent.java | 2 +- .../metamodel/population/GamaPopulation.java | 5 +++++ .../gama/metamodel/population/IPopulation.java | 7 +++++++ .../src/msi/gama/util/file/GamaGisFile.java | 17 +++++++++++++---- .../msi/gaml/statements/CreateStatement.java | 1 + 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/msi.gama.core/src/msi/gama/kernel/experiment/ExperimentPlan.java b/msi.gama.core/src/msi/gama/kernel/experiment/ExperimentPlan.java index 7c79b6a683..6a81bf6b39 100644 --- a/msi.gama.core/src/msi/gama/kernel/experiment/ExperimentPlan.java +++ b/msi.gama.core/src/msi/gama/kernel/experiment/ExperimentPlan.java @@ -277,11 +277,6 @@ public ExperimentAgent getAgent(final IScope scope, final ILocation value) { return agent; } - @Override - public IMacroAgent getHost() { - return null; - } - @Override public void computeTopology(final IScope scope) throws GamaRuntimeException { topology = new AmorphousTopology(); diff --git a/msi.gama.core/src/msi/gama/kernel/simulation/SimulationAgent.java b/msi.gama.core/src/msi/gama/kernel/simulation/SimulationAgent.java index 2dbf549d6c..1ef831291e 100644 --- a/msi.gama.core/src/msi/gama/kernel/simulation/SimulationAgent.java +++ b/msi.gama.core/src/msi/gama/kernel/simulation/SimulationAgent.java @@ -367,7 +367,7 @@ public void dispose() { } - private boolean isMicroSimulation() { + public boolean isMicroSimulation() { return getSpecies().getDescription().belongsToAMicroModel(); } diff --git a/msi.gama.core/src/msi/gama/metamodel/population/GamaPopulation.java b/msi.gama.core/src/msi/gama/metamodel/population/GamaPopulation.java index f3d24853d0..d35cfd6845 100644 --- a/msi.gama.core/src/msi/gama/metamodel/population/GamaPopulation.java +++ b/msi.gama.core/src/msi/gama/metamodel/population/GamaPopulation.java @@ -596,6 +596,11 @@ protected static ITopology buildGridTopology(final IScope scope, final ISpecies public IMacroAgent getHost() { return host; } + + @Override + public void setHost(IMacroAgent agt) { + host=agt; + } // // @Override // public Iterator iterator() { diff --git a/msi.gama.core/src/msi/gama/metamodel/population/IPopulation.java b/msi.gama.core/src/msi/gama/metamodel/population/IPopulation.java index 60b069248f..01385e50e2 100644 --- a/msi.gama.core/src/msi/gama/metamodel/population/IPopulation.java +++ b/msi.gama.core/src/msi/gama/metamodel/population/IPopulation.java @@ -143,6 +143,13 @@ T createAgentAt(final IScope s, int index, Map initialValues, bo * @return */ IMacroAgent getHost(); + + /** + * Set the macro-agent hosting this population. + * + * @return + */ + void setHost(IMacroAgent agt); /** * @throws GamaRuntimeException diff --git a/msi.gama.core/src/msi/gama/util/file/GamaGisFile.java b/msi.gama.core/src/msi/gama/util/file/GamaGisFile.java index 1039f0e5c3..e62c01dab6 100644 --- a/msi.gama.core/src/msi/gama/util/file/GamaGisFile.java +++ b/msi.gama.core/src/msi/gama/util/file/GamaGisFile.java @@ -23,6 +23,7 @@ import msi.gama.common.geometry.Envelope3D; import msi.gama.common.geometry.GeometryUtils; import msi.gama.common.geometry.ICoordinates; +import msi.gama.kernel.experiment.IExperimentAgent; import msi.gama.metamodel.shape.GamaPoint; import msi.gama.metamodel.shape.IShape; import msi.gama.metamodel.topology.projection.IProjection; @@ -90,10 +91,16 @@ protected CoordinateReferenceSystem getExistingCRS(final IScope scope) { protected abstract CoordinateReferenceSystem getOwnCRS(IScope scope); protected void computeProjection(final IScope scope, final Envelope3D env) { - if (scope == null) { return; } + if (scope == null) { + return; + } final CoordinateReferenceSystem crs = getExistingCRS(scope); - final ProjectionFactory pf = - scope.getSimulation() == null ? new ProjectionFactory() : scope.getSimulation().getProjectionFactory(); + final ProjectionFactory pf; + if (scope.getSimulation().isMicroSimulation()) { + pf=((IExperimentAgent)scope.getExperiment().getPopulation().getHost()).getSimulation().getProjectionFactory(); + } else { + pf = scope.getSimulation() == null ? new ProjectionFactory() : scope.getSimulation().getProjectionFactory(); + } gis = pf.fromCRS(scope, crs, env); } @@ -123,7 +130,9 @@ protected Geometry multiPolygonManagement(final Geometry geom) { protected static boolean hasNullElements(final Object[] array) { for (final Object element : array) { - if (element == null) { return true; } + if (element == null) { + return true; + } } return false; } diff --git a/msi.gama.core/src/msi/gaml/statements/CreateStatement.java b/msi.gama.core/src/msi/gaml/statements/CreateStatement.java index a0ff221334..cfd3bdf269 100644 --- a/msi.gama.core/src/msi/gaml/statements/CreateStatement.java +++ b/msi.gama.core/src/msi/gaml/statements/CreateStatement.java @@ -504,6 +504,7 @@ private IList createAgents(final IScope scope, final IPopulati // hqnghi in case of creating experiment of micro-models, we must // implicitely initialize it and its simulation output if (population instanceof ExperimentPopulation) { + population.setHost(scope.getExperiment()); for (final IAgent a : population) { ((ExperimentAgent) a)._init_(scope); final SimulationAgent sim = ((ExperimentAgent) a).getSimulation();