diff --git a/plugins/Scan2D.form b/plugins/Scan2D.form
new file mode 100644
index 0000000..a68edfd
--- /dev/null
+++ b/plugins/Scan2D.form
@@ -0,0 +1,476 @@
+
+
+
diff --git a/plugins/Scan2D.java b/plugins/Scan2D.java
new file mode 100644
index 0000000..56037c2
--- /dev/null
+++ b/plugins/Scan2D.java
@@ -0,0 +1,549 @@
+/*
+ * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved.
+ */
+
+import ch.psi.pshell.device.Motor;
+import ch.psi.pshell.epics.AreaDetector;
+import ch.psi.pshell.ui.ScriptProcessor;
+import ch.psi.utils.State;
+import ch.psi.utils.swing.SwingUtils;
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.swing.JCheckBox;
+import javax.swing.JSpinner;
+import javax.swing.JToggleButton;
+import javax.swing.SpinnerNumberModel;
+
+/**
+ *
+ */
+public class Scan2D extends ScriptProcessor {
+
+ final List motors = new ArrayList();
+
+ public Scan2D() {
+ initComponents();
+
+ //Component persistence
+ ArrayList persistedComponents = new ArrayList<>();
+ persistedComponents.addAll(Arrays.asList(SwingUtils.getComponentsByType(this, JToggleButton.class)));
+ persistedComponents.addAll(Arrays.asList(SwingUtils.getComponentsByType(this, JSpinner.class)));
+ setPersistedComponents(persistedComponents.toArray(new Component[0]));
+ startTimer(1000);
+ }
+
+ //Overridable callbacks
+ @Override
+ public void onInitialize(int runCount) {
+ AreaDetector ccd = (AreaDetector) getDevice("ccd");
+ ckDummyActionPerformed(null);
+
+ }
+
+ @Override
+ protected void onTimer(){
+ }
+
+ @Override
+ public void onStateChange(State state, State former) {
+ setEnabled(isEnabled());
+ }
+
+ @Override
+ public void onExecutedFile(String fileName, Object result) {
+ }
+
+
+ @Override
+ public void setEnabled(boolean value) {
+ super.setEnabled(value);
+
+ boolean enableControls = (value && (getState()==State.Ready));
+ for (Component c : panelSensors.getComponents()) {
+ c.setEnabled(enableControls);
+ }
+ for (Component c : panelPositioners.getComponents()) {
+ c.setEnabled(enableControls);
+ }
+
+ buttonStart.setEnabled(enableControls);
+ buttonAbort.setEnabled(value && getState().isInitialized());
+
+ spinnerStepSizeX.setEnabled(enableControls && radioStepSize.isSelected());
+ spinnerStepsX.setEnabled(enableControls && radioSteps.isSelected());
+ spinnerFromX.setEnabled(enableControls);
+ spinnerToX.setEnabled(enableControls);
+
+ spinnerStepSizeY.setEnabled(spinnerStepSizeX.isEnabled());
+ spinnerStepsY.setEnabled(spinnerStepsX.isEnabled());
+ spinnerFromY.setEnabled(spinnerFromX.isEnabled());
+ spinnerToY.setEnabled(spinnerToX.isEnabled());
+ }
+
+ @Override
+ public String getScript() {
+ return "templates/Scan2D";
+ }
+
+ @Override
+ public Map getArgs() {
+ HashMap args = new HashMap<>();
+ ArrayList sensors = new ArrayList();
+ for (Component c : panelSensors.getComponents()) {
+ if ((c instanceof JCheckBox) && ((JCheckBox) c).isSelected()) {
+ sensors.add(c.getName());
+ }
+ }
+ args.put("MOTORS", motors);
+ args.put("SENSORS", sensors);
+ args.put("RANGE_X", new Double[]{(Double) spinnerFromX.getValue(), (Double) spinnerToX.getValue()});
+ args.put("RANGE_Y", new Double[]{(Double) spinnerFromY.getValue(), (Double) spinnerToY.getValue()});
+ ArrayList steps = new ArrayList();
+ if (radioStepSize.isSelected()) {
+ steps.add((Double) spinnerStepSizeX.getValue());
+ steps.add((Double) spinnerStepSizeY.getValue());
+ } else {
+ steps.add((Integer) spinnerStepsX.getValue());
+ steps.add((Integer) spinnerStepsY.getValue());
+ }
+ args.put("STEPS", steps);
+ args.put("LATENCY", (Double) 0.0);
+ args.put("RELATIVE", false);
+ args.put("ZIGZAG", checkZigzag.isSelected());
+ return args;
+ }
+
+
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ buttonGroup1 = new javax.swing.ButtonGroup();
+ buttonGroup2 = new javax.swing.ButtonGroup();
+ panelPositioners = new javax.swing.JPanel();
+ motorPanelX = new ch.psi.pshell.swing.MotorReadoutPanel();
+ radioStepSize = new javax.swing.JRadioButton();
+ radioSteps = new javax.swing.JRadioButton();
+ spinnerStepSizeX = new javax.swing.JSpinner();
+ spinnerStepsX = new javax.swing.JSpinner();
+ spinnerFromX = new javax.swing.JSpinner();
+ jLabel4 = new javax.swing.JLabel();
+ jLabel5 = new javax.swing.JLabel();
+ spinnerToX = new javax.swing.JSpinner();
+ jLabel6 = new javax.swing.JLabel();
+ jLabel7 = new javax.swing.JLabel();
+ motorPanelY = new ch.psi.pshell.swing.MotorReadoutPanel();
+ jLabel8 = new javax.swing.JLabel();
+ jLabel9 = new javax.swing.JLabel();
+ spinnerFromY = new javax.swing.JSpinner();
+ spinnerToY = new javax.swing.JSpinner();
+ jLabel11 = new javax.swing.JLabel();
+ jLabel12 = new javax.swing.JLabel();
+ spinnerStepSizeY = new javax.swing.JSpinner();
+ jLabel13 = new javax.swing.JLabel();
+ jLabel14 = new javax.swing.JLabel();
+ spinnerStepsY = new javax.swing.JSpinner();
+ checkZigzag = new javax.swing.JCheckBox();
+ ckDummy = new javax.swing.JCheckBox();
+ panelSensors = new javax.swing.JPanel();
+ checkImage = new javax.swing.JCheckBox();
+ checkCurrent = new javax.swing.JCheckBox();
+ panelScan = new javax.swing.JPanel();
+ buttonStart = new javax.swing.JButton();
+ buttonAbort = new javax.swing.JButton();
+ buttonQueue = new javax.swing.JButton();
+
+ panelPositioners.setBorder(javax.swing.BorderFactory.createTitledBorder("Positioners"));
+ panelPositioners.setPreferredSize(new java.awt.Dimension(248, 543));
+
+ buttonGroup1.add(radioStepSize);
+ radioStepSize.setSelected(true);
+ radioStepSize.setText("Step Size");
+ radioStepSize.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ radioStepSizeActionPerformed(evt);
+ }
+ });
+
+ buttonGroup1.add(radioSteps);
+ radioSteps.setText("Number of Steps");
+ radioSteps.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ radioStepSizeActionPerformed(evt);
+ }
+ });
+
+ spinnerStepSizeX.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.1d, 180.0d, 0.1d));
+
+ spinnerStepsX.setModel(new javax.swing.SpinnerNumberModel(10, 1, 1000, 1));
+ spinnerStepsX.setEnabled(false);
+
+ spinnerFromX.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.0d, 1.0d, 1.0d));
+
+ jLabel4.setText("X From:");
+
+ jLabel5.setText("X To:");
+
+ spinnerToX.setModel(new javax.swing.SpinnerNumberModel(10.0d, 0.0d, 10.0d, 1.0d));
+
+ jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel6.setText("Sample X:");
+
+ jLabel7.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ jLabel7.setText("Sample Y:");
+
+ jLabel8.setText("Y To:");
+
+ jLabel9.setText("Y From:");
+
+ spinnerFromY.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.0d, 1.0d, 1.0d));
+
+ spinnerToY.setModel(new javax.swing.SpinnerNumberModel(10.0d, 0.0d, 10.0d, 1.0d));
+
+ jLabel11.setText("X:");
+
+ jLabel12.setText("Y:");
+
+ spinnerStepSizeY.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.1d, 90.0d, 0.1d));
+
+ jLabel13.setText("X:");
+
+ jLabel14.setText("Y:");
+
+ spinnerStepsY.setModel(new javax.swing.SpinnerNumberModel(10, 1, 1000, 1));
+ spinnerStepsY.setEnabled(false);
+
+ checkZigzag.setText("Zigzag");
+
+ ckDummy.setText("Dummy");
+ ckDummy.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ ckDummyActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout panelPositionersLayout = new javax.swing.GroupLayout(panelPositioners);
+ panelPositioners.setLayout(panelPositionersLayout);
+ panelPositionersLayout.setHorizontalGroup(
+ panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelPositionersLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelPositionersLayout.createSequentialGroup()
+ .addComponent(jLabel6)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(motorPanelX, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionersLayout.createSequentialGroup()
+ .addGap(0, 58, Short.MAX_VALUE)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionersLayout.createSequentialGroup()
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jLabel5, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jLabel8, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jLabel9, javax.swing.GroupLayout.Alignment.TRAILING))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+ .addComponent(spinnerFromX, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 91, Short.MAX_VALUE)
+ .addComponent(spinnerToX, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(spinnerFromY, javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(spinnerToY, javax.swing.GroupLayout.Alignment.TRAILING)))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionersLayout.createSequentialGroup()
+ .addComponent(jLabel11)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerStepSizeX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionersLayout.createSequentialGroup()
+ .addComponent(jLabel12)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(spinnerStepSizeY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionersLayout.createSequentialGroup()
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(jLabel14)
+ .addComponent(jLabel13))
+ .addGap(6, 6, 6)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(spinnerStepsX, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(spinnerStepsY, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))))
+ .addGroup(panelPositionersLayout.createSequentialGroup()
+ .addComponent(jLabel7)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(motorPanelY, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGroup(panelPositionersLayout.createSequentialGroup()
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(ckDummy)
+ .addComponent(radioSteps)
+ .addComponent(radioStepSize)
+ .addComponent(checkZigzag))
+ .addGap(0, 71, Short.MAX_VALUE)))
+ .addContainerGap())
+ );
+
+ panelPositionersLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {radioStepSize, radioSteps});
+
+ panelPositionersLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerStepSizeX, spinnerStepSizeY, spinnerStepsX});
+
+ panelPositionersLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel6, jLabel7});
+
+ panelPositionersLayout.setVerticalGroup(
+ panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelPositionersLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
+ .addComponent(jLabel6)
+ .addComponent(motorPanelX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
+ .addComponent(jLabel7)
+ .addComponent(motorPanelY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerFromX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel4))
+ .addGap(3, 3, 3)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerToX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel5))
+ .addGap(3, 3, 3)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerFromY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel9))
+ .addGap(3, 3, 3)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerToY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel8))
+ .addGap(18, 18, 18)
+ .addComponent(radioStepSize)
+ .addGap(3, 3, 3)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerStepSizeX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel11))
+ .addGap(3, 3, 3)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerStepSizeY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel12))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(radioSteps)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerStepsX, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel13))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(panelPositionersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(spinnerStepsY, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(jLabel14))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(checkZigzag)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(ckDummy)
+ .addContainerGap(146, Short.MAX_VALUE))
+ );
+
+ panelSensors.setBorder(javax.swing.BorderFactory.createTitledBorder("Sensors"));
+ panelSensors.setPreferredSize(new java.awt.Dimension(248, 543));
+
+ checkImage.setSelected(true);
+ checkImage.setText("CCD Image");
+ checkImage.setToolTipText("");
+ checkImage.setContentAreaFilled(false);
+ checkImage.setName("ccd.dataMatrix"); // NOI18N
+
+ checkCurrent.setText("Current");
+ checkCurrent.setName("current"); // NOI18N
+
+ javax.swing.GroupLayout panelSensorsLayout = new javax.swing.GroupLayout(panelSensors);
+ panelSensors.setLayout(panelSensorsLayout);
+ panelSensorsLayout.setHorizontalGroup(
+ panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelSensorsLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(checkImage)
+ .addComponent(checkCurrent))
+ .addContainerGap(130, Short.MAX_VALUE))
+ );
+ panelSensorsLayout.setVerticalGroup(
+ panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelSensorsLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(checkImage)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(checkCurrent)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+
+ panelScan.setBorder(javax.swing.BorderFactory.createTitledBorder("Scan Control"));
+ panelScan.setPreferredSize(new java.awt.Dimension(248, 543));
+
+ buttonStart.setText("Start");
+ buttonStart.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ buttonStartActionPerformed(evt);
+ }
+ });
+
+ buttonAbort.setText("Abort");
+ buttonAbort.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ buttonAbortActionPerformed(evt);
+ }
+ });
+
+ buttonQueue.setText("Queue");
+ buttonQueue.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ buttonQueueActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout panelScanLayout = new javax.swing.GroupLayout(panelScan);
+ panelScan.setLayout(panelScanLayout);
+ panelScanLayout.setHorizontalGroup(
+ panelScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(panelScanLayout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(panelScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(buttonStart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(buttonAbort, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(buttonQueue, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 214, Short.MAX_VALUE))
+ .addContainerGap())
+ );
+ panelScanLayout.setVerticalGroup(
+ panelScanLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelScanLayout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(buttonStart)
+ .addGap(18, 18, 18)
+ .addComponent(buttonAbort)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(buttonQueue)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(panelSensors, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(panelPositioners, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(panelScan, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ );
+
+ layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {panelPositioners, panelScan, panelSensors});
+
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(panelPositioners, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(panelSensors, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(panelScan, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addContainerGap())
+ );
+ }// //GEN-END:initComponents
+
+ private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartActionPerformed
+ try{
+ execute();
+ } catch (Exception ex){
+ SwingUtils.showException(this, ex);
+ }
+ }//GEN-LAST:event_buttonStartActionPerformed
+
+ private void buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed
+ try {
+ abort();
+ ((AreaDetector) getDevice("ccd")).stop();
+ } catch (Exception ex) {
+ showException(ex);
+ }
+ }//GEN-LAST:event_buttonAbortActionPerformed
+
+ private void radioStepSizeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioStepSizeActionPerformed
+ setEnabled(isEnabled());
+ }//GEN-LAST:event_radioStepSizeActionPerformed
+
+ private void buttonQueueActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonQueueActionPerformed
+ try {
+ queue();
+ } catch (Exception ex) {
+ SwingUtils.showException(this, ex);
+ }
+ }//GEN-LAST:event_buttonQueueActionPerformed
+
+ private void ckDummyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ckDummyActionPerformed
+ motors.clear();
+ if (ckDummy.isSelected()){
+ motors.add((Motor) getDevice("dummy_x"));
+ motors.add((Motor) getDevice("dummy_y"));
+ } else {
+ motors.add((Motor) getDevice("sample_x"));
+ motors.add((Motor) getDevice("sample_y"));
+ }
+ Motor x=motors.get(0);
+ Motor y=motors.get(0);
+ motorPanelX.setDevice(x);
+ motorPanelY.setDevice(y);
+ try{
+ spinnerFromX.setModel(new SpinnerNumberModel(Math.max(x.getMinValue(),(Double)spinnerFromX.getValue()), x.getMinValue(), x.getMaxValue(), 1.0));
+ spinnerToX.setModel(new SpinnerNumberModel(Math.min(x.getMaxValue(),(Double)spinnerToX.getValue()), x.getMinValue(), x.getMaxValue(), 1.0));
+ } catch (Exception ex){
+ spinnerFromX.setModel(new SpinnerNumberModel(x.getMinValue(), x.getMinValue(), x.getMaxValue(), 1.0));
+ spinnerToX.setModel(new SpinnerNumberModel(x.getMaxValue(), x.getMinValue(), x.getMaxValue(), 1.0));
+ }
+ try{
+ spinnerFromY.setModel(new SpinnerNumberModel(Math.max(y.getMinValue(),(Double)spinnerFromY.getValue()), y.getMinValue(), y.getMaxValue(), 1.0));
+ spinnerToY.setModel(new SpinnerNumberModel(Math.min(y.getMaxValue(),(Double)spinnerToY.getValue()), y.getMinValue(), y.getMaxValue(), 1.0));
+ } catch (Exception ex){
+ spinnerFromY.setModel(new SpinnerNumberModel(y.getMinValue(), y.getMinValue(), y.getMaxValue(), 1.0));
+ spinnerToY.setModel(new SpinnerNumberModel(y.getMaxValue(), y.getMinValue(), y.getMaxValue(), 1.0));
+ }
+ }//GEN-LAST:event_ckDummyActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton buttonAbort;
+ private javax.swing.ButtonGroup buttonGroup1;
+ private javax.swing.ButtonGroup buttonGroup2;
+ private javax.swing.JButton buttonQueue;
+ private javax.swing.JButton buttonStart;
+ private javax.swing.JCheckBox checkCurrent;
+ private javax.swing.JCheckBox checkImage;
+ private javax.swing.JCheckBox checkZigzag;
+ private javax.swing.JCheckBox ckDummy;
+ private javax.swing.JLabel jLabel11;
+ private javax.swing.JLabel jLabel12;
+ private javax.swing.JLabel jLabel13;
+ private javax.swing.JLabel jLabel14;
+ private javax.swing.JLabel jLabel4;
+ private javax.swing.JLabel jLabel5;
+ private javax.swing.JLabel jLabel6;
+ private javax.swing.JLabel jLabel7;
+ private javax.swing.JLabel jLabel8;
+ private javax.swing.JLabel jLabel9;
+ private ch.psi.pshell.swing.MotorReadoutPanel motorPanelX;
+ private ch.psi.pshell.swing.MotorReadoutPanel motorPanelY;
+ private javax.swing.JPanel panelPositioners;
+ private javax.swing.JPanel panelScan;
+ private javax.swing.JPanel panelSensors;
+ private javax.swing.JRadioButton radioStepSize;
+ private javax.swing.JRadioButton radioSteps;
+ private javax.swing.JSpinner spinnerFromX;
+ private javax.swing.JSpinner spinnerFromY;
+ private javax.swing.JSpinner spinnerStepSizeX;
+ private javax.swing.JSpinner spinnerStepSizeY;
+ private javax.swing.JSpinner spinnerStepsX;
+ private javax.swing.JSpinner spinnerStepsY;
+ private javax.swing.JSpinner spinnerToX;
+ private javax.swing.JSpinner spinnerToY;
+ // End of variables declaration//GEN-END:variables
+}
+