Fix fin set tab length/offset scaling
This commit is contained in:
		
							parent
							
								
									31fd57131e
								
							
						
					
					
						commit
						fdf130b982
					
				@ -311,6 +311,10 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
	 * 
 | 
			
		||||
	 */
 | 
			
		||||
	public void setTabHeight(final double newTabHeight) {
 | 
			
		||||
		setTabHeight(newTabHeight, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setTabHeight(double newTabHeight, boolean validateTabHeight) {
 | 
			
		||||
		for (RocketComponent listener : configListeners) {
 | 
			
		||||
			if (listener instanceof FinSet) {
 | 
			
		||||
				((FinSet) listener).setTabHeight(newTabHeight);
 | 
			
		||||
@ -320,10 +324,13 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
		if (MathUtil.equals(this.tabHeight, MathUtil.max(newTabHeight, 0))){
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		tabHeight = newTabHeight;
 | 
			
		||||
		double maxTabHeight = getMaxTabHeight();
 | 
			
		||||
		this.tabHeight = Math.min(this.tabHeight,  maxTabHeight);
 | 
			
		||||
		if (validateTabHeight) {
 | 
			
		||||
			double maxTabHeight = getMaxTabHeight();
 | 
			
		||||
			this.tabHeight = Math.min(this.tabHeight, maxTabHeight);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
@ -336,6 +343,10 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
	 * set tab length
 | 
			
		||||
	 */
 | 
			
		||||
	public void setTabLength(final double lengthRequest) {
 | 
			
		||||
		setTabLength(lengthRequest, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setTabLength(final double lengthRequest, boolean updateTabPosition) {
 | 
			
		||||
		for (RocketComponent listener : configListeners) {
 | 
			
		||||
			if (listener instanceof FinSet) {
 | 
			
		||||
				((FinSet) listener).setTabLength(lengthRequest);
 | 
			
		||||
@ -345,15 +356,17 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
		if (MathUtil.equals(tabLength, MathUtil.max(lengthRequest, 0))) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		tabLength = lengthRequest;
 | 
			
		||||
		
 | 
			
		||||
		updateTabPosition();
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		if (updateTabPosition) {
 | 
			
		||||
			updateTabPosition();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void updateTabPosition(){
 | 
			
		||||
	public void updateTabPosition() {
 | 
			
		||||
		this.tabPosition = this.tabOffsetMethod.getAsPosition(tabOffset, tabLength, length);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
@ -362,7 +375,7 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param offsetRequest new requested tab offset
 | 
			
		||||
	 */
 | 
			
		||||
	public void setTabOffset( final double offsetRequest) {
 | 
			
		||||
	public void setTabOffset(final double offsetRequest) {
 | 
			
		||||
		for (RocketComponent listener : configListeners) {
 | 
			
		||||
			if (listener instanceof FinSet) {
 | 
			
		||||
				((FinSet) listener).setTabOffset(offsetRequest);
 | 
			
		||||
@ -374,6 +387,18 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
		
 | 
			
		||||
		fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getTabOffset(AxialMethod method) {
 | 
			
		||||
		return method.getAsOffset(tabPosition, tabLength, length);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getTabOffset() {
 | 
			
		||||
		return getTabOffset(this.tabOffsetMethod);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getTabPosition(AxialMethod method) {
 | 
			
		||||
		return method.getAsPosition(tabOffset, tabLength, length);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public AxialMethod getTabOffsetMethod() {
 | 
			
		||||
		return tabOffsetMethod;
 | 
			
		||||
@ -403,18 +428,6 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
		return tabPosition;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getTabOffset(AxialMethod method){
 | 
			
		||||
		return method.getAsOffset(tabPosition, tabLength, length);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getTabOffset(){
 | 
			
		||||
		return getTabOffset(this.tabOffsetMethod);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public double getTabPosition(AxialMethod method) {
 | 
			
		||||
		return method.getAsPosition(tabOffset, tabLength, length);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Return the tab trailing edge position *from the front of the fin*.
 | 
			
		||||
	 */
 | 
			
		||||
@ -435,16 +448,12 @@ public abstract class FinSet extends ExternalComponent
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	public void validateFinTabLength() {
 | 
			
		||||
		//System.err.println(String.format("    >> Fin Tab Length: %.6f @ %.6f", tabLength, tabOffset));
 | 
			
		||||
		
 | 
			
		||||
		final double xTabBack = getTabTrailingEdge();
 | 
			
		||||
		if (this.length < xTabBack) {
 | 
			
		||||
			this.tabLength -= (xTabBack - this.length);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		tabLength = Math.max(0, tabLength);
 | 
			
		||||
		
 | 
			
		||||
		//System.err.println(String.format("    << Fin Tab Length: %.6f @ %.6f", tabLength, tabOffset));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
 | 
			
		||||
@ -242,13 +242,17 @@ public class FreeformFinSet extends FinSet {
 | 
			
		||||
	/** maintained just for backwards compatibility:
 | 
			
		||||
	 */
 | 
			
		||||
	public void setPoints(Coordinate[] newPoints) {
 | 
			
		||||
		setPoints(newPoints, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setPoints(Coordinate[] newPoints, boolean validateFinTab) {
 | 
			
		||||
		for (RocketComponent listener : configListeners) {
 | 
			
		||||
			if (listener instanceof FreeformFinSet) {
 | 
			
		||||
				((FreeformFinSet) listener).setPoints(newPoints);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		setPoints(new ArrayList<>(Arrays.asList(newPoints)));
 | 
			
		||||
		setPoints(new ArrayList<>(Arrays.asList(newPoints)), validateFinTab);
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
@ -256,7 +260,11 @@ public class FreeformFinSet extends FinSet {
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param newPoints New points to set as the exposed edges of the fin
 | 
			
		||||
	 */
 | 
			
		||||
	public void setPoints( ArrayList<Coordinate> newPoints) {
 | 
			
		||||
	public void setPoints(ArrayList<Coordinate> newPoints) {
 | 
			
		||||
		setPoints(newPoints, true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setPoints( ArrayList<Coordinate> newPoints, boolean validateFinTab) {
 | 
			
		||||
		for (RocketComponent listener : configListeners) {
 | 
			
		||||
			if (listener instanceof FreeformFinSet) {
 | 
			
		||||
				((FreeformFinSet) listener).setPoints(newPoints);
 | 
			
		||||
@ -264,16 +272,16 @@ public class FreeformFinSet extends FinSet {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		final Coordinate delta = newPoints.get(0).multiply(-1);
 | 
			
		||||
		if( IGNORE_SMALLER_THAN < delta.length2()){
 | 
			
		||||
			newPoints = translatePoints( newPoints, delta);
 | 
			
		||||
		if (IGNORE_SMALLER_THAN < delta.length2()) {
 | 
			
		||||
			newPoints = translatePoints(newPoints, delta);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for ( int i =0; i < newPoints.size(); ++i ) {
 | 
			
		||||
		for (int i = 0; i < newPoints.size(); ++i) {
 | 
			
		||||
			final Coordinate p = newPoints.get(i);
 | 
			
		||||
			if( p.x > SNAP_LARGER_THAN){
 | 
			
		||||
			if (p.x > SNAP_LARGER_THAN) {
 | 
			
		||||
				newPoints.set(i, p.setX(SNAP_LARGER_THAN));
 | 
			
		||||
			}
 | 
			
		||||
			if( p.y > SNAP_LARGER_THAN){
 | 
			
		||||
			if (p.y > SNAP_LARGER_THAN) {
 | 
			
		||||
				newPoints.set(i, p.setY(SNAP_LARGER_THAN));
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -284,9 +292,9 @@ public class FreeformFinSet extends FinSet {
 | 
			
		||||
 | 
			
		||||
		this.points = newPoints;
 | 
			
		||||
 | 
			
		||||
		update();
 | 
			
		||||
		update(validateFinTab);
 | 
			
		||||
 | 
			
		||||
		if( intersects()){
 | 
			
		||||
		if (intersects()) {
 | 
			
		||||
			// on error, reset to the old points
 | 
			
		||||
			this.points = pointsCopy;
 | 
			
		||||
			this.length = lengthCopy;
 | 
			
		||||
@ -432,21 +440,26 @@ public class FreeformFinSet extends FinSet {
 | 
			
		||||
 | 
			
		||||
	@Override
 | 
			
		||||
	public void update() {
 | 
			
		||||
		update(true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void update(boolean validateFinTab) {
 | 
			
		||||
		final double oldLength = this.length;
 | 
			
		||||
		this.length = points.get(points.size() -1).x - points.get(0).x;
 | 
			
		||||
		this.setAxialOffset(this.axialMethod, this.axialOffset);
 | 
			
		||||
 | 
			
		||||
		if(null != this.getParent()) {
 | 
			
		||||
		if (this.getParent() != null) {
 | 
			
		||||
			clampFirstPoint();
 | 
			
		||||
 | 
			
		||||
			for(int i=1; i < points.size()-1; i++) {
 | 
			
		||||
			for (int i=1; i < points.size()-1; i++) {
 | 
			
		||||
				clampInteriorPoint(i);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
			clampLastPoint();
 | 
			
		||||
 | 
			
		||||
			if (oldLength != this.length)
 | 
			
		||||
			if (oldLength != this.length && validateFinTab) {
 | 
			
		||||
				validateFinTabLength();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,7 @@ import info.openrocket.core.rocketcomponent.SymmetricComponent;
 | 
			
		||||
import info.openrocket.core.rocketcomponent.ThicknessRingComponent;
 | 
			
		||||
import info.openrocket.core.rocketcomponent.Transition;
 | 
			
		||||
import info.openrocket.core.rocketcomponent.TrapezoidFinSet;
 | 
			
		||||
import info.openrocket.core.rocketcomponent.position.AxialMethod;
 | 
			
		||||
import org.apache.commons.lang3.ClassUtils;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
@ -139,10 +140,9 @@ public class ScaleDialog extends JDialog {
 | 
			
		||||
		addScaler(LaunchLug.class, "Length", SCALERS_NO_OFFSET);
 | 
			
		||||
		
 | 
			
		||||
		// FinSet
 | 
			
		||||
		addScaler(FinSet.class, "Thickness", SCALERS_NO_OFFSET);
 | 
			
		||||
		addScaler(FinSet.class, "TabHeight", SCALERS_NO_OFFSET);
 | 
			
		||||
		addScaler(FinSet.class, "TabLength", SCALERS_NO_OFFSET);
 | 
			
		||||
		addScaler(FinSet.class, "TabOffset", SCALERS_NO_OFFSET);
 | 
			
		||||
		list = new ArrayList<>(1);
 | 
			
		||||
		list.add(new FinSetScaler());
 | 
			
		||||
		SCALERS_NO_OFFSET.put(FinSet.class, list);
 | 
			
		||||
		
 | 
			
		||||
		// TrapezoidFinSet
 | 
			
		||||
		addScaler(TrapezoidFinSet.class, "Sweep", SCALERS_NO_OFFSET);
 | 
			
		||||
@ -806,9 +806,31 @@ public class ScaleDialog extends JDialog {
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static class FinSetScaler implements Scaler {
 | 
			
		||||
		@Override
 | 
			
		||||
		public void scale(RocketComponent component, double multiplier, boolean scaleMass) {
 | 
			
		||||
			final Map<Class<? extends RocketComponent>, List<Scaler>> scalers = new HashMap<>();
 | 
			
		||||
			FinSet finset = (FinSet) component;
 | 
			
		||||
			AxialMethod originalTabOffsetMethod = finset.getTabOffsetMethod();
 | 
			
		||||
			finset.setTabOffsetMethod(AxialMethod.ABSOLUTE);
 | 
			
		||||
 | 
			
		||||
			double tabOffset = finset.getTabOffset();
 | 
			
		||||
			tabOffset = tabOffset * multiplier;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
			addScaler(FinSet.class, "Thickness", scalers);
 | 
			
		||||
			addScaler(FinSet.class, "TabHeight", scalers);
 | 
			
		||||
			addScaler(FinSet.class, "TabLength", scalers);
 | 
			
		||||
 | 
			
		||||
			performIterativeScaling(scalers, component, multiplier, scaleMass);
 | 
			
		||||
 | 
			
		||||
			finset.setTabOffset(tabOffset);
 | 
			
		||||
			finset.setTabOffsetMethod(originalTabOffsetMethod);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	private static class FreeformFinSetScaler implements Scaler {
 | 
			
		||||
		
 | 
			
		||||
		@Override
 | 
			
		||||
		public void scale(RocketComponent component, double multiplier, boolean scaleMass) {
 | 
			
		||||
			FreeformFinSet finset = (FreeformFinSet) component;
 | 
			
		||||
@ -817,10 +839,8 @@ public class ScaleDialog extends JDialog {
 | 
			
		||||
				points[i] = points[i].multiply(multiplier);
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			finset.setPoints(points);
 | 
			
		||||
			
 | 
			
		||||
			finset.setPoints(points, false);
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private static class RadiusRingComponentScaler implements Scaler {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user