/** * Register and perform the command * * @param operations_manager OperationsManager where command will be reg'ed * @param item Model item to configure * @param new_index New value */ public ChangeWaveformIndexCommand( final OperationsManager operations_manager, final ModelItem item, final int new_index) { this.item = item; this.old_index = item.getWaveformIndex(); this.new_index = new_index; operations_manager.addCommand(this); redo(); }
/** * Update combo box of this view. * * @param model_changed set true if the model was changed. */ private void update(final boolean model_changed) { if (model == null) { // Clear/disable GUI items.setItems(new String[] {Messages.SampleView_NoPlot}); items.select(0); items.setEnabled(false); sample_table.setInput(null); return; } // Show PV names. // Also build array for following index-based check of selected item final List<ModelItem> model_items = new ArrayList<>(); final List<String> names_list = new ArrayList<>(); names_list.add(Messages.SampleView_SelectItem); for (ModelItem item : model.getItems()) { model_items.add(item); names_list.add(item.getName()); } final String[] names = names_list.toArray(new String[names_list.size()]); if (!model_changed && items.getSelectionIndex() > 0) { // Is the previously selected item still valid? if (sample_table.getInput() instanceof ModelItem) { final ModelItem selected_item = (ModelItem) sample_table.getInput(); if (model_items.indexOf(selected_item) != -1) { // Show same PV name again in combo box items.setItems(names); items.select(model_items.indexOf(selected_item) + 1); items.setEnabled(true); // Update sample table size. Not locking for size() sample_table.setItemCount(selected_item.getSamples().size()); sample_table.refresh(); return; } } } // Previously selected item no longer valid. // Show new items, clear rest items.setItems(names); items.select(0); items.setEnabled(true); sample_table.setInput(null); }
/** * Run the 'add PV' dialog with optional defaults * * @param name Suggested PV name, for example from drag-n-drop * @param archive Archive data source for the new PV * @return <code>true</code> if PV name was added, <code>false</code> if canceled by user */ public boolean runWithSuggestedName(final String name, final ArchiveDataSource archive) { // Prompt for PV name final Set<String> existing_names = new HashSet<>(); for (ModelItem item : model.getItems()) existing_names.add(item.getName()); final List<AxisConfig> axes = new ArrayList<>(); final List<String> axes_names = new ArrayList<>(); for (AxisConfig axis : model.getAxes()) { axes.add(axis); axes_names.add(axis.getName()); } final AddPVDialog dlg = new AddPVDialog(shell, existing_names, axes_names, formula); dlg.setName(name); if (dlg.open() != Window.OK) return false; // Did user select axis? final AxisConfig axis; if (dlg.getAxisIndex() >= 0) axis = axes.get(dlg.getAxisIndex()); else // Use first empty axis, or create a new one axis = model .getEmptyAxis() .orElseGet(() -> new AddAxisCommand(operations_manager, model).getAxis()); // Create item if (formula) { final Optional<AddModelItemCommand> command = AddModelItemCommand.forFormula(shell, operations_manager, model, dlg.getName(), axis); if (!command.isPresent()) return false; // Open configuration dialog final FormulaItem formula = (FormulaItem) command.get().getItem(); final EditFormulaDialog edit = new EditFormulaDialog(operations_manager, shell, formula); edit.open(); } else AddModelItemCommand.forPV( shell, operations_manager, model, dlg.getName(), dlg.getScanPeriod(), axis, archive); return true; }
/** * Initialize * * @param item Item from which to get samples /** @param start Start time /** @param end End time */ public ModelSampleIterator(final ModelItem item, final Instant start, final Instant end) { this.samples = item.getSamples(); this.end = end; samples.getLock().lock(); try { // Anything? if (samples.size() <= 0) index = -1; // All data after start time? else if (samples.get(0).getPosition().compareTo(start) >= 0) index = 0; else { // There is data before the start time. Find sample just before start time. index = findSampleLessOrEqual(start); } // Is first sample already after end time? if (index >= 0) { final PlotSample sample = samples.get(index); value = sample.getVType(); if (sample.getPosition().compareTo(end) > 0) index = -1; } } finally { samples.getLock().unlock(); } }
/** {@inheritDoc} */ @Override protected void performExport(final IProgressMonitor monitor, final PrintStream out) throws Exception { final DateFormat date_format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); int count = 0; for (ModelItem item : model.getItems()) { // Item header if (count > 0) out.println(); printItemInfo(out, item); // Get data monitor.subTask(NLS.bind("Fetching data for {0}", item.getName())); final ValueIterator values = createValueIterator(item); // Dump all values MatlabQualityHelper qualities = new MatlabQualityHelper(); long line_count = 0; out.println("clear t;"); out.println("clear v;"); out.println("clear q;"); while (values.hasNext() && !monitor.isCanceled()) { final VType value = values.next(); ++line_count; // t(1)='2010/03/15 13:30:10.123'; out.println( "t{" + line_count + "}='" + date_format.format(VTypeHelper.getTimestamp(value).toDate()) + "';"); // v(1)=4.125; final double num = VTypeHelper.toDouble(value); if (Double.isNaN(num) || Double.isInfinite(num)) out.println("v(" + line_count + ")=NaN;"); else out.println("v(" + line_count + ")=" + num + ";"); // q(1)=0; out.println( "q(" + line_count + ")=" + qualities.getQualityCode( VTypeHelper.getSeverity(value), VTypeHelper.getMessage(value)) + ";"); if (line_count % PROGRESS_UPDATE_LINES == 0) monitor.subTask(NLS.bind("{0}: Wrote {1} samples", item.getName(), line_count)); } out.println(comment + "Convert time stamps into 'date numbers'"); out.println("tn=datenum(t, 'yyyy/mm/dd HH:MM:SS.FFF');"); out.println(comment + "Prepare patched data because"); out.println(comment + "timeseries() cannot handle duplicate time stamps"); out.println("[xx, idx]=unique(tn, 'last');"); out.println("pt=tn(idx);"); out.println("pv=v(idx);"); out.println("pq=q(idx);"); out.println("clear xx idx"); out.println(comment + "Convert into time series and plot"); // Patch "_" in name because Matlab plot will interprete it as LaTeX sub-script final String channel_name = item.getDisplayName().replace("_", "\\_"); out.println( "channel" + count + "=timeseries(pv', pt', pq', 'IsDatenum', true, 'Name', '" + channel_name + "');"); out.print("channel" + count + ".QualityInfo.Code=["); for (int q = 0; q < qualities.getNumCodes(); ++q) out.print(" " + q); out.println(" ];"); out.print("channel" + count + ".QualityInfo.Description={"); for (int q = 0; q < qualities.getNumCodes(); ++q) out.print(" '" + qualities.getQuality(q) + "'"); out.println(" };"); out.println(); ++count; } out.println(comment + "Example for plotting the data"); for (int i = 0; i < count; ++i) { out.println("subplot(1, " + count + ", " + (i + 1) + ");"); out.println("plot(channel" + i + ");"); } }
/** {@inheritDoc} */ @Override public void undo() { item.setWaveformIndex(old_index); }
/** {@inheritDoc} */ @Override public void redo() { item.setWaveformIndex(new_index); }