[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
setters.put("RailButton:instancecount", new IntSetter(
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)));
setters.put("RailButton:angularoffset", new DoubleSetter(
Reflection.findMethod( RailButton.class, "setAngularOffset", double.class), Math.PI / 180.0));
@ -242,8 +242,16 @@ class DocumentConfig {
// FinSet
setters.put("FinSet:fincount", new IntSetter(
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(
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(
Reflection.findMethod(FinSet.class, "setThickness", double.class)));
setters.put("FinSet:crosssection", new EnumSetter<FinSet.CrossSection>(
@ -261,6 +269,7 @@ class DocumentConfig {
setters.put("FinSet:filletmaterial", new MaterialSetter(
Reflection.findMethod(FinSet.class, "setFilletMaterial", Material.class),
Material.Type.BULK));
// TrapezoidFinSet
setters.put("TrapezoidFinSet:rootchord", new DoubleSetter(
Reflection.findMethod(TrapezoidFinSet.class, "setRootChord", double.class)));
@ -425,10 +434,18 @@ class DocumentConfig {
setters.put("PodSet:instancecount", new IntSetter(
Reflection.findMethod(PodSet.class, "setInstanceCount",int.class)));
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(
Reflection.findMethod(PodSet.class, "setAngularOffset", double.class),Math.PI / 180.0));
// Streamer
setters.put("Streamer:striplength", new DoubleSetter(
Reflection.findMethod(Streamer.class, "setStripLength", double.class)));

View File

@ -12,8 +12,11 @@ public class FinSetSaver extends ExternalComponentSaver {
super.addParams(c, elements);
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("<crosssection>" + fins.getCrossSection().name().toLowerCase(Locale.ENGLISH)
+ "</crosssection>");

View File

@ -84,25 +84,23 @@ public class RocketComponentSaver {
if ( c instanceof Instanceable) {
int instanceCount = c.getInstanceCount();
if( 1 < instanceCount ){
if( c instanceof Clusterable ){
; // no-op. Instance counts are set via named cluster configurations
}
if( c instanceof LineInstanceable ){
LineInstanceable line = (LineInstanceable)c;
emitString( elements, "instancecount", Integer.toString( instanceCount ) );
emitDouble( elements, "linseparation", line.getInstanceSeparation());
}
if( c instanceof RingInstanceable){
RingInstanceable ring = (RingInstanceable)c;
emitString( elements, "instancecount", Integer.toString( instanceCount ));
if( ring.getAutoRadialOffset() ){
emitString(elements, "radialoffset", "auto");
}else{
emitDouble( elements, "radialoffset", ring.getRadialOffset() );
}
emitDouble( elements, "angularoffset", ring.getAngularOffset()*180.0/Math.PI);
if( c instanceof Clusterable ){
; // no-op. Instance counts are set via named cluster configurations
}
if( c instanceof LineInstanceable ){
LineInstanceable line = (LineInstanceable)c;
emitInteger( elements, "instancecount", instanceCount );
emitDouble( elements, "instanceseparation", line.getInstanceSeparation());
}
if( c instanceof RingInstanceable){
RingInstanceable ring = (RingInstanceable)c;
emitInteger( elements, "instancecount", instanceCount );
if( ring.getAutoRadialOffset() ){
emitString(elements, "radialoffset", "auto");
}else{
emitDouble( elements, "radialoffset", ring.getRadialOffset() );
}
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){
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){
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) {
// no-op. Not allowed for fins
}
@Override
public void setAutoRadialOffset( final boolean auto ) {
// no-op. Fins are *always* automatically positioned
}
@Override
public void setInstanceCount(int newCount) {

View File

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

View File

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