Esempio n. 1
0
 def buildCurves(self):
     for i in range(self.railSamples):
         t1 = self.cos1.firstParameter + (1.0 * i *
                                          self.paramRange(self.cos1) /
                                          (self.railSamples - 1))
         if not self.untwist:
             t2 = self.cos2.firstParameter + (1.0 * i *
                                              self.paramRange(self.cos2) /
                                              (self.railSamples - 1))
         else:
             t2 = self.cos2.lastParameter - (1.0 * i *
                                             self.paramRange(self.cos2) /
                                             (self.railSamples - 1))
         pt1 = self.cos1.valueAt(t1)
         pt2 = self.cos2.valueAt(t2)
         chord = pt2.sub(pt1).Length
         #    ip1 = cos1.tangentTo(t1,pt2)[0]
         #    ip2 = cos2.tangentTo(t2,pt1)[0]
         ip1 = self.cos1.binormalAt(t1)
         ip2 = self.cos2.binormalAt(t2)
         ip1.normalize().multiply(chord / 3.0)
         ip2.normalize().multiply(chord / 3.0)
         poles = [pt1, pt1.add(ip1), pt2.add(ip2), pt2]
         bz = Part.BezierCurve()
         bz.setPoles(poles)
         self.curves.append(bz)
Esempio n. 2
0
    def updateShape(self, pts):
        """Create shape for display during creation process."""
        import Part
        # Not quite right. draws 1 big bez. sb segmented
        edges = []

        if len(pts) >= 2:  # allow lower degree segment
            poles = pts[1:]
        else:
            poles = []

        if self.degree:
            segpoleslst = [poles[x:x+self.degree] for x in range(0, len(poles), (self.degree or 1))]
        else:
            segpoleslst = [pts]

        startpoint = pts[0]

        for segpoles in segpoleslst:
            c = Part.BezierCurve()  # last segment may have lower degree
            c.increase(len(segpoles))
            c.setPoles([startpoint] + segpoles)
            edges.append(Part.Edge(c))
            startpoint = segpoles[-1]
        w = Part.Wire(edges)
        return w
Esempio n. 3
0
    def createGeometry(self,fp):
        import Part
        plm = fp.Placement
        if fp.Points:
            startpoint=fp.Points[0]
            edges = []
            for segpoles in self._segpoleslst(fp):
#                if len(segpoles) == fp.Degree # would skip additional poles
                 c = Part.BezierCurve() #last segment may have lower degree
                 c.increase(len(segpoles))
                 c.setPoles([startpoint]+segpoles)
                 edges.append(Part.Edge(c))
                 startpoint = segpoles[-1]
            w = Part.Wire(edges)
            if fp.Closed and w.isClosed():
                try:
                    if hasattr(fp,"MakeFace"):
                        if fp.MakeFace:
                            w = Part.Face(w)
                    else:
                        w = Part.Face(w)
                except Part.OCCError:
                    pass
            fp.Shape = w
            if hasattr(fp,"Area") and hasattr(w,"Area"):
                fp.Area = w.Area
            if hasattr(fp,"Length") and hasattr(w,"Length"):
                fp.Length = w.Length            
        fp.Placement = plm
 def recompute(self):
     if (len(self.points) >= 2):
         if self.bezcurve: self.sep.removeChild(self.bezcurve)
         self.bezcurve = None
         ###            c =  Part.BSplineCurve()  #!!!!!!!!!!!!!!!
         c = Part.BezierCurve()
         # DNC: allows to close the curve by placing ends close to each other
         if (len(self.points) >= 3) and (
             (self.points[0] - self.points[-1]).Length < Draft.tolerance()):
             # YVH: Added a try to bypass some hazardous situations
             try:
                 ###                    c.interpolate(self.points[:-1], True)  #!!!!!!!!!!!!
                 c.setPoles(self.points[:-1])
             except Part.OCCError:
                 pass
         elif self.points:
             try:
                 ###                   c.interpolate(self.points, False)  #!!!!!!!
                 c.setPoles(self.points)
             except Part.OCCError:
                 pass
         c = c.toShape()  #???? c = Part.Edge(c)?, c = Part.Wire(c)??
         buf = c.writeInventor(2, 0.01)
         #fp=open("spline.iv","w")
         #fp.write(buf)
         #fp.close()
         try:
             ivin = coin.SoInput()
             ivin.setBuffer(buf)
             ivob = coin.SoDB.readAll(ivin)
         except:
             # workaround for pivy SoInput.setBuffer() bug
             import re
             buf = buf.replace("\n", "")
             pts = re.findall("point \[(.*?)\]", buf)[0]
             pts = pts.split(",")
             pc = []
             for p in pts:
                 v = p.strip().split()
                 pc.append([float(v[0]), float(v[1]), float(v[2])])
             coords = coin.SoCoordinate3()
             coords.point.setValues(0, len(pc), pc)
             line = coin.SoLineSet()
             line.numVertices.setValue(-1)
             self.bezcurve = coin.SoSeparator()
             self.bezcurve.addChild(coords)
             self.bezcurve.addChild(line)
             self.sep.addChild(self.bezcurve)
         else:
             if ivob and ivob.getNumChildren() > 1:
                 self.bezcurve = ivob.getChild(1).getChild(0)
                 self.bezcurve.removeChild(self.bezcurve.getChild(0))
                 self.bezcurve.removeChild(self.bezcurve.getChild(0))
                 self.sep.addChild(self.bezcurve)
             else:
                 FreeCAD.Console.PrintWarning(
                     "bezcurveTracker.recompute() failed to read-in Inventor string\n"
                 )
Esempio n. 5
0
    def recompute(self):
        """Recompute the tracker."""
        if self.bezcurve:
            for seg in self.bezcurve:
                self.sep.removeChild(seg)
                seg = None

        self.bezcurve = []

        if (len(self.points) >= 2):
            if self.degree:
                poles = self.points[1:]
                segpoleslst = [poles[x:x+self.degree] for x in range(0, len(poles), (self.degree or 1))]
            else:
                segpoleslst = [self.points]
            startpoint = self.points[0]

            for segpoles in segpoleslst:
                c = Part.BezierCurve()  # last segment may have lower degree
                c.increase(len(segpoles))
                c.setPoles([startpoint] + segpoles)
                c = c.toShape()
                startpoint = segpoles[-1]
                buf = c.writeInventor(2, 0.01)
            # fp=open("spline.iv", "w")
            # fp.write(buf)
            # fp.close()
                try:
                    ivin = coin.SoInput()
                    ivin.setBuffer(buf)
                    ivob = coin.SoDB.readAll(ivin)
                except Exception:
                    # workaround for pivy SoInput.setBuffer() bug
                    buf = buf.replace("\n","")
                    pts = re.findall("point \[(.*?)\]", buf)[0]
                    pts = pts.split(",")
                    pc = []
                    for p in pts:
                        v = p.strip().split()
                        pc.append([float(v[0]), float(v[1]), float(v[2])])
                    coords = coin.SoCoordinate3()
                    coords.point.setValues(0, len(pc), pc)
                    line = coin.SoLineSet()
                    line.numVertices.setValue(-1)
                    bezcurveseg = coin.SoSeparator()
                    bezcurveseg.addChild(coords)
                    bezcurveseg.addChild(line)
                    self.sep.addChild(bezcurveseg)
                else:
                    if ivob and ivob.getNumChildren() > 1:
                        bezcurveseg = ivob.getChild(1).getChild(0)
                        bezcurveseg.removeChild(bezcurveseg.getChild(0))
                        bezcurveseg.removeChild(bezcurveseg.getChild(0))
                        self.sep.addChild(bezcurveseg)
                    else:
                        FreeCAD.Console.PrintWarning("bezcurveTracker.recompute() failed to read-in Inventor string\n")
                self.bezcurve.append(bezcurveseg)
Esempio n. 6
0
 def curve(self, *points):
     """Add a Bezier curve from self.pos to points[-1]
     every other points are the control points of the Bezier curve (which
     will thus be of degree len(points) )
     """
     points = [Base.Vector(*rotate(p, self.theta)) for p in points]
     bz = Part.BezierCurve()
     bz.setPoles([self.pos] + points)
     self.wire.append(bz)
     self.pos = points[-1]
Esempio n. 7
0
 def __init__(self, edge = None):
     if edge == None:
         v1 = FreeCAD.Vector(0,0,0)
         v2 = FreeCAD.Vector(1,0,0)
         b = Part.BezierCurve()
         b.setPoles([v1,v2])
         self.curve = b
     elif isinstance(edge, Part.Edge):
         c = edge.Curve
         if isinstance(c, (Part.BezierCurve, Part.BSplineCurve)):
             self.curve = c
         else:
             bs = c.toBSpline()
             self.curve = bs
     elif isinstance(edge, (Part.BezierCurve, Part.BSplineCurve)):
         self.curve = edge
Esempio n. 8
0
    def execute(self, fp):

        self.scale1 = fp.Scale1 / 10.
        self.scale2 = fp.Scale2 / 10.

        self.cont1 = self.getContinuity(fp.Continuity1)
        self.cont2 = self.getContinuity(fp.Continuity2)

        self.reverse1 = fp.Reverse1
        self.reverse2 = fp.Reverse2
        self.blendDegree = 1 + self.cont1 + self.cont2

        self.initEdges(fp)

        #p0,p1 = self.curve1.FirstParameter, self.curve1.LastParameter
        self.param1 = self.curve1.FirstParameter + fp.Parameter1 * (
            self.curve1.LastParameter - self.curve1.FirstParameter)
        #p0,p1 = self.curve2.FirstParameter, self.curve2.LastParameter
        self.param2 = self.curve2.FirstParameter + fp.Parameter2 * (
            self.curve2.LastParameter - self.curve2.FirstParameter)

        self.blendPoles = self.computePoles(
        )  #[self.edge1.valueAt(self.param1),self.edge2.valueAt(self.param2)]

        self.blendCurve = Part.BezierCurve()
        self.blendCurve.increase(self.blendDegree)
        self.blendCurve.setPoles(self.blendPoles)

        b = self.blendCurve.toShape()
        edges = [b]

        if fp.AddCurves:
            c1 = self.curve1.copy()
            c1.segment(c1.FirstParameter, self.param1)
            e1 = c1.toShape()
            c2 = self.curve2.copy()
            c2.segment(c2.FirstParameter, self.param2)
            e2 = c2.toShape()
            edges += [e1, e2]

        if fp.ShowPoints:
            poly = []
            for e in edges:
                poly.append(Part.makePolygon(e.Curve.getPoles()))
            edges += poly
        fp.Shape = Part.Wire(edges)
Esempio n. 9
0
 def Activated(self):
     self.view = FreeCADGui.ActiveDocument.ActiveView
     self.viewer = self.view.getViewer()
     self.oldRadius = self.viewer.getPickRadius()
     self.viewer.setPickRadius(15.0)
     self.obj = FreeCAD.ActiveDocument.addObject("Part::Feature","BezierCurve")
     self.stack = [FreeCAD.Vector(0,0,0)]
     self.markerPos = None
     self.snap = False
     self.snapShape = None
     self.point = FreeCAD.Vector(0,0,0)
     self.curve = Part.BezierCurve()
     self.clicCB     = self.view.addEventCallbackPivy( coin.SoMouseButtonEvent.getClassTypeId(), self.clic_cb)
     self.keyboardCB = self.view.addEventCallbackPivy( coin.SoKeyboardEvent.getClassTypeId(), self.kb_cb)
     self.cursorCB   = self.view.addEventCallbackPivy( coin.SoLocation2Event.getClassTypeId(), self.cursor_cb)
     FreeCADGui.Selection.clearSelection()
     FreeCADGui.Selection.addObserver(self)
     self.nodeInit()
Esempio n. 10
0
 def Activated(self):
     s = FreeCADGui.Selection.getSelectionEx()
     f = selFilter.selFilter(s)
     edges = f.getEdgeShapes()
     vertexes = f.getVertexShapes()
     for i in range(0,len(vertexes)-1,2):
         pts = [vertexes[i].Point,vertexes[i+1].Point]
         bez = Part.BezierCurve()
         bez.setPoles(pts)
         print(bez)
         edges.append(bez.toShape())
     for e in edges:
         obj=FreeCAD.ActiveDocument.addObject("Part::FeaturePython","Spline") #add object to document
         makeSpline(obj,e)
         SplineVP(obj.ViewObject)
         obj.ViewObject.DisplayMode = "Poles"
     f.hideAll()
     FreeCAD.ActiveDocument.recompute()
Esempio n. 11
0
 def bezier(self, points):
     curve = Part.BezierCurve()
     curve.setPoles([self.vector(coordinates) for coordinates in points])
     self.components.append(curve)
     self.current_position = points[-1]
Esempio n. 12
0
def make_bezcurve(pointslist,
                  closed=False, placement=None, face=None, support=None,
                  degree=None):
    """make_bezcurve(pointslist, [closed], [placement])
    
    Creates a Bezier Curve object from the given list of vectors.
    
    Parameters
    ----------
    pointlist : [Base.Vector]
        List of points to create the polyline.
        Instead of a pointslist, you can also pass a Part Wire.
        TODO: Change the name so!

    closed : bool
        If closed is True or first and last points are identical, 
        the created BSpline will be closed.

    placement : Base.Placement
        If a placement is given, it is used.
    
    face : Bool
        If face is False, the rectangle is shown as a wireframe, 
        otherwise as a face.   

    support : 
        TODO: Describe
    
    degree : int
        Degree of the BezCurve
    """
    if not App.ActiveDocument:
        App.Console.PrintError("No active document. Aborting\n")
        return
    if not isinstance(pointslist,list):
        nlist = []
        for v in pointslist.Vertexes:
            nlist.append(v.Point)
        pointslist = nlist
    if placement:
        utils.type_check([(placement,App.Placement)], "make_bezcurve")
    if len(pointslist) == 2: fname = "Line"
    else: fname = "BezCurve"
    obj = App.ActiveDocument.addObject("Part::Part2DObjectPython",fname)
    BezCurve(obj)
    obj.Points = pointslist
    if degree:
        obj.Degree = degree
    else:
        import Part
        obj.Degree = min((len(pointslist)-(1 * (not closed))),
                         Part.BezierCurve().MaxDegree)
    obj.Closed = closed
    obj.Support = support
    if face != None:
        obj.MakeFace = face
    obj.Proxy.resetcontinuity(obj)
    if placement: obj.Placement = placement
    if App.GuiUp:
        ViewProviderBezCurve(obj.ViewObject)
#        if not face: obj.ViewObject.DisplayMode = "Wireframe"
#        obj.ViewObject.DisplayMode = "Wireframe"
        gui_utils.format_object(obj)
        gui_utils.select(obj)

    return obj
def makeBCurveEdge(Points):
    geomCurve = Part.BezierCurve()
    geomCurve.setPoles(Points)
    edge = Part.Edge(geomCurve)
    return (edge)
Esempio n. 14
0
def make_bezier_curve(points):
    geomCurve = Part.BezierCurve()
    geomCurve.setPoles(points)
    return geomCurve