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
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