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