public bool MakeHoleFromLoop(uint lId) { uint uLId1 = 0; { if (!Loop2UseLoop.ContainsKey(lId)) { return(false); } uLId1 = Loop2UseLoop[lId]; } System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId1)); BRep.SetUseLoopLoopId(uLId1, 0); Loop2UseLoop.Remove(lId); return(true); }
public bool RemoveEdge(uint eId, bool isDelCP) { uint hEId1 = 0; { if (!Edge2HalfEdge.ContainsKey(eId)) { return(false); } hEId1 = Edge2HalfEdge[eId]; } uint hEId2; { System.Diagnostics.Debug.Assert(BRep.IsHalfEdgeId(hEId1)); HalfEdge hE1 = BRep.GetHalfEdge(hEId1); hEId2 = hE1.OHEId; } uint uLId1; uint lId1; bool isEdgeVertex2 = false; { HalfEdge hE1 = BRep.GetHalfEdge(hEId1); System.Diagnostics.Debug.Assert(hE1.OHEId == hEId2); uLId1 = hE1.ULId; UseLoop uL1 = BRep.GetUseLoop(uLId1); lId1 = uL1.LId; if (hE1.FHEId == hEId2) { isEdgeVertex2 = true; } } uint uLId2; uint lId2; bool isEdgeVertex1 = false; { HalfEdge hE2 = BRep.GetHalfEdge(hEId2); System.Diagnostics.Debug.Assert(hE2.OHEId == hEId1); uLId2 = hE2.ULId; UseLoop uL2 = BRep.GetUseLoop(uLId2); lId2 = uL2.LId; if (hE2.FHEId == hEId1) { isEdgeVertex1 = true; } } if (lId1 != lId2) { System.Diagnostics.Debug.Assert(uLId1 != uLId2); System.Diagnostics.Debug.Assert(!isEdgeVertex1 && !isEdgeVertex2); uint newLId; if (lId1 != 0) { if (lId2 == 0) { newLId = 0; } else { newLId = lId1; } } else { newLId = 0; } { uint uLId = uLId1; UseLoop uL = BRep.GetUseLoop(uLId); uLId = uL.ParentULId; while (true) { if (uLId == 0) { break; } BRep.SetUseLoopLoopId(uLId, newLId); System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId)); UseLoop tmpUL = BRep.GetUseLoop(uLId); uLId = tmpUL.ChildULId; } } { uint uLId = uLId2; UseLoop uL = BRep.GetUseLoop(uLId); uLId = uL.ParentULId; while (true) { if (uLId == 0) { break; } BRep.SetUseLoopLoopId(uLId, newLId); System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId)); UseLoop tmpUL = BRep.GetUseLoop(uLId); uLId = tmpUL.ChildULId; } } if (lId1 != 0) { if (!BRep.KEL(hEId1)) { System.Diagnostics.Debug.Assert(false); } if (lId2 == 0) { Loop2UseLoop.Remove(lId1); } else { Loop2UseLoop.Remove(lId1); Loop2UseLoop.Remove(lId2); System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId1)); UseLoop uL = BRep.GetUseLoop(uLId1); System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uL.ParentULId)); Loop2UseLoop.Add(lId1, uL.ParentULId); } } else { System.Diagnostics.Debug.Assert(lId2 != 0); if (!BRep.KEL(hEId2)) { System.Diagnostics.Debug.Assert(false); } Loop2UseLoop.Remove(lId2); } Edge2HalfEdge.Remove(eId); System.Diagnostics.Debug.Assert(AssertValid()); return(true); } if (uLId1 == uLId2) { System.Diagnostics.Debug.Assert(lId1 == lId2); if (!isEdgeVertex1 && !isEdgeVertex2) { if (lId1 != 0) { uint addULId; if (!BRep.KEML(out addULId, hEId1)) { System.Diagnostics.Debug.Assert(false); } if (isDelCP) { System.Diagnostics.Debug.Assert(GetUseLoopType(addULId) == 2); if (!BRep.SwapUseLoop(addULId, uLId1)) { System.Diagnostics.Debug.Assert(false); } Loop2UseLoop[lId1] = addULId; } BRep.SetUseLoopLoopId(addULId, lId1); } else { uint addULId; if (!BRep.KEML(out addULId, hEId1)) { System.Diagnostics.Debug.Assert(false); } BRep.SetUseLoopLoopId(addULId, 0); } } else if (isEdgeVertex1 && isEdgeVertex2) { uint addULId; if (!BRep.KEMLTwoFloatingVertex(out addULId, hEId1)) { System.Diagnostics.Debug.Assert(false); } BRep.SetHalfEdgeEdgeId(hEId1, 0, true); BRep.SetHalfEdgeEdgeId(hEId2, 0, true); BRep.SetUseLoopLoopId(addULId, lId1); } else if (isEdgeVertex1 && !isEdgeVertex2) { uint id_ul_add; if (!BRep.KEMLOneFloatingVertex(out id_ul_add, hEId1)) { System.Diagnostics.Debug.Assert(false); } BRep.SetUseLoopLoopId(id_ul_add, lId1); } else if (isEdgeVertex2 && !isEdgeVertex1) { uint id_ul_add; if (!BRep.KEMLOneFloatingVertex(out id_ul_add, hEId2)) { System.Diagnostics.Debug.Assert(false); } BRep.SetUseLoopLoopId(id_ul_add, lId1); } Edge2HalfEdge.Remove(eId); System.Diagnostics.Debug.Assert(AssertValid()); return(true); } return(false); }