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