use of org.concord.energy3d.simulation.FresnelReflectorDailyAnalysis in project energy3d by concord-consortium.
the class PopupMenuForFresnelReflector method getPopupMenu.
static JPopupMenu getPopupMenu() {
if (popupMenuForFresnelReflector == null) {
final JMenuItem miMesh = new JMenuItem("Mesh...");
miMesh.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
final Foundation foundation = r.getTopContainer();
final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final JPanel gui = new JPanel(new BorderLayout());
final JPanel inputPanel = new JPanel(new GridLayout(2, 2, 5, 5));
gui.add(inputPanel, BorderLayout.CENTER);
inputPanel.add(new JLabel("Length direction: "));
final JTextField nLengthField = new JTextField("" + r.getNSectionLength());
inputPanel.add(nLengthField);
inputPanel.add(new JLabel("Width direction: "));
final JTextField nWidthField = new JTextField("" + r.getNSectionWidth());
inputPanel.add(nWidthField);
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
final JPanel scopePanel = new JPanel();
scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
scopePanel.add(rb1);
scopePanel.add(rb2);
scopePanel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
gui.add(scopePanel, BorderLayout.NORTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { "Set mesh for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Mesh");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
int nSectionLength = 0, nSectionWidth = 0;
boolean ok = true;
try {
nSectionLength = Integer.parseInt(nLengthField.getText());
nSectionWidth = Integer.parseInt(nWidthField.getText());
} catch (final NumberFormatException nfe) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (nSectionLength < 4) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Sections in the direction of length must be at least 4.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (nSectionWidth < 4) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Sections in the direction of width must be at least 4.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (!Util.isPowerOfTwo(nSectionLength) || !Util.isPowerOfTwo(nSectionWidth)) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Numbers of mesh sections must be power of two.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
if (rb1.isSelected()) {
r.setNSectionLength(nSectionLength);
r.setNSectionWidth(nSectionWidth);
r.draw();
SceneManager.getInstance().refresh();
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
foundation.setSectionsForFresnelReflectors(nSectionLength, nSectionWidth);
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
Scene.getInstance().setSectionsForAllFresnelReflectors(nSectionLength, nSectionWidth);
selectedScopeIndex = 2;
}
updateAfterEdit();
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JCheckBoxMenuItem cbmiDisableEditPoints = new JCheckBoxMenuItem("Disable Edit Points");
cbmiDisableEditPoints.addItemListener(new ItemListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void itemStateChanged(final ItemEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final boolean disabled = cbmiDisableEditPoints.isSelected();
final FresnelReflector r = (FresnelReflector) selectedPart;
final String partInfo = r.toString().substring(0, r.toString().indexOf(')') + 1);
final JPanel gui = new JPanel(new BorderLayout(0, 20));
final JPanel panel = new JPanel();
gui.add(panel, BorderLayout.SOUTH);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
final String title = "<html>" + (disabled ? "Disable" : "Enable") + " edit points for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>Disable the edit points of a Fresnel reflector prevents it<br>from being unintentionally moved.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[0]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), (disabled ? "Disable" : "Enable") + " Edit Points");
dialog.setVisible(true);
if (optionPane.getValue() == options[0]) {
if (rb1.isSelected()) {
final LockEditPointsCommand c = new LockEditPointsCommand(r);
r.setLockEdit(disabled);
SceneManager.getInstance().getUndoManager().addEdit(c);
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = r.getTopContainer();
final LockEditPointsOnFoundationCommand c = new LockEditPointsOnFoundationCommand(foundation, r.getClass());
foundation.setLockEditForClass(disabled, r.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
final LockEditPointsForClassCommand c = new LockEditPointsForClassCommand(r);
Scene.getInstance().setLockEditForClass(disabled, r.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
selectedScopeIndex = 2;
}
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
}
});
final JCheckBoxMenuItem cbmiDrawBeam = new JCheckBoxMenuItem("Draw Sun Beam");
cbmiDrawBeam.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
final ShowSunBeamCommand c = new ShowSunBeamCommand(r);
r.setSunBeamVisible(cbmiDrawBeam.isSelected());
r.drawSunBeam();
r.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
}
});
final JMenuItem miSetAbsorber = new JMenuItem("Set Absorber...");
miSetAbsorber.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
final String partInfo = r.toString().substring(0, r.toString().indexOf(')') + 1);
final JPanel gui = new JPanel(new BorderLayout(0, 20));
final JPanel panel = new JPanel();
gui.add(panel, BorderLayout.SOUTH);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
final List<Foundation> foundations = Scene.getInstance().getAllFoundations();
final JComboBox<String> comboBox = new JComboBox<String>();
comboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
}
});
comboBox.addItem("None");
for (final Foundation x : foundations) {
if (!x.getChildren().isEmpty()) {
comboBox.addItem(x.getId() + "");
}
}
if (r.getReceiver() != null) {
comboBox.setSelectedItem(r.getReceiver().getId() + "");
}
gui.add(comboBox, BorderLayout.CENTER);
final String title = "<html>Select the ID of the absorber<br>foundation for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>The sunlight reflected by this Fresnel reflector will<br>focus on the top of the target, where the absorber<br>tube is located.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Absorber");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
Foundation absorber = null;
if (comboBox.getSelectedIndex() > 0) {
int id = -1;
boolean ok = true;
try {
id = Integer.parseInt((String) comboBox.getSelectedItem());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), comboBox.getSelectedItem() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
final HousePart p = Scene.getInstance().getPart(id);
if (p instanceof Foundation) {
absorber = (Foundation) p;
} else {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "ID must be that of a foundation.", "ID Error", JOptionPane.ERROR_MESSAGE);
}
}
}
boolean changed = absorber != r.getReceiver();
if (rb1.isSelected()) {
if (changed) {
final Foundation oldTarget = r.getReceiver();
final ChangeFresnelReflectorAbsorberCommand c = new ChangeFresnelReflectorAbsorberCommand(r);
r.setReceiver(absorber);
r.draw();
if (oldTarget != null) {
oldTarget.drawSolarReceiver();
}
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = r.getTopContainer();
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (x.getReceiver() != absorber) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationFresnelReflectorAbsorberCommand c = new ChangeFoundationFresnelReflectorAbsorberCommand(foundation);
foundation.setAbsorberForFresnelReflectors(absorber);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (x.getReceiver() != absorber) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeAbsorberForAllFresnelReflectorsCommand c = new ChangeAbsorberForAllFresnelReflectorsCommand();
Scene.getInstance().setAbsorberForAllFresnelReflectors(absorber);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
if (absorber != null) {
absorber.drawSolarReceiver();
}
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final JMenuItem miLength = new JMenuItem("Length...");
miLength.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
final Foundation foundation = r.getTopContainer();
final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final JPanel gui = new JPanel(new BorderLayout());
final JPanel inputPanel = new JPanel(new GridLayout(1, 2, 5, 5));
gui.add(inputPanel, BorderLayout.CENTER);
inputPanel.add(new JLabel("Length: "));
final JTextField lengthField = new JTextField(threeDecimalsFormat.format(r.getLength()));
inputPanel.add(lengthField);
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
final JPanel scopePanel = new JPanel();
scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
scopePanel.add(rb1);
scopePanel.add(rb2);
scopePanel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
gui.add(scopePanel, BorderLayout.NORTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { "Set length for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Length");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double length = 0;
boolean ok = true;
try {
length = Double.parseDouble(lengthField.getText());
} catch (final NumberFormatException x) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (length < 1 || length > 1000) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Length must be between 1 and 1000 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = length != r.getLength();
if (rb1.isSelected()) {
if (changed) {
final SetPartSizeCommand c = new SetPartSizeCommand(r);
r.setLength(length);
r.ensureFullModules(false);
r.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (x.getLength() != length) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForFresnelReflectorsOnFoundationCommand c = new SetSizeForFresnelReflectorsOnFoundationCommand(foundation);
foundation.setLengthForFresnelReflectors(length);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (x.getLength() != length) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForAllFresnelReflectorsCommand c = new SetSizeForAllFresnelReflectorsCommand();
Scene.getInstance().setLengthForAllFresnelReflectors(length);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miModuleWidth = new JMenuItem("Module Width...");
miModuleWidth.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
final Foundation foundation = r.getTopContainer();
final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final JPanel gui = new JPanel(new BorderLayout());
final JPanel inputPanel = new JPanel(new GridLayout(1, 2, 5, 5));
gui.add(inputPanel, BorderLayout.CENTER);
inputPanel.add(new JLabel("Module Width: "));
final JTextField moduleWidthField = new JTextField(threeDecimalsFormat.format(r.getModuleWidth()));
inputPanel.add(moduleWidthField);
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
final JPanel scopePanel = new JPanel();
scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
scopePanel.add(rb1);
scopePanel.add(rb2);
scopePanel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
gui.add(scopePanel, BorderLayout.NORTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { "Set module width for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Module Width");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double moduleWidth = 0;
boolean ok = true;
try {
moduleWidth = Double.parseDouble(moduleWidthField.getText());
} catch (final NumberFormatException x) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (moduleWidth < 0.1 || moduleWidth > 20) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Module width must be between 0.1 and 20 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = moduleWidth != r.getModuleWidth();
if (rb1.isSelected()) {
if (changed) {
final SetPartSizeCommand c = new SetPartSizeCommand(r);
r.setModuleWidth(moduleWidth);
r.ensureFullModules(false);
r.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (x.getModuleWidth() != moduleWidth) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForFresnelReflectorsOnFoundationCommand c = new SetSizeForFresnelReflectorsOnFoundationCommand(foundation);
foundation.setModuleWidthForFresnelReflectors(moduleWidth);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (x.getModuleWidth() != moduleWidth) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForAllFresnelReflectorsCommand c = new SetSizeForAllFresnelReflectorsCommand();
Scene.getInstance().setModuleWidthForAllFresnelReflectors(moduleWidth);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miModuleLength = new JMenuItem("Module Length...");
miModuleLength.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
final Foundation foundation = r.getTopContainer();
final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final JPanel gui = new JPanel(new BorderLayout());
final JPanel inputPanel = new JPanel(new GridLayout(1, 2, 5, 5));
gui.add(inputPanel, BorderLayout.CENTER);
inputPanel.add(new JLabel("Module Length: "));
final JTextField moduleLengthField = new JTextField(threeDecimalsFormat.format(r.getModuleLength()));
inputPanel.add(moduleLengthField);
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
final JPanel scopePanel = new JPanel();
scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
scopePanel.add(rb1);
scopePanel.add(rb2);
scopePanel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
gui.add(scopePanel, BorderLayout.NORTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { "Set module length for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Module Length");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double moduleLength = 0;
boolean ok = true;
try {
moduleLength = Double.parseDouble(moduleLengthField.getText());
} catch (final NumberFormatException x) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (moduleLength < 1 || moduleLength > 100) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Module length must be between 1 and 100 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = moduleLength != r.getModuleLength();
if (rb1.isSelected()) {
if (changed) {
final SetPartSizeCommand c = new SetPartSizeCommand(r);
r.setModuleLength(moduleLength);
r.ensureFullModules(false);
r.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (x.getModuleLength() != moduleLength) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForFresnelReflectorsOnFoundationCommand c = new SetSizeForFresnelReflectorsOnFoundationCommand(foundation);
foundation.setModuleLengthForFresnelReflectors(moduleLength);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (x.getModuleLength() != moduleLength) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForAllFresnelReflectorsCommand c = new SetSizeForAllFresnelReflectorsCommand();
Scene.getInstance().setModuleLengthForAllFresnelReflectors(moduleLength);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miBaseHeight = new JMenuItem("Base Height...");
miBaseHeight.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final FresnelReflector r = (FresnelReflector) selectedPart;
final Foundation foundation = r.getTopContainer();
final String title = "<html>Base Height (m) of " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JPanel panel = new JPanel();
gui.add(panel, BorderLayout.CENTER);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(r.getBaseHeight() * Scene.getInstance().getAnnotationScale()));
gui.add(inputField, BorderLayout.SOUTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Base Height");
while (true) {
inputField.selectAll();
inputField.requestFocusInWindow();
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double val = 0;
boolean ok = true;
try {
val = Double.parseDouble(inputField.getText()) / Scene.getInstance().getAnnotationScale();
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
boolean changed = val != r.getBaseHeight();
if (rb1.isSelected()) {
if (changed) {
final ChangeBaseHeightCommand c = new ChangeBaseHeightCommand(r);
r.setBaseHeight(val);
r.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (x.getBaseHeight() != val) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationSolarCollectorBaseHeightCommand c = new ChangeFoundationSolarCollectorBaseHeightCommand(foundation, r.getClass());
foundation.setBaseHeightForFresnelReflectors(val);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (x.getBaseHeight() != val) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeBaseHeightForAllSolarCollectorsCommand c = new ChangeBaseHeightForAllSolarCollectorsCommand(r.getClass());
Scene.getInstance().setBaseHeightForAllFresnelReflectors(val);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
});
final JMenuItem miAzimuth = new JMenuItem("Azimuth...");
miAzimuth.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final FresnelReflector fresnel = (FresnelReflector) selectedPart;
final Foundation foundation = fresnel.getTopContainer();
final String title = "<html>Azimuth Angle (°) of " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>The azimuth angle is measured clockwise from the true north.<hr></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JPanel panel = new JPanel();
gui.add(panel, BorderLayout.CENTER);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
double a = fresnel.getRelativeAzimuth() + foundation.getAzimuth();
if (a > 360) {
a -= 360;
}
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(a));
gui.add(inputField, BorderLayout.SOUTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Azimuth");
while (true) {
inputField.selectAll();
inputField.requestFocusInWindow();
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double val = 0;
boolean ok = true;
try {
val = Double.parseDouble(inputField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
a = val - foundation.getAzimuth();
if (a < 0) {
a += 360;
}
boolean changed = Math.abs(a - fresnel.getRelativeAzimuth()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeAzimuthCommand c = new ChangeAzimuthCommand(fresnel);
fresnel.setRelativeAzimuth(a);
fresnel.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (Math.abs(a - x.getRelativeAzimuth()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationFresnelReflectorAzimuthCommand c = new ChangeFoundationFresnelReflectorAzimuthCommand(foundation);
foundation.setAzimuthForParabolicFresnelReflectors(a);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final ParabolicTrough x : Scene.getInstance().getAllParabolicTroughs()) {
if (Math.abs(a - x.getRelativeAzimuth()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeAzimuthForAllFresnelReflectorsCommand c = new ChangeAzimuthForAllFresnelReflectorsCommand();
Scene.getInstance().setAzimuthForAllFresnelReflectors(a);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
});
final JMenu labelMenu = new JMenu("Label");
final JCheckBoxMenuItem miLabelNone = new JCheckBoxMenuItem("None", true);
miLabelNone.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (miLabelNone.isSelected()) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof FresnelReflector) {
final FresnelReflector r = (FresnelReflector) selectedPart;
final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
r.clearLabels();
r.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
}
});
labelMenu.add(miLabelNone);
final JCheckBoxMenuItem miLabelCustom = new JCheckBoxMenuItem("Custom");
miLabelCustom.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof FresnelReflector) {
final FresnelReflector r = (FresnelReflector) selectedPart;
final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
r.setLabelCustom(miLabelCustom.isSelected());
if (r.getLabelCustom()) {
r.setLabelCustomText(JOptionPane.showInputDialog(MainFrame.getInstance(), "Custom Text", r.getLabelCustomText()));
}
r.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelCustom);
final JCheckBoxMenuItem miLabelId = new JCheckBoxMenuItem("ID");
miLabelId.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof FresnelReflector) {
final FresnelReflector r = (FresnelReflector) selectedPart;
final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
r.setLabelId(miLabelId.isSelected());
r.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelId);
final JCheckBoxMenuItem miLabelEnergyOutput = new JCheckBoxMenuItem("Energy Output");
miLabelEnergyOutput.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof FresnelReflector) {
final FresnelReflector r = (FresnelReflector) selectedPart;
final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
r.setLabelEnergyOutput(miLabelEnergyOutput.isSelected());
r.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelEnergyOutput);
popupMenuForFresnelReflector = createPopupMenu(true, true, new Runnable() {
@Override
public void run() {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
Util.selectSilently(cbmiDisableEditPoints, r.getLockEdit());
Util.selectSilently(cbmiDrawBeam, r.isSunBeamVisible());
Util.selectSilently(miLabelNone, !r.isLabelVisible());
Util.selectSilently(miLabelCustom, r.getLabelCustom());
Util.selectSilently(miLabelId, r.getLabelId());
Util.selectSilently(miLabelEnergyOutput, r.getLabelEnergyOutput());
}
});
final JMenuItem miReflectance = new JMenuItem("Reflectance...");
miReflectance.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final FresnelReflector r = (FresnelReflector) selectedPart;
final String title = "<html>Reflectance (%) of " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>Reflectance can be affected by pollen and dust.<hr></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JPanel panel = new JPanel();
gui.add(panel, BorderLayout.CENTER);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(r.getReflectance() * 100));
gui.add(inputField, BorderLayout.SOUTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Reflectance");
while (true) {
inputField.selectAll();
inputField.requestFocusInWindow();
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double val = 0;
boolean ok = true;
try {
val = Double.parseDouble(inputField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (val < 50 || val > 99) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Fresnel reflector reflectance must be between 50% and 99%.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(val * 0.01 - r.getReflectance()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeSolarReflectorReflectanceCommand c = new ChangeSolarReflectorReflectanceCommand(r);
r.setReflectance(val * 0.01);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = r.getTopContainer();
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (Math.abs(x.getReflectance() - val * 0.01) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationSolarReflectorReflectanceCommand c = new ChangeFoundationSolarReflectorReflectanceCommand(foundation, r.getClass());
foundation.setReflectanceForSolarReflectors(val * 0.01, r.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (Math.abs(x.getReflectance() - val * 0.01) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeReflectanceForAllSolarReflectorsCommand c = new ChangeReflectanceForAllSolarReflectorsCommand(r.getClass());
Scene.getInstance().setReflectanceForAllSolarReflectors(val * 0.01, r.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miApertureRatio = new JMenuItem("Aperture Ratio...");
miApertureRatio.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final FresnelReflector r = (FresnelReflector) selectedPart;
final String title = "<html>Aperture percentage of " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>The percentage of the effective area for reflection<br>after deducting the area of gaps, frames, etc.<hr></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JPanel panel = new JPanel();
gui.add(panel, BorderLayout.CENTER);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
}
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(r.getOpticalEfficiency() * 100));
gui.add(inputField, BorderLayout.SOUTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Aperture Percentage of Fresnel Reflector Surface");
while (true) {
inputField.selectAll();
inputField.requestFocusInWindow();
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double val = 0;
boolean ok = true;
try {
val = Double.parseDouble(inputField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (val < 70 || val > 100) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Fresnel reflector aperature percentage must be between 70% and 100%.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(val * 0.01 - r.getOpticalEfficiency()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeSolarReflectorOpticalEfficiencyCommand c = new ChangeSolarReflectorOpticalEfficiencyCommand(r);
r.setOpticalEfficiency(val * 0.01);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = r.getTopContainer();
if (!changed) {
for (final FresnelReflector x : foundation.getFresnelReflectors()) {
if (Math.abs(val * 0.01 - x.getOpticalEfficiency()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationSolarReflectorOpticalEfficiencyCommand c = new ChangeFoundationSolarReflectorOpticalEfficiencyCommand(foundation, r.getClass());
foundation.setOpticalEfficiencyForSolarReflectors(val * 0.01, r.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (Math.abs(val * 0.01 - x.getOpticalEfficiency()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeOpticalEfficiencyForAllSolarReflectorsCommand c = new ChangeOpticalEfficiencyForAllSolarReflectorsCommand(r.getClass());
Scene.getInstance().setOpticalEfficiencyForAllSolarReflectors(val * 0.01, r.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miConversionEfficiency = new JMenuItem("Absorber Conversion Efficiency...");
miConversionEfficiency.addActionListener(new ActionListener() {
// remember the scope selection as the next action will likely be applied to the same scope
private int selectedScopeIndex = 0;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof FresnelReflector)) {
return;
}
final FresnelReflector r = (FresnelReflector) selectedPart;
final Foundation absorber = r.getReceiver();
if (absorber == null) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This reflector does not link to an absorber.", "No Absorber", JOptionPane.ERROR_MESSAGE);
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final String title = "<html>Light-electricity conversion efficiency (%) of " + partInfo + "'s absorber</html>";
final String footnote = "<html><hr><font size=2><hr></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JPanel panel = new JPanel();
gui.add(panel, BorderLayout.CENTER);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector's Absorber", true);
final JRadioButton rb2 = new JRadioButton("All Fresnel Reflector Absorbers");
panel.add(rb1);
panel.add(rb2);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
}
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(absorber.getSolarReceiverEfficiency() * 100));
gui.add(inputField, BorderLayout.SOUTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Receiver Conversion Efficiency");
while (true) {
inputField.selectAll();
inputField.requestFocusInWindow();
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double val = 0;
boolean ok = true;
try {
val = Double.parseDouble(inputField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (val < 5 || val > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Light-electricity conversion efficiency must be between 5% and 50%.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(val * 0.01 - absorber.getSolarReceiverEfficiency()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeSolarReceiverEfficiencyCommand c = new ChangeSolarReceiverEfficiencyCommand(absorber);
absorber.setSolarReceiverEfficiency(val * 0.01);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
if (Math.abs(val * 0.01 - x.getReceiver().getSolarReceiverEfficiency()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeSolarReceiverEfficiencyForAllReflectorsCommand c = new ChangeSolarReceiverEfficiencyForAllReflectorsCommand(r.getClass());
Scene.getInstance().setSolarReceiverEfficiencyForAllSolarReflectors(val * 0.01, r.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
popupMenuForFresnelReflector.addSeparator();
popupMenuForFresnelReflector.add(miSetAbsorber);
popupMenuForFresnelReflector.addSeparator();
popupMenuForFresnelReflector.add(cbmiDisableEditPoints);
popupMenuForFresnelReflector.add(cbmiDrawBeam);
popupMenuForFresnelReflector.add(labelMenu);
popupMenuForFresnelReflector.addSeparator();
popupMenuForFresnelReflector.add(miLength);
popupMenuForFresnelReflector.add(miModuleWidth);
popupMenuForFresnelReflector.add(miModuleLength);
popupMenuForFresnelReflector.add(miBaseHeight);
popupMenuForFresnelReflector.add(miAzimuth);
popupMenuForFresnelReflector.addSeparator();
popupMenuForFresnelReflector.add(miReflectance);
popupMenuForFresnelReflector.add(miApertureRatio);
popupMenuForFresnelReflector.add(miConversionEfficiency);
popupMenuForFresnelReflector.addSeparator();
popupMenuForFresnelReflector.add(miMesh);
popupMenuForFresnelReflector.addSeparator();
JMenuItem mi = new JMenuItem("Daily Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof FresnelReflector) {
new FresnelReflectorDailyAnalysis().show();
}
}
});
popupMenuForFresnelReflector.add(mi);
mi = new JMenuItem("Annual Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof FresnelReflector) {
new FresnelReflectorAnnualAnalysis().show();
}
}
});
popupMenuForFresnelReflector.add(mi);
}
return popupMenuForFresnelReflector;
}
use of org.concord.energy3d.simulation.FresnelReflectorDailyAnalysis in project energy3d by concord-consortium.
the class PopupMenuForFoundation method getPopupMenu.
static JPopupMenu getPopupMenu(final MouseEvent e) {
if (e.isShiftDown()) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() throws Exception {
Scene.getInstance().pasteToPickedLocationOnFoundation();
Scene.getInstance().setEdited(true);
return null;
}
});
return null;
}
if (popupMenuForFoundation == null) {
final JMenuItem miImportCollada = new JMenuItem("Import Collada...");
miImportCollada.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final File file = FileChooser.getInstance().showDialog(".dae", FileChooser.daeFilter, false);
if (file != null) {
EnergyPanel.getInstance().updateRadiationHeatMap();
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() throws Exception {
boolean success = true;
final Vector3 position = SceneManager.getInstance().getPickedLocationOnFoundation();
try {
((Foundation) selectedPart).importCollada(file.toURI().toURL(), position);
} catch (final Throwable t) {
BugReporter.report(t);
success = false;
}
if (success) {
SceneManager.getInstance().getUndoManager().addEdit(new AddNodeCommand((Foundation) selectedPart));
}
return null;
}
});
}
}
}
});
final JMenuItem miPaste = new JMenuItem("Paste");
miPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Config.isMac() ? KeyEvent.META_MASK : InputEvent.CTRL_MASK));
miPaste.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() throws Exception {
Scene.getInstance().pasteToPickedLocationOnFoundation();
Scene.getInstance().setEdited(true);
return null;
}
});
}
});
final JMenuItem miCopy = new JMenuItem("Copy");
miCopy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
Scene.getInstance().setCopyBuffer(selectedPart);
}
}
});
final JMenuItem miRescale = new JMenuItem("Rescale...");
miRescale.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof Foundation)) {
return;
}
new RescaleBuildingDialog((Foundation) selectedPart).setVisible(true);
Scene.getInstance().setEdited(true);
}
});
final JMenu rotateMenu = new JMenu("Rotate");
final JMenuItem mi180 = new JMenuItem("180\u00B0");
mi180.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getInstance().rotate(Math.PI);
Scene.getInstance().setEdited(true);
}
});
rotateMenu.add(mi180);
final JMenuItem mi90CW = new JMenuItem("90\u00B0 Clockwise");
mi90CW.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getInstance().rotate(-Math.PI / 2);
Scene.getInstance().setEdited(true);
}
});
rotateMenu.add(mi90CW);
final JMenuItem mi90CCW = new JMenuItem("90\u00B0 Counter Clockwise");
mi90CCW.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getInstance().rotate(Math.PI / 2);
Scene.getInstance().setEdited(true);
}
});
rotateMenu.add(mi90CCW);
rotateMenu.addSeparator();
final JMenuItem miArbitraryRotation = new JMenuItem("Arbitrary...");
rotateMenu.add(miArbitraryRotation);
miArbitraryRotation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof Foundation)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final String title = "<html>Rotate " + partInfo + " (°)</html>";
final String footnote = "<html><hr><font size=2>Rotate a foundation to any angle by degrees.<br>Note: By convention, the angle for counter-wise<br>rotation (e.g., from north to west) is positive.<hr></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JTextField inputField = new JTextField("0");
gui.add(inputField, BorderLayout.SOUTH);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Rotation Angle (\u00B0)");
while (true) {
inputField.selectAll();
inputField.requestFocusInWindow();
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
double a = 0;
try {
a = Double.parseDouble(inputField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (!Util.isZero(a)) {
SceneManager.getInstance().rotate(Math.toRadians(a));
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
});
final JMenu clearMenu = new JMenu("Clear");
final JMenuItem miRemoveAllWalls = new JMenuItem("Remove All Walls");
miRemoveAllWalls.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllWalls();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllWalls);
final JMenuItem miRemoveAllWindows = new JMenuItem("Remove All Windows");
miRemoveAllWindows.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllWindows();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllWindows);
final JMenuItem miRemoveAllWindowShutters = new JMenuItem("Remove All Window Shutters");
miRemoveAllWindowShutters.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllWindowShutters();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllWindowShutters);
final JMenuItem miRemoveAllSolarPanels = new JMenuItem("Remove All Solar Panels");
miRemoveAllSolarPanels.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllSolarPanels(null);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllSolarPanels);
final JMenuItem miRemoveAllRacks = new JMenuItem("Remove All Solar Panel Racks");
miRemoveAllRacks.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllRacks();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllRacks);
final JMenuItem miRemoveAllHeliostats = new JMenuItem("Remove All Heliostats");
miRemoveAllHeliostats.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllHeliostats();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllHeliostats);
final JMenuItem miRemoveAllParabolicTroughs = new JMenuItem("Remove All Parabolic Troughs");
miRemoveAllParabolicTroughs.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllParabolicTroughs();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllParabolicTroughs);
final JMenuItem miRemoveAllParabolicDishes = new JMenuItem("Remove All Parabolic Dishes");
miRemoveAllParabolicDishes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllParabolicDishes();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllParabolicDishes);
final JMenuItem miRemoveAllFresnelReflectors = new JMenuItem("Remove All Fresnel Reflectors");
miRemoveAllFresnelReflectors.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllFresnelReflectors();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllFresnelReflectors);
final JMenuItem miRemoveAllSensors = new JMenuItem("Remove All Sensors");
miRemoveAllSensors.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllSensors();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllSensors);
final JMenuItem removeAllFloorsMenuItem = new JMenuItem("Remove All Floors");
removeAllFloorsMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllFloors();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(removeAllFloorsMenuItem);
final JMenuItem miRemoveAllImportedNodes = new JMenuItem("Remove All Nodes");
miRemoveAllImportedNodes.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
f.removeAllImports();
f.setMeshSelectionVisible(false);
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
}
return null;
}
});
}
});
clearMenu.add(miRemoveAllImportedNodes);
final JMenuItem miRemoveAllWithinInset = new JMenuItem("Remove All Objects within Inset");
miRemoveAllWithinInset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof Foundation)) {
return;
}
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
((Foundation) selectedPart).removeAllWithinPolygon();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MainPanel.getInstance().getEnergyButton().setSelected(false);
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miRemoveAllWithinInset);
final JMenuItem miResetPolygonInset = new JMenuItem("Reset Inset");
miResetPolygonInset.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof Foundation)) {
return;
}
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
((Foundation) selectedPart).resetPolygon();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Scene.getInstance().setEdited(true);
}
});
return null;
}
});
}
});
clearMenu.add(miResetPolygonInset);
final JMenu layoutMenu = new JMenu("Layout");
final JMenuItem miSolarPanelArrays = new JMenuItem("Solar Panel Arrays...");
layoutMenu.add(miSolarPanelArrays);
miSolarPanelArrays.addActionListener(new ActionListener() {
private Foundation f;
private JComboBox<String> modelComboBox;
private JComboBox<String> cellTypeComboBox;
private JComboBox<String> colorOptionComboBox;
private JComboBox<String> sizeComboBox;
private JComboBox<String> shadeToleranceComboBox;
private JComboBox<String> orientationComboBox;
private JComboBox<String> rowAxisComboBox;
private JTextField cellEfficiencyField;
private JTextField noctField;
private JTextField pmaxTcField;
private int numberOfCellsInX = 6;
private int numberOfCellsInY = 10;
private void enableSettings(final boolean b) {
sizeComboBox.setEnabled(b);
cellTypeComboBox.setEnabled(b);
colorOptionComboBox.setEnabled(b);
shadeToleranceComboBox.setEnabled(b);
cellEfficiencyField.setEnabled(b);
noctField.setEnabled(b);
pmaxTcField.setEnabled(b);
}
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
f = (Foundation) selectedPart;
int n = f.countParts(SolarPanel.class);
if (n > 0 && JOptionPane.showConfirmDialog(MainFrame.getInstance(), "All existing " + n + " solar panels on this foundation must be removed before\na new layout can be applied. Do you want to continue?", "Confirmation", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
return;
}
n = f.countParts(Rack.class);
if (n > 0 && JOptionPane.showConfirmDialog(MainFrame.getInstance(), "All existing " + n + " solar panel racks on this foundation must be removed before\na new layout can be applied. Do you want to continue?", "Confirmation", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
return;
}
final JPanel panel = new JPanel(new SpringLayout());
final Map<String, PvModuleSpecs> modules = PvModulesData.getInstance().getModules();
final String[] models = new String[modules.size() + 1];
int j = 0;
models[j] = "Custom";
for (final String key : modules.keySet()) {
models[++j] = key;
}
panel.add(new JLabel("Model:"));
modelComboBox = new JComboBox<String>(models);
modelComboBox.setSelectedItem(solarPanelModel);
modelComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final boolean isCustom = modelComboBox.getSelectedIndex() == 0;
enableSettings(isCustom);
if (!isCustom) {
final PvModuleSpecs specs = modules.get(modelComboBox.getSelectedItem());
cellTypeComboBox.setSelectedItem(specs.getCellType());
shadeToleranceComboBox.setSelectedItem(specs.getShadeTolerance());
cellEfficiencyField.setText(threeDecimalsFormat.format(specs.getCelLEfficiency() * 100));
noctField.setText(threeDecimalsFormat.format(specs.getNoct()));
pmaxTcField.setText(sixDecimalsFormat.format(specs.getPmaxTc()));
final String s = threeDecimalsFormat.format(specs.getNominalWidth()) + "m \u00D7 " + threeDecimalsFormat.format(specs.getNominalLength()) + "m (" + specs.getLayout().width + " \u00D7 " + specs.getLayout().height + " cells)";
sizeComboBox.setSelectedItem(s);
colorOptionComboBox.setSelectedItem(specs.getColor());
}
}
}
});
panel.add(modelComboBox);
panel.add(new JLabel("Cell Type:"));
cellTypeComboBox = new JComboBox<String>(new String[] { "Polycrystalline", "Monocrystalline", "Thin Film" });
cellTypeComboBox.setSelectedIndex(solarPanelCellType);
panel.add(cellTypeComboBox);
panel.add(new JLabel("Color:"));
colorOptionComboBox = new JComboBox<String>(new String[] { "Blue", "Black", "Gray" });
colorOptionComboBox.setSelectedIndex(solarPanelColorOption);
panel.add(colorOptionComboBox);
panel.add(new JLabel("Size:"));
sizeComboBox = new JComboBox<String>(solarPanelNominalSize.getStrings());
final int nItems = sizeComboBox.getItemCount();
for (int i = 0; i < nItems; i++) {
if (Util.isZero(solarPanelHeight - solarPanelNominalSize.getNominalHeights()[i]) && Util.isZero(solarPanelWidth - solarPanelNominalSize.getNominalWidths()[i])) {
sizeComboBox.setSelectedIndex(i);
}
}
panel.add(sizeComboBox);
panel.add(new JLabel("Solar Cell Efficiency (%):"));
cellEfficiencyField = new JTextField(threeDecimalsFormat.format(solarCellEfficiencyPercentage));
panel.add(cellEfficiencyField);
panel.add(new JLabel("<html>Nominal Operating Cell Temperature (°C):"));
noctField = new JTextField(threeDecimalsFormat.format(solarPanelNominalOperatingCellTemperature));
panel.add(noctField);
panel.add(new JLabel("<html>Temperature Coefficient of Pmax (%/°C):"));
pmaxTcField = new JTextField(sixDecimalsFormat.format(solarPanelTemperatureCoefficientPmaxPercentage));
panel.add(pmaxTcField);
panel.add(new JLabel("Shade Tolerance:"));
shadeToleranceComboBox = new JComboBox<String>(new String[] { "Partial", "High", "None" });
shadeToleranceComboBox.setSelectedIndex(solarPanelShadeTolerance);
panel.add(shadeToleranceComboBox);
panel.add(new JLabel("Inverter Efficiency (%):"));
final JTextField inverterEfficiencyField = new JTextField(threeDecimalsFormat.format(inverterEfficiencyPercentage));
panel.add(inverterEfficiencyField);
panel.add(new JLabel("Tile Angle (\u00B0):"));
final JTextField tiltAngleField = new JTextField(threeDecimalsFormat.format(solarPanelTiltAngle));
panel.add(tiltAngleField);
panel.add(new JLabel("Orientation:"));
orientationComboBox = new JComboBox<String>(new String[] { "Portrait", "Landscape" });
orientationComboBox.setSelectedIndex(solarPanelOrientation);
panel.add(orientationComboBox);
panel.add(new JLabel("Row Axis:"));
rowAxisComboBox = new JComboBox<String>(new String[] { "North-South", "East-West" });
rowAxisComboBox.setSelectedIndex(solarPanelArrayRowAxis);
panel.add(rowAxisComboBox);
panel.add(new JLabel("Row Spacing (m):"));
final JTextField rowSpacingField = new JTextField(threeDecimalsFormat.format(solarPanelArrayRowSpacing));
panel.add(rowSpacingField);
panel.add(new JLabel("Column Spacing (m):"));
final JTextField colSpacingField = new JTextField(threeDecimalsFormat.format(solarPanelArrayColSpacing));
panel.add(colSpacingField);
panel.add(new JLabel("Base Height (m):"));
final JTextField baseHeightField = new JTextField(threeDecimalsFormat.format(solarPanelArrayBaseHeight));
panel.add(baseHeightField);
SpringUtilities.makeCompactGrid(panel, 15, 2, 6, 6, 6, 6);
enableSettings(modelComboBox.getSelectedIndex() == 0);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Solar Panel Array Options");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
try {
solarPanelArrayRowSpacing = Double.parseDouble(rowSpacingField.getText());
solarPanelArrayColSpacing = Double.parseDouble(colSpacingField.getText());
solarPanelArrayBaseHeight = Double.parseDouble(baseHeightField.getText());
solarPanelTiltAngle = Double.parseDouble(tiltAngleField.getText());
solarCellEfficiencyPercentage = Double.parseDouble(cellEfficiencyField.getText());
inverterEfficiencyPercentage = Double.parseDouble(inverterEfficiencyField.getText());
solarPanelTemperatureCoefficientPmaxPercentage = Double.parseDouble(pmaxTcField.getText());
solarPanelNominalOperatingCellTemperature = Double.parseDouble(noctField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
final int i = sizeComboBox.getSelectedIndex();
solarPanelWidth = solarPanelNominalSize.getNominalWidths()[i];
solarPanelHeight = solarPanelNominalSize.getNominalHeights()[i];
numberOfCellsInX = solarPanelNominalSize.getCellNx()[i];
numberOfCellsInY = solarPanelNominalSize.getCellNy()[i];
solarPanelOrientation = orientationComboBox.getSelectedIndex();
if (solarPanelArrayRowSpacing < (solarPanelOrientation == 0 ? solarPanelHeight : solarPanelWidth) || solarPanelArrayColSpacing < (solarPanelOrientation == 0 ? solarPanelWidth : solarPanelHeight)) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar panel row or column spacing is too small.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelArrayBaseHeight < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar panel base height can't be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelTiltAngle < -90 || solarPanelTiltAngle > 90) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar panel tilt angle must be between -90\u00B0 and 90\u00B0.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (Math.abs(0.5 * (solarPanelOrientation == 0 ? solarPanelHeight : solarPanelWidth) * Math.sin(Math.toRadians(solarPanelTiltAngle))) > solarPanelArrayBaseHeight) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar panels intersect with ground.", "Geometry Error", JOptionPane.ERROR_MESSAGE);
} else if (solarCellEfficiencyPercentage < SolarPanel.MIN_SOLAR_CELL_EFFICIENCY_PERCENTAGE || solarCellEfficiencyPercentage > SolarPanel.MAX_SOLAR_CELL_EFFICIENCY_PERCENTAGE) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar cell efficiency must be between " + SolarPanel.MIN_SOLAR_CELL_EFFICIENCY_PERCENTAGE + "% and " + SolarPanel.MAX_SOLAR_CELL_EFFICIENCY_PERCENTAGE + "%.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (inverterEfficiencyPercentage < SolarPanel.MIN_INVERTER_EFFICIENCY_PERCENTAGE || inverterEfficiencyPercentage >= SolarPanel.MAX_INVERTER_EFFICIENCY_PERCENTAGE) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Inverter efficiency must be greater than " + SolarPanel.MIN_INVERTER_EFFICIENCY_PERCENTAGE + "% and less than " + SolarPanel.MAX_INVERTER_EFFICIENCY_PERCENTAGE + "%.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelTemperatureCoefficientPmaxPercentage < -1 || solarPanelTemperatureCoefficientPmaxPercentage > 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Temperature coefficient of Pmax must be between -1% and 0% per Celsius degree.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelNominalOperatingCellTemperature < 33 || solarPanelNominalOperatingCellTemperature > 58) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Nominal operating cell temperature must be between 33 and 58 Celsius degree.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
addSolarPanelArrays();
if (choice == options[0]) {
break;
}
}
}
}
}
}
}
private void addSolarPanelArrays() {
solarPanelArrayRowAxis = rowAxisComboBox.getSelectedIndex();
solarPanelShadeTolerance = shadeToleranceComboBox.getSelectedIndex();
solarPanelColorOption = colorOptionComboBox.getSelectedIndex();
solarPanelCellType = cellTypeComboBox.getSelectedIndex();
solarPanelModel = (String) modelComboBox.getSelectedItem();
final SolarPanel sp = new SolarPanel();
sp.setModelName((String) modelComboBox.getSelectedItem());
sp.setRotated(solarPanelOrientation == 1);
sp.setCellType(solarPanelCellType);
sp.setColorOption(solarPanelColorOption);
sp.setTiltAngle(solarPanelTiltAngle);
sp.setPanelWidth(solarPanelWidth);
sp.setPanelHeight(solarPanelHeight);
sp.setNumberOfCellsInX(numberOfCellsInX);
sp.setNumberOfCellsInY(numberOfCellsInY);
sp.setBaseHeight(solarPanelArrayBaseHeight / Scene.getInstance().getAnnotationScale());
sp.setShadeTolerance(solarPanelShadeTolerance);
sp.setCellEfficiency(solarCellEfficiencyPercentage * 0.01);
sp.setInverterEfficiency(inverterEfficiencyPercentage * 0.01);
sp.setTemperatureCoefficientPmax(solarPanelTemperatureCoefficientPmaxPercentage * 0.01);
sp.setNominalOperatingCellTemperature(solarPanelNominalOperatingCellTemperature);
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
f.addSolarPanelArrays(sp, solarPanelArrayRowSpacing, solarPanelArrayColSpacing, solarPanelArrayRowAxis);
return null;
}
});
updateAfterEdit();
}
});
final JMenuItem miSolarRackArrays = new JMenuItem("Solar Panel Rack Arrays...");
layoutMenu.add(miSolarRackArrays);
miSolarRackArrays.addActionListener(new ActionListener() {
private Foundation foundation;
private JComboBox<String> modelComboBox;
private JComboBox<String> orientationComboBox;
private JComboBox<String> sizeComboBox;
private JComboBox<String> cellTypeComboBox;
private JComboBox<String> colorOptionComboBox;
private JComboBox<String> shadeToleranceComboBox;
private JComboBox<String> rowAxisComboBox;
private JTextField cellEfficiencyField;
private JTextField noctField;
private JTextField pmaxTcField;
private int numberOfCellsInX = 6;
private int numberOfCellsInY = 10;
private void enableSettings(final boolean b) {
sizeComboBox.setEnabled(b);
cellTypeComboBox.setEnabled(b);
colorOptionComboBox.setEnabled(b);
shadeToleranceComboBox.setEnabled(b);
cellEfficiencyField.setEnabled(b);
noctField.setEnabled(b);
pmaxTcField.setEnabled(b);
}
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
foundation = (Foundation) selectedPart;
int n = foundation.countParts(Rack.class);
if (n > 0 && JOptionPane.showConfirmDialog(MainFrame.getInstance(), "All existing " + n + " solar panel racks on this foundation must be removed before\na new layout can be applied. Do you want to continue?", "Confirmation", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
return;
}
n = foundation.countParts(SolarPanel.class);
if (n > 0 && JOptionPane.showConfirmDialog(MainFrame.getInstance(), "All existing " + n + " solar panels on this foundation must be removed before\na new layout can be applied. Do you want to continue?", "Confirmation", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
return;
}
final JPanel panel = new JPanel(new SpringLayout());
final Map<String, PvModuleSpecs> modules = PvModulesData.getInstance().getModules();
final String[] models = new String[modules.size() + 1];
int j = 0;
models[j] = "Custom";
for (final String key : modules.keySet()) {
models[++j] = key;
}
panel.add(new JLabel("Solar Panel Model:"));
modelComboBox = new JComboBox<String>(models);
modelComboBox.setSelectedItem(solarPanelModel);
modelComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final boolean isCustom = modelComboBox.getSelectedIndex() == 0;
enableSettings(isCustom);
if (!isCustom) {
final PvModuleSpecs specs = modules.get(modelComboBox.getSelectedItem());
cellTypeComboBox.setSelectedItem(specs.getCellType());
shadeToleranceComboBox.setSelectedItem(specs.getShadeTolerance());
cellEfficiencyField.setText(threeDecimalsFormat.format(specs.getCelLEfficiency() * 100));
noctField.setText(threeDecimalsFormat.format(specs.getNoct()));
pmaxTcField.setText(sixDecimalsFormat.format(specs.getPmaxTc()));
final String s = threeDecimalsFormat.format(specs.getNominalWidth()) + "m \u00D7 " + threeDecimalsFormat.format(specs.getNominalLength()) + "m (" + specs.getLayout().width + " \u00D7 " + specs.getLayout().height + " cells)";
sizeComboBox.setSelectedItem(s);
colorOptionComboBox.setSelectedItem(specs.getColor());
}
}
}
});
panel.add(modelComboBox);
panel.add(new JLabel("Solar Panel Cell Type:"));
cellTypeComboBox = new JComboBox<String>(new String[] { "Polycrystalline", "Monocrystalline", "Thin Film" });
cellTypeComboBox.setSelectedIndex(solarPanelCellType);
panel.add(cellTypeComboBox);
panel.add(new JLabel("Solar Panel Color:"));
colorOptionComboBox = new JComboBox<String>(new String[] { "Blue", "Black", "Gray" });
colorOptionComboBox.setSelectedIndex(solarPanelColorOption);
panel.add(colorOptionComboBox);
panel.add(new JLabel("Solar Panel Size:"));
sizeComboBox = new JComboBox<String>(solarPanelNominalSize.getStrings());
final int nItems = sizeComboBox.getItemCount();
for (int i = 0; i < nItems; i++) {
if (Util.isZero(solarPanelHeight - solarPanelNominalSize.getNominalHeights()[i]) && Util.isZero(solarPanelWidth - solarPanelNominalSize.getNominalWidths()[i])) {
sizeComboBox.setSelectedIndex(i);
}
}
panel.add(sizeComboBox);
panel.add(new JLabel("Solar Cell Efficiency (%):"));
cellEfficiencyField = new JTextField(threeDecimalsFormat.format(solarCellEfficiencyPercentage));
panel.add(cellEfficiencyField);
panel.add(new JLabel("<html>Nominal Operating Cell Temperature (°C):"));
noctField = new JTextField(threeDecimalsFormat.format(solarPanelNominalOperatingCellTemperature));
panel.add(noctField);
panel.add(new JLabel("<html>Temperature Coefficient of Pmax (%/°C):"));
pmaxTcField = new JTextField(sixDecimalsFormat.format(solarPanelTemperatureCoefficientPmaxPercentage));
panel.add(pmaxTcField);
panel.add(new JLabel("Shade Tolerance:"));
shadeToleranceComboBox = new JComboBox<String>(new String[] { "Partial", "High", "None" });
shadeToleranceComboBox.setSelectedIndex(solarPanelShadeTolerance);
panel.add(shadeToleranceComboBox);
panel.add(new JLabel("Inverter Efficiency (%):"));
final JTextField inverterEfficiencyField = new JTextField(threeDecimalsFormat.format(inverterEfficiencyPercentage));
panel.add(inverterEfficiencyField);
panel.add(new JLabel("Tile Angle (\u00B0):"));
final JTextField tiltAngleField = new JTextField(threeDecimalsFormat.format(solarPanelTiltAngle));
panel.add(tiltAngleField);
panel.add(new JLabel("Solar Panel Sub-Rows Per Rack:"));
final JTextField rowsPerRackField = new JTextField(threeDecimalsFormat.format(solarPanelRowsPerRack));
panel.add(rowsPerRackField);
panel.add(new JLabel("Solar Panel Orientation:"));
orientationComboBox = new JComboBox<String>(new String[] { "Portrait", "Landscape" });
orientationComboBox.setSelectedIndex(solarPanelOrientation);
panel.add(orientationComboBox);
panel.add(new JLabel("Row Axis:"));
rowAxisComboBox = new JComboBox<String>(new String[] { "North-South", "East-West" });
rowAxisComboBox.setSelectedIndex(solarPanelArrayRowAxis);
panel.add(rowAxisComboBox);
panel.add(new JLabel("Inter-Row Center-to-Center Distance (m):"));
final JTextField interrowSpacingField = new JTextField(threeDecimalsFormat.format(solarPanelRackArrayInterRowSpacing));
panel.add(interrowSpacingField);
panel.add(new JLabel("Pole Spacing X (m):"));
final JTextField poleSpacingXField = new JTextField(threeDecimalsFormat.format(solarPanelRackPoleSpacingX));
panel.add(poleSpacingXField);
panel.add(new JLabel("Pole Spacing Y (m):"));
final JTextField poleSpacingYField = new JTextField(threeDecimalsFormat.format(solarPanelRackPoleSpacingY));
panel.add(poleSpacingYField);
panel.add(new JLabel("Base Height (m):"));
final JTextField baseHeightField = new JTextField(threeDecimalsFormat.format(solarPanelRackBaseHeight));
panel.add(baseHeightField);
SpringUtilities.makeCompactGrid(panel, 17, 2, 6, 6, 6, 6);
enableSettings(modelComboBox.getSelectedIndex() == 0);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Solar Panel Rack Options");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
try {
solarPanelRackArrayInterRowSpacing = Double.parseDouble(interrowSpacingField.getText());
solarPanelTiltAngle = Double.parseDouble(tiltAngleField.getText());
solarPanelRowsPerRack = Integer.parseInt(rowsPerRackField.getText());
solarCellEfficiencyPercentage = Double.parseDouble(cellEfficiencyField.getText());
inverterEfficiencyPercentage = Double.parseDouble(inverterEfficiencyField.getText());
solarPanelTemperatureCoefficientPmaxPercentage = Double.parseDouble(pmaxTcField.getText());
solarPanelNominalOperatingCellTemperature = Double.parseDouble(noctField.getText());
solarPanelRackPoleSpacingX = Double.parseDouble(poleSpacingXField.getText());
solarPanelRackPoleSpacingY = Double.parseDouble(poleSpacingYField.getText());
solarPanelRackBaseHeight = Double.parseDouble(baseHeightField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
final int i = sizeComboBox.getSelectedIndex();
solarPanelWidth = solarPanelNominalSize.getNominalWidths()[i];
solarPanelHeight = solarPanelNominalSize.getNominalHeights()[i];
numberOfCellsInX = solarPanelNominalSize.getCellNx()[i];
numberOfCellsInY = solarPanelNominalSize.getCellNy()[i];
solarPanelOrientation = orientationComboBox.getSelectedIndex();
final double rackHeight = (solarPanelOrientation == 0 ? solarPanelHeight : solarPanelWidth) * solarPanelRowsPerRack;
if (solarPanelTiltAngle < -90 || solarPanelTiltAngle > 90) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Rack tilt angle must be between -90\u00B0 and 90\u00B0.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelRackPoleSpacingX < 1 || solarPanelRackPoleSpacingX > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Pole spacing X must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelRackBaseHeight < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Base height can't be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (Math.abs(0.5 * rackHeight * Math.sin(Math.toRadians(solarPanelTiltAngle))) > solarPanelRackBaseHeight) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar panels intersect with ground.", "Geometry Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelRackPoleSpacingY < 1 || solarPanelRackPoleSpacingY > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Pole spacing Y must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelRowsPerRack <= 0 || solarPanelRowsPerRack > 10) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Illegal value for solar panel rows per rack.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarCellEfficiencyPercentage < SolarPanel.MIN_SOLAR_CELL_EFFICIENCY_PERCENTAGE || solarCellEfficiencyPercentage > SolarPanel.MAX_SOLAR_CELL_EFFICIENCY_PERCENTAGE) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar cell efficiency must be between " + SolarPanel.MIN_SOLAR_CELL_EFFICIENCY_PERCENTAGE + "% and " + SolarPanel.MAX_SOLAR_CELL_EFFICIENCY_PERCENTAGE + "%.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (inverterEfficiencyPercentage < SolarPanel.MIN_INVERTER_EFFICIENCY_PERCENTAGE || inverterEfficiencyPercentage >= SolarPanel.MAX_INVERTER_EFFICIENCY_PERCENTAGE) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Inverter efficiency must be greater than " + SolarPanel.MIN_INVERTER_EFFICIENCY_PERCENTAGE + "% and less than " + SolarPanel.MAX_INVERTER_EFFICIENCY_PERCENTAGE + "%.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelTemperatureCoefficientPmaxPercentage < -1 || solarPanelTemperatureCoefficientPmaxPercentage > 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Temperature coefficient of Pmax must be between -1% and 0% per Celsius degree.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelNominalOperatingCellTemperature < 33 || solarPanelNominalOperatingCellTemperature > 58) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Nominal operating cell temperature must be between 33 and 58 Celsius degree.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (solarPanelRackArrayInterRowSpacing < rackHeight) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Inter-row center-to-center distance cannot be smaller than " + EnergyPanel.TWO_DECIMALS.format(rackHeight) + "m (" + solarPanelRowsPerRack + "\u00d7" + EnergyPanel.TWO_DECIMALS.format((solarPanelOrientation == 0 ? solarPanelHeight : solarPanelWidth)) + "m)", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
addSolarRackArrays();
if (choice == options[0]) {
break;
}
}
}
}
}
}
}
private void addSolarRackArrays() {
solarPanelColorOption = colorOptionComboBox.getSelectedIndex();
solarPanelCellType = cellTypeComboBox.getSelectedIndex();
solarPanelShadeTolerance = shadeToleranceComboBox.getSelectedIndex();
solarPanelArrayRowAxis = rowAxisComboBox.getSelectedIndex();
solarPanelModel = (String) modelComboBox.getSelectedItem();
final SolarPanel sp = new SolarPanel();
sp.setModelName((String) modelComboBox.getSelectedItem());
sp.setRotated(solarPanelOrientation == 1);
sp.setCellType(solarPanelCellType);
sp.setColorOption(solarPanelColorOption);
sp.setPanelWidth(solarPanelWidth);
sp.setPanelHeight(solarPanelHeight);
sp.setNumberOfCellsInX(numberOfCellsInX);
sp.setNumberOfCellsInY(numberOfCellsInY);
sp.setShadeTolerance(solarPanelShadeTolerance);
sp.setCellEfficiency(solarCellEfficiencyPercentage * 0.01);
sp.setInverterEfficiency(inverterEfficiencyPercentage * 0.01);
sp.setTemperatureCoefficientPmax(solarPanelTemperatureCoefficientPmaxPercentage * 0.01);
sp.setNominalOperatingCellTemperature(solarPanelNominalOperatingCellTemperature);
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
foundation.addSolarRackArrays(sp, solarPanelTiltAngle, solarPanelRackBaseHeight, solarPanelRowsPerRack, solarPanelRackArrayInterRowSpacing, solarPanelArrayRowAxis, solarPanelRackPoleSpacingX, solarPanelRackPoleSpacingY);
return null;
}
});
updateAfterEdit();
}
});
layoutMenu.addSeparator();
final JMenuItem miHeliostatCircularArrays = new JMenuItem("Heliostat Circular Layout...");
layoutMenu.add(miHeliostatCircularArrays);
miHeliostatCircularArrays.addActionListener(new ActionListener() {
private Foundation f;
private JComboBox<String> typeComboBox;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
f = (Foundation) selectedPart;
final int n = f.countParts(Mirror.class);
if (n > 0 && JOptionPane.showConfirmDialog(MainFrame.getInstance(), "All existing " + n + " heliostats on this foundation must be removed before\na new layout can be applied. Do you want to continue?", "Confirmation", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
return;
}
final JPanel panel = new JPanel(new SpringLayout());
panel.add(new JLabel("Type:"));
typeComboBox = new JComboBox<String>(new String[] { "Equal Azimuthal Spacing", "Radial Stagger" });
typeComboBox.setSelectedIndex(heliostatCircularFieldLayout.getType());
panel.add(typeComboBox);
panel.add(new JLabel("Aperture Width:"));
final JTextField widthField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getApertureWidth()));
panel.add(widthField);
panel.add(new JLabel("Aperture Height:"));
final JTextField heightField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getApertureHeight()));
panel.add(heightField);
panel.add(new JLabel("Start Angle (CCW from East):"));
final JTextField startAngleField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getStartAngle()));
panel.add(startAngleField);
panel.add(new JLabel("End Angle (CCW from East):"));
final JTextField endAngleField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getEndAngle()));
panel.add(endAngleField);
panel.add(new JLabel("Radial Spacing:"));
final JTextField rowSpacingField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getRadialSpacing()));
panel.add(rowSpacingField);
panel.add(new JLabel("Radial Spacing Increase Ratio:"));
final JTextField radialSpacingIncrementField = new JTextField(sixDecimalsFormat.format(heliostatCircularFieldLayout.getRadialSpacingIncrement()));
panel.add(radialSpacingIncrementField);
panel.add(new JLabel("Azimuthal Spacing:"));
final JTextField azimuthalSpacingField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getAzimuthalSpacing()));
panel.add(azimuthalSpacingField);
panel.add(new JLabel("Axis Road Width:"));
final JTextField axisRoadWidthField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getAxisRoadWidth()));
panel.add(axisRoadWidthField);
panel.add(new JLabel("Base Height:"));
final JTextField baseHeightField = new JTextField(threeDecimalsFormat.format(heliostatCircularFieldLayout.getBaseHeight()));
panel.add(baseHeightField);
SpringUtilities.makeCompactGrid(panel, 10, 2, 6, 6, 6, 6);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Circular Heliostat Array Options");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
try {
heliostatCircularFieldLayout.setRadialSpacing(Double.parseDouble(rowSpacingField.getText()));
heliostatCircularFieldLayout.setRadialSpacingIncrement(Double.parseDouble(radialSpacingIncrementField.getText()));
heliostatCircularFieldLayout.setAzimuthalSpacing(Double.parseDouble(azimuthalSpacingField.getText()));
heliostatCircularFieldLayout.setApertureWidth(Double.parseDouble(widthField.getText()));
heliostatCircularFieldLayout.setApertureHeight(Double.parseDouble(heightField.getText()));
heliostatCircularFieldLayout.setStartAngle(Double.parseDouble(startAngleField.getText()));
heliostatCircularFieldLayout.setEndAngle(Double.parseDouble(endAngleField.getText()));
heliostatCircularFieldLayout.setAxisRoadWidth(Double.parseDouble(axisRoadWidthField.getText()));
heliostatCircularFieldLayout.setBaseHeight(Double.parseDouble(baseHeightField.getText()));
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (heliostatCircularFieldLayout.getRadialSpacing() < 0 || heliostatCircularFieldLayout.getAzimuthalSpacing() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Heliostat spacing cannot be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getRadialSpacingIncrement() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Radial spacing increment ratio cannot be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getAxisRoadWidth() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Axis road width cannot be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getStartAngle() < 0 || heliostatCircularFieldLayout.getStartAngle() > 360) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Start angle must be between 0 and 360 degrees.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getEndAngle() < 0 || heliostatCircularFieldLayout.getEndAngle() > 360) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "End angle must be between 0 and 360 degrees.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getEndAngle() <= heliostatCircularFieldLayout.getStartAngle()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "End angle must be greater than start angle.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getApertureWidth() < 1 || heliostatCircularFieldLayout.getApertureWidth() > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Heliostat aperture width must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getApertureHeight() < 1 || heliostatCircularFieldLayout.getApertureHeight() > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Heliostat aperture height must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatCircularFieldLayout.getBaseHeight() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Base height can't be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
addCircularHeliostatArrays();
if (choice == options[0]) {
break;
}
}
}
}
}
}
}
private void addCircularHeliostatArrays() {
heliostatCircularFieldLayout.setType(typeComboBox.getSelectedIndex());
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
final int count = f.addCircularHeliostatArrays(heliostatCircularFieldLayout);
if (count == 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Heliostat array can't be created. Check your parameters.", "Error", JOptionPane.ERROR_MESSAGE);
}
return null;
}
});
updateAfterEdit();
}
});
final JMenuItem miHeliostatRectangularArrays = new JMenuItem("Heliostat Rectangular Layout...");
layoutMenu.add(miHeliostatRectangularArrays);
miHeliostatRectangularArrays.addActionListener(new ActionListener() {
private Foundation f;
private JComboBox<String> rowAxisComboBox;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
f = (Foundation) selectedPart;
final int n = f.countParts(Mirror.class);
if (n > 0 && JOptionPane.showConfirmDialog(MainFrame.getInstance(), "All existing " + n + " heliostats on this foundation must be removed before\na new layout can be applied. Do you want to continue?", "Confirmation", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
return;
}
final JPanel panel = new JPanel(new SpringLayout());
panel.add(new JLabel("Row Axis:"));
rowAxisComboBox = new JComboBox<String>(new String[] { "North-South", "East-West" });
rowAxisComboBox.setSelectedIndex(heliostatRectangularFieldLayout.getRowAxis());
panel.add(rowAxisComboBox);
panel.add(new JLabel("Aperture Width:"));
final JTextField widthField = new JTextField(threeDecimalsFormat.format(heliostatRectangularFieldLayout.getApertureWidth()));
panel.add(widthField);
panel.add(new JLabel("Aperture Height:"));
final JTextField heightField = new JTextField(threeDecimalsFormat.format(heliostatRectangularFieldLayout.getApertureHeight()));
panel.add(heightField);
panel.add(new JLabel("Row Spacing:"));
final JTextField rowSpacingField = new JTextField(threeDecimalsFormat.format(heliostatRectangularFieldLayout.getRowSpacing()));
panel.add(rowSpacingField);
panel.add(new JLabel("Column Spacing:"));
final JTextField columnSpacingField = new JTextField(threeDecimalsFormat.format(heliostatRectangularFieldLayout.getColumnSpacing()));
panel.add(columnSpacingField);
panel.add(new JLabel("Base Height:"));
final JTextField baseHeightField = new JTextField(threeDecimalsFormat.format(heliostatRectangularFieldLayout.getBaseHeight()));
panel.add(baseHeightField);
SpringUtilities.makeCompactGrid(panel, 6, 2, 6, 6, 6, 6);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Rectangular Heliostat Array Options");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
try {
heliostatRectangularFieldLayout.setRowSpacing(Double.parseDouble(rowSpacingField.getText()));
heliostatRectangularFieldLayout.setColumnSpacing(Double.parseDouble(columnSpacingField.getText()));
heliostatRectangularFieldLayout.setApertureWidth(Double.parseDouble(widthField.getText()));
heliostatRectangularFieldLayout.setApertureHeight(Double.parseDouble(heightField.getText()));
heliostatRectangularFieldLayout.setBaseHeight(Double.parseDouble(baseHeightField.getText()));
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (heliostatRectangularFieldLayout.getRowSpacing() < 0 || heliostatRectangularFieldLayout.getColumnSpacing() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Heliostat spacing cannot be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatRectangularFieldLayout.getApertureWidth() < 1 || heliostatRectangularFieldLayout.getApertureWidth() > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Aperture width must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatRectangularFieldLayout.getApertureHeight() < 1 || heliostatRectangularFieldLayout.getApertureHeight() > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Aperture height must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatRectangularFieldLayout.getBaseHeight() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Base height can't be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
addRectangularHeliostatArrays();
if (choice == options[0]) {
break;
}
}
}
}
}
}
}
private void addRectangularHeliostatArrays() {
heliostatRectangularFieldLayout.setRowAxis(rowAxisComboBox.getSelectedIndex());
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
final int count = f.addRectangularHeliostatArrays(heliostatRectangularFieldLayout);
if (count == 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Heliostat array can't be created. Check your parameters.", "Error", JOptionPane.ERROR_MESSAGE);
}
return null;
}
});
updateAfterEdit();
}
});
final JMenuItem miHeliostatFermatSpiralArrays = new JMenuItem("Heliostat Spiral Layout...");
layoutMenu.add(miHeliostatFermatSpiralArrays);
miHeliostatFermatSpiralArrays.addActionListener(new ActionListener() {
private Foundation f;
private JComboBox<String> typeComboBox;
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
f = (Foundation) selectedPart;
final int n = f.countParts(Mirror.class);
if (n > 0 && JOptionPane.showConfirmDialog(MainFrame.getInstance(), "All existing " + n + " heliostats on this foundation must be removed before\na new layout can be applied. Do you want to continue?", "Confirmation", JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
return;
}
final JPanel panel = new JPanel(new SpringLayout());
panel.add(new JLabel("Type:"));
typeComboBox = new JComboBox<String>(new String[] { "Fermat Spiral" });
typeComboBox.setSelectedIndex(heliostatSpiralFieldLayout.getType());
panel.add(typeComboBox);
panel.add(new JLabel("Aperture Width:"));
final JTextField widthField = new JTextField(threeDecimalsFormat.format(heliostatSpiralFieldLayout.getApertureWidth()));
panel.add(widthField);
panel.add(new JLabel("Aperture Height:"));
final JTextField heightField = new JTextField(threeDecimalsFormat.format(heliostatSpiralFieldLayout.getApertureHeight()));
panel.add(heightField);
panel.add(new JLabel("Start Turn:"));
final JTextField startTurnField = new JTextField(heliostatSpiralFieldLayout.getStartTurn() + "");
panel.add(startTurnField);
panel.add(new JLabel("Scaling Factor:"));
final JTextField scalingFactorField = new JTextField(threeDecimalsFormat.format(heliostatSpiralFieldLayout.getScalingFactor()));
panel.add(scalingFactorField);
panel.add(new JLabel("Radial Spacing Increase Ratio:"));
final JTextField radialSpacingIncrementField = new JTextField(sixDecimalsFormat.format(heliostatSpiralFieldLayout.getRadialSpacingIncrement()));
panel.add(radialSpacingIncrementField);
panel.add(new JLabel("Start Angle (CCW from East):"));
final JTextField startAngleField = new JTextField(threeDecimalsFormat.format(heliostatSpiralFieldLayout.getStartAngle()));
panel.add(startAngleField);
panel.add(new JLabel("End Angle (CCW from East):"));
final JTextField endAngleField = new JTextField(threeDecimalsFormat.format(heliostatSpiralFieldLayout.getEndAngle()));
panel.add(endAngleField);
panel.add(new JLabel("Axis Road Width:"));
final JTextField axisRoadWidthField = new JTextField(threeDecimalsFormat.format(heliostatSpiralFieldLayout.getAxisRoadWidth()));
panel.add(axisRoadWidthField);
panel.add(new JLabel("Base Height:"));
final JTextField baseHeightField = new JTextField(threeDecimalsFormat.format(heliostatSpiralFieldLayout.getBaseHeight()));
panel.add(baseHeightField);
SpringUtilities.makeCompactGrid(panel, 10, 2, 6, 6, 6, 6);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(panel, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Spiral Heliostat Array Options");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
try {
heliostatSpiralFieldLayout.setApertureWidth(Double.parseDouble(widthField.getText()));
heliostatSpiralFieldLayout.setApertureHeight(Double.parseDouble(heightField.getText()));
heliostatSpiralFieldLayout.setStartTurn(Integer.parseInt(startTurnField.getText()));
heliostatSpiralFieldLayout.setScalingFactor(Double.parseDouble(scalingFactorField.getText()));
heliostatSpiralFieldLayout.setRadialSpacingIncrement(Double.parseDouble(radialSpacingIncrementField.getText()));
heliostatSpiralFieldLayout.setStartAngle(Double.parseDouble(startAngleField.getText()));
heliostatSpiralFieldLayout.setEndAngle(Double.parseDouble(endAngleField.getText()));
heliostatSpiralFieldLayout.setAxisRoadWidth(Double.parseDouble(axisRoadWidthField.getText()));
heliostatSpiralFieldLayout.setBaseHeight(Double.parseDouble(baseHeightField.getText()));
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (heliostatSpiralFieldLayout.getStartTurn() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Start turn cannot be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getScalingFactor() <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Scaling factor must be greater than zero.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getRadialSpacingIncrement() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Radial spacing increment ratio cannot be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getAxisRoadWidth() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Axis road width cannot be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getStartAngle() < 0 || heliostatSpiralFieldLayout.getStartAngle() > 360) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Start angle must be between 0 and 360 degrees.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getEndAngle() < 0 || heliostatSpiralFieldLayout.getEndAngle() > 360) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "End angle must be between 0 and 360 degrees.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getEndAngle() <= heliostatSpiralFieldLayout.getStartAngle()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "End angle must be greater than start angle.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getApertureWidth() < 1 || heliostatSpiralFieldLayout.getApertureWidth() > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Aperture width must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getApertureHeight() < 1 || heliostatSpiralFieldLayout.getApertureHeight() > 50) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Aperture height must be between 1 and 50 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (heliostatSpiralFieldLayout.getBaseHeight() < 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Base height can't be negative.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
addSpiralHeliostatArrays();
if (choice == options[0]) {
break;
}
}
}
}
}
}
}
private void addSpiralHeliostatArrays() {
heliostatSpiralFieldLayout.setType(typeComboBox.getSelectedIndex());
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
final int count = f.addSpiralHeliostatArrays(heliostatSpiralFieldLayout);
if (count == 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Heliostat array can't be created. Check your parameters.", "Error", JOptionPane.ERROR_MESSAGE);
}
return null;
}
});
updateAfterEdit();
}
});
final JMenuItem miAddUtilityBill = new JMenuItem("Add Utility Bill");
miAddUtilityBill.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
UtilityBill b = f.getUtilityBill();
if (b == null) {
if (JOptionPane.showConfirmDialog(MainFrame.getInstance(), "No utility bill is found for this building. Create one?", "Utility Bill for Building #" + f.getId(), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.NO_OPTION) {
return;
}
b = new UtilityBill();
f.setUtilityBill(b);
}
new UtilityBillDialog(b).setVisible(true);
Scene.getInstance().setEdited(true);
}
}
});
final JMenuItem miDeleteUtilityBill = new JMenuItem("Delete Utility Bill");
miDeleteUtilityBill.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
if (f.getUtilityBill() == null) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no utilitiy bill associated with this building.", "No Utility Bill", JOptionPane.INFORMATION_MESSAGE);
} else {
if (JOptionPane.showConfirmDialog(MainFrame.getInstance(), "Do you really want to remove the utility bill associated with this building?", "Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
final DeleteUtilityBillCommand c = new DeleteUtilityBillCommand(f);
f.setUtilityBill(null);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
}
}
});
final JMenuItem miGroupMaster = new JCheckBoxMenuItem("Group Master");
miGroupMaster.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
SceneManager.getInstance().getUndoManager().addEdit(new SetGroupMasterCommand((Foundation) selectedPart));
((Foundation) selectedPart).setGroupMaster(miGroupMaster.isSelected());
Scene.getInstance().setEdited(true);
}
}
});
final JCheckBoxMenuItem miEnableInset = new JCheckBoxMenuItem("Enable Polygon Inset");
miEnableInset.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation foundation = (Foundation) selectedPart;
SceneManager.getInstance().getUndoManager().addEdit(new ShowFoundationInsetCommand(foundation));
foundation.getPolygon().setVisible(miEnableInset.isSelected());
foundation.draw();
Scene.getInstance().setEdited(true);
}
}
});
final JCheckBoxMenuItem miDisableEditPoints = new JCheckBoxMenuItem("Disable Edit Points");
miDisableEditPoints.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
((Foundation) selectedPart).setLockEdit(miDisableEditPoints.isSelected());
Scene.getInstance().setEdited(true);
}
}
});
final JMenu optionsMenu = new JMenu("Options");
final JMenuItem miChildGridSize = new JMenuItem("Grid Size...");
miChildGridSize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof Foundation)) {
return;
}
final Foundation f = (Foundation) selectedPart;
while (true) {
final String newValue = JOptionPane.showInputDialog(MainFrame.getInstance(), "Grid Size (m)", f.getChildGridSize() * Scene.getInstance().getAnnotationScale());
if (newValue == null) {
break;
} else {
try {
final double val = Double.parseDouble(newValue);
if (val < 0.1 || val > 5) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Grid size must be between 0.1 and 5 m.", "Error", JOptionPane.ERROR_MESSAGE);
} else {
f.setChildGridSize(val / Scene.getInstance().getAnnotationScale());
updateAfterEdit();
break;
}
} catch (final NumberFormatException exception) {
exception.printStackTrace();
JOptionPane.showMessageDialog(MainFrame.getInstance(), newValue + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
}
}
}
}
});
optionsMenu.add(miChildGridSize);
final JMenu projectTypeSubMenu = new JMenu("Project Type");
optionsMenu.add(projectTypeSubMenu);
final ButtonGroup bgStructureTypes = new ButtonGroup();
final JRadioButtonMenuItem rbmiTypeAutoDetected = new JRadioButtonMenuItem("Auto Detected");
rbmiTypeAutoDetected.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation foundation = (Foundation) selectedPart;
foundation.setProjectType(Foundation.TYPE_AUTO_DETECTED);
}
}
});
projectTypeSubMenu.add(rbmiTypeAutoDetected);
bgStructureTypes.add(rbmiTypeAutoDetected);
final JRadioButtonMenuItem rbmiTypeBuilding = new JRadioButtonMenuItem("Building");
rbmiTypeBuilding.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation foundation = (Foundation) selectedPart;
foundation.setProjectType(Foundation.TYPE_BUILDING);
}
}
});
projectTypeSubMenu.add(rbmiTypeBuilding);
bgStructureTypes.add(rbmiTypeBuilding);
final JRadioButtonMenuItem rbmiTypePvStation = new JRadioButtonMenuItem("Photovoltaic Solar Power System");
rbmiTypePvStation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation foundation = (Foundation) selectedPart;
foundation.setProjectType(Foundation.TYPE_PV_PROJECT);
}
}
});
projectTypeSubMenu.add(rbmiTypePvStation);
bgStructureTypes.add(rbmiTypePvStation);
final JRadioButtonMenuItem rbmiTypeCspStation = new JRadioButtonMenuItem("Concentrated Solar Power System");
rbmiTypeCspStation.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation foundation = (Foundation) selectedPart;
foundation.setProjectType(Foundation.TYPE_CSP_PROJECT);
}
}
});
projectTypeSubMenu.add(rbmiTypeCspStation);
bgStructureTypes.add(rbmiTypeCspStation);
final JMenuItem miThermostat = new JMenuItem("Thermostat...");
miThermostat.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation foundation = (Foundation) selectedPart;
MainPanel.getInstance().getEnergyButton().setSelected(false);
new ThermostatDialog(foundation).setVisible(true);
TimeSeriesLogger.getInstance().logAdjustThermostatButton();
Scene.getInstance().setEdited(true);
}
}
});
final JMenuItem miSize = new JMenuItem("Size...");
miSize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof Foundation)) {
return;
}
final Foundation f = (Foundation) selectedPart;
final boolean hasChildren = !f.getChildren().isEmpty();
final Vector3 v0 = f.getAbsPoint(0);
final Vector3 v1 = f.getAbsPoint(1);
final Vector3 v2 = f.getAbsPoint(2);
double lx0 = v0.distance(v2) * Scene.getInstance().getAnnotationScale();
double ly0 = v0.distance(v1) * Scene.getInstance().getAnnotationScale();
double lz0 = f.getHeight() * Scene.getInstance().getAnnotationScale();
final JPanel gui = new JPanel(new BorderLayout());
final String title = "<html>Size of Foundation #" + f.getId() + " (in meters)</html>";
gui.add(new JLabel(title), BorderLayout.NORTH);
final JPanel inputPanel = new JPanel(new SpringLayout());
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
gui.add(inputPanel, BorderLayout.CENTER);
JLabel l = new JLabel("Length: ", JLabel.TRAILING);
inputPanel.add(l);
final JTextField lxField = new JTextField(threeDecimalsFormat.format(lx0), 5);
lxField.setEditable(!hasChildren);
l.setLabelFor(lxField);
inputPanel.add(lxField);
l = new JLabel("Width: ", JLabel.TRAILING);
inputPanel.add(l);
final JTextField lyField = new JTextField(threeDecimalsFormat.format(ly0), 5);
lyField.setEditable(!hasChildren);
l.setLabelFor(lyField);
inputPanel.add(lyField);
l = new JLabel("Height: ", JLabel.TRAILING);
inputPanel.add(l);
final JTextField lzField = new JTextField(threeDecimalsFormat.format(lz0), 5);
l.setLabelFor(lzField);
inputPanel.add(lzField);
SpringUtilities.makeCompactGrid(inputPanel, 3, 2, 6, 6, 6, 6);
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(gui, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Foundation Size");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double lx1 = lx0, ly1 = ly0, lz1 = lz0;
boolean ok = true;
try {
lx1 = Double.parseDouble(lxField.getText());
ly1 = Double.parseDouble(lyField.getText());
lz1 = Double.parseDouble(lzField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (lx1 < 1) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Length must be greater than one.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (ly1 < 1) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Width must be greater than one.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (lz1 < 0.01) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Height must be greater than 0.01.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
if (lx1 != lx0 || ly1 != ly0 || lz1 != lz0) {
f.rescale(lx1 / lx0, ly1 / ly0, 1);
f.setHeight(lz1 / Scene.getInstance().getAnnotationScale());
f.draw();
f.drawChildren();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(new ChangeFoundationSizeCommand(f, lx0, lx1, ly0, ly1, lz0, lz1));
updateAfterEdit();
lx0 = lx1;
ly0 = ly1;
lz0 = lz1;
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miResize = new JMenuItem("Resize Structure Above");
miResize.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof Foundation)) {
return;
}
final Foundation f = (Foundation) selectedPart;
if (f.getChildren().isEmpty()) {
return;
}
for (final HousePart p : Scene.getInstance().getParts()) {
if (p instanceof Foundation) {
if (p != f) {
((Foundation) p).setResizeHouseMode(false);
}
}
}
f.setResizeHouseMode(true);
}
});
final JMenu labelMenu = new JMenu("Label");
final JCheckBoxMenuItem miLabelNone = new JCheckBoxMenuItem("None", true);
miLabelNone.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (miLabelNone.isSelected()) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.clearLabels();
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
}
});
labelMenu.add(miLabelNone);
final JCheckBoxMenuItem miLabelCustom = new JCheckBoxMenuItem("Custom");
miLabelCustom.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelCustom(miLabelCustom.isSelected());
if (f.getLabelCustom()) {
f.setLabelCustomText(JOptionPane.showInputDialog(MainFrame.getInstance(), "Custom Text", f.getLabelCustomText()));
}
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelCustom);
final JCheckBoxMenuItem miLabelId = new JCheckBoxMenuItem("ID");
miLabelId.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelId(miLabelId.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelId);
final JCheckBoxMenuItem miLabelNumberOfSolarPanels = new JCheckBoxMenuItem("Number of Solar Panels");
miLabelNumberOfSolarPanels.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelNumberOfSolarPanels(miLabelNumberOfSolarPanels.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelNumberOfSolarPanels);
final JCheckBoxMenuItem miLabelPvEnergy = new JCheckBoxMenuItem("Photovoltaic Output");
miLabelPvEnergy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelPvEnergy(miLabelPvEnergy.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelPvEnergy);
final JCheckBoxMenuItem miLabelSolarPotential = new JCheckBoxMenuItem("Solar Potential");
miLabelSolarPotential.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelSolarPotential(miLabelSolarPotential.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelSolarPotential);
final JCheckBoxMenuItem miLabelBuildingEnergy = new JCheckBoxMenuItem("Building Energy");
miLabelBuildingEnergy.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelBuildingEnergy(miLabelBuildingEnergy.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelBuildingEnergy);
final JMenu powerTowerLabelMenu = new JMenu("Power Tower");
labelMenu.add(powerTowerLabelMenu);
final JCheckBoxMenuItem miLabelNumberOfHeliostats = new JCheckBoxMenuItem("Number of Heliostats");
miLabelNumberOfHeliostats.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelNumberOfMirrors(miLabelNumberOfHeliostats.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
powerTowerLabelMenu.add(miLabelNumberOfHeliostats);
final JCheckBoxMenuItem miLabelPowerTowerHeight = new JCheckBoxMenuItem("Tower Height");
miLabelPowerTowerHeight.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelPowerTowerHeight(miLabelPowerTowerHeight.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
powerTowerLabelMenu.add(miLabelPowerTowerHeight);
final JCheckBoxMenuItem miLabelPowerTowerOutput = new JCheckBoxMenuItem("Energy Output");
miLabelPowerTowerOutput.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
final SetFoundationLabelCommand c = new SetFoundationLabelCommand(f);
f.setLabelPowerTowerOutput(miLabelPowerTowerOutput.isSelected());
f.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
powerTowerLabelMenu.add(miLabelPowerTowerOutput);
popupMenuForFoundation = createPopupMenu(false, true, new Runnable() {
@Override
public void run() {
final HousePart p = SceneManager.getInstance().getSelectedPart();
if (p instanceof Foundation) {
final Foundation f = (Foundation) p;
if (Scene.getInstance().isStudentMode()) {
miDisableEditPoints.setEnabled(false);
miThermostat.setEnabled(false);
} else {
miDisableEditPoints.setEnabled(true);
miThermostat.setEnabled(true);
}
miDeleteUtilityBill.setEnabled(f.getUtilityBill() != null);
Util.selectSilently(miGroupMaster, f.isGroupMaster());
Util.selectSilently(miDisableEditPoints, f.getLockEdit());
Util.selectSilently(miEnableInset, f.getPolygon().isVisible());
Util.selectSilently(miLabelNone, !f.isLabelVisible());
Util.selectSilently(miLabelCustom, f.getLabelCustom());
Util.selectSilently(miLabelId, f.getLabelId());
Util.selectSilently(miLabelPowerTowerOutput, f.getLabelPowerTowerOutput());
Util.selectSilently(miLabelPowerTowerHeight, f.getLabelPowerTowerHeight());
Util.selectSilently(miLabelNumberOfHeliostats, f.getLabelNumberOfMirrors());
Util.selectSilently(miLabelSolarPotential, f.getLabelSolarPotential());
Util.selectSilently(miLabelPvEnergy, f.getLabelPvEnergy());
Util.selectSilently(miLabelNumberOfSolarPanels, f.getLabelNumberOfSolarPanels());
Util.selectSilently(miLabelBuildingEnergy, f.getLabelBuildingEnergy());
powerTowerLabelMenu.setEnabled(f.hasSolarReceiver());
switch(f.getProjectType()) {
case Foundation.TYPE_BUILDING:
Util.selectSilently(rbmiTypeBuilding, true);
break;
case Foundation.TYPE_PV_PROJECT:
Util.selectSilently(rbmiTypePvStation, true);
break;
case Foundation.TYPE_CSP_PROJECT:
Util.selectSilently(rbmiTypeCspStation, true);
break;
default:
Util.selectSilently(rbmiTypeAutoDetected, true);
}
miResize.setEnabled(!f.getChildren().isEmpty());
for (final HousePart x : Scene.getInstance().getParts()) {
if (x instanceof Foundation) {
if (x != f) {
((Foundation) x).setResizeHouseMode(false);
}
}
}
}
final HousePart copyBuffer = Scene.getInstance().getCopyBuffer();
final Node copyNode = Scene.getInstance().getCopyNode();
miPaste.setEnabled(copyBuffer instanceof SolarCollector || copyNode != null);
}
});
popupMenuForFoundation.add(miPaste);
popupMenuForFoundation.add(miCopy);
popupMenuForFoundation.addSeparator();
popupMenuForFoundation.add(miImportCollada);
popupMenuForFoundation.add(miResize);
popupMenuForFoundation.add(miSize);
popupMenuForFoundation.add(miRescale);
popupMenuForFoundation.add(rotateMenu);
popupMenuForFoundation.add(clearMenu);
popupMenuForFoundation.add(layoutMenu);
popupMenuForFoundation.addSeparator();
popupMenuForFoundation.add(miDisableEditPoints);
popupMenuForFoundation.add(miEnableInset);
popupMenuForFoundation.add(miGroupMaster);
popupMenuForFoundation.add(optionsMenu);
popupMenuForFoundation.add(labelMenu);
popupMenuForFoundation.addSeparator();
popupMenuForFoundation.add(colorAction);
// floor insulation only for the first floor, so this U-value is associated with the Foundation class, not the Floor class
popupMenuForFoundation.add(createInsulationMenuItem(false));
popupMenuForFoundation.add(createVolumetricHeatCapacityMenuItem());
popupMenuForFoundation.add(miThermostat);
popupMenuForFoundation.addSeparator();
popupMenuForFoundation.add(miAddUtilityBill);
popupMenuForFoundation.add(miDeleteUtilityBill);
popupMenuForFoundation.addSeparator();
final JMenu analysisMenu = new JMenu("Analysis");
popupMenuForFoundation.add(analysisMenu);
JMenu subMenu = new JMenu("Buildings");
analysisMenu.add(subMenu);
JMenuItem mi = new JMenuItem("Daily Building Energy Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof Foundation) {
final EnergyDailyAnalysis analysis = new EnergyDailyAnalysis();
if (SceneManager.getInstance().getSolarHeatMap()) {
analysis.updateGraph();
}
analysis.show("Daily Building Energy");
}
}
});
subMenu.add(mi);
mi = new JMenuItem("Annual Building Energy Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof Foundation) {
new EnergyAnnualAnalysis().show("Annual Building Energy");
}
}
});
subMenu.add(mi);
subMenu = new JMenu("Solar Panels");
analysisMenu.add(subMenu);
mi = new JMenuItem("Daily Solar Panel Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (SceneManager.getInstance().getSelectedPart() instanceof Foundation) {
final Foundation f = (Foundation) SceneManager.getInstance().getSelectedPart();
if (f.countParts(new Class[] { SolarPanel.class, Rack.class }) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no solar panel on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
final PvDailyAnalysis a = new PvDailyAnalysis();
if (SceneManager.getInstance().getSolarHeatMap()) {
a.updateGraph();
}
a.show();
}
}
});
subMenu.add(mi);
mi = new JMenuItem("Annual Solar Panel Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
if (f.countParts(new Class[] { SolarPanel.class, Rack.class }) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no solar panel on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
final PvAnnualAnalysis a = new PvAnnualAnalysis();
if (f.getUtilityBill() != null) {
a.setUtilityBill(f.getUtilityBill());
}
a.show();
}
}
});
subMenu.add(mi);
subMenu = new JMenu("Heliostats");
analysisMenu.add(subMenu);
mi = new JMenuItem("Daily Heliostat Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (SceneManager.getInstance().getSelectedPart() instanceof Foundation) {
final Foundation f = (Foundation) SceneManager.getInstance().getSelectedPart();
if (f.countParts(Mirror.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no heliostat on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
final HeliostatDailyAnalysis a = new HeliostatDailyAnalysis();
if (SceneManager.getInstance().getSolarHeatMap()) {
a.updateGraph();
}
a.show();
}
}
});
subMenu.add(mi);
mi = new JMenuItem("Annual Heliostat Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
if (f.countParts(Mirror.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no heliostat on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
new HeliostatAnnualAnalysis().show();
}
}
});
subMenu.add(mi);
subMenu = new JMenu("Parabolic Troughs");
analysisMenu.add(subMenu);
mi = new JMenuItem("Daily Parabolic Trough Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (SceneManager.getInstance().getSelectedPart() instanceof Foundation) {
final Foundation f = (Foundation) SceneManager.getInstance().getSelectedPart();
if (f.countParts(ParabolicTrough.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no parabolic trough on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
final ParabolicTroughDailyAnalysis a = new ParabolicTroughDailyAnalysis();
if (SceneManager.getInstance().getSolarHeatMap()) {
a.updateGraph();
}
a.show();
}
}
});
subMenu.add(mi);
mi = new JMenuItem("Annual Parabolic Trough Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
if (f.countParts(ParabolicTrough.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no parabolic trough on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
new ParabolicTroughAnnualAnalysis().show();
}
}
});
subMenu.add(mi);
subMenu = new JMenu("Parabolic Dishes");
analysisMenu.add(subMenu);
mi = new JMenuItem("Daily Parabolic Dish Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (SceneManager.getInstance().getSelectedPart() instanceof Foundation) {
final Foundation f = (Foundation) SceneManager.getInstance().getSelectedPart();
if (f.countParts(ParabolicDish.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no parabolic dish on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
final ParabolicDishDailyAnalysis a = new ParabolicDishDailyAnalysis();
if (SceneManager.getInstance().getSolarHeatMap()) {
a.updateGraph();
}
a.show();
}
}
});
subMenu.add(mi);
mi = new JMenuItem("Annual Parabolic Dish Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
if (f.countParts(ParabolicDish.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no parabolic dish on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
new ParabolicDishAnnualAnalysis().show();
}
}
});
subMenu.add(mi);
subMenu = new JMenu("Linear Fresnel Reflectors");
analysisMenu.add(subMenu);
mi = new JMenuItem("Daily Fresnel Reflector Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (SceneManager.getInstance().getSelectedPart() instanceof Foundation) {
final Foundation f = (Foundation) SceneManager.getInstance().getSelectedPart();
if (f.countParts(FresnelReflector.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no Fresnel reflector on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
final FresnelReflectorDailyAnalysis a = new FresnelReflectorDailyAnalysis();
if (SceneManager.getInstance().getSolarHeatMap()) {
a.updateGraph();
}
a.show();
}
}
});
subMenu.add(mi);
mi = new JMenuItem("Annual Fresnel Reflector Yield Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Foundation) {
final Foundation f = (Foundation) selectedPart;
if (f.countParts(FresnelReflector.class) <= 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no Fresnel reflector on this foundation to analyze.", "Error", JOptionPane.ERROR_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
new FresnelReflectorAnnualAnalysis().show();
}
}
});
subMenu.add(mi);
}
return popupMenuForFoundation;
}
use of org.concord.energy3d.simulation.FresnelReflectorDailyAnalysis in project energy3d by concord-consortium.
the class MainFrame method getDailyFresnelReflectorAnalysisMenuItem.
private JMenuItem getDailyFresnelReflectorAnalysisMenuItem() {
if (dailyFresnelReflectorAnalysisMenuItem == null) {
dailyFresnelReflectorAnalysisMenuItem = new JMenuItem("Daily Yield Analysis of Fresnel Reflectors...");
dailyFresnelReflectorAnalysisMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().checkCity()) {
int n = Scene.getInstance().countParts(FresnelReflector.class);
if (n <= 0) {
JOptionPane.showMessageDialog(MainFrame.this, "There is no Fresnel reflector to analyze.", "No Fresnel Reflector", JOptionPane.WARNING_MESSAGE);
return;
}
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart != null) {
Foundation foundation;
if (selectedPart instanceof Foundation) {
foundation = (Foundation) selectedPart;
} else {
foundation = selectedPart.getTopContainer();
}
if (foundation != null) {
n = foundation.countParts(FresnelReflector.class);
if (n <= 0) {
JOptionPane.showMessageDialog(MainFrame.this, "There is no Fresnel reflector on this foundation to analyze.", "No Fresnel Reflector", JOptionPane.WARNING_MESSAGE);
return;
}
}
}
final FresnelReflectorDailyAnalysis a = new FresnelReflectorDailyAnalysis();
if (SceneManager.getInstance().getSolarHeatMap()) {
a.updateGraph();
}
a.show();
}
}
});
}
return dailyFresnelReflectorAnalysisMenuItem;
}
Aggregations