use of org.concord.energy3d.model.Wall in project energy3d by concord-consortium.
the class PopupMenuForSolarPanel method getPopupMenu.
static JPopupMenu getPopupMenu() {
if (popupMenuForSolarPanel == null) {
final JMenu trackerMenu = new JMenu("Tracker");
final JMenu shadeToleranceMenu = new JMenu("Shade Tolerance");
final ButtonGroup shadeToleranceButtonGroup = new ButtonGroup();
final JRadioButtonMenuItem miHighTolerance = new JRadioButtonMenuItem("High Tolerance...");
shadeToleranceButtonGroup.add(miHighTolerance);
miHighTolerance.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 SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.toString().indexOf(')') + 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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>Choose shade tolerance level for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>The energy generated by this panel comes from each cell proportionally (ideal case).<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, panel }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "High Shade Tolerance");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = sp.getShadeTolerance() != SolarPanel.HIGH_SHADE_TOLERANCE;
if (rb1.isSelected()) {
if (changed) {
final SetShadeToleranceCommand c = new SetShadeToleranceCommand(sp);
sp.setShadeTolerance(SolarPanel.HIGH_SHADE_TOLERANCE);
sp.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (x.getShadeTolerance() != SolarPanel.HIGH_SHADE_TOLERANCE) {
changed = true;
break;
}
}
}
if (changed) {
final SetShadeToleranceForSolarPanelsOnFoundationCommand c = new SetShadeToleranceForSolarPanelsOnFoundationCommand(foundation);
foundation.setShadeToleranceForSolarPanels(SolarPanel.HIGH_SHADE_TOLERANCE);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (x.getShadeTolerance() != SolarPanel.HIGH_SHADE_TOLERANCE) {
changed = true;
break;
}
}
}
if (changed) {
final SetShadeToleranceForAllSolarPanelsCommand c = new SetShadeToleranceForAllSolarPanelsCommand();
Scene.getInstance().setShadeToleranceForAllSolarPanels(SolarPanel.HIGH_SHADE_TOLERANCE);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final JRadioButtonMenuItem miPartialTolerance = new JRadioButtonMenuItem("Partial Tolerance...", true);
shadeToleranceButtonGroup.add(miPartialTolerance);
miPartialTolerance.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 SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.toString().indexOf(')') + 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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>Choose shade tolerance level for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>Use bypass diodes to direct current under shading conditions.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, panel }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Partial Shade Tolerance");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = sp.getShadeTolerance() != SolarPanel.PARTIAL_SHADE_TOLERANCE;
if (rb1.isSelected()) {
if (changed) {
final SetShadeToleranceCommand c = new SetShadeToleranceCommand(sp);
sp.setShadeTolerance(SolarPanel.PARTIAL_SHADE_TOLERANCE);
sp.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (x.getShadeTolerance() != SolarPanel.PARTIAL_SHADE_TOLERANCE) {
changed = true;
break;
}
}
}
if (changed) {
final SetShadeToleranceForSolarPanelsOnFoundationCommand c = new SetShadeToleranceForSolarPanelsOnFoundationCommand(foundation);
foundation.setShadeToleranceForSolarPanels(SolarPanel.PARTIAL_SHADE_TOLERANCE);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (x.getShadeTolerance() != SolarPanel.PARTIAL_SHADE_TOLERANCE) {
changed = true;
break;
}
}
}
if (changed) {
final SetShadeToleranceForAllSolarPanelsCommand c = new SetShadeToleranceForAllSolarPanelsCommand();
Scene.getInstance().setShadeToleranceForAllSolarPanels(SolarPanel.PARTIAL_SHADE_TOLERANCE);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final JRadioButtonMenuItem miNoTolerance = new JRadioButtonMenuItem("No Tolerance...");
shadeToleranceButtonGroup.add(miNoTolerance);
miNoTolerance.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 SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.toString().indexOf(')') + 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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>Choose shade tolerance level for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>Shading greatly reduces the output of the entire panel.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, panel }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "No Shade Tolerance");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = sp.getShadeTolerance() != SolarPanel.NO_SHADE_TOLERANCE;
if (rb1.isSelected()) {
if (changed) {
final SetShadeToleranceCommand c = new SetShadeToleranceCommand(sp);
sp.setShadeTolerance(SolarPanel.NO_SHADE_TOLERANCE);
sp.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (x.getShadeTolerance() != SolarPanel.NO_SHADE_TOLERANCE) {
changed = true;
break;
}
}
}
if (changed) {
final SetShadeToleranceForSolarPanelsOnFoundationCommand c = new SetShadeToleranceForSolarPanelsOnFoundationCommand(foundation);
foundation.setShadeToleranceForSolarPanels(SolarPanel.NO_SHADE_TOLERANCE);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (x.getShadeTolerance() != SolarPanel.NO_SHADE_TOLERANCE) {
changed = true;
break;
}
}
}
if (changed) {
final SetShadeToleranceForAllSolarPanelsCommand c = new SetShadeToleranceForAllSolarPanelsCommand();
Scene.getInstance().setShadeToleranceForAllSolarPanels(SolarPanel.NO_SHADE_TOLERANCE);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final ButtonGroup trackerButtonGroup = new ButtonGroup();
final JRadioButtonMenuItem miNoTracker = new JRadioButtonMenuItem("No Tracker...", true);
trackerButtonGroup.add(miNoTracker);
miNoTracker.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 SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.toString().indexOf(')') + 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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>Remove tracker for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>No tracker will be used.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, panel }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "No Tracker");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = sp.getTracker() != Trackable.NO_TRACKER;
if (rb1.isSelected()) {
if (changed) {
final SetSolarTrackerCommand c = new SetSolarTrackerCommand(sp, "No Tracker");
sp.setTracker(Trackable.NO_TRACKER);
sp.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (x.getTracker() != Trackable.NO_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersOnFoundationCommand c = new SetSolarTrackersOnFoundationCommand(foundation, sp, "No Tracker for All Solar Panels on Selected Foundation");
foundation.setTrackerForSolarPanels(Trackable.NO_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (x.getTracker() != Trackable.NO_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersForAllCommand c = new SetSolarTrackersForAllCommand(sp, "No Tracker for All Solar Panels");
Scene.getInstance().setTrackerForAllSolarPanels(Trackable.NO_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final JRadioButtonMenuItem miHorizontalSingleAxisTracker = new JRadioButtonMenuItem("Horizontal Single-Axis Tracker...");
trackerButtonGroup.add(miHorizontalSingleAxisTracker);
miHorizontalSingleAxisTracker.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 SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.toString().indexOf(')') + 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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>Set horizontal single-axis tracker for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>A horizontal single-axis tracker (HSAT) rotates about the north-south axis<br>to follow the sun from east to west during the day.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, panel }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Horizontal Single-Axis Tracker");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = sp.getTracker() != Trackable.HORIZONTAL_SINGLE_AXIS_TRACKER;
if (rb1.isSelected()) {
if (changed) {
final SetSolarTrackerCommand c = new SetSolarTrackerCommand(sp, "Horizontal Single-Axis Tracker");
sp.setTracker(SolarPanel.HORIZONTAL_SINGLE_AXIS_TRACKER);
sp.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (x.getTracker() != Trackable.HORIZONTAL_SINGLE_AXIS_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersOnFoundationCommand c = new SetSolarTrackersOnFoundationCommand(foundation, sp, "Horizontal Single-Axis Tracker for All Solar Panels on Selected Foundation");
foundation.setTrackerForSolarPanels(SolarPanel.HORIZONTAL_SINGLE_AXIS_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (x.getTracker() != Trackable.HORIZONTAL_SINGLE_AXIS_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersForAllCommand c = new SetSolarTrackersForAllCommand(sp, "Horizontal Single-Axis Tracker for All Solar Panels");
Scene.getInstance().setTrackerForAllSolarPanels(SolarPanel.HORIZONTAL_SINGLE_AXIS_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final JRadioButtonMenuItem miVerticalSingleAxisTracker = new JRadioButtonMenuItem("Vertical Single-Axis Tracker...");
trackerButtonGroup.add(miVerticalSingleAxisTracker);
miVerticalSingleAxisTracker.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 SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.toString().indexOf(')') + 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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>Set vertical single-axis tracker for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>A vertical single-axis tracker (VSAT) rotates about an axis perpendicular to the ground<br>and follow the sun from east to west during the day.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, panel }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Vertical Single-Axis Tracker");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = sp.getTracker() != Trackable.VERTICAL_SINGLE_AXIS_TRACKER;
if (rb1.isSelected()) {
if (changed) {
final SetSolarTrackerCommand c = new SetSolarTrackerCommand(sp, "Vertical Single-Axis Tracker");
sp.setTracker(SolarPanel.VERTICAL_SINGLE_AXIS_TRACKER);
sp.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (x.getTracker() != Trackable.VERTICAL_SINGLE_AXIS_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersOnFoundationCommand c = new SetSolarTrackersOnFoundationCommand(foundation, sp, "Vertical Single-Axis Tracker for All Solar Panels on Selected Foundation");
foundation.setTrackerForSolarPanels(SolarPanel.VERTICAL_SINGLE_AXIS_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (x.getTracker() != Trackable.VERTICAL_SINGLE_AXIS_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersForAllCommand c = new SetSolarTrackersForAllCommand(sp, "Vertical Single-Axis Tracker for All Solar Panels");
Scene.getInstance().setTrackerForAllSolarPanels(SolarPanel.VERTICAL_SINGLE_AXIS_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final JRadioButtonMenuItem miAltazimuthDualAxisTracker = new JRadioButtonMenuItem("Altazimuth Dual-Axis Tracker...");
trackerButtonGroup.add(miAltazimuthDualAxisTracker);
miAltazimuthDualAxisTracker.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 SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.toString().indexOf(')') + 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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>Set altitude-azimuth dual-axis tracker for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>The Alt/Az dual-axis solar tracker will rotate the solar panel to face the sun<br>all the time during the day.<hr></html>";
final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, panel }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Altitude-Azimuth Dual-Axis Tracker");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = sp.getTracker() != Trackable.ALTAZIMUTH_DUAL_AXIS_TRACKER;
if (rb1.isSelected()) {
if (changed) {
final SetSolarTrackerCommand c = new SetSolarTrackerCommand(sp, "Dual-Axis Tracker");
sp.setTracker(SolarPanel.ALTAZIMUTH_DUAL_AXIS_TRACKER);
sp.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (x.getTracker() != Trackable.ALTAZIMUTH_DUAL_AXIS_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersOnFoundationCommand c = new SetSolarTrackersOnFoundationCommand(foundation, sp, "Dual-Axis Tracker for All Solar Panels on Selected Foundation");
foundation.setTrackerForSolarPanels(SolarPanel.ALTAZIMUTH_DUAL_AXIS_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (x.getTracker() != Trackable.ALTAZIMUTH_DUAL_AXIS_TRACKER) {
changed = true;
break;
}
}
}
if (changed) {
final SetSolarTrackersForAllCommand c = new SetSolarTrackersForAllCommand(sp, "Dual-Axis Tracker for All Solar Panels");
Scene.getInstance().setTrackerForAllSolarPanels(SolarPanel.ALTAZIMUTH_DUAL_AXIS_TRACKER);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
final JMenu orientationMenu = new JMenu("Orientation");
final ButtonGroup orientationGroup = new ButtonGroup();
final JRadioButtonMenuItem rbmiLandscape = new JRadioButtonMenuItem("Landscape");
rbmiLandscape.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (rbmiLandscape.isSelected()) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof SolarPanel)) {
return;
}
final SolarPanel s = (SolarPanel) selectedPart;
if (!s.isRotated()) {
final RotateSolarPanelCommand c = new RotateSolarPanelCommand(s);
s.setRotated(true);
SceneManager.getInstance().getUndoManager().addEdit(c);
s.draw();
SceneManager.getInstance().refresh();
updateAfterEdit();
}
}
}
});
orientationMenu.add(rbmiLandscape);
orientationGroup.add(rbmiLandscape);
final JRadioButtonMenuItem rbmiPortrait = new JRadioButtonMenuItem("Portrait", true);
rbmiPortrait.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (rbmiPortrait.isSelected()) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof SolarPanel)) {
return;
}
final SolarPanel s = (SolarPanel) selectedPart;
if (s.isRotated()) {
final RotateSolarPanelCommand c = new RotateSolarPanelCommand(s);
s.setRotated(false);
SceneManager.getInstance().getUndoManager().addEdit(c);
s.draw();
SceneManager.getInstance().refresh();
updateAfterEdit();
}
}
}
});
orientationMenu.add(rbmiPortrait);
orientationGroup.add(rbmiPortrait);
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 SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.clearLabels();
s.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 SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.setLabelCustom(miLabelCustom.isSelected());
if (s.getLabelCustom()) {
s.setLabelCustomText(JOptionPane.showInputDialog(MainFrame.getInstance(), "Custom Text", s.getLabelCustomText()));
}
s.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 SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.setLabelId(miLabelId.isSelected());
s.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelId);
final JCheckBoxMenuItem miLabelModelName = new JCheckBoxMenuItem("Model");
miLabelModelName.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.setLabelModelName(miLabelModelName.isSelected());
s.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelModelName);
final JCheckBoxMenuItem miLabelCellEfficiency = new JCheckBoxMenuItem("Cell Efficiency");
miLabelCellEfficiency.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.setLabelCellEfficiency(miLabelCellEfficiency.isSelected());
s.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelCellEfficiency);
final JCheckBoxMenuItem miLabelTiltAngle = new JCheckBoxMenuItem("Tilt Angle");
miLabelTiltAngle.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.setLabelTiltAngle(miLabelTiltAngle.isSelected());
s.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelTiltAngle);
final JCheckBoxMenuItem miLabelTracker = new JCheckBoxMenuItem("Tracker");
miLabelTracker.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.setLabelTracker(miLabelTracker.isSelected());
s.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelTracker);
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 SolarPanel) {
final SolarPanel s = (SolarPanel) selectedPart;
final SetSolarPanelLabelCommand c = new SetSolarPanelLabelCommand(s);
s.setLabelEnergyOutput(miLabelEnergyOutput.isSelected());
s.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
}
});
labelMenu.add(miLabelEnergyOutput);
final JMenuItem miTiltAngle = new JMenuItem("Tilt Angle...");
miTiltAngle.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 SolarPanel)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final SolarPanel sp = (SolarPanel) selectedPart;
final String title = "<html>Tilt Angle of " + partInfo + " (°)</html>";
final String footnote = "<html><hr><font size=2>The tilt angle of a solar panel is the angle between its surface and the base surface.<br>The tilt angle must be between -90° and 90°.<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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("Only this Row", true);
final JRadioButton rb3 = new JRadioButton("All Solar Panels on This Foundation");
final JRadioButton rb4 = new JRadioButton("All Solar Panels");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
panel.add(rb4);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
bg.add(rb4);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
case 3:
rb4.setSelected(true);
break;
}
gui.add(panel, BorderLayout.CENTER);
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(sp.getTiltAngle()));
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(), "Solar Panel Tilt Angle");
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 < -90 || val > 90) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "The tilt angle must be between -90 and 90 degrees.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
if (Util.isZero(val - 90)) {
val = 89.999;
} else if (Util.isZero(val + 90)) {
val = -89.999;
}
boolean changed = Math.abs(val - sp.getTiltAngle()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeTiltAngleCommand c = new ChangeTiltAngleCommand(sp);
sp.setTiltAngle(val);
sp.draw();
if (sp.checkContainerIntersection()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This tilt angle cannot be set as the solar panel would cut into the underlying surface.", "Illegal Tilt Angle", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final List<SolarPanel> row = sp.getRow();
if (!changed) {
for (final SolarPanel x : row) {
if (Math.abs(val - x.getTiltAngle()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeTiltAngleForSolarPanelRowCommand c = new ChangeTiltAngleForSolarPanelRowCommand(row);
boolean intersected = false;
for (final SolarPanel x : row) {
x.setTiltAngle(val);
x.draw();
if (x.checkContainerIntersection()) {
intersected = true;
break;
}
}
SceneManager.getInstance().refresh();
if (intersected) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This tilt angle cannot be set as one or more solar panels would cut into the underlying surface.", "Illegal Tilt Angle", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
final Foundation foundation = sp.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (Math.abs(val - x.getTiltAngle()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationSolarPanelTiltAngleCommand c = new ChangeFoundationSolarPanelTiltAngleCommand(foundation);
foundation.setTiltAngleForSolarPanels(val);
if (foundation.checkContainerIntersectionForSolarPanels()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This tilt angle cannot be set as one or more solar panels would cut into the underlying surface.", "Illegal Tilt Angle", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 2;
} else if (rb4.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (Math.abs(val - x.getTiltAngle()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeTiltAngleForAllSolarPanelsCommand c = new ChangeTiltAngleForAllSolarPanelsCommand();
Scene.getInstance().setTiltAngleForAllSolarPanels(val);
if (Scene.getInstance().checkContainerIntersectionForAllSolarPanels()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This tilt angle cannot be set as one or more solar panels would cut into the underlying surface.", "Illegal Tilt Angle", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 3;
}
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 SolarPanel)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final SolarPanel sp = (SolarPanel) selectedPart;
final Foundation foundation = sp.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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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;
}
gui.add(panel, BorderLayout.CENTER);
double a = sp.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(), "Solar Panel 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 - sp.getRelativeAzimuth()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeAzimuthCommand c = new ChangeAzimuthCommand(sp);
sp.setRelativeAzimuth(a);
sp.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (Math.abs(a - x.getRelativeAzimuth()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationSolarPanelAzimuthCommand c = new ChangeFoundationSolarPanelAzimuthCommand(foundation);
foundation.setAzimuthForSolarPanels(a);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (Math.abs(a - x.getRelativeAzimuth()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeAzimuthForAllSolarPanelsCommand c = new ChangeAzimuthForAllSolarPanelsCommand();
Scene.getInstance().setAzimuthForAllSolarPanels(a);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
});
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 SolarPanel)) {
return;
}
final SolarPanel s = (SolarPanel) selectedPart;
final String partInfo = s.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final JPanel gui = new JPanel(new BorderLayout(5, 5));
gui.setBorder(BorderFactory.createTitledBorder("Choose Size for " + partInfo));
final JComboBox<String> sizeComboBox = new JComboBox<String>(solarPanelNominalSize.getStrings());
final int nItems = sizeComboBox.getItemCount();
for (int i = 0; i < nItems; i++) {
if (Util.isZero(s.getPanelHeight() - solarPanelNominalSize.getNominalHeights()[i]) && Util.isZero(s.getPanelWidth() - solarPanelNominalSize.getNominalWidths()[i])) {
sizeComboBox.setSelectedIndex(i);
}
}
gui.add(sizeComboBox, BorderLayout.NORTH);
if (JOptionPane.showConfirmDialog(MainFrame.getInstance(), gui, "Set Size", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.CANCEL_OPTION) {
return;
}
final int i = sizeComboBox.getSelectedIndex();
boolean changed = s.getNumberOfCellsInX() != solarPanelNominalSize.getCellNx()[i] || s.getNumberOfCellsInY() != solarPanelNominalSize.getCellNy()[i];
if (!changed) {
if (Math.abs(s.getPanelWidth() - solarPanelNominalSize.getNominalWidths()[i]) > 0.000001 || Math.abs(s.getPanelHeight() - solarPanelNominalSize.getNominalHeights()[i]) > 0.000001) {
changed = true;
}
}
if (changed) {
final ChooseSolarPanelSizeCommand c = new ChooseSolarPanelSizeCommand(s);
s.setPanelWidth(solarPanelNominalSize.getNominalWidths()[i]);
s.setPanelHeight(solarPanelNominalSize.getNominalHeights()[i]);
s.setNumberOfCellsInX(solarPanelNominalSize.getCellNx()[i]);
s.setNumberOfCellsInY(solarPanelNominalSize.getCellNy()[i]);
s.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
updateAfterEdit();
}
}
});
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 SolarPanel)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final SolarPanel sp = (SolarPanel) selectedPart;
final Foundation foundation = sp.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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("Only this Row");
final JRadioButton rb3 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb4 = new JRadioButton("All Solar Panels");
panel.add(rb1);
panel.add(rb2);
panel.add(rb3);
panel.add(rb4);
final ButtonGroup bg = new ButtonGroup();
bg.add(rb1);
bg.add(rb2);
bg.add(rb3);
bg.add(rb4);
switch(selectedScopeIndex) {
case 0:
rb1.setSelected(true);
break;
case 1:
rb2.setSelected(true);
break;
case 2:
rb3.setSelected(true);
break;
case 3:
rb4.setSelected(true);
break;
}
gui.add(panel, BorderLayout.CENTER);
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(sp.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(), "Solar Panel 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 = Math.abs(val - sp.getBaseHeight()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeBaseHeightCommand c = new ChangeBaseHeightCommand(sp);
sp.setBaseHeight(val);
sp.draw();
if (sp.checkContainerIntersection()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This base height cannot be set as the solar panel would cut into the underlying surface.", "Illegal Base Height", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final List<SolarPanel> row = sp.getRow();
for (final SolarPanel x : row) {
if (Math.abs(val - x.getBaseHeight()) > 0.000001) {
changed = true;
break;
}
}
if (changed) {
final ChangeBaseHeightForSolarPanelRowCommand c = new ChangeBaseHeightForSolarPanelRowCommand(row);
boolean intersected = false;
for (final SolarPanel x : row) {
x.setBaseHeight(val);
x.draw();
if (x.checkContainerIntersection()) {
intersected = true;
break;
}
}
if (intersected) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This base height cannot be set as one or more solar panels in the row would cut into the underlying surface.", "Illegal Base Height", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (Math.abs(val - x.getBaseHeight()) > 0.000001) {
changed = true;
break;
}
}
if (changed) {
final ChangeFoundationSolarCollectorBaseHeightCommand c = new ChangeFoundationSolarCollectorBaseHeightCommand(foundation, sp.getClass());
foundation.setBaseHeightForSolarPanels(val);
if (foundation.checkContainerIntersectionForSolarPanels()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This base height cannot be set as one or more solar panels would cut into the underlying surface.", "Illegal Base Height", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 2;
} else if (rb4.isSelected()) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (Math.abs(val - x.getBaseHeight()) > 0.000001) {
changed = true;
break;
}
}
if (changed) {
final ChangeBaseHeightForAllSolarCollectorsCommand c = new ChangeBaseHeightForAllSolarCollectorsCommand(sp.getClass());
Scene.getInstance().setBaseHeightForAllSolarPanels(val);
if (Scene.getInstance().checkContainerIntersectionForAllSolarPanels()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "This base height cannot be set as one or more solar panels would cut into the underlying surface.", "Illegal Base Height", JOptionPane.ERROR_MESSAGE);
c.undo();
} else {
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 3;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
});
final JCheckBoxMenuItem cbmiDisableEditPoint = new JCheckBoxMenuItem("Disable Edit Point");
cbmiDisableEditPoint.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 SolarPanel)) {
return;
}
final boolean disabled = cbmiDisableEditPoint.isSelected();
final SolarPanel sp = (SolarPanel) selectedPart;
final String partInfo = sp.toString().substring(0, sp.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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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 point for " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>Disable the edit point of a solar panel 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 Point");
dialog.setVisible(true);
if (optionPane.getValue() == options[0]) {
if (rb1.isSelected()) {
final LockEditPointsCommand c = new LockEditPointsCommand(sp);
sp.setLockEdit(disabled);
SceneManager.getInstance().getUndoManager().addEdit(c);
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = sp.getTopContainer();
final LockEditPointsOnFoundationCommand c = new LockEditPointsOnFoundationCommand(foundation, sp.getClass());
foundation.setLockEditForClass(disabled, sp.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
final LockEditPointsForClassCommand c = new LockEditPointsForClassCommand(sp);
Scene.getInstance().setLockEditForClass(disabled, sp.getClass());
SceneManager.getInstance().getUndoManager().addEdit(c);
selectedScopeIndex = 2;
}
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
}
});
final JCheckBoxMenuItem cbmiDrawSunBeam = new JCheckBoxMenuItem("Draw Sun Beam");
cbmiDrawSunBeam.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
final ShowSunBeamCommand c = new ShowSunBeamCommand(sp);
sp.setSunBeamVisible(cbmiDrawSunBeam.isSelected());
sp.drawSunBeam();
sp.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
Scene.getInstance().setEdited(true);
}
});
final JMenuItem miCells = new JMenuItem("Solar Cells...");
miCells.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 SolarPanel)) {
return;
}
final SolarPanel solarPanel = (SolarPanel) selectedPart;
final String title = "<html>Solar Cell Properties of " + selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1) + "</html>";
String footnote = "<html><hr><font size=2><b>How efficiently can a solar cell convert light into electricity?</b><br>The Shockley-Queisser limit is 34%. The theoretical limit for multilayer cells<br>is 86%. As of 2017, the best solar panel in the market has an efficiency of 24%.<br>The highest efficiency you can choose is limited to " + SolarPanel.MAX_SOLAR_CELL_EFFICIENCY_PERCENTAGE + "%.<hr>";
footnote += "<font size=2>Solar cells made of monocrystalline silicon are usually round or semi-round.<br>Hence, there is a small fraction of area on a solar panel not covered by cells.<br>In other words, a monocrystalline solar panel has a smaller packing density.";
footnote += "<br><font size=2>Solar cells made of polycrystalline silicon are usually square. Compared with a<br>monocrystalline solar panel, a polycrystalline one has a higher packing density.<br>Color has no relationship with efficiency.<hr></html>";
final JPanel gui = new JPanel(new BorderLayout());
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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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 JPanel inputPanel = new JPanel(new SpringLayout());
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
gui.add(inputPanel, BorderLayout.CENTER);
JLabel label = new JLabel("Type: ", JLabel.LEFT);
inputPanel.add(label);
final JComboBox<String> typeComboBox = new JComboBox<String>(new String[] { "Polycrystalline", "Monocrystalline", "Thin Film" });
typeComboBox.setSelectedIndex(solarPanel.getCellType());
label.setLabelFor(typeComboBox);
inputPanel.add(typeComboBox);
label = new JLabel("Color: ", JLabel.LEFT);
inputPanel.add(label);
final JComboBox<String> colorComboBox = new JComboBox<String>(new String[] { "Blue", "Black", "Gray" });
colorComboBox.setSelectedIndex(solarPanel.getColorOption());
label.setLabelFor(colorComboBox);
inputPanel.add(colorComboBox);
label = new JLabel("Efficiency (%): ", JLabel.LEFT);
inputPanel.add(label);
final JTextField efficiencyField = new JTextField(EnergyPanel.TWO_DECIMALS.format(solarPanel.getCellEfficiency() * 100));
label.setLabelFor(efficiencyField);
inputPanel.add(efficiencyField);
SpringUtilities.makeCompactGrid(inputPanel, 3, 2, 6, 6, 6, 6);
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(), "Solar Cell Properties");
while (true) {
efficiencyField.selectAll();
efficiencyField.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(efficiencyField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), efficiencyField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (val < SolarPanel.MIN_SOLAR_CELL_EFFICIENCY_PERCENTAGE || val > 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 {
final int cellType = typeComboBox.getSelectedIndex();
final int colorOption = colorComboBox.getSelectedIndex();
boolean changed = cellType != solarPanel.getCellType() || colorOption != solarPanel.getColorOption() || Math.abs(val * 0.01 - solarPanel.getCellEfficiency()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeSolarCellPropertiesCommand c = new ChangeSolarCellPropertiesCommand(solarPanel);
solarPanel.setCellEfficiency(val * 0.01);
solarPanel.setCellType(cellType);
solarPanel.setColorOption(colorOption);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = solarPanel.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (cellType != x.getCellType() || colorOption != x.getColorOption() || Math.abs(val * 0.01 - x.getCellEfficiency()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationSolarCellPropertiesCommand c = new ChangeFoundationSolarCellPropertiesCommand(foundation);
foundation.setSolarCellEfficiency(val * 0.01);
foundation.setCellTypeForSolarPanels(cellType);
foundation.setColorForSolarPanels(colorOption);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (cellType != x.getCellType() || colorOption != x.getColorOption() || Math.abs(val * 0.01 - x.getCellEfficiency()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeSolarCellPropertiesForAllCommand c = new ChangeSolarCellPropertiesForAllCommand();
Scene.getInstance().setSolarCellEfficiencyForAll(val * 0.01);
Scene.getInstance().setCellTypeForAllSolarPanels(cellType);
Scene.getInstance().setColorForAllSolarPanels(colorOption);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miTemperatureEffects = new JMenuItem("Temperature Effects...");
miTemperatureEffects.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 SolarPanel)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final SolarPanel solarPanel = (SolarPanel) selectedPart;
final String title = "<html>Temperature Effects of " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>Increased temperature reduces solar cell efficiency. To determine this temperature effect,<br>it is important to know the expected operating temperature: the Nominal Operating Cell<br>Temperature (NOCT). NOCT ranges from 33°C to 58°C.<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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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;
}
gui.add(panel, BorderLayout.SOUTH);
final JPanel inputPanel = new JPanel(new SpringLayout());
gui.add(inputPanel, BorderLayout.CENTER);
inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JLabel label = new JLabel("<html>Nominal Operating Cell Temperature (°C): ", JLabel.LEFT);
inputPanel.add(label);
final JTextField noctField = new JTextField(EnergyPanel.TWO_DECIMALS.format(solarPanel.getNominalOperatingCellTemperature()));
label.setLabelFor(noctField);
inputPanel.add(noctField);
label = new JLabel("<html>Temperature Coefficient of Pmax (%/°C): ", JLabel.LEFT);
inputPanel.add(label);
final JTextField pmaxField = new JTextField(EnergyPanel.TWO_DECIMALS.format(solarPanel.getTemperatureCoefficientPmax() * 100));
label.setLabelFor(pmaxField);
inputPanel.add(pmaxField);
SpringUtilities.makeCompactGrid(inputPanel, 2, 2, 6, 6, 6, 6);
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(), "Temperature Effects");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
double noct = 0;
double pmax = 0;
boolean ok = true;
try {
noct = Double.parseDouble(noctField.getText());
pmax = Double.parseDouble(pmaxField.getText());
} catch (final NumberFormatException exception) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
if (noct < 33 || noct > 58) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Nominal Operating Cell Temperature must be between 33 and 58 Celsius degrees.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (pmax < -1 || pmax > 0) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Temperature coefficient of Pmax must be between -1% and 0% per Celsius degree.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(noct - solarPanel.getNominalOperatingCellTemperature()) > 0.000001 || Math.abs(pmax * 0.01 - solarPanel.getTemperatureCoefficientPmax()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final SetTemperatureEffectsCommand c = new SetTemperatureEffectsCommand(solarPanel);
solarPanel.setTemperatureCoefficientPmax(pmax * 0.01);
solarPanel.setNominalOperatingCellTemperature(noct);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = solarPanel.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (Math.abs(noct - x.getNominalOperatingCellTemperature()) > 0.000001 || Math.abs(pmax * 0.01 - x.getTemperatureCoefficientPmax()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final SetFoundationTemperatureEffectsCommand c = new SetFoundationTemperatureEffectsCommand(foundation);
foundation.setTemperatureCoefficientPmax(pmax * 0.01);
foundation.setNominalOperatingCellTemperature(noct);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (Math.abs(noct - x.getNominalOperatingCellTemperature()) > 0.000001 || Math.abs(pmax * 0.01 - x.getTemperatureCoefficientPmax()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final SetTemperatrureEffectsForAllCommand c = new SetTemperatrureEffectsForAllCommand();
Scene.getInstance().setTemperatureCoefficientPmaxForAll(pmax * 0.01);
Scene.getInstance().setNominalOperatingCellTemperatureForAll(noct);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miInverterEff = new JMenuItem("Inverter Efficiency...");
miInverterEff.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 SolarPanel)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final SolarPanel solarPanel = (SolarPanel) selectedPart;
final String title = "<html>Inverter Efficiency (%) of " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>The efficiency of a micro inverter for converting electricity from DC to AC is typically 95%.<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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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;
}
gui.add(panel, BorderLayout.CENTER);
final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(solarPanel.getInverterEfficiency() * 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(), "Inverter 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 < SolarPanel.MIN_INVERTER_EFFICIENCY_PERCENTAGE || val >= 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 {
boolean changed = Math.abs(val * 0.01 - solarPanel.getInverterEfficiency()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeInverterEfficiencyCommand c = new ChangeInverterEfficiencyCommand(solarPanel);
solarPanel.setInverterEfficiency(val * 0.01);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
final Foundation foundation = solarPanel.getTopContainer();
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (Math.abs(val * 0.01 - x.getInverterEfficiency()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationInverterEfficiencyCommand c = new ChangeFoundationInverterEfficiencyCommand(foundation);
foundation.setSolarPanelInverterEfficiency(val * 0.01);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (Math.abs(val * 0.01 - x.getInverterEfficiency()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeInverterEfficiencyForAllCommand c = new ChangeInverterEfficiencyForAllCommand();
Scene.getInstance().setSolarPanelInverterEfficiencyForAll(val * 0.01);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
trackerMenu.add(miNoTracker);
trackerMenu.add(miHorizontalSingleAxisTracker);
trackerMenu.add(miVerticalSingleAxisTracker);
trackerMenu.add(miAltazimuthDualAxisTracker);
shadeToleranceMenu.add(miNoTolerance);
shadeToleranceMenu.add(miPartialTolerance);
shadeToleranceMenu.add(miHighTolerance);
final JMenuItem miModel = new JMenuItem("Model...");
miModel.addActionListener(new ActionListener() {
private String modelName;
// 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 SolarPanel)) {
return;
}
final SolarPanel s = (SolarPanel) selectedPart;
final Foundation foundation = s.getTopContainer();
final String partInfo = s.toString().substring(0, s.toString().indexOf(')') + 1);
final Map<String, PvModuleSpecs> modules = PvModulesData.getInstance().getModules();
final String[] models = new String[modules.size() + 1];
int i = 0;
models[i] = "Custom";
for (final String key : modules.keySet()) {
models[++i] = key;
}
final PvModuleSpecs specs = s.getPvModuleSpecs();
modelName = specs.getModel();
final JPanel gui = new JPanel(new BorderLayout(5, 5));
gui.setBorder(BorderFactory.createTitledBorder("Model for " + partInfo));
final JComboBox<String> typeComboBox = new JComboBox<String>(models);
typeComboBox.setSelectedItem(specs.getModel());
typeComboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
modelName = (String) typeComboBox.getSelectedItem();
}
}
});
gui.add(typeComboBox, BorderLayout.NORTH);
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 Solar Panel", true);
final JRadioButton rb2 = new JRadioButton("All Solar Panels on this Foundation");
final JRadioButton rb3 = new JRadioButton("All Solar Panels");
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.CENTER);
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(), "Solar Panel Model");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = !modelName.equals(s.getModelName());
if (rb1.isSelected()) {
if (changed) {
final ChangeSolarPanelModelCommand c = new ChangeSolarPanelModelCommand(s);
s.setPvModuleSpecs(PvModulesData.getInstance().getModuleSpecs(modelName));
s.draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
for (final SolarPanel x : foundation.getSolarPanels()) {
if (!modelName.equals(x.getModelName())) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeFoundationSolarPanelModelCommand c = new ChangeFoundationSolarPanelModelCommand(foundation);
foundation.setModelForSolarPanels(PvModulesData.getInstance().getModuleSpecs(modelName));
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final SolarPanel x : Scene.getInstance().getAllSolarPanels()) {
if (!modelName.equals(x.getModelName())) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeModelForAllSolarPanelsCommand c = new ChangeModelForAllSolarPanelsCommand();
Scene.getInstance().setModelForAllSolarPanels(PvModulesData.getInstance().getModuleSpecs(modelName));
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
});
popupMenuForSolarPanel = createPopupMenu(true, true, new Runnable() {
@Override
public void run() {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof SolarPanel)) {
return;
}
final SolarPanel sp = (SolarPanel) selectedPart;
switch(sp.getShadeTolerance()) {
case SolarPanel.HIGH_SHADE_TOLERANCE:
Util.selectSilently(miHighTolerance, true);
break;
case SolarPanel.PARTIAL_SHADE_TOLERANCE:
Util.selectSilently(miPartialTolerance, true);
break;
case SolarPanel.NO_SHADE_TOLERANCE:
Util.selectSilently(miNoTolerance, true);
break;
}
Util.selectSilently(cbmiDrawSunBeam, sp.isSunBeamVisible());
Util.selectSilently(cbmiDisableEditPoint, sp.getLockEdit());
Util.selectSilently(rbmiLandscape, sp.isRotated());
Util.selectSilently(rbmiPortrait, !sp.isRotated());
Util.selectSilently(miLabelNone, !sp.isLabelVisible());
Util.selectSilently(miLabelCustom, sp.getLabelCustom());
Util.selectSilently(miLabelId, sp.getLabelId());
Util.selectSilently(miLabelModelName, sp.getLabelModelName());
Util.selectSilently(miLabelCellEfficiency, sp.getLabelCellEfficiency());
Util.selectSilently(miLabelTiltAngle, sp.getLabelTiltAngle());
Util.selectSilently(miLabelTracker, sp.getLabelTracker());
Util.selectSilently(miLabelEnergyOutput, sp.getLabelEnergyOutput());
final PvModuleSpecs pms = sp.getPvModuleSpecs();
final boolean isCustom = "Custom".equals(pms.getModel());
miCells.setEnabled(isCustom);
miSize.setEnabled(isCustom);
miTemperatureEffects.setEnabled(isCustom);
shadeToleranceMenu.setEnabled(isCustom);
switch(sp.getTracker()) {
case Trackable.ALTAZIMUTH_DUAL_AXIS_TRACKER:
Util.selectSilently(miAltazimuthDualAxisTracker, true);
break;
case Trackable.HORIZONTAL_SINGLE_AXIS_TRACKER:
Util.selectSilently(miHorizontalSingleAxisTracker, true);
break;
case Trackable.VERTICAL_SINGLE_AXIS_TRACKER:
Util.selectSilently(miVerticalSingleAxisTracker, true);
break;
case Trackable.NO_TRACKER:
Util.selectSilently(miNoTracker, true);
break;
}
miAltazimuthDualAxisTracker.setEnabled(true);
miHorizontalSingleAxisTracker.setEnabled(true);
miVerticalSingleAxisTracker.setEnabled(true);
if (sp.getContainer() instanceof Roof) {
final Roof roof = (Roof) sp.getContainer();
final boolean flat = Util.isZero(roof.getHeight());
miAltazimuthDualAxisTracker.setEnabled(flat);
miHorizontalSingleAxisTracker.setEnabled(flat);
miVerticalSingleAxisTracker.setEnabled(flat);
} else if (sp.getContainer() instanceof Wall || sp.getContainer() instanceof Rack) {
miAltazimuthDualAxisTracker.setEnabled(false);
miHorizontalSingleAxisTracker.setEnabled(false);
miVerticalSingleAxisTracker.setEnabled(false);
}
if (sp.getTracker() != Trackable.NO_TRACKER) {
// vertical and tilted single-axis trackers can adjust the tilt angle
miTiltAngle.setEnabled(sp.getTracker() == Trackable.VERTICAL_SINGLE_AXIS_TRACKER || sp.getTracker() == Trackable.TILTED_SINGLE_AXIS_TRACKER);
// any tracker that will alter the azimuth angle should disable the menu item
miAzimuth.setEnabled(sp.getTracker() != Trackable.ALTAZIMUTH_DUAL_AXIS_TRACKER && sp.getTracker() != Trackable.VERTICAL_SINGLE_AXIS_TRACKER);
} else {
miTiltAngle.setEnabled(true);
miAzimuth.setEnabled(true);
miBaseHeight.setEnabled(true);
if (sp.getContainer() instanceof Roof) {
final Roof roof = (Roof) sp.getContainer();
if (roof.getHeight() > 0) {
miTiltAngle.setEnabled(false);
miAzimuth.setEnabled(false);
miBaseHeight.setEnabled(false);
}
} else if (sp.getContainer() instanceof Wall || sp.getContainer() instanceof Rack) {
miTiltAngle.setEnabled(false);
miAzimuth.setEnabled(false);
miBaseHeight.setEnabled(false);
}
}
}
});
final JMenuItem miDeleteRow = new JMenuItem("Delete Row");
miDeleteRow.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (!(selectedPart instanceof SolarPanel)) {
return;
}
SceneManager.getTaskManager().update(new Callable<Object>() {
@Override
public Object call() {
Scene.getInstance().removeAllSolarPanels(((SolarPanel) selectedPart).getRow());
return null;
}
});
}
});
popupMenuForSolarPanel.add(miDeleteRow);
popupMenuForSolarPanel.addSeparator();
popupMenuForSolarPanel.add(miModel);
popupMenuForSolarPanel.add(miCells);
popupMenuForSolarPanel.add(miSize);
popupMenuForSolarPanel.add(miTemperatureEffects);
popupMenuForSolarPanel.add(shadeToleranceMenu);
popupMenuForSolarPanel.addSeparator();
popupMenuForSolarPanel.add(miTiltAngle);
popupMenuForSolarPanel.add(miAzimuth);
popupMenuForSolarPanel.add(miBaseHeight);
popupMenuForSolarPanel.add(miInverterEff);
popupMenuForSolarPanel.add(orientationMenu);
popupMenuForSolarPanel.add(trackerMenu);
popupMenuForSolarPanel.addSeparator();
popupMenuForSolarPanel.add(cbmiDisableEditPoint);
popupMenuForSolarPanel.add(cbmiDrawSunBeam);
popupMenuForSolarPanel.add(labelMenu);
popupMenuForSolarPanel.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 SolarPanel) {
new PvDailyAnalysis().show();
}
}
});
popupMenuForSolarPanel.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 SolarPanel) {
new PvAnnualAnalysis().show();
}
}
});
popupMenuForSolarPanel.add(mi);
}
return popupMenuForSolarPanel;
}
use of org.concord.energy3d.model.Wall in project energy3d by concord-consortium.
the class PopupMenuForWindow method getPopupMenu.
static JPopupMenu getPopupMenu() {
if (popupMenuForWindow == null) {
final JMenu shutterMenu = new JMenu("Shutters");
popupMenuForWindow = createPopupMenu(true, true, new Runnable() {
@Override
public void run() {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
shutterMenu.setEnabled(selectedPart.getContainer() instanceof Wall);
}
}
});
final JMenu muntinMenu = new JMenu("Muntins");
final JCheckBoxMenuItem cbmiHorizontalBars = new JCheckBoxMenuItem("Horizontal Bars");
cbmiHorizontalBars.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
w.setHorizontalBars(cbmiHorizontalBars.isSelected());
w.draw();
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
}
});
muntinMenu.add(cbmiHorizontalBars);
final JCheckBoxMenuItem cbmiVerticalBars = new JCheckBoxMenuItem("Vertical Bars");
cbmiVerticalBars.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
w.setVerticalBars(cbmiVerticalBars.isSelected());
w.draw();
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
}
});
muntinMenu.add(cbmiVerticalBars);
muntinMenu.addSeparator();
final ButtonGroup muntinButtonGroup = new ButtonGroup();
final JRadioButtonMenuItem miMoreBars = new JRadioButtonMenuItem("More Bars");
miMoreBars.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
w.setStyle(Window.MORE_MUNTIN_BARS);
w.draw();
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
}
}
});
muntinButtonGroup.add(miMoreBars);
muntinMenu.add(miMoreBars);
final JRadioButtonMenuItem miMediumBars = new JRadioButtonMenuItem("Medium Bars");
miMediumBars.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
w.setStyle(Window.MEDIUM_MUNTIN_BARS);
w.draw();
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
}
}
});
muntinButtonGroup.add(miMediumBars);
muntinMenu.add(miMediumBars);
final JRadioButtonMenuItem miLessBars = new JRadioButtonMenuItem("Less Bars");
miLessBars.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
w.setStyle(Window.LESS_MUNTIN_BARS);
w.draw();
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
}
}
});
muntinButtonGroup.add(miLessBars);
muntinMenu.add(miLessBars);
muntinMenu.addMenuListener(new MenuListener() {
@Override
public void menuSelected(final MenuEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window window = (Window) selectedPart;
switch(window.getStyle()) {
case Window.MORE_MUNTIN_BARS:
Util.selectSilently(miMoreBars, true);
break;
case Window.MEDIUM_MUNTIN_BARS:
Util.selectSilently(miMediumBars, true);
break;
case Window.LESS_MUNTIN_BARS:
Util.selectSilently(miLessBars, true);
break;
}
// NO_MUNTIN_BAR backward compatibility
Util.selectSilently(cbmiHorizontalBars, window.getStyle() != Window.NO_MUNTIN_BAR && window.getHorizontalBars());
Util.selectSilently(cbmiVerticalBars, window.getStyle() != Window.NO_MUNTIN_BAR && window.getVerticalBars());
}
}
@Override
public void menuDeselected(final MenuEvent e) {
muntinMenu.setEnabled(true);
}
@Override
public void menuCanceled(final MenuEvent e) {
muntinMenu.setEnabled(true);
}
});
final JCheckBoxMenuItem cbmiBothShutters = new JCheckBoxMenuItem("Both Shutters");
final JCheckBoxMenuItem cbmiLeftShutter = new JCheckBoxMenuItem("Left Shutter");
final JCheckBoxMenuItem cbmiRightShutter = new JCheckBoxMenuItem("Right Shutter");
cbmiLeftShutter.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
final ChangeWindowShuttersCommand c = new ChangeWindowShuttersCommand(w);
w.setLeftShutter(cbmiLeftShutter.isSelected());
w.draw();
Scene.getInstance().setEdited(true);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
}
});
shutterMenu.add(cbmiLeftShutter);
cbmiRightShutter.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
final ChangeWindowShuttersCommand c = new ChangeWindowShuttersCommand(w);
w.setRightShutter(cbmiRightShutter.isSelected());
w.draw();
Scene.getInstance().setEdited(true);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
}
});
shutterMenu.add(cbmiRightShutter);
cbmiBothShutters.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window w = (Window) selectedPart;
final ChangeWindowShuttersCommand c = new ChangeWindowShuttersCommand(w);
w.setLeftShutter(cbmiBothShutters.isSelected());
w.setRightShutter(cbmiBothShutters.isSelected());
w.draw();
Scene.getInstance().setEdited(true);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
}
});
shutterMenu.add(cbmiBothShutters);
shutterMenu.addSeparator();
final JMenuItem miShutterColor = new JMenuItem("Color...");
miShutterColor.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 Window)) {
return;
}
final Window window = (Window) selectedPart;
final JColorChooser colorChooser = MainFrame.getInstance().getColorChooser();
final ReadOnlyColorRGBA color = window.getShutterColor();
if (color != null) {
colorChooser.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue()));
}
final ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final Color c = colorChooser.getColor();
final float[] newColor = c.getComponents(null);
final ColorRGBA color = new ColorRGBA(newColor[0], newColor[1], newColor[2], 1);
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Window", true);
final JRadioButton rb2 = new JRadioButton("All Windows on this " + (window.getContainer() instanceof Wall ? "Wall" : "Roof"));
final JRadioButton rb3 = new JRadioButton("All Windows of this Building");
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 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(), "Shutter Color");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = !color.equals(window.getShutterColor());
if (rb1.isSelected()) {
// apply to only this window
if (changed) {
final ChangeShutterColorCommand cmd = new ChangeShutterColorCommand(window);
window.setShutterColor(color);
window.draw();
SceneManager.getInstance().getUndoManager().addEdit(cmd);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
if (window.getContainer() instanceof Wall) {
final Wall wall = (Wall) window.getContainer();
for (final Window x : wall.getWindows()) {
if (!color.equals(x.getShutterColor())) {
changed = true;
break;
}
}
} else if (window.getContainer() instanceof Roof) {
final Roof roof = (Roof) window.getContainer();
for (final Window x : roof.getWindows()) {
if (!color.equals(x.getShutterColor())) {
changed = true;
break;
}
}
}
}
if (changed) {
final ChangeContainerShutterColorCommand cmd = new ChangeContainerShutterColorCommand(window.getContainer());
Scene.getInstance().setWindowColorInContainer(window.getContainer(), color, true);
SceneManager.getInstance().getUndoManager().addEdit(cmd);
}
selectedScopeIndex = 1;
} else {
final Foundation foundation = window.getTopContainer();
if (!changed) {
for (final Window x : foundation.getWindows()) {
if (!color.equals(x.getShutterColor())) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeBuildingShutterColorCommand cmd = new ChangeBuildingShutterColorCommand(window);
Scene.getInstance().setShutterColorOfBuilding(window, color);
SceneManager.getInstance().getUndoManager().addEdit(cmd);
}
selectedScopeIndex = 2;
}
if (changed) {
Scene.getInstance().setEdited(true);
SceneManager.getInstance().refresh();
}
if (choice == options[0]) {
break;
}
}
}
}
};
JColorChooser.createDialog(MainFrame.getInstance(), "Select Shutter Color", true, colorChooser, actionListener, null).setVisible(true);
}
});
shutterMenu.add(miShutterColor);
final JMenuItem miShutterLength = new JMenuItem("Relative Length...");
miShutterLength.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 Window)) {
return;
}
final Window window = (Window) selectedPart;
final String partInfo = window.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final String title = "<html>Relative Length of Shutter for " + partInfo + "</html>";
final String footnote = "<html><hr width=400></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Window Shutter", true);
final JRadioButton rb2 = new JRadioButton("All Window Shutters on this Wall");
final JRadioButton rb3 = new JRadioButton("All Window Shutters of this Building");
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;
}
gui.add(panel, BorderLayout.CENTER);
final JTextField inputField = new JTextField(window.getShutterLength() + "");
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(), "Shutter Length (Relative)");
while (true) {
dialog.setVisible(true);
inputField.selectAll();
inputField.requestFocusInWindow();
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
double val = 0;
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 <= 0 || val > 1) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Relative shutter length must be within (0, 1).", "Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(val - window.getShutterLength()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeShutterLengthCommand c = new ChangeShutterLengthCommand(window);
window.setShutterLength(val);
window.draw();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
if (window.getContainer() instanceof Wall) {
final Wall wall = (Wall) window.getContainer();
for (final Window x : wall.getWindows()) {
if (Math.abs(val - x.getShutterLength()) > 0.000001) {
changed = true;
break;
}
}
} else if (window.getContainer() instanceof Roof) {
final Roof roof = (Roof) window.getContainer();
for (final Window x : roof.getWindows()) {
if (Math.abs(val - x.getShutterLength()) > 0.000001) {
changed = true;
break;
}
}
}
}
if (changed) {
Scene.getInstance().setShutterLengthInContainer(window.getContainer(), val);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
final Foundation foundation = window.getTopContainer();
if (!changed) {
for (final Window x : foundation.getWindows()) {
if (Math.abs(val - x.getShutterLength()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
Scene.getInstance().setShutterLengthOfBuilding(window, val);
}
selectedScopeIndex = 2;
}
if (changed) {
SceneManager.getInstance().refresh();
Scene.getInstance().setEdited(true);
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
shutterMenu.add(miShutterLength);
shutterMenu.addMenuListener(new MenuListener() {
@Override
public void menuSelected(final MenuEvent e) {
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart instanceof Window) {
final Window window = (Window) selectedPart;
Util.selectSilently(cbmiLeftShutter, window.getLeftShutter());
Util.selectSilently(cbmiRightShutter, window.getRightShutter());
Util.selectSilently(cbmiBothShutters, window.getLeftShutter() && window.getRightShutter());
}
}
@Override
public void menuDeselected(final MenuEvent e) {
shutterMenu.setEnabled(true);
}
@Override
public void menuCanceled(final MenuEvent e) {
shutterMenu.setEnabled(true);
}
});
final JMenuItem miShgc = new JMenuItem("Solar Heat Gain Coefficient...");
miShgc.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 Window)) {
return;
}
final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
final Window window = (Window) selectedPart;
final String title = "<html>Solar Heat Gain Coefficient of " + partInfo + "</html>";
final String footnote = "<html><hr><font size=2>Examples:<br><table><tr><td><font size=2>Single glass (clear)</td><td><font size=2>0.66</td></tr><tr><td><font size=2>Single glass (green tint)</td><td><font size=2>0.55</td></tr><tr><td><font size=2>Triple glass (air spaces)</td><td><font size=2>0.39</td></tr></table><hr></html>";
final JPanel gui = new JPanel(new BorderLayout());
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Window", true);
final JRadioButton rb2 = new JRadioButton("All Windows on this " + (selectedPart.getContainer() instanceof Wall ? "Wall" : "Roof"));
final JRadioButton rb3 = new JRadioButton("All Windows of this Building");
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;
}
gui.add(panel, BorderLayout.CENTER);
final JTextField inputField = new JTextField(window.getSolarHeatGainCoefficient() + "");
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(), "Solar Heat Gain Coefficient (SHGC)");
while (true) {
dialog.setVisible(true);
inputField.selectAll();
inputField.requestFocusInWindow();
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
double val = 0;
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 < 0 || val > 1) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Solar heat gain coefficient must be between 0 and 1.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(val - window.getSolarHeatGainCoefficient()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final ChangeWindowShgcCommand c = new ChangeWindowShgcCommand(window);
window.setSolarHeatGainCoefficient(val);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
if (window.getContainer() instanceof Wall) {
final Wall wall = (Wall) window.getContainer();
for (final Window x : wall.getWindows()) {
if (Math.abs(val - x.getSolarHeatGainCoefficient()) > 0.000001) {
changed = true;
break;
}
}
} else if (window.getContainer() instanceof Roof) {
final Roof roof = (Roof) window.getContainer();
for (final Window x : roof.getWindows()) {
if (Math.abs(val - x.getSolarHeatGainCoefficient()) > 0.000001) {
changed = true;
break;
}
}
}
}
if (changed) {
final ChangeContainerWindowShgcCommand c = new ChangeContainerWindowShgcCommand(window.getContainer());
Scene.getInstance().setWindowShgcInContainer(window.getContainer(), val);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
final Foundation foundation = window.getTopContainer();
if (!changed) {
for (final Window x : foundation.getWindows()) {
if (Math.abs(val - x.getSolarHeatGainCoefficient()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeBuildingWindowShgcCommand c = new ChangeBuildingWindowShgcCommand(foundation);
Scene.getInstance().setWindowShgcOfBuilding(foundation, val);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenuItem miTint = new JMenuItem("Tint...");
miTint.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 Window)) {
return;
}
final Window window = (Window) selectedPart;
final JColorChooser colorChooser = MainFrame.getInstance().getColorChooser();
final ReadOnlyColorRGBA color = window.getColor();
if (color != null) {
colorChooser.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue()));
}
final ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
final Color c = colorChooser.getColor();
final float[] newColor = c.getComponents(null);
final ColorRGBA color = new ColorRGBA(newColor[0], newColor[1], newColor[2], (float) (1.0 - window.getSolarHeatGainCoefficient()));
final JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
final JRadioButton rb1 = new JRadioButton("Only this Window", true);
final JRadioButton rb2 = new JRadioButton("All Windows on this " + (window.getContainer() instanceof Wall ? "Wall" : "Roof"));
final JRadioButton rb3 = new JRadioButton("All Windows of this Building");
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 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(), "Window Tint");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean changed = !Util.isRGBEqual(color, window.getColor());
if (rb1.isSelected()) {
// apply to only this window
if (changed) {
final ChangePartColorCommand cmd = new ChangePartColorCommand(window);
window.setColor(color);
SceneManager.getInstance().getUndoManager().addEdit(cmd);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
if (window.getContainer() instanceof Wall) {
final Wall wall = (Wall) window.getContainer();
for (final Window x : wall.getWindows()) {
if (!Util.isRGBEqual(color, x.getColor())) {
changed = true;
break;
}
}
} else if (window.getContainer() instanceof Roof) {
final Roof roof = (Roof) window.getContainer();
for (final Window x : roof.getWindows()) {
if (!Util.isRGBEqual(color, x.getColor())) {
changed = true;
break;
}
}
}
}
if (changed) {
final ChangeContainerWindowColorCommand cmd = new ChangeContainerWindowColorCommand(window.getContainer());
Scene.getInstance().setWindowColorInContainer(window.getContainer(), color, false);
SceneManager.getInstance().getUndoManager().addEdit(cmd);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
final Foundation foundation = window.getTopContainer();
if (!changed) {
for (final Window x : foundation.getWindows()) {
if (!Util.isRGBEqual(color, x.getColor())) {
changed = true;
break;
}
}
}
if (changed) {
final ChangeBuildingColorCommand cmd = new ChangeBuildingColorCommand(window);
Scene.getInstance().setPartColorOfBuilding(window, color);
SceneManager.getInstance().getUndoManager().addEdit(cmd);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
};
JColorChooser.createDialog(MainFrame.getInstance(), "Select Tint", true, colorChooser, actionListener, null).setVisible(true);
}
});
final JMenuItem miSize = new JMenuItem("Size...");
miSize.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 Window)) {
return;
}
final Window window = (Window) selectedPart;
final HousePart container = window.getContainer();
final Foundation foundation = window.getTopContainer();
final String partInfo = window.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("Width (m): "));
final JTextField widthField = new JTextField(threeDecimalsFormat.format(window.getWindowWidth()));
inputPanel.add(widthField);
inputPanel.add(new JLabel("Height (m): "));
final JTextField heightField = new JTextField(threeDecimalsFormat.format(window.getWindowHeight()));
inputPanel.add(heightField);
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 Window", true);
final JRadioButton rb2 = new JRadioButton("All Windows on this " + (window.getContainer() instanceof Wall ? "Wall" : "Roof"));
final JRadioButton rb3 = new JRadioButton("All Windows of this Building");
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 Size for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Window Size");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
double w = 0, h = 0;
try {
w = Double.parseDouble(widthField.getText());
h = Double.parseDouble(heightField.getText());
} catch (final NumberFormatException x) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
double wmax = 10;
if (container instanceof Wall) {
wmax = ((Wall) container).getWallWidth() * 0.99;
}
double hmax = 10;
if (container instanceof Wall) {
hmax = ((Wall) container).getWallHeight() * 0.99;
}
if (w < 0.1 || w > wmax) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Width must be between 0.1 and " + (int) wmax + " m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (h < 0.1 || h > hmax) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Height must be between 0.1 and " + (int) hmax + " m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(w - window.getWindowWidth()) > 0.000001 || Math.abs(h - window.getWindowHeight()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final SetPartSizeCommand c = new SetPartSizeCommand(window);
window.setWindowWidth(w);
window.setWindowHeight(h);
window.draw();
window.getContainer().draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
if (window.getContainer() instanceof Wall) {
final Wall wall = (Wall) window.getContainer();
for (final Window x : wall.getWindows()) {
if (Math.abs(w - x.getWindowWidth()) > 0.000001 || Math.abs(h - x.getWindowHeight()) > 0.000001) {
changed = true;
break;
}
}
} else if (window.getContainer() instanceof Roof) {
final Roof roof = (Roof) window.getContainer();
for (final Window x : roof.getWindows()) {
if (Math.abs(w - x.getWindowWidth()) > 0.000001 || Math.abs(h - x.getWindowHeight()) > 0.000001) {
changed = true;
break;
}
}
}
}
if (changed) {
final ChangeContainerWindowSizeCommand c = new ChangeContainerWindowSizeCommand(window.getContainer());
Scene.getInstance().setWindowSizeInContainer(window.getContainer(), w, h);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final Window x : foundation.getWindows()) {
if (Math.abs(w - x.getWindowWidth()) > 0.000001 || Math.abs(h - x.getWindowHeight()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForWindowsOnFoundationCommand c = new SetSizeForWindowsOnFoundationCommand(foundation);
foundation.setSizeForWindows(w, h);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
popupMenuForWindow.addSeparator();
popupMenuForWindow.add(miSize);
popupMenuForWindow.add(miTint);
popupMenuForWindow.add(createInsulationMenuItem(true));
popupMenuForWindow.add(miShgc);
popupMenuForWindow.add(muntinMenu);
popupMenuForWindow.add(shutterMenu);
popupMenuForWindow.addSeparator();
JMenuItem mi = new JMenuItem("Daily Energy Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof Window) {
new EnergyDailyAnalysis().show("Daily Energy for Window");
}
}
});
popupMenuForWindow.add(mi);
mi = new JMenuItem("Annual Energy Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof Window) {
new EnergyAnnualAnalysis().show("Annual Energy for Window");
}
}
});
popupMenuForWindow.add(mi);
}
return popupMenuForWindow;
}
use of org.concord.energy3d.model.Wall in project energy3d by concord-consortium.
the class PopupMenuForDoor method getPopupMenu.
static JPopupMenu getPopupMenu() {
if (popupMenuForDoor == null) {
final JMenuItem miSize = new JMenuItem("Size...");
miSize.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 Door)) {
return;
}
final Door door = (Door) selectedPart;
final HousePart container = door.getContainer();
final Foundation foundation = door.getTopContainer();
final String partInfo = door.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("Width (m): "));
final JTextField widthField = new JTextField(threeDecimalsFormat.format(door.getDoorWidth()));
inputPanel.add(widthField);
inputPanel.add(new JLabel("Height (m): "));
final JTextField heightField = new JTextField(threeDecimalsFormat.format(door.getDoorHeight()));
inputPanel.add(heightField);
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 Door", true);
final JRadioButton rb2 = new JRadioButton("All Doors on this Wall");
final JRadioButton rb3 = new JRadioButton("All Doors of this Building");
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 Size for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Door Size");
while (true) {
dialog.setVisible(true);
final Object choice = optionPane.getValue();
if (choice == options[1] || choice == null) {
break;
} else {
boolean ok = true;
double w = 0, h = 0;
try {
w = Double.parseDouble(widthField.getText());
h = Double.parseDouble(heightField.getText());
} catch (final NumberFormatException x) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
ok = false;
}
if (ok) {
double wmax = 10;
if (container instanceof Wall) {
wmax = ((Wall) container).getWallWidth() * 0.99;
}
double hmax = 10;
if (container instanceof Wall) {
hmax = ((Wall) container).getWallHeight() * 0.99;
}
if (w < 0.1 || w > wmax) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Width must be between 0.1 and " + (int) wmax + " m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else if (h < 0.1 || h > hmax) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "Height must be between 0.1 and " + (int) hmax + " m.", "Range Error", JOptionPane.ERROR_MESSAGE);
} else {
boolean changed = Math.abs(w - door.getDoorWidth()) > 0.000001 || Math.abs(h - door.getDoorHeight()) > 0.000001;
if (rb1.isSelected()) {
if (changed) {
final SetPartSizeCommand c = new SetPartSizeCommand(door);
door.setDoorWidth(w);
door.setDoorHeight(h);
door.draw();
door.getContainer().draw();
SceneManager.getInstance().refresh();
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 0;
} else if (rb2.isSelected()) {
if (!changed) {
if (door.getContainer() instanceof Wall) {
final Wall wall = (Wall) door.getContainer();
for (final Door x : wall.getDoors()) {
if (Math.abs(w - x.getDoorWidth()) > 0.000001 || Math.abs(h - x.getDoorHeight()) > 0.000001) {
changed = true;
break;
}
}
}
}
if (changed) {
if (door.getContainer() instanceof Wall) {
final Wall wall = (Wall) door.getContainer();
final ChangeDoorSizeOnWallCommand c = new ChangeDoorSizeOnWallCommand(wall);
wall.setDoorSize(w, h);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
selectedScopeIndex = 1;
} else if (rb3.isSelected()) {
if (!changed) {
for (final Door x : foundation.getDoors()) {
if (Math.abs(w - x.getDoorWidth()) > 0.000001 || Math.abs(h - x.getDoorHeight()) > 0.000001) {
changed = true;
break;
}
}
}
if (changed) {
final SetSizeForDoorsOnFoundationCommand c = new SetSizeForDoorsOnFoundationCommand(foundation);
foundation.setSizeForDoors(w, h);
SceneManager.getInstance().getUndoManager().addEdit(c);
}
selectedScopeIndex = 2;
}
if (changed) {
updateAfterEdit();
}
if (choice == options[0]) {
break;
}
}
}
}
}
}
});
final JMenu textureMenu = new JMenu("Texture");
final ButtonGroup textureGroup = new ButtonGroup();
final JRadioButtonMenuItem rbmiTextureNone = new JRadioButtonMenuItem("No Texture");
rbmiTextureNone.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final ChangeBuildingTextureCommand c = new ChangeBuildingTextureCommand();
Scene.getInstance().setTextureMode(TextureMode.None);
Scene.getInstance().setEdited(true);
if (MainPanel.getInstance().getEnergyButton().isSelected()) {
MainPanel.getInstance().getEnergyButton().setSelected(false);
}
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
});
textureGroup.add(rbmiTextureNone);
textureMenu.add(rbmiTextureNone);
final JRadioButtonMenuItem rbmiTextureOutline = new JRadioButtonMenuItem("Outline Texture");
rbmiTextureOutline.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
final ChangeBuildingTextureCommand c = new ChangeBuildingTextureCommand();
Scene.getInstance().setTextureMode(TextureMode.Simple);
Scene.getInstance().setEdited(true);
if (MainPanel.getInstance().getEnergyButton().isSelected()) {
MainPanel.getInstance().getEnergyButton().setSelected(false);
}
SceneManager.getInstance().getUndoManager().addEdit(c);
}
}
});
textureGroup.add(rbmiTextureOutline);
textureMenu.add(rbmiTextureOutline);
textureMenu.addSeparator();
final JRadioButtonMenuItem rbmiTexture01 = MainFrame.getInstance().createWallTextureMenuItem(Door.TEXTURE_01, "icons/door_01.png");
textureGroup.add(rbmiTexture01);
textureMenu.add(rbmiTexture01);
textureMenu.addMenuListener(new MenuListener() {
@Override
public void menuSelected(final MenuEvent e) {
if (Scene.getInstance().getTextureMode() == TextureMode.None) {
Util.selectSilently(rbmiTextureNone, true);
return;
}
if (Scene.getInstance().getTextureMode() == TextureMode.Simple) {
Util.selectSilently(rbmiTextureOutline, true);
return;
}
switch(Scene.getInstance().getWallTextureType()) {
case Door.TEXTURE_01:
Util.selectSilently(rbmiTexture01, true);
break;
}
}
@Override
public void menuDeselected(final MenuEvent e) {
textureMenu.setEnabled(true);
}
@Override
public void menuCanceled(final MenuEvent e) {
textureMenu.setEnabled(true);
}
});
popupMenuForDoor = createPopupMenu(false, false, null);
popupMenuForDoor.addSeparator();
popupMenuForDoor.add(miSize);
popupMenuForDoor.add(colorAction);
popupMenuForDoor.add(textureMenu);
popupMenuForDoor.add(createInsulationMenuItem(true));
popupMenuForDoor.add(createVolumetricHeatCapacityMenuItem());
popupMenuForDoor.addSeparator();
JMenuItem mi = new JMenuItem("Daily Energy Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof Door) {
new EnergyDailyAnalysis().show("Daily Energy for Door");
}
}
});
popupMenuForDoor.add(mi);
mi = new JMenuItem("Annual Energy Analysis...");
mi.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (EnergyPanel.getInstance().adjustCellSize()) {
return;
}
if (SceneManager.getInstance().getSelectedPart() instanceof Door) {
new EnergyAnnualAnalysis().show("Annual Energy for Door");
}
}
});
popupMenuForDoor.add(mi);
}
return popupMenuForDoor;
}
use of org.concord.energy3d.model.Wall in project energy3d by concord-consortium.
the class TimeSeriesLogger method record.
private void record() {
final URL url = Scene.getURL();
if (url == null) {
return;
}
/* write the header */
String filename = url == null ? null : new File(url.getFile()).getName();
if (Scene.isInternalFile()) {
filename = "@" + filename;
}
final Date time = Calendar.getInstance().getTime();
final String timestamp = TIME_FORMAT.format(time);
String line = "";
if (Scene.getInstance().getProjectName() != null && !Scene.getInstance().getProjectName().trim().equals("")) {
line += "\"Project\": \"" + Scene.getInstance().getProjectName() + "\", ";
}
line += "\"File\": \"" + filename + "\"";
if (action != null) {
if ((lastTime != null && Math.abs(time.getTime() - lastTime.getTime()) < MINIMUM_INTERVAL) && action.equals(lastAction)) {
// don't log too frequently for the same type of action
return;
}
HousePart actedPart = null;
String stateValue = null;
// special treatments
if (action.equals("Undo")) {
String s = SceneManager.getInstance().getUndoManager().getRedoPresentationName();
if (s.length() >= 4) {
s = s.substring(4, s.length()).trim();
}
stateValue = "\"" + s + "\"";
} else if (action.equals("Redo")) {
String s = SceneManager.getInstance().getUndoManager().getUndoPresentationName();
if (s.length() >= 4) {
s = s.substring(4, s.length()).trim();
}
stateValue = "\"" + s + "\"";
} else if (action.equals("Save")) {
// append * at the end so that the ng3 suffix is not interpreted as a delimiter
stateValue = "\"" + Scene.getURL().toString() + "*\"";
} else if (action.equals("Note")) {
final String s = MainPanel.getInstance().getNoteString();
if (s.length() > 0) {
stateValue = "\"" + s + "\"";
MainPanel.getInstance().setNoteString("");
}
} else if (action.equals("Camera")) {
stateValue = "{" + cameraPosition + ", \"Mode\": \"" + cameraMode + "\"}";
} else if (action.equals("Graph Tab")) {
stateValue = "\"" + graphTabName + "\"";
} else if (action.equals("Adjust Thermostat")) {
final HousePart p = SceneManager.getInstance().getSelectedPart();
if (p instanceof Foundation) {
stateValue = "{\"Building\": " + p.getId() + "}";
}
} else if (action.equals("Show Curve")) {
stateValue = "{\"Graph\": \"" + graphName + "\", \"Name\": \"" + curveName + "\", \"Shown\": " + curveShown + "}";
} else if (action.equals("Show Run")) {
stateValue = "{\"Graph\": \"" + graphName + "\", \"ID\": \"" + runID + "\", \"Shown\": " + runShown + "}";
} else if (action.equals("Clear Graph Data")) {
stateValue = "\"" + graphName + "\"";
} else {
/* everything else */
final UndoableEdit lastEdit = SceneManager.getInstance().getUndoManager().lastEdit();
if (lastEdit instanceof AddPartCommand) {
actedPart = ((AddPartCommand) lastEdit).getPart();
} else if (lastEdit instanceof AddMultiplePartsCommand) {
final AddMultiplePartsCommand c = (AddMultiplePartsCommand) lastEdit;
if (c.getURL() != null) {
stateValue = "{\"Import\": \"" + c.getURL() + "\"}";
}
} else if (lastEdit instanceof AddArrayCommand) {
final AddArrayCommand c = (AddArrayCommand) lastEdit;
final HousePart p = c.getParent();
if (p instanceof Foundation) {
final Foundation f = (Foundation) p;
stateValue = "{\"Foundation\": " + f.getId() + ", \"Old Array Size\": " + c.getOldArray().size() + ", \"New Array Size\": " + f.countParts(c.getTypes()) + "}";
} else if (p instanceof Rack) {
final Foundation f = p.getTopContainer();
stateValue = "{\"Foundation\": " + f.getId() + ", \"Rack\": " + p.getId() + ", \"Old Array Size\": " + c.getOldArray().size() + ", \"New Array Size\": " + p.getChildren().size() + "}";
}
} else if (lastEdit instanceof PastePartCommand) {
actedPart = ((PastePartCommand) lastEdit).getPart();
if (actedPart instanceof Foundation) {
stateValue = "{\"Building\": " + actedPart.getId() + "}";
// FIXME: work around a bug related to pasting a building, fix later
actedPart = null;
}
} else if (lastEdit instanceof EditPartCommand) {
actedPart = ((EditPartCommand) lastEdit).getPart();
} else if (lastEdit instanceof RemovePartCommand) {
actedPart = ((RemovePartCommand) lastEdit).getPart();
} else if (lastEdit instanceof RemoveMultiplePartsCommand) {
final Foundation f = ((RemoveMultiplePartsCommand) lastEdit).getFoundation();
if (f != null) {
stateValue = "{\"Building\": " + f.getId() + "}";
}
} else if (lastEdit instanceof RotateBuildingCommand) {
final RotateBuildingCommand c = (RotateBuildingCommand) lastEdit;
final Foundation f = c.getFoundation();
if (f != null) {
stateValue = "{\"Building\": " + f.getId() + ", \"Angle\": " + Math.toDegrees(c.getRotationAngle()) + "}";
} else {
stateValue = "{\"Angle\": " + Math.toDegrees(c.getRotationAngle()) + "}";
}
} else if (lastEdit instanceof RescaleBuildingCommand) {
final RescaleBuildingCommand c = (RescaleBuildingCommand) lastEdit;
final Foundation f = c.getFoundation();
if (f != null) {
stateValue = "{\"Building\": " + f.getId();
stateValue += ", \"Old X Length\": " + c.getOldXLength() + ", \"New X Length\": " + c.getNewXLength();
stateValue += ", \"Old Y Length\": " + c.getOldYLength() + ", \"New Y Length\": " + c.getNewYLength();
stateValue += ", \"Old Z Length\": " + c.getOldZLength() + ", \"New Z Length\": " + c.getNewZLength();
stateValue += "}";
}
} else if (lastEdit instanceof MovePartCommand) {
final MovePartCommand c = (MovePartCommand) lastEdit;
final HousePart p = c.getPart();
final Vector3 d = c.getDisplacement();
final String s = "\"(" + d.getX() + ", " + d.getY() + ")\"";
if (p != null) {
stateValue = "{\"Part\": " + p.getId() + ", \"Displacement\": " + s + "}";
} else {
stateValue = "{\"Displacement\": " + s + "}";
}
} else if (lastEdit instanceof DeleteUtilityBillCommand) {
final DeleteUtilityBillCommand c = (DeleteUtilityBillCommand) lastEdit;
final Foundation f = c.getFoundation();
stateValue = "{\"Building\": " + f.getId() + "}";
} else if (lastEdit instanceof AnimateSunCommand) {
stateValue = "" + ((AnimateSunCommand) lastEdit).getNewValue();
} else if (lastEdit instanceof ShowShadowCommand) {
stateValue = "" + ((ShowShadowCommand) lastEdit).getNewValue();
} else if (lastEdit instanceof ShowHeatFluxCommand) {
stateValue = "" + ((ShowHeatFluxCommand) lastEdit).getNewValue();
} else if (lastEdit instanceof SpinViewCommand) {
stateValue = "" + ((SpinViewCommand) lastEdit).getNewValue();
} else if (lastEdit instanceof ShowAxesCommand) {
stateValue = "" + ((ShowAxesCommand) lastEdit).getNewValue();
} else if (lastEdit instanceof ShowAnnotationCommand) {
stateValue = "" + ((ShowAnnotationCommand) lastEdit).getNewValue();
} else if (lastEdit instanceof ShowHeliodonCommand) {
stateValue = "" + ((ShowHeliodonCommand) lastEdit).getNewValue();
} else if (lastEdit instanceof TopViewCommand) {
stateValue = "" + (SceneManager.getInstance().getViewMode() == ViewMode.TOP_VIEW);
} else if (lastEdit instanceof ZoomCommand) {
stateValue = "" + ((ZoomCommand) lastEdit).getValue();
} else if (lastEdit instanceof RescaleCommand) {
final RescaleCommand c = (RescaleCommand) lastEdit;
stateValue = "{\"Old Value\": " + c.getOldValue() + ", \"New Value\": " + Scene.getInstance().getAnnotationScale() + "}";
} else if (lastEdit instanceof ChangeBackgroundAlbedoCommand) {
final ChangeBackgroundAlbedoCommand c = (ChangeBackgroundAlbedoCommand) lastEdit;
stateValue = "{\"Old Value\": " + c.getOldValue() + ", \"New Value\": " + Scene.getInstance().getGround().getAlbedo() + "}";
} else if (lastEdit instanceof ChangeGroundThermalDiffusivityCommand) {
final ChangeGroundThermalDiffusivityCommand c = (ChangeGroundThermalDiffusivityCommand) lastEdit;
stateValue = "{\"Old Value\": " + c.getOldValue() + ", \"New Value\": " + Scene.getInstance().getGround().getThermalDiffusivity() + "}";
} else if (lastEdit instanceof ChangeAtmosphericDustLossCommand) {
final ChangeAtmosphericDustLossCommand c = (ChangeAtmosphericDustLossCommand) lastEdit;
final double[] oldValues = c.getOldValue();
String oldValueString = "\"";
for (final double x : oldValues) {
oldValueString += x + " ";
}
oldValueString.trim();
oldValueString += "\"";
String newValueString = "\"";
for (int i = 0; i < 12; i++) {
newValueString += Scene.getInstance().getAtmosphere().getDustLoss(i) + " ";
}
newValueString.trim();
newValueString += "\"";
stateValue = "{\"Old Values\": " + oldValueString + ", \"New Values\": " + newValueString + "}";
} else if (lastEdit instanceof ChangeSnowReflectionFactorCommand) {
final ChangeSnowReflectionFactorCommand c = (ChangeSnowReflectionFactorCommand) lastEdit;
final double[] oldValues = c.getOldValue();
String oldValueString = "\"";
for (final double x : oldValues) {
oldValueString += x + " ";
}
oldValueString.trim();
oldValueString += "\"";
String newValueString = "\"";
for (int i = 0; i < 12; i++) {
newValueString += Scene.getInstance().getGround().getSnowReflectionFactor(i) + " ";
}
newValueString.trim();
newValueString += "\"";
stateValue = "{\"Old Values\": " + oldValueString + ", \"New Values\": " + newValueString + "}";
} else if (lastEdit instanceof ChangeSolarHeatMapColorContrastCommand) {
final ChangeSolarHeatMapColorContrastCommand c = (ChangeSolarHeatMapColorContrastCommand) lastEdit;
stateValue = "{\"Old Value\": " + c.getOldValue() + ", \"New Value\": " + Scene.getInstance().getSolarHeatMapColorContrast() + "}";
} else if (lastEdit instanceof ChangeLatitudeCommand) {
final ChangeLatitudeCommand c = (ChangeLatitudeCommand) lastEdit;
stateValue = "{\"Old Value\": " + Math.round(Math.toDegrees(c.getOldValue())) + ", \"New Value\": " + Math.round(Math.toDegrees(Heliodon.getInstance().getLatitude())) + "}";
} else if (lastEdit instanceof ChangeCityCommand) {
final ChangeCityCommand c = (ChangeCityCommand) lastEdit;
stateValue = "{\"Old City\": \"" + c.getOldValue() + "\", \"New City\": \"" + Scene.getInstance().getCity() + "\"}";
} else if (lastEdit instanceof ChangeDateCommand) {
final ChangeDateCommand c = (ChangeDateCommand) lastEdit;
final Calendar calendar = new GregorianCalendar();
calendar.setTime(c.getOldDate());
stateValue = "{\"Old Date\": \"" + (calendar.get(Calendar.MONTH) + 1) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + "\"";
calendar.setTime(Scene.getInstance().getDate());
stateValue += ", \"New Date\": \"" + (calendar.get(Calendar.MONTH) + 1) + "/" + calendar.get(Calendar.DAY_OF_MONTH) + "\"}";
} else if (lastEdit instanceof ChangeTimeCommand) {
final ChangeTimeCommand c = (ChangeTimeCommand) lastEdit;
final Calendar cal0 = new GregorianCalendar();
cal0.setTime(c.getOldTime());
stateValue = "{\"Old Time\": \"" + (cal0.get(Calendar.HOUR_OF_DAY)) + ":" + cal0.get(Calendar.MINUTE) + "\"";
final Calendar cal1 = Heliodon.getInstance().getCalendar();
stateValue += ", \"New Time\": \"" + (cal1.get(Calendar.HOUR_OF_DAY)) + ":" + cal1.get(Calendar.MINUTE) + "\"}";
} else if (lastEdit instanceof ChangeTimeAndDateWithHeliodonCommand) {
final ChangeTimeAndDateWithHeliodonCommand c = (ChangeTimeAndDateWithHeliodonCommand) lastEdit;
final Calendar oldCal = new GregorianCalendar();
oldCal.setTime(c.getOldTime());
final Calendar newCal = Heliodon.getInstance().getCalendar();
stateValue = "{\"Old Time\": \"" + (oldCal.get(Calendar.HOUR_OF_DAY)) + ":" + oldCal.get(Calendar.MINUTE) + "\"";
stateValue += ", \"New Time\": \"" + (newCal.get(Calendar.HOUR_OF_DAY)) + ":" + newCal.get(Calendar.MINUTE) + "\"";
stateValue += ", \"Old Date\": \"" + (oldCal.get(Calendar.MONTH) + 1) + "/" + oldCal.get(Calendar.DAY_OF_MONTH) + "\"";
stateValue += ", \"New Date\": \"" + (newCal.get(Calendar.MONTH) + 1) + "/" + newCal.get(Calendar.DAY_OF_MONTH) + "\"}";
} else if (lastEdit instanceof ChangeBuildingTextureCommand) {
stateValue = "{\"Old Value\": ";
TextureMode textureMode = ((ChangeBuildingTextureCommand) lastEdit).getOldValue();
if (textureMode == TextureMode.Full) {
stateValue += "\"Full\"";
} else if (textureMode == TextureMode.Simple) {
stateValue += "\"Simple\"";
} else if (textureMode == TextureMode.None) {
stateValue += "\"None\"";
}
stateValue += ", \"New Value\": ";
textureMode = Scene.getInstance().getTextureMode();
if (textureMode == TextureMode.Full) {
stateValue += "\"Full\"";
} else if (textureMode == TextureMode.Simple) {
stateValue += "\"Simple\"";
} else if (textureMode == TextureMode.None) {
stateValue += "\"None\"";
}
stateValue += "}";
} else if (lastEdit instanceof ChangeThemeCommand) {
stateValue = "{\"Old Value\": " + ((ChangeThemeCommand) lastEdit).getOldValue() + ", \"New Value\": " + Scene.getInstance().getTheme() + "}";
} else if (lastEdit instanceof ChangeRoofOverhangCommand) {
final ChangeRoofOverhangCommand c = (ChangeRoofOverhangCommand) lastEdit;
final Roof r = c.getRoof();
stateValue = "{\"Building\": " + r.getTopContainer().getId() + ", \"ID\": " + r.getId();
stateValue += ", \"Old Value\": " + c.getOldValue() * Scene.getInstance().getAnnotationScale();
stateValue += ", \"New Value\": " + r.getOverhangLength() * Scene.getInstance().getAnnotationScale() + "}";
} else if (lastEdit instanceof ChangeFoundationSizeCommand) {
final ChangeFoundationSizeCommand c = (ChangeFoundationSizeCommand) lastEdit;
final Foundation f = c.getFoundation();
stateValue = "{\"Foundation\": " + f.getId();
stateValue += ", \"Old Length\": " + c.getOldLength();
stateValue += ", \"New Length\": " + c.getNewLength();
stateValue += ", \"Old Width\": " + c.getOldWidth();
stateValue += ", \"New Width\": " + c.getNewWidth();
stateValue += ", \"Old Height\": " + c.getOldHeight();
stateValue += ", \"New Height\": " + c.getNewHeight() + "}";
} else if (lastEdit instanceof AdjustThermostatCommand) {
final Foundation f = ((AdjustThermostatCommand) lastEdit).getFoundation();
stateValue = "{\"Building\":" + f.getId() + "}";
} else if (lastEdit instanceof ChangePartColorCommand) {
final ChangePartColorCommand c = (ChangePartColorCommand) lastEdit;
final HousePart p = c.getPart();
final Foundation f = p instanceof Foundation ? (Foundation) p : p.getTopContainer();
stateValue = "{\"Building\": " + f.getId() + ", \"ID\": " + p.getId();
stateValue += ", \"Type\": \"" + p.getClass().getSimpleName() + "\"";
stateValue += ", \"Old Color\": \"" + Util.toString(c.getOldColor()) + "\", \"New Color\": \"" + Util.toString(p.getColor()) + "\"}";
} else if (lastEdit instanceof ChangeContainerWindowColorCommand) {
final ChangeContainerWindowColorCommand cmd = (ChangeContainerWindowColorCommand) lastEdit;
final HousePart container = cmd.getContainer();
final List<Window> windows = Scene.getInstance().getWindowsOnContainer(container);
final String containerType = container instanceof Wall ? "Wall" : "Roof";
stateValue = "{\"" + containerType + "\":" + container.getId() + ", \"New Color\": \"" + Util.toString(windows.get(0).getColor()) + "\"}";
} else if (lastEdit instanceof ChangeBuildingColorCommand) {
final ChangeBuildingColorCommand c = (ChangeBuildingColorCommand) lastEdit;
final HousePart p = c.getPart();
String s = "{\"Building\":" + c.getFoundation().getId();
s += ", \"Type\": \"" + p.getClass().getSimpleName() + "\"";
s += ", \"New Color\": \"" + Util.toString(p.getColor()) + "\"}";
stateValue = s;
} else if (lastEdit instanceof ChangeLandColorCommand) {
final ChangeLandColorCommand c = (ChangeLandColorCommand) lastEdit;
stateValue = "{\"Old Color\": \"" + Util.toString(c.getOldColor()) + "\", \"New Color\": \"" + Util.toString(Scene.getInstance().getLandColor()) + "\"}";
} else if (lastEdit instanceof ChangePartUValueCommand) {
final ChangePartUValueCommand c = (ChangePartUValueCommand) lastEdit;
final HousePart p = c.getPart();
if (p instanceof Thermal) {
final Foundation f = p instanceof Foundation ? (Foundation) p : p.getTopContainer();
stateValue = "{\"Building\":" + f.getId() + ", \"ID\":" + p.getId();
stateValue += ", \"Type\": \"" + p.getClass().getSimpleName() + "\"";
stateValue += ", \"Old Value\": " + c.getOldValue();
stateValue += ", \"New Value\": " + ((Thermal) p).getUValue() + "}";
}
} else if (lastEdit instanceof ChangeBuildingUValueCommand) {
final ChangeBuildingUValueCommand c = (ChangeBuildingUValueCommand) lastEdit;
final HousePart p = c.getPart();
if (p instanceof Thermal) {
final Foundation f = p instanceof Foundation ? (Foundation) p : p.getTopContainer();
stateValue = "{\"Building\":" + f.getId();
stateValue += ", \"Type\": \"" + p.getClass().getSimpleName() + "\"";
stateValue += ", \"New Value\": " + ((Thermal) p).getUValue() + "}";
}
} else if (lastEdit instanceof ChangeVolumetricHeatCapacityCommand) {
final ChangeVolumetricHeatCapacityCommand c = (ChangeVolumetricHeatCapacityCommand) lastEdit;
final HousePart p = c.getPart();
if (p instanceof Thermal) {
final Foundation f = p instanceof Foundation ? (Foundation) p : p.getTopContainer();
stateValue = "{\"Building\":" + f.getId() + ", \"ID\":" + p.getId();
stateValue += ", \"Type\": \"" + p.getClass().getSimpleName() + "\"";
stateValue += ", \"Old Value\": " + c.getOldValue();
stateValue += ", \"New Value\": " + ((Thermal) p).getVolumetricHeatCapacity() + "}";
}
} else if (lastEdit instanceof ChangeFoundationSolarCollectorBaseHeightCommand) {
final ChangeFoundationSolarCollectorBaseHeightCommand c = (ChangeFoundationSolarCollectorBaseHeightCommand) lastEdit;
stateValue = "{\"Foundation\": " + c.getFoundation().getId() + ", \"New Value\": " + c.getFirstSolarCollector().getBaseHeight() + "}";
} else if (lastEdit instanceof ChangeBaseHeightForAllSolarCollectorsCommand) {
final ChangeBaseHeightForAllSolarCollectorsCommand c = (ChangeBaseHeightForAllSolarCollectorsCommand) lastEdit;
stateValue = "{\"New Value\": " + c.getFirstSolarCollector().getBaseHeight() + "}";
} else if (lastEdit instanceof ChangeTiltAngleCommand) {
final ChangeTiltAngleCommand c = (ChangeTiltAngleCommand) lastEdit;
final HousePart p = c.getPart();
stateValue = "{\"Foundation\": " + p.getTopContainer().getId() + ", \"ID\": " + p.getId() + ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + c.getNewValue() + "}";
} else if (lastEdit instanceof ChangeAzimuthCommand) {
final ChangeAzimuthCommand c = (ChangeAzimuthCommand) lastEdit;
final HousePart p = c.getPart();
stateValue = "{\"Foundation\": " + (p instanceof Foundation ? (Foundation) p : p.getTopContainer()).getId() + ", \"ID\": " + p.getId() + ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + c.getNewValue() + "}";
} else if (lastEdit instanceof ChangeBaseHeightCommand) {
final ChangeBaseHeightCommand c = (ChangeBaseHeightCommand) lastEdit;
final SolarCollector s = c.getPart();
if (s instanceof HousePart) {
final HousePart p = (HousePart) s;
stateValue = "{\"Foundation\": " + p.getTopContainer().getId() + ", \"ID\": " + p.getId() + ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + c.getNewValue() + "}";
}
} else if (lastEdit instanceof SetPartSizeCommand) {
final SetPartSizeCommand c = (SetPartSizeCommand) lastEdit;
if (c.getPart() instanceof Mirror) {
final Mirror m = (Mirror) c.getPart();
stateValue = "{\"Foundation\": " + m.getTopContainer().getId() + ", \"ID\": " + m.getId();
stateValue += ", \"Old Width\": " + c.getOldWidth() + ", \"New Width\": " + m.getMirrorWidth();
stateValue += ", \"Old Height\": " + c.getOldHeight() + ", \"New Height\": " + m.getMirrorHeight() + "}";
} else if (c.getPart() instanceof ParabolicDish) {
final ParabolicDish d = (ParabolicDish) c.getPart();
stateValue = "{\"Foundation\": " + d.getTopContainer().getId() + ", \"ID\": " + d.getId();
stateValue += ", \"Old Rim Radius\": " + c.getOldWidth() + ", \"New Rim Radius\": " + d.getRimRadius() + "}";
} else if (c.getPart() instanceof ParabolicTrough) {
final ParabolicTrough t = (ParabolicTrough) c.getPart();
stateValue = "{\"Foundation\": " + t.getTopContainer().getId() + ", \"ID\": " + t.getId();
stateValue += ", \"Old Aperture\": " + c.getOldWidth() + ", \"New Aperture\": " + t.getApertureWidth();
stateValue += ", \"Old Length\": " + c.getOldHeight() + ", \"New Length\": " + t.getTroughLength();
stateValue += ", \"Old Module Length\": " + c.getOldModuleLength() + ", \"New Module Length\": " + t.getModuleLength() + "}";
} else if (c.getPart() instanceof FresnelReflector) {
final FresnelReflector t = (FresnelReflector) c.getPart();
stateValue = "{\"Foundation\": " + t.getTopContainer().getId() + ", \"ID\": " + t.getId();
stateValue += ", \"Old Module Width\": " + c.getOldWidth() + ", \"New Module Width\": " + t.getModuleWidth();
stateValue += ", \"Old Length\": " + c.getOldHeight() + ", \"New Length\": " + t.getLength();
stateValue += ", \"Old Module Length\": " + c.getOldModuleLength() + ", \"New Module Length\": " + t.getModuleLength() + "}";
} else if (c.getPart() instanceof Rack) {
final Rack r = (Rack) c.getPart();
stateValue = "{\"Foundation\": " + r.getTopContainer().getId() + ", \"ID\": " + r.getId();
stateValue += ", \"Old Width\": " + c.getOldWidth() + ", \"New Width\": " + r.getRackWidth();
stateValue += ", \"Old Height\": " + c.getOldHeight() + ", \"New Height\": " + r.getRackHeight() + "}";
} else if (c.getPart() instanceof Window) {
final Window r = (Window) c.getPart();
stateValue = "{\"Foundation\": " + r.getTopContainer().getId() + ", \"ID\": " + r.getId();
stateValue += ", \"Old Width\": " + c.getOldWidth() + ", \"New Width\": " + r.getWindowWidth();
stateValue += ", \"Old Height\": " + c.getOldHeight() + ", \"New Height\": " + r.getWindowHeight() + "}";
}
} else if (lastEdit instanceof ChangeSolarPanelModelCommand) {
final ChangeSolarPanelModelCommand c = (ChangeSolarPanelModelCommand) lastEdit;
final SolarPanel sp = c.getSolarPanel();
stateValue = "{\"Foundation\": " + sp.getTopContainer().getId() + ", \"ID\": " + sp.getId();
stateValue += ", \"Old Model\": \"" + c.getOldModel().getModel() + "\", \"New Model\": \"" + sp.getPvModuleSpecs().getModel() + "\"}";
} else if (lastEdit instanceof ChooseSolarPanelSizeCommand) {
final ChooseSolarPanelSizeCommand c = (ChooseSolarPanelSizeCommand) lastEdit;
final SolarPanel sp = c.getSolarPanel();
stateValue = "{\"Foundation\": " + sp.getTopContainer().getId() + ", \"ID\": " + sp.getId();
stateValue += ", \"Old Width\": " + c.getOldWidth() + ", \"New Width\": " + sp.getPanelWidth();
stateValue += ", \"Old Height\": " + c.getOldHeight() + ", \"New Height\": " + sp.getPanelHeight() + "}";
} else if (lastEdit instanceof RotateSolarPanelCommand) {
final RotateSolarPanelCommand c = (RotateSolarPanelCommand) lastEdit;
final SolarPanel sp = c.getSolarPanel();
stateValue = "{\"Foundation\": " + sp.getTopContainer().getId() + ", \"ID\": " + sp.getId() + ", \"New Value\": " + sp.isRotated() + "}";
} else if (lastEdit instanceof ChangeSolarCellPropertiesCommand) {
final ChangeSolarCellPropertiesCommand c = (ChangeSolarCellPropertiesCommand) lastEdit;
final SolarPanel sp = c.getSolarPanel();
stateValue = "{\"Foundation\": " + sp.getTopContainer().getId() + ", \"ID\": " + sp.getId();
stateValue += ", \"Old Efficiency\": " + c.getOldEfficiency() + ", \"New Efficiency\": " + sp.getCellEfficiency();
stateValue += ", \"Old Type\": " + c.getOldType() + ", \"New Type\": " + sp.getCellType();
stateValue += ", \"Old Color\": " + c.getOldColor() + ", \"New Color\": " + sp.getColorOption();
stateValue += "}";
} else if (lastEdit instanceof ChangeFoundationSolarCellPropertiesCommand) {
final Foundation f = ((ChangeFoundationSolarCellPropertiesCommand) lastEdit).getFoundation();
final List<SolarPanel> solarPanels = f.getSolarPanels();
if (solarPanels.isEmpty()) {
stateValue = "{\"Foundation\": " + f.getId() + "}";
} else {
final SolarPanel p = solarPanels.get(0);
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Efficiency\": " + p.getCellEfficiency();
stateValue += ", \"New Type\": " + p.getCellType();
stateValue += ", \"New Color\": " + p.getColorOption() + "}";
}
} else if (lastEdit instanceof ChangeSolarCellPropertiesForAllCommand) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
if (solarPanels.isEmpty()) {
stateValue = "{}";
} else {
final SolarPanel p = solarPanels.get(0);
stateValue = "{\"New Efficiency\": " + p.getCellEfficiency();
stateValue += ", \"New Type\": " + p.getCellType();
stateValue += ", \"New Color\": " + p.getColorOption() + "}";
}
} else if (lastEdit instanceof SetTemperatureEffectsCommand) {
final SetTemperatureEffectsCommand c = (SetTemperatureEffectsCommand) lastEdit;
final SolarPanel sp = c.getSolarPanel();
stateValue = "{\"Foundation\": " + sp.getTopContainer().getId() + ", \"ID\": " + sp.getId() + ", \"Old Noct\": " + c.getOldNoct() + ", \"New Noct\": " + sp.getNominalOperatingCellTemperature() + ", \"Old Pmax\": " + c.getOldPmax() + ", \"New Pmax\": " + sp.getTemperatureCoefficientPmax() + "}";
} else if (lastEdit instanceof SetFoundationTemperatureEffectsCommand) {
final Foundation f = ((SetFoundationTemperatureEffectsCommand) lastEdit).getFoundation();
final List<SolarPanel> solarPanels = f.getSolarPanels();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Pmax\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getTemperatureCoefficientPmax()) + "}";
} else if (lastEdit instanceof SetTemperatrureEffectsForAllCommand) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
stateValue = "{\"New Pmax\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getTemperatureCoefficientPmax()) + "}";
} else if (lastEdit instanceof ChangeInverterEfficiencyCommand) {
final ChangeInverterEfficiencyCommand c = (ChangeInverterEfficiencyCommand) lastEdit;
final SolarPanel sp = c.getSolarPanel();
stateValue = "{\"Foundation\": " + sp.getTopContainer().getId() + ", \"ID\": " + sp.getId() + ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + sp.getInverterEfficiency() + "}";
} else if (lastEdit instanceof ChangeFoundationInverterEfficiencyCommand) {
final Foundation f = ((ChangeFoundationInverterEfficiencyCommand) lastEdit).getFoundation();
final List<SolarPanel> solarPanels = f.getSolarPanels();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getInverterEfficiency()) + "}";
} else if (lastEdit instanceof ChangeInverterEfficiencyForAllCommand) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
stateValue = "{\"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getInverterEfficiency()) + "}";
} else if (lastEdit instanceof SetShadeToleranceCommand) {
final SetShadeToleranceCommand c = (SetShadeToleranceCommand) lastEdit;
final SolarPanel sp = c.getSolarPanel();
stateValue = "{\"Foundation\": " + sp.getTopContainer().getId() + ", \"ID\": " + sp.getId() + ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + sp.getShadeTolerance() + "}";
} else if (lastEdit instanceof SetShadeToleranceForSolarPanelsOnFoundationCommand) {
final SetShadeToleranceForSolarPanelsOnFoundationCommand c = (SetShadeToleranceForSolarPanelsOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<SolarPanel> solarPanels = f.getSolarPanels();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getShadeTolerance()) + "}";
} else if (lastEdit instanceof SetShadeToleranceForAllSolarPanelsCommand) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
stateValue = "{\"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getShadeTolerance()) + "}";
} else if (lastEdit instanceof ChangeFoundationSolarPanelTiltAngleCommand) {
final Foundation f = ((ChangeFoundationSolarPanelTiltAngleCommand) lastEdit).getFoundation();
final List<SolarPanel> solarPanels = f.getSolarPanels();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getTiltAngle()) + "}";
} else if (lastEdit instanceof ChangeTiltAngleForAllSolarPanelsCommand) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
stateValue = "{\"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getTiltAngle()) + "}";
} else if (lastEdit instanceof ChangeFoundationSolarPanelAzimuthCommand) {
final Foundation f = ((ChangeFoundationSolarPanelAzimuthCommand) lastEdit).getFoundation();
final List<SolarPanel> solarPanels = f.getSolarPanels();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getRelativeAzimuth()) + "}";
} else if (lastEdit instanceof ChangeAzimuthForAllSolarPanelsCommand) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
stateValue = "{\"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getRelativeAzimuth()) + "}";
} else if (lastEdit instanceof ChangeFoundationSolarPanelModelCommand) {
final Foundation f = ((ChangeFoundationSolarPanelModelCommand) lastEdit).getFoundation();
final List<SolarPanel> solarPanels = f.getSolarPanels();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Model\": " + (solarPanels.isEmpty() ? null : "\"" + solarPanels.get(0).getPvModuleSpecs().getModel() + "\"") + "}";
} else if (lastEdit instanceof ChangeModelForAllSolarPanelsCommand) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
stateValue = "{\"New Model\": " + (solarPanels.isEmpty() ? null : "\"" + solarPanels.get(0).getPvModuleSpecs().getModel() + "\"") + "}";
} else if (lastEdit instanceof ChangeSolarPanelModelForRackCommand) {
final ChangeSolarPanelModelForRackCommand c = (ChangeSolarPanelModelForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Model\": \"" + c.getOldModel().getModel() + "\", \"New Model\": \"" + rack.getSolarPanel().getPvModuleSpecs().getModel() + "\"}";
} else if (lastEdit instanceof ChangeSolarPanelModelForRacksOnFoundationCommand) {
final Foundation f = ((ChangeSolarPanelModelForRacksOnFoundationCommand) lastEdit).getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Model\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getPvModuleSpecs().getModel() + "\"") + "}";
} else if (lastEdit instanceof ChangeSolarPanelModelForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Model\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getPvModuleSpecs().getModel() + "\"") + "}";
} else if (lastEdit instanceof SetSolarCellEfficiencyForRackCommand) {
final SetSolarCellEfficiencyForRackCommand c = (SetSolarCellEfficiencyForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Value\": \"" + c.getOldValue() + "\", \"New Value\": \"" + rack.getSolarPanel().getCellEfficiency() + "\"}";
} else if (lastEdit instanceof SetSolarCellEfficiencyForRacksOnFoundationCommand) {
final SetSolarCellEfficiencyForRacksOnFoundationCommand c = (SetSolarCellEfficiencyForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getCellEfficiency() + "\"") + "}";
} else if (lastEdit instanceof SetSolarCellEfficiencyForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getCellEfficiency() + "\"") + "}";
} else if (lastEdit instanceof SetNoctForRackCommand) {
final SetNoctForRackCommand c = (SetNoctForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Value\": \"" + c.getOldValue() + "\", \"New Value\": \"" + rack.getSolarPanel().getNominalOperatingCellTemperature() + "\"}";
} else if (lastEdit instanceof SetNoctForRacksOnFoundationCommand) {
final SetNoctForRacksOnFoundationCommand c = (SetNoctForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getNominalOperatingCellTemperature() + "\"") + "}";
} else if (lastEdit instanceof SetNoctForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getNominalOperatingCellTemperature() + "\"") + "}";
} else if (lastEdit instanceof SetTemperatureCoefficientPmaxForRackCommand) {
final SetTemperatureCoefficientPmaxForRackCommand c = (SetTemperatureCoefficientPmaxForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Value\": \"" + c.getOldValue() + "\", \"New Value\": \"" + rack.getSolarPanel().getTemperatureCoefficientPmax() + "\"}";
} else if (lastEdit instanceof SetTemperatureCoefficientPmaxForRacksOnFoundationCommand) {
final SetTemperatureCoefficientPmaxForRacksOnFoundationCommand c = (SetTemperatureCoefficientPmaxForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getTemperatureCoefficientPmax() + "\"") + "}";
} else if (lastEdit instanceof SetTemperatureCoefficientPmaxForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getTemperatureCoefficientPmax() + "\"") + "}";
} else if (lastEdit instanceof SetSolarPanelCellTypeForRackCommand) {
final SetSolarPanelCellTypeForRackCommand c = (SetSolarPanelCellTypeForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Type\": \"" + c.getOldValue() + "\", \"New Type\": \"" + rack.getSolarPanel().getCellType() + "\"}";
} else if (lastEdit instanceof SetSolarPanelCellTypeForRacksOnFoundationCommand) {
final SetSolarPanelCellTypeForRacksOnFoundationCommand c = (SetSolarPanelCellTypeForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Type\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getCellType() + "\"") + "}";
} else if (lastEdit instanceof SetSolarPanelCellTypeForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Type\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getCellType() + "\"") + "}";
} else if (lastEdit instanceof SetSolarPanelShadeToleranceForRackCommand) {
final SetSolarPanelShadeToleranceForRackCommand c = (SetSolarPanelShadeToleranceForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Value\": \"" + c.getOldValue() + "\", \"New Value\": \"" + rack.getSolarPanel().getShadeTolerance() + "\"}";
} else if (lastEdit instanceof SetSolarPanelShadeToleranceForRacksOnFoundationCommand) {
final SetSolarPanelShadeToleranceForRacksOnFoundationCommand c = (SetSolarPanelShadeToleranceForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getShadeTolerance() + "\"") + "}";
} else if (lastEdit instanceof SetSolarPanelShadeToleranceForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getShadeTolerance() + "\"") + "}";
} else if (lastEdit instanceof SetSolarPanelColorForRackCommand) {
final SetSolarPanelColorForRackCommand c = (SetSolarPanelColorForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Color\": \"" + c.getOldValue() + "\", \"New Color\": \"" + rack.getSolarPanel().getColorOption() + "\"}";
} else if (lastEdit instanceof SetSolarPanelColorForRacksOnFoundationCommand) {
final SetSolarPanelColorForRacksOnFoundationCommand c = (SetSolarPanelColorForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Color\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getColorOption() + "\"") + "}";
} else if (lastEdit instanceof SetSolarPanelColorForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Color\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getColorOption() + "\"") + "}";
} else if (lastEdit instanceof ChooseSolarPanelSizeForRackCommand) {
final ChooseSolarPanelSizeForRackCommand c = (ChooseSolarPanelSizeForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Width\": " + c.getOldWidth() + ", \"New Width\": " + rack.getSolarPanel().getPanelWidth();
stateValue += ", \"Old Height\": " + c.getOldHeight() + ", \"New Height\": " + rack.getSolarPanel().getPanelHeight() + "}";
} else if (lastEdit instanceof SetSizeForRacksOnFoundationCommand) {
final Foundation f = ((SetSizeForRacksOnFoundationCommand) lastEdit).getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Width\": " + (racks.isEmpty() ? -1 : racks.get(0).getRackWidth()) + ", \"New Height\": " + (racks.isEmpty() ? -1 : racks.get(0).getRackHeight()) + "}";
} else if (lastEdit instanceof SetSizeForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Width\": " + (racks.isEmpty() ? -1 : racks.get(0).getRackWidth()) + ", \"New Height\": " + (racks.isEmpty() ? -1 : racks.get(0).getRackHeight()) + "}";
} else if (lastEdit instanceof RotateSolarPanelsForRackCommand) {
final RotateSolarPanelsForRackCommand c = (RotateSolarPanelsForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Value\": \"" + c.getOldValue() + "\", \"New Value\": \"" + rack.getSolarPanel().isRotated() + "\"}";
} else if (lastEdit instanceof RotateSolarPanelsForRacksOnFoundationCommand) {
final RotateSolarPanelsForRacksOnFoundationCommand c = (RotateSolarPanelsForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().isRotated() + "\"") + "}";
} else if (lastEdit instanceof RotateSolarPanelsForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().isRotated() + "\"") + "}";
} else if (lastEdit instanceof SetInverterEfficiencyForRackCommand) {
final SetInverterEfficiencyForRackCommand c = (SetInverterEfficiencyForRackCommand) lastEdit;
final Rack rack = c.getRack();
stateValue = "{\"Foundation\": " + rack.getTopContainer().getId() + ", \"ID\": " + rack.getId();
stateValue += ", \"Old Value\": \"" + c.getOldValue() + "\", \"New Value\": \"" + rack.getSolarPanel().getInverterEfficiency() + "\"}";
} else if (lastEdit instanceof SetInverterEfficiencyForRacksOnFoundationCommand) {
final SetInverterEfficiencyForRacksOnFoundationCommand c = (SetInverterEfficiencyForRacksOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getInverterEfficiency() + "\"") + "}";
} else if (lastEdit instanceof SetInverterEfficiencyForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? null : "\"" + racks.get(0).getSolarPanel().getInverterEfficiency() + "\"") + "}";
} else if (lastEdit instanceof ChangeFoundationRackTiltAngleCommand) {
final Foundation f = ((ChangeFoundationRackTiltAngleCommand) lastEdit).getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? -1 : racks.get(0).getTiltAngle()) + "}";
} else if (lastEdit instanceof ChangeTiltAngleForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? -1 : racks.get(0).getTiltAngle()) + "}";
} else if (lastEdit instanceof ChangeFoundationRackAzimuthCommand) {
final Foundation f = ((ChangeFoundationRackAzimuthCommand) lastEdit).getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? -1 : racks.get(0).getRelativeAzimuth()) + "}";
} else if (lastEdit instanceof ChangeAzimuthForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? -1 : racks.get(0).getRelativeAzimuth()) + "}";
} else if (lastEdit instanceof SetSolarPanelSizeForRacksOnFoundationCommand) {
final Foundation f = ((SetSolarPanelSizeForRacksOnFoundationCommand) lastEdit).getFoundation();
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Width\": " + (racks.isEmpty() ? -1 : racks.get(0).getSolarPanel().getPanelWidth()) + ", \"New Height\": " + (racks.isEmpty() ? -1 : racks.get(0).getSolarPanel().getPanelHeight()) + "}";
} else if (lastEdit instanceof SetSolarPanelSizeForAllRacksCommand) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Width\": " + (racks.isEmpty() ? -1 : racks.get(0).getSolarPanel().getPanelWidth()) + ", \"New Height\": " + (racks.isEmpty() ? -1 : racks.get(0).getSolarPanel().getPanelHeight()) + "}";
} else if (lastEdit instanceof SetSolarTrackerCommand) {
final SetSolarTrackerCommand c = (SetSolarTrackerCommand) lastEdit;
final Trackable tracker = c.getTracker();
long bid = -1;
long cid = -1;
if (tracker instanceof HousePart) {
bid = ((HousePart) tracker).getTopContainer().getId();
cid = ((HousePart) tracker).getId();
}
stateValue = "{\"Foundation\": " + bid + ", \"ID\": " + cid + ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + tracker.getTracker() + "}";
} else if (lastEdit instanceof SetSolarTrackersOnFoundationCommand) {
final SetSolarTrackersOnFoundationCommand c = (SetSolarTrackersOnFoundationCommand) lastEdit;
final Foundation f = c.getFoundation();
final Trackable tracker = c.getTracker();
if (tracker instanceof SolarPanel) {
final List<SolarPanel> solarPanels = f.getSolarPanels();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getTracker()) + "}";
} else if (tracker instanceof Rack) {
final List<Rack> racks = f.getRacks();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (racks.isEmpty() ? -1 : racks.get(0).getTracker()) + "}";
}
} else if (lastEdit instanceof SetSolarTrackersForAllCommand) {
final SetSolarTrackersForAllCommand c = (SetSolarTrackersForAllCommand) lastEdit;
final Trackable tracker = c.getTracker();
if (tracker instanceof SolarPanel) {
final List<SolarPanel> solarPanels = Scene.getInstance().getAllSolarPanels();
stateValue = "{\"New Value\": " + (solarPanels.isEmpty() ? -1 : solarPanels.get(0).getTracker()) + "}";
} else if (tracker instanceof Rack) {
final List<Rack> racks = Scene.getInstance().getAllRacks();
stateValue = "{\"New Value\": " + (racks.isEmpty() ? -1 : racks.get(0).getTracker()) + "}";
}
} else if (lastEdit instanceof SetSizeForHeliostatsOnFoundationCommand) {
final Foundation f = ((SetSizeForHeliostatsOnFoundationCommand) lastEdit).getFoundation();
final List<Mirror> mirrors = f.getHeliostats();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Width\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getMirrorWidth()) + ", \"New Height\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getMirrorHeight()) + "}";
} else if (lastEdit instanceof SetSizeForAllHeliostatsCommand) {
final List<Mirror> mirrors = Scene.getInstance().getAllHeliostats();
stateValue = "{\"New Width\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getMirrorWidth()) + ", \"New Height\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getMirrorHeight()) + "}";
} else if (lastEdit instanceof ChangeHeliostatTargetCommand) {
final ChangeHeliostatTargetCommand c = (ChangeHeliostatTargetCommand) lastEdit;
final Mirror m = c.getMirror();
stateValue = "{\"Foundation\": " + m.getTopContainer().getId() + ", \"ID\": " + m.getId();
stateValue += ", \"Old Value\": " + (c.getOldValue() == null ? -1 : c.getOldValue().getId()) + ", \"New Value\": " + (c.getNewValue() == null ? -1 : c.getNewValue().getId()) + "}";
} else if (lastEdit instanceof ChangeFoundationHeliostatTargetCommand) {
final Foundation f = ((ChangeFoundationHeliostatTargetCommand) lastEdit).getFoundation();
final List<Mirror> mirrors = f.getHeliostats();
long newValue = -1;
if (!mirrors.isEmpty()) {
final Foundation t = mirrors.get(0).getReceiver();
if (t != null) {
newValue = t.getId();
}
}
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + newValue + "}";
} else if (lastEdit instanceof ChangeTargetForAllHeliostatsCommand) {
final List<Mirror> mirrors = Scene.getInstance().getAllHeliostats();
long newValue = -1;
if (!mirrors.isEmpty()) {
final Foundation t = mirrors.get(0).getReceiver();
if (t != null) {
newValue = t.getId();
}
}
stateValue = "{\"New Value\": " + newValue + "}";
} else if (lastEdit instanceof ChangeFoundationHeliostatTiltAngleCommand) {
final Foundation f = ((ChangeFoundationHeliostatTiltAngleCommand) lastEdit).getFoundation();
final List<Mirror> mirrors = f.getHeliostats();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getTiltAngle()) + "}";
} else if (lastEdit instanceof ChangeTiltAngleForAllHeliostatsCommand) {
final List<Mirror> mirrors = Scene.getInstance().getAllHeliostats();
stateValue = "{\"New Value\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getTiltAngle()) + "}";
} else if (lastEdit instanceof ChangeFoundationHeliostatAzimuthCommand) {
final Foundation f = ((ChangeFoundationHeliostatAzimuthCommand) lastEdit).getFoundation();
final List<Mirror> mirrors = f.getHeliostats();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getRelativeAzimuth()) + "}";
} else if (lastEdit instanceof ChangeAzimuthForAllHeliostatsCommand) {
final List<Mirror> mirrors = Scene.getInstance().getAllHeliostats();
stateValue = "{\"New Value\": " + (mirrors.isEmpty() ? -1 : mirrors.get(0).getRelativeAzimuth()) + "}";
} else if (lastEdit instanceof SetShapeForParabolicTroughsOnFoundationCommand) {
final Foundation f = ((SetShapeForParabolicTroughsOnFoundationCommand) lastEdit).getFoundation();
final List<ParabolicTrough> troughs = f.getParabolicTroughs();
final ParabolicTrough t = troughs.isEmpty() ? null : troughs.get(0);
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Aperture Width\": " + (t == null ? -1 : t.getApertureWidth()) + ", \"New Length\": " + (t == null ? -1 : t.getTroughLength()) + ", \"New Module Length\": " + (t == null ? -1 : t.getModuleLength()) + ", \"New Semilatus Rectum\": " + (t == null ? -1 : t.getSemilatusRectum()) + "}";
} else if (lastEdit instanceof SetShapeForAllParabolicTroughsCommand) {
final List<ParabolicTrough> troughs = Scene.getInstance().getAllParabolicTroughs();
final ParabolicTrough t = troughs.isEmpty() ? null : troughs.get(0);
stateValue = "{\"New Aperture Width\": " + (t == null ? -1 : t.getApertureWidth()) + ", \"New Length\": " + (t == null ? -1 : t.getTroughLength()) + ", \"New Module Length\": " + (t == null ? -1 : t.getModuleLength()) + ", \"New Semilatus Rectum\": " + (t == null ? -1 : t.getSemilatusRectum()) + "}";
} else if (lastEdit instanceof SetRimRadiusForParabolicDishesOnFoundationCommand) {
final Foundation f = ((SetRimRadiusForParabolicDishesOnFoundationCommand) lastEdit).getFoundation();
final List<ParabolicDish> dishes = f.getParabolicDishes();
final ParabolicDish d = dishes.isEmpty() ? null : dishes.get(0);
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Rim Radius\": " + (d == null ? -1 : d.getRimRadius()) + "}";
} else if (lastEdit instanceof SetRimRadiusForAllParabolicDishesCommand) {
final List<ParabolicDish> dishes = Scene.getInstance().getAllParabolicDishes();
final ParabolicDish d = dishes.isEmpty() ? null : dishes.get(0);
stateValue = "{\"New Rim Radius\": " + (d == null ? -1 : d.getRimRadius()) + "}";
} else if (lastEdit instanceof SetSizeForFresnelReflectorsOnFoundationCommand) {
final Foundation f = ((SetSizeForFresnelReflectorsOnFoundationCommand) lastEdit).getFoundation();
final List<FresnelReflector> reflectors = f.getFresnelReflectors();
final FresnelReflector r = reflectors.isEmpty() ? null : reflectors.get(0);
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Length\": " + (r == null ? -1 : r.getLength()) + ", \"New Module Length\": " + (r == null ? -1 : r.getModuleLength()) + ", \"New Module Width\": " + (r == null ? -1 : r.getModuleWidth()) + "}";
} else if (lastEdit instanceof SetSizeForAllFresnelReflectorsCommand) {
final List<FresnelReflector> reflectors = Scene.getInstance().getAllFresnelReflectors();
final FresnelReflector r = reflectors.isEmpty() ? null : reflectors.get(0);
stateValue = "{\"New Length\": " + (r == null ? -1 : r.getLength()) + ", \"New Module Length\": " + (r == null ? -1 : r.getModuleLength()) + ", \"New Module Width\": " + (r == null ? -1 : r.getModuleWidth()) + "}";
} else if (lastEdit instanceof ChangeWallTypeCommand) {
final ChangeWallTypeCommand c = (ChangeWallTypeCommand) lastEdit;
final Wall w = c.getWall();
stateValue = "{\"Building\": " + w.getContainer().getId() + ", \"ID\": " + w.getId();
stateValue += ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + w.getType() + "}";
} else if (lastEdit instanceof ChangeWallThicknessCommand) {
final ChangeWallThicknessCommand c = (ChangeWallThicknessCommand) lastEdit;
final Wall w = c.getWall();
stateValue = "{\"Building\": " + w.getContainer().getId() + ", \"ID\": " + w.getId();
stateValue += ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + w.getThickness() + "}";
} else if (lastEdit instanceof ChangeFoundationWallThicknessCommand) {
final ChangeFoundationWallThicknessCommand c = (ChangeFoundationWallThicknessCommand) lastEdit;
final Foundation f = c.getFoundation();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + c.getWalls().get(0).getThickness() + "}";
} else if (lastEdit instanceof ChangeThicknessForAllWallsCommand) {
final ChangeThicknessForAllWallsCommand c = (ChangeThicknessForAllWallsCommand) lastEdit;
stateValue = "{\"New Value\": " + (c.getWalls().isEmpty() ? -1 : ((Wall) c.getWalls().get(0)).getThickness()) + "}";
} else if (lastEdit instanceof ChangeWallHeightCommand) {
final ChangeWallHeightCommand c = (ChangeWallHeightCommand) lastEdit;
final Wall w = c.getWall();
stateValue = "{\"Building\": " + w.getContainer().getId() + ", \"ID\": " + w.getId();
stateValue += ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + w.getHeight() + "}";
} else if (lastEdit instanceof ChangeFoundationWallHeightCommand) {
final ChangeFoundationWallHeightCommand c = (ChangeFoundationWallHeightCommand) lastEdit;
final Foundation f = c.getFoundation();
stateValue = "{\"Foundation\": " + f.getId() + ", \"New Value\": " + c.getWalls().get(0).getHeight() + "}";
} else if (lastEdit instanceof ChangeHeightForAllWallsCommand) {
final ChangeHeightForAllWallsCommand c = (ChangeHeightForAllWallsCommand) lastEdit;
stateValue = "{\"New Value\": " + (c.getWalls().isEmpty() ? -1 : ((Wall) c.getWalls().get(0)).getHeight()) + "}";
} else if (lastEdit instanceof ChangeHeightForConnectedWallsCommand) {
final ChangeHeightForConnectedWallsCommand c = (ChangeHeightForConnectedWallsCommand) lastEdit;
stateValue = "{\"New Value\": " + (c.getWalls().isEmpty() ? -1 : c.getWalls().get(0).getHeight()) + "}";
} else if (lastEdit instanceof ChangeWindowShgcCommand) {
final ChangeWindowShgcCommand c = (ChangeWindowShgcCommand) lastEdit;
final Window w = c.getWindow();
stateValue = "{\"Building\": " + w.getTopContainer().getId() + ", \"ID\": " + w.getId() + ", \"Old Value\": " + c.getOldValue() + ", \"New Value\": " + w.getSolarHeatGainCoefficient() + "}";
} else if (lastEdit instanceof ChangeContainerWindowShgcCommand) {
final ChangeContainerWindowShgcCommand c = (ChangeContainerWindowShgcCommand) lastEdit;
final HousePart container = c.getContainer();
final List<Window> windows = Scene.getInstance().getWindowsOnContainer(container);
final String containerType = container instanceof Wall ? "Wall" : "Roof";
stateValue = "{\"" + containerType + "\": " + container.getId() + ", \"New Value\": " + (windows.isEmpty() ? -1 : windows.get(0).getSolarHeatGainCoefficient()) + "}";
} else if (lastEdit instanceof ChangeBuildingWindowShgcCommand) {
final ChangeBuildingWindowShgcCommand c = (ChangeBuildingWindowShgcCommand) lastEdit;
final Foundation foundation = c.getFoundation();
final List<Window> windows = Scene.getInstance().getWindowsOfBuilding(foundation);
stateValue = "{\"Building\": " + foundation.getId() + ", \"New Value\": " + (windows.isEmpty() ? -1 : windows.get(0).getSolarHeatGainCoefficient()) + "}";
}
}
line += ", \"" + action + "\": ";
if (actedPart != null) {
line += LoggerUtil.getInfo(actedPart);
} else if (stateValue != null) {
line += stateValue;
} else {
line += "null";
}
lastAction = action;
}
if (analysisRequester != null) {
final HousePart analyzedPart = SceneManager.getInstance().getSelectedPart();
line += ", \"" + analysisRequester.getClass().getSimpleName() + "\": ";
if (analysisRequester instanceof AnnualSensorData) {
line += ((AnnualSensorData) analysisRequester).toJson();
} else if (analysisRequester instanceof DailySensorData) {
line += ((DailySensorData) analysisRequester).toJson();
} else if (analysisRequester instanceof DailyEnvironmentalTemperature) {
line += ((DailyEnvironmentalTemperature) analysisRequester).toJson();
} else if (analysisRequester instanceof AnnualEnvironmentalTemperature) {
line += ((AnnualEnvironmentalTemperature) analysisRequester).toJson();
} else {
if (analyzedPart != null && !(analyzedPart instanceof Tree) && !(analyzedPart instanceof Human)) {
// if something analyzable is selected
if (analysisRequester instanceof EnergyDailyAnalysis) {
line += ((EnergyDailyAnalysis) analysisRequester).toJson();
} else if (analysisRequester instanceof BuildingDailyEnergyGraph) {
line += ((BuildingDailyEnergyGraph) analysisRequester).toJson();
final String result = Building.getBuildingSolarPotentials();
if (result != null) {
line += ", \"Solar Potential\": " + result;
}
} else if (analysisRequester instanceof EnergyAnnualAnalysis) {
line += ((EnergyAnnualAnalysis) analysisRequester).toJson();
} else if (analysisRequester instanceof EnergyAngularAnalysis) {
line += ((EnergyAngularAnalysis) analysisRequester).toJson();
} else if (analysisRequester instanceof ProjectCost) {
line += ((ProjectCost) analysisRequester).toJson();
}
} else {
if (analysisRequester instanceof ProjectCost) {
line += ((ProjectCost) analysisRequester).toJson();
} else if (analysisRequester instanceof BuildingDailyEnergyGraph) {
line += ((BuildingDailyEnergyGraph) analysisRequester).toJson();
final String result = Building.getBuildingSolarPotentials();
if (result != null) {
line += ", \"Solar Potential\": " + result;
}
}
}
if (analysisRequester instanceof PvDailyAnalysis) {
line += ((PvDailyAnalysis) analysisRequester).toJson();
} else if (analysisRequester instanceof PvAnnualAnalysis) {
line += ((PvAnnualAnalysis) analysisRequester).toJson();
}
if (analysisRequester instanceof GroupDailyAnalysis) {
line += ((GroupDailyAnalysis) analysisRequester).toJson();
} else if (analysisRequester instanceof GroupAnnualAnalysis) {
line += ((GroupAnnualAnalysis) analysisRequester).toJson();
}
}
}
if (firstRecord) {
firstRecord = false;
} else {
writer.write(",\n");
}
writer.write("{\"Timestamp\": \"" + timestamp + "\", " + line + "}");
writer.flush();
lastTime = time;
}
use of org.concord.energy3d.model.Wall in project energy3d by concord-consortium.
the class Scene method removeAllWalls.
public void removeAllWalls() {
final ArrayList<HousePart> walls = new ArrayList<HousePart>();
final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
if (selectedPart != null) {
final Foundation foundation = selectedPart instanceof Foundation ? (Foundation) selectedPart : selectedPart.getTopContainer();
for (final HousePart part : parts) {
if (part instanceof Wall && !part.getLockEdit() && part.getTopContainer() == foundation) {
walls.add(part);
}
}
} else {
for (final HousePart part : parts) {
if (part instanceof Wall && !part.getLockEdit()) {
walls.add(part);
}
}
}
if (walls.isEmpty()) {
JOptionPane.showMessageDialog(MainFrame.getInstance(), "There is no wall to remove.", "No Wall", JOptionPane.INFORMATION_MESSAGE);
return;
}
if (JOptionPane.showConfirmDialog(MainFrame.getInstance(), "Do you really want to remove all " + walls.size() + " walls" + (selectedPart != null ? " of the selected building" : "") + "?", "Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) != JOptionPane.YES_OPTION) {
return;
}
final RemoveMultiplePartsCommand c = new RemoveMultiplePartsCommand(walls);
for (final HousePart part : walls) {
remove(part, false);
}
redrawAll();
SceneManager.getInstance().getUndoManager().addEdit(c);
edited = true;
}
Aggregations