예제 #1
0
 def getbase(wire):
     "returns a full shape from a base wire"
     dvec = fcgeo.vec(wire.Edges[0]).cross(normal)
     dvec.normalize()
     if obj.Align == "Left":
         dvec = dvec.multiply(obj.Width)
         w2 = fcgeo.offsetWire(wire, dvec)
         sh = fcgeo.bind(wire, w2)
     elif obj.Align == "Right":
         dvec = dvec.multiply(obj.Width)
         dvec = fcvec.neg(dvec)
         w2 = fcgeo.offsetWire(wire, dvec)
         sh = fcgeo.bind(wire, w2)
     elif obj.Align == "Center":
         dvec = dvec.multiply(obj.Width / 2)
         w1 = fcgeo.offsetWire(wire, dvec)
         dvec = fcvec.neg(dvec)
         w2 = fcgeo.offsetWire(wire, dvec)
         sh = fcgeo.bind(w1, w2)
     # fixing self-intersections
     sh.fix(0.1, 0, 1)
     if height and (not flat):
         norm = Vector(normal).multiply(height)
         sh = sh.extrude(norm)
     return sh
예제 #2
0
 def getbase(wire):
     "returns a full shape from a base wire"
     dvec = fcgeo.vec(wire.Edges[0]).cross(normal)
     dvec.normalize()
     if obj.Align == "Left":
         dvec = dvec.multiply(width)
         w2 = fcgeo.offsetWire(wire,dvec)
         w1 = Part.Wire(fcgeo.sortEdges(wire.Edges))
         sh = fcgeo.bind(w1,w2)
     elif obj.Align == "Right":
         dvec = dvec.multiply(width)
         dvec = fcvec.neg(dvec)
         w2 = fcgeo.offsetWire(wire,dvec)
         w1 = Part.Wire(fcgeo.sortEdges(wire.Edges))
         sh = fcgeo.bind(w1,w2)
     elif obj.Align == "Center":
         dvec = dvec.multiply(width/2)
         w1 = fcgeo.offsetWire(wire,dvec)
         dvec = fcvec.neg(dvec)
         w2 = fcgeo.offsetWire(wire,dvec)
         sh = fcgeo.bind(w1,w2)
     # fixing self-intersections
     sh.fix(0.1,0,1)
     if height and (not flat):
         norm = Vector(normal).multiply(height)
         sh = sh.extrude(norm)
     return sh
예제 #3
0
    def snapToExtensions(self,point,last,constrain,eline):
        "returns a point snapped to extension or parallel line to last object, if any"

        if self.isEnabled("extension"):
            tsnap = self.snapToExtOrtho(last,constrain,eline)
            if tsnap:
                if (tsnap[0].sub(point)).Length < self.radius:
                    if self.tracker:
                        self.tracker.setCoords(tsnap[2])
                        self.tracker.setMarker(self.mk[tsnap[1]])
                        self.tracker.on()
                    if self.extLine:
                        self.extLine.p2(tsnap[2])
                        self.extLine.on()
                    self.setCursor(tsnap[1])
                    return tsnap[2],eline
                
        for o in [self.lastObj[1],self.lastObj[0]]:
            if o:
                ob = FreeCAD.ActiveDocument.getObject(o)
                if ob:
                    if ob.isDerivedFrom("Part::Feature"):
                        edges = ob.Shape.Edges
                        if (not self.maxEdges) or (len(edges) <= self.maxEdges):
                            for e in edges:
                                if isinstance(e.Curve,Part.Line):
                                    np = self.getPerpendicular(e,point)
                                    if not fcgeo.isPtOnEdge(np,e):
                                        if (np.sub(point)).Length < self.radius:
                                            if self.isEnabled('extension'):
                                                if np != e.Vertexes[0].Point:
                                                    if self.tracker:
                                                        self.tracker.setCoords(np)
                                                        self.tracker.setMarker(self.mk['extension'])
                                                        self.tracker.on()
                                                    if self.extLine:
                                                        self.extLine.p1(e.Vertexes[0].Point)
                                                        self.extLine.p2(np)
                                                        self.extLine.on()
                                                    self.setCursor('extension')
                                                    return np,Part.Line(e.Vertexes[0].Point,np).toShape()
                                        else:
                                            if self.isEnabled('parallel'):
                                                if last:
                                                    de = Part.Line(last,last.add(fcgeo.vec(e))).toShape()  
                                                    np = self.getPerpendicular(de,point)
                                                    if (np.sub(point)).Length < self.radius:
                                                        if self.tracker:
                                                            self.tracker.setCoords(np)
                                                            self.tracker.setMarker(self.mk['parallel'])
                                                            self.tracker.on()
                                                        self.setCursor('parallel')
                                                        return np,de
        return point,eline
예제 #4
0
 def update(self,line=None,normal=None):
     import WorkingPlane
     from draftlibs import fcgeo
     if not normal:
         normal = FreeCAD.DraftWorkingPlane.axis
     if line:
         if isinstance(line,list):
             bp = line[0]
             lvec = line[1].sub(line[0])
         else:
             lvec = fcgeo.vec(line.Shape.Edges[0])
             bp = line.Shape.Edges[0].Vertexes[0].Point
     elif self.baseline:
         lvec = fcgeo.vec(self.baseline.Shape.Edges[0])
         bp = self.baseline.Shape.Edges[0].Vertexes[0].Point
     else:
         return
     right = lvec.cross(normal)
     self.cube.width.setValue(lvec.Length)
     p = WorkingPlane.getPlacementFromPoints([bp,bp.add(lvec),bp.add(right)])
     self.trans.rotation.setValue(p.Rotation.Q)
     bp = bp.add(fcvec.scale(lvec,0.5))
     bp = bp.add(fcvec.scaleTo(normal,self.cube.depth.getValue()/2))
     self.pos(bp)
예제 #5
0
def getpoint(data):
    "turns an OCA point definition into a FreeCAD Vector"
    print "found point ", data
    if (len(data) == 3):
        return Vector(float(data[0]), float(data[1]), float(data[2]))
    elif (data[0] == "P") and (len(data) == 4):
        return Vector(float(data[1]), float(data[2]), float(data[3]))
    elif (data[0][0] == "P") and (len(data[0]) > 1):
        if (len(data) == 1):
            return objects[data[0]]
        else:
            if (data[1][0] == "R"):
                return objects[data[0]].add(objects[data[1]])
            elif (data[1][0] == "C"):
                return fcgeo.findProjection(objects[data[0]], objects[data[1]])
    elif (data[0][0] == "C"):
        if objects[data[0]]:
            p1 = objects[data[0]].Curve.Position
            if (len(data) == 1):
                return p1
            else:
                if (data[1][0] == "L"):
                    l = objects[data[1]]
                    return p1.add(fcgeo.vec(l))
예제 #6
0
def getpoint(data):
    "turns an OCA point definition into a FreeCAD Vector"
    print "found point ",data
    if (len(data) == 3):
        return Vector(float(data[0]),float(data[1]),float(data[2]))
    elif (data[0] == "P") and (len(data) == 4):
        return Vector(float(data[1]),float(data[2]),float(data[3]))
    elif (data[0][0] == "P") and (len(data[0]) > 1):
        if (len(data) == 1):
            return objects[data[0]]
        else:
            if (data[1][0] == "R"):
                return objects[data[0]].add(objects[data[1]])
            elif (data[1][0] == "C"):
                return fcgeo.findProjection(objects[data[0]],objects[data[1]])
    elif (data[0][0] == "C"):
        if objects[data[0]]:
            p1 = objects[data[0]].Curve.Position
            if (len(data) == 1):
                return p1
            else:
                if (data[1][0] == "L"):
                    l = objects[data[1]]
                    return p1.add(fcgeo.vec(l))
예제 #7
0
 def getPerpendicular(self,edge,pt):
     "returns a point on an edge, perpendicular to the given point"
     dv = pt.sub(edge.Vertexes[0].Point)
     nv = fcvec.project(dv,fcgeo.vec(edge))
     np = (edge.Vertexes[0].Point).add(nv)
     return np