Group: Forum Members
Last Active: 6 days ago @ 9:50 PM
Posts: 10,
Visits: 362
|
Hi , I would like to ask if there is an existing event under NPort object that triggers whenever the glued or snapped object changes ? I would like to use this feature to track connection changes on one of my NShape ports . & nbsp ; Kindly advise if it is available on NOV library .
|
Group: Forum Members
Last Active: Last Month
Posts: 3,055,
Visits: 4,052
|
You can use the following method to get the shapes glued to a port : private static NList<NShape> GetGluedShapes(NPort port) { NList<NShape> gluedShapes = new NList<NShape>(); if (port.OwnerShape == null) return gluedShapes;
int portIndex = port.GetAggregationInfo().Index;
// Check incoming shapes NList<NShape> shapes = port.OwnerShape.GetIncomingShapes(); for (int i = 0; i < shapes.Count; i++) { NShape shape = shapes[i]; if (shape.EndPointGlue is NEndPointGlueToPort portGlue && portGlue.PortIndex == portIndex) { gluedShapes.Add(shape); } }
// Check outgoing shapes shapes = port.OwnerShape.GetOutgoingShapes(); for (int i = 0; i < shapes.Count; i++) { NShape shape = shapes[i]; if (shape.BeginPointGlue is NEndPointGlueToPort portGlue && portGlue.PortIndex == portIndex) { gluedShapes.Add(shape); } }
return gluedShapes; }
private static NList<NShape> GetGluedShapes(NPort port)
{
NList<NShape> gluedShapes = new NList<NShape>();
if (port.OwnerShape == null)
return gluedShapes;
int portIndex = port.GetAggregationInfo().Index;
// Check incoming shapes
NList<NShape> shapes = port.OwnerShape.GetIncomingShapes();
for (int i = 0; i < shapes.Count; i++)
{
NShape shape = shapes[i];
if (shape.EndPointGlue is NEndPointGlueToPort portGlue && portGlue.PortIndex == portIndex)
{
gluedShapes.Add(shape);
}
}
// Check outgoing shapes
shapes = port.OwnerShape.GetOutgoingShapes();
for (int i = 0; i < shapes.Count; i++)
{
NShape shape = shapes[i];
if (shape.BeginPointGlue is NEndPointGlueToPort portGlue && portGlue.PortIndex == portIndex)
{
gluedShapes.Add(shape);
}
}
return gluedShapes;
}
We will add this method to the NPort class , so in the next version of NOV Diagram , you will be able to just use NPort.GetGluedShapes method . Then subscribe to the Deactivated event of the NDragHandleTool of the drawing view . The following method is a complete code example that creates a diagram with 2 shapes , a connector and shows a message box when a new connector is glued to the right port of the red rectangle shape or you disconnect and then reconnect the connector : private static void CreateSampleDiagram(NDrawingView drawingView) { NPage page = drawingView.ActivePage; NBasicShapeFactory factory = new NBasicShapeFactory();
// Create 2 shapes NShape shape1 = factory.CreateShape(ENBasicShape.Rectangle); shape1.Text = "Rectangle"; shape1.SetBounds(100, 100, 150, 100); shape1.Geometry.Fill = new NColorFill(NColor.Red); page.Items.Add(shape1);
NShape shape2 = factory.CreateShape(ENBasicShape.Circle); shape2.Text = "Circle"; shape2.SetBounds(350, 300, 150, 100); shape2.Geometry.Fill = new NColorFill(NColor.Green); page.Items.Add(shape2);
// Create a connector and connect the shapes NRoutableConnector connector = new NRoutableConnector(); connector.UserClass = NDR.StyleSheetNameConnectors; page.Items.Add(connector); connector.GlueBeginToShape(shape1); connector.GlueEndToShape(shape2);
// Get the right port of the rectangle shape NPort port = shape1.Ports.GetPortByName("Right"); NShape portConnector; GetGluedShapes(port).TryGetFirst(null, out portConnector);
// Subscribe to the deactivated event of the drag handle tool NDragHandleTool dragHandleTool = drawingView.Interactor.GetTool<NPointerTool>().GetTool<NDragHandleTool>(); dragHandleTool.Deactivated += (NEventArgs arg) => { NShape curPortConnector; GetGluedShapes(port).TryGetFirst(null, out curPortConnector); if (curPortConnector != null && curPortConnector != portConnector) { NMessageBox.Show("New connector connected to port.", "New Connection"); } }; }
private static void CreateSampleDiagram(NDrawingView drawingView)
{
NPage page = drawingView.ActivePage;
NBasicShapeFactory factory = new NBasicShapeFactory();
// Create 2 shapes
NShape shape1 = factory.CreateShape(ENBasicShape.Rectangle);
shape1.Text = "Rectangle";
shape1.SetBounds(100, 100, 150, 100);
shape1.Geometry.Fill = new NColorFill(NColor.Red);
page.Items.Add(shape1);
NShape shape2 = factory.CreateShape(ENBasicShape.Circle);
shape2.Text = "Circle";
shape2.SetBounds(350, 300, 150, 100);
shape2.Geometry.Fill = new NColorFill(NColor.Green);
page.Items.Add(shape2);
// Create a connector and connect the shapes
NRoutableConnector connector = new NRoutableConnector();
connector.UserClass = NDR.StyleSheetNameConnectors;
page.Items.Add(connector);
connector.GlueBeginToShape(shape1);
connector.GlueEndToShape(shape2);
// Get the right port of the rectangle shape
NPort port = shape1.Ports.GetPortByName("Right");
NShape portConnector;
GetGluedShapes(port).TryGetFirst(null, out portConnector);
// Subscribe to the deactivated event of the drag handle tool
NDragHandleTool dragHandleTool = drawingView.Interactor.GetTool<NPointerTool>().GetTool<NDragHandleTool>();
dragHandleTool.Deactivated += (NEventArgs arg) =>
{
NShape curPortConnector;
GetGluedShapes(port).TryGetFirst(null, out curPortConnector);
if (curPortConnector != null && curPortConnector != portConnector)
{
NMessageBox.Show("New connector connected to port.", "New Connection");
}
};
}
Best Regards, Nevron Support Team
|