diff options
Diffstat (limited to 'subprojects/visualization/src/main/java/tools')
6 files changed, 175 insertions, 60 deletions
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java index bc32323d..ae87d8ac 100644 --- a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java +++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerAdapter.java | |||
@@ -8,9 +8,10 @@ package tools.refinery.visualization; | |||
8 | import tools.refinery.store.adapter.ModelAdapter; | 8 | import tools.refinery.store.adapter.ModelAdapter; |
9 | import tools.refinery.store.map.Version; | 9 | import tools.refinery.store.map.Version; |
10 | import tools.refinery.store.tuple.Tuple; | 10 | import tools.refinery.store.tuple.Tuple; |
11 | import tools.refinery.visualization.internal.FileFormat; | ||
12 | import tools.refinery.visualization.internal.ModelVisualizerBuilderImpl; | 11 | import tools.refinery.visualization.internal.ModelVisualizerBuilderImpl; |
13 | 12 | ||
13 | import java.util.Collection; | ||
14 | |||
14 | public interface ModelVisualizerAdapter extends ModelAdapter { | 15 | public interface ModelVisualizerAdapter extends ModelAdapter { |
15 | 16 | ||
16 | ModelVisualizerStoreAdapter getStoreAdapter(); | 17 | ModelVisualizerStoreAdapter getStoreAdapter(); |
@@ -18,27 +19,14 @@ public interface ModelVisualizerAdapter extends ModelAdapter { | |||
18 | return new ModelVisualizerBuilderImpl(); | 19 | return new ModelVisualizerBuilderImpl(); |
19 | } | 20 | } |
20 | 21 | ||
21 | public String createDotForCurrentModelState(); | ||
22 | |||
23 | public String createDotForModelState(Version version); | ||
24 | |||
25 | public boolean saveDot(String dot, String filePath); | ||
26 | |||
27 | public boolean renderDot(String dot, String filePath); | ||
28 | |||
29 | public boolean renderDot(String dot, FileFormat format, String filePath); | ||
30 | |||
31 | public void addTransition(Version from, Version to, String action); | 22 | public void addTransition(Version from, Version to, String action); |
32 | 23 | ||
33 | 24 | ||
34 | public void addTransition(Version from, Version to, String action, Tuple activation); | 25 | public void addTransition(Version from, Version to, String action, Tuple activation); |
35 | public void addState(Version state); | 26 | public void addState(Version state); |
27 | public void addState(Version state, Collection<Double> fitness); | ||
28 | public void addState(Version state, String label); | ||
36 | public void addSolution(Version state); | 29 | public void addSolution(Version state); |
37 | 30 | public void visualize(); | |
38 | public boolean saveDesignSpace(String path); | ||
39 | |||
40 | public boolean renderDesignSpace(String path); | ||
41 | |||
42 | public boolean renderDesignSpace(String path, FileFormat format); | ||
43 | 31 | ||
44 | } | 32 | } |
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java index 56cc425e..592f5fcf 100644 --- a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java +++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerBuilder.java | |||
@@ -6,6 +6,11 @@ | |||
6 | package tools.refinery.visualization; | 6 | package tools.refinery.visualization; |
7 | 7 | ||
8 | import tools.refinery.store.adapter.ModelAdapterBuilder; | 8 | import tools.refinery.store.adapter.ModelAdapterBuilder; |
9 | import tools.refinery.visualization.internal.FileFormat; | ||
9 | 10 | ||
10 | public interface ModelVisualizerBuilder extends ModelAdapterBuilder { | 11 | public interface ModelVisualizerBuilder extends ModelAdapterBuilder { |
12 | ModelVisualizerBuilder withOutputpath(String outputpath); | ||
13 | ModelVisualizerBuilder withFormat(FileFormat format); | ||
14 | ModelVisualizerBuilder saveDesignSpace(); | ||
15 | ModelVisualizerBuilder saveStates(); | ||
11 | } | 16 | } |
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java index 6599d4c3..46663b2a 100644 --- a/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java +++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/ModelVisualizerStoreAdapter.java | |||
@@ -6,7 +6,17 @@ | |||
6 | package tools.refinery.visualization; | 6 | package tools.refinery.visualization; |
7 | 7 | ||
8 | import tools.refinery.store.adapter.ModelStoreAdapter; | 8 | import tools.refinery.store.adapter.ModelStoreAdapter; |
9 | import tools.refinery.store.query.ModelQueryStoreAdapter; | 9 | import tools.refinery.visualization.internal.FileFormat; |
10 | |||
11 | import java.util.Set; | ||
10 | 12 | ||
11 | public interface ModelVisualizerStoreAdapter extends ModelStoreAdapter { | 13 | public interface ModelVisualizerStoreAdapter extends ModelStoreAdapter { |
14 | |||
15 | String getOutputPath(); | ||
16 | |||
17 | boolean isRenderDesignSpace(); | ||
18 | |||
19 | boolean isRenderStates(); | ||
20 | |||
21 | Set<FileFormat> getFormats(); | ||
12 | } | 22 | } |
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java index b4db2682..04be22d6 100644 --- a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java +++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizeStoreAdapterImpl.java | |||
@@ -10,11 +10,22 @@ import tools.refinery.store.model.Model; | |||
10 | import tools.refinery.store.model.ModelStore; | 10 | import tools.refinery.store.model.ModelStore; |
11 | import tools.refinery.visualization.ModelVisualizerStoreAdapter; | 11 | import tools.refinery.visualization.ModelVisualizerStoreAdapter; |
12 | 12 | ||
13 | import java.util.Set; | ||
14 | |||
13 | public class ModelVisualizeStoreAdapterImpl implements ModelVisualizerStoreAdapter { | 15 | public class ModelVisualizeStoreAdapterImpl implements ModelVisualizerStoreAdapter { |
14 | private final ModelStore store; | 16 | private final ModelStore store; |
17 | private final String outputPath; | ||
18 | private final boolean renderDesignSpace; | ||
19 | private final boolean renderStates; | ||
20 | private final Set<FileFormat> formats; | ||
15 | 21 | ||
16 | public ModelVisualizeStoreAdapterImpl(ModelStore store) { | 22 | public ModelVisualizeStoreAdapterImpl(ModelStore store, String outputPath, Set<FileFormat> formats, |
23 | boolean renderDesignSpace, boolean renderStates) { | ||
17 | this.store = store; | 24 | this.store = store; |
25 | this.outputPath = outputPath; | ||
26 | this.formats = formats; | ||
27 | this.renderDesignSpace = renderDesignSpace; | ||
28 | this.renderStates = renderStates; | ||
18 | } | 29 | } |
19 | 30 | ||
20 | @Override | 31 | @Override |
@@ -26,4 +37,24 @@ public class ModelVisualizeStoreAdapterImpl implements ModelVisualizerStoreAdapt | |||
26 | public ModelAdapter createModelAdapter(Model model) { | 37 | public ModelAdapter createModelAdapter(Model model) { |
27 | return new ModelVisualizerAdapterImpl(model, this); | 38 | return new ModelVisualizerAdapterImpl(model, this); |
28 | } | 39 | } |
40 | |||
41 | @Override | ||
42 | public String getOutputPath() { | ||
43 | return outputPath; | ||
44 | } | ||
45 | |||
46 | @Override | ||
47 | public boolean isRenderDesignSpace() { | ||
48 | return renderDesignSpace; | ||
49 | } | ||
50 | |||
51 | @Override | ||
52 | public boolean isRenderStates() { | ||
53 | return renderStates; | ||
54 | } | ||
55 | |||
56 | @Override | ||
57 | public Set<FileFormat> getFormats() { | ||
58 | return formats; | ||
59 | } | ||
29 | } | 60 | } |
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java index 06cc8113..531969b4 100644 --- a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java +++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerAdapterImpl.java | |||
@@ -21,38 +21,52 @@ import java.util.stream.Collectors; | |||
21 | public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | 21 | public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { |
22 | private final Model model; | 22 | private final Model model; |
23 | private final ModelVisualizerStoreAdapter storeAdapter; | 23 | private final ModelVisualizerStoreAdapter storeAdapter; |
24 | private final Map<AnySymbol, Interpretation<?>> interpretations; | 24 | private final Map<AnySymbol, Interpretation<?>> allInterpretations; |
25 | private final StringBuilder designSpaceBuilder = new StringBuilder(); | 25 | private final StringBuilder designSpaceBuilder = new StringBuilder(); |
26 | private final Map<Version, Integer> states = new HashMap<>(); | 26 | private final Map<Version, Integer> states = new HashMap<>(); |
27 | private int transitionCounter = 0; | 27 | private int transitionCounter = 0; |
28 | private Integer numberOfStates = 0; | 28 | private Integer numberOfStates = 0; |
29 | private static final Map<Object, String> truthValueToDot = new HashMap<>() | 29 | private final String outputPath; |
30 | {{ | 30 | private final Set<FileFormat> formats; |
31 | put(TruthValue.TRUE, "1"); | 31 | private final boolean renderDesignSpace; |
32 | put(TruthValue.FALSE, "0"); | 32 | private final boolean renderStates; |
33 | put(TruthValue.UNKNOWN, "½"); | 33 | |
34 | put(TruthValue.ERROR, "E"); | 34 | private static final Map<Object, String> truthValueToDot = Map.of( |
35 | put(true, "1"); | 35 | TruthValue.TRUE, "1", |
36 | put(false, "0"); | 36 | TruthValue.FALSE, "0", |
37 | }}; | 37 | TruthValue.UNKNOWN, "½", |
38 | TruthValue.ERROR, "E", | ||
39 | true, "1", | ||
40 | false, "0" | ||
41 | ); | ||
38 | 42 | ||
39 | public ModelVisualizerAdapterImpl(Model model, ModelVisualizerStoreAdapter storeAdapter) { | 43 | public ModelVisualizerAdapterImpl(Model model, ModelVisualizerStoreAdapter storeAdapter) { |
40 | this.model = model; | 44 | this.model = model; |
41 | this.storeAdapter = storeAdapter; | 45 | this.storeAdapter = storeAdapter; |
42 | this.interpretations = new HashMap<>(); | 46 | this.outputPath = storeAdapter.getOutputPath(); |
47 | this.formats = storeAdapter.getFormats(); | ||
48 | if (formats.isEmpty()) { | ||
49 | formats.add(FileFormat.SVG); | ||
50 | } | ||
51 | this.renderDesignSpace = storeAdapter.isRenderDesignSpace(); | ||
52 | this.renderStates = storeAdapter.isRenderStates(); | ||
53 | |||
54 | this.allInterpretations = new HashMap<>(); | ||
43 | for (var symbol : storeAdapter.getStore().getSymbols()) { | 55 | for (var symbol : storeAdapter.getStore().getSymbols()) { |
44 | var arity = symbol.arity(); | 56 | var arity = symbol.arity(); |
45 | if (arity < 1 || arity > 2) { | 57 | if (arity < 1 || arity > 2) { |
46 | continue; | 58 | continue; |
47 | } | 59 | } |
48 | var interpretation = (Interpretation<?>) model.getInterpretation(symbol); | 60 | var interpretation = (Interpretation<?>) model.getInterpretation(symbol); |
49 | interpretations.put(symbol, interpretation); | 61 | allInterpretations.put(symbol, interpretation); |
50 | } | 62 | } |
51 | designSpaceBuilder.append("digraph designSpace {\n"); | 63 | designSpaceBuilder.append("digraph designSpace {\n"); |
52 | designSpaceBuilder.append(""" | 64 | designSpaceBuilder.append(""" |
65 | nodesep=0 | ||
66 | ranksep=5 | ||
53 | node[ | 67 | node[ |
54 | style=filled | 68 | \tstyle=filled |
55 | fillcolor=white | 69 | \tfillcolor=white |
56 | ] | 70 | ] |
57 | """); | 71 | """); |
58 | } | 72 | } |
@@ -67,8 +81,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
67 | return storeAdapter; | 81 | return storeAdapter; |
68 | } | 82 | } |
69 | 83 | ||
70 | @Override | 84 | private String createDotForCurrentModelState() { |
71 | public String createDotForCurrentModelState() { | ||
72 | 85 | ||
73 | var unaryTupleToInterpretationsMap = new HashMap<Tuple, LinkedHashSet<Interpretation<?>>>(); | 86 | var unaryTupleToInterpretationsMap = new HashMap<Tuple, LinkedHashSet<Interpretation<?>>>(); |
74 | 87 | ||
@@ -90,7 +103,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
90 | ] | 103 | ] |
91 | """); | 104 | """); |
92 | 105 | ||
93 | for (var entry : interpretations.entrySet()) { | 106 | for (var entry : allInterpretations.entrySet()) { |
94 | var key = entry.getKey(); | 107 | var key = entry.getKey(); |
95 | var arity = key.arity(); | 108 | var arity = key.arity(); |
96 | var cursor = entry.getValue().getAll(); | 109 | var cursor = entry.getValue().getAll(); |
@@ -228,8 +241,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
228 | }; | 241 | }; |
229 | } | 242 | } |
230 | 243 | ||
231 | @Override | 244 | private String createDotForModelState(Version version) { |
232 | public String createDotForModelState(Version version) { | ||
233 | var currentVersion = model.getState(); | 245 | var currentVersion = model.getState(); |
234 | model.restore(version); | 246 | model.restore(version); |
235 | var graph = createDotForCurrentModelState(); | 247 | var graph = createDotForCurrentModelState(); |
@@ -237,8 +249,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
237 | return graph; | 249 | return graph; |
238 | } | 250 | } |
239 | 251 | ||
240 | @Override | 252 | private boolean saveDot(String dot, String filePath) { |
241 | public boolean saveDot(String dot, String filePath) { | ||
242 | File file = new File(filePath); | 253 | File file = new File(filePath); |
243 | file.getParentFile().mkdirs(); | 254 | file.getParentFile().mkdirs(); |
244 | 255 | ||
@@ -251,13 +262,11 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
251 | return true; | 262 | return true; |
252 | } | 263 | } |
253 | 264 | ||
254 | @Override | 265 | private boolean renderDot(String dot, String filePath) { |
255 | public boolean renderDot(String dot, String filePath) { | ||
256 | return renderDot(dot, FileFormat.SVG, filePath); | 266 | return renderDot(dot, FileFormat.SVG, filePath); |
257 | } | 267 | } |
258 | 268 | ||
259 | @Override | 269 | private boolean renderDot(String dot, FileFormat format, String filePath) { |
260 | public boolean renderDot(String dot, FileFormat format, String filePath) { | ||
261 | try { | 270 | try { |
262 | Process process = new ProcessBuilder("dot", "-T" + format.getFormat(), "-o", filePath).start(); | 271 | Process process = new ProcessBuilder("dot", "-T" + format.getFormat(), "-o", filePath).start(); |
263 | 272 | ||
@@ -303,6 +312,26 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
303 | } | 312 | } |
304 | 313 | ||
305 | @Override | 314 | @Override |
315 | public void addState(Version state, Collection<Double> fitness) { | ||
316 | var labelBuilder = new StringBuilder(); | ||
317 | for (var f : fitness) { | ||
318 | labelBuilder.append(f).append(", "); | ||
319 | } | ||
320 | addState(state, labelBuilder.toString()); | ||
321 | } | ||
322 | |||
323 | @Override | ||
324 | public void addState(Version state, String label) { | ||
325 | if (states.containsKey(state)) { | ||
326 | return; | ||
327 | } | ||
328 | states.put(state, numberOfStates++); | ||
329 | designSpaceBuilder.append(states.get(state)).append(" [label = \"").append(states.get(state)).append(" ("); | ||
330 | designSpaceBuilder.append(label); | ||
331 | designSpaceBuilder.append(")\"\n").append("URL=\"./").append(states.get(state)).append(".svg\"]\n"); | ||
332 | } | ||
333 | |||
334 | @Override | ||
306 | public void addSolution(Version state) { | 335 | public void addSolution(Version state) { |
307 | addState(state); | 336 | addState(state); |
308 | designSpaceBuilder.append(states.get(state)).append(" [shape = doublecircle]\n"); | 337 | designSpaceBuilder.append(states.get(state)).append(" [shape = doublecircle]\n"); |
@@ -313,8 +342,7 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
313 | return designSpaceBuilder.toString(); | 342 | return designSpaceBuilder.toString(); |
314 | } | 343 | } |
315 | 344 | ||
316 | @Override | 345 | private boolean saveDesignSpace(String path) { |
317 | public boolean saveDesignSpace(String path) { | ||
318 | saveDot(buildDesignSpaceDot(), path + "/designSpace.dot"); | 346 | saveDot(buildDesignSpaceDot(), path + "/designSpace.dot"); |
319 | for (var entry : states.entrySet()) { | 347 | for (var entry : states.entrySet()) { |
320 | saveDot(createDotForModelState(entry.getKey()), path + "/" + entry.getValue() + ".dot"); | 348 | saveDot(createDotForModelState(entry.getKey()), path + "/" + entry.getValue() + ".dot"); |
@@ -322,21 +350,38 @@ public class ModelVisualizerAdapterImpl implements ModelVisualizerAdapter { | |||
322 | return true; | 350 | return true; |
323 | } | 351 | } |
324 | 352 | ||
325 | @Override | 353 | private void renderDesignSpace(String path, Set<FileFormat> formats) { |
326 | public boolean renderDesignSpace(String path) { | 354 | File filePath = new File(path); |
327 | return renderDesignSpace(path, FileFormat.SVG); | 355 | filePath.mkdirs(); |
356 | if (renderStates) { | ||
357 | for (var entry : states.entrySet()) { | ||
358 | var stateId = entry.getValue(); | ||
359 | var stateDot = createDotForModelState(entry.getKey()); | ||
360 | for (var format : formats) { | ||
361 | if (format == FileFormat.DOT) { | ||
362 | saveDot(stateDot, path + "/" + stateId + ".dot"); | ||
363 | } | ||
364 | else { | ||
365 | renderDot(stateDot, format, path + "/" + stateId + "." + format.getFormat()); | ||
366 | } | ||
367 | } | ||
368 | } | ||
369 | } | ||
370 | if (renderDesignSpace) { | ||
371 | var designSpaceDot = buildDesignSpaceDot(); | ||
372 | for (var format : formats) { | ||
373 | if (format == FileFormat.DOT) { | ||
374 | saveDot(designSpaceDot, path + "/designSpace.dot"); | ||
375 | } | ||
376 | else { | ||
377 | renderDot(designSpaceDot, format, path + "/designSpace." + format.getFormat()); | ||
378 | } | ||
379 | } | ||
380 | } | ||
328 | } | 381 | } |
329 | 382 | ||
330 | @Override | 383 | @Override |
331 | public boolean renderDesignSpace(String path, FileFormat format) { | 384 | public void visualize() { |
332 | for (var entry : states.entrySet()) { | 385 | renderDesignSpace(outputPath, formats); |
333 | var stateId = entry.getValue(); | ||
334 | var stateDot = createDotForModelState(entry.getKey()); | ||
335 | saveDot(stateDot, path + "/" + stateId + ".dot"); | ||
336 | renderDot(stateDot, format, path + "/" + stateId + "." + format.getFormat()); | ||
337 | } | ||
338 | var designSpaceDot = buildDesignSpaceDot(); | ||
339 | saveDot(designSpaceDot, path + "/designSpace.dot"); | ||
340 | return renderDot(designSpaceDot, format, path + "/designSpace." + format.getFormat()); | ||
341 | } | 386 | } |
342 | } | 387 | } |
diff --git a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java index d19cf2cf..e4d801d8 100644 --- a/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java +++ b/subprojects/visualization/src/main/java/tools/refinery/visualization/internal/ModelVisualizerBuilderImpl.java | |||
@@ -9,11 +9,47 @@ import tools.refinery.store.adapter.AbstractModelAdapterBuilder; | |||
9 | import tools.refinery.store.model.ModelStore; | 9 | import tools.refinery.store.model.ModelStore; |
10 | import tools.refinery.visualization.ModelVisualizerBuilder; | 10 | import tools.refinery.visualization.ModelVisualizerBuilder; |
11 | 11 | ||
12 | import java.util.LinkedHashSet; | ||
13 | import java.util.Set; | ||
14 | |||
12 | public class ModelVisualizerBuilderImpl | 15 | public class ModelVisualizerBuilderImpl |
13 | extends AbstractModelAdapterBuilder<ModelVisualizeStoreAdapterImpl> | 16 | extends AbstractModelAdapterBuilder<ModelVisualizeStoreAdapterImpl> |
14 | implements ModelVisualizerBuilder { | 17 | implements ModelVisualizerBuilder { |
18 | private String outputPath; | ||
19 | private boolean saveDesignSpace = false; | ||
20 | private boolean saveStates = false; | ||
21 | private Set<FileFormat> formats = new LinkedHashSet<>(); | ||
22 | |||
15 | @Override | 23 | @Override |
16 | protected ModelVisualizeStoreAdapterImpl doBuild(ModelStore store) { | 24 | protected ModelVisualizeStoreAdapterImpl doBuild(ModelStore store) { |
17 | return new ModelVisualizeStoreAdapterImpl(store); | 25 | return new ModelVisualizeStoreAdapterImpl(store, outputPath, formats, saveDesignSpace, saveStates); |
26 | } | ||
27 | |||
28 | @Override | ||
29 | public ModelVisualizerBuilder withOutputpath(String outputpath) { | ||
30 | checkNotConfigured(); | ||
31 | this.outputPath = outputpath; | ||
32 | return this; | ||
33 | } | ||
34 | |||
35 | @Override | ||
36 | public ModelVisualizerBuilder withFormat(FileFormat format) { | ||
37 | checkNotConfigured(); | ||
38 | this.formats.add(format); | ||
39 | return this; | ||
40 | } | ||
41 | |||
42 | @Override | ||
43 | public ModelVisualizerBuilder saveDesignSpace() { | ||
44 | checkNotConfigured(); | ||
45 | this.saveDesignSpace = true; | ||
46 | return this; | ||
47 | } | ||
48 | |||
49 | @Override | ||
50 | public ModelVisualizerBuilder saveStates() { | ||
51 | checkNotConfigured(); | ||
52 | this.saveStates = true; | ||
53 | return this; | ||
18 | } | 54 | } |
19 | } | 55 | } |