public bool IsElementId(CadElementType type, uint id) { if (type == CadElementType.Vertex) { return(BRep.IsUseVertexId(id)); } else if (type == CadElementType.Edge) { return(Edge2HalfEdge.ContainsKey(id)); } else if (type == CadElementType.Loop) { return(Loop2UseLoop.ContainsKey(id)); } return(false); }
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 uint AddVertexToLoop(uint lId) { uint uLId = 0; { if (Loop2UseLoop.ContainsKey(lId)) { uLId = Loop2UseLoop[lId]; } } uint addUVId; uint addHEId; uint addULId; BRep.MVEL(out addUVId, out addHEId, out addULId, uLId); BRep.AssertValidUse(); BRep.SetUseLoopLoopId(addULId, lId); uint addVId = addUVId; BRep.SetUseVertexVertexId(addUVId, addVId); System.Diagnostics.Debug.Assert(AssertValid()); return(addVId); }
public ConnectVertexRes ConnectVertex(VertexEdgeItr vItr1, VertexEdgeItr vItr2, bool isLeftAddL) { ConnectVertexRes res = new ConnectVertexRes(); uint uVId1 = vItr1.GetUseVertexId(); uint uVId2 = vItr2.GetUseVertexId(); if (!BRep.IsUseVertexId(uVId1)) { return(res); } if (!BRep.IsUseVertexId(uVId2)) { return(res); } if (uVId1 == uVId2) { return(res); } res.VId1 = BRep.GetUseVertex(uVId1).VId; res.VId2 = BRep.GetUseVertex(uVId2).VId; if (vItr1.GetLoopId() != vItr2.GetLoopId()) { return(res); } uint lId = vItr1.GetLoopId(); res.LId = lId; uint hEId1 = vItr1.GetHalfEdgeId(); uint hEId2 = vItr2.GetHalfEdgeId(); uint uLId1; bool isFloat1; { System.Diagnostics.Debug.Assert(BRep.IsHalfEdgeId(hEId1)); HalfEdge hE1 = BRep.GetHalfEdge(hEId1); uLId1 = hE1.ULId; System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId1)); isFloat1 = (hE1.EId == 0); } uint uLId2; bool isFloat2; { System.Diagnostics.Debug.Assert(BRep.IsHalfEdgeId(hEId2)); HalfEdge hE2 = BRep.GetHalfEdge(hEId2); uLId2 = hE2.ULId; System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId2)); isFloat2 = (hE2.EId == 0); } if (uLId1 != uLId2) { if (isFloat1 && !isFloat2) { uint addHEId1; if (!BRep.MEKLOneFloatingVertex(out addHEId1, hEId2, hEId1)) { System.Diagnostics.Debug.Assert(false); } uint addEId = GetFreeKey(Edge2HalfEdge); BRep.SetHalfEdgeEdgeId(addHEId1, addEId, false); BRep.SetHalfEdgeEdgeId(hEId1, addEId, true); Edge2HalfEdge.Add(addEId, hEId1); System.Diagnostics.Debug.Assert(AssertValid()); res.AddEId = addEId; return(res); } else if (isFloat2 && !isFloat1) { uint addHEId1; if (!BRep.MEKLOneFloatingVertex(out addHEId1, hEId1, hEId2)) { System.Diagnostics.Debug.Assert(false); } uint addEId = GetFreeKey(Edge2HalfEdge); BRep.SetHalfEdgeEdgeId(addHEId1, addEId, true); BRep.SetHalfEdgeEdgeId(hEId2, addEId, false); Edge2HalfEdge.Add(addEId, addHEId1); System.Diagnostics.Debug.Assert(AssertValid()); res.AddEId = addEId; return(res); } else if (isFloat1 && isFloat2) { if (!BRep.MEKLTwoFloatingVertex(hEId1, hEId2)) { System.Diagnostics.Debug.Assert(false); } uint addEId = GetFreeKey(Edge2HalfEdge); BRep.SetHalfEdgeEdgeId(hEId1, addEId, true); BRep.SetHalfEdgeEdgeId(hEId2, addEId, false); Edge2HalfEdge.Add(addEId, hEId1); System.Diagnostics.Debug.Assert(AssertValid()); res.AddEId = addEId; return(res); } else { uint addHEId1; uint addHEId2; if (!BRep.MEKL(out addHEId1, out addHEId2, hEId1, hEId2)) { System.Diagnostics.Debug.Assert(false); } uint addEId = GetFreeKey(Edge2HalfEdge); BRep.SetHalfEdgeEdgeId(addHEId1, addEId, true); BRep.SetHalfEdgeEdgeId(addHEId2, addEId, false); Edge2HalfEdge.Add(addEId, addHEId1); if (lId != 0) { uint parentULId1 = BRep.GetUseLoop(uLId1).ParentULId; System.Diagnostics.Debug.Assert(parentULId1 != 0); System.Diagnostics.Debug.Assert(Loop2UseLoop.ContainsKey(lId)); Loop2UseLoop[lId] = parentULId1; } else { } System.Diagnostics.Debug.Assert(AssertValid()); res.AddEId = addEId; return(res); } } else if (uLId1 == uLId2) { uint addHEId1; uint addHEId2; uint addULId; if (!BRep.MEL(out addHEId1, out addHEId2, out addULId, hEId1, hEId2)) { System.Diagnostics.Debug.Assert(false); } System.Diagnostics.Debug.Assert(BRep.AssertValidUse() == 0); uint addEId = GetFreeKey(Edge2HalfEdge); BRep.SetHalfEdgeEdgeId(addHEId1, addEId, true); BRep.SetHalfEdgeEdgeId(addHEId2, addEId, false); Edge2HalfEdge.Add(addEId, addHEId1); bool iflag = true; if (lId == 0) { iflag = !isLeftAddL; } else { uint parentULId = Loop2UseLoop[lId]; if (uLId1 != parentULId) { if (isLeftAddL) { BRep.SwapUseLoop(addULId, uLId1); BRep.SetUseLoopLoopId(addULId, lId); BRep.AssertValidUse(); iflag = false; } else { } } else { } } uint addLId = GetFreeKey(Loop2UseLoop); if (iflag) { Loop2UseLoop.Add(addLId, addULId); BRep.SetUseLoopLoopId(addULId, addLId); } else { Loop2UseLoop.Add(addLId, uLId1); BRep.SetUseLoopLoopId(uLId1, addLId); } System.Diagnostics.Debug.Assert(AssertValid()); res.AddEId = addEId; res.AddLId = addLId; res.IsLeftAddL = !iflag; return(res); } System.Diagnostics.Debug.Assert(false); return(res); }
public bool AssertValid() { foreach (var pair in Loop2UseLoop) { uint lId = pair.Key; uint parentULId = pair.Value; System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(parentULId)); { UseLoop uL = BRep.GetUseLoop(parentULId); System.Diagnostics.Debug.Assert(uL.Id == parentULId); System.Diagnostics.Debug.Assert(uL.LId == lId); } System.Diagnostics.Debug.Assert(GetUseLoopType(parentULId) == 2); uint uLId = parentULId; while (true) { System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId)); UseLoop uL = BRep.GetUseLoop(uLId); System.Diagnostics.Debug.Assert(uL.Id == uLId); System.Diagnostics.Debug.Assert(uL.LId == lId); System.Diagnostics.Debug.Assert(uL.ParentULId == parentULId); uLId = uL.ChildULId; if (uLId == 0) { break; } } } foreach (var pair in Edge2HalfEdge) { uint hEId = pair.Value; System.Diagnostics.Debug.Assert(BRep.IsHalfEdgeId(hEId)); } IList <uint> uLIds = BRep.UseLoopArray.GetObjectIds(); for (int i = 0; i < uLIds.Count; i++) { uint uLId = uLIds[i]; System.Diagnostics.Debug.Assert(BRep.IsUseLoopId(uLId)); UseLoop uL = BRep.GetUseLoop(uLId); System.Diagnostics.Debug.Assert(uL.Id == uLId); uint lId = uL.LId; if (lId == 0) { System.Diagnostics.Debug.Assert(uL.ParentULId == 0); //2019-03-11 RemoveElement FIX //System.Diagnostics.Debug.Assert(uL.ChildULId == 0); continue; } System.Diagnostics.Debug.Assert(Loop2UseLoop.ContainsKey(lId)); } IList <uint> hEIds = BRep.HalfEdgeArray.GetObjectIds(); for (int i = 0; i < hEIds.Count; i++) { uint hEId = hEIds[i]; System.Diagnostics.Debug.Assert(BRep.IsHalfEdgeId(hEId)); HalfEdge hEdge = BRep.GetHalfEdge(hEId); System.Diagnostics.Debug.Assert(hEdge.Id == hEId); uint vId1; { uint uVId1 = hEdge.UVId; System.Diagnostics.Debug.Assert(BRep.IsUseVertexId(uVId1)); UseVertex uV = BRep.GetUseVertex(uVId1); System.Diagnostics.Debug.Assert(uV.Id == uVId1); vId1 = uV.VId; } uint vId2; { uint fHEId = hEdge.FHEId; System.Diagnostics.Debug.Assert(BRep.IsHalfEdgeId(fHEId)); HalfEdge cwEdge = BRep.GetHalfEdge(fHEId); System.Diagnostics.Debug.Assert(cwEdge.Id == fHEId); System.Diagnostics.Debug.Assert(cwEdge.BHEId == hEId); System.Diagnostics.Debug.Assert(cwEdge.ULId == hEdge.ULId); uint uvId2 = cwEdge.UVId; System.Diagnostics.Debug.Assert(BRep.IsUseVertexId(uvId2)); UseVertex uV = BRep.GetUseVertex(uvId2); System.Diagnostics.Debug.Assert(uV.Id == uvId2); vId2 = uV.VId; } bool isSameDir = hEdge.IsSameDir; uint eId = hEdge.EId; if (eId == 0) { System.Diagnostics.Debug.Assert(hEdge.OHEId == hEId); System.Diagnostics.Debug.Assert(hEdge.BHEId == hEId); System.Diagnostics.Debug.Assert(hEdge.FHEId == hEId); continue; } System.Diagnostics.Debug.Assert(Edge2HalfEdge.ContainsKey(eId)); uint sVId; uint eVId; GetEdgeVertexIds(eId, out sVId, out eVId); if (isSameDir) { System.Diagnostics.Debug.Assert(vId1 == sVId); System.Diagnostics.Debug.Assert(vId2 == eVId); } else { System.Diagnostics.Debug.Assert(vId1 == eVId); System.Diagnostics.Debug.Assert(vId2 == sVId); } } IList <uint> uVIds = BRep.UseVertexArray.GetObjectIds(); for (int i = 0; i < uVIds.Count; i++) { uint uVId = uVIds[i]; System.Diagnostics.Debug.Assert(BRep.IsUseVertexId(uVId)); UseVertex uV = BRep.GetUseVertex(uVId); System.Diagnostics.Debug.Assert(uV.Id == uVId); uint vId = uV.VId; System.Diagnostics.Debug.Assert(uVId == vId); } return(true); }