====== Save/load static variables ======
This tutorial covers how to save/load static parameters in your projects.
===== Create project =====
In a ''newRGG'' project, add a new file called "paramfile". (in the file explorer click "new>file>", enter paramfile - no extensions).
{{:tutorials:first-steps:parafile.png?200|}}
In the ''Model.rgg'' file copy:
import java.io.Writer;
import java.io.Reader;
import de.grogra.pf.ui.registry.RunAfterSave;
import de.grogra.pf.ui.registry.RunAfterLoad;
import de.grogra.pf.registry.RegistryContext;
global float myFloat = 1f;
public static int myInt = 3;
public static String myString = "initValue";
public class LoadParam implements RunAfterLoad{
public void load(RegistryContext ctx){
Object f = getFileFromProject("paramfile");
Reader r = ctx.getRegistry().getFileSystem().getReader(f);
char[] buf = new char[2048];
r.read(buf);
String alltext = new String (buf);
String[] lines = alltext.split("\n");
for (String line : lines){
String[] param = line.split("=");
if ("myInt".contentEquals(param[0])) {
myInt = Integer.valueOf(param[1]);
} else
if ("myString".contentEquals(param[0])){
myString = param[1];
}
}
}
}
public class SaveParam implements RunAfterSave{
public void save(RegistryContext ctx){
Object f = getFileFromProject("paramfile");
Writer w = ctx.getRegistry().getFileSystem().getWriter(f, false);
w.append("myInt="+myInt+"\n");
w.append("myString="+myString+"\n");
w.close();
}
}
protected void init ()
[
Axiom ==> ;
]
public void r(){
myInt ++;
myString = "anotherValue";
myFloat++;
}
public void p ()
{
println(myInt);
println(myString);
println(myFloat);
}
**Note:**
* The variable ''myFloat'' is not included in the ''save'' and ''load'' methods. As a ''global'' it is automatically included in GroIMP serialization.
* Any other serialization method can be used. Here we "simply" write varName=varValue as string in a text file. However, any other approach would work (e.g. write in csv, ...). The file does not have to be within the project (as ''paramfile'' is).
* To reset the three variables to their initial values, the project needs to be either ''recompiled'' or ''reset''.
You can run the ''r()'' command to change the value of the variables. Save the project, close it, re open it, and run ''p()'' to print their current value.
===== With the plugin PropFile =====
The PropFile plugin includes some methods to:
* automatically create/ get a property file
* save/load variables by simply giving them a "name" in the file
* save/load variables without casting their type
Example with the previous file:
import de.grogra.pf.ui.registry.RunAfterSave;
import de.grogra.pf.ui.registry.RunAfterLoad;
import de.grogra.pf.registry.RegistryContext;
import de.grogra.propFile.TypedTextPropertyFile;
public static int myInt = 3;
public static String myString = "initValue";
static int myInt = 5;
static String myString = " ";
public class LoadParam implements RunAfterLoad{
public void load(RegistryContext ctx){
TypedTextPropertyFile props = TypedTextPropertyFile.fromProjectFile("paramfile", ctx);
props.load();
myInt = props.get("myInt", myInt);
myString = props.get("myString", myString);
}
}
public class SaveParam implements RunAfterSave{
public void save(RegistryContext ctx){
TypedTextPropertyFile props = TypedTextPropertyFile.fromProjectFile("paramfile", ctx);
props.clear();
props.set("myInt", myInt);
props.set("myString", myString);
props.save();
}
}