[resolves #328][save][load] Fixed invalid save & load fields for 'FinSet', 'LineInstanceable' Components

- PodSet may save/load auto-radial-offset
- Fins now save/load
  - 'instancecount'
  - 'angularoffset'
  - 'radialoffset' = 'auto'

- RadiusPositionable interface now enforces 'setAutoRadialOffset(...)'
- implemented RockeComponentSaver#emitInteger
- all LineInstanceable implementers read/write 'instanceseparation'
- [fix] RocketComponentSaver now saves 'instancecount' even if 1==instancecount
This commit is contained in:
Daniel_M_Williams 2017-10-14 09:57:27 -04:00
parent eb72329c58
commit 212685b026
6 changed files with 57 additions and 29 deletions

View File

@ -187,7 +187,7 @@ class DocumentConfig {
// RailButton // RailButton
setters.put("RailButton:instancecount", new IntSetter( setters.put("RailButton:instancecount", new IntSetter(
Reflection.findMethod( RailButton.class, "setInstanceCount",int.class))); Reflection.findMethod( RailButton.class, "setInstanceCount",int.class)));
setters.put("RailButton:linseparation", new DoubleSetter( setters.put("RailButton:instanceseparation", new DoubleSetter(
Reflection.findMethod( RailButton.class, "setInstanceSeparation", double.class))); Reflection.findMethod( RailButton.class, "setInstanceSeparation", double.class)));
setters.put("RailButton:angularoffset", new DoubleSetter( setters.put("RailButton:angularoffset", new DoubleSetter(
Reflection.findMethod( RailButton.class, "setAngularOffset", double.class), Math.PI / 180.0)); Reflection.findMethod( RailButton.class, "setAngularOffset", double.class), Math.PI / 180.0));
@ -242,8 +242,16 @@ class DocumentConfig {
// FinSet // FinSet
setters.put("FinSet:fincount", new IntSetter( setters.put("FinSet:fincount", new IntSetter(
Reflection.findMethod(FinSet.class, "setFinCount", int.class))); Reflection.findMethod(FinSet.class, "setFinCount", int.class)));
setters.put("FinSet:instancecount", new IntSetter(
Reflection.findMethod(FinSet.class, "setInstanceCount", int.class)));
setters.put("FinSet:rotation", new DoubleSetter( setters.put("FinSet:rotation", new DoubleSetter(
Reflection.findMethod(FinSet.class, "setBaseRotation", double.class), Math.PI / 180.0)); Reflection.findMethod(FinSet.class, "setBaseRotation", double.class), Math.PI / 180.0));
setters.put("FinSet:angularoffset", new DoubleSetter(
Reflection.findMethod(FinSet.class, "setAngularOffset", double.class), Math.PI / 180.0));
setters.put("FinSet:radialoffset", new DoubleSetter(
Reflection.findMethod(FinSet.class, "setRadialOffset", double.class),
"auto",
Reflection.findMethod(FinSet.class, "setAutoRadialOffset", boolean.class)));
setters.put("FinSet:thickness", new DoubleSetter( setters.put("FinSet:thickness", new DoubleSetter(
Reflection.findMethod(FinSet.class, "setThickness", double.class))); Reflection.findMethod(FinSet.class, "setThickness", double.class)));
setters.put("FinSet:crosssection", new EnumSetter<FinSet.CrossSection>( setters.put("FinSet:crosssection", new EnumSetter<FinSet.CrossSection>(
@ -261,6 +269,7 @@ class DocumentConfig {
setters.put("FinSet:filletmaterial", new MaterialSetter( setters.put("FinSet:filletmaterial", new MaterialSetter(
Reflection.findMethod(FinSet.class, "setFilletMaterial", Material.class), Reflection.findMethod(FinSet.class, "setFilletMaterial", Material.class),
Material.Type.BULK)); Material.Type.BULK));
// TrapezoidFinSet // TrapezoidFinSet
setters.put("TrapezoidFinSet:rootchord", new DoubleSetter( setters.put("TrapezoidFinSet:rootchord", new DoubleSetter(
Reflection.findMethod(TrapezoidFinSet.class, "setRootChord", double.class))); Reflection.findMethod(TrapezoidFinSet.class, "setRootChord", double.class)));
@ -425,10 +434,18 @@ class DocumentConfig {
setters.put("PodSet:instancecount", new IntSetter( setters.put("PodSet:instancecount", new IntSetter(
Reflection.findMethod(PodSet.class, "setInstanceCount",int.class))); Reflection.findMethod(PodSet.class, "setInstanceCount",int.class)));
setters.put("PodSet:radialoffset", new DoubleSetter( setters.put("PodSet:radialoffset", new DoubleSetter(
Reflection.findMethod(PodSet.class, "setRadialOffset", double.class))); Reflection.findMethod(PodSet.class, "setRadialOffset", double.class),
"auto",
Reflection.findMethod(PodSet.class, "setAutoRadialOffset", boolean.class)));
setters.put("ParallelStage:radialoffset", new DoubleSetter(
Reflection.findMethod(ParallelStage.class, "setRadialOffset", double.class),
"auto",
Reflection.findMethod(ParallelStage.class, "setAutoRadialOffset", boolean.class)));
setters.put("PodSet:angularoffset", new DoubleSetter( setters.put("PodSet:angularoffset", new DoubleSetter(
Reflection.findMethod(PodSet.class, "setAngularOffset", double.class),Math.PI / 180.0)); Reflection.findMethod(PodSet.class, "setAngularOffset", double.class),Math.PI / 180.0));
// Streamer // Streamer
setters.put("Streamer:striplength", new DoubleSetter( setters.put("Streamer:striplength", new DoubleSetter(
Reflection.findMethod(Streamer.class, "setStripLength", double.class))); Reflection.findMethod(Streamer.class, "setStripLength", double.class)));

View File

@ -12,8 +12,11 @@ public class FinSetSaver extends ExternalComponentSaver {
super.addParams(c, elements); super.addParams(c, elements);
net.sf.openrocket.rocketcomponent.FinSet fins = (net.sf.openrocket.rocketcomponent.FinSet) c; net.sf.openrocket.rocketcomponent.FinSet fins = (net.sf.openrocket.rocketcomponent.FinSet) c;
elements.add("<fincount>" + fins.getFinCount() + "</fincount>");
elements.add("<rotation>" + (fins.getBaseRotation() * 180.0 / Math.PI) + "</rotation>"); // // this information is already saved as 'RingInstanceable' in RocktComponent
// elements.add("<fincount>" + fins.getFinCount() + "</fincount>");
// elements.add("<rotation>" + (fins.getBaseRotation() * 180.0 / Math.PI) + "</rotation>");
elements.add("<thickness>" + fins.getThickness() + "</thickness>"); elements.add("<thickness>" + fins.getThickness() + "</thickness>");
elements.add("<crosssection>" + fins.getCrossSection().name().toLowerCase(Locale.ENGLISH) elements.add("<crosssection>" + fins.getCrossSection().name().toLowerCase(Locale.ENGLISH)
+ "</crosssection>"); + "</crosssection>");

View File

@ -84,25 +84,23 @@ public class RocketComponentSaver {
if ( c instanceof Instanceable) { if ( c instanceof Instanceable) {
int instanceCount = c.getInstanceCount(); int instanceCount = c.getInstanceCount();
if( 1 < instanceCount ){ if( c instanceof Clusterable ){
if( c instanceof Clusterable ){ ; // no-op. Instance counts are set via named cluster configurations
; // no-op. Instance counts are set via named cluster configurations }
} if( c instanceof LineInstanceable ){
if( c instanceof LineInstanceable ){ LineInstanceable line = (LineInstanceable)c;
LineInstanceable line = (LineInstanceable)c; emitInteger( elements, "instancecount", instanceCount );
emitString( elements, "instancecount", Integer.toString( instanceCount ) ); emitDouble( elements, "instanceseparation", line.getInstanceSeparation());
emitDouble( elements, "linseparation", line.getInstanceSeparation()); }
} if( c instanceof RingInstanceable){
if( c instanceof RingInstanceable){ RingInstanceable ring = (RingInstanceable)c;
RingInstanceable ring = (RingInstanceable)c; emitInteger( elements, "instancecount", instanceCount );
emitString( elements, "instancecount", Integer.toString( instanceCount )); if( ring.getAutoRadialOffset() ){
if( ring.getAutoRadialOffset() ){ emitString(elements, "radialoffset", "auto");
emitString(elements, "radialoffset", "auto"); }else{
}else{ emitDouble( elements, "radialoffset", ring.getRadialOffset() );
emitDouble( elements, "radialoffset", ring.getRadialOffset() );
}
emitDouble( elements, "angularoffset", ring.getAngularOffset()*180.0/Math.PI);
} }
emitDouble( elements, "angularoffset", ring.getAngularOffset()*180.0/Math.PI);
} }
} }
@ -250,11 +248,15 @@ public class RocketComponentSaver {
} }
protected static void emitDouble( final List<String> elements, final String enclosingTag, final double value){ protected static void emitDouble( final List<String> elements, final String enclosingTag, final double value){
emitString( elements, enclosingTag, Double.toString( value )); emitString( elements, enclosingTag, Double.toString( value ));
}
protected static void emitInteger( final List<String> elements, final String enclosingTag, final int value){
elements.add("<"+enclosingTag+">" + Integer.toString( value ) + "</"+enclosingTag+">");
} }
protected static void emitString( final List<String> elements, final String enclosingTag, final String value){ protected static void emitString( final List<String> elements, final String enclosingTag, final String value){
elements.add("<"+enclosingTag+">" + value + "</"+enclosingTag+">"); elements.add("<"+enclosingTag+">" + value + "</"+enclosingTag+">");
} }

View File

@ -779,6 +779,11 @@ public abstract class FinSet extends ExternalComponent implements RingInstanceab
public void setRadialOffset(double radius) { public void setRadialOffset(double radius) {
// no-op. Not allowed for fins // no-op. Not allowed for fins
} }
@Override
public void setAutoRadialOffset( final boolean auto ) {
// no-op. Fins are *always* automatically positioned
}
@Override @Override
public void setInstanceCount(int newCount) { public void setInstanceCount(int newCount) {

View File

@ -15,10 +15,12 @@ public interface RingInstanceable extends Instanceable, AnglePositionable, Radiu
public double[] getInstanceAngles(); public double[] getInstanceAngles();
@Override
public boolean getAutoRadialOffset();
@Override @Override
public double getRadialOffset(); public double getRadialOffset();
@Override @Override
public boolean getAutoRadialOffset(); public void setAutoRadialOffset( final boolean auto );
@Override @Override
public void setRadialOffset(final double radius); public void setRadialOffset(final double radius);

View File

@ -1,9 +1,8 @@
package net.sf.openrocket.rocketcomponent.position; package net.sf.openrocket.rocketcomponent.position;
public interface RadiusPositionable { public interface RadiusPositionable {
public double getRadialOffset();
public boolean getAutoRadialOffset(); public boolean getAutoRadialOffset();
public double getRadialOffset();
public void setAutoRadialOffset( final boolean auto );
public void setRadialOffset(final double radius); public void setRadialOffset(final double radius);
} }