def __init__(self, shape_1, shape_2): dist_shape_shape = BRepExtrema_DistShapeShape(shape_1, shape_2) dist_shape_shape.Perform() with AssertIsDone(dist_shape_shape, 'Failed computing minimum distances'): self._min_dist = dist_shape_shape.Value() self._points_pairs = list() self._nb_solutions = dist_shape_shape.NbSolution() for i in range(1, dist_shape_shape.NbSolution() + 1): self._points_pairs.append((dist_shape_shape.PointOnShape1(i), dist_shape_shape.PointOnShape2(i)))
def intersect_edge_with_edge(occedge1, occedge2, tolerance=1e-06): """ This function intersects two OCCedges and obtain a list of intersection points. Parameters ---------- occedge1 : OCCedge The first edge to be intersected. occedge2 : OCCedge The second edge to be intersected. tolerance : float, optional The minimum distance between the two edges to determine if the edges are intersecting, Default = 1e-06. Returns ------- list of intersection points : pyptlist The list of points where the two edges intersect. """ interpyptlist = [] dss = BRepExtrema_DistShapeShape(occedge1, occedge2) dss.SetDeflection(tolerance) dss.Perform() min_dist = dss.Value() if min_dist < tolerance: npts = dss.NbSolution() for i in range(npts): gppt = dss.PointOnShape1(i + 1) pypt = (gppt.X(), gppt.Y(), gppt.Z()) interpyptlist.append(pypt) return interpyptlist
def project_shape_on_shape(occtopo_proj, occtopo_projon, tolerance=1e-06): """ This function project the occtopoproj (OCCtopology) onto the occtopoprojon (OCCtopology), and returns the list of projected points. Parameters ---------- occtopo_proj : OCCtopology The OCCtopology to to project. OCCtopology includes: OCCshape, OCCcompound, OCCcompsolid, OCCsolid, OCCshell, OCCface, OCCwire, OCCedge, OCCvertex occtopo_projon : OCCtopology The OCCtopology to be projected on. OCCtopology includes: OCCshape, OCCcompound, OCCcompsolid, OCCsolid, OCCshell, OCCface, OCCwire, OCCedge, OCCvertex tolerance : float, optional The precision of the projection, Default = 1e-06. Returns ------- list of projected points : pyptlist The list of projected points. """ interpyptlist = [] dss = BRepExtrema_DistShapeShape(occtopo_proj, occtopo_projon) dss.SetDeflection(tolerance) dss.Perform() min_dist = dss.Value() npts = dss.NbSolution() for i in range(npts): gppt = dss.PointOnShape2(i + 1) pypt = (gppt.X(), gppt.Y(), gppt.Z()) interpyptlist.append(pypt) return interpyptlist
def compute_minimal_distance_between_circles(): """ compute the minimal distance between 2 circles here the minimal distance overlaps the intersection of the circles the points are rendered to indicate the locations """ # required for precise rendering of the circles display.Context.SetDeviationCoefficient(0.0001) L = gp_Pnt(4, 10, 0) M = gp_Pnt(10, 16, 0) Laxis = gp_Ax2() Maxis = gp_Ax2() Laxis.SetLocation(L) Maxis.SetLocation(M) r1 = 12.0 r2 = 15.0 Lcircle = gp_Circ(Laxis, r1) Mcircle = gp_Circ(Maxis, r2) l_circle, m_circle = make_edge(Lcircle), make_edge(Mcircle) display.DisplayShape((l_circle, m_circle)) # compute the minimal distance between 2 circles # the minimal distance here matches the intersection of the circles dss = BRepExtrema_DistShapeShape(l_circle, m_circle) print("intersection parameters on l_circle:", [dss.ParOnEdgeS1(i) for i in range(1, dss.NbSolution() + 1)]) print("intersection parameters on m_circle:", [dss.ParOnEdgeS2(i) for i in range(1, dss.NbSolution() + 1)]) for i in range(1, dss.NbSolution() + 1): pnt = dss.PointOnShape1(i) display.DisplayShape(make_vertex(pnt))
def intersect_edge_with_edge(occedge1, occedge2, tolerance=1e-06): interpyptlist = [] dss = BRepExtrema_DistShapeShape(occedge1, occedge2) dss.SetDeflection(tolerance) dss.Perform() min_dist = dss.Value() if min_dist < tolerance: npts = dss.NbSolution() for i in range(npts): gppt = dss.PointOnShape1(i + 1) pypt = (gppt.X(), gppt.Y(), gppt.Z()) interpyptlist.append(pypt) return interpyptlist
def nearest_vertex(edge1, edge2): # v11 = topexp.FirstVertex(edge1) # v12 = topexp.LastVertex(edge1) lut = types_lut.brep_extrema_lut bdss = BRepExtrema_DistShapeShape(edge1, edge2) bdss.Perform() with assert_isdone(bdss, 'failed computing minimum distances'): for i in range(1, bdss.NbSolution() + 1): if ['vertex', 'vertex'] == [ lut[bdss.SupportTypeShape1(i)], lut[bdss.SupportTypeShape2(i)] ]: return topods.Vertex(bdss.SupportOnShape1(i)), \ topods.Vertex(bdss.SupportOnShape2(i))
def minimum_distance(shp1, shp2): """ compute minimum distance between 2 BREP's @param shp1: any TopoDS_* @param shp2: any TopoDS_* @return: minimum distance, minimum distance points on shp1 minimum distance points on shp2 """ bdss = BRepExtrema_DistShapeShape(shp1, shp2) bdss.Perform() with assert_isdone(bdss, 'failed computing minimum distances'): min_dist = bdss.Value() min_dist_shp1, min_dist_shp2 = [], [] for i in range(1, bdss.NbSolution() + 1): min_dist_shp1.append(bdss.PointOnShape1(i)) min_dist_shp2.append(bdss.PointOnShape2(i)) return min_dist, min_dist_shp1, min_dist_shp2
def project_shape_on_shape(occshape1, occshape2, tolerance=1e-06): ''' occshape1: shape to project type: occshape occshape2: shape to be projected on type: occshape tolerance: precision of the projection type: float ''' interpyptlist = [] dss = BRepExtrema_DistShapeShape(occshape1, occshape2) dss.SetDeflection(tolerance) dss.Perform() min_dist = dss.Value() npts = dss.NbSolution() for i in range(npts): gppt = dss.PointOnShape2(i + 1) pypt = (gppt.X(), gppt.Y(), gppt.Z()) interpyptlist.append(pypt) return interpyptlist