Example #1
0
    def execute(self, obj):
        self.Surf = self.getSurface(obj)
        pts =  self.getPoints(obj)

        self.cleanpts = []
        for p in pts:
            if not p in self.cleanpts:
                self.cleanpts.append(p)

    #static char* kwds_Parameter[] = {"Surface","Points","Curves","Degree",
        #"NbPtsOnCur","NbIter","Tol2d","Tol3d","TolAng","TolCurv","Anisotropie",NULL};

    #PyObject* surface = 0;
    #PyObject* points = 0;
    #PyObject* curves = 0;
    #int Degree = 3;
    #int NbPtsOnCur = 10;
    #int NbIter = 3;
    #double Tol2d = 0.00001;
    #double Tol3d = 0.0001;
    #double TolAng = 0.01;
    #double TolCurv = 0.1;
    #PyObject* Anisotropie = Py_False;

        if self.Surf:
            debug("Found surface : %s"%str(self.Surf))
            self.plate = Part.PlateSurface( Surface = self.Surf, Points = self.cleanpts, Degree = obj.PlateDegree, NbIter = obj.Iterations, Tol2d = obj.Tol2d, Tol3d = obj.Tol3d)# TolAng = obj.TolAngular, TolCurv = obj.TolCurvature, Anisotropie = obj.Anisotropie
            #self.plate = Part.PlateSurface( Surface = self.Surf, Points = self.cleanpts)
        elif self.cleanpts:
            debug("No surface")
            self.plate = Part.PlateSurface( Points = self.cleanpts, Degree = obj.PlateDegree, NbIter = obj.Iterations) #, Tol2d = obj.Tol2d) #, Tol3d = obj.Tol3d) #, TolAng = obj.TolAngular, TolCurv = obj.TolCurvature, Anisotropie = obj.Anisotropie)
        #"Tol3d","MaxSegments","MaxDegree","MaxDistance","CritOrder","Continuity","EnlargeCoeff"
        debug("makeApprox")
        self.su = self.plate.makeApprox( Tol3d = obj.Tolerance, MaxSegments = obj.MaxSegments, MaxDegree = obj.MaxDegree, MaxDistance = obj.MaxDistance, CritOrder = obj.CritOrder, Continuity = obj.Continuity, EnlargeCoeff = obj.EnlargeCoeff)
        sh = self.su.toShape()
        obj.Shape = sh

        return
Example #2
0
    def execute(self, obj):
        r1 = self.getShape(linkSubList_convertToOldStyle(
            obj.Rails)[0]).discretize(Number=obj.RailPoints)
        r2 = self.getShape(linkSubList_convertToOldStyle(
            obj.Rails)[1]).discretize(Number=obj.RailPoints)  #[::-1]
        d1 = Part.LineSegment(r1[0], r2[0]).toShape()
        d2 = Part.LineSegment(r1[-1], r2[-1]).toShape()
        d3 = Part.LineSegment(r1[0], r2[-1]).toShape()
        d4 = Part.LineSegment(r1[-1], r2[0]).toShape()
        distToShape1 = abs(d1.distToShape(d2)[0])
        distToShape2 = abs(d3.distToShape(d4)[0])
        if distToShape1 < distToShape2:
            r2 = r2[::-1]
        bs1 = Part.BSplineCurve()
        bs2 = Part.BSplineCurve()
        bs1.approximate(
            Points=r1, DegMin=1, DegMax=5,
            Continuity='C1')  #, LengthWeight = 1.0, CurvatureWeight = 1.0 )
        bs2.approximate(
            Points=r2, DegMin=1, DegMax=5,
            Continuity='C1')  #, LengthWeight = 1.0, CurvatureWeight = 1.0 )
        Surf = bs1.makeRuledSurface(bs2)
        Surf.increaseDegree(5, 5)
        #Part.show(Surf.toShape())
        #RuledSurface = FreeCAD.ActiveDocument.addObject('Part::RuledSurface', 'Ruled Surface')
        #RuledSurface.Curve1=(obj.Rails[0])
        #RuledSurface.Curve2=(obj.Rails[1])
        #App.ActiveDocument.recompute()
        #Surf = RuledSurface.Shape.Surface
        #return
        pts = []
        pts += r1
        pts += r2

        for pro in linkSubList_convertToOldStyle(obj.Profiles):
            sh = self.getShape(pro)
            if sh.Orientation == 'Reversed':
                pts += sh.discretize(Number=obj.ProfilePoints)  #[::-1]
            else:
                pts += sh.discretize(Number=obj.ProfilePoints)

        cleanpts = []
        for p in pts:
            if not p in cleanpts:
                cleanpts.append(p)

    #static char* kwds_Parameter[] = {"Surface","Points","Curves","Degree",
    #"NbPtsOnCur","NbIter","Tol2d","Tol3d","TolAng","TolCurv","Anisotropie",NULL};

    #PyObject* surface = 0;
    #PyObject* points = 0;
    #PyObject* curves = 0;
    #int Degree = 3;
    #int NbPtsOnCur = 10;
    #int NbIter = 3;
    #double Tol2d = 0.00001;
    #double Tol3d = 0.0001;
    #double TolAng = 0.01;
    #double TolCurv = 0.1;
    #PyObject* Anisotropie = Py_False;

        plate = Part.PlateSurface(Surface=Surf,
                                  Points=cleanpts,
                                  Degree=3,
                                  NbIter=obj.Iterations)
        #"Tol3d","MaxSegments","MaxDegree","MaxDistance","CritOrder","Continuity","EnlargeCoeff"
        su = plate.makeApprox(MaxSegments=obj.Segments,
                              MaxDegree=obj.Degree,
                              EnlargeCoeff=1.0)  #Continuity = 'C2',
        sh = su.toShape()
        obj.Shape = sh

        #App.ActiveDocument.removeObject(RuledSurface.Name)

        errors = []
        for p in cleanpts:
            errors.append(sh.distToShape(Part.Vertex(p))[0])
        maxError = max(errors)
        print("\n\nMax Error : " + str(maxError))
        obj.MaxError = maxError

        #App.ActiveDocument.recompute()

        return