import org.simantics.scenegraph.g2d.nodes.UnboundedNode;
import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode;
import org.simantics.scenegraph.utils.ColorUtil;
+import org.simantics.scenegraph.utils.GeometryUtils;
import org.simantics.scenegraph.utils.NodeUtil;
import org.simantics.utils.datastructures.collections.CollectionUtils;
import org.simantics.utils.datastructures.hints.HintListenerAdapter;
if (holder == null) {
holder = parentNode.addNode(ElementUtils.generateNodeId(e), ConnectionNode.class);
holder.setKey(e.getHint(ElementHints.KEY_OBJECT));
+ holder.setTypeClass(e.getHint(ElementHints.KEY_TYPE_CLASS));
holder.setTransferableProvider(new ElementTransferableProvider(getContext(), e));
e.setHint(sgKey, holder);
holder.setZIndex(parentNode.getNodeCount() + 1);
if (holder == null) {
holder = parentNode.addNode(ElementUtils.generateNodeId(e), SingleElementNode.class);
holder.setKey(e.getHint(ElementHints.KEY_OBJECT));
+ holder.setTypeClass(e.getHint(ElementHints.KEY_TYPE_CLASS));
holder.setTransferableProvider(new ElementTransferableProvider(getContext(), e));
e.setHint(sgKey, holder);
holder.setZIndex(parentNode.getNodeCount() + 1);
Shape shape = ElementUtils.getElementShapeOrBounds(e);
Rectangle2D bounds = shape.getBounds2D();
//System.out.println("selection bounds: "+bounds);
- final double marginX = 1 / selectionTransform.getScaleX();
- final double marginY = 1 / selectionTransform.getScaleY();
+
+ Point2D scale = GeometryUtils.getScale2D(selectionTransform);
+ final double marginX = Math.abs(scale.getX()) > 1e-10 ? 1 / scale.getX() : 1;
+ final double marginY = Math.abs(scale.getY()) > 1e-10 ? 1 / scale.getY() : 1;
+
bounds.setFrame(bounds.getMinX() - marginX, bounds.getMinY() - marginY, bounds.getWidth() + 2*marginX, bounds.getHeight() + 2*marginY);
List<SelectionSpecification> ss = e.getElementClass().getItemsByClass(SelectionSpecification.class);