Skip to content

Commit

Permalink
Merge pull request #1911 from lorenzgerber/visual_box_select
Browse files Browse the repository at this point in the history
PCA, show visual selection box, loading plot
  • Loading branch information
eselmeister authored Oct 18, 2024
2 parents f723ac2 + 3e84bfc commit b942c2d
Showing 1 changed file with 88 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.eclipse.chemclipse.numeric.core.Point;
import org.eclipse.chemclipse.support.events.IChemClipseEvents;
import org.eclipse.chemclipse.swt.ui.notifier.UpdateNotifierUI;
import org.eclipse.chemclipse.swt.ui.support.Colors;
import org.eclipse.chemclipse.ux.extension.xxd.ui.swt.IExtendedPartUI;
import org.eclipse.chemclipse.ux.extension.xxd.ui.swt.ISettingsHandler;
import org.eclipse.chemclipse.xxd.process.supplier.pca.model.EvaluationPCA;
Expand All @@ -33,26 +34,30 @@
import org.eclipse.chemclipse.xxd.process.supplier.pca.ui.preferences.PreferencePage;
import org.eclipse.chemclipse.xxd.process.supplier.pca.ui.preferences.PreferencePageLoadingPlot;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swtchart.ICustomPaintListener;
import org.eclipse.swtchart.Range;
import org.eclipse.swtchart.extensions.core.BaseChart;
import org.eclipse.swtchart.extensions.core.IChartSettings;
import org.eclipse.swtchart.extensions.core.IMouseSupport;
import org.eclipse.swtchart.extensions.core.UserSelection;
import org.eclipse.swtchart.extensions.events.IHandledEventProcessor;

public class ExtendedLoadingsPlot extends Composite implements IExtendedPartUI {

private AtomicReference<LoadingsPlot> plotControl = new AtomicReference<>();
private AtomicReference<PrincipalComponentUI> principalComponentControl = new AtomicReference<>();
private double pointX;
private double pointY;
//
private EvaluationPCA evaluationPCA = null;
//
private UserSelection userSelection = new UserSelection();

public ExtendedLoadingsPlot(Composite parent, int style) {

Expand Down Expand Up @@ -122,21 +127,38 @@ public int getStateMask() {
public void handleEvent(BaseChart baseChart, Event event) {

if(evaluationPCA != null) {
/*
* Determine the x|y coordinates.
*/
Rectangle rectangle = baseChart.getPlotArea().getBounds();
int x = event.x;
int y = event.y;
int width = rectangle.width;
int height = rectangle.height;
/*
* Calculate the selected point.
*/
Range rangeX = baseChart.getAxisSet().getXAxis(BaseChart.ID_PRIMARY_X_AXIS).getRange();
Range rangeY = baseChart.getAxisSet().getYAxis(BaseChart.ID_PRIMARY_Y_AXIS).getRange();
pointX = rangeX.lower + (rangeX.upper - rangeX.lower) * ((1.0d / width) * x);
pointY = rangeY.lower + (rangeY.upper - rangeY.lower) * ((1.0d / height) * (height - y));
if(event.count == 1) {
userSelection.setSingleClick(true);
userSelection.setStartCoordinate(event.x, event.y);
}
}
}
});
chartSettings.addHandledEventProcessor(new IHandledEventProcessor() {

@Override
public int getEvent() {

return IMouseSupport.EVENT_MOUSE_MOVE;
}

@Override
public int getButton() {

return IMouseSupport.MOUSE_BUTTON_NONE;
}

@Override
public int getStateMask() {

return SWT.MOD1;
}

@Override
public void handleEvent(BaseChart baseChart, Event event) {

if(userSelection.getStartX() > 0 && userSelection.getStartY() > 0) {
userSelection.setStopCoordinate(event.x, event.y);
}
}
});
Expand Down Expand Up @@ -165,61 +187,85 @@ public void handleEvent(BaseChart baseChart, Event event) {

if(evaluationPCA != null) {
/*
* Determine the x|y coordinates.
* Prepare Data viewport
*/
Rectangle rectangle = baseChart.getPlotArea().getBounds();
int x = event.x;
int y = event.y;
int width = rectangle.width;
int height = rectangle.height;
/*
* Calculate the selected point.
*/
Range rangeX = baseChart.getAxisSet().getXAxis(BaseChart.ID_PRIMARY_X_AXIS).getRange();
Range rangeY = baseChart.getAxisSet().getYAxis(BaseChart.ID_PRIMARY_Y_AXIS).getRange();
double pX = rangeX.lower + (rangeX.upper - rangeX.lower) * ((1.0d / width) * x);
double pY = rangeY.lower + (rangeY.upper - rangeY.lower) * ((1.0d / height) * (height - y));
/*
* Determine x|y coordinates Start/Stop.
*/
int startX = userSelection.getStartX();
int startY = userSelection.getStartY();
int stopX = userSelection.getStopX();
int stopY = userSelection.getStopY();
/*
* Calculate selected points.
*/
double pXStart = rangeX.lower + (rangeX.upper - rangeX.lower) * ((1.0d / width) * startX);
double pYStart = rangeY.lower + (rangeY.upper - rangeY.lower) * ((1.0d / height) * (height - startY));
double pXStop = rangeX.lower + (rangeX.upper - rangeX.lower) * ((1.0d / width) * stopX);
double pYStop = rangeY.lower + (rangeY.upper - rangeY.lower) * ((1.0d / height) * (height - stopY));
/*
* Map the result deltas.
*/
PrincipalComponentUI principalComponentUI = principalComponentControl.get();
int pcX = principalComponentUI.getPCX();
int pcY = principalComponentUI.getPCY();
IResultsPCA<? extends IResultPCA, ? extends IVariable> resultsPCA = evaluationPCA.getResults();
// List<FeatureDelta> featureDeltas = new ArrayList<>();
List<Feature> featureSelected = new ArrayList<>();
//
// Here need to prepare a result object with loading vectors per variable
//
/*
* Prepare a result object with loading vectors per variable
*/
for(int i = 0; i < resultsPCA.getExtractedVariables().size(); i++) {
double[] variableLoading = getVariableLoading(resultsPCA, i);
IPoint pointResult = getPoint(variableLoading, pcX, pcY, i);
if(pointResult.getX() > pointX && pointResult.getX() < pX && pointResult.getY() < pointY && pointResult.getY() > pY) {
if(pointResult.getX() > pXStart && pointResult.getX() < pXStop && pointResult.getY() < pYStart && pointResult.getY() > pYStop) {
featureSelected.add(evaluationPCA.getFeatureDataMatrix().getFeatures().get(i));
}
// double deltaX = Math.abs(pointResult.getX() - pX);
// double deltaY = Math.abs(pointResult.getY() - pY);
// featureDeltas.add(new FeatureDelta(evaluationPCA.getFeatureDataMatrix().getFeatures().get(i), deltaX, deltaY));
}
/*
* Get the closest result.
*/
if(!featureSelected.isEmpty()) {
UpdateNotifierUI.update(event.display, IChemClipseEvents.TOPIC_PCA_UPDATE_RESULT, featureSelected.toArray());
// featureSelected.toArray();
// for(Feature feature : featureSelected) {
//
// UpdateNotifierUI.update(event.display, IChemClipseEvents.TOPIC_PCA_UPDATE_RESULT, feature);
// }
// Collections.sort(featureDeltas, Comparator.comparing(FeatureDelta::getDeltaX).thenComparing(FeatureDelta::getDeltaY));
// FeatureDelta featureDelta = featureDeltas.get(0);
// Feature feature = featureDelta.getFeature();
// UpdateNotifierUI.update(event.display, IChemClipseEvents.TOPIC_PCA_UPDATE_RESULT, feature);
}
/*
* Finish User Selection Process
*/
userSelection.reset();
userSelection.setSingleClick(false);
}
}
});
plot.applySettings(chartSettings);
/*
* Paint Listener
*/
plot.getBaseChart().getPlotArea().addCustomPaintListener(new ICustomPaintListener() {

@Override
public void paintControl(PaintEvent e) {

if(userSelection.isActive()) {
int x = Math.min(userSelection.getStartX(), userSelection.getStopX());
int y = Math.min(userSelection.getStartY(), userSelection.getStopY());
int width = Math.abs(userSelection.getStopX() - userSelection.getStartX());
int height = Math.abs(userSelection.getStopY() - userSelection.getStartY());
//
GC gc = e.gc;
gc.setBackground(Colors.RED);
gc.setForeground(Colors.DARK_RED);
gc.setAlpha(45);
gc.fillRectangle(x, y, width, height);
gc.setLineStyle(SWT.LINE_DASH);
gc.setLineWidth(2);
gc.drawRectangle(x, y, width, height);
}
}
});
//
plotControl.set(plot);
}
Expand Down

0 comments on commit b942c2d

Please sign in to comment.