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