Search in sources :

Example 1 with DailyEnvironmentalTemperature

use of org.concord.energy3d.simulation.DailyEnvironmentalTemperature in project energy3d by concord-consortium.

the class PopupMenuForSky method getPopupMenu.

static JPopupMenu getPopupMenu() {
    if (popupMenuForSky == null) {
        final JMenuItem miInfo = new JMenuItem("Sky");
        miInfo.setEnabled(false);
        miInfo.setOpaque(true);
        miInfo.setBackground(Config.isMac() ? Color.DARK_GRAY : Color.GRAY);
        miInfo.setForeground(Color.WHITE);
        final JCheckBoxMenuItem miHeliodon = new JCheckBoxMenuItem("Heliodon");
        miHeliodon.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                MainPanel.getInstance().getHeliodonButton().doClick();
            }
        });
        final JMenu weatherMenu = new JMenu("Weather");
        JMenuItem mi = new JMenuItem("Monthly Sunshine Hours...");
        mi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().checkCity()) {
                    new MonthlySunshineHours().showDialog();
                }
            }
        });
        weatherMenu.add(mi);
        mi = new JMenuItem("Annual Environmental Temperature...");
        mi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().checkCity()) {
                    new AnnualEnvironmentalTemperature().showDialog();
                }
            }
        });
        weatherMenu.add(mi);
        mi = new JMenuItem("Daily Environmental Temperature...");
        mi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().checkCity()) {
                    new DailyEnvironmentalTemperature().showDialog();
                }
            }
        });
        weatherMenu.add(mi);
        final JMenu themeMenu = new JMenu("Theme");
        final ButtonGroup themeButtonGroup = new ButtonGroup();
        final JRadioButtonMenuItem miBlueSky = new JRadioButtonMenuItem("Blue Sky");
        miBlueSky.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    final ChangeThemeCommand c = new ChangeThemeCommand();
                    Scene.getInstance().setTheme(Scene.BLUE_SKY_THEME);
                    Scene.getInstance().setEdited(true);
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                }
            }
        });
        themeButtonGroup.add(miBlueSky);
        themeMenu.add(miBlueSky);
        final JRadioButtonMenuItem miDesert = new JRadioButtonMenuItem("Desert");
        miDesert.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    final ChangeThemeCommand c = new ChangeThemeCommand();
                    Scene.getInstance().setTheme(Scene.DESERT_THEME);
                    Scene.getInstance().setEdited(true);
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                }
            }
        });
        themeButtonGroup.add(miDesert);
        themeMenu.add(miDesert);
        final JRadioButtonMenuItem miGrassland = new JRadioButtonMenuItem("Grassland");
        miGrassland.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    final ChangeThemeCommand c = new ChangeThemeCommand();
                    Scene.getInstance().setTheme(Scene.GRASSLAND_THEME);
                    Scene.getInstance().setEdited(true);
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                }
            }
        });
        themeButtonGroup.add(miGrassland);
        themeMenu.add(miGrassland);
        final JRadioButtonMenuItem miForest = new JRadioButtonMenuItem("Forest");
        miForest.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    final ChangeThemeCommand c = new ChangeThemeCommand();
                    Scene.getInstance().setTheme(Scene.FOREST_THEME);
                    Scene.getInstance().setEdited(true);
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                }
            }
        });
        themeButtonGroup.add(miForest);
        themeMenu.add(miForest);
        themeMenu.addMenuListener(new MenuListener() {

            @Override
            public void menuCanceled(final MenuEvent e) {
            }

            @Override
            public void menuDeselected(final MenuEvent e) {
                SceneManager.getInstance().refresh();
            }

            @Override
            public void menuSelected(final MenuEvent e) {
                Util.selectSilently(miBlueSky, Scene.getInstance().getTheme() == Scene.BLUE_SKY_THEME);
                Util.selectSilently(miDesert, Scene.getInstance().getTheme() == Scene.DESERT_THEME);
                Util.selectSilently(miGrassland, Scene.getInstance().getTheme() == Scene.GRASSLAND_THEME);
                Util.selectSilently(miForest, Scene.getInstance().getTheme() == Scene.FOREST_THEME);
            }
        });
        final JMenuItem miDustLoss = new JMenuItem("Dust & Pollen...");
        miDustLoss.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final JPanel gui = new JPanel(new BorderLayout());
                final String title = "<html><b>Soiling loss factor:</b><br>Loss of productivity due to atmospheric dust and pollen<br>(a dimensionless parameter within [0, 1])</html>";
                gui.add(new JLabel(title), BorderLayout.NORTH);
                final JPanel inputPanel = new JPanel(new SpringLayout());
                inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                gui.add(inputPanel, BorderLayout.CENTER);
                final JTextField[] fields = new JTextField[12];
                for (int i = 0; i < 12; i++) {
                    final JLabel l = new JLabel(AnnualGraph.THREE_LETTER_MONTH[i] + ": ", JLabel.LEFT);
                    inputPanel.add(l);
                    fields[i] = new JTextField(threeDecimalsFormat.format(Scene.getInstance().getAtmosphere().getDustLoss(i)), 5);
                    l.setLabelFor(fields[i]);
                    inputPanel.add(fields[i]);
                }
                SpringUtilities.makeCompactGrid(inputPanel, 12, 2, 6, 6, 6, 6);
                while (true) {
                    if (JOptionPane.showConfirmDialog(MainFrame.getInstance(), gui, "Dust and pollen loss", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.CANCEL_OPTION) {
                        break;
                    }
                    boolean pass = true;
                    final double[] val = new double[12];
                    for (int i = 0; i < 12; i++) {
                        try {
                            val[i] = Double.parseDouble(fields[i].getText());
                            if (val[i] < 0 || val[i] > 1) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Dust and pollen loss value must be in 0-1.", "Range Error", JOptionPane.ERROR_MESSAGE);
                                pass = false;
                            }
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), fields[i].getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                            pass = false;
                        }
                    }
                    if (pass) {
                        boolean changed = false;
                        for (int i = 0; i < 12; i++) {
                            if (Math.abs(Scene.getInstance().getAtmosphere().getDustLoss(i) - val[i]) > 0.000001) {
                                changed = true;
                                break;
                            }
                        }
                        if (changed) {
                            final ChangeAtmosphericDustLossCommand c = new ChangeAtmosphericDustLossCommand();
                            for (int i = 0; i < 12; i++) {
                                Scene.getInstance().getAtmosphere().setDustLoss(val[i], i);
                            }
                            updateAfterEdit();
                            SceneManager.getInstance().getUndoManager().addEdit(c);
                        }
                        break;
                    }
                }
            }
        });
        popupMenuForSky = new JPopupMenu();
        popupMenuForSky.setInvoker(MainPanel.getInstance().getCanvasPanel());
        popupMenuForSky.addPopupMenuListener(new PopupMenuListener() {

            @Override
            public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
                Util.selectSilently(miHeliodon, MainPanel.getInstance().getHeliodonButton().isSelected());
            }

            @Override
            public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
            }

            @Override
            public void popupMenuCanceled(final PopupMenuEvent e) {
            }
        });
        popupMenuForSky.add(miInfo);
        popupMenuForSky.add(miDustLoss);
        popupMenuForSky.add(miHeliodon);
        popupMenuForSky.addSeparator();
        popupMenuForSky.add(weatherMenu);
        popupMenuForSky.add(themeMenu);
    }
    return popupMenuForSky;
}
Also used : JPanel(javax.swing.JPanel) ItemEvent(java.awt.event.ItemEvent) ActionEvent(java.awt.event.ActionEvent) PopupMenuListener(javax.swing.event.PopupMenuListener) MenuListener(javax.swing.event.MenuListener) PopupMenuListener(javax.swing.event.PopupMenuListener) JTextField(javax.swing.JTextField) PopupMenuEvent(javax.swing.event.PopupMenuEvent) ChangeAtmosphericDustLossCommand(org.concord.energy3d.undo.ChangeAtmosphericDustLossCommand) BorderLayout(java.awt.BorderLayout) JMenuItem(javax.swing.JMenuItem) ChangeThemeCommand(org.concord.energy3d.undo.ChangeThemeCommand) PopupMenuEvent(javax.swing.event.PopupMenuEvent) MenuEvent(javax.swing.event.MenuEvent) AnnualEnvironmentalTemperature(org.concord.energy3d.simulation.AnnualEnvironmentalTemperature) MonthlySunshineHours(org.concord.energy3d.simulation.MonthlySunshineHours) JRadioButtonMenuItem(javax.swing.JRadioButtonMenuItem) JLabel(javax.swing.JLabel) JCheckBoxMenuItem(javax.swing.JCheckBoxMenuItem) DailyEnvironmentalTemperature(org.concord.energy3d.simulation.DailyEnvironmentalTemperature) JPopupMenu(javax.swing.JPopupMenu) ActionListener(java.awt.event.ActionListener) ButtonGroup(javax.swing.ButtonGroup) SpringLayout(javax.swing.SpringLayout) ItemListener(java.awt.event.ItemListener) JMenu(javax.swing.JMenu)

Example 2 with DailyEnvironmentalTemperature

use of org.concord.energy3d.simulation.DailyEnvironmentalTemperature 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;
}
Also used : PvAnnualAnalysis(org.concord.energy3d.simulation.PvAnnualAnalysis) Foundation(org.concord.energy3d.model.Foundation) HousePart(org.concord.energy3d.model.HousePart) Human(org.concord.energy3d.model.Human) GregorianCalendar(java.util.GregorianCalendar) SolarPanel(org.concord.energy3d.model.SolarPanel) ProjectCost(org.concord.energy3d.simulation.ProjectCost) GroupDailyAnalysis(org.concord.energy3d.simulation.GroupDailyAnalysis) URL(java.net.URL) SolarCollector(org.concord.energy3d.model.SolarCollector) PvDailyAnalysis(org.concord.energy3d.simulation.PvDailyAnalysis) Window(org.concord.energy3d.model.Window) AnnualEnvironmentalTemperature(org.concord.energy3d.simulation.AnnualEnvironmentalTemperature) GroupAnnualAnalysis(org.concord.energy3d.simulation.GroupAnnualAnalysis) GregorianCalendar(java.util.GregorianCalendar) Calendar(java.util.Calendar) ReadOnlyVector3(com.ardor3d.math.type.ReadOnlyVector3) Vector3(com.ardor3d.math.Vector3) ParabolicTrough(org.concord.energy3d.model.ParabolicTrough) UndoableEdit(javax.swing.undo.UndoableEdit) Tree(org.concord.energy3d.model.Tree) List(java.util.List) BuildingDailyEnergyGraph(org.concord.energy3d.gui.BuildingDailyEnergyGraph) TextureMode(org.concord.energy3d.scene.Scene.TextureMode) EnergyAngularAnalysis(org.concord.energy3d.simulation.EnergyAngularAnalysis) DailySensorData(org.concord.energy3d.simulation.DailySensorData) File(java.io.File) Mirror(org.concord.energy3d.model.Mirror) Thermal(org.concord.energy3d.model.Thermal) EnergyAnnualAnalysis(org.concord.energy3d.simulation.EnergyAnnualAnalysis) Wall(org.concord.energy3d.model.Wall) Rack(org.concord.energy3d.model.Rack) Roof(org.concord.energy3d.model.Roof) FresnelReflector(org.concord.energy3d.model.FresnelReflector) Date(java.util.Date) DailyEnvironmentalTemperature(org.concord.energy3d.simulation.DailyEnvironmentalTemperature) ParabolicDish(org.concord.energy3d.model.ParabolicDish) EnergyDailyAnalysis(org.concord.energy3d.simulation.EnergyDailyAnalysis) AnnualSensorData(org.concord.energy3d.simulation.AnnualSensorData) Trackable(org.concord.energy3d.model.Trackable)

Example 3 with DailyEnvironmentalTemperature

use of org.concord.energy3d.simulation.DailyEnvironmentalTemperature in project energy3d by concord-consortium.

the class MyEditorPane method buttonActionPerformed.

private void buttonActionPerformed(final String act, final QuestionnaireModel questionnaireModel, final DefaultButtonModel buttonModel) {
    if (act == null) {
        return;
    }
    // instruction sheet selection commands
    if (act.startsWith("Sheet")) {
        final int i = Integer.parseInt(act.substring(5).trim());
        EnergyPanel.getInstance().selectInstructionSheet(i - 1);
    } else if ("Questionnaire".equals(act)) {
        if (questionnaireModel != null) {
            MainApplication.addEvent(new QuestionnaireEvent(Scene.getURL(), System.currentTimeMillis(), questionnaireModel));
        }
    } else if (act.startsWith("Event Miner") || act.startsWith("Conformance Checker")) {
        final Agent a = MainApplication.getAgent(act);
        if (a != null) {
            final HashMap<String, Object> attributes = new HashMap<String, Object>();
            attributes.put("Agent", act);
            MainApplication.addEvent(new OperationEvent(Scene.getURL(), System.currentTimeMillis(), '?', a.getName(), attributes));
            a.actuate();
        }
    } else // show actions
    if ("Event Frequency".equals(act)) {
        new EventFrequency().showGui();
    } else if ("Event Time Series".equals(act)) {
        new EventTimeSeries().showGui();
    } else if ("Event String".equals(act)) {
        new EventString().showGui();
    } else // heliodon commands
    if ("Heliodon".equals(act)) {
        MainPanel.getInstance().getHeliodonButton().setSelected(buttonModel.isSelected());
    } else if ("Heliodon On".equals(act)) {
        MainPanel.getInstance().getHeliodonButton().setSelected(true);
    } else if ("Heliodon Off".equals(act)) {
        MainPanel.getInstance().getHeliodonButton().setSelected(false);
    } else // sun motion commands
    if ("Sun Motion".equals(act)) {
        MainPanel.getInstance().getSunAnimationButton().setSelected(buttonModel.isSelected());
    } else if ("Sun Motion On".equals(act)) {
        MainPanel.getInstance().getSunAnimationButton().setSelected(true);
    } else if ("Sun Motion Off".equals(act)) {
        MainPanel.getInstance().getSunAnimationButton().setSelected(false);
    } else // shadow commands
    if ("Shadow".equals(act)) {
        MainPanel.getInstance().getShadowButton().setSelected(buttonModel.isSelected());
    } else if ("Shadow On".equals(act)) {
        MainPanel.getInstance().getShadowButton().setSelected(true);
    } else if ("Shadow Off".equals(act)) {
        MainPanel.getInstance().getShadowButton().setSelected(false);
    } else if (act.startsWith("Daily Analysis for Group")) {
        if (EnergyPanel.getInstance().checkCity()) {
            PartGroup g = null;
            final GroupSelector selector = new GroupSelector();
            for (final String s : GroupSelector.types) {
                final int index = act.indexOf(s);
                if (index > 0) {
                    selector.setCurrentGroupType(s);
                    try {
                        final String t = act.substring(index + s.length()).trim();
                        if (!t.equals("")) {
                            g = new PartGroup(s);
                            final String[] a = t.split(",");
                            for (final String x : a) {
                                g.addId(Integer.parseInt(x.trim()));
                            }
                        }
                    } catch (final Exception e) {
                        JOptionPane.showMessageDialog(MainFrame.getInstance(), "<html>Error in <i>" + act + "</i>.<br>Please select the IDs manually.</html>", "Input Error", JOptionPane.ERROR_MESSAGE);
                        g = null;
                    }
                    break;
                }
            }
            if (g == null) {
                g = selector.select();
            }
            if (g != null) {
                final PartGroup g2 = g;
                EventQueue.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        // for some reason, this may be delayed in the AWT Event Queue in order to avoid a HTML form NullPointerException
                        final GroupDailyAnalysis a = new GroupDailyAnalysis(g2);
                        a.show(g2.getType() + ": " + g2.getIds());
                    }
                });
            }
            SceneManager.getInstance().hideAllEditPoints();
        }
    } else if (act.startsWith("Annual Analysis for Group")) {
        if (EnergyPanel.getInstance().checkCity()) {
            PartGroup g = null;
            final GroupSelector selector = new GroupSelector();
            for (final String s : GroupSelector.types) {
                final int index = act.indexOf(s);
                if (index > 0) {
                    selector.setCurrentGroupType(s);
                    try {
                        final String t = act.substring(index + s.length()).trim();
                        if (!t.equals("")) {
                            g = new PartGroup(s);
                            final String[] a = t.split(",");
                            for (final String x : a) {
                                g.addId(Integer.parseInt(x.trim()));
                            }
                        }
                    } catch (final Exception e) {
                        JOptionPane.showMessageDialog(MainFrame.getInstance(), "<html>Error in <i>" + act + "</i>.<br>Please select the IDs manually.</html>", "Input Error", JOptionPane.ERROR_MESSAGE);
                        g = null;
                    }
                    break;
                }
            }
            if (g == null) {
                g = selector.select();
            }
            if (g != null) {
                final PartGroup g2 = g;
                EventQueue.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        // for some reason, this may be delayed in the AWT Event Queue in order to avoid a HTML form NullPointerException
                        final GroupAnnualAnalysis a = new GroupAnnualAnalysis(g2);
                        a.show(g2.getType() + ": " + g2.getIds());
                    }
                });
            }
            SceneManager.getInstance().hideAllEditPoints();
        }
    } else // environmental temperature graph
    if ("Daily Environmental Temperature".equals(act)) {
        if (EnergyPanel.getInstance().checkCity()) {
            new DailyEnvironmentalTemperature().showDialog();
        }
    } else if ("Annual Environmental Temperature".equals(act)) {
        if (EnergyPanel.getInstance().checkCity()) {
            new AnnualEnvironmentalTemperature().showDialog();
        }
    } else if ("Monthly Sunshine Hours".equals(act)) {
        if (EnergyPanel.getInstance().checkCity()) {
            new MonthlySunshineHours().showDialog();
        }
    } else {
        JOptionPane.showMessageDialog(MainFrame.getInstance(), "<html>" + act + "</html>", "Information", JOptionPane.INFORMATION_MESSAGE);
    }
}
Also used : Agent(org.concord.energy3d.agents.Agent) AnnualEnvironmentalTemperature(org.concord.energy3d.simulation.AnnualEnvironmentalTemperature) HashMap(java.util.HashMap) GroupDailyAnalysis(org.concord.energy3d.simulation.GroupDailyAnalysis) GroupAnnualAnalysis(org.concord.energy3d.simulation.GroupAnnualAnalysis) MonthlySunshineHours(org.concord.energy3d.simulation.MonthlySunshineHours) EventString(org.concord.energy3d.agents.EventString) PartGroup(org.concord.energy3d.model.PartGroup) EventString(org.concord.energy3d.agents.EventString) ParseException(java.text.ParseException) BadLocationException(javax.swing.text.BadLocationException) DailyEnvironmentalTemperature(org.concord.energy3d.simulation.DailyEnvironmentalTemperature) EventTimeSeries(org.concord.energy3d.agents.EventTimeSeries) EventFrequency(org.concord.energy3d.agents.EventFrequency) QuestionnaireEvent(org.concord.energy3d.agents.QuestionnaireEvent) OperationEvent(org.concord.energy3d.agents.OperationEvent)

Example 4 with DailyEnvironmentalTemperature

use of org.concord.energy3d.simulation.DailyEnvironmentalTemperature in project energy3d by concord-consortium.

the class MainFrame method getDailyEnvironmentalTemperatureMenuItem.

private JMenuItem getDailyEnvironmentalTemperatureMenuItem() {
    if (dailyEnvironmentalTemperatureMenuItem == null) {
        dailyEnvironmentalTemperatureMenuItem = new JMenuItem("Daily Environmental Temperature...");
        dailyEnvironmentalTemperatureMenuItem.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().checkCity()) {
                    new DailyEnvironmentalTemperature().showDialog();
                }
            }
        });
    }
    return dailyEnvironmentalTemperatureMenuItem;
}
Also used : ActionListener(java.awt.event.ActionListener) ActionEvent(java.awt.event.ActionEvent) JMenuItem(javax.swing.JMenuItem) DailyEnvironmentalTemperature(org.concord.energy3d.simulation.DailyEnvironmentalTemperature)

Aggregations

DailyEnvironmentalTemperature (org.concord.energy3d.simulation.DailyEnvironmentalTemperature)4 AnnualEnvironmentalTemperature (org.concord.energy3d.simulation.AnnualEnvironmentalTemperature)3 ActionEvent (java.awt.event.ActionEvent)2 ActionListener (java.awt.event.ActionListener)2 JMenuItem (javax.swing.JMenuItem)2 GroupAnnualAnalysis (org.concord.energy3d.simulation.GroupAnnualAnalysis)2 GroupDailyAnalysis (org.concord.energy3d.simulation.GroupDailyAnalysis)2 MonthlySunshineHours (org.concord.energy3d.simulation.MonthlySunshineHours)2 Vector3 (com.ardor3d.math.Vector3)1 ReadOnlyVector3 (com.ardor3d.math.type.ReadOnlyVector3)1 BorderLayout (java.awt.BorderLayout)1 ItemEvent (java.awt.event.ItemEvent)1 ItemListener (java.awt.event.ItemListener)1 File (java.io.File)1 URL (java.net.URL)1 ParseException (java.text.ParseException)1 Calendar (java.util.Calendar)1 Date (java.util.Date)1 GregorianCalendar (java.util.GregorianCalendar)1 HashMap (java.util.HashMap)1