/// <summary> /// Removes the inbound/outbound target intersections that would allow going into a dead-end. /// This analysis has to be performed on a per-source-ring basis. /// </summary> /// <param name="intersectionsInboundTarget"></param> /// <param name="intersectionsOutboundTarget"></param> protected virtual void RemoveDeadEndIntersections( IList <IntersectionPoint3D> intersectionsInboundTarget, IList <IntersectionPoint3D> intersectionsOutboundTarget) { var firstAlongTarget = IntersectionsAlongTarget.FirstOrDefault(); if (firstAlongTarget != null && intersectionsOutboundTarget.Contains(firstAlongTarget)) { intersectionsOutboundTarget.Remove(firstAlongTarget); } var lastAlongTarget = IntersectionsAlongTarget.LastOrDefault(); if (lastAlongTarget != null && intersectionsInboundTarget.Contains(lastAlongTarget)) { // dangle at the end of the cut line intersectionsInboundTarget.Remove(lastAlongTarget); } }
protected override void RemoveDeadEndIntersections( IList <IntersectionPoint3D> intersectionsInboundTarget, IList <IntersectionPoint3D> intersectionsOutboundTarget) { foreach (int sourcePartIdx in _intersectionPoints .Select(ip => ip.SourcePartIndex).Distinct()) { var firstAlongTarget = IntersectionsAlongTarget.FirstOrDefault( ip => ip.SourcePartIndex == sourcePartIdx); if (firstAlongTarget != null && intersectionsOutboundTarget.Contains(firstAlongTarget)) { // The first intersection is outbound -> cannot cut, unless this part is closed if (!Target.GetPart(firstAlongTarget.TargetPartIndex).IsClosed) { intersectionsOutboundTarget.Remove(firstAlongTarget); } } var lastAlongTarget = IntersectionsAlongTarget.LastOrDefault( ip => ip.SourcePartIndex == sourcePartIdx); if (lastAlongTarget != null && intersectionsInboundTarget.Contains(lastAlongTarget)) { // dangle at the end of the cut line: cannot cut, unless the part is closed if (!Target.GetPart(lastAlongTarget.TargetPartIndex).IsClosed) { intersectionsInboundTarget.Remove(lastAlongTarget); } } } }