def normalAt(self, locationVector=None): """ Computes the normal vector at the desired location on the face. :returns: a vector representing the direction :param locationVector: the location to compute the normal at. If none, the center of the face is used. :type locationVector: a vector that lies on the surface. """ # get the geometry surface = self._geomAdaptor() if locationVector is None: u0, u1, v0, v1 = self._uvBounds() u = 0.5 * (u0 + u1) v = 0.5 * (v0 + v1) else: # project point on surface projector = GeomAPI_ProjectPointOnSurf(locationVector.toPnt(), surface) u, v = projector.LowerDistanceParameters() p = gp_Pnt() vn = gp_Vec() BRepGProp_Face(self.wrapped).Normal(u, v, p, vn) return Vector(vn)
def project_vertex(self, pnt, tol=TOLERANCE) -> gp_Pnt: """projects self with a point, curve, edge, face, solid method wraps dealing with the various topologies if other is a point: returns uv, point """ if isinstance(pnt, TopoDS_Vertex): pnt = BRep_Tool.Pnt(pnt) proj = GeomAPI_ProjectPointOnSurf(pnt, self.surface_handle, tol) # uv = proj.LowerDistanceParameters() proj_pnt = proj.NearestPoint() return proj_pnt
def project_vertex( self, other ): '''projects self with a point, curve, edge, face, solid method wraps dealing with the various topologies if other is a point: returns uv, point ''' if isinstance(other, TopoDS_Face): raise AssertionError, 'Cannot project a face on another face' elif isinstance(other, TopoDS_Vertex): pt = BRep_Tool.Pnt(other) proj = GeomAPI_ProjectPointOnSurf(pt, self.surface_handle) # SHOULD USE THIS!!! #proj.LowerDistanceParameters() ext = proj.Extrema() for i in range(ext.NbExt()): if proj.Point().Coord() == ext.Point(i).Value().Coord(): result = ext.Point(i) uv = result.Parameter() pt = result.Value() return uv, pt