Ejemplo n.º 1
0
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)]
Ejemplo n.º 3
0
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__))