Search in sources :

Example 6 with Foundation

use of org.concord.energy3d.model.Foundation in project energy3d by concord-consortium.

the class PopupMenuForDoor method getPopupMenu.

static JPopupMenu getPopupMenu() {
    if (popupMenuForDoor == null) {
        final JMenuItem miSize = new JMenuItem("Size...");
        miSize.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof Door)) {
                    return;
                }
                final Door door = (Door) selectedPart;
                final HousePart container = door.getContainer();
                final Foundation foundation = door.getTopContainer();
                final String partInfo = door.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel inputPanel = new JPanel(new GridLayout(2, 2, 5, 5));
                gui.add(inputPanel, BorderLayout.CENTER);
                inputPanel.add(new JLabel("Width (m): "));
                final JTextField widthField = new JTextField(threeDecimalsFormat.format(door.getDoorWidth()));
                inputPanel.add(widthField);
                inputPanel.add(new JLabel("Height (m): "));
                final JTextField heightField = new JTextField(threeDecimalsFormat.format(door.getDoorHeight()));
                inputPanel.add(heightField);
                inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                final JPanel scopePanel = new JPanel();
                scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
                scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Door", true);
                final JRadioButton rb2 = new JRadioButton("All Doors on this Wall");
                final JRadioButton rb3 = new JRadioButton("All Doors of this Building");
                scopePanel.add(rb1);
                scopePanel.add(rb2);
                scopePanel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                gui.add(scopePanel, BorderLayout.NORTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { "Set Size for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Door Size");
                while (true) {
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        boolean ok = true;
                        double w = 0, h = 0;
                        try {
                            w = Double.parseDouble(widthField.getText());
                            h = Double.parseDouble(heightField.getText());
                        } catch (final NumberFormatException x) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            double wmax = 10;
                            if (container instanceof Wall) {
                                wmax = ((Wall) container).getWallWidth() * 0.99;
                            }
                            double hmax = 10;
                            if (container instanceof Wall) {
                                hmax = ((Wall) container).getWallHeight() * 0.99;
                            }
                            if (w < 0.1 || w > wmax) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Width must be between 0.1 and " + (int) wmax + " m.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else if (h < 0.1 || h > hmax) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Height must be between 0.1 and " + (int) hmax + " m.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                boolean changed = Math.abs(w - door.getDoorWidth()) > 0.000001 || Math.abs(h - door.getDoorHeight()) > 0.000001;
                                if (rb1.isSelected()) {
                                    if (changed) {
                                        final SetPartSizeCommand c = new SetPartSizeCommand(door);
                                        door.setDoorWidth(w);
                                        door.setDoorHeight(h);
                                        door.draw();
                                        door.getContainer().draw();
                                        SceneManager.getInstance().refresh();
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    if (!changed) {
                                        if (door.getContainer() instanceof Wall) {
                                            final Wall wall = (Wall) door.getContainer();
                                            for (final Door x : wall.getDoors()) {
                                                if (Math.abs(w - x.getDoorWidth()) > 0.000001 || Math.abs(h - x.getDoorHeight()) > 0.000001) {
                                                    changed = true;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    if (changed) {
                                        if (door.getContainer() instanceof Wall) {
                                            final Wall wall = (Wall) door.getContainer();
                                            final ChangeDoorSizeOnWallCommand c = new ChangeDoorSizeOnWallCommand(wall);
                                            wall.setDoorSize(w, h);
                                            SceneManager.getInstance().getUndoManager().addEdit(c);
                                        }
                                    }
                                    selectedScopeIndex = 1;
                                } else if (rb3.isSelected()) {
                                    if (!changed) {
                                        for (final Door x : foundation.getDoors()) {
                                            if (Math.abs(w - x.getDoorWidth()) > 0.000001 || Math.abs(h - x.getDoorHeight()) > 0.000001) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final SetSizeForDoorsOnFoundationCommand c = new SetSizeForDoorsOnFoundationCommand(foundation);
                                        foundation.setSizeForDoors(w, h);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 2;
                                }
                                if (changed) {
                                    updateAfterEdit();
                                }
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        final JMenu textureMenu = new JMenu("Texture");
        final ButtonGroup textureGroup = new ButtonGroup();
        final JRadioButtonMenuItem rbmiTextureNone = new JRadioButtonMenuItem("No Texture");
        rbmiTextureNone.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    final ChangeBuildingTextureCommand c = new ChangeBuildingTextureCommand();
                    Scene.getInstance().setTextureMode(TextureMode.None);
                    Scene.getInstance().setEdited(true);
                    if (MainPanel.getInstance().getEnergyButton().isSelected()) {
                        MainPanel.getInstance().getEnergyButton().setSelected(false);
                    }
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                }
            }
        });
        textureGroup.add(rbmiTextureNone);
        textureMenu.add(rbmiTextureNone);
        final JRadioButtonMenuItem rbmiTextureOutline = new JRadioButtonMenuItem("Outline Texture");
        rbmiTextureOutline.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    final ChangeBuildingTextureCommand c = new ChangeBuildingTextureCommand();
                    Scene.getInstance().setTextureMode(TextureMode.Simple);
                    Scene.getInstance().setEdited(true);
                    if (MainPanel.getInstance().getEnergyButton().isSelected()) {
                        MainPanel.getInstance().getEnergyButton().setSelected(false);
                    }
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                }
            }
        });
        textureGroup.add(rbmiTextureOutline);
        textureMenu.add(rbmiTextureOutline);
        textureMenu.addSeparator();
        final JRadioButtonMenuItem rbmiTexture01 = MainFrame.getInstance().createWallTextureMenuItem(Door.TEXTURE_01, "icons/door_01.png");
        textureGroup.add(rbmiTexture01);
        textureMenu.add(rbmiTexture01);
        textureMenu.addMenuListener(new MenuListener() {

            @Override
            public void menuSelected(final MenuEvent e) {
                if (Scene.getInstance().getTextureMode() == TextureMode.None) {
                    Util.selectSilently(rbmiTextureNone, true);
                    return;
                }
                if (Scene.getInstance().getTextureMode() == TextureMode.Simple) {
                    Util.selectSilently(rbmiTextureOutline, true);
                    return;
                }
                switch(Scene.getInstance().getWallTextureType()) {
                    case Door.TEXTURE_01:
                        Util.selectSilently(rbmiTexture01, true);
                        break;
                }
            }

            @Override
            public void menuDeselected(final MenuEvent e) {
                textureMenu.setEnabled(true);
            }

            @Override
            public void menuCanceled(final MenuEvent e) {
                textureMenu.setEnabled(true);
            }
        });
        popupMenuForDoor = createPopupMenu(false, false, null);
        popupMenuForDoor.addSeparator();
        popupMenuForDoor.add(miSize);
        popupMenuForDoor.add(colorAction);
        popupMenuForDoor.add(textureMenu);
        popupMenuForDoor.add(createInsulationMenuItem(true));
        popupMenuForDoor.add(createVolumetricHeatCapacityMenuItem());
        popupMenuForDoor.addSeparator();
        JMenuItem mi = new JMenuItem("Daily Energy Analysis...");
        mi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().adjustCellSize()) {
                    return;
                }
                if (SceneManager.getInstance().getSelectedPart() instanceof Door) {
                    new EnergyDailyAnalysis().show("Daily Energy for Door");
                }
            }
        });
        popupMenuForDoor.add(mi);
        mi = new JMenuItem("Annual Energy Analysis...");
        mi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().adjustCellSize()) {
                    return;
                }
                if (SceneManager.getInstance().getSelectedPart() instanceof Door) {
                    new EnergyAnnualAnalysis().show("Annual Energy for Door");
                }
            }
        });
        popupMenuForDoor.add(mi);
    }
    return popupMenuForDoor;
}
Also used : JPanel(javax.swing.JPanel) EnergyAnnualAnalysis(org.concord.energy3d.simulation.EnergyAnnualAnalysis) ItemEvent(java.awt.event.ItemEvent) JRadioButton(javax.swing.JRadioButton) Wall(org.concord.energy3d.model.Wall) ActionEvent(java.awt.event.ActionEvent) SetPartSizeCommand(org.concord.energy3d.undo.SetPartSizeCommand) MenuListener(javax.swing.event.MenuListener) BoxLayout(javax.swing.BoxLayout) JTextField(javax.swing.JTextField) GridLayout(java.awt.GridLayout) BorderLayout(java.awt.BorderLayout) ChangeDoorSizeOnWallCommand(org.concord.energy3d.undo.ChangeDoorSizeOnWallCommand) Foundation(org.concord.energy3d.model.Foundation) JMenuItem(javax.swing.JMenuItem) HousePart(org.concord.energy3d.model.HousePart) MenuEvent(javax.swing.event.MenuEvent) JLabel(javax.swing.JLabel) JRadioButtonMenuItem(javax.swing.JRadioButtonMenuItem) SetSizeForDoorsOnFoundationCommand(org.concord.energy3d.undo.SetSizeForDoorsOnFoundationCommand) JOptionPane(javax.swing.JOptionPane) Door(org.concord.energy3d.model.Door) ActionListener(java.awt.event.ActionListener) ButtonGroup(javax.swing.ButtonGroup) EnergyDailyAnalysis(org.concord.energy3d.simulation.EnergyDailyAnalysis) ItemListener(java.awt.event.ItemListener) ChangeBuildingTextureCommand(org.concord.energy3d.undo.ChangeBuildingTextureCommand) JDialog(javax.swing.JDialog) JMenu(javax.swing.JMenu)

Example 7 with Foundation

use of org.concord.energy3d.model.Foundation in project energy3d by concord-consortium.

the class PopupMenuForFresnelReflector method getPopupMenu.

static JPopupMenu getPopupMenu() {
    if (popupMenuForFresnelReflector == null) {
        final JMenuItem miMesh = new JMenuItem("Mesh...");
        miMesh.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final Foundation foundation = r.getTopContainer();
                final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel inputPanel = new JPanel(new GridLayout(2, 2, 5, 5));
                gui.add(inputPanel, BorderLayout.CENTER);
                inputPanel.add(new JLabel("Length direction: "));
                final JTextField nLengthField = new JTextField("" + r.getNSectionLength());
                inputPanel.add(nLengthField);
                inputPanel.add(new JLabel("Width direction: "));
                final JTextField nWidthField = new JTextField("" + r.getNSectionWidth());
                inputPanel.add(nWidthField);
                inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                final JPanel scopePanel = new JPanel();
                scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
                scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                scopePanel.add(rb1);
                scopePanel.add(rb2);
                scopePanel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                gui.add(scopePanel, BorderLayout.NORTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { "Set mesh for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Mesh");
                while (true) {
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        int nSectionLength = 0, nSectionWidth = 0;
                        boolean ok = true;
                        try {
                            nSectionLength = Integer.parseInt(nLengthField.getText());
                            nSectionWidth = Integer.parseInt(nWidthField.getText());
                        } catch (final NumberFormatException nfe) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            if (nSectionLength < 4) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Sections in the direction of length must be at least 4.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else if (nSectionWidth < 4) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Sections in the direction of width must be at least 4.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else if (!Util.isPowerOfTwo(nSectionLength) || !Util.isPowerOfTwo(nSectionWidth)) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Numbers of mesh sections must be power of two.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                if (rb1.isSelected()) {
                                    r.setNSectionLength(nSectionLength);
                                    r.setNSectionWidth(nSectionWidth);
                                    r.draw();
                                    SceneManager.getInstance().refresh();
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    foundation.setSectionsForFresnelReflectors(nSectionLength, nSectionWidth);
                                    selectedScopeIndex = 1;
                                } else if (rb3.isSelected()) {
                                    Scene.getInstance().setSectionsForAllFresnelReflectors(nSectionLength, nSectionWidth);
                                    selectedScopeIndex = 2;
                                }
                                updateAfterEdit();
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        final JCheckBoxMenuItem cbmiDisableEditPoints = new JCheckBoxMenuItem("Disable Edit Points");
        cbmiDisableEditPoints.addItemListener(new ItemListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void itemStateChanged(final ItemEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final boolean disabled = cbmiDisableEditPoints.isSelected();
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final String partInfo = r.toString().substring(0, r.toString().indexOf(')') + 1);
                final JPanel gui = new JPanel(new BorderLayout(0, 20));
                final JPanel panel = new JPanel();
                gui.add(panel, BorderLayout.SOUTH);
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
                panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                panel.add(rb1);
                panel.add(rb2);
                panel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                final String title = "<html>" + (disabled ? "Disable" : "Enable") + " edit points for " + partInfo + "</html>";
                final String footnote = "<html><hr><font size=2>Disable the edit points of a Fresnel reflector prevents it<br>from being unintentionally moved.<hr></html>";
                final Object[] options = new Object[] { "OK", "Cancel" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[0]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), (disabled ? "Disable" : "Enable") + " Edit Points");
                dialog.setVisible(true);
                if (optionPane.getValue() == options[0]) {
                    if (rb1.isSelected()) {
                        final LockEditPointsCommand c = new LockEditPointsCommand(r);
                        r.setLockEdit(disabled);
                        SceneManager.getInstance().getUndoManager().addEdit(c);
                        selectedScopeIndex = 0;
                    } else if (rb2.isSelected()) {
                        final Foundation foundation = r.getTopContainer();
                        final LockEditPointsOnFoundationCommand c = new LockEditPointsOnFoundationCommand(foundation, r.getClass());
                        foundation.setLockEditForClass(disabled, r.getClass());
                        SceneManager.getInstance().getUndoManager().addEdit(c);
                        selectedScopeIndex = 1;
                    } else if (rb3.isSelected()) {
                        final LockEditPointsForClassCommand c = new LockEditPointsForClassCommand(r);
                        Scene.getInstance().setLockEditForClass(disabled, r.getClass());
                        SceneManager.getInstance().getUndoManager().addEdit(c);
                        selectedScopeIndex = 2;
                    }
                    SceneManager.getInstance().refresh();
                    Scene.getInstance().setEdited(true);
                }
            }
        });
        final JCheckBoxMenuItem cbmiDrawBeam = new JCheckBoxMenuItem("Draw Sun Beam");
        cbmiDrawBeam.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final ShowSunBeamCommand c = new ShowSunBeamCommand(r);
                r.setSunBeamVisible(cbmiDrawBeam.isSelected());
                r.drawSunBeam();
                r.draw();
                SceneManager.getInstance().refresh();
                SceneManager.getInstance().getUndoManager().addEdit(c);
                Scene.getInstance().setEdited(true);
            }
        });
        final JMenuItem miSetAbsorber = new JMenuItem("Set Absorber...");
        miSetAbsorber.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final String partInfo = r.toString().substring(0, r.toString().indexOf(')') + 1);
                final JPanel gui = new JPanel(new BorderLayout(0, 20));
                final JPanel panel = new JPanel();
                gui.add(panel, BorderLayout.SOUTH);
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
                panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                panel.add(rb1);
                panel.add(rb2);
                panel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                final List<Foundation> foundations = Scene.getInstance().getAllFoundations();
                final JComboBox<String> comboBox = new JComboBox<String>();
                comboBox.addItemListener(new ItemListener() {

                    @Override
                    public void itemStateChanged(final ItemEvent e) {
                    }
                });
                comboBox.addItem("None");
                for (final Foundation x : foundations) {
                    if (!x.getChildren().isEmpty()) {
                        comboBox.addItem(x.getId() + "");
                    }
                }
                if (r.getReceiver() != null) {
                    comboBox.setSelectedItem(r.getReceiver().getId() + "");
                }
                gui.add(comboBox, BorderLayout.CENTER);
                final String title = "<html>Select the ID of the absorber<br>foundation for " + partInfo + "</html>";
                final String footnote = "<html><hr><font size=2>The sunlight reflected by this Fresnel reflector will<br>focus on the top of the target, where the absorber<br>tube is located.<hr></html>";
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Absorber");
                while (true) {
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        Foundation absorber = null;
                        if (comboBox.getSelectedIndex() > 0) {
                            int id = -1;
                            boolean ok = true;
                            try {
                                id = Integer.parseInt((String) comboBox.getSelectedItem());
                            } catch (final NumberFormatException exception) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), comboBox.getSelectedItem() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                                ok = false;
                            }
                            if (ok) {
                                final HousePart p = Scene.getInstance().getPart(id);
                                if (p instanceof Foundation) {
                                    absorber = (Foundation) p;
                                } else {
                                    JOptionPane.showMessageDialog(MainFrame.getInstance(), "ID must be that of a foundation.", "ID Error", JOptionPane.ERROR_MESSAGE);
                                }
                            }
                        }
                        boolean changed = absorber != r.getReceiver();
                        if (rb1.isSelected()) {
                            if (changed) {
                                final Foundation oldTarget = r.getReceiver();
                                final ChangeFresnelReflectorAbsorberCommand c = new ChangeFresnelReflectorAbsorberCommand(r);
                                r.setReceiver(absorber);
                                r.draw();
                                if (oldTarget != null) {
                                    oldTarget.drawSolarReceiver();
                                }
                                SceneManager.getInstance().refresh();
                                SceneManager.getInstance().getUndoManager().addEdit(c);
                            }
                            selectedScopeIndex = 0;
                        } else if (rb2.isSelected()) {
                            final Foundation foundation = r.getTopContainer();
                            if (!changed) {
                                for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                    if (x.getReceiver() != absorber) {
                                        changed = true;
                                        break;
                                    }
                                }
                            }
                            if (changed) {
                                final ChangeFoundationFresnelReflectorAbsorberCommand c = new ChangeFoundationFresnelReflectorAbsorberCommand(foundation);
                                foundation.setAbsorberForFresnelReflectors(absorber);
                                SceneManager.getInstance().getUndoManager().addEdit(c);
                            }
                            selectedScopeIndex = 1;
                        } else if (rb3.isSelected()) {
                            if (!changed) {
                                for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                    if (x.getReceiver() != absorber) {
                                        changed = true;
                                        break;
                                    }
                                }
                            }
                            if (changed) {
                                final ChangeAbsorberForAllFresnelReflectorsCommand c = new ChangeAbsorberForAllFresnelReflectorsCommand();
                                Scene.getInstance().setAbsorberForAllFresnelReflectors(absorber);
                                SceneManager.getInstance().getUndoManager().addEdit(c);
                            }
                            selectedScopeIndex = 2;
                        }
                        if (changed) {
                            if (absorber != null) {
                                absorber.drawSolarReceiver();
                            }
                            updateAfterEdit();
                        }
                        if (choice == options[0]) {
                            break;
                        }
                    }
                }
            }
        });
        final JMenuItem miLength = new JMenuItem("Length...");
        miLength.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final Foundation foundation = r.getTopContainer();
                final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel inputPanel = new JPanel(new GridLayout(1, 2, 5, 5));
                gui.add(inputPanel, BorderLayout.CENTER);
                inputPanel.add(new JLabel("Length: "));
                final JTextField lengthField = new JTextField(threeDecimalsFormat.format(r.getLength()));
                inputPanel.add(lengthField);
                inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                final JPanel scopePanel = new JPanel();
                scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
                scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                scopePanel.add(rb1);
                scopePanel.add(rb2);
                scopePanel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                gui.add(scopePanel, BorderLayout.NORTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { "Set length for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Length");
                while (true) {
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double length = 0;
                        boolean ok = true;
                        try {
                            length = Double.parseDouble(lengthField.getText());
                        } catch (final NumberFormatException x) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            if (length < 1 || length > 1000) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Length must be between 1 and 1000 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                boolean changed = length != r.getLength();
                                if (rb1.isSelected()) {
                                    if (changed) {
                                        final SetPartSizeCommand c = new SetPartSizeCommand(r);
                                        r.setLength(length);
                                        r.ensureFullModules(false);
                                        r.draw();
                                        SceneManager.getInstance().refresh();
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                            if (x.getLength() != length) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final SetSizeForFresnelReflectorsOnFoundationCommand c = new SetSizeForFresnelReflectorsOnFoundationCommand(foundation);
                                        foundation.setLengthForFresnelReflectors(length);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 1;
                                } else if (rb3.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                            if (x.getLength() != length) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final SetSizeForAllFresnelReflectorsCommand c = new SetSizeForAllFresnelReflectorsCommand();
                                        Scene.getInstance().setLengthForAllFresnelReflectors(length);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 2;
                                }
                                if (changed) {
                                    updateAfterEdit();
                                }
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        final JMenuItem miModuleWidth = new JMenuItem("Module Width...");
        miModuleWidth.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final Foundation foundation = r.getTopContainer();
                final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel inputPanel = new JPanel(new GridLayout(1, 2, 5, 5));
                gui.add(inputPanel, BorderLayout.CENTER);
                inputPanel.add(new JLabel("Module Width: "));
                final JTextField moduleWidthField = new JTextField(threeDecimalsFormat.format(r.getModuleWidth()));
                inputPanel.add(moduleWidthField);
                inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                final JPanel scopePanel = new JPanel();
                scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
                scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                scopePanel.add(rb1);
                scopePanel.add(rb2);
                scopePanel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                gui.add(scopePanel, BorderLayout.NORTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { "Set module width for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Module Width");
                while (true) {
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double moduleWidth = 0;
                        boolean ok = true;
                        try {
                            moduleWidth = Double.parseDouble(moduleWidthField.getText());
                        } catch (final NumberFormatException x) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            if (moduleWidth < 0.1 || moduleWidth > 20) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Module width must be between 0.1 and 20 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                boolean changed = moduleWidth != r.getModuleWidth();
                                if (rb1.isSelected()) {
                                    if (changed) {
                                        final SetPartSizeCommand c = new SetPartSizeCommand(r);
                                        r.setModuleWidth(moduleWidth);
                                        r.ensureFullModules(false);
                                        r.draw();
                                        SceneManager.getInstance().refresh();
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                            if (x.getModuleWidth() != moduleWidth) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final SetSizeForFresnelReflectorsOnFoundationCommand c = new SetSizeForFresnelReflectorsOnFoundationCommand(foundation);
                                        foundation.setModuleWidthForFresnelReflectors(moduleWidth);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 1;
                                } else if (rb3.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                            if (x.getModuleWidth() != moduleWidth) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final SetSizeForAllFresnelReflectorsCommand c = new SetSizeForAllFresnelReflectorsCommand();
                                        Scene.getInstance().setModuleWidthForAllFresnelReflectors(moduleWidth);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 2;
                                }
                                if (changed) {
                                    updateAfterEdit();
                                }
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        final JMenuItem miModuleLength = new JMenuItem("Module Length...");
        miModuleLength.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final Foundation foundation = r.getTopContainer();
                final String partInfo = r.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel inputPanel = new JPanel(new GridLayout(1, 2, 5, 5));
                gui.add(inputPanel, BorderLayout.CENTER);
                inputPanel.add(new JLabel("Module Length: "));
                final JTextField moduleLengthField = new JTextField(threeDecimalsFormat.format(r.getModuleLength()));
                inputPanel.add(moduleLengthField);
                inputPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
                final JPanel scopePanel = new JPanel();
                scopePanel.setLayout(new BoxLayout(scopePanel, BoxLayout.Y_AXIS));
                scopePanel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                scopePanel.add(rb1);
                scopePanel.add(rb2);
                scopePanel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                gui.add(scopePanel, BorderLayout.NORTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { "Set module length for " + partInfo, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Module Length");
                while (true) {
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double moduleLength = 0;
                        boolean ok = true;
                        try {
                            moduleLength = Double.parseDouble(moduleLengthField.getText());
                        } catch (final NumberFormatException x) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), "Invalid input!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            if (moduleLength < 1 || moduleLength > 100) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Module length must be between 1 and 100 m.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                boolean changed = moduleLength != r.getModuleLength();
                                if (rb1.isSelected()) {
                                    if (changed) {
                                        final SetPartSizeCommand c = new SetPartSizeCommand(r);
                                        r.setModuleLength(moduleLength);
                                        r.ensureFullModules(false);
                                        r.draw();
                                        SceneManager.getInstance().refresh();
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                            if (x.getModuleLength() != moduleLength) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final SetSizeForFresnelReflectorsOnFoundationCommand c = new SetSizeForFresnelReflectorsOnFoundationCommand(foundation);
                                        foundation.setModuleLengthForFresnelReflectors(moduleLength);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 1;
                                } else if (rb3.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                            if (x.getModuleLength() != moduleLength) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final SetSizeForAllFresnelReflectorsCommand c = new SetSizeForAllFresnelReflectorsCommand();
                                        Scene.getInstance().setModuleLengthForAllFresnelReflectors(moduleLength);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 2;
                                }
                                if (changed) {
                                    updateAfterEdit();
                                }
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        final JMenuItem miBaseHeight = new JMenuItem("Base Height...");
        miBaseHeight.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final Foundation foundation = r.getTopContainer();
                final String title = "<html>Base Height (m) of " + partInfo + "</html>";
                final String footnote = "<html><hr><font size=2></html>";
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel panel = new JPanel();
                gui.add(panel, BorderLayout.CENTER);
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
                panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                panel.add(rb1);
                panel.add(rb2);
                panel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(r.getBaseHeight() * Scene.getInstance().getAnnotationScale()));
                gui.add(inputField, BorderLayout.SOUTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Base Height");
                while (true) {
                    inputField.selectAll();
                    inputField.requestFocusInWindow();
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double val = 0;
                        boolean ok = true;
                        try {
                            val = Double.parseDouble(inputField.getText()) / Scene.getInstance().getAnnotationScale();
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            boolean changed = val != r.getBaseHeight();
                            if (rb1.isSelected()) {
                                if (changed) {
                                    final ChangeBaseHeightCommand c = new ChangeBaseHeightCommand(r);
                                    r.setBaseHeight(val);
                                    r.draw();
                                    SceneManager.getInstance().refresh();
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                selectedScopeIndex = 0;
                            } else if (rb2.isSelected()) {
                                if (!changed) {
                                    for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                        if (x.getBaseHeight() != val) {
                                            changed = true;
                                            break;
                                        }
                                    }
                                }
                                if (changed) {
                                    final ChangeFoundationSolarCollectorBaseHeightCommand c = new ChangeFoundationSolarCollectorBaseHeightCommand(foundation, r.getClass());
                                    foundation.setBaseHeightForFresnelReflectors(val);
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                selectedScopeIndex = 1;
                            } else if (rb3.isSelected()) {
                                if (!changed) {
                                    for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                        if (x.getBaseHeight() != val) {
                                            changed = true;
                                            break;
                                        }
                                    }
                                }
                                if (changed) {
                                    final ChangeBaseHeightForAllSolarCollectorsCommand c = new ChangeBaseHeightForAllSolarCollectorsCommand(r.getClass());
                                    Scene.getInstance().setBaseHeightForAllFresnelReflectors(val);
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                selectedScopeIndex = 2;
                            }
                            if (changed) {
                                updateAfterEdit();
                            }
                            if (choice == options[0]) {
                                break;
                            }
                        }
                    }
                }
            }
        });
        final JMenuItem miAzimuth = new JMenuItem("Azimuth...");
        miAzimuth.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final FresnelReflector fresnel = (FresnelReflector) selectedPart;
                final Foundation foundation = fresnel.getTopContainer();
                final String title = "<html>Azimuth Angle (&deg;) of " + partInfo + "</html>";
                final String footnote = "<html><hr><font size=2>The azimuth angle is measured clockwise from the true north.<hr></html>";
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel panel = new JPanel();
                gui.add(panel, BorderLayout.CENTER);
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
                panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                panel.add(rb1);
                panel.add(rb2);
                panel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                double a = fresnel.getRelativeAzimuth() + foundation.getAzimuth();
                if (a > 360) {
                    a -= 360;
                }
                final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(a));
                gui.add(inputField, BorderLayout.SOUTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Azimuth");
                while (true) {
                    inputField.selectAll();
                    inputField.requestFocusInWindow();
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double val = 0;
                        boolean ok = true;
                        try {
                            val = Double.parseDouble(inputField.getText());
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            a = val - foundation.getAzimuth();
                            if (a < 0) {
                                a += 360;
                            }
                            boolean changed = Math.abs(a - fresnel.getRelativeAzimuth()) > 0.000001;
                            if (rb1.isSelected()) {
                                if (changed) {
                                    final ChangeAzimuthCommand c = new ChangeAzimuthCommand(fresnel);
                                    fresnel.setRelativeAzimuth(a);
                                    fresnel.draw();
                                    SceneManager.getInstance().refresh();
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                selectedScopeIndex = 0;
                            } else if (rb2.isSelected()) {
                                if (!changed) {
                                    for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                        if (Math.abs(a - x.getRelativeAzimuth()) > 0.000001) {
                                            changed = true;
                                            break;
                                        }
                                    }
                                }
                                if (changed) {
                                    final ChangeFoundationFresnelReflectorAzimuthCommand c = new ChangeFoundationFresnelReflectorAzimuthCommand(foundation);
                                    foundation.setAzimuthForParabolicFresnelReflectors(a);
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                selectedScopeIndex = 1;
                            } else if (rb3.isSelected()) {
                                if (!changed) {
                                    for (final ParabolicTrough x : Scene.getInstance().getAllParabolicTroughs()) {
                                        if (Math.abs(a - x.getRelativeAzimuth()) > 0.000001) {
                                            changed = true;
                                            break;
                                        }
                                    }
                                }
                                if (changed) {
                                    final ChangeAzimuthForAllFresnelReflectorsCommand c = new ChangeAzimuthForAllFresnelReflectorsCommand();
                                    Scene.getInstance().setAzimuthForAllFresnelReflectors(a);
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                selectedScopeIndex = 2;
                            }
                            if (changed) {
                                updateAfterEdit();
                            }
                            if (choice == options[0]) {
                                break;
                            }
                        }
                    }
                }
            }
        });
        final JMenu labelMenu = new JMenu("Label");
        final JCheckBoxMenuItem miLabelNone = new JCheckBoxMenuItem("None", true);
        miLabelNone.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (miLabelNone.isSelected()) {
                    final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                    if (selectedPart instanceof FresnelReflector) {
                        final FresnelReflector r = (FresnelReflector) selectedPart;
                        final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
                        r.clearLabels();
                        r.draw();
                        SceneManager.getInstance().getUndoManager().addEdit(c);
                        Scene.getInstance().setEdited(true);
                        SceneManager.getInstance().refresh();
                    }
                }
            }
        });
        labelMenu.add(miLabelNone);
        final JCheckBoxMenuItem miLabelCustom = new JCheckBoxMenuItem("Custom");
        miLabelCustom.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (selectedPart instanceof FresnelReflector) {
                    final FresnelReflector r = (FresnelReflector) selectedPart;
                    final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
                    r.setLabelCustom(miLabelCustom.isSelected());
                    if (r.getLabelCustom()) {
                        r.setLabelCustomText(JOptionPane.showInputDialog(MainFrame.getInstance(), "Custom Text", r.getLabelCustomText()));
                    }
                    r.draw();
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                    Scene.getInstance().setEdited(true);
                    SceneManager.getInstance().refresh();
                }
            }
        });
        labelMenu.add(miLabelCustom);
        final JCheckBoxMenuItem miLabelId = new JCheckBoxMenuItem("ID");
        miLabelId.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (selectedPart instanceof FresnelReflector) {
                    final FresnelReflector r = (FresnelReflector) selectedPart;
                    final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
                    r.setLabelId(miLabelId.isSelected());
                    r.draw();
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                    Scene.getInstance().setEdited(true);
                    SceneManager.getInstance().refresh();
                }
            }
        });
        labelMenu.add(miLabelId);
        final JCheckBoxMenuItem miLabelEnergyOutput = new JCheckBoxMenuItem("Energy Output");
        miLabelEnergyOutput.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (selectedPart instanceof FresnelReflector) {
                    final FresnelReflector r = (FresnelReflector) selectedPart;
                    final SetFresnelReflectorLabelCommand c = new SetFresnelReflectorLabelCommand(r);
                    r.setLabelEnergyOutput(miLabelEnergyOutput.isSelected());
                    r.draw();
                    SceneManager.getInstance().getUndoManager().addEdit(c);
                    Scene.getInstance().setEdited(true);
                    SceneManager.getInstance().refresh();
                }
            }
        });
        labelMenu.add(miLabelEnergyOutput);
        popupMenuForFresnelReflector = createPopupMenu(true, true, new Runnable() {

            @Override
            public void run() {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                Util.selectSilently(cbmiDisableEditPoints, r.getLockEdit());
                Util.selectSilently(cbmiDrawBeam, r.isSunBeamVisible());
                Util.selectSilently(miLabelNone, !r.isLabelVisible());
                Util.selectSilently(miLabelCustom, r.getLabelCustom());
                Util.selectSilently(miLabelId, r.getLabelId());
                Util.selectSilently(miLabelEnergyOutput, r.getLabelEnergyOutput());
            }
        });
        final JMenuItem miReflectance = new JMenuItem("Reflectance...");
        miReflectance.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final String title = "<html>Reflectance (%) of " + partInfo + "</html>";
                final String footnote = "<html><hr><font size=2>Reflectance can be affected by pollen and dust.<hr></html>";
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel panel = new JPanel();
                gui.add(panel, BorderLayout.CENTER);
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
                panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                panel.add(rb1);
                panel.add(rb2);
                panel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(r.getReflectance() * 100));
                gui.add(inputField, BorderLayout.SOUTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Fresnel Reflector Reflectance");
                while (true) {
                    inputField.selectAll();
                    inputField.requestFocusInWindow();
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double val = 0;
                        boolean ok = true;
                        try {
                            val = Double.parseDouble(inputField.getText());
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            if (val < 50 || val > 99) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Fresnel reflector reflectance must be between 50% and 99%.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                boolean changed = Math.abs(val * 0.01 - r.getReflectance()) > 0.000001;
                                if (rb1.isSelected()) {
                                    if (changed) {
                                        final ChangeSolarReflectorReflectanceCommand c = new ChangeSolarReflectorReflectanceCommand(r);
                                        r.setReflectance(val * 0.01);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    final Foundation foundation = r.getTopContainer();
                                    if (!changed) {
                                        for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                            if (Math.abs(x.getReflectance() - val * 0.01) > 0.000001) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final ChangeFoundationSolarReflectorReflectanceCommand c = new ChangeFoundationSolarReflectorReflectanceCommand(foundation, r.getClass());
                                        foundation.setReflectanceForSolarReflectors(val * 0.01, r.getClass());
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 1;
                                } else if (rb3.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                            if (Math.abs(x.getReflectance() - val * 0.01) > 0.000001) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final ChangeReflectanceForAllSolarReflectorsCommand c = new ChangeReflectanceForAllSolarReflectorsCommand(r.getClass());
                                        Scene.getInstance().setReflectanceForAllSolarReflectors(val * 0.01, r.getClass());
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 2;
                                }
                                if (changed) {
                                    updateAfterEdit();
                                }
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        final JMenuItem miApertureRatio = new JMenuItem("Aperture Ratio...");
        miApertureRatio.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final String title = "<html>Aperture percentage of " + partInfo + "</html>";
                final String footnote = "<html><hr><font size=2>The percentage of the effective area for reflection<br>after deducting the area of gaps, frames, etc.<hr></html>";
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel panel = new JPanel();
                gui.add(panel, BorderLayout.CENTER);
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
                panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflectors on this Foundation");
                final JRadioButton rb3 = new JRadioButton("All Fresnel Reflectors");
                panel.add(rb1);
                panel.add(rb2);
                panel.add(rb3);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                bg.add(rb3);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                    case 2:
                        rb3.setSelected(true);
                        break;
                }
                final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(r.getOpticalEfficiency() * 100));
                gui.add(inputField, BorderLayout.SOUTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Aperture Percentage of Fresnel Reflector Surface");
                while (true) {
                    inputField.selectAll();
                    inputField.requestFocusInWindow();
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double val = 0;
                        boolean ok = true;
                        try {
                            val = Double.parseDouble(inputField.getText());
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            if (val < 70 || val > 100) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Fresnel reflector aperature percentage must be between 70% and 100%.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                boolean changed = Math.abs(val * 0.01 - r.getOpticalEfficiency()) > 0.000001;
                                if (rb1.isSelected()) {
                                    if (changed) {
                                        final ChangeSolarReflectorOpticalEfficiencyCommand c = new ChangeSolarReflectorOpticalEfficiencyCommand(r);
                                        r.setOpticalEfficiency(val * 0.01);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    final Foundation foundation = r.getTopContainer();
                                    if (!changed) {
                                        for (final FresnelReflector x : foundation.getFresnelReflectors()) {
                                            if (Math.abs(val * 0.01 - x.getOpticalEfficiency()) > 0.000001) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final ChangeFoundationSolarReflectorOpticalEfficiencyCommand c = new ChangeFoundationSolarReflectorOpticalEfficiencyCommand(foundation, r.getClass());
                                        foundation.setOpticalEfficiencyForSolarReflectors(val * 0.01, r.getClass());
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 1;
                                } else if (rb3.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                            if (Math.abs(val * 0.01 - x.getOpticalEfficiency()) > 0.000001) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final ChangeOpticalEfficiencyForAllSolarReflectorsCommand c = new ChangeOpticalEfficiencyForAllSolarReflectorsCommand(r.getClass());
                                        Scene.getInstance().setOpticalEfficiencyForAllSolarReflectors(val * 0.01, r.getClass());
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 2;
                                }
                                if (changed) {
                                    updateAfterEdit();
                                }
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        final JMenuItem miConversionEfficiency = new JMenuItem("Absorber Conversion Efficiency...");
        miConversionEfficiency.addActionListener(new ActionListener() {

            // remember the scope selection as the next action will likely be applied to the same scope
            private int selectedScopeIndex = 0;

            @Override
            public void actionPerformed(final ActionEvent e) {
                final HousePart selectedPart = SceneManager.getInstance().getSelectedPart();
                if (!(selectedPart instanceof FresnelReflector)) {
                    return;
                }
                final FresnelReflector r = (FresnelReflector) selectedPart;
                final Foundation absorber = r.getReceiver();
                if (absorber == null) {
                    JOptionPane.showMessageDialog(MainFrame.getInstance(), "This reflector does not link to an absorber.", "No Absorber", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                final String partInfo = selectedPart.toString().substring(0, selectedPart.toString().indexOf(')') + 1);
                final String title = "<html>Light-electricity conversion efficiency (%) of " + partInfo + "'s absorber</html>";
                final String footnote = "<html><hr><font size=2><hr></html>";
                final JPanel gui = new JPanel(new BorderLayout());
                final JPanel panel = new JPanel();
                gui.add(panel, BorderLayout.CENTER);
                panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
                panel.setBorder(BorderFactory.createTitledBorder("Apply to:"));
                final JRadioButton rb1 = new JRadioButton("Only this Fresnel Reflector's Absorber", true);
                final JRadioButton rb2 = new JRadioButton("All Fresnel Reflector Absorbers");
                panel.add(rb1);
                panel.add(rb2);
                final ButtonGroup bg = new ButtonGroup();
                bg.add(rb1);
                bg.add(rb2);
                switch(selectedScopeIndex) {
                    case 0:
                        rb1.setSelected(true);
                        break;
                    case 1:
                        rb2.setSelected(true);
                        break;
                }
                final JTextField inputField = new JTextField(EnergyPanel.TWO_DECIMALS.format(absorber.getSolarReceiverEfficiency() * 100));
                gui.add(inputField, BorderLayout.SOUTH);
                final Object[] options = new Object[] { "OK", "Cancel", "Apply" };
                final JOptionPane optionPane = new JOptionPane(new Object[] { title, footnote, gui }, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION, null, options, options[2]);
                final JDialog dialog = optionPane.createDialog(MainFrame.getInstance(), "Receiver Conversion Efficiency");
                while (true) {
                    inputField.selectAll();
                    inputField.requestFocusInWindow();
                    dialog.setVisible(true);
                    final Object choice = optionPane.getValue();
                    if (choice == options[1] || choice == null) {
                        break;
                    } else {
                        double val = 0;
                        boolean ok = true;
                        try {
                            val = Double.parseDouble(inputField.getText());
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), inputField.getText() + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                            ok = false;
                        }
                        if (ok) {
                            if (val < 5 || val > 50) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Light-electricity conversion efficiency must be between 5% and 50%.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                boolean changed = Math.abs(val * 0.01 - absorber.getSolarReceiverEfficiency()) > 0.000001;
                                if (rb1.isSelected()) {
                                    if (changed) {
                                        final ChangeSolarReceiverEfficiencyCommand c = new ChangeSolarReceiverEfficiencyCommand(absorber);
                                        absorber.setSolarReceiverEfficiency(val * 0.01);
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 0;
                                } else if (rb2.isSelected()) {
                                    if (!changed) {
                                        for (final FresnelReflector x : Scene.getInstance().getAllFresnelReflectors()) {
                                            if (Math.abs(val * 0.01 - x.getReceiver().getSolarReceiverEfficiency()) > 0.000001) {
                                                changed = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (changed) {
                                        final ChangeSolarReceiverEfficiencyForAllReflectorsCommand c = new ChangeSolarReceiverEfficiencyForAllReflectorsCommand(r.getClass());
                                        Scene.getInstance().setSolarReceiverEfficiencyForAllSolarReflectors(val * 0.01, r.getClass());
                                        SceneManager.getInstance().getUndoManager().addEdit(c);
                                    }
                                    selectedScopeIndex = 1;
                                }
                                if (changed) {
                                    updateAfterEdit();
                                }
                                if (choice == options[0]) {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        });
        popupMenuForFresnelReflector.addSeparator();
        popupMenuForFresnelReflector.add(miSetAbsorber);
        popupMenuForFresnelReflector.addSeparator();
        popupMenuForFresnelReflector.add(cbmiDisableEditPoints);
        popupMenuForFresnelReflector.add(cbmiDrawBeam);
        popupMenuForFresnelReflector.add(labelMenu);
        popupMenuForFresnelReflector.addSeparator();
        popupMenuForFresnelReflector.add(miLength);
        popupMenuForFresnelReflector.add(miModuleWidth);
        popupMenuForFresnelReflector.add(miModuleLength);
        popupMenuForFresnelReflector.add(miBaseHeight);
        popupMenuForFresnelReflector.add(miAzimuth);
        popupMenuForFresnelReflector.addSeparator();
        popupMenuForFresnelReflector.add(miReflectance);
        popupMenuForFresnelReflector.add(miApertureRatio);
        popupMenuForFresnelReflector.add(miConversionEfficiency);
        popupMenuForFresnelReflector.addSeparator();
        popupMenuForFresnelReflector.add(miMesh);
        popupMenuForFresnelReflector.addSeparator();
        JMenuItem mi = new JMenuItem("Daily Yield Analysis...");
        mi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().adjustCellSize()) {
                    return;
                }
                if (SceneManager.getInstance().getSelectedPart() instanceof FresnelReflector) {
                    new FresnelReflectorDailyAnalysis().show();
                }
            }
        });
        popupMenuForFresnelReflector.add(mi);
        mi = new JMenuItem("Annual Yield Analysis...");
        mi.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                if (EnergyPanel.getInstance().adjustCellSize()) {
                    return;
                }
                if (SceneManager.getInstance().getSelectedPart() instanceof FresnelReflector) {
                    new FresnelReflectorAnnualAnalysis().show();
                }
            }
        });
        popupMenuForFresnelReflector.add(mi);
    }
    return popupMenuForFresnelReflector;
}
Also used : JPanel(javax.swing.JPanel) ParabolicTrough(org.concord.energy3d.model.ParabolicTrough) ActionEvent(java.awt.event.ActionEvent) SetPartSizeCommand(org.concord.energy3d.undo.SetPartSizeCommand) FresnelReflectorAnnualAnalysis(org.concord.energy3d.simulation.FresnelReflectorAnnualAnalysis) ChangeSolarReflectorOpticalEfficiencyCommand(org.concord.energy3d.undo.ChangeSolarReflectorOpticalEfficiencyCommand) ChangeBaseHeightForAllSolarCollectorsCommand(org.concord.energy3d.undo.ChangeBaseHeightForAllSolarCollectorsCommand) BorderLayout(java.awt.BorderLayout) ChangeFoundationFresnelReflectorAzimuthCommand(org.concord.energy3d.undo.ChangeFoundationFresnelReflectorAzimuthCommand) FresnelReflectorDailyAnalysis(org.concord.energy3d.simulation.FresnelReflectorDailyAnalysis) Foundation(org.concord.energy3d.model.Foundation) LockEditPointsOnFoundationCommand(org.concord.energy3d.undo.LockEditPointsOnFoundationCommand) List(java.util.List) ChangeReflectanceForAllSolarReflectorsCommand(org.concord.energy3d.undo.ChangeReflectanceForAllSolarReflectorsCommand) HousePart(org.concord.energy3d.model.HousePart) ChangeSolarReceiverEfficiencyForAllReflectorsCommand(org.concord.energy3d.undo.ChangeSolarReceiverEfficiencyForAllReflectorsCommand) JOptionPane(javax.swing.JOptionPane) ChangeAzimuthCommand(org.concord.energy3d.undo.ChangeAzimuthCommand) JCheckBoxMenuItem(javax.swing.JCheckBoxMenuItem) ActionListener(java.awt.event.ActionListener) ChangeFoundationSolarCollectorBaseHeightCommand(org.concord.energy3d.undo.ChangeFoundationSolarCollectorBaseHeightCommand) ChangeAbsorberForAllFresnelReflectorsCommand(org.concord.energy3d.undo.ChangeAbsorberForAllFresnelReflectorsCommand) JDialog(javax.swing.JDialog) ItemEvent(java.awt.event.ItemEvent) JRadioButton(javax.swing.JRadioButton) ChangeSolarReflectorReflectanceCommand(org.concord.energy3d.undo.ChangeSolarReflectorReflectanceCommand) SetSizeForAllFresnelReflectorsCommand(org.concord.energy3d.undo.SetSizeForAllFresnelReflectorsCommand) BoxLayout(javax.swing.BoxLayout) ChangeFoundationFresnelReflectorAbsorberCommand(org.concord.energy3d.undo.ChangeFoundationFresnelReflectorAbsorberCommand) JTextField(javax.swing.JTextField) ChangeFresnelReflectorAbsorberCommand(org.concord.energy3d.undo.ChangeFresnelReflectorAbsorberCommand) GridLayout(java.awt.GridLayout) ChangeAzimuthForAllFresnelReflectorsCommand(org.concord.energy3d.undo.ChangeAzimuthForAllFresnelReflectorsCommand) SetFresnelReflectorLabelCommand(org.concord.energy3d.undo.SetFresnelReflectorLabelCommand) JMenuItem(javax.swing.JMenuItem) FresnelReflector(org.concord.energy3d.model.FresnelReflector) LockEditPointsCommand(org.concord.energy3d.undo.LockEditPointsCommand) JComboBox(javax.swing.JComboBox) JLabel(javax.swing.JLabel) SetSizeForFresnelReflectorsOnFoundationCommand(org.concord.energy3d.undo.SetSizeForFresnelReflectorsOnFoundationCommand) ShowSunBeamCommand(org.concord.energy3d.undo.ShowSunBeamCommand) ChangeBaseHeightCommand(org.concord.energy3d.undo.ChangeBaseHeightCommand) ChangeOpticalEfficiencyForAllSolarReflectorsCommand(org.concord.energy3d.undo.ChangeOpticalEfficiencyForAllSolarReflectorsCommand) ChangeSolarReceiverEfficiencyCommand(org.concord.energy3d.undo.ChangeSolarReceiverEfficiencyCommand) LockEditPointsForClassCommand(org.concord.energy3d.undo.LockEditPointsForClassCommand) ChangeFoundationSolarReflectorReflectanceCommand(org.concord.energy3d.undo.ChangeFoundationSolarReflectorReflectanceCommand) ChangeFoundationSolarReflectorOpticalEfficiencyCommand(org.concord.energy3d.undo.ChangeFoundationSolarReflectorOpticalEfficiencyCommand) ButtonGroup(javax.swing.ButtonGroup) ItemListener(java.awt.event.ItemListener) JMenu(javax.swing.JMenu)

Example 8 with Foundation

use of org.concord.energy3d.model.Foundation in project energy3d by concord-consortium.

the class PopupMenuForLand method getPopupMenu.

static JPopupMenu getPopupMenu() {
    if (popupMenuForLand == null) {
        final JMenuItem miInfo = new JMenuItem("Land");
        miInfo.setEnabled(false);
        miInfo.setOpaque(true);
        miInfo.setBackground(Config.isMac() ? Color.DARK_GRAY : Color.GRAY);
        miInfo.setForeground(Color.WHITE);
        final JMenuItem miPaste = new JMenuItem("Paste");
        miPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Config.isMac() ? KeyEvent.META_MASK : InputEvent.CTRL_MASK));
        miPaste.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                SceneManager.getTaskManager().update(new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        Scene.getInstance().pasteToPickedLocationOnLand();
                        return null;
                    }
                });
            }
        });
        final JMenuItem miRemoveAllTrees = new JMenuItem("Remove All Trees");
        miRemoveAllTrees.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                SceneManager.getTaskManager().update(new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        Scene.getInstance().removeAllTrees();
                        EventQueue.invokeLater(new Runnable() {

                            @Override
                            public void run() {
                                MainPanel.getInstance().getEnergyButton().setSelected(false);
                                Scene.getInstance().setEdited(true);
                            }
                        });
                        return null;
                    }
                });
            }
        });
        final JMenuItem miRemoveAllHumans = new JMenuItem("Remove All Humans");
        miRemoveAllHumans.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                SceneManager.getTaskManager().update(new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        Scene.getInstance().removeAllHumans();
                        EventQueue.invokeLater(new Runnable() {

                            @Override
                            public void run() {
                                MainPanel.getInstance().getEnergyButton().setSelected(false);
                                Scene.getInstance().setEdited(true);
                            }
                        });
                        return null;
                    }
                });
            }
        });
        final JMenuItem miRemoveAllBuildings = new JMenuItem("Remove All Foundations");
        miRemoveAllBuildings.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                SceneManager.getTaskManager().update(new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        Scene.getInstance().removeAllFoundations();
                        EventQueue.invokeLater(new Runnable() {

                            @Override
                            public void run() {
                                MainPanel.getInstance().getEnergyButton().setSelected(false);
                                Scene.getInstance().setEdited(true);
                            }
                        });
                        return null;
                    }
                });
            }
        });
        final JMenuItem miImportEnergy3D = new JMenuItem("Import...");
        miImportEnergy3D.setToolTipText("Import the content in an existing Energy3D file into the clicked location on the land as the center");
        miImportEnergy3D.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                MainFrame.getInstance().importFile();
            }
        });
        final JMenuItem miImportCollada = new JMenuItem("Import Collada...");
        miImportCollada.setToolTipText("Import the content in an existing Collada file into the clicked location on the land as the center");
        miImportCollada.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                MainFrame.getInstance().importColladaFile();
            }
        });
        final JMenu miImportPrefabMenu = new JMenu("Import a Prefab");
        addPrefabMenuItem("Back Hip Roof Porch", "prefabs/back-hip-roof-porch.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Balcony", "prefabs/balcony1.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Bell Tower", "prefabs/bell-tower.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Box", "prefabs/box.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Chimney", "prefabs/chimney.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Connecting Porch", "prefabs/connecting-porch.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Cylinder Tower", "prefabs/cylinder-tower.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Fence", "prefabs/fence1.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Flat-Top Porch", "prefabs/flat-top-porch.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Fountain", "prefabs/fountain.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Front Door Overhang", "prefabs/front-door-overhang.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Gable Dormer", "prefabs/gable-dormer.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Hexagonal Gazebo", "prefabs/hexagonal-gazebo.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Hexagonal Tower", "prefabs/hexagonal-tower.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Lighthouse", "prefabs/lighthouse.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Octagonal Tower", "prefabs/octagonal-tower.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Round Tower", "prefabs/round-tower.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Shed Dormer", "prefabs/shed-dormer.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Solarium", "prefabs/solarium1.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Square Tower", "prefabs/square-tower.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Stair", "prefabs/stair1.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Tall Front Door Overhang", "prefabs/tall-front-door-overhang.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Temple Front", "prefabs/temple-front.ng3", miImportPrefabMenu);
        addPrefabMenuItem("Waterfront Deck", "prefabs/waterfront-deck.ng3", miImportPrefabMenu);
        final JMenuItem miAlbedo = new JMenuItem("Albedo...");
        miAlbedo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final String title = "<html>Background Albedo (dimensionless [0, 1])<hr><font size=2>Examples:<br>0.17 (soil), 0.25 (grass), 0.40 (sand), 0.55 (concrete), snow (0.9)</html>";
                while (true) {
                    final String newValue = JOptionPane.showInputDialog(MainFrame.getInstance(), title, Scene.getInstance().getGround().getAlbedo());
                    if (newValue == null) {
                        break;
                    } else {
                        try {
                            final double val = Double.parseDouble(newValue);
                            if (val < 0 || val > 1) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Albedo value must be in 0-1.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                if (val != Scene.getInstance().getGround().getAlbedo()) {
                                    final ChangeBackgroundAlbedoCommand c = new ChangeBackgroundAlbedoCommand();
                                    Scene.getInstance().getGround().setAlbedo(val);
                                    updateAfterEdit();
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                break;
                            }
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), newValue + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                }
            }
        });
        final JMenuItem miSnowReflection = new JMenuItem("Snow Reflection...");
        miSnowReflection.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final JPanel gui = new JPanel(new BorderLayout());
                final String title = "<html>Increase of indirect solar radiation due to snow reflection<br>(a dimensionless parameter within [0, 0.2])</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.TRAILING);
                    inputPanel.add(l);
                    fields[i] = new JTextField(threeDecimalsFormat.format(Scene.getInstance().getGround().getSnowReflectionFactor(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, "Snow reflection factor", 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] > 0.2) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Snow reflection factor must be in 0-0.2.", "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) {
                        final ChangeSnowReflectionFactorCommand c = new ChangeSnowReflectionFactorCommand();
                        for (int i = 0; i < 12; i++) {
                            Scene.getInstance().getGround().setSnowReflectionFactor(val[i], i);
                        }
                        updateAfterEdit();
                        SceneManager.getInstance().getUndoManager().addEdit(c);
                        break;
                    }
                }
            }
        });
        final JMenuItem miThermalDiffusivity = new JMenuItem("Ground Thermal Diffusivity...");
        miThermalDiffusivity.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final String title = "<html>Ground Thermal Diffusivity (m<sup>2</sup>/s)<hr><font size=2>Examples:<br>0.039 (sand), 0.046 (clay), 0.05 (silt)</html>";
                while (true) {
                    final String newValue = JOptionPane.showInputDialog(MainFrame.getInstance(), title, Scene.getInstance().getGround().getThermalDiffusivity());
                    if (newValue == null) {
                        break;
                    } else {
                        try {
                            final double val = Double.parseDouble(newValue);
                            if (val <= 0) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "Ground thermal diffusivity must be positive.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                if (val != Scene.getInstance().getGround().getThermalDiffusivity()) {
                                    final ChangeGroundThermalDiffusivityCommand c = new ChangeGroundThermalDiffusivityCommand();
                                    Scene.getInstance().getGround().setThermalDiffusivity(val);
                                    updateAfterEdit();
                                    SceneManager.getInstance().getUndoManager().addEdit(c);
                                }
                                break;
                            }
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), newValue + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                }
            }
        });
        final JMenuItem miClearImage = new JMenuItem("Clear Image");
        final JMenuItem miRescaleImage = new JMenuItem("Rescale Image...");
        final JCheckBoxMenuItem miShowImage = new JCheckBoxMenuItem("Show Image");
        final JMenu groundImageMenu = new JMenu("Ground Image");
        groundImageMenu.addMenuListener(new MenuListener() {

            @Override
            public void menuCanceled(final MenuEvent e) {
                miShowImage.setEnabled(true);
                miClearImage.setEnabled(true);
            }

            @Override
            public void menuDeselected(final MenuEvent e) {
                miShowImage.setEnabled(true);
                miClearImage.setEnabled(true);
            }

            @Override
            public void menuSelected(final MenuEvent e) {
                final boolean hasGroundImage = Scene.getInstance().isGroundImageEnabled();
                miShowImage.setEnabled(hasGroundImage);
                miClearImage.setEnabled(hasGroundImage);
                Util.selectSilently(miShowImage, SceneManager.getInstance().getGroundImageLand().isVisible());
            }
        });
        final JMenuItem miUseEarthView = new JMenuItem("Use Image from Earth View...");
        miUseEarthView.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                new MapDialog(MainFrame.getInstance()).setVisible(true);
            }
        });
        groundImageMenu.add(miUseEarthView);
        final JMenuItem miUseImageFile = new JMenuItem("Use Image from File...");
        miUseImageFile.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final File file = FileChooser.getInstance().showDialog(".png", FileChooser.pngFilter, false);
                if (file == null) {
                    return;
                }
                try {
                    Scene.getInstance().setGroundImage(ImageIO.read(file), 1);
                    Scene.getInstance().setGroundImageEarthView(false);
                } catch (final Throwable t) {
                    t.printStackTrace();
                    JOptionPane.showMessageDialog(MainFrame.getInstance(), t.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
                }
                Scene.getInstance().setEdited(true);
            }
        });
        groundImageMenu.add(miUseImageFile);
        groundImageMenu.addSeparator();
        miRescaleImage.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                final String title = "Scale the ground image";
                while (true) {
                    final String newValue = JOptionPane.showInputDialog(MainFrame.getInstance(), title, Scene.getInstance().getGroundImageScale());
                    if (newValue == null) {
                        break;
                    } else {
                        try {
                            final double val = Double.parseDouble(newValue);
                            if (val <= 0) {
                                JOptionPane.showMessageDialog(MainFrame.getInstance(), "The scaling factor must be positive.", "Range Error", JOptionPane.ERROR_MESSAGE);
                            } else {
                                // final ChangeGroundThermalDiffusivityCommand c = new ChangeGroundThermalDiffusivityCommand();
                                Scene.getInstance().setGroundImageScale(val);
                                // SceneManager.getInstance().getUndoManager().addEdit(c);
                                break;
                            }
                        } catch (final NumberFormatException exception) {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), newValue + " is an invalid value!", "Error", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                }
                Scene.getInstance().setEdited(true);
            }
        });
        groundImageMenu.add(miRescaleImage);
        miClearImage.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                Scene.getInstance().setGroundImage(null, 1);
                Scene.getInstance().setEdited(true);
            }
        });
        groundImageMenu.add(miClearImage);
        miShowImage.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(final ItemEvent e) {
                final boolean b = miShowImage.isSelected();
                SceneManager.getInstance().getGroundImageLand().setVisible(b);
                Scene.getInstance().setShowGroundImage(b);
                Scene.getInstance().setEdited(true);
                SceneManager.getInstance().refresh();
            }
        });
        groundImageMenu.add(miShowImage);
        popupMenuForLand = new JPopupMenu();
        popupMenuForLand.setInvoker(MainPanel.getInstance().getCanvasPanel());
        popupMenuForLand.addPopupMenuListener(new PopupMenuListener() {

            @Override
            public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
                final HousePart copyBuffer = Scene.getInstance().getCopyBuffer();
                miPaste.setEnabled(copyBuffer instanceof Tree || copyBuffer instanceof Human || copyBuffer instanceof Foundation);
            }

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

            @Override
            public void popupMenuCanceled(final PopupMenuEvent e) {
            }
        });
        popupMenuForLand.add(miInfo);
        // popupMenuForLand.addSeparator();
        popupMenuForLand.add(miPaste);
        popupMenuForLand.add(miRemoveAllTrees);
        popupMenuForLand.add(miRemoveAllHumans);
        popupMenuForLand.add(miRemoveAllBuildings);
        popupMenuForLand.addSeparator();
        popupMenuForLand.add(miImportEnergy3D);
        popupMenuForLand.add(miImportCollada);
        popupMenuForLand.add(miImportPrefabMenu);
        popupMenuForLand.addSeparator();
        popupMenuForLand.add(groundImageMenu);
        popupMenuForLand.add(colorAction);
        popupMenuForLand.add(miAlbedo);
        popupMenuForLand.add(miSnowReflection);
        popupMenuForLand.add(miThermalDiffusivity);
    }
    return popupMenuForLand;
}
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) Callable(java.util.concurrent.Callable) ChangeSnowReflectionFactorCommand(org.concord.energy3d.undo.ChangeSnowReflectionFactorCommand) BorderLayout(java.awt.BorderLayout) Tree(org.concord.energy3d.model.Tree) Foundation(org.concord.energy3d.model.Foundation) JMenuItem(javax.swing.JMenuItem) HousePart(org.concord.energy3d.model.HousePart) PopupMenuEvent(javax.swing.event.PopupMenuEvent) MenuEvent(javax.swing.event.MenuEvent) Human(org.concord.energy3d.model.Human) ChangeBackgroundAlbedoCommand(org.concord.energy3d.undo.ChangeBackgroundAlbedoCommand) ChangeGroundThermalDiffusivityCommand(org.concord.energy3d.undo.ChangeGroundThermalDiffusivityCommand) JLabel(javax.swing.JLabel) JCheckBoxMenuItem(javax.swing.JCheckBoxMenuItem) JPopupMenu(javax.swing.JPopupMenu) ActionListener(java.awt.event.ActionListener) SpringLayout(javax.swing.SpringLayout) ItemListener(java.awt.event.ItemListener) File(java.io.File) JMenu(javax.swing.JMenu)

Example 9 with Foundation

use of org.concord.energy3d.model.Foundation 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 10 with Foundation

use of org.concord.energy3d.model.Foundation in project energy3d by concord-consortium.

the class DesignReplay method openFolder.

private void openFolder(final File[] files) {
    active = true;
    final int n = files.length;
    if (n > 0) {
        lastFolder = files[0].getParentFile();
    }
    int i = -1;
    while (i < n) {
        if (!active) {
            break;
        }
        if (replaying) {
            i++;
            if (i == n) {
                break;
            }
            final int slash = files[i].toString().lastIndexOf(System.getProperty("file.separator"));
            final String fileName = files[i].toString().substring(slash + 1).trim();
            System.out.println("Play back " + (i + 1) + " of " + n + ": " + fileName);
            try {
                Scene.openNow(files[i].toURI().toURL());
                SceneManager.getTaskManager().update(new Callable<Object>() {

                    @Override
                    public Object call() throws Exception {
                        if (SceneManager.getInstance().getSolarHeatMap()) {
                            EnergyPanel.getInstance().updateRadiationHeatMap();
                        }
                        EventQueue.invokeLater(new Runnable() {

                            @Override
                            public void run() {
                                EnergyPanel.getInstance().update();
                                EnergyPanel.getInstance().clearAllGraphs();
                                final HousePart p = SceneManager.getInstance().getSelectedPart();
                                if (p instanceof Foundation) {
                                    EnergyPanel.getInstance().getBuildingCostGraph().addGraph((Foundation) p);
                                    EnergyPanel.getInstance().validate();
                                }
                                if (MainFrame.getInstance().getTopViewCheckBoxMenuItem().isSelected()) {
                                    // make sure we exist the 2D top view
                                    MainFrame.getInstance().getTopViewCheckBoxMenuItem().setSelected(false);
                                    SceneManager.getInstance().resetCamera(ViewMode.NORMAL);
                                    SceneManager.getInstance().resetCamera();
                                }
                            }
                        });
                        return null;
                    }
                });
                Thread.sleep(SLEEP);
            } catch (final Exception e) {
                e.printStackTrace();
            }
        } else {
            if (backward) {
                if (i > 0) {
                    i--;
                    System.out.println("Play back " + (i + 1) + " of " + n);
                    try {
                        Scene.open(files[i].toURI().toURL());
                    } catch (final Exception e) {
                        e.printStackTrace();
                    }
                }
                backward = false;
            } else if (forward) {
                if (i < n - 1) {
                    i++;
                    System.out.println("Play back " + (i + 1) + " of " + n);
                    try {
                        Scene.open(files[i].toURI().toURL());
                    } catch (final Exception e) {
                        e.printStackTrace();
                    }
                }
                forward = false;
                if (i >= n - 1) {
                    // don't break out from the loop, keep it alive so that the user can go back; for exiting the loop, user should press the space key
                    i = n - 1;
                    EventQueue.invokeLater(new Runnable() {

                        @Override
                        public void run() {
                            JOptionPane.showMessageDialog(MainFrame.getInstance(), "This is the end of the replay. Press the left arrow key to go back or the space key to exit.", "End of Design Replay", JOptionPane.INFORMATION_MESSAGE);
                        }
                    });
                }
            }
        }
    }
    active = false;
}
Also used : Foundation(org.concord.energy3d.model.Foundation) HousePart(org.concord.energy3d.model.HousePart)

Aggregations

Foundation (org.concord.energy3d.model.Foundation)174 HousePart (org.concord.energy3d.model.HousePart)153 Rack (org.concord.energy3d.model.Rack)47 SolarPanel (org.concord.energy3d.model.SolarPanel)45 Window (org.concord.energy3d.model.Window)39 ActionEvent (java.awt.event.ActionEvent)38 ActionListener (java.awt.event.ActionListener)38 Roof (org.concord.energy3d.model.Roof)38 Wall (org.concord.energy3d.model.Wall)37 ArrayList (java.util.ArrayList)35 JDialog (javax.swing.JDialog)35 JMenuItem (javax.swing.JMenuItem)33 Mirror (org.concord.energy3d.model.Mirror)32 FresnelReflector (org.concord.energy3d.model.FresnelReflector)27 Door (org.concord.energy3d.model.Door)24 ParabolicTrough (org.concord.energy3d.model.ParabolicTrough)24 Tree (org.concord.energy3d.model.Tree)24 Vector3 (com.ardor3d.math.Vector3)22 ReadOnlyVector3 (com.ardor3d.math.type.ReadOnlyVector3)22 ParabolicDish (org.concord.energy3d.model.ParabolicDish)22