From bc5b821d7023d95a54d1c54ca8e0840040ff999c Mon Sep 17 00:00:00 2001 From: Dan Royer Date: Sun, 17 Dec 2023 17:28:37 -0800 Subject: [PATCH] Added save and load nested Nodes --- .../ro3/actions/LoadScene.java | 14 +++++++----- .../ro3/actions/SaveScene.java | 10 ++++----- .../com/marginallyclever/ro3/node/Node.java | 14 +++++++----- .../ro3/node/nodetreeview/NodeTreeView.java | 22 ++++++++++++------- 4 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/marginallyclever/ro3/actions/LoadScene.java b/src/main/java/com/marginallyclever/ro3/actions/LoadScene.java index 4707e1f84..f40be4992 100644 --- a/src/main/java/com/marginallyclever/ro3/actions/LoadScene.java +++ b/src/main/java/com/marginallyclever/ro3/actions/LoadScene.java @@ -4,14 +4,18 @@ import com.marginallyclever.ro3.Registry; import com.marginallyclever.ro3.node.Node; import com.marginallyclever.robotoverlord.RobotOverlord; +import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; public class LoadScene extends AbstractAction { private static final JFileChooser chooser = new JFileChooser(); @@ -39,14 +43,12 @@ public void actionPerformed(ActionEvent e) { private void loadAsNewScene(File selectedFile) { logger.info("Load scene from {}",selectedFile.getAbsolutePath()); - logger.error("Load Scene not implemented yet."); - - // Create an ObjectMapper instance - ObjectMapper mapper = new ObjectMapper(); try { - // Read the JSON file and convert it into a Node object - Node loaded = mapper.readValue(selectedFile, Node.class); + String content = new String(Files.readAllBytes(Paths.get(selectedFile.getAbsolutePath()))); + JSONObject json = new JSONObject(content); + Node loaded = new Node("Scene"); + loaded.fromJSON(json); Registry.setScene(loaded); } catch (IOException e) { logger.error("Error loading scene from JSON", e); diff --git a/src/main/java/com/marginallyclever/ro3/actions/SaveScene.java b/src/main/java/com/marginallyclever/ro3/actions/SaveScene.java index 27fdc4722..7e34a447c 100644 --- a/src/main/java/com/marginallyclever/ro3/actions/SaveScene.java +++ b/src/main/java/com/marginallyclever/ro3/actions/SaveScene.java @@ -9,7 +9,9 @@ import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; +import java.io.BufferedWriter; import java.io.File; +import java.io.FileWriter; import java.io.IOException; public class SaveScene extends AbstractAction { @@ -53,12 +55,8 @@ public void actionPerformed(ActionEvent e) { private void saveScene(String absolutePath) { logger.info("Save scene to {}",absolutePath); - // Create an ObjectMapper instance - ObjectMapper mapper = new ObjectMapper(); - - try { - // Write the Registry.scene to a JSON file - mapper.writeValue(new File(absolutePath), Registry.getScene()); + try (BufferedWriter writer = new BufferedWriter(new FileWriter(absolutePath))) { + writer.write(Registry.getScene().toJSON().toString()); } catch (IOException e) { logger.error("Error saving scene to JSON", e); } diff --git a/src/main/java/com/marginallyclever/ro3/node/Node.java b/src/main/java/com/marginallyclever/ro3/node/Node.java index 549f2fe76..4fb7a09bd 100644 --- a/src/main/java/com/marginallyclever/ro3/node/Node.java +++ b/src/main/java/com/marginallyclever/ro3/node/Node.java @@ -3,6 +3,7 @@ import com.marginallyclever.ro3.Registry; import com.marginallyclever.ro3.node.nodes.Pose; import com.marginallyclever.robotoverlord.swing.CollapsiblePanel; +import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,11 +45,11 @@ public void addChild(Node child) { if(child.children.isEmpty()) { fireReadyEvent(child); child.onReady(); - } else { + }/* else { for(Node grandchild : child.children) { child.addChild(grandchild); } - } + }*/ } private void fireReadyEvent(Node child) { @@ -357,12 +358,16 @@ public T findFirstSibling(Class type) { * @return the JSON object. */ public JSONObject toJSON() { - logger.info("Saving node {}.",getAbsolutePath()); + logger.info("Saving {}.",getAbsolutePath()); JSONObject json = new JSONObject(); json.put("type",getClass().getSimpleName()); json.put("name",name); json.put("nodeID",nodeID.toString()); - json.put("children",children); + JSONArray childrenArray = new JSONArray(); + for (Node child : this.children) { + childrenArray.put(child.toJSON()); + } + json.put("children",childrenArray); return json; } @@ -374,7 +379,6 @@ public JSONObject toJSON() { */ public void fromJSON(JSONObject from) { name = from.getString("name"); - logger.info("Loading node {}.",name); nodeID = UUID.fromString(from.getString("nodeID")); children.clear(); for (Object o : from.getJSONArray("children")) { diff --git a/src/main/java/com/marginallyclever/ro3/node/nodetreeview/NodeTreeView.java b/src/main/java/com/marginallyclever/ro3/node/nodetreeview/NodeTreeView.java index 4e8835a8f..fdef9be82 100644 --- a/src/main/java/com/marginallyclever/ro3/node/nodetreeview/NodeTreeView.java +++ b/src/main/java/com/marginallyclever/ro3/node/nodetreeview/NodeTreeView.java @@ -16,6 +16,7 @@ import javax.swing.tree.*; import java.awt.*; import java.awt.event.ActionEvent; +import java.security.InvalidParameterException; import java.util.*; import java.util.List; import java.util.function.Supplier; @@ -97,15 +98,20 @@ private void stopListeningTo(Node node) { /** * Scan the tree for existing nodes. - * @param parent the node to scan + * @param toScan the node to scan */ - public void scanTree(Node parent) { - if(parent == null) return; - NodeTreeBranch parentBranch = findTreeNode(parent); - if(parentBranch == null) return; + public void scanTree(Node toScan) { + if(toScan == null) throw new InvalidParameterException("node is null"); + logger.info("Scanning "+toScan.getAbsolutePath()); + + NodeTreeBranch parentBranch = findTreeNode(toScan); + if(parentBranch == null) { + logger.error("node has no branch"); + return; + } - for (Node child : parent.getChildren()) { - logger.debug("scanTree "+parent.getAbsolutePath()+" has child "+child.getAbsolutePath()); + for (Node child : toScan.getChildren()) { + logger.debug("node has child "+child.getAbsolutePath()); nodeAttached(child); } } @@ -249,7 +255,7 @@ public void beforeSceneChange(Node oldScene) { public void afterSceneChange(Node newScene) { logger.debug("afterSceneChange"); listenTo(newScene); - treeModel.removeAllChildren(); + treeModel.setUserObject(newScene); ((DefaultTreeModel) tree.getModel()).nodeStructureChanged(treeModel.getRoot()); scanTree(newScene); }