public static SurfacePoint _FindTrimSurfacePoint(this BrepVertex v, BrepFace face) { foreach (var loop in face.Loops_ThreadSafe()) { foreach (var trim in loop.Trims_ThreadSafe()) { if (trim.Edge != null) { var indexStart = trim.Edge._GetStartVertex().VertexIndex; var indexEnd = trim.Edge._GetEndVertex().VertexIndex; if (v.VertexIndex == indexStart || v.VertexIndex == indexEnd) { var trimStartPoint = face.PointAt(trim.PointAtStart.X, trim.PointAtStart.Y); var trimEndPoint = face.PointAt(trim.PointAtEnd.X, trim.PointAtEnd.Y); if (v.Location._DistanceTo(trimStartPoint) < v.Location._DistanceTo(trimEndPoint)) { return(new SurfacePoint(trim.PointAtStart)); } else { return(new SurfacePoint(trim.PointAtEnd)); } } } } } throw new Exception("Cannot find UV for BrepVertex (in method _BrepVertex._ToSurfacePoint)"); }
/// <summary> /// Finds vertex relation to edges /// </summary> /// <param name="v">tested vertex</param> /// <param name="face"></param> /// <returns>Relation to edges or null if this vertex doesnt belong to any edge</returns> public static BrepVertexToTrimsRelation _FindRelationsToCrvs(this BrepVertex v, BrepFace face) { BrepVertexToTrimsRelation res = null; var p = v.Location; foreach (var loop in face.Loops_ThreadSafe()) { foreach (var trim in loop.Trims_ThreadSafe()) { if (trim.Edge != null) { var indexStart = trim.Edge._GetStartVertex().VertexIndex; var indexEnd = trim.Edge._GetEndVertex().VertexIndex; if (v.VertexIndex == indexStart || v.VertexIndex == indexEnd) { //var distToEdgesStart = trim.Edge.StartVertex.Location.DistanceTo(p); //var distToEdgesEnd = trim.Edge.EndVertex.Location.DistanceTo(p); var distToEdgesStart = trim.Edge.PointAt(trim.Edge.Domain.T0)._DistanceTo(p); var distToEdgesEnd = trim.Edge.PointAt(trim.Edge.Domain.T1)._DistanceTo(p); var trimStartPoint2d = new Point2d(trim.PointAtStart.X, trim.PointAtStart.Y); var trimEndPoint2d = new Point2d(trim.PointAtEnd.X, trim.PointAtEnd.Y); var trimStartPoint3d = face.PointAt(trimStartPoint2d.X, trimStartPoint2d.Y); var trimEndPoint3d = face.PointAt(trimEndPoint2d.X, trimEndPoint2d.Y); var sameDirection = trim._IsSameDirectionToEdge(); if (!sameDirection) { var tmp2d = trimStartPoint2d; trimStartPoint2d = trimEndPoint2d; trimEndPoint2d = tmp2d; var tmp3d = trimStartPoint3d; trimStartPoint3d = trimEndPoint3d; trimEndPoint3d = tmp3d; } var distToTrimsStart = trimStartPoint3d._DistanceTo(p); var distToTrimsEnd = trimEndPoint3d._DistanceTo(p); if (res == null) { res = new BrepVertexToTrimsRelation(v.VertexIndex, v.Location); } res.Edges.Add(trim.Edge); res.EdgesPoints.Add(trim.Edge.PointAt(distToEdgesStart < distToEdgesEnd ? trim.Edge.Domain.T0 : trim.Edge.Domain.T1)); if (v.VertexIndex == indexStart) { if (distToTrimsStart < res.minDeviationToTrims) { res.closestTrimPoint2d = new SurfacePoint(trimStartPoint2d); } res.minDeviationToEdges = Math.Min(distToEdgesStart, res.minDeviationToEdges); res.maxDeviationToEdges = Math.Max(distToEdgesStart, res.maxDeviationToEdges); res.minDeviationToTrims = Math.Min(distToTrimsStart, res.minDeviationToTrims); res.maxDeviationToTrims = Math.Max(distToTrimsStart, res.maxDeviationToTrims); } if (v.VertexIndex == indexEnd) { if (distToTrimsEnd < res.minDeviationToTrims) { res.closestTrimPoint2d = new SurfacePoint(trimEndPoint2d); } res.minDeviationToEdges = Math.Min(distToEdgesEnd, res.minDeviationToEdges); res.maxDeviationToEdges = Math.Max(distToEdgesEnd, res.maxDeviationToEdges); res.minDeviationToTrims = Math.Min(distToTrimsEnd, res.minDeviationToTrims); res.maxDeviationToTrims = Math.Max(distToTrimsEnd, res.maxDeviationToTrims); } } } } } if (res == null) { //throw new Exception("Cannot find relation for BrepVertex to Crvs (in method _BrepVertex._FindRelationsToCrvs)"); } return(res); }
public static ComponentProblem Add(ref ComponentProblems problems, BrepVertex vertex, string problem, ComponentProblemTypes type, object data = null) { var componentReal = new ComponentIndex(ComponentIndexType.BrepVertex, vertex.VertexIndex); return(Add(ref problems, componentReal, componentReal, problem, type, data)); }
public static SurfacePoint _VertexToSurfacePoint(this BrepFace face, BrepVertex v) { return(v._FindTrimSurfacePoint(face)); }