private void OnMultiConduitInnerConduitAdded(ConduitClosureInfo conduitClosureInfo, MultiConduitInnerConduitAdded @event)
        {
            // Get conduit
            var conduit      = conduitNetworkQueryService.GetConduitInfo(@event.MultiConduitId);
            var innerConduit = conduit.Children.OfType <ConduitInfo>().Single(c => c.SequenceNumber == @event.MultiConduitIndex);

            // Find port where multi conduit is connected

            ConduitClosureSideInfo foundSide = null;
            ConduitClosurePortInfo foundPort = null;

            foreach (var side in conduitClosureInfo.Sides)
            {
                foreach (var port in side.Ports)
                {
                    if (port.MultiConduitId == @event.MultiConduitId)
                    {
                        foundSide = side;
                        foundPort = port;
                    }
                }
            }

            if (foundPort != null)
            {
                AttachSingleConduitToPortTerminal(conduitClosureInfo, innerConduit.Id, foundSide.Position, foundPort.Position, @event.MultiConduitIndex);
                conduitClosureRepository.UpdateConduitClosureInfo(conduitClosureInfo);
            }
        }
        private ConduitClosurePortInfo AttachMultiConduitEndToPort(ConduitClosureInfo conduitClosureInfo, Guid conduitId, ConduitClosureInfoSide sidePosition, int portPosition)
        {
            // Get conduit
            var conduit = conduitNetworkQueryService.GetConduitInfo(conduitId);

            // Find the conduit segment that is related to the point of interest of the conduit closure
            var relatedSegmentInfo = FindRelatedSegmentInfo(conduit, conduitClosureInfo.PointOfInterestId);

            // Get conduit end kind (to be placed on terminal)
            var endKind = ConduitEndKindEnum.Outgoing;

            if (relatedSegmentInfo.RelationType == ConduitRelationTypeEnum.Incomming)
            {
                endKind = ConduitEndKindEnum.Incomming;
            }
            else if (relatedSegmentInfo.RelationType == ConduitRelationTypeEnum.Outgoing)
            {
                endKind = ConduitEndKindEnum.Outgoing;
            }
            else
            {
                throw new Exception("Cannot attach conduit: " + conduitId + " in conduitClosure: " + conduitClosureInfo.Id + " because the outer conduit is not cut.");
            }

            var side = conduitClosureInfo.Sides.Find(s => s.Position == sidePosition);

            // Create port
            var newPort = new ConduitClosurePortInfo()
            {
                Position                   = portPosition,
                ConnectionKind             = ConduitClosureInternalConnectionKindEnum.NotConnected,
                MultiConduitId             = conduit.Id,
                MultiConduitSegmentId      = relatedSegmentInfo.Segment.Id,
                MultiConduitSegmentEndKind = endKind
            };

            // Try find other side
            var otherSidePort = FindRelatedPort(conduitClosureInfo, relatedSegmentInfo.Segment.Id);

            if (otherSidePort != null)
            {
                newPort.ConnectedToSide = otherSidePort.Side;
                newPort.ConnectedToPort = otherSidePort.Port;
                newPort.ConnectionKind  = otherSidePort.ConnectionKind;

                // Update the other end as well
                var otherEndPort = conduitClosureInfo.Sides.Find(s => s.Position == otherSidePort.Side).Ports.Find(p => p.Position == otherSidePort.Port);
                otherEndPort.ConnectedToSide = sidePosition;
                otherEndPort.ConnectedToPort = portPosition;
                otherEndPort.ConnectionKind  = otherSidePort.ConnectionKind;
            }

            side.Ports.Add(newPort);

            return(newPort);
        }
        private ConduitClosurePortInfo AttachMultiConduitToPort(ConduitClosureInfo conduitClosureInfo, Guid conduitId, ConduitClosureInfoSide sidePosition, ConduitClosureInfoSide incommingSide, int incommingPortPosition, ConduitClosureInfoSide outgoingSide, int outgoingPortPosition)
        {
            // Get conduit
            var conduit = conduitNetworkQueryService.GetConduitInfo(conduitId);

            // Get conduit end kind (to be placed on terminal)
            var endKind = incommingSide == sidePosition ? ConduitEndKindEnum.Incomming : ConduitEndKindEnum.Outgoing;

            // Find the conduit segment that is related to the point of interest of the conduit closure
            var relatedSegmentInfo = FindRelatedSegmentInfo(conduit, conduitClosureInfo.PointOfInterestId);

            var side         = conduitClosureInfo.Sides.Find(s => s.Position == sidePosition);
            var portPosition = incommingSide == sidePosition ? incommingPortPosition : outgoingPortPosition;

            // Create port
            var newPort = new ConduitClosurePortInfo()
            {
                Position                   = portPosition,
                ConnectionKind             = ConduitClosureInternalConnectionKindEnum.NotConnected,
                MultiConduitId             = conduit.Id,
                MultiConduitSegmentId      = relatedSegmentInfo.Segment.Id,
                MultiConduitSegmentEndKind = endKind
            };

            // Try find other side
            var otherSidePort = FindRelatedPort(conduitClosureInfo, relatedSegmentInfo.Segment.Id);

            if (otherSidePort != null)
            {
                newPort.ConnectedToSide = otherSidePort.Side;
                newPort.ConnectedToPort = otherSidePort.Port;
                newPort.ConnectionKind  = otherSidePort.ConnectionKind;

                // Update the other end as well
                var otherEndPort = conduitClosureInfo.Sides.Find(s => s.Position == otherSidePort.Side).Ports.Find(p => p.Position == otherSidePort.Port);
                otherEndPort.ConnectedToSide = sidePosition;
                otherEndPort.ConnectedToPort = portPosition;
                otherEndPort.ConnectionKind  = otherSidePort.ConnectionKind;
            }

            side.Ports.Add(newPort);

            return(newPort);
        }
        private void AttachSingleConduitToPortTerminal(ConduitClosureInfo conduitClosureInfo, Guid conduitId, ConduitClosureInfoSide sideParam, int portPosition, int terminalPosition)
        {
            // Get conduit
            var conduit = conduitNetworkQueryService.GetConduitInfo(conduitId);

            // Find the conduit segment that is related to the point of interest of the conduit closure
            var relatedSegmentInfo = FindRelatedSegmentInfo(conduit, conduitClosureInfo.PointOfInterestId);

            var side    = conduitClosureInfo.Sides.Find(s => s.Position == sideParam);
            var endKind = relatedSegmentInfo.RelationType == ConduitRelationTypeEnum.Incomming ? ConduitEndKindEnum.Incomming : ConduitEndKindEnum.Outgoing;

            // Find or create port
            ConduitClosurePortInfo port = null;

            if (!side.Ports.Exists(p => p.Position == portPosition))
            {
                port = new ConduitClosurePortInfo()
                {
                    Position       = portPosition,
                    ConnectionKind = ConduitClosureInternalConnectionKindEnum.NotConnected
                };

                side.Ports.Add(port);
            }
            else
            {
                port = side.Ports.Find(p => p.Position == portPosition);
            }


            // Create terminal
            var newTerminal = new ConduitClosureTerminalInfo()
            {
                Position           = terminalPosition,
                ConnectionKind     = ConduitClosureInternalConnectionKindEnum.NotConnected,
                LineId             = conduitId,
                LineSegmentId      = relatedSegmentInfo.Segment.Id,
                LineSegmentEndKind = endKind
            };

            port.Terminals.Add(newTerminal);
        }