[fixes #358] Implement multi-component editing

This commit is contained in:
SiboVG 2022-02-17 00:33:15 +01:00
parent aacc101f3a
commit 8ce90d2bb5
32 changed files with 961 additions and 24 deletions

View File

@ -69,6 +69,12 @@ public abstract class BodyComponent extends ExternalComponent {
return;
this.length = Math.max(length, 0);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof BodyComponent) {
((BodyComponent) listener).setLength(length);
}
}
}
@Override

View File

@ -125,6 +125,12 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou
this.thickness = this.outerRadius;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
clearPreset();
for (RocketComponent listener : configListeners) {
if (listener instanceof BodyTube) {
((BodyTube) listener).setOuterRadius(radius);
}
}
}
@ -146,6 +152,12 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou
autoRadius = auto;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
clearPreset();
for (RocketComponent listener : configListeners) {
if (listener instanceof BodyTube) {
((BodyTube) listener).setOuterRadiusAutomatic(auto);
}
}
}
@Override
@ -239,6 +251,12 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou
@Override
public void setInnerRadius(double r) {
setThickness(getOuterRadius() - r);
for (RocketComponent listener : configListeners) {
if (listener instanceof BodyTube) {
((BodyTube) listener).setInnerRadius(r);
}
}
}
@ -384,9 +402,12 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou
}
this.isActingMount=true;
// this is done automatically in the motorSet
//fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof BodyTube) {
((BodyTube) listener).setMotorConfig(newMotorConfig, fcid);
}
}
}
@ -411,6 +432,12 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou
return;
this.isActingMount = _active;
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof BodyTube) {
((BodyTube) listener).setMotorMount(_active);
}
}
}
@Override
@ -447,6 +474,12 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou
return;
this.overhang = overhang;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof BodyTube) {
((BodyTube) listener).setMotorOverhang(overhang);
}
}
}

View File

@ -159,6 +159,12 @@ public abstract class ComponentAssembly extends RocketComponent implements Axial
throw new BugException("Unrecognized subclass of Component Assembly. Please update this method.");
}
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ComponentAssembly) {
((ComponentAssembly) listener).setAxialMethod(newMethod);
}
}
}
@Override

View File

@ -64,6 +64,12 @@ public class EllipticalFinSet extends FinSet {
return;
this.height = height;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof EllipticalFinSet) {
((EllipticalFinSet) listener).setHeight(height);
}
}
}
@ -73,6 +79,12 @@ public class EllipticalFinSet extends FinSet {
this.length = length;
validateFinTabLength();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof EllipticalFinSet) {
((EllipticalFinSet) listener).setLength(length);
}
}
}

View File

@ -114,6 +114,12 @@ public abstract class ExternalComponent extends RocketComponent {
material = mat;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ExternalComponent) {
((ExternalComponent) listener).setMaterial(mat);
}
}
}
public Finish getFinish() {
@ -125,6 +131,12 @@ public abstract class ExternalComponent extends RocketComponent {
return;
this.finish = finish;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ExternalComponent) {
((ExternalComponent) listener).setFinish(finish);
}
}
}

View File

@ -163,6 +163,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
finRotationIncrement = Transformation.rotate_x(2 * Math.PI / finCount);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setFinCount(n);
}
}
}
public Transformation getFinRotationTransformation() {
@ -188,6 +194,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
*/
public void setBaseRotation(double r) {
setAngleOffset(r);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setBaseRotation(r);
}
}
}
/**
@ -208,6 +220,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
this.cantRadians = clampedCant;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setCantAngle(newCantRadians);
}
}
}
public Transformation getCantRotation() {
@ -230,6 +248,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
return;
thickness = Math.max(r, 0);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setThickness(r);
}
}
}
@ -242,6 +266,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
return;
crossSection = cs;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setCrossSection(cs);
}
}
}
public double getTabHeight() {
@ -272,6 +302,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
tabHeight = newTabHeight;
validateFinTabHeight();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setTabHeight(newTabHeight);
}
}
}
@ -292,6 +328,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
updateTabPosition();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setTabLength(lengthRequest);
}
}
}
public void updateTabPosition(){
@ -308,6 +350,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
updateTabPosition();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setTabOffset(offsetRequest);
}
}
}
public AxialMethod getTabOffsetMethod() {
@ -323,6 +371,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
this.tabOffset = this.tabOffsetMethod.getAsOffset(tabPosition, tabLength, length);
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setTabOffsetMethod(newPositionMethod);
}
}
}
/**
@ -974,6 +1028,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setAngleOffset(angleRadians);
}
}
}
@Override
@ -1003,6 +1063,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
mutex.verify();
this.angleMethod = newAngleMethod;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setAngleMethod(newAngleMethod);
}
}
}
@Override
@ -1029,6 +1095,11 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
@Override
public void setInstanceCount(int newCount) {
setFinCount(newCount);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setInstanceCount(newCount);
}
}
}
@Override
@ -1085,6 +1156,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
filletMaterial = mat;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setFilletMaterial(mat);
}
}
}
public double getFilletRadius() {
@ -1097,6 +1174,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona
filletRadius = r;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FinSet) {
((FinSet) listener).setFilletRadius(r);
}
}
}
/**

View File

@ -153,6 +153,12 @@ public class FreeformFinSet extends FinSet {
*/
public void setPoints(Coordinate[] newPoints) {
setPoints(new ArrayList<>(Arrays.asList(newPoints)));
for (RocketComponent listener : configListeners) {
if (listener instanceof FreeformFinSet) {
((FreeformFinSet) listener).setPoints(newPoints);
}
}
}
/**
@ -192,6 +198,12 @@ public class FreeformFinSet extends FinSet {
}
fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof FreeformFinSet) {
((FreeformFinSet) listener).setPoints(newPoints);
}
}
}
/**

View File

@ -137,6 +137,12 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab
this.cluster = cluster;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
}
for (RocketComponent listener : configListeners) {
if (listener instanceof InnerTube) {
((InnerTube) listener).setClusterConfiguration(cluster);
}
}
}
public BoundingBox getInstanceBoundingBox(){
@ -187,6 +193,12 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab
return;
clusterScale = scale;
fireComponentChangeEvent(new ComponentChangeEvent(this, ComponentChangeEvent.MASS_CHANGE));
for (RocketComponent listener : configListeners) {
if (listener instanceof InnerTube) {
((InnerTube) listener).setClusterScale(scale);
}
}
}
@ -208,6 +220,12 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab
return;
this.clusterRotation = rotation;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof InnerTube) {
((InnerTube) listener).setClusterRotation(rotation);
}
}
}
@ -298,8 +316,11 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab
this.isActingMount = true;
// this is done automatically in the motorSet
//fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof InnerTube) {
((InnerTube) listener).setMotorConfig(newMotorConfig, fcid);
}
}
}
@Override
@ -323,6 +344,12 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab
return;
this.isActingMount = _active;
fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof InnerTube) {
((InnerTube) listener).setMotorMount(_active);
}
}
}
@Override
@ -358,6 +385,12 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab
return;
this.overhang = overhang;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof InnerTube) {
((InnerTube) listener).setMotorOverhang(overhang);
}
}
}
@Override

View File

@ -53,6 +53,12 @@ public class InsideColorComponentHandler {
}
}
component.fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : component.configListeners) {
if (listener instanceof InsideColorComponent) {
((InsideColorComponent) listener).getInsideColorComponentHandler().setInsideAppearance(appearance);
}
}
}
/**
@ -73,6 +79,12 @@ public class InsideColorComponentHandler {
*/
public void setEdgesSameAsInside(boolean newState) {
this.edgesSameAsInside = newState;
for (RocketComponent listener : component.configListeners) {
if (listener instanceof InsideColorComponent) {
((InsideColorComponent) listener).getInsideColorComponentHandler().setEdgesSameAsInside(newState);
}
}
}
/**
@ -92,5 +104,17 @@ public class InsideColorComponentHandler {
*/
public void setSeparateInsideOutside(boolean newState) {
this.separateInsideOutside = newState;
for (RocketComponent listener : component.configListeners) {
if (listener instanceof InsideColorComponent) {
((InsideColorComponent) listener).getInsideColorComponentHandler().setSeparateInsideOutside(newState);
}
}
}
public void copyFrom(InsideColorComponentHandler src) {
this.insideAppearance = src.insideAppearance;
this.separateInsideOutside = src.separateInsideOutside;
this.edgesSameAsInside = src.edgesSameAsInside;
}
}

View File

@ -55,6 +55,12 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B
this.thickness = Math.min(this.thickness, this.radius);
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof LaunchLug) {
((LaunchLug) listener).setOuterRadius(radius);
}
}
}
@Override
@ -65,6 +71,12 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B
@Override
public void setInnerRadius(double innerRadius) {
setOuterRadius(innerRadius + thickness);
for (RocketComponent listener : configListeners) {
if (listener instanceof LaunchLug) {
((LaunchLug) listener).setInnerRadius(innerRadius);
}
}
}
@Override
@ -78,6 +90,12 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B
this.thickness = MathUtil.clamp(thickness, 0, radius);
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof LaunchLug) {
((LaunchLug) listener).setThickness(thickness);
}
}
}
@Override
@ -92,6 +110,12 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B
return;
this.angleOffsetRadians = clamped_rad;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof LaunchLug) {
((LaunchLug) listener).setAngleOffset(newAngleRadians);
}
}
}
public void setLength(double length) {
@ -99,6 +123,12 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B
return;
this.length = length;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof LaunchLug) {
((LaunchLug) listener).setLength(length);
}
}
}
@Override
@ -243,6 +273,12 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B
@Override
public void setInstanceSeparation(final double _separation){
this.instanceSeparation = _separation;
for (RocketComponent listener : configListeners) {
if (listener instanceof LaunchLug) {
((LaunchLug) listener).setInstanceSeparation(_separation);
}
}
}
@Override
@ -250,6 +286,12 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B
if( 0 < newCount ){
this.instanceCount = newCount;
}
for (RocketComponent listener : configListeners) {
if (listener instanceof LaunchLug) {
((LaunchLug) listener).setInstanceCount(newCount);
}
}
}
@Override

View File

@ -64,6 +64,12 @@ public class MassComponent extends MassObject {
return;
this.mass = mass;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof MassComponent) {
((MassComponent) listener).setComponentMass(mass);
}
}
}
@ -80,6 +86,12 @@ public class MassComponent extends MassObject {
if (Double.isNaN(m))
m = 0;
setComponentMass(m);
for (RocketComponent listener : configListeners) {
if (listener instanceof MassComponent) {
((MassComponent) listener).setDensity(density);
}
}
}
@ -107,6 +119,12 @@ public class MassComponent extends MassObject {
checkState();
this.massComponentType = compType;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof MassComponent) {
((MassComponent) listener).setMassComponentType(compType);
}
}
}
@Override

View File

@ -57,6 +57,12 @@ public abstract class MassObject extends InternalComponent {
}
this.length = length;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof MassObject) {
((MassObject) listener).setLength(length);
}
}
}
@ -72,6 +78,12 @@ public abstract class MassObject extends InternalComponent {
}
this.radius = radius;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof MassObject) {
((MassObject) listener).setRadius(radius);
}
}
}
@ -89,6 +101,12 @@ public abstract class MassObject extends InternalComponent {
shiftY = radialPosition * Math.cos(radialDirection);
shiftZ = radialPosition * Math.sin(radialDirection);
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof MassObject) {
((MassObject) listener).setRadialPosition(radialPosition);
}
}
}
public final double getRadialDirection() {
@ -104,6 +122,12 @@ public abstract class MassObject extends InternalComponent {
shiftY = radialPosition * Math.cos(radialDirection);
shiftZ = radialPosition * Math.sin(radialDirection);
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof MassObject) {
((MassObject) listener).setRadialDirection(radialDirection);
}
}
}

View File

@ -38,6 +38,12 @@ public class Parachute extends RecoveryDevice {
this.diameter = d;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Parachute) {
((Parachute) listener).setDiameter(d);
}
}
}
@ -56,6 +62,12 @@ public class Parachute extends RecoveryDevice {
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
else
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Parachute) {
((Parachute) listener).setLineMaterial(mat);
}
}
}
@ -69,6 +81,12 @@ public class Parachute extends RecoveryDevice {
this.lineCount = n;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Parachute) {
((Parachute) listener).setLineCount(n);
}
}
}
public final double getLineLength() {
@ -83,6 +101,12 @@ public class Parachute extends RecoveryDevice {
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
else
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Parachute) {
((Parachute) listener).setLineLength(length);
}
}
}
@ -102,6 +126,12 @@ public class Parachute extends RecoveryDevice {
diameter = MathUtil.safeSqrt(area / Math.PI) * 2;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Parachute) {
((Parachute) listener).setArea(area);
}
}
}
@Override

View File

@ -126,6 +126,12 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
this.instanceCount = newCount;
this.angleSeparation = Math.PI * 2 / this.instanceCount;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ParallelStage) {
((ParallelStage) listener).setInstanceCount(newCount);
}
}
}
@Override
@ -182,11 +188,23 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
super.setAxialMethod(_newPosition);
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ParallelStage) {
((ParallelStage) listener).setAxialMethod(_newPosition);
}
}
}
@Override
public void setRadiusOffset(final double radius_m) {
setRadius( radiusMethod, radius_m );
setRadius( radiusMethod, radius_m );
for (RocketComponent listener : configListeners) {
if (listener instanceof ParallelStage) {
((ParallelStage) listener).setRadiusOffset(radius_m);
}
}
}
@Override
@ -194,10 +212,16 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
mutex.verify();
this.angleOffset_rad = MathUtil.reducePi( angle_rad);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ParallelStage) {
((ParallelStage) listener).setAngleOffset(angle_rad);
}
}
}
@Override
public void setRadius( final RadiusMethod requestedMethod, final double requestedRadius ) {
public void setRadius(RadiusMethod requestedMethod, double requestedRadius ) {
mutex.verify();
RadiusMethod newMethod = requestedMethod;
@ -211,6 +235,12 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
this.radiusOffset_m = newRadius;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ParallelStage) {
((ParallelStage) listener).setRadius(requestedMethod, requestedRadius);
}
}
}
@Override
@ -223,6 +253,12 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
mutex.verify();
this.angleMethod = newAngleMethod;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ParallelStage) {
((ParallelStage) listener).setAngleMethod(newAngleMethod);
}
}
}
@Override
@ -233,6 +269,12 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo
@Override
public void setRadiusMethod(RadiusMethod newRadiusMethod) {
setRadius( newRadiusMethod, this.radiusOffset_m );
for (RocketComponent listener : configListeners) {
if (listener instanceof ParallelStage) {
((ParallelStage) listener).setRadiusMethod(newRadiusMethod);
}
}
}

View File

@ -162,7 +162,7 @@ public class PodSet extends ComponentAssembly implements RingInstanceable {
@Override
public void setInstanceCount( final int newCount ){
public void setInstanceCount(int newCount ){
mutex.verify();
if ( newCount < 1) {
// there must be at least one instance....
@ -172,6 +172,12 @@ public class PodSet extends ComponentAssembly implements RingInstanceable {
this.instanceCount = newCount;
this.angleSeparation = Math.PI * 2 / this.instanceCount;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof PodSet) {
((PodSet) listener).setInstanceCount(newCount);
}
}
}
@Override
@ -192,7 +198,13 @@ public class PodSet extends ComponentAssembly implements RingInstanceable {
public void setAngleOffset(double angle_rad) {
mutex.verify();
this.angleOffset_rad = angle_rad;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof PodSet) {
((PodSet) listener).setAngleOffset(angle_rad);
}
}
}
@Override
@ -213,6 +225,12 @@ public class PodSet extends ComponentAssembly implements RingInstanceable {
this.radiusOffset_m = radius_m;
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof PodSet) {
((PodSet) listener).setRadiusOffset(radius_m);
}
}
}
@Override
@ -221,14 +239,20 @@ public class PodSet extends ComponentAssembly implements RingInstanceable {
}
@Override
public void setRadiusMethod( final RadiusMethod newMethod ) {
public void setRadiusMethod(RadiusMethod newMethod ) {
mutex.verify();
this.radiusMethod = newMethod;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof PodSet) {
((PodSet) listener).setRadiusMethod(newMethod);
}
}
}
@Override
public void setRadius( final RadiusMethod requestMethod, final double requestRadius ) {
public void setRadius(RadiusMethod requestMethod, double requestRadius ) {
mutex.verify();
RadiusMethod newMethod = requestMethod;
@ -241,6 +265,12 @@ public class PodSet extends ComponentAssembly implements RingInstanceable {
this.radiusMethod = newMethod;
this.radiusOffset_m = newRadius;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof PodSet) {
((PodSet) listener).setRadius(requestMethod, requestRadius);
}
}
}
}

View File

@ -63,6 +63,12 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RadiusRingComponent) {
((RadiusRingComponent) listener).setOuterRadius(r);
}
}
}
@ -85,6 +91,12 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RadiusRingComponent) {
((RadiusRingComponent) listener).setInnerRadius(r);
}
}
}
@ -98,6 +110,12 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi
thickness = MathUtil.clamp(thickness, 0, outer);
setInnerRadius(outer - thickness);
for (RocketComponent listener : configListeners) {
if (listener instanceof RadiusRingComponent) {
((RadiusRingComponent) listener).setThickness(thickness);
}
}
}
@ -109,6 +127,12 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi
@Override
public void setInstanceSeparation(final double _separation){
this.instanceSeparation = _separation;
for (RocketComponent listener : configListeners) {
if (listener instanceof RadiusRingComponent) {
((RadiusRingComponent) listener).setInstanceSeparation(_separation);
}
}
}
@Override
@ -116,6 +140,12 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi
if( 0 < newCount ){
this.instanceCount = newCount;
}
for (RocketComponent listener : configListeners) {
if (listener instanceof RadiusRingComponent) {
((RadiusRingComponent) listener).setInstanceCount(newCount);
}
}
}
@Override

View File

@ -151,31 +151,61 @@ public class RailButton extends ExternalComponent implements AnglePositionable,
}
public void setStandoff( final double newStandoff){
public void setStandoff(double newStandoff){
this.standoff_m = Math.max( newStandoff, RailButton.MINIMUM_STANDOFF );
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setStandoff(newStandoff);
}
}
}
public void setInnerDiameter( final double newID ){
public void setInnerDiameter(double newID ){
this.innerDiameter_m = newID;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setInnerDiameter(newID);
}
}
}
public void setOuterDiameter( final double newOD ){
public void setOuterDiameter(double newOD ){
this.outerDiameter_m = newOD;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setOuterDiameter(newOD);
}
}
}
public void setTotalHeight( final double newHeight ) {
public void setTotalHeight(double newHeight ) {
this.totalHeight_m = newHeight;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setTotalHeight(newHeight);
}
}
}
public void setThickness( final double newThickness ) {
public void setThickness(double newThickness ) {
this.flangeHeight_m = newThickness;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setThickness(newThickness);
}
}
}
@Override
@ -201,13 +231,19 @@ public class RailButton extends ExternalComponent implements AnglePositionable,
@Override
public void setAngleOffset(final double angle_rad){
public void setAngleOffset(double angle_rad){
double clamped_rad = MathUtil.clamp(angle_rad, -Math.PI, Math.PI);
if (MathUtil.equals(this.angle_rad, clamped_rad))
return;
this.angle_rad = clamped_rad;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setAngleOffset(angle_rad);
}
}
}
@ -282,17 +318,29 @@ public class RailButton extends ExternalComponent implements AnglePositionable,
}
@Override
public void setInstanceSeparation(final double _separation){
public void setInstanceSeparation(double _separation){
this.instanceSeparation = _separation;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setInstanceSeparation(_separation);
}
}
}
@Override
public void setInstanceCount( final int newCount ){
public void setInstanceCount(int newCount ){
if( 0 < newCount ){
this.instanceCount = newCount;
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RailButton) {
((RailButton) listener).setInstanceCount(newCount);
}
}
}
@Override

View File

@ -54,6 +54,12 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu
this.cd = cd;
this.cdAutomatic = false;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RecoveryDevice) {
((RecoveryDevice) listener).setCD(cd);
}
}
}
@ -66,6 +72,12 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu
return;
this.cdAutomatic = auto;
fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RecoveryDevice) {
((RecoveryDevice) listener).setCDAutomatic(auto);
}
}
}
@ -83,6 +95,12 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu
this.material = (Material.Surface) mat;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RecoveryDevice) {
((RecoveryDevice) listener).setMaterial(mat);
}
}
}
public FlightConfigurableParameterSet<DeploymentConfiguration> getDeploymentConfigurations() {

View File

@ -58,6 +58,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo
return;
outerRadiusAutomatic = auto;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RingComponent) {
((RingComponent) listener).setOuterRadiusAutomatic(auto);
}
}
}
@ -71,6 +77,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo
return;
innerRadiusAutomatic = auto;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RingComponent) {
((RingComponent) listener).setInnerRadiusAutomatic(auto);
}
}
}
@ -83,6 +95,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo
this.length = l;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RingComponent) {
((RingComponent) listener).setLength(length);
}
}
}
@ -110,6 +128,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo
shiftY = radialPosition * Math.cos(radialDirection);
shiftZ = radialPosition * Math.sin(radialDirection);
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RingComponent) {
((RingComponent) listener).setRadialDirection(dir);
}
}
}
public BoundingBox getInstanceBoundingBox(){
@ -148,6 +172,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo
shiftY = radialPosition * Math.cos(radialDirection);
shiftZ = radialPosition * Math.sin(radialDirection);
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RingComponent) {
((RingComponent) listener).setRadialPosition(pos);
}
}
}
@ -170,6 +200,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo
assert (MathUtil.equals(z, shiftZ));
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof RingComponent) {
((RingComponent) listener).setRadialShift(y, z);
}
}
}
@Override

View File

@ -5,6 +5,7 @@ import java.util.Collection;
import java.util.Deque;
import java.util.EventObject;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
@ -127,6 +128,11 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
*/
private final Invalidator invalidator = new Invalidator(this);
/**
* List of components that will set their properties to the same as the current component
*/
protected final List<RocketComponent> configListeners = new LinkedList<>();
/**
* This is for determining the order in which the component should be drawn in the 2D views, both
@ -458,6 +464,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
}
// CHECK - should this be a TEXTURE_CHANGE and not NONFUNCTIONAL_CHANGE?
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setAppearance(appearance);
}
}
/**
@ -480,6 +490,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
checkState();
this.color = c;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setColor(c);
}
}
@ -494,6 +508,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
checkState();
this.lineStyle = style;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setLineStyle(style);
}
}
@ -523,6 +541,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
overrideMass = Math.max(m, 0);
if (massOverridden)
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setOverrideMass(m);
}
}
/**
@ -548,6 +570,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
checkState();
massOverridden = o;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setMassOverridden(o);
}
}
@ -588,6 +614,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
else
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setOverrideCGX(x);
}
}
/**
@ -612,6 +642,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
checkState();
cgOverridden = o;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setCGOverridden(o);
}
}
@ -639,6 +673,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
else
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setOverrideCD(x);
}
}
@ -666,6 +704,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
checkState();
cdOverridden = o;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setCDOverridden(o);
}
}
@ -699,6 +741,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
checkState();
overrideSubcomponents = override;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setOverrideSubcomponents(override);
}
}
/**
@ -747,6 +793,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
else
this.name = name;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setName(name);
}
}
@ -775,6 +825,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
else
this.comment = comment;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setComment(comment);
}
}
@ -845,6 +899,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
rocket.thaw();
}
}
for (RocketComponent listener : configListeners) {
listener.loadPreset(preset);
}
}
@ -876,6 +934,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
return;
presetComponent = null;
fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
for (RocketComponent listener : configListeners) {
listener.clearPreset();
}
}
@ -951,6 +1013,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
// // this doesn't cause any physical change-- just how it's described.
// fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
listener.setAxialMethod(newAxialMethod);
}
}
/**
@ -1784,6 +1850,28 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
public void fireComponentChangeEvent(int type) {
fireComponentChangeEvent(new ComponentChangeEvent(this, type));
}
/**
* Add a new config listener that will undergo the same configuration changes as this.component. Listener must be
* of the same class as this.component.
* @param listener new config listener
* @return true if listener was successfully added, false if not
*/
public boolean addConfigListener(RocketComponent listener) {
if (listener == null || !this.getClass().equals(listener.getClass())) {
return false;
}
configListeners.add(listener);
return true;
}
public void removeConfigListener(RocketComponent listener) {
configListeners.remove(listener);
}
public void clearConfigListeners() {
configListeners.clear();
}
/**

View File

@ -32,6 +32,12 @@ public class ShockCord extends MassObject {
return;
this.material = m;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ShockCord) {
((ShockCord) listener).setMaterial(m);
}
}
}
@ -45,6 +51,12 @@ public class ShockCord extends MassObject {
return;
this.cordLength = length;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ShockCord) {
((ShockCord) listener).setCordLength(length);
}
}
}

View File

@ -42,6 +42,12 @@ public class Sleeve extends RingComponent {
if (thickness > r)
thickness = r;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Sleeve) {
((Sleeve) listener).setOuterRadius(r);
}
}
}
@ -67,6 +73,12 @@ public class Sleeve extends RingComponent {
return;
innerRadius = r;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Sleeve) {
((Sleeve) listener).setInnerRadius(r);
}
}
}
@Override
@ -81,6 +93,12 @@ public class Sleeve extends RingComponent {
return;
thickness = t;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Sleeve) {
((Sleeve) listener).setThickness(t);
}
}
}

View File

@ -36,6 +36,12 @@ public class Streamer extends RecoveryDevice {
this.stripLength = stripLength;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Streamer) {
((Streamer) listener).setStripLength(stripLength);
}
}
}
public double getStripWidth() {
@ -49,11 +55,23 @@ public class Streamer extends RecoveryDevice {
this.length = stripWidth;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Streamer) {
((Streamer) listener).setStripWidth(stripWidth);
}
}
}
@Override
public void setLength(double length) {
setStripWidth(length);
for (RocketComponent listener : configListeners) {
if (listener instanceof Streamer) {
((Streamer) listener).setStripWidth(length);
}
}
}
@ -72,6 +90,12 @@ public class Streamer extends RecoveryDevice {
stripWidth = MathUtil.safeSqrt(area / ratio);
stripLength = ratio * stripWidth;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Streamer) {
((Streamer) listener).setAspectRatio(ratio);
}
}
}
@ -88,6 +112,12 @@ public class Streamer extends RecoveryDevice {
stripWidth = MathUtil.safeSqrt(area / ratio);
stripLength = ratio * stripWidth;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Streamer) {
((Streamer) listener).setArea(area);
}
}
}

View File

@ -51,5 +51,11 @@ public abstract class StructuralComponent extends InternalComponent {
this.material = mat;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof StructuralComponent) {
((StructuralComponent) listener).setMaterial(mat);
}
}
}
}

View File

@ -118,6 +118,12 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou
filled = false;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
clearPreset();
for (RocketComponent listener : configListeners) {
if (listener instanceof SymmetricComponent) {
((SymmetricComponent) listener).setThickness(thickness);
}
}
}
@ -144,6 +150,12 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou
this.filled = filled;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
clearPreset();
for (RocketComponent listener : configListeners) {
if (listener instanceof SymmetricComponent) {
((SymmetricComponent) listener).setFilled(filled);
}
}
}

View File

@ -65,6 +65,12 @@ public abstract class ThicknessRingComponent extends RingComponent {
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ThicknessRingComponent) {
((ThicknessRingComponent) listener).setOuterRadius(r);
}
}
}
@ -86,6 +92,12 @@ public abstract class ThicknessRingComponent extends RingComponent {
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof ThicknessRingComponent) {
((ThicknessRingComponent) listener).setThickness(thickness);
}
}
}
@ -97,6 +109,12 @@ public abstract class ThicknessRingComponent extends RingComponent {
public void setInnerRadius(double r) {
r = Math.max(r,0);
setThickness(getOuterRadius() - r);
for (RocketComponent listener : configListeners) {
if (listener instanceof ThicknessRingComponent) {
((ThicknessRingComponent) listener).setInnerRadius(r);
}
}
}

View File

@ -114,6 +114,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setForeRadius(radius);
}
}
}
@Override
@ -129,6 +135,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setForeRadiusAutomatic(auto);
}
}
}
@ -170,6 +182,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setAftRadius(radius);
}
}
}
@Override
@ -185,6 +203,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setAftRadiusAutomatic(auto);
}
}
}
@ -233,6 +257,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
this.clipped = type.isClippable();
this.shapeParameter = type.defaultParameter();
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setType(type);
}
}
}
public double getShapeParameter() {
@ -244,6 +274,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
this.shapeParameter = MathUtil.clamp(n, type.minParameter(), type.maxParameter());
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setShapeParameter(n);
}
}
}
public boolean isClipped() {
@ -257,6 +293,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
clipped = c;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setClipped(c);
}
}
}
public boolean isClippedEnabled() {
@ -284,6 +326,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
this.foreShoulderRadius = foreShoulderRadius;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setForeShoulderRadius(foreShoulderRadius);
}
}
}
public double getForeShoulderThickness() {
@ -295,6 +343,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
this.foreShoulderThickness = foreShoulderThickness;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setForeShoulderThickness(foreShoulderThickness);
}
}
}
public double getForeShoulderLength() {
@ -306,6 +360,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
this.foreShoulderLength = foreShoulderLength;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setForeShoulderLength(foreShoulderLength);
}
}
}
public boolean isForeShoulderCapped() {
@ -317,6 +377,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
this.foreShoulderCapped = capped;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setForeShoulderCapped(capped);
}
}
}
@ -332,6 +398,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
this.aftShoulderRadius = aftShoulderRadius;
clearPreset();
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setAftShoulderRadius(aftShoulderRadius);
}
}
}
public double getAftShoulderThickness() {
@ -343,6 +415,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
this.aftShoulderThickness = aftShoulderThickness;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setAftShoulderThickness(aftShoulderThickness);
}
}
}
public double getAftShoulderLength() {
@ -354,6 +432,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
this.aftShoulderLength = aftShoulderLength;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setAftShoulderLength(aftShoulderLength);
}
}
}
public boolean isAftShoulderCapped() {
@ -365,6 +449,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone
return;
this.aftShoulderCapped = capped;
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof Transition) {
((Transition) listener).setAftShoulderCapped(capped);
}
}
}

View File

@ -67,6 +67,12 @@ public class TrapezoidFinSet extends FinSet {
this.thickness = thickness;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TrapezoidFinSet) {
((TrapezoidFinSet) listener).setFinShape(rootChord, tipChord, sweep, height, thickness);
}
}
}
public double getRootChord() {
@ -80,6 +86,12 @@ public class TrapezoidFinSet extends FinSet {
updateTabPosition();
fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TrapezoidFinSet) {
((TrapezoidFinSet) listener).setRootChord(r);
}
}
}
public double getTipChord() {
@ -91,6 +103,12 @@ public class TrapezoidFinSet extends FinSet {
return;
tipChord = Math.max(r, 0);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TrapezoidFinSet) {
((TrapezoidFinSet) listener).setTipChord(r);
}
}
}
/**
@ -108,6 +126,12 @@ public class TrapezoidFinSet extends FinSet {
return;
sweep = r;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TrapezoidFinSet) {
((TrapezoidFinSet) listener).setSweep(r);
}
}
}
/**
@ -138,6 +162,12 @@ public class TrapezoidFinSet extends FinSet {
if (Double.isNaN(mySweep) || Double.isInfinite(mySweep))
return;
setSweep(mySweep);
for (RocketComponent listener : configListeners) {
if (listener instanceof TrapezoidFinSet) {
((TrapezoidFinSet) listener).setSweepAngle(r);
}
}
}
public double getHeight() {
@ -149,6 +179,12 @@ public class TrapezoidFinSet extends FinSet {
return;
height = Math.max(r, 0);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TrapezoidFinSet) {
((TrapezoidFinSet) listener).setHeight(r);
}
}
}

View File

@ -65,6 +65,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
return;
this.length = length;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setLength(length);
}
}
}
@ -126,6 +132,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
this.thickness = this.outerRadius;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
clearPreset();
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setOuterRadius(radius);
}
}
}
/**
@ -138,6 +150,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
autoRadius = auto;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
clearPreset();
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setOuterRadiusAutomatic(auto);
}
}
}
public double getInnerRadius() {
@ -146,6 +164,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
public void setInnerRadius(double r) {
setThickness(getOuterRadius() - r);
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setInnerRadius(r);
}
}
}
/**
@ -166,6 +190,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
this.thickness = MathUtil.clamp(thickness, 0, getOuterRadius());
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
clearPreset();
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setThickness(thickness);
}
}
}
@ -196,6 +226,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
fins = n;
finRotation = Transformation.rotate_x(2 * Math.PI / fins);
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setFinCount(n);
}
}
}
/**
@ -216,6 +252,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
*/
public void setBaseRotation(double r) {
setAngleOffset(r);
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setBaseRotation(r);
}
}
}
public Transformation getBaseRotationTransformation() {
@ -356,6 +398,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
@Override
public void setInstanceCount(int newCount) {
setFinCount(newCount);
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setInstanceCount(newCount);
}
}
}
@Override
@ -389,6 +437,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
}
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setAngleOffset(angleRadians);
}
}
}
@Override
@ -406,6 +460,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable,
mutex.verify();
this.angleMethod = newAngleMethod;
fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
for (RocketComponent listener : configListeners) {
if (listener instanceof TubeFinSet) {
((TubeFinSet) listener).setAngleMethod(newAngleMethod);
}
}
}
@Override

View File

@ -213,6 +213,9 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis
public static void hideDialog() {
if (dialog != null) {
dialog.setVisible(false);
if (dialog.component != null) {
dialog.component.clearConfigListeners();
}
}
}

View File

@ -6,6 +6,7 @@ import java.awt.Container;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;

View File

@ -786,16 +786,40 @@ public class RocketActions {
@Override
public void actionPerformed(ActionEvent e) {
RocketComponent c = selectionModel.getSelectedComponent();
if (c == null)
List<RocketComponent> components = selectionModel.getSelectedComponents();
if (!checkAllClassesEqual(components))
return;
ComponentConfigDialog.showDialog(parentFrame, document, c);
for (int i = 1; i < components.size(); i++) {
components.get(0).addConfigListener(components.get(i));
}
ComponentConfigDialog.showDialog(parentFrame, document, components.get(0));
}
@Override
public void clipboardChanged() {
this.setEnabled(selectionModel.getSelectedComponent() != null);
List<RocketComponent> components = selectionModel.getSelectedComponents();
this.setEnabled(checkAllClassesEqual(components));
}
/**
* Checks whether all components in the list have the same class
* @param components list to check
* @return true if all components are of the same class, false if not
*/
private boolean checkAllClassesEqual(List<RocketComponent> components) {
if (components == null || components.size() == 0) {
return false;
}
Class<? extends RocketComponent> myClass = components.get(0).getClass();
for (int i = 1; i < components.size(); i++) {
if (!components.get(i).getClass().equals(myClass)) {
return false;
}
}
return true;
}
}