Dear users, Please note that, from Monday, August 16, 2019, RSA keys shorter than 2048bit will no longer be accepted for security reasons. Please update your keys as needed before this date. If you need assistance with regard to this process, please contact sia@list.lu

Thank you for your understanding.

Commit d3a27161 authored by Nico Mack's avatar Nico Mack

Added ShapeGraph Corona. Fixed Issue with Vector results in

PythonExecutor
parent 9157f698
......@@ -93,7 +93,7 @@
<version>0.9.5.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</dependencies>
<repositories>
<repository>
......
......@@ -103,13 +103,20 @@ public class PythonExecutor extends Executor {
@Override
public boolean eval(String script) {
boolean success = true;
this.executionErrors.reset();
long elapsed = System.currentTimeMillis();
engine.exec(script);
elapsed = System.currentTimeMillis() - elapsed;
if (LOGGER.isInfoEnabled()) {
LOGGER.info("Eval took {} ms | {}", elapsed, script); //$NON-NLS-1$
}
return true;
if (this.executionErrors.size() > 0) {
LOGGER.error("Eval returned an error: {}", this.executionErrors.toString()); //$NON-NLS-1$
success = false;
}
return success;
}
@Override
......@@ -132,7 +139,28 @@ public class PythonExecutor extends Executor {
}
}
variable.setValueFromObject((result != null) ? result.__tojava__(Double.class) : null);
if ((variable instanceof VectorVariable) && (result != null)) {
VectorVariable<?> vector = (VectorVariable<?>) variable;
vector.suspendListenerNotification(true);
vector.clear();
if (Double.class.isAssignableFrom(vector.getClassOfValues())) {
for (PyObject item : result.asIterable()) {
vector.add(item.__tojava__(Double.class));
}
} else if (Integer.class.isAssignableFrom(vector.getClassOfValues())) {
for (PyObject item : result.asIterable()) {
vector.add(item.__tojava__(Integer.class));
}
} else {
for (PyObject item : result.asIterable()) {
vector.add(item.__tojava__(Object.class));
}
}
vector.suspendListenerNotification(false);
vector.notifyInputChangeListeners();
} else {
variable.setValueFromObject((result != null) ? result.__tojava__(Double.class) : null);
}
return variable;
}
}
......@@ -263,7 +263,7 @@ public class ArcGraph extends ValueCorona {
balisticTimeline.play();
if (textFont != null) {
StringBuilder labelBuilder = new StringBuilder(this.variable.getName()).append(" "); //$NON-NLS-1$
StringBuilder labelBuilder = new StringBuilder(this.variable.getDisplayName()).append(" "); //$NON-NLS-1$
labelBuilder.append(this.variable.toString());
this.label = labelBuilder.toString();
this.labelMetrics = textFont.getLineMetrics(label.toString(), new FontRenderContext(null, true, true));
......
/**
* Copyright Luxembourg Institute of Science and Technology, 2017. All rights reserved. If you wish
* to use this code for any purpose, please contact the author(s).
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
* WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package lu.list.itis.dkd.tui.widget.corona;
import lu.list.itis.dkd.tui.utility.ColorPair;
import lu.list.itis.dkd.tui.utility.Point;
import lu.list.itis.dkd.tui.widget.corona.builder.ShapeGraphBuilder;
import org.pushingpixels.trident.Timeline;
import org.pushingpixels.trident.Timeline.RepeatBehavior;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
/**
* @author mack
* @since [major].[minor]
* @version [major].[minor].[micro]
*/
// ***************************************************************************
// * Class Definition and Members *
// ***************************************************************************
public class ShapeGraph extends ValueCorona {
/** The minimum value to be stored by the widget. */
protected double lowerBound;
/** The maximum value to be stored by the widget. */
protected double upperBound;
/** The lower bound of the angle the widget can be turned to. */
protected ColorPair fillColour;
protected ColorPair strokeColour;
protected int strokeWidth;
protected Shape graphShape;
protected Timeline blinkingTimeline;
protected Timeline balisticTimeline;
private double shownValue;
private float angle;
private float opacity;
private double scale;
private Stroke borderStroke;
// ---------------------------------------------------------------------------
// ***************************************************************************
// * Constructor(s) *
// ***************************************************************************
// ---------------------------------------------------------------------------
/**
* @param builder
*/
public ShapeGraph(ShapeGraphBuilder builder) {
super(builder);
this.lowerBound = builder.lowerBound;
this.upperBound = builder.upperBound;
this.fillColour = builder.fillColour;
this.strokeColour = builder.strokeColour;
this.strokeWidth = builder.strokeWidth;
this.graphShape = builder.graphShape;
borderStroke = (builder.strokeWidth > 0) ? new BasicStroke(builder.strokeWidth) : null;
this.setInformation(this.variable.getMinValue());
}
// ---------------------------------------------------------------------------
// ***************************************************************************
// * Primitives *
// ***************************************************************************
// ---------------------------------------------------------------------------
private void startBlinking() {
if ((blinkingTimeline != null) && (!blinkingTimeline.isDone()))
blinkingTimeline.cancel();
blinkingTimeline = new Timeline(this);
blinkingTimeline.addPropertyToInterpolate("opacity", 1.0f, 0.0f); //$NON-NLS-1$
blinkingTimeline.setDuration(500);
blinkingTimeline.playLoop(RepeatBehavior.REVERSE);
}
// ---------------------------------------------------------------------------
private void stopBlinking() {
if ((blinkingTimeline != null) && (!blinkingTimeline.isDone()))
blinkingTimeline.cancel();
this.opacity = 1.0f;
}
// ---------------------------------------------------------------------------
// ***************************************************************************
// * Class Body *
// ***************************************************************************
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
public void setShownValue(double value) {
shownValue = value;
if (variable != null) {
double size = lowerBound + (upperBound - lowerBound) * (shownValue - this.variable.getMinValue()) / (this.variable.getMaxValue() - this.variable.getMinValue());
if (size == upperBound)
this.startBlinking();
else
this.stopBlinking();
scale = size / lowerBound;
}
}
// ---------------------------------------------------------------------------
@Override
public void paint(Graphics2D canvas) {
if (!active)
return;
Graphics2D localCanvas = (Graphics2D) canvas.create();
centre.toScreenCoordinates();
if (initialTranslation != null)
initialTranslation.toScreenCoordinates();
Point drawAt = centre.add(initialTranslation);
if (this.rotateWithHandle) {
angle = (float) (drawAt.getAngle() % TWO_PI);
}
AffineTransform translation = new AffineTransform();
translation.translate(drawAt.x, drawAt.y);
translation.rotate(angle);
translation.scale(scale, scale);
localCanvas.setTransform(translation);
if (this.opacity < 1.0f)
localCanvas.setComposite(AlphaComposite.SrcOver.derive(this.opacity));
if (graphShape != null) {
if (fillColour != null) {
localCanvas.setPaint(fillColour.getColor());
localCanvas.fill(graphShape);
}
if (strokeColour != null) {
localCanvas.setPaint(strokeColour.getColor());
if (borderStroke != null) {
localCanvas.setStroke(borderStroke);
localCanvas.draw(graphShape);
}
}
}
if (this.opacity < 1.0f)
localCanvas.setComposite(AlphaComposite.SrcOver.derive(1.0f));
localCanvas.dispose();
}
// ---------------------------------------------------------------------------
@Override
public void setInformation(Object information) {
if (variable != null) {
double value = this.variable.getValue();
if ((balisticTimeline != null) && (!balisticTimeline.isDone()))
balisticTimeline.cancel();
balisticTimeline = new Timeline(this);
balisticTimeline.addPropertyToInterpolate("shownValue", shownValue, value); //$NON-NLS-1$
balisticTimeline.setDuration(500);
balisticTimeline.play();
}
}
// ---------------------------------------------------------------------------
// ***************************************************************************
// * End of Class *
// ***************************************************************************
// ---------------------------------------------------------------------------
}
package lu.list.itis.dkd.tui.widget.corona.builder;
import lu.list.itis.dkd.dbc.annotation.Nullable;
import lu.list.itis.dkd.tui.bootstrapping.BootstrapCallback;
import lu.list.itis.dkd.tui.bootstrapping.BootstrapContext;
import lu.list.itis.dkd.tui.bootstrapping.BootstrappingUtils;
import lu.list.itis.dkd.tui.bootstrapping.ShapeBootstrapper;
import lu.list.itis.dkd.tui.exception.BuildException;
import lu.list.itis.dkd.tui.utility.ColorPair;
import lu.list.itis.dkd.tui.utility.Externalization;
import lu.list.itis.dkd.tui.utility.Point;
import lu.list.itis.dkd.tui.widget.corona.ShapeGraph;
import org.jdom2.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.Color;
import java.awt.Shape;
/**
* @author nmack
* @date 08 Jan 2016
*
* <br>
* $Log: ArcGraphBuilder.java,v $
*/
// ***************************************************************************
// * Class Definition and Members *
// ***************************************************************************
public class ShapeGraphBuilder extends ValueCoronaBuilder<ShapeGraphBuilder> {
public double lowerBound;
public double upperBound;
public ColorPair fillColour;
public ColorPair strokeColour;
public int strokeWidth;
public Shape graphShape;
// public SVGIcon graphImage;
// ***************************************************************************
// * Constants *
// ***************************************************************************
private static Logger LOGGER = LoggerFactory.getLogger(ShapeGraphBuilder.class.getSimpleName());
// ---------------------------------------------------------------------------
// ***************************************************************************
// * Constructor(s) *
// ***************************************************************************
// ---------------------------------------------------------------------------
public ShapeGraphBuilder(Point centre) {
super(centre);
}
/**
* @param rootElement
* @throws BuildException
*/
public ShapeGraphBuilder(Element rootElement) throws BuildException {
super(rootElement);
this.buildFromBootstrap(rootElement, null, null);
/** Mandatory fields */
}
/**
* @param rootElement
* @throws BuildException
*/
public ShapeGraphBuilder(Element rootElement, BootstrapContext context, BootstrapCallback callback) throws BuildException {
super(rootElement, context, callback);
this.buildFromBootstrap(rootElement, context, callback);/** Mandatory fields */
}
// ---------------------------------------------------------------------------
// ***************************************************************************
// * Primitives *
// ***************************************************************************
// ---------------------------------------------------------------------------
private void buildFromBootstrap(@Nullable Element rootElement, BootstrapContext context, BootstrapCallback callback) throws BuildException {
lowerBound = BootstrappingUtils.getContentAsDouble(rootElement, Externalization.LOWER_BOUND_NODE, BootstrappingUtils.MANDATORY, null, context);
upperBound = BootstrappingUtils.getContentAsDouble(rootElement, Externalization.UPPER_BOUND_NODE, BootstrappingUtils.MANDATORY, null, context);
/** Optional fields */
strokeWidth = BootstrappingUtils.getContentAsInteger(rootElement, Externalization.STROKE_WIDTH_NODE, BootstrappingUtils.OPTIONAL, 1, context);
fillColour = buildColorPair(rootElement.getChild(Externalization.FILL_COLOUR_ELEMENT), context);
strokeColour = buildColorPair(rootElement.getChild(Externalization.STROKE_COLOUR_ELEMENT), context);
graphShape = ShapeBootstrapper.getShape(rootElement.getChild(Externalization.SHAPE_NODE), context, callback);
// String graphImagePath = BootstrappingUtils.getContentAsString(rootElement,
// Externalization.IMAGE_ELEMENT, BootstrappingUtils.OPTIONAL, null, context);
// if (!Strings.isNullOrEmpty(graphImagePath)) {
// this.graphImage = this.loadSVGResource(graphImagePath);
// }
}
// ---------------------------------------------------------------------------
// private SVGIcon loadSVGResource(String resourcePath) {
// SVGIcon icon = null;
// try {
// URI uri = SVGCache.getSVGUniverse().loadSVG(new BufferedReader(new
// InputStreamReader(getClass().getResource(resourcePath).openStream())), "shape");
// //$NON-NLS-1$
// icon = new SVGIcon();
// icon.setSvgURI(uri);
// icon.setAntiAlias(true);
// } catch (IOException e) {
// LOGGER.error("Failed to load SVG resource {}!", resourcePath); //$NON-NLS-1$
// }
// return icon;
// }
// ---------------------------------------------------------------------------
private ColorPair buildColorPair(Element rootElement, BootstrapContext context) throws BuildException {
Color selectedColour = BootstrappingUtils.getContentAsColour(rootElement, Externalization.SELECTED_ELEMENT, BootstrappingUtils.MANDATORY, null, context);
Color deselectedColour = BootstrappingUtils.getContentAsColour(rootElement, Externalization.DESELECTED_ELEMENT, BootstrappingUtils.MANDATORY, null, context);
return new ColorPair(selectedColour, deselectedColour);
}
// ---------------------------------------------------------------------------
// ***************************************************************************
// * Class Body *
// ***************************************************************************
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
public ShapeGraphBuilder withFillColours(Color selectedColour, Color deselectedColour) {
fillColour = new ColorPair(selectedColour, deselectedColour);
return this;
}
// ---------------------------------------------------------------------------
public ShapeGraphBuilder withStrokeColours(Color selectedColour, Color deselectedColour) {
strokeColour = new ColorPair(selectedColour, deselectedColour);
return this;
}
// ---------------------------------------------------------------------------
public ShapeGraphBuilder withStrokeWidth(int width) {
this.strokeWidth = width;
return this;
}
// ---------------------------------------------------------------------------
public ShapeGraphBuilder withGraphShape(Shape shape) {
graphShape = shape;
return this;
}
// // ---------------------------------------------------------------------------
//
// public ShapeGraphBuilder withGraphImage(SVGIcon image) {
// graphImage = image;
// return this;
// }
//
// ---------------------------------------------------------------------------
@Override
public ShapeGraph build() throws BuildException {
return new ShapeGraph(this);
}
// ---------------------------------------------------------------------------
// ***************************************************************************
// * End of Class *
// ***************************************************************************
// ---------------------------------------------------------------------------
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment