diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties
index d5b1f3809..b65b8b3f5 100644
--- a/core/resources/l10n/messages.properties
+++ b/core/resources/l10n/messages.properties
@@ -89,7 +89,7 @@ BasicFrame.WarningDialog.txt2 = Some design features may not have been loaded co
BasicFrame.WarningDialog.saving.txt1 = The following problems were encountered while saving
BasicFrame.WarningDialog.saving.txt2 = Some design features may not have exported correctly.
BasicFrame.WarningDialog.title = Warnings while opening file
-BasicFrame.WarningDialog.saving.title = Warnings while opening file
+BasicFrame.WarningDialog.saving.title = Warnings while saving file
BasicFrame.ErrorWarningDialog.txt1 = Please correct the errors.
BasicFrame.ErrorWarningDialog.saving.title = Errors/Warnings while saving file
BasicFrame.lbl.SaveRocketInfo = Save Design Info
@@ -2097,6 +2097,7 @@ Warning.TUBE_OVERLAP = Overlapping tube fins may not simulate accurately.
Warning.EMPTY_BRANCH = Simulation branch contains no data
Warning.SEPARATION_ORDER = Stages separated in an unreasonable order
Warning.EARLY_SEPARATION = Stages separated before clearing launch rod/rail
+Warning.OBJ_ZERO_THICKNESS = Zero-thickness component can cause issues for 3D printing
! Scale dialog
ScaleDialog.lbl.scaleRocket = Entire rocket
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java
index 8e856cc64..a71739583 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactory.java
@@ -18,6 +18,7 @@ import net.sf.openrocket.file.wavefrontobj.export.components.RocketComponentExpo
import net.sf.openrocket.file.wavefrontobj.export.components.RingComponentExporter;
import net.sf.openrocket.file.wavefrontobj.export.components.TransitionExporter;
import net.sf.openrocket.file.wavefrontobj.export.components.TubeFinSetExporter;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.BodyTube;
@@ -69,6 +70,7 @@ public class OBJExporterFactory {
private final FlightConfiguration configuration;
private final OBJExportOptions options;
private final File file;
+ private final WarningSet warnings;
private static final Logger log = LoggerFactory.getLogger(OBJExporterFactory.class);
@@ -93,11 +95,12 @@ public class OBJExporterFactory {
* @param file The file to export the OBJ to
*/
public OBJExporterFactory(List components, FlightConfiguration configuration, File file,
- OBJExportOptions options) {
+ OBJExportOptions options, WarningSet warnings) {
this.components = components;
this.configuration = configuration;
this.file = file;
this.options = options;
+ this.warnings = warnings;
}
/**
@@ -152,7 +155,7 @@ public class OBJExporterFactory {
// Component exporting
String groupName = idx + "_" + component.getName();
handleComponent(obj, this.configuration, this.options.getTransformer(), component, groupName,
- materials.get(obj), this.options.getLOD(), options);
+ materials.get(obj), this.options.getLOD(), options, warnings);
// If separate export, add this object to the map of objects to export
if (exportAsSeparateFiles) {
@@ -225,7 +228,8 @@ public class OBJExporterFactory {
@SuppressWarnings("unchecked") // This is safe because of the structure we set up.
private void handleComponent(DefaultObj obj, FlightConfiguration config, CoordTransform transformer,
T component, String groupName, List materials,
- ObjUtils.LevelOfDetail LOD, OBJExportOptions options) {
+ ObjUtils.LevelOfDetail LOD, OBJExportOptions options,
+ WarningSet warnings) {
ExporterFactory factory = null;
Class> currentClass = component.getClass();
@@ -254,7 +258,7 @@ public class OBJExporterFactory {
}
// Export component
- final RocketComponentExporter exporter = factory.create(obj, config, transformer, component, groupName, LOD);
+ final RocketComponentExporter exporter = factory.create(obj, config, transformer, component, groupName, LOD, warnings);
exporter.addToObj();
// Export motor
@@ -272,7 +276,7 @@ public class OBJExporterFactory {
}
// Export the motor geometry
- MotorExporter motorExporter = new MotorExporter(obj, config, transformer, component, groupName, LOD);
+ MotorExporter motorExporter = new MotorExporter(obj, config, transformer, component, groupName, LOD, warnings);
motorExporter.addToObj();
}
}
@@ -300,6 +304,6 @@ public class OBJExporterFactory {
interface ExporterFactory {
RocketComponentExporter create(DefaultObj obj, FlightConfiguration config, CoordTransform transformer,
- T component, String groupName, ObjUtils.LevelOfDetail LOD);
+ T component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings);
}
}
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/BodyTubeExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/BodyTubeExporter.java
index d6a482b87..f40b53d2e 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/BodyTubeExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/BodyTubeExporter.java
@@ -4,6 +4,8 @@ import net.sf.openrocket.file.wavefrontobj.CoordTransform;
import net.sf.openrocket.file.wavefrontobj.DefaultObj;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.TubeExporter;
+import net.sf.openrocket.logging.Warning;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.BodyTube;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
@@ -11,8 +13,8 @@ import net.sf.openrocket.util.Coordinate;
public class BodyTubeExporter extends RocketComponentExporter {
public BodyTubeExporter(DefaultObj obj, FlightConfiguration config, CoordTransform transformer, BodyTube component,
- String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
}
@Override
@@ -24,6 +26,10 @@ public class BodyTubeExporter extends RocketComponentExporter {
final float length = (float) component.getLength();
final boolean isFilled = component.isFilled();
+ if (Double.compare(component.getThickness(), 0) == 0) {
+ warnings.add(Warning.OBJ_ZERO_THICKNESS, component.getName());
+ }
+
// Generate the mesh
for (InstanceContext context : config.getActiveInstances().getInstanceContexts(component)) {
generateMesh(outerRadius, innerRadius, length, isFilled, context);
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/FinSetExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/FinSetExporter.java
index abfb6ca8f..7176857cf 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/FinSetExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/FinSetExporter.java
@@ -6,6 +6,8 @@ import net.sf.openrocket.file.wavefrontobj.CoordTransform;
import net.sf.openrocket.file.wavefrontobj.DefaultObj;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.PolygonExporter;
+import net.sf.openrocket.logging.Warning;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.FinSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
@@ -16,8 +18,8 @@ import java.util.List;
public class FinSetExporter extends RocketComponentExporter {
public FinSetExporter(@NotNull DefaultObj obj, FlightConfiguration config, @NotNull CoordTransform transformer,
- FinSet component, String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ FinSet component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
}
@Override
@@ -35,6 +37,10 @@ public class FinSetExporter extends RocketComponentExporter {
final float thickness = (float) component.getThickness();
boolean hasTabs = component.getTabLength() > 0 && component.getTabHeight() > 0;
+ if (Float.compare(thickness, 0) == 0) {
+ warnings.add(Warning.OBJ_ZERO_THICKNESS, component.getName());
+ }
+
// Generate the fin meshes
for (InstanceContext context : config.getActiveInstances().getInstanceContexts(component)) {
generateMesh(floatPoints, floatTabPoints, thickness, hasTabs, context);
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/LaunchLugExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/LaunchLugExporter.java
index ddd5351d3..af88edcf4 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/LaunchLugExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/LaunchLugExporter.java
@@ -5,6 +5,8 @@ import net.sf.openrocket.file.wavefrontobj.CoordTransform;
import net.sf.openrocket.file.wavefrontobj.DefaultObj;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.TubeExporter;
+import net.sf.openrocket.logging.Warning;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
import net.sf.openrocket.rocketcomponent.LaunchLug;
@@ -12,8 +14,8 @@ import net.sf.openrocket.util.Coordinate;
public class LaunchLugExporter extends RocketComponentExporter {
public LaunchLugExporter(@NotNull DefaultObj obj, FlightConfiguration config, @NotNull CoordTransform transformer,
- LaunchLug component, String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ LaunchLug component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
}
@Override
@@ -24,6 +26,10 @@ public class LaunchLugExporter extends RocketComponentExporter {
final float innerRadius = (float) component.getInnerRadius();
final float length = (float) component.getLength();
+ if (Double.compare(component.getThickness(), 0) == 0) {
+ warnings.add(Warning.OBJ_ZERO_THICKNESS, component.getName());
+ }
+
// Generate the mesh
for (InstanceContext context : config.getActiveInstances().getInstanceContexts(component)) {
generateMesh(outerRadius, innerRadius, length, context);
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MassObjectExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MassObjectExporter.java
index 4eb2e43f3..470aac6bf 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MassObjectExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MassObjectExporter.java
@@ -5,6 +5,7 @@ import net.sf.openrocket.file.wavefrontobj.CoordTransform;
import net.sf.openrocket.file.wavefrontobj.DefaultObj;
import net.sf.openrocket.file.wavefrontobj.DefaultObjFace;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
import net.sf.openrocket.rocketcomponent.MassObject;
@@ -13,8 +14,8 @@ import net.sf.openrocket.util.RocketComponentUtils;
public class MassObjectExporter extends RocketComponentExporter {
public MassObjectExporter(@NotNull DefaultObj obj, FlightConfiguration config, @NotNull CoordTransform transformer,
- MassObject component, String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ MassObject component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
}
@Override
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MotorExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MotorExporter.java
index cbf07bff9..d04dbae94 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MotorExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/MotorExporter.java
@@ -6,6 +6,7 @@ import net.sf.openrocket.file.wavefrontobj.DefaultObjFace;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.CylinderExporter;
import net.sf.openrocket.file.wavefrontobj.export.shapes.DiskExporter;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.motor.Motor;
import net.sf.openrocket.motor.MotorConfiguration;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
@@ -24,6 +25,7 @@ public class MotorExporter {
protected final String groupName;
protected final ObjUtils.LevelOfDetail LOD;
protected final CoordTransform transformer;
+ protected final WarningSet warnings;
/**
* Wavefront OBJ exporter for a rocket component.
@@ -36,7 +38,7 @@ public class MotorExporter {
* @param LOD Level of detail to use for the export (e.g. '80')
*/
public MotorExporter(DefaultObj obj, FlightConfiguration config, CoordTransform transformer, RocketComponent mount,
- String groupName, ObjUtils.LevelOfDetail LOD) {
+ String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
if (!(mount instanceof MotorMount)) {
throw new IllegalArgumentException("Motor exporter can only be used for motor mounts");
}
@@ -46,6 +48,7 @@ public class MotorExporter {
this.mount = mount;
this.groupName = groupName;
this.LOD = LOD;
+ this.warnings = warnings;
}
public void addToObj() {
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RailButtonExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RailButtonExporter.java
index 36a16a70b..475b8563c 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RailButtonExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RailButtonExporter.java
@@ -8,6 +8,7 @@ import net.sf.openrocket.file.wavefrontobj.DefaultObjFace;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.CylinderExporter;
import net.sf.openrocket.file.wavefrontobj.export.shapes.DiskExporter;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
import net.sf.openrocket.rocketcomponent.RailButton;
@@ -26,8 +27,8 @@ public class RailButtonExporter extends RocketComponentExporter {
* @param LOD Level of detail to use for the export (e.g. '80')
*/
public RailButtonExporter(@NotNull DefaultObj obj, FlightConfiguration config, @NotNull CoordTransform transformer,
- RailButton component, String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ RailButton component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
}
@Override
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RingComponentExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RingComponentExporter.java
index 798a82169..08c3f7751 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RingComponentExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/RingComponentExporter.java
@@ -5,6 +5,8 @@ import net.sf.openrocket.file.wavefrontobj.CoordTransform;
import net.sf.openrocket.file.wavefrontobj.DefaultObj;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.TubeExporter;
+import net.sf.openrocket.logging.Warning;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
import net.sf.openrocket.rocketcomponent.RingComponent;
@@ -12,8 +14,8 @@ import net.sf.openrocket.util.Coordinate;
public class RingComponentExporter extends RocketComponentExporter {
public RingComponentExporter(@NotNull DefaultObj obj, FlightConfiguration config, @NotNull CoordTransform transformer,
- RingComponent component, String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ RingComponent component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
}
@Override
@@ -24,6 +26,10 @@ public class RingComponentExporter extends RocketComponentExporter {
protected final String groupName;
protected final ObjUtils.LevelOfDetail LOD;
protected final CoordTransform transformer;
+ protected final WarningSet warnings;
/**
* Wavefront OBJ exporter for a rocket component.
@@ -31,13 +33,15 @@ public abstract class RocketComponentExporter {
* @param LOD Level of detail to use for the export (e.g. '80')
*/
public RocketComponentExporter(@NotNull DefaultObj obj, @NotNull FlightConfiguration config, @NotNull CoordTransform transformer,
- T component, String groupName, ObjUtils.LevelOfDetail LOD) {
+ T component, String groupName, ObjUtils.LevelOfDetail LOD,
+ WarningSet warnings) {
this.obj = obj;
this.config = config;
this.component = component;
this.groupName = groupName;
this.LOD = LOD;
this.transformer = transformer;
+ this.warnings = warnings;
}
public abstract void addToObj();
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TransitionExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TransitionExporter.java
index 2157a17d1..5be6ddb7f 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TransitionExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TransitionExporter.java
@@ -9,6 +9,8 @@ import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.CylinderExporter;
import net.sf.openrocket.file.wavefrontobj.export.shapes.DiskExporter;
import net.sf.openrocket.file.wavefrontobj.export.shapes.TubeExporter;
+import net.sf.openrocket.logging.Warning;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
import net.sf.openrocket.rocketcomponent.Transition;
@@ -22,8 +24,8 @@ public class TransitionExporter extends RocketComponentExporter {
private final int nrOfSides;
public TransitionExporter(@NotNull DefaultObj obj, FlightConfiguration config, @NotNull CoordTransform transformer,
- Transition component, String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ Transition component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
this.nrOfSides = LOD.getNrOfSides(Math.max(component.getForeRadius(), component.getAftRadius()));
}
@@ -31,6 +33,10 @@ public class TransitionExporter extends RocketComponentExporter {
public void addToObj() {
obj.setActiveGroupNames(groupName);
+ if (Double.compare(component.getThickness(), 0) == 0) {
+ warnings.add(Warning.OBJ_ZERO_THICKNESS, component.getName());
+ }
+
// Generate the mesh
for (InstanceContext context : config.getActiveInstances().getInstanceContexts(component)) {
generateMesh(context);
diff --git a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TubeFinSetExporter.java b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TubeFinSetExporter.java
index 30175d809..68eb6a6ba 100644
--- a/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TubeFinSetExporter.java
+++ b/core/src/net/sf/openrocket/file/wavefrontobj/export/components/TubeFinSetExporter.java
@@ -5,6 +5,8 @@ import net.sf.openrocket.file.wavefrontobj.CoordTransform;
import net.sf.openrocket.file.wavefrontobj.DefaultObj;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.file.wavefrontobj.export.shapes.TubeExporter;
+import net.sf.openrocket.logging.Warning;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.rocketcomponent.FlightConfiguration;
import net.sf.openrocket.rocketcomponent.InstanceContext;
import net.sf.openrocket.rocketcomponent.TubeFinSet;
@@ -12,8 +14,8 @@ import net.sf.openrocket.util.Coordinate;
public class TubeFinSetExporter extends RocketComponentExporter {
public TubeFinSetExporter(@NotNull DefaultObj obj, FlightConfiguration config, @NotNull CoordTransform transformer,
- TubeFinSet component, String groupName, ObjUtils.LevelOfDetail LOD) {
- super(obj, config, transformer, component, groupName, LOD);
+ TubeFinSet component, String groupName, ObjUtils.LevelOfDetail LOD, WarningSet warnings) {
+ super(obj, config, transformer, component, groupName, LOD, warnings);
}
@Override
@@ -24,6 +26,10 @@ public class TubeFinSetExporter extends RocketComponentExporter {
final float innerRadius = (float) component.getInnerRadius();
final float length = (float) component.getLength();
+ if (Double.compare(component.getThickness(), 0) == 0) {
+ warnings.add(Warning.OBJ_ZERO_THICKNESS, component.getName());
+ }
+
// Generate the fin meshes
for (InstanceContext context : config.getActiveInstances().getInstanceContexts(component)) {
generateMesh(outerRadius, innerRadius, length, context);
diff --git a/core/src/net/sf/openrocket/logging/Warning.java b/core/src/net/sf/openrocket/logging/Warning.java
index 23c4bcb90..c3b9db1fb 100644
--- a/core/src/net/sf/openrocket/logging/Warning.java
+++ b/core/src/net/sf/openrocket/logging/Warning.java
@@ -386,6 +386,8 @@ public abstract class Warning extends Message {
public static final Warning TUBE_SEPARATION = new Other(trans.get("Warning.TUBE_SEPARATION"));
public static final Warning TUBE_OVERLAP = new Other(trans.get("Warning.TUBE_OVERLAP"));
+ public static final Warning OBJ_ZERO_THICKNESS = new Other(trans.get("Warning.OBJ_ZERO_THICKNESS"));
+
/** A Warning
that stage separation occurred at other than the last stage */
public static final Warning SEPARATION_ORDER = new Other(trans.get("Warning.SEPARATION_ORDER"));
diff --git a/core/test/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactoryTest.java b/core/test/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactoryTest.java
index f8dca2bb2..af5f5dd5c 100644
--- a/core/test/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactoryTest.java
+++ b/core/test/net/sf/openrocket/file/wavefrontobj/export/OBJExporterFactoryTest.java
@@ -8,16 +8,12 @@ import com.google.inject.util.Modules;
import net.sf.openrocket.ServicesForTesting;
import net.sf.openrocket.database.ComponentPresetDao;
import net.sf.openrocket.database.motor.MotorDatabase;
-import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.document.OpenRocketDocumentFactory;
-import net.sf.openrocket.file.GeneralRocketLoader;
-import net.sf.openrocket.file.RocketLoadException;
import net.sf.openrocket.file.openrocket.OpenRocketSaverTest;
-import net.sf.openrocket.file.wavefrontobj.CoordTransform;
-import net.sf.openrocket.file.wavefrontobj.DefaultCoordTransform;
import net.sf.openrocket.file.wavefrontobj.ObjUtils;
import net.sf.openrocket.l10n.DebugTranslator;
import net.sf.openrocket.l10n.Translator;
+import net.sf.openrocket.logging.WarningSet;
import net.sf.openrocket.plugin.PluginModule;
import net.sf.openrocket.rocketcomponent.AxialStage;
import net.sf.openrocket.rocketcomponent.BodyTube;
@@ -43,6 +39,7 @@ import java.nio.file.Path;
import java.util.List;
import static org.junit.Assert.fail;
+import static org.junit.Assert.assertEquals;
public class OBJExporterFactoryTest {
private static final File TMP_DIR = new File("./tmp/");
@@ -165,8 +162,11 @@ public class OBJExporterFactoryTest {
options.setScaling(30);
options.setExportChildren(true);
options.setRemoveOffset(true);
- OBJExporterFactory exporterFactory = new OBJExporterFactory(components, rocket.getSelectedConfiguration(), tempFile.toFile(), options);
+ WarningSet warnings = new WarningSet();
+ OBJExporterFactory exporterFactory = new OBJExporterFactory(components, rocket.getSelectedConfiguration(), tempFile.toFile(), options, warnings);
exporterFactory.doExport();
+ //// Just hope for no exceptions :)
+ assertEquals(warnings.size(), 0);
// Test with other parameters
@@ -180,8 +180,18 @@ public class OBJExporterFactoryTest {
options.setScaling(1000);
options.setLOD(ObjUtils.LevelOfDetail.LOW_QUALITY);
- exporterFactory = new OBJExporterFactory(components, rocket.getSelectedConfiguration(), tempFile.toFile(), options);
+ exporterFactory = new OBJExporterFactory(components, rocket.getSelectedConfiguration(), tempFile.toFile(), options, warnings);
exporterFactory.doExport();
+ //// Just hope for no exceptions :)
+ assertEquals(warnings.size(), 0);
+
+ // Test zero-thickness nose cone
+ noseCone.setThickness(0);
+
+ exporterFactory = new OBJExporterFactory(components, rocket.getSelectedConfiguration(), tempFile.toFile(), options, warnings);
+ exporterFactory.doExport();
+ //// Just hope for no exceptions :)
+ assertEquals(warnings.size(), 1);
// Clean up
Files.delete(tempFile);
diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java
index 08870e1ab..4a10abb00 100644
--- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java
+++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java
@@ -1530,8 +1530,9 @@ public class BasicFrame extends JFrame {
// // Some design features may not have been exported correctly.
trans.get("BasicFrame.WarningDialog.saving.txt2")
},
- // // Warnings while opening file
- trans.get("BasicFrame.WarningDialog.saving.title"), warnings);
+ //// Warnings while saving file
+ trans.get("BasicFrame.WarningDialog.saving.title"),
+ warnings);
} else if (!errors.isEmpty()) {
ErrorWarningDialog.showErrorsAndWarnings(BasicFrame.this,
new Object[]{
@@ -1677,10 +1678,21 @@ public class BasicFrame extends JFrame {
* @return true if the file was written
*/
private boolean saveWavefrontOBJFile(File file, OBJExportOptions options) {
+ WarningSet warnings = new WarningSet();
OBJExporterFactory exporter = new OBJExporterFactory(getSelectedComponents(), rocket.getSelectedConfiguration(),
- file, options);
+ file, options, warnings);
exporter.doExport();
+ // Show warning dialog
+ if (!warnings.isEmpty()) {
+ WarningDialog.showWarnings(this,
+ //// The following problems were encountered while saving
+ trans.get("BasicFrame.WarningDialog.saving.txt1") + " '" + file.getName() + "'.",
+ //// Warnings while saving file
+ trans.get("BasicFrame.WarningDialog.saving.title"),
+ warnings);
+ }
+
return true;
}