def findEdge(f,x,y): u"""Шукає ребро поверхні f за точкою на ньому Повертає кортеж першої і останньої точок ребер: x1,y1,x2,y2""" from OCC.BRep import BRep_Tool_Curve from OCC.GeomAdaptor import GeomAdaptor_Curve from OCC.GeomLib import GeomLib_Tool_Parameter px=gp_Pnt(x,y,0) #display.DisplayShape(px, color='black') ex = TopExp_Explorer(f, TopAbs_EDGE) # перглядач ребер while ex.More(): e = topods_Edge(ex.Current()) # поточне ребро c=BRep_Tool_Curve(e) #! зверніть увагу, що результат є кортежом gac=GeomAdaptor_Curve(c[0],c[1],c[2]) # крива (OCC.Geom.Handle_Geom_Curve), перший параметр, другий параметр #tp=gac.GetType() # тип кривої 0 - лінія, 1 - коло, ... #print type(gac.Line()) # OCC.gp.gp_Lin #p = gp_Pnt() #gac.D0((c[1]+c[2])/2.0, p) # p - середня точка кривої #display.DisplayShape(p, color='black') #gac.Line().Contains(px,1e-9) # чи лінія містить точку res=GeomLib_Tool_Parameter(c[0],px,1e-9) # ! зверніть увагу, що # результат є кортежом. Це не відповідає документації. if res[0] and res[1]>=c[1] and res[1]<=c[2]: # якщо точка на кривій в заданих межах параметрів p1=gac.Value(c[1]) # перша точка кривої p2=gac.Value(c[2]) # остання точка кривої #display.DisplayShape(p1, color='black') #display.DisplayShape(p2, color='black') return p1.X(),p1.Y(),p2.X(),p2.Y() ex.Next() return None
def Uniform_Points_on_Curve(curve, NPoints): """Returns a list of uniformly spaced points on a curve Parameters ---------- crv : OCC.Geom curve type NPoints : int number of sampling points along the curve""" try: adapt = GeomAdaptor_Curve(curve) except: # Allow the algorithm to deal with TopoDS_Edge and Wire shapes: adapt = BRepAdaptor_Curve(curve) absc = GCPnts_UniformAbscissa(adapt, NPoints) return [adapt.Value(absc.Parameter(i)) for i in range(1, NPoints + 1)]
def to_adaptor_3d(curveType): ''' abstract curve like type into an adaptor3d @param curveType: ''' if isinstance(curveType, TopoDS_Wire): return BRepAdaptor_CompCurve(curveType) elif isinstance(curveType, TopoDS_Edge): return BRepAdaptor_Curve(curveType) elif issubclass(curveType.__class__, Geom_Curve): return GeomAdaptor_Curve(curveType.GetHandle()) elif hasattr(curveType, 'GetObject'): _crv = curveType.GetObject() if issubclass(_crv.__class__, Geom_Curve): return GeomAdaptor_Curve(curveType) else: raise TypeError( 'allowed types are Wire, Edge or a subclass of Geom_Curve\nGot a %s' % (curveType.__class__))