Group: Forum Members
Last Active: 11 Years Ago
Posts: 12,
Visits: 1
|
I am putting together complex shape as groups and/or composites. In the end I add the composites and groups to the document.
Inside the components, I am trying to connect two shapes with a NRoutableConnector, before I have added the shapes to the documents. Is there anyway to accomplish this?
We have separated the complexity of building and relating the complex shapes from the actual adding of these shapes to the document.
Thanks,
- ted
Here are simple example tests showing what we want, vs how it works:
#region
using System; using Drawing.Surface; using Nevron.Diagram; using NUnit.Framework;
#endregion
namespace DrawingTest { [TestFixture] public class ConnectionBuilderTest { private void AddConnectionPorts(NShape shape) { var created = shape.CreateShapeElements(ShapeElementsMask.Ports); if (!created) { throw new ApplicationException("Failed to create ports"); }
shape.Ports.RemoveAllChildren();
var outwardPort = new NLogicalLinePort(shape.UniqueId, 30); outwardPort.Type = PortType.Outward; shape.Ports.AddChild(outwardPort); shape.Ports.DefaultOutwardPortUniqueId = outwardPort.UniqueId;
var inwardPort = new NLogicalLinePort(shape.UniqueId, 30); shape.Ports.AddChild(inwardPort); shape.Ports.DefaultInwardPortUniqueId = inwardPort.UniqueId; }
[Test] public void TestFromAndToShape_ConnectTwoRectangles_NotAddedToDocument_WouldBeNice() { var source = new NRectangleShape(0, 0, 100, 100); var dest = new NRectangleShape(0, 0, 100, 100);
AddConnectionPorts(source); AddConnectionPorts(dest);
var line = new NRoutableConnector();
// execute line.ToShape = dest; line.FromShape = source;
// Assert Assert.AreEqual(source, line.FromShape, "Source"); Assert.AreEqual(dest, line.ToShape, "Dest"); }
[Test] public void TestFromAndToShape_ConnectTwoRectangles_AddedToDocument_CurrentRequiredBehaviour() { var doc = new NDrawingDocument(); //Nevron requires a document to be able to connect shapes. var source = new NRectangleShape(0, 0, 100, 100); var dest = new NRectangleShape(0, 0, 100, 100);
doc.ActiveLayer.AddChild(source); doc.ActiveLayer.AddChild(dest);
AddConnectionPorts(source); AddConnectionPorts(dest);
var line = new NRoutableConnector();
doc.ActiveLayer.AddChild(line);
// execute line.ToShape = dest; line.FromShape = source;
// Assert Assert.AreEqual(source, line.FromShape, "Source"); Assert.AreEqual(dest, line.ToShape, "Dest"); }
} }
|
Group: Forum Members
Last Active: Yesterday @ 8:46 AM
Posts: 3,054,
Visits: 4,012
|
Hi, You got it right. Prior to connecting any shapes with a connector, both the shapes and the conector should be added to a drawing document.
Best Regards, Nevron Support Team
|
Group: Forum Members
Last Active: 11 Years Ago
Posts: 12,
Visits: 1
|
Sorry,
I meant to ask, is there any way to build these connections without using registering all the objects on the document?
If it is not possible, what happens if I add a shape to the document multiple times?
For us, when we put these two responsibilities together it really complicates the code.
- ted
|
Group: Forum Members
Last Active: Yesterday @ 8:46 AM
Posts: 3,054,
Visits: 4,012
|
Hi, Regarding your questions: - If you want to connect shapes, they should be placed in a drawing document together with the connector prior to setting the FromShape and ToShape properties of the connector. - A shape cannot be added to a drawing document multiple times. However if you want to duplicate a gievn shape, you can do so by cloning it with a new unique ID like this: Hashtable hash = new Hashtable(); document.ActiveLayer.AddChild((NGroup)shape.CloneWithNewUniqueId(hash));
Best Regards, Nevron Support Team
|