def face_normal(face): from OCCT.BRepTools import breptools_UVBounds umin, umax, vmin, vmax = breptools_UVBounds(face) surf = BRep_Tool().Surface(face) props = GeomLProp_SLProps(surf, (umin+umax)/2., (vmin+vmax)/2., 1, TOLERANCE) norm = props.Normal() if face.Orientation() == TopAbs_REVERSED: norm.Reverse() return norm
def radius_at_uv(face, u, v): ''' returns the mean radius at a u,v coordinate @param face: surface input @param u,v: u,v coordinate ''' h_srf = BRep_Tool().Surface(face) #uv_domain = GeomLProp_SurfaceTool().Bounds(h_srf) curvature = GeomLProp_SLProps(h_srf, u, v, 1, 1e-6) try: _crv_min = 1. / curvature.MinCurvature() except ZeroDivisionError: _crv_min = 0. try: _crv_max = 1. / curvature.MaxCurvature() except ZeroDivisionError: _crv_max = 0. return abs((_crv_min + _crv_max) / 2.)
def curvature(self, u, v): '''returns the curvature at the u parameter the curvature object can be returned too using curvatureType == curvatureType curvatureTypes are: gaussian minimum maximum mean curvatureType ''' if not self._curvature_initiated: self._curvature = GeomLProp_SLProps(self.instance.surface_handle, u, v, 2, 1e-7) _domain = self.instance.domain() if u in _domain or v in _domain: print('<<<CORRECTING DOMAIN...>>>') div = 1000 delta_u, delta_v = (_domain[0] - _domain[1]) / div, ( _domain[2] - _domain[3]) / div if u in _domain: low, hi = u - _domain[0], u - _domain[1] if low < hi: u = u - delta_u else: u = u + delta_u if v in _domain: low, hi = v - _domain[2], v - _domain[3] if low < hi: v = v - delta_v else: v = v + delta_v self._curvature.SetParameters(u, v) self._curvature_initiated = True return self._curvature
class DiffGeomSurface(object): def __init__(self, instance): self.instance = instance self._curvature = None self._curvature_initiated = False def curvature(self, u, v): '''returns the curvature at the u parameter the curvature object can be returned too using curvatureType == curvatureType curvatureTypes are: gaussian minimum maximum mean curvatureType ''' if not self._curvature_initiated: self._curvature = GeomLProp_SLProps(self.instance.surface_handle, u, v, 2, 1e-7) _domain = self.instance.domain() if u in _domain or v in _domain: print('<<<CORRECTING DOMAIN...>>>') div = 1000 delta_u, delta_v = (_domain[0] - _domain[1]) / div, ( _domain[2] - _domain[3]) / div if u in _domain: low, hi = u - _domain[0], u - _domain[1] if low < hi: u = u - delta_u else: u = u + delta_u if v in _domain: low, hi = v - _domain[2], v - _domain[3] if low < hi: v = v - delta_v else: v = v + delta_v self._curvature.SetParameters(u, v) self._curvature_initiated = True return self._curvature def gaussian_curvature(self, u, v): return self.curvature(u, v).GaussianCurvature() def min_curvature(self, u, v): return self.curvature(u, v).MinCurvature() def mean_curvature(self, u, v): return self.curvature(u, v).MeanCurvature() def max_curvature(self, u, v): return self.curvature(u, v).MaxCurvature() def normal(self, u, v): # TODO: should make this return a gp_Vec curv = self.curvature(u, v) if curv.IsNormalDefined(): return curv.Normal() else: raise ValueError('normal is not defined at u,v: {0}, {1}'.format( u, v)) def tangent(self, u, v): dU, dV = gp_Dir(), gp_Dir() curv = self.curvature(u, v) if curv.IsTangentUDefined() and curv.IsTangentVDefined(): curv.TangentU(dU), curv.TangentV(dV) return dU, dV else: return None, None def radius(self, u, v): '''returns the radius at u ''' # TODO: SHOULD WE RETURN A SIGNED RADIUS? ( get rid of abs() )? try: _crv_min = 1. / self.min_curvature(u, v) except ZeroDivisionError: _crv_min = 0. try: _crv_max = 1. / self.max_curvature(u, v) except ZeroDivisionError: _crv_max = 0. return abs((_crv_min + _crv_max) / 2.)