public bool RemoveVertex(uint vId) { uint uVId = vId; if (!BRep.IsUseVertexId(uVId)) { return(false); } uint nEdgeAroundVtx = 0; { VertexEdgeItr vItr = new VertexEdgeItr(this, vId); nEdgeAroundVtx = vItr.GetEdgeCount(); } if (nEdgeAroundVtx == 0) { System.Diagnostics.Debug.Assert(BRep.IsUseVertexId(uVId)); if (!BRep.KVEL(uVId)) { System.Diagnostics.Debug.Assert(false); } } else if (nEdgeAroundVtx == 2) { UseVertex uV = BRep.GetUseVertex(uVId); uint hEId1 = uV.HEId; HalfEdge hE1 = BRep.GetHalfEdge(hEId1); uint eId1 = hE1.EId; uint hEId2 = hE1.OHEId; HalfEdge hE2 = BRep.GetHalfEdge(hEId2); { uint uLId1 = hE1.ULId; uint uLId2 = hE2.ULId; LoopEdgeItr lItr1 = new LoopEdgeItr(this, hEId1, uLId1); LoopEdgeItr lItr2 = new LoopEdgeItr(this, hEId2, uLId2); uint nLV1 = lItr1.GetUseLoopVertexCount(); uint nLV2 = lItr2.GetUseLoopVertexCount(); System.Diagnostics.Debug.Assert(nLV1 > 1 && nLV2 > 1); if (nLV1 == 2 || nLV2 == 2) { return(false); } } uint uVId2 = hE2.UVId; System.Diagnostics.Debug.Assert(BRep.IsUseVertexId(uVId2)); uint removeHEId1 = hEId1; if (!BRep.KVE(removeHEId1)) { System.Diagnostics.Debug.Assert(false); } System.Diagnostics.Debug.Assert(BRep.AssertValidUse() == 0); Edge2HalfEdge.Remove(eId1); } System.Diagnostics.Debug.Assert(AssertValid()); return(true); }
public bool MoveVertex(uint vId, OpenTK.Vector2d vec) { if (!VertexArray.IsObjectId(vId)) { return(false); } OpenTK.Vector2d preVec; { // store point to move point back in case it fails Vertex2D vertex = VertexArray.GetObject(vId); preVec = vertex.Point; } OpenTK.Vector2d dist = vec; { // move point Vertex2D vertex = VertexArray.GetObject(vId); vertex.Point = dist; } try { VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(vId); if (vItr.GetEdgeCount() == 0) { // move point inside loop uint lId = vItr.GetLoopId(); if (IsElementId(CadElementType.Loop, lId)) { // ignore vtx(id_v) in the signd distance computation double distance = SignedDistancePointLoop(lId, vec, vId); if (distance < this.MinClearance) { throw new InvalidOperationException(); } } } else { // move point adjacent to loop HashSet <uint> lIds = new HashSet <uint>(); for (; !vItr.IsEnd(); vItr++) { uint lId = vItr.GetLoopId(); if (IsElementId(CadElementType.Loop, lId)) { if (!lIds.Contains(lId)) { lIds.Add(lId); } else { continue; } if (CheckLoop(lId) != 0) { throw new InvalidOperationException(); } } } } } catch (Exception exception) { //////////////////////////////// // fail { // reset the moved point Vertex2D vertex = VertexArray.GetObject(vId); vertex.Point = preVec; } return(false); } return(true); }