コード例 #1
0
 private BlockSideEnum Convert(ConduitClosureInfoSide conduitClosureSideEnum)
 {
     if (conduitClosureSideEnum == ConduitClosureInfoSide.Left)
     {
         return(BlockSideEnum.Vest);
     }
     else if (conduitClosureSideEnum == ConduitClosureInfoSide.Top)
     {
         return(BlockSideEnum.North);
     }
     else if (conduitClosureSideEnum == ConduitClosureInfoSide.Right)
     {
         return(BlockSideEnum.East);
     }
     else
     {
         return(BlockSideEnum.South);
     }
 }
コード例 #2
0
        internal void AttachPassByConduitToClosure(Guid conduitId, ConduitClosureInfoSide incommingSide, ConduitClosureInfoSide outgoingSide, int incommingPortPosition, int outgoingPortPosition, int incommingTerminalPosition, int outgoingTerminalPosition, IRouteNetworkState routeNetworkQueryService, IConduitNetworkQueryService conduitNetworkQueryService, IConduitClosureRepository conduitClosureRepository)
        {
            // Check if multi conduit is passing by closure
            var conduit        = conduitNetworkQueryService.GetMultiConduitInfo(conduitId);
            var walkOfInterest = routeNetworkQueryService.GetWalkOfInterestInfo(conduit.WalkOfInterestId);

            if (!walkOfInterest.AllNodeIds.Contains(_pointOfInterestId))
            {
                throw new ArgumentException("Conduit: " + conduitId + " is not related to the point of interest: " + _pointOfInterestId + " where conduit closure: " + Id + " is placed at all.");
            }

            if (walkOfInterest.StartNodeId == _pointOfInterestId || walkOfInterest.EndNodeId == _pointOfInterestId)
            {
                throw new ArgumentException("Conduit: " + conduitId + " is ending in point of interest: " + _pointOfInterestId + " - but not pasing through it. Please use AttachConduitEndToClosure instead. The AttachPassByConduitToClosure can only be used on conduits that are passing through the point of interest (route node) where the conduit closure is placed.");
            }

            if (incommingSide == outgoingSide && incommingPortPosition == outgoingPortPosition)
            {
                throw new ArgumentException("A conduit is not allowed to enter and exit the same port on the same side.");
            }


            var conduitClosureInfo = conduitClosureRepository.GetConduitClosureInfo(Id);

            // Check if conduit is already attached to closure
            if (conduitClosureInfo.Sides.Exists(s => s.Ports.Exists(p => p.MultiConduitId == conduitId)))
            {
                throw new ArgumentException("The conduit: " + conduitId + " is already attached to the closure: " + this.Id);
            }

            if (conduitClosureInfo.Sides.Exists(s => s.Ports.Exists(p => p.Terminals.Exists(t => t.LineId == conduitId))))
            {
                throw new ArgumentException("The conduit: " + conduitId + " is already attached to the closure: " + this.Id);
            }

            // If ports already exists on the side and outgoing port argument not set, find next available port
            if (incommingPortPosition == 0 && conduitClosureInfo.Sides.Find(s => s.Position == incommingSide).Ports.Count != 0)
            {
                incommingPortPosition = conduitClosureInfo.Sides.Find(s => s.Position == incommingSide).Ports.OrderByDescending(p => p.Position).First().Position + 1;
            }
            else
            {
                incommingPortPosition = 1; // No ports yet, so we put it on port 1
            }
            // If ports already exists on the side and outgoing port argument not set, find next available port
            if (outgoingPortPosition == 0 && conduitClosureInfo.Sides.Find(s => s.Position == outgoingSide).Ports.Count != 0)
            {
                outgoingPortPosition = conduitClosureInfo.Sides.Find(s => s.Position == outgoingSide).Ports.OrderByDescending(p => p.Position).First().Position + 1;
            }
            else
            {
                outgoingPortPosition = 1;  // No ports yet, so we put it on port 1
            }
            // Check if port is the next in sequence.
            if (conduitClosureInfo.Sides.Find(s => s.Position == incommingSide).Ports.Count != 0)
            {
                if (conduitClosureInfo.Sides.Find(s => s.Position == incommingSide).Ports.OrderByDescending(p => p.Position).First().Position != (incommingPortPosition - 1))
                {
                    throw new ArgumentException("Incomming port: " + incommingPortPosition + "on side: " + incommingSide + " is not the next number in sequence. Last port number used on side: " + incommingSide + " is: " + conduitClosureInfo.Sides.Find(s => s.Position == incommingSide).Ports.OrderByDescending(p => p.Position).First().Position);
                }
            }
            else
            {
                if (incommingPortPosition != 1)
                {
                    throw new ArgumentException("Incomming port: " + incommingPortPosition + "on side: " + incommingSide + " is not the next number in sequence. No ports currently added to side: " + incommingSide + ". Therefor port number = 1 was expected.");
                }
            }

            if (conduitClosureInfo.Sides.Find(s => s.Position == outgoingSide).Ports.Count != 0)
            {
                if (conduitClosureInfo.Sides.Find(s => s.Position == outgoingSide).Ports.OrderByDescending(p => p.Position).First().Position != (outgoingPortPosition - 1))
                {
                    throw new ArgumentException("Outgoing port: " + outgoingPortPosition + "on side: " + outgoingSide + " is not the next number in sequence. Last port number used on side: " + outgoingSide + " is: " + conduitClosureInfo.Sides.Find(s => s.Position == outgoingSide).Ports.OrderByDescending(p => p.Position).First().Position);
                }
            }
            else
            {
                if (outgoingPortPosition != 1)
                {
                    throw new ArgumentException("Outgoing port: " + outgoingPortPosition + "on side: " + outgoingSide + " is not the next number in sequence. No ports currently added to side: " + outgoingSide + ". Therefor port number = 1 was expected.");
                }
            }

            ///////////////////////////////////////////////////////////////
            /// Finish checking. Now created the domain events
            var conduitAttached = new ConduitClosurePassingByConduitAttached()
            {
                ConduitClosureId          = this.Id,
                ConduitId                 = conduitId,
                IncommingSide             = incommingSide,
                OutgoingSide              = outgoingSide,
                IncommingPortPosition     = incommingPortPosition,
                OutgoingPortPosition      = outgoingPortPosition,
                IncommingTerminalPosition = incommingTerminalPosition,
                OutgoingTerminalPosition  = outgoingTerminalPosition
            };

            RaiseEvent(conduitAttached);
        }
        private void AttachInnerConduitsToTerminals(ConduitClosureInfo conduitClosureInfo, ConduitClosurePassingByConduitAttached @event, ConduitClosureInfoSide sidePosition)
        {
            // Get side
            var side = conduitClosureInfo.Sides.Find(s => s.Position == sidePosition);

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

            // Get port position
            var portPosition = @event.IncommingSide == sidePosition ? @event.IncommingPortPosition : @event.OutgoingPortPosition;

            // Get port
            var port = side.Ports.Find(p => p.Position == portPosition);

            // Get multi conduit
            var multiConduit = conduitNetworkQueryService.GetConduitInfo(@event.ConduitId);

            int terminalPosition = 1;

            foreach (var innerConduit in multiConduit.Children)
            {
                // Get related segment info
                var relatedSegmentInfo = FindRelatedSegmentInfo((ConduitInfo)innerConduit, conduitClosureInfo.PointOfInterestId);

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

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

                if (otherEndTerminalInfo != null)
                {
                    newTerminal.ConnectedToSide     = otherEndTerminalInfo.Side;
                    newTerminal.ConnectedToPort     = otherEndTerminalInfo.Port;
                    newTerminal.ConnectedToTerminal = otherEndTerminalInfo.Terminal;
                    newTerminal.ConnectionKind      = otherEndTerminalInfo.ConnectionKind;

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

                port.Terminals.Add(newTerminal);

                terminalPosition++;
            }
        }
        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);
        }
        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);
        }