From: jsimomaa Date: Thu, 11 Apr 2019 14:37:06 +0000 (+0300) Subject: Support copy and cut of dh element & create connections after X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F50%2F2850%2F1;p=simantics%2Fdistrict.git Support copy and cut of dh element & create connections after gitlab #43 APROS-15307 Change-Id: I9ade3a03bed1da37c1c7adea951998f611386947 --- diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java index 3f99f60b..9365a8c0 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/CopyDistrictVertexHandler.java @@ -4,6 +4,7 @@ import java.util.List; import javax.inject.Named; +import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.e4.core.di.annotations.CanExecute; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.ui.services.IServiceConstants; @@ -51,10 +52,11 @@ public class CopyDistrictVertexHandler { } @Execute - public void execute(@Named(IServiceConstants.ACTIVE_SELECTION) Object selection) { + public void execute(@Named(IServiceConstants.ACTIVE_SELECTION) Object selection, ParameterizedCommand command) { final List elements = ISelectionUtils.getPossibleKeys(selection, SelectionHints.KEY_MAIN, Resource.class); - // we store these to a static variable for pasting.. maybe not the best solution + // we store these to a static variable for pasting.. maybe not the best solution CopyDistrictVertexHandler.elements = elements; - //CopyDistrictVertexHandler.cut = cut != null && !cut.isEmpty(); + Object cut = command.getParameterMap().get("org.simantics.district.network.ui.commandparameter.0"); + CopyDistrictVertexHandler.cut = cut != null; } } diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java index b9aedefe..633395d5 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/contributions/PasteDistrictVertexHandler.java @@ -2,7 +2,6 @@ package org.simantics.district.network.ui.contributions; import java.util.Collection; import java.util.List; -import java.util.concurrent.ForkJoinPool; import java.util.concurrent.TimeUnit; import javax.inject.Named; @@ -15,6 +14,7 @@ import org.simantics.Simantics; import org.simantics.databoard.Bindings; import org.simantics.db.ReadGraph; import org.simantics.db.Resource; +import org.simantics.db.Statement; import org.simantics.db.WriteGraph; import org.simantics.db.common.request.WriteRequest; import org.simantics.db.exception.DatabaseException; @@ -22,7 +22,9 @@ import org.simantics.db.layer0.SelectionHints; import org.simantics.db.layer0.util.RemoverUtil; import org.simantics.db.request.Read; import org.simantics.diagram.stubs.DiagramResource; +import org.simantics.district.network.DistrictNetworkUtil; import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.layer0.Layer0; import org.simantics.utils.threads.ThreadUtils; import org.simantics.utils.ui.ISelectionUtils; import org.slf4j.Logger; @@ -56,7 +58,60 @@ public class PasteDistrictVertexHandler { return false; } } + + private static Resource doCopy(WriteGraph graph, Resource diagram, Resource target, Resource source) throws DatabaseException { + DiagramResource DIA = DiagramResource.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + double[] location = graph.getRelatedValue(target, DIA.HasLocation, Bindings.DOUBLE_ARRAY); + double elevation = graph.getRelatedValue(target, DN.Vertex_HasElevation, Bindings.DOUBLE); + Resource vertex = DistrictNetworkUtil.createVertex(graph, diagram, location, elevation); + copySourceToTarget(graph, source, vertex); + return vertex; + } + + private static void copySourceToTarget(WriteGraph graph, Resource source, Resource target) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + graph.deny(target, DN.HasMapping); + + Collection statements = graph.getStatements(source, L0.HasProperty); + Collection assertedStatements = graph.getAssertedStatements(source, L0.HasProperty); + statements.removeAll(assertedStatements); + for (Statement stm : statements) { + if (!graph.hasStatement(target, stm.getPredicate())) { + graph.claim(target, stm.getPredicate(), stm.getObject()); + } + } + } + private static void copyVertexInverses(WriteGraph graph, Resource sourceElement, Resource targetElement) throws DatabaseException { + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + Collection sourceStartVertex_inverse = graph.getObjects(sourceElement, DN.HasStartVertex_Inverse); + Collection sourceEndVertex_inverse = graph.getObjects(sourceElement, DN.HasEndVertex_Inverse); + Collection targetStartVertex_inverse = graph.getObjects(targetElement, DN.HasStartVertex_Inverse); + Collection targetEndVertex_inverse = graph.getObjects(targetElement, DN.HasEndVertex_Inverse); + graph.deny(sourceElement, DN.HasStartVertex_Inverse); + graph.deny(sourceElement, DN.HasEndVertex_Inverse); + graph.deny(targetElement, DN.HasStartVertex_Inverse); + graph.deny(targetElement, DN.HasEndVertex_Inverse); + for (Resource startVertexInverse : sourceStartVertex_inverse) { + graph.claim(targetElement, DN.HasStartVertex_Inverse, startVertexInverse); + } + for (Resource targetVertexInverse : targetStartVertex_inverse) { + graph.claim(sourceElement, DN.HasStartVertex_Inverse, targetVertexInverse); + } + for (Resource endVertexInverse : sourceEndVertex_inverse) { + graph.claim(targetElement, DN.HasEndVertex_Inverse, endVertexInverse); + } + for (Resource targetVertexInverse : targetEndVertex_inverse) { + graph.claim(sourceElement, DN.HasEndVertex_Inverse, targetVertexInverse); + } + } + + private static void deleteExistingTarget(WriteGraph graph, Resource target) throws DatabaseException { + RemoverUtil.remove(graph, target); + } + @Execute public void execute(@Named(IServiceConstants.ACTIVE_SELECTION) Object selection) { final List elements = ISelectionUtils.getPossibleKeys(selection, SelectionHints.KEY_MAIN, Resource.class); @@ -75,81 +130,89 @@ public class PasteDistrictVertexHandler { Resource sourceMappedElement = graph.getPossibleObject(sourceElement, DN.MappedComponent); Resource targetMappedElement = graph.getPossibleObject(targetElement, DN.MappedComponent); - if (sourceMappedElement != null) + if (sourceMappedElement != null && cut) RemoverUtil.remove(graph, sourceMappedElement); if (targetMappedElement != null) RemoverUtil.remove(graph, targetMappedElement); - ThreadUtils.getNonBlockingWorkExecutor().schedule(() -> { - Simantics.getSession().asyncRequest(new WriteRequest() { - - @Override - public void perform(WriteGraph graph) throws DatabaseException { - //copyMapping(graph, DN, sourceElement, targetElement); - copyLocation(graph, DN, sourceElement, targetElement, cut); - copyVertexInverses(graph, DN, sourceElement, targetElement, cut); - copyElevation(graph, DN, sourceElement, targetElement, cut); - } - }); - }, 200, TimeUnit.MILLISECONDS); - } - - private void copyMapping(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement) throws DatabaseException { - Resource sourceMapping = graph.getSingleObject(sourceElement, DN.Mapping); - Resource targetMapping = graph.getSingleObject(targetElement, DN.Mapping); - if (cut) { - graph.deny(sourceElement, DN.Mapping); - graph.claim(sourceElement, DN.Mapping, targetMapping); - } - graph.deny(targetElement, DN.Mapping); - graph.claim(targetElement, DN.Mapping, sourceMapping); } + }); + ThreadUtils.getNonBlockingWorkExecutor().schedule(() -> { + try { + Simantics.getSession().syncRequest(new WriteRequest() { - private void copyElevation(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { - double sourceElevation = graph.getRelatedValue(sourceElement, DN.Vertex_HasElevation, Bindings.DOUBLE); - double targetElevation = graph.getRelatedValue(targetElement, DN.Vertex_HasElevation, Bindings.DOUBLE); - if (cut) { - graph.deny(sourceElement, DN.Vertex_HasElevation); - graph.claimLiteral(sourceElement, DN.Vertex_HasElevation, targetElevation, Bindings.DOUBLE); - } - graph.deny(targetElement, DN.Vertex_HasElevation); - graph.claimLiteral(targetElement, DN.Vertex_HasElevation, sourceElevation, Bindings.DOUBLE); - } + @Override + public void perform(WriteGraph graph) throws DatabaseException { + Layer0 L0 = Layer0.getInstance(graph); + + Resource diagram = graph.getSingleObject(sourceElement, L0.PartOf); + Resource newTarget = doCopy(graph, diagram, targetElement, sourceElement); + if (cut) { + Resource newSource = doCopy(graph, diagram, sourceElement, targetElement); + copyVertexInverses(graph, sourceElement, newSource); + deleteExistingTarget(graph, sourceElement); + } + copyVertexInverses(graph, targetElement, newTarget); + deleteExistingTarget(graph, targetElement); + } + }); + } catch (DatabaseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + }, 500, TimeUnit.MILLISECONDS); + +// ThreadUtils.getNonBlockingWorkExecutor().schedule(() -> { +// Simantics.getSession().asyncRequest(new WriteRequest() { +// +// @Override +// public void perform(WriteGraph graph) throws DatabaseException { +// DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); +// //copyMapping(graph, DN, sourceElement, targetElement); +// copyLocation(graph, DN, sourceElement, targetElement, cut); +// copyVertexInverses(graph, DN, sourceElement, targetElement, cut); +// copyElevation(graph, DN, sourceElement, targetElement, cut); +// } +// +// private void copyMapping(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement) throws DatabaseException { +// Resource sourceMapping = graph.getSingleObject(sourceElement, DN.Mapping); +// Resource targetMapping = graph.getSingleObject(targetElement, DN.Mapping); +// if (cut) { +// graph.deny(sourceElement, DN.Mapping); +// graph.claim(sourceElement, DN.Mapping, targetMapping); +// } +// graph.deny(targetElement, DN.Mapping); +// graph.claim(targetElement, DN.Mapping, sourceMapping); +// } +// +// private void copyElevation(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { +// double sourceElevation = graph.getRelatedValue(sourceElement, DN.Vertex_HasElevation, Bindings.DOUBLE); +// double targetElevation = graph.getRelatedValue(targetElement, DN.Vertex_HasElevation, Bindings.DOUBLE); +// if (cut) { +// graph.deny(sourceElement, DN.Vertex_HasElevation); +// graph.claimLiteral(sourceElement, DN.Vertex_HasElevation, targetElevation, Bindings.DOUBLE); +// } +// graph.deny(targetElement, DN.Vertex_HasElevation); +// graph.claimLiteral(targetElement, DN.Vertex_HasElevation, sourceElevation, Bindings.DOUBLE); +// } +// +// private void copyLocation(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { +// DiagramResource DIA = DiagramResource.getInstance(graph); +// double[] sourceLocation = graph.getRelatedValue(sourceElement, DIA.HasLocation, Bindings.DOUBLE_ARRAY); +// double[] targetLocation = graph.getRelatedValue(targetElement, DIA.HasLocation, Bindings.DOUBLE_ARRAY); +// if (cut) { +// graph.deny(sourceElement, DIA.HasLocation); +// graph.claimLiteral(sourceElement, DIA.HasLocation, targetLocation, Bindings.DOUBLE_ARRAY); +// } +// graph.deny(targetElement, DIA.HasLocation); +// graph.claimLiteral(targetElement, DIA.HasLocation, sourceLocation, Bindings.DOUBLE_ARRAY); +// } +// + +// +// +// }); +// }, 500, TimeUnit.MILLISECONDS); - private void copyLocation(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { - DiagramResource DIA = DiagramResource.getInstance(graph); - double[] sourceLocation = graph.getRelatedValue(sourceElement, DIA.HasLocation, Bindings.DOUBLE_ARRAY); - double[] targetLocation = graph.getRelatedValue(targetElement, DIA.HasLocation, Bindings.DOUBLE_ARRAY); - if (cut) { - graph.deny(sourceElement, DIA.HasLocation); - graph.claimLiteral(sourceElement, DIA.HasLocation, targetLocation, Bindings.DOUBLE_ARRAY); - } - graph.deny(targetElement, DIA.HasLocation); - graph.claimLiteral(targetElement, DIA.HasLocation, sourceLocation, Bindings.DOUBLE_ARRAY); - } - - private void copyVertexInverses(WriteGraph graph, DistrictNetworkResource DN, Resource sourceElement, Resource targetElement, boolean cut) throws DatabaseException { - Collection sourceStartVertex_inverse = graph.getObjects(sourceElement, DN.HasStartVertex_Inverse); - Collection sourceEndVertex_inverse = graph.getObjects(sourceElement, DN.HasEndVertex_Inverse); - Collection targetStartVertex_inverse = graph.getObjects(targetElement, DN.HasStartVertex_Inverse); - Collection targetEndVertex_inverse = graph.getObjects(targetElement, DN.HasEndVertex_Inverse); - graph.deny(sourceElement, DN.HasStartVertex_Inverse); - graph.deny(sourceElement, DN.HasEndVertex_Inverse); - graph.deny(targetElement, DN.HasStartVertex_Inverse); - graph.deny(targetElement, DN.HasEndVertex_Inverse); - for (Resource startVertexInverse : sourceStartVertex_inverse) { - graph.claim(targetElement, DN.HasStartVertex_Inverse, startVertexInverse); - } - for (Resource targetVertexInverse : targetStartVertex_inverse) { - graph.claim(sourceElement, DN.HasStartVertex_Inverse, targetVertexInverse); - } - for (Resource endVertexInverse : sourceEndVertex_inverse) { - graph.claim(targetElement, DN.HasEndVertex_Inverse, endVertexInverse); - } - for (Resource targetVertexInverse : targetEndVertex_inverse) { - graph.claim(sourceElement, DN.HasEndVertex_Inverse, targetVertexInverse); - } - } - }); } catch (DatabaseException e) { e.printStackTrace(); }