From d0dc7ff35d71919d503ae35592478b173cf3cfd3 Mon Sep 17 00:00:00 2001
From: Normand Briere <nbriere@noware.ca>
Date: Mon, 10 Jun 2019 23:45:04 -0400
Subject: [PATCH] Extract big data.

---
 ObjEditor.java   |   67 +++++++++++++++++++++
 GroupEditor.java |    3 
 Object3D.java    |   55 ++++++++++++++++++
 3 files changed, 121 insertions(+), 4 deletions(-)

diff --git a/GroupEditor.java b/GroupEditor.java
index b4f001a..43af894 100644
--- a/GroupEditor.java
+++ b/GroupEditor.java
@@ -3429,7 +3429,8 @@
                     
                     int size = obj.MemorySize();
                     
-                    System.err.println((size/1024) + " KB is the size of " + obj);
+                    //System.err.println((size/1024) + " KB is the size of " + obj);
+                    System.err.println("the size of " + obj + " is " + size + " (" + (size/1024) + "KB)");
                 }
             }
             catch (Exception e)
diff --git a/ObjEditor.java b/ObjEditor.java
index b7c343d..2cb5163 100644
--- a/ObjEditor.java
+++ b/ObjEditor.java
@@ -3214,6 +3214,47 @@
         objEditor.refreshContents();
     }
     
+    static public byte[] Compress(Object o)
+    {
+        try
+        {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            java.util.zip.GZIPOutputStream zstream = new java.util.zip.GZIPOutputStream(baos);
+            ObjectOutputStream out = new ObjectOutputStream(zstream);
+
+            out.writeObject(o);
+            
+            out.flush();
+
+            zstream.close();
+            out.close();
+            
+            return baos.toByteArray();
+        } catch (Exception e)
+        {
+            System.err.println(e);
+            return null;
+        }
+    }
+
+    static public Object Uncompress(byte[] bytes)
+    {
+        try
+        {
+            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+            java.util.zip.GZIPInputStream istream = new java.util.zip.GZIPInputStream(bais);
+            ObjectInputStream in = new ObjectInputStream(istream);
+            Object obj = in.readObject();
+            in.close();
+            
+            return obj;
+        } catch (Exception e)
+        {
+            System.err.println(e);
+            return null;
+        }
+    }
+
     static public Object clone(Object o)
     {
         try
@@ -3222,12 +3263,19 @@
             ObjectOutputStream out = new ObjectOutputStream(baos);
 
             out.writeObject(o);
+            
+            out.flush();
+            out.close();
+            
+            byte[] bytes = baos.toByteArray();
+            
+            System.out.println("clone = " + bytes.length);
 
-            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
             ObjectInputStream in = new ObjectInputStream(bais);
             Object obj = in.readObject();
             in.close();
-            out.close();
+            
             return obj;
         } catch (Exception e)
         {
@@ -3251,13 +3299,21 @@
         return null;
     }
     
+    java.util.Hashtable<java.util.UUID, Object3D> hashtable = new java.util.Hashtable<java.util.UUID, Object3D>();
+    
     public void Save()
     {
         cRadio tab = GetCurrentTab();
         
+        copy.ExtractBigData(hashtable);
+        
         //EditorFrame.m_MainFrame.requestFocusInWindow();
         tab.graphs[tab.undoindex++] = (Object3D)clone(copy);
 
+        copy.RestoreBigData(hashtable);
+        
+        //assert(hashtable.isEmpty());
+        
         for (int i = tab.undoindex; i < tab.graphs.length; i++)
         {
             tab.graphs[i] = null;
@@ -3285,12 +3341,18 @@
 
     void CopyChanged(Object3D obj)
     {
+        copy.ExtractBigData(hashtable);
+        
         copy.clear();
         
         for (int i=0; i<obj.Size(); i++)
         {
             copy.add(obj.get(i));
         }
+        
+        copy.RestoreBigData(hashtable);
+        
+        //assert(hashtable.isEmpty());
         
         copy.Touch();
         
@@ -4295,6 +4357,7 @@
         
         if (readobj != null)
         {
+            Save();
             try
             {
                 //readobj.deepCopySelf(copy);
diff --git a/Object3D.java b/Object3D.java
index 2c2cf4d..af581bd 100644
--- a/Object3D.java
+++ b/Object3D.java
@@ -163,6 +163,59 @@
     }
 }
 
+void ExtractBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable)
+{
+    if (hashtable.containsKey(GetUUID()))
+        return;
+    
+    Object3D o = new Object3D();
+    o.bRep = this.bRep;
+    if (this.bRep != null)
+    {
+        o.transientrep = this.bRep.support;
+        o.bRep.support = null;
+    }
+    
+//    o.support = this.support;
+//    o.fileparent = this.fileparent;
+//    if (this.bRep != null)
+//        o.bRep = this.bRep.support;
+    
+    hashtable.put(GetUUID(), o);
+    
+    this.bRep = null;
+//    if (this.bRep != null)
+//        this.bRep.support = null;
+//    this.support = null;
+//    this.fileparent = null;
+    
+    for (int i=0; i<Size(); i++)
+    {
+        get(i).ExtractBigData(hashtable);
+    }
+}
+
+void RestoreBigData(java.util.Hashtable<java.util.UUID, Object3D> hashtable)
+{
+    if (!hashtable.containsKey(GetUUID()))
+        return;
+    
+    Object3D o = hashtable.get(GetUUID());
+    
+    this.bRep = o.bRep;
+    if (this.bRep != null)
+        this.bRep.support = o.transientrep;
+//    this.support = o.support;
+//    this.fileparent = o.fileparent;
+    
+    hashtable.remove(GetUUID());
+    
+    for (int i=0; i<Size(); i++)
+    {
+        get(i).RestoreBigData(hashtable);
+    }
+}
+
 // MOCAP SUPPORT
     double tx,ty,tz,rx,ry,rz;
     
@@ -7567,7 +7620,7 @@
 	/*transient*/ cVector2[] projectedVertices = new cVector2[0];
         
     Object3D /*Composite*/ parent;
-    Object3D /*Composite*/ fileparent;
+    Object3D /*Composite*/ fileparent; // In the case of FileObject
     
     double[][] toParent; // dynamic matrix
     double[][] fromParent;

--
Gitblit v1.6.2