Added ability to open *.csv files to menu.

This commit is contained in:
Doug Pedrick 2012-05-15 04:35:33 +00:00
parent 1ee93fdab0
commit 90ebc01268
17 changed files with 346 additions and 270 deletions

View File

@ -8,6 +8,8 @@ import net.sf.openrocket.l10n.ResourceBundleTranslator;
import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.logging.LogHelper;
import net.sf.openrocket.material.Material; import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.loader.MaterialHolder;
import net.sf.openrocket.preset.loader.RocksimComponentFileTranslator;
import net.sf.openrocket.preset.xml.OpenRocketComponentLoader; import net.sf.openrocket.preset.xml.OpenRocketComponentLoader;
import net.sf.openrocket.preset.xml.OpenRocketComponentSaver; import net.sf.openrocket.preset.xml.OpenRocketComponentSaver;
import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Application;
@ -37,14 +39,11 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
* A UI for editing component presets. Currently this is a standalone application - run the main within this class. * A UI for editing component presets. Currently this is a standalone application - run the main within this class.
* TODO: Full I18n * TODO: Full I18n TODO: Save As .csv
* TODO: Open .csv
* TODO: Save As .csv
*/ */
public class ComponentPresetPanel extends JPanel implements PresetResultListener { public class ComponentPresetPanel extends JPanel implements PresetResultListener {
@ -224,17 +223,6 @@ public class ComponentPresetPanel extends JPanel implements PresetResultListener
add(addBtn, "cell 0 1,alignx left,aligny top"); add(addBtn, "cell 0 1,alignx left,aligny top");
} }
private boolean saveAndHandleError() {
try {
return saveAsORC();
}
catch (Exception e1) {
JOptionPane.showMessageDialog(ComponentPresetPanel.this, e1.getLocalizedMessage(),
"Error saving ORC file.", JOptionPane.ERROR_MESSAGE);
return false;
}
}
/** /**
* Callback method from the PresetEditorDialog to notify this class when a preset has been saved. The 'save' is * Callback method from the PresetEditorDialog to notify this class when a preset has been saved. The 'save' is
* really just a call back here so the preset can be added to the master table. It's not to be confused with the * really just a call back here so the preset can be added to the master table. It's not to be confused with the
@ -247,9 +235,11 @@ public class ComponentPresetPanel extends JPanel implements PresetResultListener
if (preset != null) { if (preset != null) {
DataTableModel model = (DataTableModel) table.getModel(); DataTableModel model = (DataTableModel) table.getModel();
//Is this a new preset? //Is this a new preset?
String description = preset.has(ComponentPreset.DESCRIPTION) ? preset.get(ComponentPreset.DESCRIPTION) :
preset.getPartNo();
if (!editingSelected) { if (!editingSelected) {
model.addRow(new Object[]{preset.getManufacturer().getDisplayName(), preset.getType().name(), model.addRow(new Object[]{preset.getManufacturer().getDisplayName(), preset.getType().name(),
preset.getPartNo(), preset.get(ComponentPreset.DESCRIPTION), Icons.EDIT_DELETE}, preset); preset.getPartNo(), description, Icons.EDIT_DELETE}, preset);
} }
else { else {
//This is a modified preset; update all of the columns and the stored associated instance. //This is a modified preset; update all of the columns and the stored associated instance.
@ -257,7 +247,7 @@ public class ComponentPresetPanel extends JPanel implements PresetResultListener
model.setValueAt(preset.getManufacturer().getDisplayName(), row, 0); model.setValueAt(preset.getManufacturer().getDisplayName(), row, 0);
model.setValueAt(preset.getType().name(), row, 1); model.setValueAt(preset.getType().name(), row, 1);
model.setValueAt(preset.getPartNo(), row, 2); model.setValueAt(preset.getPartNo(), row, 2);
model.setValueAt(preset.get(ComponentPreset.DESCRIPTION), row, 3); model.setValueAt(description, row, 3);
model.associated.set(row, preset); model.associated.set(row, preset);
} }
} }
@ -338,8 +328,9 @@ public class ComponentPresetPanel extends JPanel implements PresetResultListener
private boolean openComponentFile() { private boolean openComponentFile() {
final JFileChooser chooser = new JFileChooser(); final JFileChooser chooser = new JFileChooser();
chooser.addChoosableFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER); chooser.addChoosableFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER);
chooser.addChoosableFileFilter(FileHelper.CSV_FILE_FILTER);
chooser.setFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER); chooser.setFileFilter(FileHelper.OPEN_ROCKET_COMPONENT_FILTER);
chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
if (lastDirectory != null) { if (lastDirectory != null) {
chooser.setCurrentDirectory(lastDirectory); chooser.setCurrentDirectory(lastDirectory);
} }
@ -362,9 +353,18 @@ public class ComponentPresetPanel extends JPanel implements PresetResultListener
} }
lastDirectory = file.getParentFile(); lastDirectory = file.getParentFile();
List<ComponentPreset> presets = null;
Collection<ComponentPreset> presets = new OpenRocketComponentLoader().load(new FileInputStream(file), if (file.getName().toLowerCase().endsWith(".orc")) {
file.getName()); presets = (List<ComponentPreset>) new OpenRocketComponentLoader().load(new FileInputStream(file), file.getName());
}
else {
if (file.getName().toLowerCase().endsWith(".csv")) {
file = file.getParentFile();
}
presets = new ArrayList<ComponentPreset>();
MaterialHolder materialHolder = RocksimComponentFileTranslator.loadAll(presets, file);
}
if (presets != null) { if (presets != null) {
for (ComponentPreset next : presets) { for (ComponentPreset next : presets) {
notifyResult(next); notifyResult(next);
@ -373,6 +373,7 @@ public class ComponentPresetPanel extends JPanel implements PresetResultListener
} }
} }
catch (Exception e) { catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(ComponentPresetPanel.this, "Unable to open OpenRocket component file: " + JOptionPane.showMessageDialog(ComponentPresetPanel.this, "Unable to open OpenRocket component file: " +
file.getName() + " Invalid format. " + e.getMessage()); file.getName() + " Invalid format. " + e.getMessage());
openedFile = null; openedFile = null;
@ -381,6 +382,17 @@ public class ComponentPresetPanel extends JPanel implements PresetResultListener
return true; return true;
} }
private boolean saveAndHandleError() {
try {
return saveAsORC();
}
catch (Exception e1) {
JOptionPane.showMessageDialog(ComponentPresetPanel.this, e1.getLocalizedMessage(),
"Error saving ORC file.", JOptionPane.ERROR_MESSAGE);
return false;
}
}
/** /**
* Save the contents of the table model as XML in .orc format. * Save the contents of the table model as XML in .orc format.
* *

View File

@ -1,21 +1,20 @@
package net.sf.openrocket.preset.loader; package net.sf.openrocket.preset.loader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPresetFactory; import net.sf.openrocket.preset.ComponentPresetFactory;
import net.sf.openrocket.preset.InvalidComponentPresetException; import net.sf.openrocket.preset.InvalidComponentPresetException;
import net.sf.openrocket.preset.TypedPropertyMap; import net.sf.openrocket.preset.TypedPropertyMap;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseComponentLoader extends RocksimComponentFileLoader { public abstract class BaseComponentLoader extends RocksimComponentFileLoader {
List<ComponentPreset> presets; List<ComponentPreset> presets;
public BaseComponentLoader(MaterialHolder materials) { public BaseComponentLoader(MaterialHolder materials, File theBasePathToLoadFrom) {
super(); super(theBasePathToLoadFrom);
presets = new ArrayList<ComponentPreset>(); presets = new ArrayList<ComponentPreset>();
fileColumns.add( new ManufacturerColumnParser() ); fileColumns.add( new ManufacturerColumnParser() );
@ -35,6 +34,10 @@ public abstract class BaseComponentLoader extends RocksimComponentFileLoader {
@Override @Override
protected void postProcess(TypedPropertyMap props) { protected void postProcess(TypedPropertyMap props) {
try { try {
//Some Rocksim files don't contain description, so set it to the part no when not available.
if (!props.containsKey(ComponentPreset.DESCRIPTION)) {
props.put(ComponentPreset.DESCRIPTION, props.get(ComponentPreset.PARTNO));
}
props.put(ComponentPreset.TYPE, getComponentPresetType()); props.put(ComponentPreset.TYPE, getComponentPresetType());
ComponentPreset preset = ComponentPresetFactory.create(props); ComponentPreset preset = ComponentPresetFactory.create(props);
presets.add(preset); presets.add(preset);

View File

@ -1,15 +1,14 @@
package net.sf.openrocket.preset.loader; package net.sf.openrocket.preset.loader;
import java.util.Map;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import java.io.File;
public class BodyTubeLoader extends BaseComponentLoader { public class BodyTubeLoader extends BaseComponentLoader {
public BodyTubeLoader(MaterialHolder materials) { public BodyTubeLoader(MaterialHolder materials, File theBasePathToLoadFrom) {
super(materials); super(materials, theBasePathToLoadFrom);
fileColumns.add(new DoubleUnitColumnParser("ID","Units",ComponentPreset.INNER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("ID","Units",ComponentPreset.INNER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH)); fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));

View File

@ -4,10 +4,12 @@ import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import net.sf.openrocket.preset.TypedPropertyMap; import net.sf.openrocket.preset.TypedPropertyMap;
import java.io.File;
public class BulkHeadLoader extends BaseComponentLoader { public class BulkHeadLoader extends BaseComponentLoader {
public BulkHeadLoader(MaterialHolder materials) { public BulkHeadLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH)); fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));

View File

@ -3,10 +3,12 @@ package net.sf.openrocket.preset.loader;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import java.io.File;
public class CenteringRingLoader extends BodyTubeLoader { public class CenteringRingLoader extends BodyTubeLoader {
public CenteringRingLoader(MaterialHolder materials) { public CenteringRingLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
} }
@Override @Override

View File

@ -28,7 +28,7 @@ public class DoubleUnitColumnParser extends BaseUnitColumnParser {
Unit unit = rocksimUnits.get(unitName); Unit unit = rocksimUnits.get(unitName);
if ( unit == null ) { if ( unit == null ) {
if ( unitName == null || "" .equals(unitName) ) { if ( unitName == null || "" .equals(unitName) || "?".equals(unitName)) {
// Hmm no data... Lets assume SI // Hmm no data... Lets assume SI
if ( propKey.getUnitGroup() == UnitGroup.UNITS_LENGTH ) { if ( propKey.getUnitGroup() == UnitGroup.UNITS_LENGTH ) {
unit = UnitGroup.UNITS_LENGTH.getUnit("in"); unit = UnitGroup.UNITS_LENGTH.getUnit("in");
@ -49,6 +49,8 @@ public class DoubleUnitColumnParser extends BaseUnitColumnParser {
} }
catch ( NumberFormatException nex) { catch ( NumberFormatException nex) {
} }
catch ( IllegalArgumentException iae) {
}
} }

View File

@ -3,10 +3,12 @@ package net.sf.openrocket.preset.loader;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import java.io.File;
public class EngineBlockLoader extends BodyTubeLoader { public class EngineBlockLoader extends BodyTubeLoader {
public EngineBlockLoader(MaterialHolder materials) { public EngineBlockLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
} }
@Override @Override

View File

@ -3,10 +3,12 @@ package net.sf.openrocket.preset.loader;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import java.io.File;
public class LaunchLugLoader extends BaseComponentLoader { public class LaunchLugLoader extends BaseComponentLoader {
public LaunchLugLoader(MaterialHolder materials) { public LaunchLugLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
fileColumns.add(new DoubleUnitColumnParser("ID","Units",ComponentPreset.INNER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("ID","Units",ComponentPreset.INNER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.OUTER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH)); fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));

View File

@ -17,7 +17,7 @@ public class MassColumnParser extends DoubleUnitColumnParser {
@Override @Override
protected void doParse(String columnData, String[] data, TypedPropertyMap props) { protected void doParse(String columnData, String[] data, TypedPropertyMap props) {
if ( columnData == null || "".equals(columnData.trim())) { if ( columnData == null || "".equals(columnData.trim()) || "?".equals(columnData.trim())) {
return; return;
} }
double d = Double.valueOf(columnData); double d = Double.valueOf(columnData);

View File

@ -1,13 +1,12 @@
package net.sf.openrocket.preset.loader; package net.sf.openrocket.preset.loader;
import java.util.HashMap;
import java.util.Map;
import net.sf.openrocket.material.Material; import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.TypedKey; import net.sf.openrocket.preset.TypedKey;
import net.sf.openrocket.preset.TypedPropertyMap; import net.sf.openrocket.preset.TypedPropertyMap;
import net.sf.openrocket.util.BugException; import net.sf.openrocket.util.BugException;
import java.io.File;
public class MaterialLoader extends RocksimComponentFileLoader { public class MaterialLoader extends RocksimComponentFileLoader {
private MaterialHolder materialMap = new MaterialHolder(); private MaterialHolder materialMap = new MaterialHolder();
@ -16,8 +15,8 @@ public class MaterialLoader extends RocksimComponentFileLoader {
private final static TypedKey<String> UNITS = new TypedKey<String>("Units", String.class); private final static TypedKey<String> UNITS = new TypedKey<String>("Units", String.class);
private final static TypedKey<Double> DENSITY = new TypedKey<Double>("Density", Double.class); private final static TypedKey<Double> DENSITY = new TypedKey<Double>("Density", Double.class);
public MaterialLoader() { public MaterialLoader(File theBasePathToLoadFrom) {
super(); super(theBasePathToLoadFrom);
fileColumns.add( new StringColumnParser("Material Name", MATERIALNAME) ); fileColumns.add( new StringColumnParser("Material Name", MATERIALNAME) );
fileColumns.add( new StringColumnParser("Units", UNITS)); fileColumns.add( new StringColumnParser("Units", UNITS));
fileColumns.add( new DoubleColumnParser("Density", DENSITY)); fileColumns.add( new DoubleColumnParser("Density", DENSITY));

View File

@ -4,10 +4,12 @@ import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import net.sf.openrocket.preset.TypedPropertyMap; import net.sf.openrocket.preset.TypedPropertyMap;
import java.io.File;
public class NoseConeLoader extends BaseComponentLoader { public class NoseConeLoader extends BaseComponentLoader {
public NoseConeLoader(MaterialHolder materials) { public NoseConeLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
fileColumns.add(new DoubleUnitColumnParser("Outer Dia","Units",ComponentPreset.AFT_OUTER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("Outer Dia","Units",ComponentPreset.AFT_OUTER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH)); fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));
fileColumns.add(new DoubleUnitColumnParser("Insert Length","Units",ComponentPreset.AFT_SHOULDER_LENGTH)); fileColumns.add(new DoubleUnitColumnParser("Insert Length","Units",ComponentPreset.AFT_SHOULDER_LENGTH));

View File

@ -5,12 +5,14 @@ import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import net.sf.openrocket.preset.TypedPropertyMap; import net.sf.openrocket.preset.TypedPropertyMap;
import java.io.File;
public class ParachuteLoader extends BaseComponentLoader { public class ParachuteLoader extends BaseComponentLoader {
private final MaterialHolder materials; private final MaterialHolder materials;
public ParachuteLoader(MaterialHolder materials) { public ParachuteLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
this.materials = materials; this.materials = materials;
fileColumns.add(new IntegerColumnParser("n sides", ComponentPreset.SIDES)); fileColumns.add(new IntegerColumnParser("n sides", ComponentPreset.SIDES));
fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("OD","Units",ComponentPreset.DIAMETER));

View File

@ -1,5 +1,12 @@
package net.sf.openrocket.preset.loader; package net.sf.openrocket.preset.loader;
import au.com.bytecode.opencsv.CSVReader;
import net.sf.openrocket.gui.print.PrintUnit;
import net.sf.openrocket.preset.TypedPropertyMap;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.ArrayList;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
@ -8,25 +15,35 @@ import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.List; import java.util.List;
import net.sf.openrocket.gui.print.PrintUnit;
import net.sf.openrocket.preset.TypedPropertyMap;
import net.sf.openrocket.unit.Unit;
import net.sf.openrocket.unit.UnitGroup;
import net.sf.openrocket.util.ArrayList;
import au.com.bytecode.opencsv.CSVReader;
/** /**
* Primary entry point for parsing component CSV files that are in Rocksim format. * Primary entry point for parsing component CSV files that are in Rocksim format.
*/ */
public abstract class RocksimComponentFileLoader { public abstract class RocksimComponentFileLoader {
public static String basePath = ""; private String basePath = "";
protected List<RocksimComponentFileColumnParser> fileColumns; private File dir;
public RocksimComponentFileLoader() { protected List<RocksimComponentFileColumnParser> fileColumns = new ArrayList<RocksimComponentFileColumnParser>();
super();
fileColumns = new ArrayList<RocksimComponentFileColumnParser>(); /**
* Constructor.
*
* @param theBasePathToLoadFrom base path
*/
public RocksimComponentFileLoader(File theBasePathToLoadFrom) {
dir = theBasePathToLoadFrom;
basePath = dir.getAbsolutePath();
}
/**
* Constructor.
*
* @param theBasePathToLoadFrom base path
*/
public RocksimComponentFileLoader(String theBasePathToLoadFrom) {
dir = new File(basePath);
basePath = theBasePathToLoadFrom;
} }
protected abstract RocksimComponentFileType getFileType(); protected abstract RocksimComponentFileType getFileType();
@ -34,17 +51,18 @@ public abstract class RocksimComponentFileLoader {
public void load() { public void load() {
load(getFileType()); load(getFileType());
} }
/** /**
* Read a comma separated component file and return the parsed contents as a list of string arrays. Not for * Read a comma separated component file and return the parsed contents as a list of string arrays. Not for
* production use - just here for smoke testing. * production use - just here for smoke testing.
* *
* @param type the type of component file to read; uses the default file name * @param type the type of component file to read; uses the default file name
*
* @return a list (guaranteed never to be null) of string arrays. Each element of the list represents a row in the * @return a list (guaranteed never to be null) of string arrays. Each element of the list represents a row in the
* component data file; the element in the list itself is an array of String, where each item in the array * component data file; the element in the list itself is an array of String, where each item in the array
* is a column (cell) in the row. The string array is in sequential order as it appeared in the file. * is a column (cell) in the row. The string array is in sequential order as it appeared in the file.
*/ */
private void load(RocksimComponentFileType type) { private void load(RocksimComponentFileType type) {
File dir = new File(basePath);
if (!dir.exists()) { if (!dir.exists()) {
throw new IllegalArgumentException(basePath + " does not exist"); throw new IllegalArgumentException(basePath + " does not exist");
} }
@ -57,7 +75,8 @@ public abstract class RocksimComponentFileLoader {
try { try {
FileInputStream fis = new FileInputStream(new File(dir, type.getDefaultFileName())); FileInputStream fis = new FileInputStream(new File(dir, type.getDefaultFileName()));
load(fis); load(fis);
} catch (FileNotFoundException ex) { }
catch (FileNotFoundException ex) {
// FIXME? // FIXME?
} }
} }
@ -66,6 +85,7 @@ public abstract class RocksimComponentFileLoader {
* Read a comma separated component file and return the parsed contents as a list of string arrays. * Read a comma separated component file and return the parsed contents as a list of string arrays.
* *
* @param file the file to read and parse * @param file the file to read and parse
*
* @return a list (guaranteed never to be null) of string arrays. Each element of the list represents a row in the * @return a list (guaranteed never to be null) of string arrays. Each element of the list represents a row in the
* component data file; the element in the list itself is an array of String, where each item in the array * component data file; the element in the list itself is an array of String, where each item in the array
* is a column (cell) in the row. The string array is in sequential order as it appeared in the file. * is a column (cell) in the row. The string array is in sequential order as it appeared in the file.
@ -78,6 +98,7 @@ public abstract class RocksimComponentFileLoader {
* Read a comma separated component file and return the parsed contents as a list of string arrays. * Read a comma separated component file and return the parsed contents as a list of string arrays.
* *
* @param is the stream to read and parse * @param is the stream to read and parse
*
* @return a list (guaranteed never to be null) of string arrays. Each element of the list represents a row in the * @return a list (guaranteed never to be null) of string arrays. Each element of the list represents a row in the
* component data file; the element in the list itself is an array of String, where each item in the array * component data file; the element in the list itself is an array of String, where each item in the array
* is a column (cell) in the row. The string array is in sequential order as it appeared in the file. * is a column (cell) in the row. The string array is in sequential order as it appeared in the file.
@ -164,6 +185,7 @@ public abstract class RocksimComponentFileLoader {
* millimeters. * millimeters.
* *
* @param units the value from the file * @param units the value from the file
*
* @return true if it's inches * @return true if it's inches
*/ */
protected static boolean isInches(String units) { protected static boolean isInches(String units) {
@ -176,6 +198,7 @@ public abstract class RocksimComponentFileLoader {
* *
* @param units a Rocksim CSV string representing the kind of units. * @param units a Rocksim CSV string representing the kind of units.
* @param value the original value within the CSV file * @param value the original value within the CSV file
*
* @return the value in meters * @return the value in meters
*/ */
protected static double convertLength(String units, double value) { protected static double convertLength(String units, double value) {
@ -196,12 +219,13 @@ public abstract class RocksimComponentFileLoader {
} }
/** /**
* Remove all occurrences of the given character. Note: this is done because some manufacturers embed double * Remove all occurrences of the given character. Note: this is done because some manufacturers embed double quotes
* quotes in their descriptions or material names. Those are stripped away because they cause all sorts of * in their descriptions or material names. Those are stripped away because they cause all sorts of matching/lookup
* matching/lookup issues. * issues.
* *
* @param target the target string to be operated upon * @param target the target string to be operated upon
* @param toBeRemoved the character to remove * @param toBeRemoved the character to remove
*
* @return target, minus every occurrence of toBeRemoved * @return target, minus every occurrence of toBeRemoved
*/ */
protected static String stripAll(String target, Character toBeRemoved) { protected static String stripAll(String target, Character toBeRemoved) {
@ -216,12 +240,13 @@ public abstract class RocksimComponentFileLoader {
} }
/** /**
* Convert all words in a given string to Camel Case (first letter capitalized). Words are assumed to be * Convert all words in a given string to Camel Case (first letter capitalized). Words are assumed to be separated
* separated by a space. Note: this is done because some manufacturers define their material name in Camel Case * by a space. Note: this is done because some manufacturers define their material name in Camel Case but the
* but the component part references the material in lower case. That causes matching/lookup issues that's * component part references the material in lower case. That causes matching/lookup issues that's easiest handled
* easiest handled this way (rather than converting everything to lower case. * this way (rather than converting everything to lower case.
* *
* @param target the target string to be operated upon * @param target the target string to be operated upon
*
* @return target, with the first letter of each word in uppercase * @return target, with the first letter of each word in uppercase
*/ */
protected static String toCamelCase(String target) { protected static String toCamelCase(String target) {

View File

@ -1,11 +1,5 @@
package net.sf.openrocket.preset.loader; package net.sf.openrocket.preset.loader;
import java.io.File;
import java.io.FileWriter;
import java.io.StringReader;
import java.util.List;
import java.util.Map;
import net.sf.openrocket.gui.util.SwingPreferences; import net.sf.openrocket.gui.util.SwingPreferences;
import net.sf.openrocket.material.Material; import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
@ -14,12 +8,20 @@ import net.sf.openrocket.startup.Application;
import net.sf.openrocket.startup.Startup; import net.sf.openrocket.startup.Startup;
import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.ArrayList;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintStream;
import java.io.StringReader;
import java.util.List;
public class RocksimComponentFileTranslator { public class RocksimComponentFileTranslator {
private static PrintStream LOGGER = System.err;
private static void printUsage() { private static void printUsage() {
System.err.println("RocksimComponentFileLoader <dir> <file>"); LOGGER.println("RocksimComponentFileLoader <dir> <file>");
System.err.println("<dir> is base directory for a set of Rocksim component csv files"); LOGGER.println("<dir> is base directory for a set of Rocksim component csv files");
System.err.println("<file> is where the orc file is written"); LOGGER.println("<file> is where the orc file is written");
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
@ -33,93 +35,115 @@ public class RocksimComponentFileTranslator {
List<ComponentPreset> allPresets = new ArrayList<ComponentPreset>(); List<ComponentPreset> allPresets = new ArrayList<ComponentPreset>();
RocksimComponentFileLoader.basePath = args[0]; LOGGER.println("Loading csv files from directory " + args[0]);
System.err.println("Loading csv files from directory " + args[0]);
Startup.initializeLogging(); Startup.initializeLogging();
Application.setPreferences(new SwingPreferences()); Application.setPreferences(new SwingPreferences());
MaterialLoader mats = new MaterialLoader(); MaterialHolder materialMap = loadAll(allPresets, new File(args[0]));
mats.load(); LOGGER.println("\tMarshalling to XML");
MaterialHolder materialMap = mats.getMaterialMap();
System.err.println("\tMaterial types loaded: " + materialMap.size());
{
BodyTubeLoader bts = new BodyTubeLoader(materialMap);
bts.load();
allPresets.addAll(bts.getPresets());
System.err.println("\tBody Tubes loaded: " + bts.getPresets().size());
}
{
BulkHeadLoader bhs = new BulkHeadLoader(materialMap);
bhs.load();
allPresets.addAll(bhs.getPresets());
System.err.println("\tBulkheads loaded: " + bhs.getPresets().size());
}
{
CenteringRingLoader crs = new CenteringRingLoader(materialMap);
crs.load();
allPresets.addAll(crs.getPresets());
System.err.println("\tCentering Rings loaded: " + crs.getPresets().size());
}
{
TubeCouplerLoader tcs = new TubeCouplerLoader(materialMap);
tcs.load();
allPresets.addAll(tcs.getPresets());
System.err.println("\tTube Couplers loaded: " + tcs.getPresets().size());
}
{
EngineBlockLoader ebs = new EngineBlockLoader(materialMap);
ebs.load();
allPresets.addAll(ebs.getPresets());
System.err.println("\tEngine Blocks loaded: " + ebs.getPresets().size());
}
{
NoseConeLoader ncs = new NoseConeLoader(materialMap);
ncs.load();
allPresets.addAll(ncs.getPresets());
System.err.println("\tNose Cones loaded: " + ncs.getPresets().size());
}
{
TransitionLoader trs = new TransitionLoader(materialMap);
trs.load();
allPresets.addAll(trs.getPresets());
System.err.println("\tTransitions loaded: " + trs.getPresets().size());
}
{
LaunchLugLoader lls = new LaunchLugLoader(materialMap);
lls.load();
allPresets.addAll(lls.getPresets());
System.err.println("\tLaunch Lugs loaded: " + lls.getPresets().size());
}
{
StreamerLoader sts = new StreamerLoader(materialMap);
sts.load();
allPresets.addAll(sts.getPresets());
System.err.println("\tStreamers loaded: " + sts.getPresets().size());
}
{
ParachuteLoader pcs = new ParachuteLoader(materialMap);
pcs.load();
allPresets.addAll(pcs.getPresets());
System.err.println("Parachutes loaded: " + pcs.getPresets().size());
}
System.err.println("\tMarshalling to XML");
String xml = new OpenRocketComponentSaver().marshalToOpenRocketComponent(new ArrayList<Material>(materialMap.values()), allPresets); String xml = new OpenRocketComponentSaver().marshalToOpenRocketComponent(new ArrayList<Material>(materialMap.values()), allPresets);
// Try parsing the file // Try parsing the file
System.err.println("\tValidating XML"); LOGGER.println("\tValidating XML");
List<ComponentPreset> presets = new OpenRocketComponentSaver().unmarshalFromOpenRocketComponent(new StringReader(xml)); List<ComponentPreset> presets = new OpenRocketComponentSaver().unmarshalFromOpenRocketComponent(new StringReader(xml));
System.err.println("\tWriting to file " + args[1]); LOGGER.println("\tWriting to file " + args[1]);
File outfile = new File(args[1]); File outfile = new File(args[1]);
FileWriter fos = new FileWriter(outfile); FileWriter fos = new FileWriter(outfile);
fos.write(xml); fos.write(xml);
fos.flush(); fos.flush();
fos.close(); fos.close();
}
/**
* Set a print stream as a logger. Defaults to System.err.
*
* @param ps a stream to log to
*/
public static void setLogger(PrintStream ps) {
if (ps != null) {
LOGGER = ps;
}
}
/**
* Load all presets. The loaded presets are added to the list parameter. The loaded materials are returned in the
* MaterialHolder instance.
*
* @param theAllPresets a list of ComponentPreset that gets populated as the result of loading; must not be null on
* invocation
*
* @return a holder of the materials loaded
*/
public static MaterialHolder loadAll(final List<ComponentPreset> theAllPresets, File theBasePathToLoadFrom) {
MaterialLoader mats = new MaterialLoader(theBasePathToLoadFrom);
mats.load();
MaterialHolder materialMap = mats.getMaterialMap();
LOGGER.println("\tMaterial types loaded: " + materialMap.size());
{
BodyTubeLoader bts = new BodyTubeLoader(materialMap, theBasePathToLoadFrom);
bts.load();
theAllPresets.addAll(bts.getPresets());
LOGGER.println("\tBody Tubes loaded: " + bts.getPresets().size());
}
{
BulkHeadLoader bhs = new BulkHeadLoader(materialMap, theBasePathToLoadFrom);
bhs.load();
theAllPresets.addAll(bhs.getPresets());
LOGGER.println("\tBulkheads loaded: " + bhs.getPresets().size());
}
{
CenteringRingLoader crs = new CenteringRingLoader(materialMap, theBasePathToLoadFrom);
crs.load();
theAllPresets.addAll(crs.getPresets());
LOGGER.println("\tCentering Rings loaded: " + crs.getPresets().size());
}
{
TubeCouplerLoader tcs = new TubeCouplerLoader(materialMap, theBasePathToLoadFrom);
tcs.load();
theAllPresets.addAll(tcs.getPresets());
LOGGER.println("\tTube Couplers loaded: " + tcs.getPresets().size());
}
{
EngineBlockLoader ebs = new EngineBlockLoader(materialMap, theBasePathToLoadFrom);
ebs.load();
theAllPresets.addAll(ebs.getPresets());
LOGGER.println("\tEngine Blocks loaded: " + ebs.getPresets().size());
}
{
NoseConeLoader ncs = new NoseConeLoader(materialMap, theBasePathToLoadFrom);
ncs.load();
theAllPresets.addAll(ncs.getPresets());
LOGGER.println("\tNose Cones loaded: " + ncs.getPresets().size());
}
{
TransitionLoader trs = new TransitionLoader(materialMap, theBasePathToLoadFrom);
trs.load();
theAllPresets.addAll(trs.getPresets());
LOGGER.println("\tTransitions loaded: " + trs.getPresets().size());
}
{
LaunchLugLoader lls = new LaunchLugLoader(materialMap, theBasePathToLoadFrom);
lls.load();
theAllPresets.addAll(lls.getPresets());
LOGGER.println("\tLaunch Lugs loaded: " + lls.getPresets().size());
}
{
StreamerLoader sts = new StreamerLoader(materialMap, theBasePathToLoadFrom);
sts.load();
theAllPresets.addAll(sts.getPresets());
LOGGER.println("\tStreamers loaded: " + sts.getPresets().size());
}
{
ParachuteLoader pcs = new ParachuteLoader(materialMap, theBasePathToLoadFrom);
pcs.load();
theAllPresets.addAll(pcs.getPresets());
LOGGER.println("Parachutes loaded: " + pcs.getPresets().size());
}
return materialMap;
} }
} }

View File

@ -5,12 +5,14 @@ import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import net.sf.openrocket.preset.TypedPropertyMap; import net.sf.openrocket.preset.TypedPropertyMap;
import java.io.File;
public class StreamerLoader extends BaseComponentLoader { public class StreamerLoader extends BaseComponentLoader {
private final MaterialHolder materials; private final MaterialHolder materials;
public StreamerLoader(MaterialHolder materials) { public StreamerLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
this.materials = materials; this.materials = materials;
fileColumns.add(new SurfaceMaterialColumnParser(materials,"Material",ComponentPreset.MATERIAL)); fileColumns.add(new SurfaceMaterialColumnParser(materials,"Material",ComponentPreset.MATERIAL));
fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH)); fileColumns.add(new DoubleUnitColumnParser("Length","Units",ComponentPreset.LENGTH));

View File

@ -1,15 +1,14 @@
package net.sf.openrocket.preset.loader; package net.sf.openrocket.preset.loader;
import java.util.Map;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import java.io.File;
public class TransitionLoader extends NoseConeLoader { public class TransitionLoader extends NoseConeLoader {
public TransitionLoader(MaterialHolder materials) { public TransitionLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
fileColumns.add(new DoubleUnitColumnParser("Front Insert Len","Units",ComponentPreset.FORE_SHOULDER_LENGTH)); fileColumns.add(new DoubleUnitColumnParser("Front Insert Len","Units",ComponentPreset.FORE_SHOULDER_LENGTH));
fileColumns.add(new DoubleUnitColumnParser("Front Insert OD","Units",ComponentPreset.FORE_SHOULDER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("Front Insert OD","Units",ComponentPreset.FORE_SHOULDER_DIAMETER));
fileColumns.add(new DoubleUnitColumnParser("Front OD","Units",ComponentPreset.FORE_OUTER_DIAMETER)); fileColumns.add(new DoubleUnitColumnParser("Front OD","Units",ComponentPreset.FORE_OUTER_DIAMETER));

View File

@ -1,15 +1,14 @@
package net.sf.openrocket.preset.loader; package net.sf.openrocket.preset.loader;
import java.util.Map;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.preset.ComponentPreset; import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.preset.ComponentPreset.Type; import net.sf.openrocket.preset.ComponentPreset.Type;
import java.io.File;
public class TubeCouplerLoader extends BodyTubeLoader { public class TubeCouplerLoader extends BodyTubeLoader {
public TubeCouplerLoader(MaterialHolder materials) { public TubeCouplerLoader(MaterialHolder materials, File theBasePath) {
super(materials); super(materials, theBasePath);
} }
@Override @Override