Save OBJ export options in preferences
This commit is contained in:
parent
c38d5f59a6
commit
8e7c6afed3
@ -3,8 +3,8 @@ package net.sf.openrocket.document;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import net.sf.openrocket.file.wavefrontobj.export.OBJExportOptions;
|
|
||||||
import net.sf.openrocket.rocketcomponent.*;
|
import net.sf.openrocket.rocketcomponent.*;
|
||||||
|
import net.sf.openrocket.startup.Preferences;
|
||||||
import net.sf.openrocket.util.StateChangeListener;
|
import net.sf.openrocket.util.StateChangeListener;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -36,6 +36,7 @@ import net.sf.openrocket.util.ArrayList;
|
|||||||
*/
|
*/
|
||||||
public class OpenRocketDocument implements ComponentChangeListener, StateChangeListener {
|
public class OpenRocketDocument implements ComponentChangeListener, StateChangeListener {
|
||||||
private static final Logger log = LoggerFactory.getLogger(OpenRocketDocument.class);
|
private static final Logger log = LoggerFactory.getLogger(OpenRocketDocument.class);
|
||||||
|
private static final Preferences prefs = Application.getPreferences();
|
||||||
private final List<String> file_extensions = Arrays.asList("ork", "ork.gz", "rkt", "rkt.gz"); // Possible extensions of an OpenRocket document
|
private final List<String> file_extensions = Arrays.asList("ork", "ork.gz", "rkt", "rkt.gz"); // Possible extensions of an OpenRocket document
|
||||||
/**
|
/**
|
||||||
* The minimum number of undo levels that are stored.
|
* The minimum number of undo levels that are stored.
|
||||||
@ -92,8 +93,7 @@ public class OpenRocketDocument implements ComponentChangeListener, StateChangeL
|
|||||||
private int savedID = -1;
|
private int savedID = -1;
|
||||||
|
|
||||||
private final StorageOptions storageOptions = new StorageOptions();
|
private final StorageOptions storageOptions = new StorageOptions();
|
||||||
private final OBJExportOptions objOptions;
|
|
||||||
|
|
||||||
private final DecalRegistry decalRegistry = new DecalRegistry();
|
private final DecalRegistry decalRegistry = new DecalRegistry();
|
||||||
|
|
||||||
private final List<DocumentChangeListener> listeners = new ArrayList<DocumentChangeListener>();
|
private final List<DocumentChangeListener> listeners = new ArrayList<DocumentChangeListener>();
|
||||||
@ -105,7 +105,6 @@ public class OpenRocketDocument implements ComponentChangeListener, StateChangeL
|
|||||||
*/
|
*/
|
||||||
OpenRocketDocument(Rocket rocket) {
|
OpenRocketDocument(Rocket rocket) {
|
||||||
this.rocket = rocket;
|
this.rocket = rocket;
|
||||||
this.objOptions = new OBJExportOptions(rocket);
|
|
||||||
rocket.enableEvents();
|
rocket.enableEvents();
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
@ -242,19 +241,15 @@ public class OpenRocketDocument implements ComponentChangeListener, StateChangeL
|
|||||||
else
|
else
|
||||||
this.savedID = rocket.getModID() + modID;
|
this.savedID = rocket.getModID() + modID;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the default storage options for this document.
|
* Retrieve the default storage options for this document.
|
||||||
*
|
*
|
||||||
* @return the storage options.
|
* @return the storage options.
|
||||||
*/
|
*/
|
||||||
public StorageOptions getDefaultStorageOptions() {
|
public StorageOptions getDefaultStorageOptions() {
|
||||||
return storageOptions;
|
return storageOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OBJExportOptions getDefaultOBJOptions() {
|
|
||||||
return objOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -139,17 +139,6 @@ public class CoordTransform {
|
|||||||
return new DefaultFloatTuple((float) xRotTrans, (float) yRotTrans, (float) zRotTrans);
|
return new DefaultFloatTuple((float) xRotTrans, (float) yRotTrans, (float) zRotTrans);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the equivalent axis for the x-axis in the OpenRocket coordinate system (axial axis).
|
|
||||||
* ! The direction is relative to the OpenRocket x-axis ! For instance, if the OBJ coordinate system uses the z-axis
|
|
||||||
* that runs in the opposite direction of the OR x-axis (z-axis runs from the bottom of the rocket to the tip), you
|
|
||||||
* must return Axis.Z_MIN.
|
|
||||||
* @return the equivalent axis for the x-axis in the OpenRocket coordinate system (axial axis)
|
|
||||||
*/
|
|
||||||
public Axis getAxialAxis() {
|
|
||||||
return axialAxis;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the transformed coordinate for the given axis.
|
* Returns the transformed coordinate for the given axis.
|
||||||
* @param axis the OpenRocket axis to transform
|
* @param axis the OpenRocket axis to transform
|
||||||
@ -204,4 +193,39 @@ public class CoordTransform {
|
|||||||
default -> throw new IllegalStateException("Unknown axis");
|
default -> throw new IllegalStateException("Unknown axis");
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Axis getXAxis() {
|
||||||
|
return xAxis;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Axis getYAxis() {
|
||||||
|
return yAxis;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Axis getZAxis() {
|
||||||
|
return zAxis;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the equivalent axis for the x-axis in the OpenRocket coordinate system (axial axis).
|
||||||
|
* ! The direction is relative to the OpenRocket x-axis ! For instance, if the OBJ coordinate system uses the z-axis
|
||||||
|
* that runs in the opposite direction of the OR x-axis (z-axis runs from the bottom of the rocket to the tip), you
|
||||||
|
* must return Axis.Z_MIN.
|
||||||
|
* @return the equivalent axis for the x-axis in the OpenRocket coordinate system (axial axis)
|
||||||
|
*/
|
||||||
|
public Axis getAxialAxis() {
|
||||||
|
return axialAxis;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getOrigXOffs() {
|
||||||
|
return origXOffs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getOrigYOffs() {
|
||||||
|
return origYOffs;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getOrigZOffs() {
|
||||||
|
return origZOffs;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ import de.javagl.obj.Obj;
|
|||||||
import de.javagl.obj.ObjFace;
|
import de.javagl.obj.ObjFace;
|
||||||
import de.javagl.obj.ObjGroup;
|
import de.javagl.obj.ObjGroup;
|
||||||
import net.sf.openrocket.l10n.Translator;
|
import net.sf.openrocket.l10n.Translator;
|
||||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
|
||||||
import net.sf.openrocket.startup.Application;
|
import net.sf.openrocket.startup.Application;
|
||||||
import net.sf.openrocket.util.Coordinate;
|
import net.sf.openrocket.util.Coordinate;
|
||||||
|
|
||||||
@ -24,22 +23,37 @@ public class ObjUtils {
|
|||||||
* Level of detail to use for the export.
|
* Level of detail to use for the export.
|
||||||
*/
|
*/
|
||||||
public enum LevelOfDetail {
|
public enum LevelOfDetail {
|
||||||
LOW_QUALITY(25, trans.get("LevelOfDetail.LOW_QUALITY")),
|
LOW_QUALITY(25, trans.get("LevelOfDetail.LOW_QUALITY"), "LOW"),
|
||||||
NORMAL(60, trans.get("LevelOfDetail.NORMAL")),
|
NORMAL(60, trans.get("LevelOfDetail.NORMAL"), "NORMAL"),
|
||||||
HIGH_QUALITY(100, trans.get("LevelOfDetail.HIGH_QUALITY"));
|
HIGH_QUALITY(100, trans.get("LevelOfDetail.HIGH_QUALITY"), "HIGH");
|
||||||
|
|
||||||
private final int value;
|
private final int value;
|
||||||
private final String label;
|
private final String label;
|
||||||
|
private final String exportLabel;
|
||||||
|
|
||||||
LevelOfDetail(int value, String label) {
|
LevelOfDetail(int value, String label, String exportLabel) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
this.label = label;
|
this.label = label;
|
||||||
|
this.exportLabel = exportLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getValue() {
|
public int getValue() {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getExportLabel() {
|
||||||
|
return exportLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static LevelOfDetail fromExportLabel(String exportLabel) {
|
||||||
|
for (LevelOfDetail lod : LevelOfDetail.values()) {
|
||||||
|
if (lod.getExportLabel().equals(exportLabel)) {
|
||||||
|
return lod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return LevelOfDetail.NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a dynamic estimate of the number of sides (= vertices in a perfect circle) to be used for the given radius.
|
* Get a dynamic estimate of the number of sides (= vertices in a perfect circle) to be used for the given radius.
|
||||||
* @param radius The radius to estimate the number of sides for
|
* @param radius The radius to estimate the number of sides for
|
||||||
|
@ -9,19 +9,17 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import net.sf.openrocket.database.Databases;
|
import net.sf.openrocket.database.Databases;
|
||||||
|
import net.sf.openrocket.file.wavefrontobj.Axis;
|
||||||
|
import net.sf.openrocket.file.wavefrontobj.CoordTransform;
|
||||||
|
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
|
||||||
|
import net.sf.openrocket.file.wavefrontobj.export.OBJExportOptions;
|
||||||
import net.sf.openrocket.material.Material;
|
import net.sf.openrocket.material.Material;
|
||||||
import net.sf.openrocket.models.atmosphere.AtmosphericModel;
|
import net.sf.openrocket.models.atmosphere.AtmosphericModel;
|
||||||
import net.sf.openrocket.models.atmosphere.ExtendedISAModel;
|
import net.sf.openrocket.models.atmosphere.ExtendedISAModel;
|
||||||
import net.sf.openrocket.preset.ComponentPreset;
|
import net.sf.openrocket.preset.ComponentPreset;
|
||||||
import net.sf.openrocket.rocketcomponent.BodyComponent;
|
|
||||||
import net.sf.openrocket.rocketcomponent.FinSet;
|
|
||||||
import net.sf.openrocket.rocketcomponent.InternalComponent;
|
|
||||||
import net.sf.openrocket.rocketcomponent.LaunchLug;
|
|
||||||
import net.sf.openrocket.rocketcomponent.MassObject;
|
import net.sf.openrocket.rocketcomponent.MassObject;
|
||||||
import net.sf.openrocket.rocketcomponent.RailButton;
|
import net.sf.openrocket.rocketcomponent.Rocket;
|
||||||
import net.sf.openrocket.rocketcomponent.RecoveryDevice;
|
|
||||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
import net.sf.openrocket.rocketcomponent.TubeFinSet;
|
|
||||||
import net.sf.openrocket.simulation.RK4SimulationStepper;
|
import net.sf.openrocket.simulation.RK4SimulationStepper;
|
||||||
import net.sf.openrocket.util.BugException;
|
import net.sf.openrocket.util.BugException;
|
||||||
import net.sf.openrocket.util.BuildProperties;
|
import net.sf.openrocket.util.BuildProperties;
|
||||||
@ -120,7 +118,25 @@ public abstract class Preferences implements ChangeSource {
|
|||||||
public static final String GEODETIC_COMPUTATION = "GeodeticComputationStrategy";
|
public static final String GEODETIC_COMPUTATION = "GeodeticComputationStrategy";
|
||||||
|
|
||||||
public static final String UI_THEME = "UITheme";
|
public static final String UI_THEME = "UITheme";
|
||||||
|
|
||||||
|
// OBJ Export options
|
||||||
|
private static final String OBJ_EXPORT_OPTIONS_NODE = "OBJExportOptions";
|
||||||
|
private static final String OBJ_EXPORT_CHILDREN = "ExportChildren";
|
||||||
|
private static final String OBJ_EXPORT_APPEARANCE = "ExportAppearance";
|
||||||
|
private static final String OBJ_EXPORT_AS_SEPARATE_FILES = "ExportAsSeparateFiles";
|
||||||
|
private static final String OBJ_REMOVE_OFFSET = "RemoveOffset";
|
||||||
|
private static final String OBJ_TRIANGULATE = "Triangulate";
|
||||||
|
private static final String OBJ_LOD = "LOD";
|
||||||
|
private static final String OBJ_SCALING = "Scaling";
|
||||||
|
//// Coordinate transformer
|
||||||
|
private static final String OBJ_TRANSFORMER_NODE = "CoordTransform";
|
||||||
|
private static final String OBJ_X_AXIS = "xAxis";
|
||||||
|
private static final String OBJ_Y_AXIS = "yAxis";
|
||||||
|
private static final String OBJ_Z_AXIS = "zAxis";
|
||||||
|
private static final String OBJ_AXIAL_AXIS = "AxialAxis";
|
||||||
|
private static final String OBJ_ORIG_X_OFFS = "OrigXOffs";
|
||||||
|
private static final String OBJ_ORIG_Y_OFFS = "OrigYOffs";
|
||||||
|
private static final String OBJ_ORIG_Z_OFFS = "OrigZOffs";
|
||||||
|
|
||||||
private static final AtmosphericModel ISA_ATMOSPHERIC_MODEL = new ExtendedISAModel();
|
private static final AtmosphericModel ISA_ATMOSPHERIC_MODEL = new ExtendedISAModel();
|
||||||
|
|
||||||
@ -159,6 +175,8 @@ public abstract class Preferences implements ChangeSource {
|
|||||||
|
|
||||||
public abstract java.util.prefs.Preferences getNode(String nodeName);
|
public abstract java.util.prefs.Preferences getNode(String nodeName);
|
||||||
|
|
||||||
|
public abstract java.util.prefs.Preferences getPreferences();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Welcome dialog
|
* Welcome dialog
|
||||||
*/
|
*/
|
||||||
@ -1015,6 +1033,67 @@ public abstract class Preferences implements ChangeSource {
|
|||||||
public void setUITheme(Object theme) {}
|
public void setUITheme(Object theme) {}
|
||||||
|
|
||||||
|
|
||||||
|
public void saveOBJExportOptions(OBJExportOptions options) {
|
||||||
|
// ! Don't forget to update the loadOBJExportOptions method and OBJOptionChooser.storeOptions if you add new options !
|
||||||
|
|
||||||
|
java.util.prefs.Preferences preferences = getPreferences();
|
||||||
|
java.util.prefs.Preferences objExportOptionsNode = preferences.node(OBJ_EXPORT_OPTIONS_NODE);
|
||||||
|
|
||||||
|
objExportOptionsNode.putBoolean(OBJ_EXPORT_CHILDREN, options.isExportChildren());
|
||||||
|
objExportOptionsNode.putBoolean(OBJ_EXPORT_APPEARANCE, options.isExportAppearance());
|
||||||
|
objExportOptionsNode.putBoolean(OBJ_EXPORT_AS_SEPARATE_FILES, options.isExportAsSeparateFiles());
|
||||||
|
objExportOptionsNode.putBoolean(OBJ_REMOVE_OFFSET, options.isRemoveOffset());
|
||||||
|
objExportOptionsNode.putBoolean(OBJ_TRIANGULATE, options.isTriangulate());
|
||||||
|
|
||||||
|
objExportOptionsNode.putFloat(OBJ_SCALING, options.getScaling());
|
||||||
|
|
||||||
|
objExportOptionsNode.put(OBJ_LOD, options.getLOD().getExportLabel());
|
||||||
|
|
||||||
|
// Save CoordTransform
|
||||||
|
java.util.prefs.Preferences coordTransformNode = objExportOptionsNode.node(OBJ_TRANSFORMER_NODE);
|
||||||
|
CoordTransform transform = options.getTransformer();
|
||||||
|
|
||||||
|
coordTransformNode.put(OBJ_X_AXIS, transform.getXAxis().toString());
|
||||||
|
coordTransformNode.put(OBJ_Y_AXIS, transform.getYAxis().toString());
|
||||||
|
coordTransformNode.put(OBJ_Z_AXIS, transform.getZAxis().toString());
|
||||||
|
coordTransformNode.put(OBJ_AXIAL_AXIS, transform.getAxialAxis().toString());
|
||||||
|
coordTransformNode.putDouble(OBJ_ORIG_X_OFFS, transform.getOrigXOffs());
|
||||||
|
coordTransformNode.putDouble(OBJ_ORIG_Y_OFFS, transform.getOrigYOffs());
|
||||||
|
coordTransformNode.putDouble(OBJ_ORIG_Z_OFFS, transform.getOrigZOffs());
|
||||||
|
}
|
||||||
|
|
||||||
|
public OBJExportOptions loadOBJExportOptions(Rocket rocket) {
|
||||||
|
java.util.prefs.Preferences preferences = getPreferences();
|
||||||
|
java.util.prefs.Preferences objExportOptionsNode = preferences.node(OBJ_EXPORT_OPTIONS_NODE);
|
||||||
|
|
||||||
|
OBJExportOptions options = new OBJExportOptions(rocket);
|
||||||
|
options.setExportChildren(objExportOptionsNode.getBoolean(OBJ_EXPORT_CHILDREN, false));
|
||||||
|
options.setExportAppearance(objExportOptionsNode.getBoolean(OBJ_EXPORT_APPEARANCE, false));
|
||||||
|
options.setExportAsSeparateFiles(objExportOptionsNode.getBoolean(OBJ_EXPORT_AS_SEPARATE_FILES, false));
|
||||||
|
options.setRemoveOffset(objExportOptionsNode.getBoolean(OBJ_REMOVE_OFFSET, true));
|
||||||
|
options.setTriangulate(objExportOptionsNode.getBoolean(OBJ_TRIANGULATE, false));
|
||||||
|
|
||||||
|
options.setScaling(objExportOptionsNode.getFloat(OBJ_SCALING, 1));
|
||||||
|
|
||||||
|
options.setLOD(ObjUtils.LevelOfDetail.fromExportLabel(
|
||||||
|
objExportOptionsNode.get(OBJ_LOD, ObjUtils.LevelOfDetail.NORMAL.getExportLabel())));
|
||||||
|
|
||||||
|
// Load CoordTransform
|
||||||
|
java.util.prefs.Preferences coordTransformNode = objExportOptionsNode.node(OBJ_TRANSFORMER_NODE);
|
||||||
|
|
||||||
|
Axis xAxis = Axis.fromString(coordTransformNode.get(OBJ_X_AXIS, Axis.Y.toString()));
|
||||||
|
Axis yAxis = Axis.fromString(coordTransformNode.get(OBJ_Y_AXIS, Axis.Z.toString()));
|
||||||
|
Axis zAxis = Axis.fromString(coordTransformNode.get(OBJ_Z_AXIS, Axis.X_MIN.toString()));
|
||||||
|
Axis axialAxis = Axis.fromString(coordTransformNode.get(OBJ_AXIAL_AXIS, Axis.Z_MIN.toString()));
|
||||||
|
double origXOffs = coordTransformNode.getDouble(OBJ_ORIG_X_OFFS, 0.0);
|
||||||
|
double origYOffs = coordTransformNode.getDouble(OBJ_ORIG_Y_OFFS, 0.0);
|
||||||
|
double origZOffs = coordTransformNode.getDouble(OBJ_ORIG_Z_OFFS, rocket.getLength());
|
||||||
|
|
||||||
|
CoordTransform transform = new CoordTransform(xAxis, yAxis, zAxis, axialAxis, origXOffs, origYOffs, origZOffs);
|
||||||
|
options.setTransformer(transform);
|
||||||
|
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Within a holder class so they will load only when needed.
|
* Within a holder class so they will load only when needed.
|
||||||
|
@ -158,6 +158,11 @@ public class ServicesForTesting extends AbstractModule {
|
|||||||
public java.util.prefs.Preferences getNode(String nodeName) {
|
public java.util.prefs.Preferences getNode(String nodeName) {
|
||||||
return getBaseNode().node(nodeName);
|
return getBaseNode().node(nodeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public java.util.prefs.Preferences getPreferences() {
|
||||||
|
return getBaseNode();
|
||||||
|
}
|
||||||
|
|
||||||
private java.util.prefs.Preferences getBaseNode() {
|
private java.util.prefs.Preferences getBaseNode() {
|
||||||
if (root == null) {
|
if (root == null) {
|
||||||
|
@ -81,7 +81,12 @@ public class MockPreferences extends Preferences {
|
|||||||
public java.util.prefs.Preferences getNode(String nodeName) {
|
public java.util.prefs.Preferences getNode(String nodeName) {
|
||||||
return NODE.node(nodeName);
|
return NODE.node(nodeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public java.util.prefs.Preferences getPreferences() {
|
||||||
|
return NODE;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addUserMaterial(Material m) {
|
public void addUserMaterial(Material m) {
|
||||||
throw new UnsupportedOperationException("Not yet implemented");
|
throw new UnsupportedOperationException("Not yet implemented");
|
||||||
|
@ -28,9 +28,13 @@ public class OBJOptionChooser extends JPanel {
|
|||||||
private final JCheckBox triangulate;
|
private final JCheckBox triangulate;
|
||||||
private final JComboBox<ObjUtils.LevelOfDetail> LOD;
|
private final JComboBox<ObjUtils.LevelOfDetail> LOD;
|
||||||
|
|
||||||
|
private final List<RocketComponent> selectedComponents;
|
||||||
|
|
||||||
public OBJOptionChooser(OBJExportOptions opts, List<RocketComponent> selectedComponents) {
|
public OBJOptionChooser(OBJExportOptions opts, List<RocketComponent> selectedComponents) {
|
||||||
super(new MigLayout());
|
super(new MigLayout());
|
||||||
|
|
||||||
|
this.selectedComponents = selectedComponents;
|
||||||
|
|
||||||
// ------------ Basic options ------------
|
// ------------ Basic options ------------
|
||||||
//// Export children
|
//// Export children
|
||||||
this.exportChildren = new JCheckBox(trans.get("OBJOptionChooser.checkbox.exportChildren"));
|
this.exportChildren = new JCheckBox(trans.get("OBJOptionChooser.checkbox.exportChildren"));
|
||||||
@ -101,17 +105,11 @@ public class OBJOptionChooser extends JPanel {
|
|||||||
});
|
});
|
||||||
this.add(advancedOptionsPanel);
|
this.add(advancedOptionsPanel);
|
||||||
|
|
||||||
loadOptions(opts, selectedComponents);
|
loadOptions(opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadOptions(OBJExportOptions opts, List<RocketComponent> selectedComponents) {
|
public void loadOptions(OBJExportOptions opts) {
|
||||||
boolean onlyComponentAssemblies = true;
|
boolean onlyComponentAssemblies = isOnlyComponentAssembliesSelected(selectedComponents);
|
||||||
for (RocketComponent component : selectedComponents) {
|
|
||||||
if (!(component instanceof ComponentAssembly)) {
|
|
||||||
onlyComponentAssemblies = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (onlyComponentAssemblies) {
|
if (onlyComponentAssemblies) {
|
||||||
exportChildren.setEnabled(false);
|
exportChildren.setEnabled(false);
|
||||||
exportChildren.setSelected(true);
|
exportChildren.setSelected(true);
|
||||||
@ -131,11 +129,26 @@ public class OBJOptionChooser extends JPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void storeOptions(OBJExportOptions opts) {
|
public void storeOptions(OBJExportOptions opts) {
|
||||||
opts.setExportChildren(exportChildren.isSelected());
|
boolean onlyComponentAssemblies = isOnlyComponentAssembliesSelected(selectedComponents);
|
||||||
|
// Don't save the state when the checkbox is set automatically due to component assemblies
|
||||||
|
if (!onlyComponentAssemblies) {
|
||||||
|
opts.setExportChildren(exportChildren.isSelected());
|
||||||
|
}
|
||||||
opts.setExportAppearance(exportAppearance.isSelected());
|
opts.setExportAppearance(exportAppearance.isSelected());
|
||||||
opts.setExportAsSeparateFiles(exportAsSeparateFiles.isSelected());
|
opts.setExportAsSeparateFiles(exportAsSeparateFiles.isSelected());
|
||||||
opts.setRemoveOffset(removeOffset.isSelected());
|
opts.setRemoveOffset(removeOffset.isSelected());
|
||||||
opts.setTriangulate(triangulate.isSelected());
|
opts.setTriangulate(triangulate.isSelected());
|
||||||
opts.setLOD((ObjUtils.LevelOfDetail) LOD.getSelectedItem());
|
opts.setLOD((ObjUtils.LevelOfDetail) LOD.getSelectedItem());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isOnlyComponentAssembliesSelected(List<RocketComponent> selectedComponents) {
|
||||||
|
boolean onlyComponentAssemblies = true;
|
||||||
|
for (RocketComponent component : selectedComponents) {
|
||||||
|
if (!(component instanceof ComponentAssembly)) {
|
||||||
|
onlyComponentAssemblies = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return onlyComponentAssemblies;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1406,7 +1406,9 @@ public class BasicFrame extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (objChooser != null) {
|
if (objChooser != null) {
|
||||||
objChooser.storeOptions(document.getDefaultOBJOptions());
|
OBJExportOptions selectedOptions = new OBJExportOptions(rocket);
|
||||||
|
objChooser.storeOptions(selectedOptions);
|
||||||
|
prefs.saveOBJExportOptions(selectedOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
File file = chooser.getSelectedFile();
|
File file = chooser.getSelectedFile();
|
||||||
@ -1640,7 +1642,8 @@ public class BasicFrame extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
file = FileHelper.forceExtension(file, "obj");
|
file = FileHelper.forceExtension(file, "obj");
|
||||||
boolean isExportAsSeparateFiles = document.getDefaultOBJOptions().isExportAsSeparateFiles();
|
OBJExportOptions options = prefs.loadOBJExportOptions(rocket);
|
||||||
|
boolean isExportAsSeparateFiles = options.isExportAsSeparateFiles();
|
||||||
if (isExportAsSeparateFiles || FileHelper.confirmWrite(file, BasicFrame.this)) { // No overwrite warning for separate files
|
if (isExportAsSeparateFiles || FileHelper.confirmWrite(file, BasicFrame.this)) { // No overwrite warning for separate files
|
||||||
return saveAsWavefrontOBJ(file);
|
return saveAsWavefrontOBJ(file);
|
||||||
}
|
}
|
||||||
@ -1648,7 +1651,7 @@ public class BasicFrame extends JFrame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean saveAsWavefrontOBJ(File file) {
|
private boolean saveAsWavefrontOBJ(File file) {
|
||||||
OBJExportOptions options = document.getDefaultOBJOptions();
|
OBJExportOptions options = prefs.loadOBJExportOptions(rocket);
|
||||||
return saveWavefrontOBJFile(file, options);
|
return saveWavefrontOBJFile(file, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,9 +9,9 @@ import javax.swing.JFileChooser;
|
|||||||
import javax.swing.filechooser.FileFilter;
|
import javax.swing.filechooser.FileFilter;
|
||||||
|
|
||||||
import net.sf.openrocket.document.OpenRocketDocument;
|
import net.sf.openrocket.document.OpenRocketDocument;
|
||||||
import net.sf.openrocket.document.StorageOptions;
|
|
||||||
import net.sf.openrocket.document.StorageOptions.FileType;
|
import net.sf.openrocket.document.StorageOptions.FileType;
|
||||||
import net.sf.openrocket.file.wavefrontobj.OBJOptionChooser;
|
import net.sf.openrocket.file.wavefrontobj.OBJOptionChooser;
|
||||||
|
import net.sf.openrocket.file.wavefrontobj.export.OBJExportOptions;
|
||||||
import net.sf.openrocket.gui.util.FileHelper;
|
import net.sf.openrocket.gui.util.FileHelper;
|
||||||
import net.sf.openrocket.gui.util.SimpleFileFilter;
|
import net.sf.openrocket.gui.util.SimpleFileFilter;
|
||||||
import net.sf.openrocket.gui.util.SwingPreferences;
|
import net.sf.openrocket.gui.util.SwingPreferences;
|
||||||
@ -19,6 +19,7 @@ import net.sf.openrocket.gui.widgets.SaveFileChooser;
|
|||||||
import net.sf.openrocket.l10n.Translator;
|
import net.sf.openrocket.l10n.Translator;
|
||||||
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
import net.sf.openrocket.rocketcomponent.RocketComponent;
|
||||||
import net.sf.openrocket.startup.Application;
|
import net.sf.openrocket.startup.Application;
|
||||||
|
import net.sf.openrocket.startup.Preferences;
|
||||||
import net.sf.openrocket.util.FileUtils;
|
import net.sf.openrocket.util.FileUtils;
|
||||||
|
|
||||||
public class DesignFileSaveAsFileChooser extends SaveFileChooser {
|
public class DesignFileSaveAsFileChooser extends SaveFileChooser {
|
||||||
@ -27,6 +28,7 @@ public class DesignFileSaveAsFileChooser extends SaveFileChooser {
|
|||||||
private final OpenRocketDocument document;
|
private final OpenRocketDocument document;
|
||||||
|
|
||||||
private static final Translator trans = Application.getTranslator();
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
private static final Preferences prefs = Application.getPreferences();
|
||||||
|
|
||||||
public static DesignFileSaveAsFileChooser build(OpenRocketDocument document, FileType type) {
|
public static DesignFileSaveAsFileChooser build(OpenRocketDocument document, FileType type) {
|
||||||
return new DesignFileSaveAsFileChooser(document, type, null);
|
return new DesignFileSaveAsFileChooser(document, type, null);
|
||||||
@ -69,7 +71,8 @@ public class DesignFileSaveAsFileChooser extends SaveFileChooser {
|
|||||||
case WAVEFRONT_OBJ:
|
case WAVEFRONT_OBJ:
|
||||||
defaultFilename = FileHelper.forceExtension(defaultFilename,"obj");
|
defaultFilename = FileHelper.forceExtension(defaultFilename,"obj");
|
||||||
this.setDialogTitle(trans.get("saveAs.wavefront.title"));
|
this.setDialogTitle(trans.get("saveAs.wavefront.title"));
|
||||||
OBJOptionChooser objChooser = new OBJOptionChooser(document.getDefaultOBJOptions(), selectedComponents);
|
OBJExportOptions initialOptions = prefs.loadOBJExportOptions(document.getRocket());
|
||||||
|
OBJOptionChooser objChooser = new OBJOptionChooser(initialOptions, selectedComponents);
|
||||||
this.setAccessory(objChooser);
|
this.setAccessory(objChooser);
|
||||||
this.addChoosableFileFilter(FileHelper.WAVEFRONT_OBJ_FILTER);
|
this.addChoosableFileFilter(FileHelper.WAVEFRONT_OBJ_FILTER);
|
||||||
this.setFileFilter(FileHelper.WAVEFRONT_OBJ_FILTER);
|
this.setFileFilter(FileHelper.WAVEFRONT_OBJ_FILTER);
|
||||||
|
@ -132,6 +132,7 @@ public class SwingPreferences extends net.sf.openrocket.startup.Preferences {
|
|||||||
|
|
||||||
//////////////////////
|
//////////////////////
|
||||||
|
|
||||||
|
@Override
|
||||||
public Preferences getPreferences() {
|
public Preferences getPreferences() {
|
||||||
return PREFNODE;
|
return PREFNODE;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user