Merge branch 'master' of ssh://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad

This commit is contained in:
wmayer 2013-04-01 17:41:36 +02:00
commit a65b197815
10 changed files with 569 additions and 463 deletions

View File

@ -562,10 +562,10 @@ class Renderer:
v = edges[0].Vertexes[0].Point v = edges[0].Vertexes[0].Point
svg = 'M '+ tostr(v.x) +' '+ tostr(v.y) + ' ' svg = 'M '+ tostr(v.x) +' '+ tostr(v.y) + ' '
for e in edges: for e in edges:
if isinstance(e.Curve,Part.Line) or isinstance(e.Curve,Part.BSplineCurve): if (DraftGeomUtils.geomType(e) == "Line") or (DraftGeomUtils.geomType(e) == "BSplineCurve"):
v = e.Vertexes[-1].Point v = e.Vertexes[-1].Point
svg += 'L '+ tostr(v.x) +' '+ tostr(v.y) + ' ' svg += 'L '+ tostr(v.x) +' '+ tostr(v.y) + ' '
elif isinstance(e.Curve,Part.Circle): elif DraftGeomUtils.geomType(e) == "Circle":
r = e.Curve.Radius r = e.Curve.Radius
v = e.Vertexes[-1].Point v = e.Vertexes[-1].Point
svg += 'A '+ tostr(r) + ' '+ tostr(r) +' 0 0 1 '+ tostr(v.x) +' ' svg += 'A '+ tostr(r) + ' '+ tostr(r) +' 0 0 1 '+ tostr(v.x) +' '

View File

@ -46,7 +46,7 @@ def getIndices(shape,offset):
vlist.append(" "+str(round(v.X,p))+" "+str(round(v.Y,p))+" "+str(round(v.Z,p))) vlist.append(" "+str(round(v.X,p))+" "+str(round(v.Y,p))+" "+str(round(v.Z,p)))
if not shape.Faces: if not shape.Faces:
for e in shape.Edges: for e in shape.Edges:
if isinstance(e,Part.Line): if DraftGeomUtils.geomType(e) == "Line":
ei = " " + str(findVert(e.Vertexes[0],shape.Vertexes) + offset) ei = " " + str(findVert(e.Vertexes[0],shape.Vertexes) + offset)
ei += " " + str(findVert(e.Vertexes[-1],shape.Vertexes) + offset) ei += " " + str(findVert(e.Vertexes[-1],shape.Vertexes) + offset)
elist.append(ei) elist.append(ei)

View File

@ -107,7 +107,7 @@ def getParamType(param):
return "float" return "float"
elif param in ["selectBaseObjects","alwaysSnap","grid","fillmode","saveonexit","maxSnap", elif param in ["selectBaseObjects","alwaysSnap","grid","fillmode","saveonexit","maxSnap",
"SvgLinesBlack","dxfStdSize","showSnapBar","hideSnapBar","alwaysShowGrid", "SvgLinesBlack","dxfStdSize","showSnapBar","hideSnapBar","alwaysShowGrid",
"renderPolylineWidth","showPlaneTracker"]: "renderPolylineWidth","showPlaneTracker","UsePartPrimitives"]:
return "bool" return "bool"
elif param in ["color","constructioncolor","snapcolor"]: elif param in ["color","constructioncolor","snapcolor"]:
return "unsigned" return "unsigned"
@ -250,7 +250,8 @@ def shapify(obj):
elif len(shape.Wires) == 1: elif len(shape.Wires) == 1:
name = "Wire" name = "Wire"
elif len(shape.Edges) == 1: elif len(shape.Edges) == 1:
if isinstance(shape.Edges[0].Curve,Part.Line): import DraftGeomUtils
if DraftGeomUtils.geomType(shape.Edges[0]) == "Line":
name = "Line" name = "Line"
else: else:
name = "Circle" name = "Circle"
@ -426,13 +427,13 @@ def makeCircle(radius, placement=None, face=True, startangle=None, endangle=None
wireframe, otherwise as a face. If startangle AND endangle are given wireframe, otherwise as a face. If startangle AND endangle are given
(in degrees), they are used and the object appears as an arc. If an edge (in degrees), they are used and the object appears as an arc. If an edge
is passed, its Curve must be a Part.Circle''' is passed, its Curve must be a Part.Circle'''
import Part import Part, DraftGeomUtils
if placement: typecheck([(placement,FreeCAD.Placement)], "makeCircle") if placement: typecheck([(placement,FreeCAD.Placement)], "makeCircle")
obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython","Circle") obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython","Circle")
_Circle(obj) _Circle(obj)
if isinstance(radius,Part.Edge): if isinstance(radius,Part.Edge):
edge = radius edge = radius
if isinstance(edge.Curve,Part.Circle): if DraftGeomUtils.geomType(edge) == "Circle":
obj.Radius = edge.Curve.Radius obj.Radius = edge.Curve.Radius
placement = FreeCAD.Placement(edge.Placement) placement = FreeCAD.Placement(edge.Placement)
delta = edge.Curve.Center.sub(placement.Base) delta = edge.Curve.Center.sub(placement.Base)
@ -1214,7 +1215,7 @@ def draftify(objectslist,makeblock=False,delete=True):
if obj.isDerivedFrom('Part::Feature'): if obj.isDerivedFrom('Part::Feature'):
for w in obj.Shape.Wires: for w in obj.Shape.Wires:
if DraftGeomUtils.hasCurves(w): if DraftGeomUtils.hasCurves(w):
if (len(w.Edges) == 1) and isinstance(w.Edges[0].Curve,Part.Circle): if (len(w.Edges) == 1) and (DraftGeomUtils.geomType(w.Edges[0]) == "Circle"):
nobj = makeCircle(w.Edges[0]) nobj = makeCircle(w.Edges[0])
else: else:
nobj = FreeCAD.ActiveDocument.addObject("Part::Feature",obj.Name) nobj = FreeCAD.ActiveDocument.addObject("Part::Feature",obj.Name)
@ -1298,15 +1299,16 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct
return '' return ''
def getPath(edges): def getPath(edges):
import DraftGeomUtils
svg ='<path id="' + name + '" ' svg ='<path id="' + name + '" '
edges = DraftGeomUtils.sortEdges(edges) edges = DraftGeomUtils.sortEdges(edges)
v = getProj(edges[0].Vertexes[0].Point) v = getProj(edges[0].Vertexes[0].Point)
svg += 'd="M '+ str(v.x) +' '+ str(v.y) + ' ' svg += 'd="M '+ str(v.x) +' '+ str(v.y) + ' '
for e in edges: for e in edges:
if isinstance(e.Curve,Part.Line) or isinstance(e.Curve,Part.BSplineCurve): if (DraftGeomUtils.geomType(e) == "Line") or (DraftGeomUtils.geomType(e) == "BSplineCurve"):
v = getProj(e.Vertexes[-1].Point) v = getProj(e.Vertexes[-1].Point)
svg += 'L '+ str(v.x) +' '+ str(v.y) + ' ' svg += 'L '+ str(v.x) +' '+ str(v.y) + ' '
elif isinstance(e.Curve,Part.Circle): elif DraftGeomUtils.geomType(e) == "Circle":
if len(e.Vertexes) == 1: if len(e.Vertexes) == 1:
# complete circle # complete circle
svg = getCircle(e) svg = getCircle(e)
@ -1623,7 +1625,7 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S
print "Error: The given object is not planar and cannot be converted into a sketch." print "Error: The given object is not planar and cannot be converted into a sketch."
return None return None
for e in obj.Shape.Edges: for e in obj.Shape.Edges:
if isinstance(e.Curve,Part.BSplineCurve): if DraftGeomUtils.geomType(e) == "BSplineCurve":
print "Error: One of the selected object contains BSplines, unable to convert" print "Error: One of the selected object contains BSplines, unable to convert"
return None return None
if not addTo: if not addTo:
@ -1969,7 +1971,7 @@ def upgrade(objects,delete=False,force=None):
if not w.isClosed(): if not w.isClosed():
openwires.append(w) openwires.append(w)
for e in ob.Shape.Edges: for e in ob.Shape.Edges:
if not isinstance(e.Curve,Part.Line): if DraftGeomUtils.geomType(e) != "Line":
curves.append(e) curves.append(e)
if not e.hashCode() in wirededges: if not e.hashCode() in wirededges:
loneedges.append(e) loneedges.append(e)
@ -3362,22 +3364,22 @@ class _Shape2DView(_DraftObject):
newedges = [] newedges = []
for e in oldedges: for e in oldedges:
try: try:
if isinstance(e.Curve,Part.Line): if DraftGeomUtils.geomType(e) == "Line":
newedges.append(e.Curve.toShape()) newedges.append(e.Curve.toShape())
elif isinstance(e.Curve,Part.Circle): elif DraftGeomUtils.geomType(e) == "Circle":
if len(e.Vertexes) > 1: if len(e.Vertexes) > 1:
mp = DraftGeomUtils.findMidpoint(e) mp = DraftGeomUtils.findMidpoint(e)
a = Part.Arc(e.Vertexes[0].Point,mp,e.Vertexes[-1].Point).toShape() a = Part.Arc(e.Vertexes[0].Point,mp,e.Vertexes[-1].Point).toShape()
newedges.append(a) newedges.append(a)
else: else:
newedges.append(e.Curve.toShape()) newedges.append(e.Curve.toShape())
elif isinstance(e.Curve,Part.Ellipse): elif DraftGeomUtils.geomType(e) == "Ellipse":
if len(e.Vertexes) > 1: if len(e.Vertexes) > 1:
a = Part.Arc(e.Curve,e.FirstParameter,e.LastParameter).toShape() a = Part.Arc(e.Curve,e.FirstParameter,e.LastParameter).toShape()
newedges.append(a) newedges.append(a)
else: else:
newedges.append(e.Curve.toShape()) newedges.append(e.Curve.toShape())
elif isinstance(e.Curve,Part.BSplineCurve): elif DraftGeomUtils.geomType(e) == "BSplineCurve":
if DraftGeomUtils.isLine(e.Curve): if DraftGeomUtils.isLine(e.Curve):
l = Part.Line(e.Vertexes[0].Point,e.Vertexes[-1].Point).toShape() l = Part.Line(e.Vertexes[0].Point,e.Vertexes[-1].Point).toShape()
newedges.append(l) newedges.append(l)

View File

@ -162,6 +162,22 @@ def hasOnlyWires(shape):
return True return True
return False return False
def geomType(edge):
"returns the type of geom this edge is based on"
try:
if isinstance(edge.Curve,Part.Line):
return "Line"
elif isinstance(edge.Curve,Part.Circle):
return "Circle"
elif isinstance(edge.Curve,Part.BSplineCurve):
return "BSplineCurve"
elif isinstance(edge.Curve,Part.Ellipse):
return "Ellipse"
else:
return "Unknown"
except:
return "Unknown"
# edge functions ***************************************************************** # edge functions *****************************************************************
def findEdge(anEdge,aList): def findEdge(anEdge,aList):
@ -190,7 +206,7 @@ def findIntersection(edge1,edge2,infinite1=False,infinite2=False,ex1=False,ex2=F
infinite1 = ex1 infinite1 = ex1
infinite2 = ex2 infinite2 = ex2
elif isinstance(edge1.Curve,Part.Line) and isinstance(edge2.Curve,Part.Line) : elif (geomType(edge1) == "Line") and (geomType(edge2) == "Line") :
# we have 2 straight lines # we have 2 straight lines
pt1, pt2, pt3, pt4 = [edge1.Vertexes[0].Point, pt1, pt2, pt3, pt4 = [edge1.Vertexes[0].Point,
edge1.Vertexes[1].Point, edge1.Vertexes[1].Point,
@ -235,14 +251,14 @@ def findIntersection(edge1,edge2,infinite1=False,infinite2=False,ex1=False,ex2=F
else : else :
return [] # Lines aren't on same plane return [] # Lines aren't on same plane
elif isinstance(edge1.Curve,Part.Circle) and isinstance(edge2.Curve,Part.Line) \ elif (geomType(edge1) == "Circle") and (geomType(edge2) == "Line") \
or isinstance(edge1.Curve,Part.Line) and isinstance(edge2.Curve,Part.Circle) : or (geomType(edge1) == "Line") and (geomType(edge2) == "Circle") :
# deals with an arc or circle and a line # deals with an arc or circle and a line
edges = [edge1,edge2] edges = [edge1,edge2]
for edge in edges : for edge in edges :
if isinstance(edge.Curve,Part.Line) : if geomType(edge) == "Line":
line = edge line = edge
else : else :
arc = edge arc = edge
@ -303,7 +319,7 @@ def findIntersection(edge1,edge2,infinite1=False,infinite2=False,ex1=False,ex2=F
del int[i] del int[i]
return int return int
elif isinstance(edge1.Curve,Part.Circle) and isinstance(edge2.Curve,Part.Circle) : elif (geomType(edge1) == "Circle") and (geomType(edge2) == "Circle") :
# deals with 2 arcs or circles # deals with 2 arcs or circles
@ -366,9 +382,9 @@ def findIntersection(edge1,edge2,infinite1=False,infinite2=False,ex1=False,ex2=F
def geom(edge,plac=FreeCAD.Placement()): def geom(edge,plac=FreeCAD.Placement()):
"returns a Line, ArcOfCircle or Circle geom from the given edge, according to the given placement" "returns a Line, ArcOfCircle or Circle geom from the given edge, according to the given placement"
if isinstance(edge.Curve,Part.Line): if geomType(edge) == "Line":
return edge.Curve return edge.Curve
elif isinstance(edge.Curve,Part.Circle): elif geomType(edge) == "Circle":
if len(edge.Vertexes) == 1: if len(edge.Vertexes) == 1:
return Part.Circle(edge.Curve.Center,edge.Curve.Axis,edge.Curve.Radius) return Part.Circle(edge.Curve.Center,edge.Curve.Axis,edge.Curve.Radius)
else: else:
@ -405,7 +421,7 @@ def mirror (point, edge):
def isClockwise(edge): def isClockwise(edge):
"""Returns True if a circle-based edge has a clockwise direction""" """Returns True if a circle-based edge has a clockwise direction"""
if not isinstance(edge.Curve,Part.Circle): if not geomType(edge) == "Circle":
return True return True
v1 = edge.Curve.tangent(edge.ParameterRange[0])[0] v1 = edge.Curve.tangent(edge.ParameterRange[0])[0]
if DraftVecUtils.isNull(v1): if DraftVecUtils.isNull(v1):
@ -507,12 +523,12 @@ def sortEdges(lEdges, aVertex=None):
if aVertex.Point == result[3].Vertexes[0].Point: if aVertex.Point == result[3].Vertexes[0].Point:
return lEdges return lEdges
else: else:
if isinstance(result[3].Curve,Part.Line): if geomType(result[3]) == "Line":
return [Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()] return [Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()]
elif isinstance(result[3].Curve,Part.Circle): elif geomType(result[3]) == "Circle":
mp = findMidpoint(result[3]) mp = findMidpoint(result[3])
return [Part.Arc(aVertex.Point,mp,result[3].Vertexes[0].Point).toShape()] return [Part.Arc(aVertex.Point,mp,result[3].Vertexes[0].Point).toShape()]
elif isinstance(result[3].Curve,Part.BSplineCurve): elif geomType(result[3]) == "BSplineCurve":
if isLine(result[3].Curve): if isLine(result[3].Curve):
return [Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()] return [Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()]
else: else:
@ -543,14 +559,14 @@ def sortEdges(lEdges, aVertex=None):
olEdges += [result[3]] + next olEdges += [result[3]] + next
else: else:
#print "inverting", result[3].Curve #print "inverting", result[3].Curve
if isinstance(result[3].Curve,Part.Line): if geomType(result[3]) == "Line":
newedge = Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape() newedge = Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()
olEdges += [newedge] + next olEdges += [newedge] + next
elif isinstance(result[3].Curve,Part.Circle): elif geomType(result[3]) == "Circle":
mp = findMidpoint(result[3]) mp = findMidpoint(result[3])
newedge = Part.Arc(aVertex.Point,mp,result[3].Vertexes[0].Point).toShape() newedge = Part.Arc(aVertex.Point,mp,result[3].Vertexes[0].Point).toShape()
olEdges += [newedge] + next olEdges += [newedge] + next
elif isinstance(result[3].Curve,Part.BSplineCurve): elif geomType(result[3]) == "BSplineCurve":
if isLine(result[3].Curve): if isLine(result[3].Curve):
newedge = Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape() newedge = Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()
olEdges += [newedge] + next olEdges += [newedge] + next
@ -662,10 +678,10 @@ def superWire(edgeslist,closed=False):
p2 = median(curr.Vertexes[-1].Point,next.Vertexes[0].Point) p2 = median(curr.Vertexes[-1].Point,next.Vertexes[0].Point)
else: else:
p2 = curr.Vertexes[-1].Point p2 = curr.Vertexes[-1].Point
if isinstance(curr.Curve,Part.Line): if geomType(curr) == "Line":
print "line",p1,p2 print "line",p1,p2
newedges.append(Part.Line(p1,p2).toShape()) newedges.append(Part.Line(p1,p2).toShape())
elif isinstance(curr.Curve,Part.Circle): elif geomType(curr) == "Circle":
p3 = findMidpoint(curr) p3 = findMidpoint(curr)
print "arc",p1,p3,p2 print "arc",p1,p3,p2
newedges.append(Part.Arc(p1,p3,p2).toShape()) newedges.append(Part.Arc(p1,p3,p2).toShape())
@ -679,7 +695,7 @@ def findMidpoint(edge):
"calculates the midpoint of an edge" "calculates the midpoint of an edge"
first = edge.Vertexes[0].Point first = edge.Vertexes[0].Point
last = edge.Vertexes[-1].Point last = edge.Vertexes[-1].Point
if isinstance(edge.Curve,Part.Circle): if geomType(edge) == "Circle":
center = edge.Curve.Center center = edge.Curve.Center
radius = edge.Curve.Radius radius = edge.Curve.Radius
if len(edge.Vertexes) == 1: if len(edge.Vertexes) == 1:
@ -698,41 +714,42 @@ def findMidpoint(edge):
endpoint = DraftVecUtils.scaleTo(perp,sagitta) endpoint = DraftVecUtils.scaleTo(perp,sagitta)
return Vector.add(startpoint,endpoint) return Vector.add(startpoint,endpoint)
elif isinstance(edge.Curve,Part.Line): elif geomType(edge) == "Line":
halfedge = DraftVecUtils.scale(last.sub(first),.5) halfedge = DraftVecUtils.scale(last.sub(first),.5)
return Vector.add(first,halfedge) return Vector.add(first,halfedge)
else: else:
return None return None
def complexity(obj): # OBSOLETED
''' #def complexity(obj):
tests given object for shape complexity: # '''
1: line # tests given object for shape complexity:
2: arc # 1: line
3: circle # 2: arc
4: open wire with no arc # 3: circle
5: closed wire # 4: open wire with no arc
6: wire with arcs # 5: closed wire
7: faces # 6: wire with arcs
8: faces with arcs # 7: faces
''' # 8: faces with arcs
shape = obj.Shape # '''
if shape.Faces: # shape = obj.Shape
for e in shape.Edges: # if shape.Faces:
if (isinstance(e.Curve,Part.Circle)): return 8 # for e in shape.Edges:
return 7 # if (isinstance(e.Curve,Part.Circle)): return 8
if shape.Wires: # return 7
for e in shape.Edges: # if shape.Wires:
if (isinstance(e.Curve,Part.Circle)): return 6 # for e in shape.Edges:
for w in shape.Wires: # if (isinstance(e.Curve,Part.Circle)): return 6
if w.isClosed(): return 5 # for w in shape.Wires:
return 4 # if w.isClosed(): return 5
if (isinstance(shape.Edges[0].Curve,Part.Circle)): # return 4
if len(shape.Vertexes) == 1: # if (isinstance(shape.Edges[0].Curve,Part.Circle)):
return 3 # if len(shape.Vertexes) == 1:
return 2 # return 3
return 1 # return 2
# return 1
def findPerpendicular(point,edgeslist,force=None): def findPerpendicular(point,edgeslist,force=None):
''' '''
@ -774,7 +791,7 @@ def offset(edge,vector):
''' '''
if (not isinstance(edge,Part.Shape)) or (not isinstance(vector,FreeCAD.Vector)): if (not isinstance(edge,Part.Shape)) or (not isinstance(vector,FreeCAD.Vector)):
return None return None
if isinstance(edge.Curve,Part.Line): if geomType(edge) == "Line":
v1 = Vector.add(edge.Vertexes[0].Point, vector) v1 = Vector.add(edge.Vertexes[0].Point, vector)
v2 = Vector.add(edge.Vertexes[-1].Point, vector) v2 = Vector.add(edge.Vertexes[-1].Point, vector)
return Part.Line(v1,v2).toShape() return Part.Line(v1,v2).toShape()
@ -797,11 +814,11 @@ def getNormal(shape):
if (shape.ShapeType == "Face") and hasattr(shape,"normalAt"): if (shape.ShapeType == "Face") and hasattr(shape,"normalAt"):
n = shape.copy().normalAt(0.5,0.5) n = shape.copy().normalAt(0.5,0.5)
elif shape.ShapeType == "Edge": elif shape.ShapeType == "Edge":
if isinstance(shape.Edges[0].Curve,Part.Circle): if geomType(shape.Edges[0]) == "Circle":
n = shape.Edges[0].Curve.Axis n = shape.Edges[0].Curve.Axis
else: else:
for e in shape.Edges: for e in shape.Edges:
if isinstance(e.Curve,Part.Circle): if geomType(e) == "Circle":
n = e.Curve.Axis n = e.Curve.Axis
break break
e1 = vec(shape.Edges[0]) e1 = vec(shape.Edges[0])
@ -921,10 +938,10 @@ def connect(edges,closed=False):
v2 = curr.Vertexes[-1].Point v2 = curr.Vertexes[-1].Point
else: else:
v2 = curr.Vertexes[-1].Point v2 = curr.Vertexes[-1].Point
if isinstance(curr.Curve,Part.Line): if geomType(curr) == "Line":
if v1 != v2: if v1 != v2:
nedges.append(Part.Line(v1,v2).toShape()) nedges.append(Part.Line(v1,v2).toShape())
elif isinstance(curr.Curve,Part.Circle): elif geomType(curr) == "Circle":
if v1 != v2: if v1 != v2:
nedges.append(Part.Arc(v1,findMidPoint(curr),v2)) nedges.append(Part.Arc(v1,findMidPoint(curr),v2))
try: try:
@ -939,7 +956,7 @@ def findDistance(point,edge,strict=False):
only if its endpoint lies on the edge. only if its endpoint lies on the edge.
''' '''
if isinstance(point, FreeCAD.Vector): if isinstance(point, FreeCAD.Vector):
if isinstance(edge.Curve, Part.Line): if geomType(edge) == "Line":
segment = vec(edge) segment = vec(edge)
chord = edge.Vertexes[0].Point.sub(point) chord = edge.Vertexes[0].Point.sub(point)
norm = segment.cross(chord) norm = segment.cross(chord)
@ -957,7 +974,7 @@ def findDistance(point,edge,strict=False):
else: else:
return None return None
else: return dist else: return dist
elif isinstance(edge.Curve, Part.Circle): elif geomType(edge) == "Circle":
ve1 = edge.Vertexes[0].Point ve1 = edge.Vertexes[0].Point
if (len(edge.Vertexes) > 1): if (len(edge.Vertexes) > 1):
ve2 = edge.Vertexes[-1].Point ve2 = edge.Vertexes[-1].Point
@ -980,7 +997,7 @@ def findDistance(point,edge,strict=False):
return None return None
else: else:
return dist return dist
elif isinstance(edge.Curve,Part.BSplineCurve): elif geomType(edge) == "BSplineCurve":
try: try:
pr = edge.Curve.parameter(point) pr = edge.Curve.parameter(point)
np = edge.Curve.value(pr) np = edge.Curve.value(pr)
@ -1000,7 +1017,7 @@ def findDistance(point,edge,strict=False):
def angleBisection(edge1, edge2): def angleBisection(edge1, edge2):
"angleBisection(edge,edge) - Returns an edge that bisects the angle between the 2 edges." "angleBisection(edge,edge) - Returns an edge that bisects the angle between the 2 edges."
if isinstance(edge1.Curve, Part.Line) and isinstance(edge2.Curve, Part.Line): if (geomType(edge1) == "Line") and (geomType(edge2) == "Line"):
p1 = edge1.Vertexes[0].Point p1 = edge1.Vertexes[0].Point
p2 = edge1.Vertexes[-1].Point p2 = edge1.Vertexes[-1].Point
p3 = edge2.Vertexes[0].Point p3 = edge2.Vertexes[0].Point
@ -1093,14 +1110,14 @@ def getTangent(edge,frompoint=None):
returns the tangent to an edge. If from point is given, it is used to returns the tangent to an edge. If from point is given, it is used to
calculate the tangent (only useful for an arc of course). calculate the tangent (only useful for an arc of course).
''' '''
if isinstance(edge.Curve,Part.Line): if geomType(edge) == "Line":
return vec(edge) return vec(edge)
elif isinstance(edge.Curve,Part.BSplineCurve): elif geomType(edge) == "BSplineCurve":
if not frompoint: if not frompoint:
return None return None
cp = edge.Curve.parameter(frompoint) cp = edge.Curve.parameter(frompoint)
return edge.Curve.tangent(cp)[0] return edge.Curve.tangent(cp)[0]
elif isinstance(edge.Curve,Part.Circle): elif geomType(edge) == "Circle":
if not frompoint: if not frompoint:
v1 = edge.Vertexes[0].Point.sub(edge.Curve.Center) v1 = edge.Vertexes[0].Point.sub(edge.Curve.Center)
else: else:
@ -1236,7 +1253,7 @@ def isCubic(shape):
if len(shape.Edges) != 12: if len(shape.Edges) != 12:
return False return False
for e in shape.Edges: for e in shape.Edges:
if not isinstance(e.Curve,Part.Line): if geomType(e) != "Line":
return False return False
# if ok until now, let's do more advanced testing # if ok until now, let's do more advanced testing
for f in shape.Faces: for f in shape.Faces:
@ -1320,7 +1337,7 @@ def arcFromSpline(edge):
its first point, midpoint and endpoint. Works best with bspline its first point, midpoint and endpoint. Works best with bspline
segments such as those from imported svg files. Use this only segments such as those from imported svg files. Use this only
if you are sure your edge is really an arc...""" if you are sure your edge is really an arc..."""
if isinstance(edge.Curve,Part.Line): if geomType(edge) == "Line":
print "This edge is straight, cannot build an arc on it" print "This edge is straight, cannot build an arc on it"
return None return None
if len(edge.Vertexes) > 1: if len(edge.Vertexes) > 1:
@ -1682,45 +1699,45 @@ def getBoundaryAngles(angle,alist):
def circleFrom2tan1pt(tan1, tan2, point): def circleFrom2tan1pt(tan1, tan2, point):
"circleFrom2tan1pt(edge, edge, Vector)" "circleFrom2tan1pt(edge, edge, Vector)"
if isinstance(tan1.Curve, Part.Line) and isinstance(tan2.Curve, Part.Line) and isinstance(point, FreeCAD.Vector): if (geomType(tan1) == "Line") and (geomType(tan2) == "Line") and isinstance(point, FreeCAD.Vector):
return circlefrom2Lines1Point(tan1, tan2, point) return circlefrom2Lines1Point(tan1, tan2, point)
elif isinstance(tan1.Curve, Part.Circle) and isinstance(tan2.Curve, Part.Line) and isinstance(point, FreeCAD.Vector): elif (geomType(tan1) == "Circle") and (geomType(tan2) == "Line") and isinstance(point, FreeCAD.Vector):
return circlefromCircleLinePoint(tan1, tan2, point) return circlefromCircleLinePoint(tan1, tan2, point)
elif isinstance(tan2.Curve, Part.Circle) and isinstance(tan1.Curve, Part.Line) and isinstance(point, FreeCAD.Vector): elif (geomType(tan2) == "Circle") and (geomType(tan1) == "Line") and isinstance(point, FreeCAD.Vector):
return circlefromCircleLinePoint(tan2, tan1, point) return circlefromCircleLinePoint(tan2, tan1, point)
elif isinstance(tan2.Curve, Part.Circle) and isinstance(tan1.Curve, Part.Circle) and isinstance(point, FreeCAD.Vector): elif (geomType(tan2) == "Circle") and (geomType(tan1) == "Circle") and isinstance(point, FreeCAD.Vector):
return circlefrom2Circles1Point(tan2, tan1, point) return circlefrom2Circles1Point(tan2, tan1, point)
def circleFrom2tan1rad(tan1, tan2, rad): def circleFrom2tan1rad(tan1, tan2, rad):
"circleFrom2tan1rad(edge, edge, float)" "circleFrom2tan1rad(edge, edge, float)"
if isinstance(tan1.Curve, Part.Line) and isinstance(tan2.Curve, Part.Line): if (geomType(tan1) == "Line") and (geomType(tan2) == "Line"):
return circleFrom2LinesRadius(tan1, tan2, rad) return circleFrom2LinesRadius(tan1, tan2, rad)
elif isinstance(tan1.Curve, Part.Circle) and isinstance(tan2.Curve, Part.Line): elif (geomType(tan1) == "Circle") and (geomType(tan2) == "Line"):
return circleFromCircleLineRadius(tan1, tan2, rad) return circleFromCircleLineRadius(tan1, tan2, rad)
elif isinstance(tan1.Curve, Part.Line) and isinstance(tan2.Curve, Part.Circle): elif (geomType(tan1) == "Line") and (geomType(tan2) == "Circle"):
return circleFromCircleLineRadius(tan2, tan1, rad) return circleFromCircleLineRadius(tan2, tan1, rad)
elif isinstance(tan1.Curve, Part.Circle) and isinstance(tan2.Curve, Part.Circle): elif (geomType(tan1) == "Circle") and (geomType(tan2) == "Circle"):
return circleFrom2CirclesRadius(tan1, tan2, rad) return circleFrom2CirclesRadius(tan1, tan2, rad)
def circleFrom1tan2pt(tan1, p1, p2): def circleFrom1tan2pt(tan1, p1, p2):
if isinstance(tan1.Curve, Part.Line) and isinstance(p1, FreeCAD.Vector) and isinstance(p2, FreeCAD.Vector): if (geomType(tan1) == "Line") and isinstance(p1, FreeCAD.Vector) and isinstance(p2, FreeCAD.Vector):
return circlefrom1Line2Points(tan1, p1, p2) return circlefrom1Line2Points(tan1, p1, p2)
if isinstance(tan1.Curve, Part.Line) and isinstance(p1, FreeCAD.Vector) and isinstance(p2, FreeCAD.Vector): if (geomType(tan1) == "Line") and isinstance(p1, FreeCAD.Vector) and isinstance(p2, FreeCAD.Vector):
return circlefrom1Circle2Points(tan1, p1, p2) return circlefrom1Circle2Points(tan1, p1, p2)
def circleFrom1tan1pt1rad(tan1, p1, rad): def circleFrom1tan1pt1rad(tan1, p1, rad):
if isinstance(tan1.Curve, Part.Line) and isinstance(p1, FreeCAD.Vector): if (geomType(tan1) == "Line") and isinstance(p1, FreeCAD.Vector):
return circleFromPointLineRadius(p1, tan1, rad) return circleFromPointLineRadius(p1, tan1, rad)
if isinstance(tan1.Curve, Part.Circle) and isinstance(p1, FreeCAD.Vector): if (geomType(tan1) == "Circle") and isinstance(p1, FreeCAD.Vector):
return circleFromPointCircleRadius(p1, tan1, rad) return circleFromPointCircleRadius(p1, tan1, rad)
def circleFrom3tan(tan1, tan2, tan3): def circleFrom3tan(tan1, tan2, tan3):
tan1IsLine = isinstance(tan1.Curve, Part.Line) tan1IsLine = (geomType(tan1) == "Line")
tan2IsLine = isinstance(tan2.Curve, Part.Line) tan2IsLine = (geomType(tan2) == "Line")
tan3IsLine = isinstance(tan3.Curve, Part.Line) tan3IsLine = (geomType(tan3) == "Line")
tan1IsCircle = isinstance(tan1.Curve, Part.Circle) tan1IsCircle = (geomType(tan1) == "Circle")
tan2IsCircle = isinstance(tan2.Curve, Part.Circle) tan2IsCircle = (geomType(tan2) == "Circle")
tan3IsCircle = isinstance(tan3.Curve, Part.Circle) tan3IsCircle = (geomType(tan3) == "Circle")
if tan1IsLine and tan2IsLine and tan3IsLine: if tan1IsLine and tan2IsLine and tan3IsLine:
return circleFrom3LineTangents(tan1, tan2, tan3) return circleFrom3LineTangents(tan1, tan2, tan3)
elif tan1IsCircle and tan2IsCircle and tan3IsCircle: elif tan1IsCircle and tan2IsCircle and tan3IsCircle:
@ -1926,7 +1943,8 @@ def outerSoddyCircle(circle1, circle2, circle3):
''' '''
Computes the outer soddy circle for three tightly packed circles. Computes the outer soddy circle for three tightly packed circles.
''' '''
if isinstance(circle1.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle) and isinstance(circle3.Curve, Part.Circle): if (geomType(circle1) == "Circle") and (geomType(circle2) == "Circle") \
and (geomType(circle3) == "Circle"):
# Original Java code Copyright (rc) 2008 Werner Randelshofer # Original Java code Copyright (rc) 2008 Werner Randelshofer
# Converted to python by Martin Buerbaum 2009 # Converted to python by Martin Buerbaum 2009
# http://www.randelshofer.ch/treeviz/ # http://www.randelshofer.ch/treeviz/
@ -1978,7 +1996,8 @@ def innerSoddyCircle(circle1, circle2, circle3):
''' '''
Computes the inner soddy circle for three tightly packed circles. Computes the inner soddy circle for three tightly packed circles.
''' '''
if isinstance(circle1.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle) and isinstance(circle3.Curve, Part.Circle): if (geomType(circle1) == "Circle") and (geomType(circle2) == "Circle") \
and (geomType(circle3) == "Circle"):
# Original Java code Copyright (rc) 2008 Werner Randelshofer # Original Java code Copyright (rc) 2008 Werner Randelshofer
# Converted to python by Martin Buerbaum 2009 # Converted to python by Martin Buerbaum 2009
# http://www.randelshofer.ch/treeviz/ # http://www.randelshofer.ch/treeviz/
@ -2032,7 +2051,8 @@ def circleFrom3CircleTangents(circle1, circle2, circle3):
http://mathworld.wolfram.com/ApolloniusProblem.html http://mathworld.wolfram.com/ApolloniusProblem.html
''' '''
if isinstance(circle1.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle) and isinstance(circle3.Curve, Part.Circle): if (geomType(circle1) == "Circle") and (geomType(circle2) == "Circle") \
and (geomType(circle3) == "Circle"):
int12 = findIntersection(circle1, circle2, True, True) int12 = findIntersection(circle1, circle2, True, True)
int23 = findIntersection(circle2, circle3, True, True) int23 = findIntersection(circle2, circle3, True, True)
int31 = findIntersection(circle3, circle1, True, True) int31 = findIntersection(circle3, circle1, True, True)
@ -2136,7 +2156,7 @@ def findHomotheticCenterOfCircles(circle1, circle2):
http://mathworld.wolfram.com/HomotheticCenter.html http://mathworld.wolfram.com/HomotheticCenter.html
''' '''
if isinstance(circle1.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle): if (geomType(circle1) == "Circle") and (geomType(circle2) == "Circle"):
if DraftVecUtils.equals(circle1.Curve.Center, circle2.Curve.Center): if DraftVecUtils.equals(circle1.Curve.Center, circle2.Curve.Center):
return None return None
@ -2188,7 +2208,7 @@ def findRadicalAxis(circle1, circle2):
@sa findRadicalCenter @sa findRadicalCenter
''' '''
if isinstance(circle1.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle): if (geomType(circle1) == "Circle") and (geomType(circle2) == "Circle"):
if DraftVecUtils.equals(circle1.Curve.Center, circle2.Curve.Center): if DraftVecUtils.equals(circle1.Curve.Center, circle2.Curve.Center):
return None return None
r1 = circle1.Curve.Radius r1 = circle1.Curve.Radius
@ -2240,7 +2260,7 @@ def findRadicalCenter(circle1, circle2, circle3):
@sa findRadicalAxis @sa findRadicalAxis
''' '''
if isinstance(circle1.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle): if (geomType(circle1) == "Circle") and (geomType(circle2) == "Circle"):
radicalAxis12 = findRadicalAxis(circle1, circle2) radicalAxis12 = findRadicalAxis(circle1, circle2)
radicalAxis23 = findRadicalAxis(circle1, circle2) radicalAxis23 = findRadicalAxis(circle1, circle2)
@ -2272,7 +2292,7 @@ def pointInversion(circle, point):
http://en.wikipedia.org/wiki/Inversive_geometry http://en.wikipedia.org/wiki/Inversive_geometry
''' '''
if isinstance(circle.Curve, Part.Circle) and isinstance(point, FreeCAD.Vector): if (geomType(circle) == "Circle") and isinstance(point, FreeCAD.Vector):
cen = circle.Curve.Center cen = circle.Curve.Center
rad = circle.Curve.Radius rad = circle.Curve.Radius
@ -2306,7 +2326,7 @@ def polarInversion(circle, edge):
http://mathworld.wolfram.com/InversionPole.html http://mathworld.wolfram.com/InversionPole.html
''' '''
if isinstance(circle.Curve, Part.Circle) and isinstance(edge.Curve, Part.Line): if (geomType(circle) == "Circle") and (geomType(edge) == "Line"):
nearest = circle.Curve.Center.add(findDistance(circle.Curve.Center, edge, False)) nearest = circle.Curve.Center.add(findDistance(circle.Curve.Center, edge, False))
if nearest: if nearest:
inversionPole = pointInversion(circle, nearest) inversionPole = pointInversion(circle, nearest)
@ -2324,7 +2344,7 @@ def circleInversion(circle, circle2):
Circle inversion of a circle. Circle inversion of a circle.
''' '''
if isinstance(circle.Curve, Part.Circle) and isinstance(circle2.Curve, Part.Circle): if (geomType(circle) == "Circle") and (geomType(circle2) == "Circle"):
cen1 = circle.Curve.Center cen1 = circle.Curve.Center
rad1 = circle.Curve.Radius rad1 = circle.Curve.Radius

View File

@ -257,7 +257,7 @@ class Snapper:
snaps.extend(self.snapToIntersection(edge)) snaps.extend(self.snapToIntersection(edge))
snaps.extend(self.snapToElines(edge,eline)) snaps.extend(self.snapToElines(edge,eline))
if isinstance (edge.Curve,Part.Circle): if DraftGeomUtils.geomType(edge) == "Circle":
# the edge is an arc, we have extra options # the edge is an arc, we have extra options
snaps.extend(self.snapToAngles(edge)) snaps.extend(self.snapToAngles(edge))
snaps.extend(self.snapToCenter(edge)) snaps.extend(self.snapToCenter(edge))
@ -383,7 +383,7 @@ class Snapper:
edges = ob.Shape.Edges edges = ob.Shape.Edges
if (not self.maxEdges) or (len(edges) <= self.maxEdges): if (not self.maxEdges) or (len(edges) <= self.maxEdges):
for e in edges: for e in edges:
if isinstance(e.Curve,Part.Line): if DraftGeomUtils.geomType(e) == "Line":
np = self.getPerpendicular(e,point) np = self.getPerpendicular(e,point)
if not DraftGeomUtils.isPtOnEdge(np,e): if not DraftGeomUtils.isPtOnEdge(np,e):
if (np.sub(point)).Length < self.radius: if (np.sub(point)).Length < self.radius:
@ -501,13 +501,13 @@ class Snapper:
if self.isEnabled("perpendicular"): if self.isEnabled("perpendicular"):
if last: if last:
if isinstance(shape,Part.Edge): if isinstance(shape,Part.Edge):
if isinstance(shape.Curve,Part.Line): if DraftGeomUtils.geomType(shape) == "Line":
np = self.getPerpendicular(shape,last) np = self.getPerpendicular(shape,last)
elif isinstance(shape.Curve,Part.Circle): elif DraftGeomUtils.geomType(shape) == "Circle":
dv = last.sub(shape.Curve.Center) dv = last.sub(shape.Curve.Center)
dv = DraftVecUtils.scaleTo(dv,shape.Curve.Radius) dv = DraftVecUtils.scaleTo(dv,shape.Curve.Radius)
np = (shape.Curve.Center).add(dv) np = (shape.Curve.Center).add(dv)
elif isinstance(shape.Curve,Part.BSplineCurve): elif DraftGeomUtils.geomType(shape) == "BSplineCurve":
pr = shape.Curve.parameter(last) pr = shape.Curve.parameter(last)
np = shape.Curve.value(pr) np = shape.Curve.value(pr)
else: else:
@ -522,7 +522,7 @@ class Snapper:
if constrain: if constrain:
if isinstance(shape,Part.Edge): if isinstance(shape,Part.Edge):
if last: if last:
if isinstance(shape.Curve,Part.Line): if DraftGeomUtils(shape) == "Line":
if self.constraintAxis: if self.constraintAxis:
tmpEdge = Part.Line(last,last.add(self.constraintAxis)).toShape() tmpEdge = Part.Line(last,last.add(self.constraintAxis)).toShape()
# get the intersection points # get the intersection points

View File

@ -461,6 +461,19 @@ class Line(Creator):
todo.delay(self.doc.removeObject,old) todo.delay(self.doc.removeObject,old)
self.obj = None self.obj = None
if (len(self.node) > 1): if (len(self.node) > 1):
if (len(self.node) == 2) and Draft.getParam("UsePartPrimitives"):
# use Part primitive
p1 = self.node[0]
p2 = self.node[-1]
self.commit(translate("draft","Create Line"),
['line = FreeCAD.ActiveDocument.addObject("Part::Line","Line")',
'line.X1 = '+str(p1.x),
'line.Y1 = '+str(p1.y),
'line.Z1 = '+str(p1.z),
'line.X2 = '+str(p2.x),
'line.Y2 = '+str(p2.y),
'line.Z2 = '+str(p2.z)])
else:
# building command string # building command string
rot,sup,pts,fil = self.getStrings() rot,sup,pts,fil = self.getStrings()
self.commit(translate("draft","Create DWire"), self.commit(translate("draft","Create DWire"),
@ -766,6 +779,17 @@ class Rectangle(Creator):
try: try:
# building command string # building command string
rot,sup,pts,fil = self.getStrings() rot,sup,pts,fil = self.getStrings()
if Draft.getParam("UsePartPrimitives"):
# Use Part Primitive
self.commit(translate("draft","Create Plane"),
['plane = FreeCAD.ActiveDocument.addObject("Part::Plane","Plane")',
'plane.Length = '+str(length),
'plane.Width = '+str(height),
'pl = FreeCAD.Placement()',
'pl.Rotation.Q='+rot,
'pl.Base = '+DraftVecUtils.toString(p1),
'plane.Placement = pl'])
else:
self.commit(translate("draft","Create Rectangle"), self.commit(translate("draft","Create Rectangle"),
['import Draft', ['import Draft',
'pl = FreeCAD.Placement()', 'pl = FreeCAD.Placement()',
@ -1010,6 +1034,16 @@ class Arc(Creator):
rot,sup,pts,fil = self.getStrings() rot,sup,pts,fil = self.getStrings()
if self.closedCircle: if self.closedCircle:
try: try:
if Draft.getParam("UsePartPrimitives"):
# use primitive
self.commit(translate("draft","Create Circle"),
['circle = FreeCAD.ActiveDocument.addObject("Part::Circle","Circle")',
'circle.Radius = '+str(self.rad),
'pl = FreeCAD.Placement()',
'pl.Rotation.Q = '+rot,
'pl.Base = '+DraftVecUtils.toString(self.center),
'circle.Placement = pl'])
else:
# building command string # building command string
self.commit(translate("draft","Create Circle"), self.commit(translate("draft","Create Circle"),
['import Draft', ['import Draft',
@ -1024,6 +1058,18 @@ class Arc(Creator):
end = math.degrees(self.firstangle+self.angle) end = math.degrees(self.firstangle+self.angle)
if end < sta: sta,end = end,sta if end < sta: sta,end = end,sta
try: try:
if Draft.getParam("UsePartPrimitives"):
# use primitive
self.commit(translate("draft","Create Arc"),
['circle = FreeCAD.ActiveDocument.addObject("Part::Circle","Circle")',
'circle.Radius = '+str(self.rad),
'circle.Angle0 = '+str(sta),
'circle.Angle1 = '+str(end),
'pl = FreeCAD.Placement()',
'pl.Rotation.Q = '+rot,
'pl.Base = '+DraftVecUtils.toString(self.center),
'circle.Placement = pl'])
else:
# building command string # building command string
self.commit(translate("draft","Create Arc"), self.commit(translate("draft","Create Arc"),
['import Draft', ['import Draft',
@ -1556,7 +1602,8 @@ class Dimension(Creator):
self.node = [v1,v2] self.node = [v1,v2]
self.link = [ob,i1,i2] self.link = [ob,i1,i2]
self.edges.append(ed) self.edges.append(ed)
if isinstance(ed.Curve,Part.Circle): import DraftGeomUtils
if DraftGeomUtils.geomType(ed) == "Circle":
# snapped edge is an arc # snapped edge is an arc
self.arcmode = "diameter" self.arcmode = "diameter"
self.link = [ob,num] self.link = [ob,num]
@ -2253,8 +2300,9 @@ class Trimex(Modifier):
lc = self.obj.ViewObject.LineColor lc = self.obj.ViewObject.LineColor
sc = (lc[0],lc[1],lc[2]) sc = (lc[0],lc[1],lc[2])
sw = self.obj.ViewObject.LineWidth sw = self.obj.ViewObject.LineWidth
import DraftGeomUtils
for e in self.edges: for e in self.edges:
if isinstance(e.Curve,Part.Line): if DraftGeomUtils(e) == "Line":
self.ghost.append(lineTracker(scolor=sc,swidth=sw)) self.ghost.append(lineTracker(scolor=sc,swidth=sw))
else: else:
self.ghost.append(arcTracker(scolor=sc,swidth=sw)) self.ghost.append(arcTracker(scolor=sc,swidth=sw))
@ -2362,7 +2410,7 @@ class Trimex(Modifier):
point = pts[DraftGeomUtils.findClosest(point,pts)] point = pts[DraftGeomUtils.findClosest(point,pts)]
# modifying active edge # modifying active edge
if isinstance(edge.Curve,Part.Line): if DraftGeomUtils.geomType(edge) == "Line":
perp = DraftGeomUtils.vec(edge).cross(Vector(0,0,1)) perp = DraftGeomUtils.vec(edge).cross(Vector(0,0,1))
chord = v1.sub(point) chord = v1.sub(point)
proj = DraftVecUtils.project(chord,perp) proj = DraftVecUtils.project(chord,perp)
@ -2409,7 +2457,7 @@ class Trimex(Modifier):
for i in list: for i in list:
edge = self.edges[i] edge = self.edges[i]
ghost = self.ghost[i] ghost = self.ghost[i]
if isinstance(edge.Curve,Part.Line): if DraftGeomUtils.geomType(edge) == "Line":
ghost.p1(edge.Vertexes[0].Point) ghost.p1(edge.Vertexes[0].Point)
ghost.p2(edge.Vertexes[-1].Point) ghost.p2(edge.Vertexes[-1].Point)
else: else:
@ -3296,9 +3344,20 @@ class Point:
if len(self.stack) == 1: if len(self.stack) == 1:
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick) self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(),self.callbackClick)
self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove) self.view.removeEventCallbackPivy(coin.SoLocation2Event.getClassTypeId(),self.callbackMove)
FreeCAD.ActiveDocument.openTransaction("Create Point") commitlist = []
Draft.makePoint((self.stack[0][0]),(self.stack[0][1]),self.stack[0][2]) if Draft.getParam("UsePartPrimitives"):
FreeCAD.ActiveDocument.commitTransaction() # using
commitlist.append((translate("draft","Create Point"),
['point = FreeCAD.ActiveDocument.addObject("Part::Vertex","Point")',
'point.X = '+str(self.stack[0][0]),
'point.Y = '+str(self.stack[0][1]),
'point.Z = '+str(self.stack[0][2])]))
else:
# building command string
commitlist.append((translate("draft","Create Point"),
['import Draft',
'Draft.makePoint('+str(self.stack[0][0])+','+str(self.stack[0][1])+','+str(self.stack[0][2])+')']))
todo.delayCommit(commitlist)
FreeCADGui.Snapper.off() FreeCADGui.Snapper.off()
class ToggleSnap(): class ToggleSnap():

View File

@ -2,7 +2,7 @@
# Resource object code # Resource object code
# #
# Created: Wed Mar 6 12:04:34 2013 # Created: Sun Mar 31 20:05:22 2013
# by: The Resource Compiler for PyQt (Qt v4.8.2) # by: The Resource Compiler for PyQt (Qt v4.8.2)
# #
# WARNING! All changes made in this file will be lost! # WARNING! All changes made in this file will be lost!
@ -41407,268 +41407,273 @@ qt_resource_data = "\
\x33\x2e\x72\x9f\xc2\xcc\xa8\x77\x7d\x66\xc6\x1b\xcc\xef\xf2\x48\ \x33\x2e\x72\x9f\xc2\xcc\xa8\x77\x7d\x66\xc6\x1b\xcc\xef\xf2\x48\
\xa6\x8c\x0e\x28\xa3\x2d\x9e\x88\x63\x66\x74\x00\x9f\x1b\xd5\x84\ \xa6\x8c\x0e\x28\xa3\x2d\x9e\x88\x63\x66\x74\x00\x9f\x1b\xd5\x84\
\x37\x0f\xfe\x01\xbd\x89\x17\xfc\ \x37\x0f\xfe\x01\xbd\x89\x17\xfc\
\x00\x00\x10\x37\ \x00\x00\x10\x85\
\x00\ \x00\
\x00\xa6\x66\x78\x9c\xed\x1d\x6b\x6f\xdb\x38\xf2\x7b\x7e\x05\x91\ \x00\xa9\x59\x78\x9c\xed\x1d\x6b\x6f\xdb\x38\xf2\x7b\x7e\x05\x91\
\x0f\xbd\x1e\x90\x8d\x63\xe7\xdd\x3a\x3e\xb4\xe9\x13\x68\x77\xdb\ \x0f\xbd\x1e\xd0\x8d\x63\xe7\xdd\x3a\x3e\xb4\xe9\x13\x68\x77\xd3\
\x3a\x6d\x6f\xef\xcb\x82\x96\x68\x9b\x57\x59\xf4\x92\x72\x12\x2f\ \x3a\x6d\x6f\xef\xcb\x82\x96\x68\x9b\x57\x59\xf2\x92\x74\x12\x2f\
\xee\xc7\xdf\x0c\x49\x59\x8f\xc8\x72\x64\x59\x96\xbd\x75\x51\x20\ \xee\xc7\xdf\x0c\x49\x59\x8f\xc8\x72\x64\x59\x96\xbd\x75\x51\x20\
\x16\x49\x91\xc3\xe1\xbc\x38\x33\xa4\xda\xff\xba\x1f\x79\xe4\x96\ \x16\x49\x91\xc3\xe1\xbc\x38\x33\xa4\xda\xff\xba\x1f\x79\xe4\x96\
\x49\xc5\x85\x7f\xb5\xdf\x3c\x3c\xda\x27\xcc\x77\x84\xcb\xfd\xc1\ \x09\xc9\x03\xff\x72\xbf\x79\x70\xb8\x4f\x98\xef\x04\x2e\xf7\x07\
\xd5\xfe\xd7\x9b\x37\xbf\x5c\xec\xff\xab\xb3\xd7\x9e\xf0\xa8\xd1\ \x97\xfb\x5f\x6f\xde\xfe\x72\xbe\xff\xaf\xce\x5e\x7b\xc2\xa3\x46\
\x09\x34\xea\xec\x91\xb6\xe3\x51\xa5\x3a\x6f\x27\xfc\xd9\xb3\x57\ \xc7\xd0\xa8\xb3\x47\xda\x8e\x47\xa5\xec\xbc\x9b\xf0\xe7\xcf\x5f\
\x9c\x7a\x62\x00\x7f\xbd\x41\x97\x05\x01\xbc\xac\x5e\x49\xda\x0f\ \x73\xea\x05\x03\xf8\xeb\x0d\xba\x4c\x29\x78\x59\xbe\x16\xb4\xaf\
\xda\x0d\xd3\x08\x5a\xdf\x71\x77\xc0\x02\xa2\x9f\xaf\xf6\x3f\x7f\ \xda\x0d\xd3\x08\x5a\xdf\x71\x77\xc0\x14\xd1\xcf\x97\xfb\x9f\xbf\
\xd7\x8f\xfb\xc4\xa7\x23\x76\xb5\x9f\xdb\x09\x0e\x46\xda\x63\x29\ \xeb\xc7\x7d\xe2\xd3\x11\xbb\xdc\xcf\xed\x04\x07\x23\xed\xb1\x08\
\xc6\x4c\x06\x53\xfb\xc6\x80\x89\x11\x0b\xe4\x54\x57\x92\xb6\x64\ \xc6\x4c\xa8\xa9\x7d\x63\xc0\x82\x11\x53\x62\xaa\x2b\x49\x5b\x30\
\x4e\xa0\x7f\x91\xf6\x7d\xe7\xa8\xdd\xb8\xb7\x0f\x53\x7c\x98\xda\ \x47\xe9\x5f\xa4\x7d\xdf\x39\x6c\x37\xee\xed\xc3\x14\x1f\xa6\xf6\
\x07\x00\x21\x18\x76\x4e\x2f\xa1\xc8\xfc\x34\xc5\x43\xc6\x07\xc3\ \x01\x40\x50\xc3\xce\xc9\x05\x14\x99\x9f\xa6\x78\xc8\xf8\x60\xa8\
\xa0\x73\x76\xdc\x6a\x37\xec\x6f\xdd\x67\x23\xec\xb4\xdd\x08\x07\ \x3a\xa7\x47\xad\x76\xc3\xfe\xd6\x7d\x36\xc2\x4e\xdb\x8d\x70\xf0\
\xcf\x82\xe4\x8e\xfb\xae\xb8\xbb\xe1\x81\xc7\x2c\x30\x2a\x90\x00\ \x2c\x48\xee\xb8\xef\x06\x77\x37\x5c\x79\xcc\x02\x23\x95\x00\xe0\
\x7c\xe7\x2d\xf3\x99\xa4\x1e\x51\x76\x32\xed\x86\xad\x78\xd8\xa5\ \x3b\xef\x98\xcf\x04\xf5\x88\xb4\x93\x69\x37\x6c\xc5\xc3\x2e\x3d\
\x47\xa7\x62\x12\x21\xe7\xdb\x4b\x71\xff\x41\x17\xd9\x1e\x53\x43\ \x3a\x0d\x26\x11\x72\xbe\xbd\x0a\xee\x3f\xea\x22\xdb\x63\x6a\x48\
\xaa\x31\x75\xa0\xa3\x7d\x3b\x01\x7f\x32\xea\x31\xd9\x39\x6b\x37\ \x39\xa6\x0e\x74\xb4\x6f\x27\xe0\x4f\x46\x3d\x26\x3a\xa7\xed\x86\
\xec\x2f\x03\x7e\x7c\x84\x07\x5d\x8c\xa8\x1c\x70\x3f\xd5\xc3\x65\ \xfd\x65\xc0\x8f\x8f\xf0\xa0\x8b\x11\x15\x03\xee\xa7\x7a\xb8\xc8\
\x6e\x0f\x3c\x60\xa3\x08\x93\xf1\xc5\x7c\x2b\xc5\x64\x0c\x30\x87\ \xed\x81\x2b\x36\x8a\x30\x19\x5f\xcc\x77\x22\x98\x8c\x01\xe6\x70\
\xcb\x39\x08\x9f\x4d\xf3\x07\x83\x07\x11\xb2\x32\xf0\xa5\x17\x9d\ \x39\x07\xe1\xb3\x69\xfe\x60\x70\x15\x21\x2b\x03\x5f\x7a\xd1\x49\
\x74\x33\xb0\xf6\x10\xa8\x5c\xdc\xd9\xd1\x80\x70\x03\xee\x50\xcf\ \x37\x03\x6b\x0f\x81\xca\xc5\x9d\x1d\x0d\x08\x57\x71\x87\x7a\xa6\
\x94\xfe\xd1\x8a\x06\x8e\x66\x94\xd1\xd1\xbb\x07\x1d\x0d\x85\xe4\ \xf4\x8f\x56\x34\x70\x34\xa3\x8c\x8e\xde\x3f\xe8\x68\x18\x08\xfe\
\x7f\x09\x3f\x98\x75\xd5\xbc\x9c\xf5\x95\xee\xed\x01\x92\x34\x89\ \x57\xe0\xab\x59\x57\xcd\x8b\x59\x5f\xe9\xde\x1e\x20\x49\x93\xf8\
\x7f\x92\xac\x7f\x3d\x64\xce\x8f\x38\xb2\xb0\x62\x0c\x15\x0e\x56\ \xb5\x60\xfd\xab\x21\x73\x7e\xc4\x91\x85\x15\x63\xa8\x70\xb0\xa2\
\xf4\xc4\xfd\x1f\xcd\x56\xac\xdb\x0c\xec\x09\xe1\xdd\xf0\x71\xa2\ \x17\xdc\xff\xd1\x6c\xc5\xba\xcd\xc0\x5e\x10\x78\x37\x7c\x9c\x68\
\xcd\x0c\x89\xef\xfb\x24\x18\x72\x45\xe0\xbf\xee\x8f\xb9\x07\x50\ \x33\x43\xe2\x87\x3e\x51\x43\x2e\x09\xfc\xd7\xfd\x31\xf7\x19\x14\
\xc0\x2c\x52\xef\x84\xfc\xd1\x03\xfe\x1e\xc2\x2f\xff\x1f\x01\xa1\ \x30\x8b\xd4\xbb\x40\xfc\xe8\x01\x7f\x0f\xe1\x97\xff\x0f\x45\xe8\
\xe3\x31\xa3\xf2\x90\x7c\x55\xac\x3f\x01\x4a\xe5\xbe\xc3\x08\xf5\ \x78\xcc\xa8\x38\x20\x5f\x25\xeb\x4f\x80\x52\xb9\xef\x30\x42\x3d\
\x3c\x22\xfa\xb1\xb7\x70\x40\x45\xa8\xc4\x2a\x25\x08\xf7\x75\xdd\ \x8f\x04\xfd\xd8\x5b\x38\xa0\x24\x54\x60\x95\x0c\x08\xf7\x75\xdd\
\x0b\xa9\xbb\xb1\x1d\x1e\xa6\xd6\x29\x7b\xb1\xb2\xe7\xc3\xee\x83\ \x4b\xa1\xbb\xb1\x1d\x1e\xa4\xd6\x29\x7b\xb1\xb2\xe7\xc3\xee\x55\
\xec\xc9\xbc\xe3\xee\x03\xc8\x97\x1f\x07\x71\xfc\xda\x47\x99\x41\ \xf6\x64\xde\x73\xf7\x01\xe4\xcb\x8f\x83\x38\x7e\xe3\xa3\xcc\x20\
\x54\xe0\x02\x57\x5e\xed\x1f\xa5\xc6\x75\x6c\xdf\x43\x18\x58\x8f\ \x52\xb9\xc0\x95\x97\xfb\x87\xa9\x71\x1d\xdb\xf7\x10\x06\xd6\xe3\
\xfb\x3d\x1a\xd6\x29\x33\xee\x27\x1a\x0c\x17\x0f\xfb\x51\xb8\x8d\ \x7e\x8f\x86\x75\xca\x8c\x7b\x4d\xd5\x70\xf1\xb0\x9f\x02\xb7\x11\
\x50\x6e\x3e\x72\x34\x2d\xca\x80\xcc\x62\x74\xd8\x48\x12\xe2\x02\ \xca\xcd\x47\x8e\xa6\x45\x19\x90\x59\x8c\x0e\x1b\x49\x42\x5c\x40\
\xba\xfc\xfc\x81\xf6\x98\x17\x12\xa3\x87\x0f\x49\xba\x2e\xb2\x60\ \x97\x9f\x3f\xd2\x1e\xf3\x42\x62\xf4\xf0\x21\x49\xd7\x45\x16\xcc\
\x66\xad\xb8\x1f\x30\xd9\xa7\x40\x4a\x23\xe1\xb2\xe5\x17\x8c\x7a\ \xac\x15\xf7\x15\x13\x7d\x0a\xa4\x34\x0a\x5c\xb6\xfc\x82\x51\x8f\
\x7c\xe0\x8f\x98\xff\x60\x30\x98\xee\xe7\xe0\xd9\xb3\x17\x58\xff\ \x0f\xfc\x11\xf3\x1f\x0c\x06\xd3\xfd\xac\x9e\x3f\x7f\x89\xf5\x5f\
\x05\x05\xf6\xff\x66\x8f\x37\x92\x72\x0f\x46\x8b\x4a\xbe\x5d\x33\ \x50\x60\xff\x6f\xf6\x78\x23\x28\xf7\x60\xb4\xa8\xe4\xdb\x15\x43\
\x84\x07\xc0\x88\x63\xa9\x2a\x74\x46\x6c\x2e\x46\x3d\x91\xc9\xe6\ \x78\x00\x8c\x38\x96\xaa\x42\x67\xc4\xe6\xc1\xa8\x17\x64\xb2\x39\
\x58\x81\x6c\x7e\xb2\x3c\x97\xdf\x58\x16\x47\x3e\xfc\xfa\x5e\xa3\ \x56\x20\x9b\x1f\x2f\xcf\xe5\x37\x96\xc5\x91\x0f\xbf\x7e\xd0\x68\
\x19\xd9\xf2\x6e\xc8\x81\x27\x23\xc6\x85\xf2\x89\xc7\xc8\x1d\x07\ \x46\xb6\xbc\x1b\x72\xe0\xc9\x88\x71\xa1\x7c\xe2\x31\x72\xc7\x81\
\x8e\x46\x06\x7a\x46\x6e\xa0\xd7\x1e\x95\xe6\x0d\x5d\x3e\xf6\xa8\ \xa3\x91\x81\x9e\x93\x1b\xe8\xb5\x47\x85\x79\x43\x97\x8f\x3d\x6a\
\xe5\x79\xf3\x4e\xa8\xad\xb0\x3f\x0a\x4f\x63\x2a\x69\xc0\xb4\x0c\ \x79\xde\xbc\x13\x6a\x2b\xec\x8f\xc2\xd3\x98\x0a\xaa\x98\x96\x01\
\x80\x17\x0f\x70\x0c\xe8\x32\xa0\xea\x47\xb2\x9f\x89\x62\x7a\xe4\ \xf0\xe2\x33\x1c\x03\xba\x54\x54\xfe\x48\xf6\x33\x91\x4c\x8f\xfc\
\x37\x92\xb1\xeb\x17\xaf\xc8\x0d\xb4\xb8\xe5\xec\x8e\xa8\xa9\x02\ \x56\x30\x76\xf5\xf2\x35\xb9\x81\x16\xb7\x9c\xdd\x11\x39\x95\x80\
\x8c\x91\xbe\x90\x7a\x14\x1e\x28\x6c\x2b\x0d\x95\x50\x27\x00\x9b\ \x31\xd2\x0f\x84\x1e\x85\x2b\x89\x6d\x85\xa1\x12\xea\x28\xb0\x29\
\x62\x2d\x3c\xfd\x95\x7f\xd4\xd4\xb8\x99\x7c\xfc\x80\xae\x1e\xc3\ \xd6\xc2\xd3\x5f\xf9\x27\x4d\x8d\x9b\xc9\xc7\x0f\xe8\xea\x31\x6c\
\x76\x11\x3d\x98\xd5\xc9\xc2\xe3\xbc\xe1\x1a\xe9\xf1\xca\x01\x60\ \x17\xd1\x83\x59\x9d\x2c\x3c\xce\x1b\xae\x91\x1e\xaf\x1c\x00\x76\
\x57\xbb\x0c\x04\x0b\x79\xaf\xdd\x30\x2a\x7a\xa6\xbf\x13\xd5\xa5\ \xb5\xcb\x40\xb0\x90\xf7\xda\x0d\xa3\xa2\x67\xfa\x3b\x51\x5d\x5a\
\xb5\x79\xeb\xf1\xca\x3c\x4b\x68\x2e\x50\xda\xf3\x65\x26\xeb\xd3\ \x9b\xb7\x1e\xaf\xcc\xb3\x84\xe6\x02\xa5\x3d\x5f\x66\xb2\x3e\x9d\
\x89\x07\x5d\x0b\x4f\x64\xae\x60\xe5\x82\x0a\xc6\x7d\x39\x09\x02\ \x78\xd0\x75\xe0\x05\x99\x2b\x58\xb9\xa0\x82\x71\x5f\x4d\x94\x0a\
\xe1\x67\xc8\x2a\xa8\xeb\x99\xba\xa5\x85\x15\x4a\x05\x37\x3e\x49\ \xfc\x0c\x59\x05\x75\x3d\x53\xb7\xb4\xb0\x42\xa9\xe0\xc6\x27\xa9\
\x2d\x0b\x7c\x10\x0d\xa2\xf7\x5f\x30\xb1\xd3\x26\x5e\x1e\xcd\xa4\ \x65\x81\x0f\xa2\x21\xe8\xfd\x17\x4c\xec\xb4\x89\x97\x47\x33\xa9\
\xc6\xd5\xdd\xa5\x99\x10\xcb\x52\x54\x2a\x99\x8b\x1b\x01\xfc\x93\ \x71\x75\x77\x69\x26\xc4\xb2\x14\x95\x0a\xe6\xe2\x46\x00\xff\x24\
\xac\x18\x80\xb4\xf2\xb1\xca\xfc\x48\x56\xf6\xbc\x09\xc3\x3a\xfd\ \x2b\x06\x20\xad\x7c\xac\x32\x3f\x92\x95\x3d\x6f\xc2\xb0\x4e\xff\
\x37\x49\xd0\x0f\x06\x59\xb9\xb8\xb2\xe4\xb0\x99\xd2\xaa\x12\xab\ \x4d\x12\xf4\x83\x41\x56\x2e\xae\x2c\x39\x6c\xa6\xb4\xaa\xc4\xea\
\x63\x81\x3e\x9c\xcb\x40\x5d\x9f\x8e\x37\x9d\x7b\x16\x49\x87\xe2\ \x58\xa0\x0f\xe7\x32\x50\xd7\xa7\xe3\x4d\xe7\x9e\x45\xd2\xa1\x38\
\xfc\xa3\x70\xd6\x6a\x0a\xb6\x84\xb7\x63\xa0\x04\xf8\x16\x17\x88\ \xff\x48\x9c\xb5\x9c\x82\x2d\xe1\xed\x18\x28\x01\xbe\xc5\x05\x22\
\xa0\x9f\x8f\x89\x96\xb5\xdc\xaf\x85\x0f\xbf\x26\xda\x1c\xdb\x78\ \xe8\xe7\x63\xa2\x65\x2d\xf7\xab\xc0\x87\x5f\x13\x6d\x8e\x6d\x3c\
\x66\x3a\x5e\x8d\xe5\xfc\x90\xa9\xac\x42\x22\x3d\x06\x6d\x89\x2b\ \x33\x1d\xad\xc6\x72\x7e\xc8\x54\x56\x21\x91\x1e\x83\xb6\xc4\x15\
\xe9\x9d\x6f\x0d\x5e\x8e\x58\x89\xa1\x08\x0d\xdf\x12\x7b\xde\x22\ \xf4\xce\xb7\x06\x2f\x47\xac\xc4\x50\x84\x86\x6f\x89\x3d\x6f\x11\
\x7c\x77\x72\x32\x9f\xf1\x9a\xad\xd3\x1c\xd6\x6b\x9d\x9e\xd6\xa6\ \xbe\x3b\x3e\x9e\xcf\x78\xcd\xd6\x49\x0e\xeb\xb5\x4e\x4e\x6a\xd3\
\xbd\x22\x5c\xfd\x7c\x4c\xb8\x80\x3e\x17\x9a\x82\xb0\x81\x65\xda\ \x5e\x11\xae\x7e\x3e\x26\x5c\x40\x9f\x0b\x4d\x41\xd8\xc0\x32\xed\
\x43\x59\x03\x0f\x76\xc7\xdc\xcf\xda\xb6\x2a\x28\xef\x45\x2e\xbd\ \xa1\xac\x81\x07\xbb\x63\xee\x67\x6d\x5b\x25\x94\xf7\x22\x97\x5e\
\xec\x99\x3d\x56\x8d\xcd\x26\xb8\x3a\x53\xf0\x96\x02\x9d\xa7\x46\ \xf6\xcc\x1e\xab\xc6\x66\x13\x5c\x9d\x29\x78\x4b\x81\xce\x53\x23\
\xb6\xce\xcc\x56\xc2\xad\x59\xa8\xd7\x02\x24\x1f\x5b\xb4\x2d\x25\ \x5b\x67\x66\x2b\xe1\xd6\x2c\xd4\x6b\x01\x92\x8f\x2d\xda\x96\x92\
\xf5\x8a\xf7\x57\xc7\x25\xf7\x57\x47\xa5\x54\x1b\xe5\x5a\x68\xd7\ \x7a\xc5\xfb\xab\xa3\x92\xfb\xab\xc3\x52\xaa\x8d\x72\x2d\xb4\x6b\
\xa2\xd5\x16\x79\x82\x4e\xcb\xe8\x33\x46\x66\x13\x44\xa5\x05\x73\ \xd1\x6a\x8b\x3c\x41\x27\x65\xf4\x19\x23\xb3\x09\xa2\xd2\x82\x39\
\xe4\x7d\xce\x24\xf9\xc1\xa6\x6b\xf1\xab\xc0\x80\x4e\x08\xc0\xa6\ \xf2\x3e\x67\x82\xfc\x60\xd3\xb5\xf8\x55\x60\x40\x27\x04\x60\x53\
\x92\x7e\x39\xe7\x86\x1a\x72\x1c\xac\x2e\xdf\x8a\x13\x48\xaf\xbe\ \x49\xbf\x9c\x73\x43\x0e\x39\x0e\x56\x97\x6f\xc5\x51\xc2\xab\x6f\
\xd1\xa9\x57\x6a\xea\x4b\xb0\x11\x46\xb7\x80\x7e\xd3\x52\xa4\xab\ \x74\xea\x95\x9a\xfa\x12\x6c\x84\xd1\x2d\xa0\xdf\xb4\x14\xe9\xea\
\x8b\x17\xf0\x0a\xb4\x66\xd0\x18\xcd\x8e\x14\xf5\x30\x50\x01\xda\ \xe2\x05\xbc\x02\xad\x19\x34\x46\xb3\x23\x45\x3d\x0c\x54\x80\xf6\
\x6b\xfc\x6e\xd6\x63\xbb\xa1\x0b\x0b\x93\xaa\xe2\x7f\xb1\x77\xdc\ \x1a\xbf\x9f\xf5\xd8\x6e\xe8\xc2\xc2\xa4\x2a\xf9\x5f\xec\x3d\xf7\
\x0f\xe6\x93\x2a\xb6\x48\xa1\xd3\x44\x1c\x4f\x92\xb1\xc7\x59\xad\ \xd5\x7c\x52\xc5\x16\x29\x74\x9a\x88\xe3\x71\x32\xf6\x38\xab\xb5\
\x8d\x3b\xb6\x8e\x12\x21\xc8\x08\xac\x74\x87\x73\x44\x96\x41\xdd\ \x71\xc7\xd6\x61\x22\x04\x19\x81\x95\xee\x70\x8e\xc8\x32\xa8\x5b\
\x4a\x6d\x99\x56\xb3\xcc\xb6\x7c\x53\x25\xee\x59\x39\x89\xab\xec\ \xa9\x2d\xd3\x6a\x96\xd9\x96\x6f\xaa\xc4\x3d\x2d\x27\x71\xa5\x9d\
\xdc\x56\x20\x69\x9d\x89\x94\x40\xb2\xef\x7d\x97\xdd\x67\x9b\x2f\ \xdb\x0a\x24\xad\x33\x11\x02\x48\xf6\x83\xef\xb2\xfb\x6c\xf3\xa5\
\xcd\xb5\x98\x2f\x30\x1b\x9c\xd5\x4e\x82\x9b\xd2\x9d\x04\x8f\x0a\ \xb9\x16\xf3\x05\x66\x83\xb3\xda\x49\x70\x53\xba\x93\xe0\x51\xc1\
\x56\x2c\xc1\xf3\x79\x6f\x27\xc1\x57\x2e\xc1\x97\x8d\x4c\xbc\xf0\ \x8a\x25\x78\x3e\xef\xed\x24\xf8\xca\x25\xf8\xb2\x91\x89\x97\x9e\
\x82\x8d\x15\xe0\xe7\xe5\x04\x38\x35\x53\x5b\x8b\xfc\x5e\xcf\xf6\ \xda\x58\x01\x7e\x56\x4e\x80\x53\x33\xb5\xb5\xc8\xef\xf5\x6c\x3f\
\x13\x66\xa3\x19\x7d\x27\xbe\x77\xe2\x7b\x93\xa2\xaa\xcd\x38\x15\ \x61\x36\x9a\xd1\x77\xe2\x7b\x27\xbe\x37\x29\xaa\xda\x8c\x53\xd1\
\x2d\x93\x8b\x52\x6e\xdb\x6f\xdd\xb5\x3a\x23\x4d\xbf\x52\x83\x34\ \x32\xb9\x28\xe5\xb6\xfd\xd6\x5d\xab\x33\xd2\xf4\x2b\x35\x48\xb3\
\xfb\xc0\x7d\xf6\xda\xe5\xc1\x03\x69\x86\x2e\x23\x06\x15\x65\xa2\ \x8f\xdc\x67\x6f\x5c\xae\x1e\x48\x33\x74\x19\x31\xa8\x28\x13\x1d\
\x43\x59\x0e\xed\x68\xb6\xda\xbf\x96\x70\x5c\x87\x89\x93\x55\xe4\ \xca\x72\x68\x47\xb3\xd5\xfe\xb5\x84\xe3\x3a\x4c\x9c\xac\x22\x5f\
\x6b\xc5\x51\xbe\x16\xdf\x43\x7c\x66\x7a\xd2\x66\x85\x37\x53\x06\ \x2b\x8e\xf2\xb5\xf8\x1e\xe2\x33\xd3\x93\x36\x2b\xbc\x99\x32\xb0\
\xd6\xcd\x89\x27\x8f\x67\xc4\xc7\x27\x2b\x2e\x4f\xb8\xba\x07\x9b\ \x6e\x4e\x3c\x7e\x3c\x23\x3e\x3e\x59\x71\x79\xc2\xd5\x3d\xd8\x64\
\xac\xd8\x27\x00\x21\xb9\xa3\x3e\x26\x1b\xce\x52\x89\x74\xe0\xa0\ \xc5\x3e\x01\x08\xc9\x1d\xf5\x31\xd9\x70\x96\x4a\xa4\x03\x07\x8d\
\x11\xf3\x15\x4b\x31\xd2\x15\x36\x19\x89\x50\x15\x92\x7c\x15\xd4\ \x98\xaf\x58\x04\x23\x5d\x61\x93\x91\x08\x95\x21\xc9\x57\x41\xcd\
\xdc\xa5\xb7\x00\x83\x51\xef\x36\x46\x44\x7d\x37\xe6\xbb\xa6\x8e\ \x5d\x7a\x0b\x30\x18\xf5\x6e\x63\x44\xd4\x77\x63\xbe\x6b\xea\x88\
\x14\x4a\x11\xc5\x14\x26\x46\x97\xf0\x5d\x17\x89\x6a\x02\x50\xc2\ \x40\x4a\x22\x99\xc4\xc4\xe8\x12\xbe\xeb\x22\x51\x4d\x00\x2a\xf0\
\x67\xf7\x7c\x63\x55\x7d\xdd\x64\x7e\x5e\x05\x99\x97\x71\xd1\x66\ \xd9\x3d\xdf\x58\x55\x5f\x37\x99\x9f\x55\x41\xe6\x65\x5c\xb4\x59\
\xa5\xe4\x3a\x62\x3c\x8d\x25\xcf\xf5\x18\x18\xa1\xe3\x20\xa4\x28\ \x29\xb9\x4e\x30\x9e\xc6\x92\xe7\x7a\x0c\x8c\xd0\xb1\x0a\x29\x0a\
\xb0\x72\x47\x40\x6a\x07\x44\x00\xb5\xcb\x3b\xae\x58\x58\xa4\x4c\ \xac\xdc\x11\x90\xda\x33\x12\x00\xb5\x8b\x3b\x2e\x59\x58\x24\x4d\
\x7b\xea\xdd\xd1\x29\x50\x5e\x40\x25\xa6\x5b\x12\x5f\xfc\x32\xeb\ \x7b\xea\xdd\xd1\x29\x50\x9e\xa2\x02\xd3\x2d\x89\x1f\xfc\x32\xeb\
\xb1\x0a\x56\x78\xeb\x89\x1e\xf5\xc8\x0a\xc6\xb0\x18\x48\x0d\xd3\ \xb1\x0a\x56\x78\xe7\x05\x3d\xea\x91\x15\x8c\x61\x31\x90\x1a\xa6\
\x03\xfc\x75\x40\x90\x43\xc7\xfa\x67\xb5\x3a\x63\x3c\x1d\x6d\x70\ \x07\xf8\xeb\x80\x20\x87\x8e\xf5\xcf\x6a\x75\xc6\x78\x3a\xda\xe0\
\x26\x60\xdd\xfc\xd3\xbc\xa8\x84\x81\x4a\xc4\xec\x7f\x15\x72\x44\ \x4c\xc0\xba\xf9\xa7\x79\x5e\x09\x03\x95\x88\xd9\xff\x1a\x88\x11\
\x3d\x6f\x7a\x40\x00\x91\x4c\x6a\x32\xc4\x50\x87\x8d\x19\x1e\x58\ \xf5\xbc\xe9\x33\x02\x88\x64\x42\x93\x21\x86\x3a\x6c\xcc\xf0\x99\
\x65\x31\xe6\x4c\x11\x04\x4e\x31\x0f\xca\x99\x7b\x48\x42\xd6\x13\ \x55\x16\x63\xce\x24\x41\xe0\x24\xf3\xa0\x9c\xb9\x07\x24\x64\xbd\
\x63\x6d\xfb\xa4\x93\xe2\x7b\x14\x38\x2b\x8c\xf9\x87\x8c\x18\xbe\ \x60\xac\x6d\x9f\x74\x52\x7c\x8f\x02\x67\x85\x31\xff\x90\x11\xc3\
\x0d\x7c\xa5\x02\x46\xdd\x4a\x32\xdb\xbb\x7a\x90\x24\x00\x89\xc9\ \xb7\x81\xaf\xa4\x62\xd4\xad\x24\xb3\xbd\xab\x07\x49\x02\x90\x98\
\xad\x47\x99\x68\x28\x5e\x02\x10\xbf\x85\xe1\xd7\x1d\x4f\x64\xf1\ \xdc\x7a\x94\x89\x86\xe2\x15\x00\xf1\x5b\x18\x7e\xdd\xf1\x44\x16\
\xc4\x69\x25\x2c\x71\xb1\x5a\x9d\xa2\x4d\xa8\xb8\x76\x40\x27\x35\ \x4f\x9c\x54\xc2\x12\xe7\xab\xd5\x29\xda\x84\x8a\x6b\x07\x74\x52\
\x98\x53\x60\x2c\xa8\x20\xc6\x2f\x36\xa3\x05\xb3\x5b\xa0\x54\x33\ \x83\x39\x05\xc6\x82\x54\x31\x7e\xb1\x19\x2d\x98\xdd\x02\xa5\x9a\
\x89\x2f\x82\xd8\xfb\x3d\xe3\xe0\x1e\xeb\x77\x7c\x6f\x0a\x2f\x30\ \x49\xfc\x40\xc5\xde\xef\x19\x07\xf7\x58\xbf\xe3\x7b\x53\x78\x81\
\x9f\x00\xe8\x60\xe7\x40\xd1\xf5\xcd\x97\x0f\x95\x30\xc5\x8b\x24\ \xf9\x04\x40\x07\x3b\x07\x8a\xae\x6e\xbe\x7c\xac\x84\x29\x5e\x26\
\xdc\x21\xb8\x4f\x5d\xae\x68\xcf\x8b\xbc\xee\xe8\xb0\xf9\xe7\x36\ \xe1\x0e\xc1\x7d\xea\x72\x49\x7b\x5e\xe4\x75\x47\x87\xcd\x3f\xb7\
\xab\x20\xb3\x40\xdd\x0d\x76\xb7\xaf\xdc\xe9\x9b\xbf\xc3\xdd\x39\ \x59\x05\x99\x05\xea\x6e\xb0\xbb\x7d\xe5\x4e\xdf\xfc\x1d\xee\xce\
\x7d\x57\xed\xf4\x6d\x96\x74\x90\x4a\xea\xf2\x89\x9a\x65\x9a\x6a\ \xe9\xbb\x6a\xa7\x6f\xb3\xa4\x83\x54\x50\x97\x4f\xe4\x2c\xd3\x54\
\x59\x00\x3c\xa9\xc6\xcc\xe1\x60\x09\x8e\x05\x20\x52\x1d\xe2\x29\ \xcb\x02\xe0\x49\x39\x66\x0e\x07\x4b\x70\x1c\x00\x22\xe5\x01\x9e\
\x3d\x2c\x3e\x32\x79\x3c\x82\x00\xab\x06\x14\x0f\x91\x3d\xe5\x7e\ \xd2\xc3\xe2\x43\x93\xc7\x13\x10\x60\x55\x45\xf1\x10\xd9\x53\xee\
\x9f\xfb\x00\x77\x09\x46\x5d\x10\x5b\x94\xd4\x1f\xd4\xe1\xce\x59\ \xf7\xb9\x0f\x70\x97\x60\xd4\x05\xb1\x45\x41\xfd\x41\x1d\xee\x9c\
\x90\x21\xb5\x80\xd4\xd5\xa4\xdf\xe7\x69\x4f\xb1\x9d\xc3\xf8\x7e\ \x05\x19\x52\x0b\x48\x5d\x4e\xfa\x7d\x9e\xf6\x14\xdb\x39\x8c\xef\
\x3d\x6a\x1f\xb0\xf7\xc5\x20\x6f\x4b\xa5\x4f\xd5\x27\x41\x0a\xf8\ \xd7\xa3\xf6\x01\x7b\x5f\x0c\xf2\xb6\x54\xfa\x54\x7d\x12\xa4\x80\
\x2c\x0b\xe8\xfb\x12\x07\xbe\xb2\xf4\xfd\x8c\x2f\xb5\xd2\x06\x15\ \xcf\xb2\x80\xbe\x2f\x71\xe0\x2b\x4b\xdf\xcf\xf8\x52\x2b\x6d\x50\
\x4e\x84\xe3\x4c\x24\xa1\x03\x8a\xa6\x6b\xcc\xb0\x0d\x86\xa0\x36\ \xe1\x24\x70\x9c\x89\x20\x74\x40\xd1\x74\x8d\x19\xb6\x6a\x08\x6a\
\x25\x3a\x55\xa8\x39\xbb\xc9\x7d\x97\x3b\x14\x8d\x5c\x13\x99\xc0\ \x53\xa0\x53\x85\x9a\xb3\x9b\xdc\x77\xb9\x43\xd1\xc8\x35\x91\x09\
\xf3\x9e\x0c\x66\x55\xc2\x87\xb1\x28\x11\x80\xde\xf3\xd1\x64\x54\ \x3c\xef\xc9\x60\x56\x25\x7c\x18\x8b\x12\x01\xe8\x3d\x1f\x4d\x46\
\x89\xd6\xee\x53\x4f\xad\x43\x6d\xc3\x1c\x7e\x26\x9d\xbd\xd3\xd8\ \x95\x68\xed\x3e\xf5\xe4\x3a\xd4\x36\xcc\xe1\x67\xd2\xd9\x3b\x8d\
\xf3\x31\x5d\x45\x98\x36\x7f\x87\xcc\x7c\xb4\x81\x57\x4f\xff\xb9\ \x3d\x1f\xd3\x55\x84\x69\xf3\x77\xc8\xcc\x47\x1b\x78\xf5\xf4\x9f\
\x62\xe7\xa3\xe1\xda\xb4\x94\x40\x95\xdf\x63\x3a\xae\xc0\x5d\x26\ \x2b\x76\x3e\x19\xae\x4d\x4b\x09\x54\xf9\x3d\xa6\xe3\x0a\xdc\x65\
\x41\x8c\xc4\xed\x84\x2a\x64\xc8\x1c\x40\x36\x50\xfb\xe7\x67\x37\ \x02\xc4\x48\xdc\x4e\xa8\x42\x86\xcc\x01\x64\x03\xb5\x7f\x7e\x76\
\x54\xb5\x8a\x56\xbc\x66\x07\xa0\x2f\x2f\x2f\x97\x0f\x41\xe7\xe5\ \x43\x55\xab\x68\xc5\x6b\x76\x00\xfa\xe2\xe2\x62\xf9\x10\x74\x5e\
\x55\x9f\xac\x27\xb2\x6d\xc4\xee\x6b\xb3\xe0\x5b\x2a\x7b\xab\xb6\ \x5e\xf5\xf1\x7a\x22\xdb\x46\xec\xbe\x31\x0b\xbe\xa5\xb2\xb7\x6a\
\x58\x9a\x95\x58\x2c\x25\x36\x11\x60\xb1\x24\x7c\x6d\x5d\xb3\xab\ \x8b\xa5\x59\x89\xc5\x52\x62\x13\x01\x16\x4b\xc2\xd7\xd6\x35\xbb\
\x37\x81\x9b\x99\x9b\x61\x28\xf4\x09\x1b\xe6\xb3\x5b\x60\x6b\xf4\ \x7a\x13\xb8\x99\xb9\x19\x86\x81\x3e\x61\xc3\x7c\x76\x0b\x6c\x8d\
\x40\x60\xf0\xa7\x4a\x49\xd2\x85\x21\xc3\x2b\x46\x62\x20\x6d\xb3\ \x1e\x08\x0c\xfe\x54\x29\x49\xba\x30\x64\x78\xc5\x48\x0c\xa4\x6d\
\x3b\x01\xb1\x88\x73\x79\x49\xff\xbe\xc7\x6c\x0a\x10\xed\xb2\x47\ \x76\x27\x20\x16\x71\x2e\xaf\xe8\xdf\xf7\x98\x4d\x01\xa2\x5d\xf6\
\xe0\x62\xb7\x8d\xa8\x38\xb1\x1a\xbf\xec\x44\x95\x88\x7a\x14\xbc\ \x08\x5c\xec\xb6\x11\x19\x27\x56\xe3\x97\x9d\xc8\x12\x51\x8f\x82\
\x7a\x64\xdb\x17\xb3\xea\x08\x45\x81\x93\xfa\x45\xae\xdd\x59\x90\ \x57\x8f\x6c\xfb\x62\x56\x1d\xa1\x28\x70\x52\xbf\xc8\xb5\x3b\x0b\
\xe9\x9c\x27\xed\x78\x4c\xda\x51\x62\x41\xb0\xbb\x2c\xed\x3a\x19\ \x32\x9d\xf3\xa4\x1d\x8f\x49\x3b\x4a\x2c\x08\x76\x97\xa5\x5d\x27\
\x46\xa1\x64\xbc\x89\x03\xcb\xc6\x1e\xf5\x19\x89\x19\xd2\xf6\x3a\ \xc3\x28\x94\x8c\x37\x71\x60\xd9\xd8\xa3\x3e\x23\x31\x43\xda\x5e\
\x1e\x45\xdc\x09\x76\x1a\x7a\x68\x09\x82\xa1\x1b\x54\xb3\x3d\x43\ \xc7\x23\x89\x3b\xc1\x4e\x43\x0f\x2d\x41\x30\x74\x83\x6a\xb6\x67\
\x81\xf8\xdd\xc2\xf4\x49\xc3\x14\x48\x0a\x53\x29\x21\x13\x0b\x0a\ \x28\x10\xbf\x5b\x98\xae\x35\x4c\x4a\x50\x98\x4a\x09\x99\x58\x50\
\x2f\x3d\xea\x4d\x38\xe8\x8e\xe8\xb3\x88\xbe\x9a\xa8\x5c\x89\x3c\ \x78\xe9\x51\x6f\xc2\x41\x77\x44\x9f\x45\xf4\xd5\x44\xe5\x4a\xe4\
\xf8\x2c\x97\x44\x22\x96\x66\xa8\x19\x93\x34\xfa\xf0\x08\x9b\x84\ \xc1\x67\xb9\x24\x12\xb1\x34\x43\xcd\x98\xa4\xd1\x87\x47\xd8\x24\
\x28\x5d\xe3\x90\xfc\x16\x46\xb6\xb5\x75\x30\x4d\xbf\x71\xc7\x01\ \x44\xe9\x1a\x07\xe4\xb7\x30\xb2\xad\xad\x83\x69\xfa\x8d\x3b\x0e\
\x4a\x59\x24\x5d\xab\x00\xc5\xbf\xc1\xb1\x66\x47\x7d\xa7\xe5\x73\ \x50\x8a\x22\xe9\x5a\x05\x28\xfe\x2d\x8e\x35\x3b\xea\x3b\x2d\x9f\
\x48\x0a\x90\x3b\xa2\x62\x17\x7d\x9e\x4f\xe6\x05\x6e\x54\xcb\x74\ \x43\x52\x80\xdc\x11\x15\xbb\xe8\xf3\x7c\x32\x2f\x70\xa3\x5a\xa6\
\x7b\x97\xbd\x85\x25\x21\x9c\x37\x32\xf3\x39\x7f\x86\x05\x48\xd1\ \xdb\xbb\xec\x2d\x2c\x09\xe1\xbc\x91\x99\xcf\xf9\x33\x2c\x40\x8a\
\x92\xfd\xf7\x4f\x9b\x4a\x8b\xe5\xf2\x66\x7f\x15\xd9\x0b\xb8\x9e\ \x96\xec\xbf\x5f\x6f\x2a\x2d\x96\xcb\x9b\xfd\x35\xc8\x5e\xc0\xf5\
\xac\xdd\x7f\xff\x4e\x9e\xde\x88\x71\x66\xf4\x63\x4d\x10\xfc\x87\ \x64\xed\xfe\xfb\x77\xf2\xf4\x26\x18\x67\x46\x3f\xd6\x04\xc1\x7f\
\x3c\x7d\x23\x81\xb7\x6a\x84\xe1\x77\x80\xa1\x0b\x06\x6d\x29\x10\ \xc8\xd3\xb7\x02\x78\xab\x46\x18\x7e\x07\x18\xba\x60\xd0\x96\x02\
\xea\x16\x49\xcd\x6a\x32\xca\xca\x5d\xf2\x18\xb3\x36\x07\x92\xbb\ \xa1\x6e\x91\xd4\xac\x26\xa3\xac\xdc\x25\x8f\x31\x6b\x73\x20\xb8\
\x09\xfd\xa9\xc3\xf5\xd6\x78\xac\x42\x7f\x7e\x85\x2d\x3a\x0e\xba\ \x9b\xd0\x9f\x3a\x5c\x6f\x8d\xc7\x2a\xf4\xe7\x57\xd8\xa2\xe3\xa0\
\xd5\xce\x7c\x33\x81\xcd\x14\x7c\x2b\x8f\xbe\xe7\xfb\x71\x76\xbe\ \x5b\xed\xcc\x37\x13\xd8\x4c\xc1\xb7\xf2\xe8\x7b\xbe\x1f\x67\xe7\
\xfc\x32\xbe\xfc\x22\x3b\xcc\xfc\xb3\x0c\xb5\xb8\xf8\xd3\x7e\x3a\ \xcb\x2f\xe3\xcb\x2f\xb2\xc3\xcc\x3f\xcb\x50\x8b\x8b\x3f\xed\xa7\
\xe3\x00\x89\xc9\x14\x93\x94\xd3\x63\xe4\x96\x2b\x8e\x69\x38\x5a\ \x33\x0e\x90\x98\x4c\x31\x49\x39\x3d\x46\x6e\xb9\xe4\x98\x86\xa3\
\xbc\x64\xdd\x29\x0b\x3b\x01\xbc\xcf\xf1\x96\xc5\xcc\xfb\x58\x02\ \xc5\x4b\xd6\x9d\xb2\xb0\x13\xc0\xfb\x1c\x6f\x59\xcc\xbc\x8f\x25\
\xd1\x44\x67\x0f\xd1\x30\x95\xb5\xca\x0c\x22\xd8\x53\xae\xc5\x9a\ \x10\x4d\x74\xf6\x10\x0d\x53\x59\xab\xcc\x20\x82\x3d\xe5\x5a\xac\
\xb7\x89\x3c\x30\xdc\xdb\xbf\x97\x38\x79\x84\xa5\x9d\x9f\x11\x5d\ \x79\x9b\xc8\x03\xc3\xbd\xfb\x7b\x89\x93\x47\x58\xda\xf9\x19\xd1\
\x19\x2d\xcf\xcf\x51\x46\x92\xb5\x37\x63\xd7\x60\xb8\xbf\x12\x13\ \x95\xd1\xf2\xfc\x1c\x65\x24\x59\x7b\x33\x76\x0d\x86\xfb\xeb\x60\
\x98\xf0\xbc\xe8\x90\xab\x6b\xc3\x18\xd1\x06\x46\xfa\xf4\xa9\x76\ \x02\x13\x9e\x17\x1d\x72\x75\x6d\x18\x23\xda\xc0\x48\x9f\x3e\xd5\
\x83\x3c\xe0\xf5\xe0\x8e\x01\xc3\x32\x0a\x4c\xad\x25\x01\x9e\x79\ \x6e\x90\x07\xbc\xae\xee\x18\x30\x2c\xa3\xc0\xd4\x5a\x12\xe0\x99\
\x58\x9e\xa1\x5c\xe6\xf0\x11\x40\x9e\x1d\x45\x2a\x11\x44\xca\x8e\ \x87\xe5\x19\xca\x65\x0e\x1f\x01\xe4\xd9\x51\xa4\x12\x41\xa4\xec\
\x7a\x19\x5c\x63\xd4\xeb\xf2\xf0\xf2\xe2\x72\xf6\xef\xfc\xa2\xd5\ \xa8\x97\xc1\x35\x46\xbd\x2e\x0e\x2e\xce\x2f\x66\xff\xce\xce\x5b\
\x6e\xd8\xca\xc2\x43\x65\x85\xc1\x6c\x5f\xcd\xc3\xa3\xe4\xbf\xe5\ \xed\x86\xad\x2c\x3c\x54\x56\x18\xcc\xf6\xd5\x3c\x38\x4c\xfe\x5b\
\x47\x29\x68\xbf\x74\x43\x6a\xff\x99\xe4\x4e\x3d\x01\xd6\xbc\xd0\ \x7e\x94\x82\xf6\x4b\x37\xa4\xf6\x9f\x49\xee\xd4\x13\x60\xcd\x0b\
\x34\xf7\x35\x83\x28\x82\x41\xac\xc7\x1f\xac\x5b\x5f\x4c\x3a\x3f\ \x4d\x73\x5f\x33\x88\x24\x18\xc4\x7a\xfc\xc1\xba\xf5\xc5\xa4\xf3\
\xf1\xa8\xa6\xcc\x02\xee\x1b\xa4\x85\xb1\x40\x73\xdb\x5e\x30\xe4\ \x13\x8f\x6a\xca\x2c\xe0\xbe\x41\x5a\x18\x0b\x34\xb7\xed\xa9\x21\
\xe8\x05\x3e\x24\x5d\xcc\x34\xec\x4f\x09\xd8\x11\x8c\xa0\x8b\x1a\ \x47\x2f\xf0\x01\xe9\x62\xa6\x61\x7f\x4a\xc0\x8e\x60\x04\x5d\xd4\
\x6c\x86\x29\x51\x7f\x4e\xa8\x64\x6a\x26\xa2\x46\x61\x37\x25\x12\ \x60\x33\x4c\x89\xfc\x73\x42\x05\x93\x33\x11\x35\x0a\xbb\x29\x91\
\x92\x73\x22\xdc\xcd\xa3\xb5\x44\xb8\x91\x97\x5f\x1b\xda\xd9\x52\ \x90\x9c\x13\xe1\x6e\x1e\xae\x25\xc2\x8d\xbc\xfc\xc6\xd0\xce\x96\
\x4e\xae\x7a\x0b\x5e\xf2\xee\xb0\x05\x99\xf6\x73\x79\xfb\x3d\xde\ \x72\x72\xd5\x5b\xf0\x92\x77\x87\x2d\xc8\xb4\x9f\xcb\xdb\x1f\xf0\
\x51\xee\x63\xbe\xab\x04\x6a\xc4\x53\x7e\xc4\x03\x26\xcf\x3c\x0d\ \x8e\x72\x1f\xf3\x5d\x05\x50\x23\x9e\xf2\x23\x1e\x30\x79\xe6\x69\
\x5e\x33\x8f\xe7\xdb\x14\x56\x53\x76\x61\x47\xf4\xd8\x5d\xd7\x59\ \xf0\x9a\x79\x3c\xdf\xa6\xb0\x9a\xb2\x0b\x3b\xa2\xc7\xee\xba\x4e\
\xfe\xae\xab\x79\x76\x7e\x7e\xde\x6a\x9e\x96\xd9\x7b\x15\x37\x51\ \xf3\x77\x5d\xcd\xd3\xb3\xb3\xb3\x56\xf3\xa4\xcc\xde\xab\xb8\x89\
\xa2\xfc\x9f\xd0\xa8\xc0\xe3\x6f\x3c\x5c\x26\x47\x08\xe9\x72\x9f\ \x12\xe5\xff\x84\x46\x05\x1e\x7f\xe3\xe1\x32\x39\x41\x20\x5c\xee\
\x06\x4c\xc5\xa2\x66\xe4\x29\xa6\x27\xb1\xfb\x43\x72\x4c\xae\xc8\ \x53\xc5\x64\x2c\x6a\x46\x9e\x62\x7a\x12\xbb\x3f\x20\x47\xe4\x92\
\x11\xa8\xeb\x66\x89\xac\xe4\x1c\x71\x71\xb6\x16\x69\x31\xa3\xc5\ \x1c\x82\xba\x6e\x96\xc8\x4a\xce\x11\x17\xa7\x6b\x91\x16\x33\x5a\
\xad\x95\x16\x45\xdd\x17\xf9\xfa\x6b\xe7\xbe\x58\xf9\xe1\x81\x65\ \xdc\x5a\x69\x51\xd4\x7d\x91\xaf\xbf\x76\xee\x8b\x95\x1f\x1e\x58\
\xe5\xe5\x2b\x3e\x62\xbe\x3e\x0c\xbd\x05\x12\x33\x7f\x03\x9b\x9b\ \x56\x5e\xbe\xe6\x23\xe6\xeb\xc3\xd0\x5b\x20\x31\xf3\x37\xb0\xb9\
\x51\x77\x51\x4d\x3e\xdd\x5a\xc4\x87\xcb\x47\x9f\xb6\x5e\x82\x54\ \x19\x75\xe7\xd5\xe4\xd3\xad\x45\x7c\xb8\x7c\x74\xbd\xf5\x12\xa4\
\x6d\x6f\x14\x38\xf0\x97\xc5\x40\x0b\xf2\xe6\xe6\xf2\xcf\x8d\xf0\ \x6a\x7b\xa3\xc0\x81\xbf\x2c\x06\x5a\x90\x37\x37\x97\x7f\x6e\x02\
\x40\x69\xf9\x4e\xa5\x91\xc7\x7c\x59\x9b\xcf\xfa\x3b\x59\xbb\x12\ \x0f\x94\x96\xef\x54\x1a\x79\xcc\x97\xb5\xf9\xac\xbf\x93\xb5\x2b\
\x57\x71\x01\x67\xd1\x4f\x60\xd6\x45\x17\xd8\x68\xe1\x88\xa9\x76\ \x71\x15\x17\x70\x16\xfd\x04\x66\x5d\x74\x81\x8d\x16\x8e\x98\x6a\
\x2e\xe6\x65\xf4\x27\xbe\x63\x0c\xb8\x60\x48\x03\x9d\x19\x4a\x49\ \xe7\x62\x5e\x46\x7f\xe2\x3b\xc6\x80\x53\x43\xaa\x74\x66\x28\x25\
\x10\xb2\xc8\xe1\xde\x37\x6c\x6d\xcf\xb7\xb8\xbc\xdf\x87\x9d\x22\ \x2a\x64\x91\x83\xbd\x6f\xd8\xda\x9e\x6f\x71\x79\xbf\x0f\x3b\x45\
\x94\xe3\xe6\xd0\x83\xfd\xa2\x4e\x4e\x31\x1d\x86\x5b\xcc\x40\x32\ \x28\xc7\xcd\xa1\x07\xfb\x45\x9d\x9c\x62\x3a\x0c\xb7\x98\x4a\x30\
\x7d\xe8\x85\x2a\xa2\x00\xb0\x12\x7b\xc6\x9c\x53\x5c\x8d\x65\x08\ \x7d\xe8\x85\x4a\x22\x01\xb0\x12\x7b\xc6\x9c\x53\x5c\x8d\x65\x08\
\xde\x1f\x00\x39\x04\x2c\x8d\x22\xeb\x47\x02\x93\xb5\xb9\x22\x0f\ \xde\x1f\x00\x39\x28\x96\x46\x91\xf5\x23\x81\xc9\xda\x5c\x91\x87\
\x53\x8e\x1f\x0b\x46\x39\x5d\xbf\x1f\x2b\x88\x44\xde\x4e\x17\x65\ \x29\xc7\x8f\x05\xa3\x9c\xac\xdf\x8f\xa5\x22\x91\xb7\xd3\x45\x59\
\xe9\xa2\xb3\x72\xaa\x68\x41\x86\xd7\xc2\x84\x18\x6c\x41\x8c\x2c\ \xba\xe8\xb4\x9c\x2a\x5a\x90\xe1\xb5\x30\x21\x06\x5b\x10\x23\x0b\
\xd8\x70\xaf\x7a\x7e\x40\xfd\xef\x20\x2a\xc3\x35\x31\xe3\xe9\x43\ \x36\xdc\xab\x9e\x1f\x50\xff\x3b\x88\xca\x70\x4d\xcc\x78\xfa\xd0\
\x37\xb8\x3c\x4a\xdf\x4b\xe4\xce\x6c\xef\xd5\xee\x6d\x67\xd2\xa1\ \x0d\x2e\x8f\xd4\xf7\x12\xb9\x33\xdb\x7b\xb5\x7b\xdb\x99\x74\x68\
\x55\x83\x97\x1b\xa7\x17\x12\xdf\x96\x8a\x87\xa2\x06\x58\xbe\x23\ \xd5\xe0\xe5\xc6\xe9\x85\xc4\xb7\xa5\xe2\xa1\xa8\x01\x96\xef\xc8\
\x67\x67\x80\xad\x7a\xb3\xbb\xe0\x66\xa7\xc7\x09\xc8\x3e\xe0\x7b\ \xd9\x19\x60\xab\xde\xec\x2e\xb8\xd9\xe9\x71\x02\xb2\x0f\xf8\xde\
\x13\x6f\x16\x5c\x3e\xc7\x28\xeb\x5e\x41\x9c\xa5\x7e\x77\xf6\x35\ \xc4\x9b\x05\x97\xcf\x31\xca\xba\x57\x10\x67\xa9\xdf\x9d\x7d\xcd\
\x47\xfb\x81\xd8\x0c\x21\x74\xb8\xf7\x1e\xe0\xa5\x3e\xda\x5d\x34\ \xd1\x7e\x20\x36\x43\x08\x1d\xec\x7d\x00\x78\xa9\x8f\x76\x17\x8d\
\xf6\xa6\x9a\x38\x43\x34\xc0\x9e\xfc\x39\x11\xc1\xf3\x17\x92\x53\ \xbd\x29\x27\xce\x10\x0d\xb0\x27\x7f\x4e\x02\xf5\xe2\xa5\xe0\xd4\
\xcf\xfc\xc4\x54\xa6\x70\x20\x15\x4c\xbd\x74\x53\x45\x7d\x15\xb6\ \x33\x3f\x31\x95\x29\x1c\x48\xaa\xa9\x97\x6e\x2a\xa9\x2f\xc3\x96\
\xb4\x25\x4c\xf2\xbe\xf9\xb9\x07\xf0\x98\x5f\x23\xe1\x8b\xb0\x19\ \xb6\x84\x09\xde\x37\x3f\xf7\x00\x1e\xf3\x6b\x14\xf8\x41\xd8\x0c\
\x02\x49\xfa\x74\xc4\xbd\x69\xd6\xb8\x07\xef\x98\x77\xcb\xf0\xdb\ \x81\x24\x7d\x3a\xe2\xde\x34\x6b\xdc\x67\xef\x99\x77\xcb\xf0\xdb\
\xc0\x07\x51\xe7\xe6\x25\x0d\xaa\x36\x2c\xa9\x01\x66\x2f\xe3\xfd\ \xc0\xcf\xa2\xce\xcd\x4b\x1a\x54\x6d\x58\x52\x03\xcc\x5e\xc6\xfb\
\x67\x2f\x85\xe7\x9a\xe7\x4a\x92\x19\x70\x8c\xad\xfa\x7a\x6a\x59\ \xcf\x5f\x05\x9e\x6b\x9e\x2b\x49\x66\xc0\x31\xb6\xea\xeb\xa9\x65\
\x49\x6f\xb8\x68\x4b\xe5\x7c\xd5\x2e\x89\x02\x27\xfc\x32\x7d\x7a\ \x25\xbd\xe1\xa2\x2d\x95\xf3\x55\xbb\x24\x0a\x9c\xf0\xcb\xf4\xe9\
\xcb\xde\xe3\x1f\xc9\xb9\xd1\xd8\xc3\x4f\xc1\xaa\x21\x63\x95\x0a\ \x2d\x7b\x8f\x7f\x24\xe7\x46\x63\x0f\x3f\x05\x2b\x87\x8c\x55\x2a\
\xbb\x7c\xfd\xb8\x60\x22\x3b\x05\xb9\x12\x0f\xc5\x1b\xee\xb1\xeb\ \xec\xf2\xf5\xe3\x82\x89\xec\x14\xe4\x4a\x3c\x14\x6f\xb9\xc7\xae\
\xa1\x10\x20\x63\x1f\x28\x97\x3e\xd4\x39\xa6\x6e\x91\xd1\xcd\xfd\ \x86\x41\x00\x32\xf6\x81\x72\xe9\x43\x9d\x63\xea\x16\x19\xdd\xdc\
\xa2\x46\xf7\xf1\x51\x3e\x82\x4a\xe1\xa7\x78\xc0\xc9\x4d\x53\xbf\ \x2f\x6a\x74\x1f\x1d\xe6\x23\xa8\x14\x7e\x8a\x07\x9c\xdc\x34\xf5\
\xbd\x9f\x54\x67\xb4\x39\xe8\x4f\x30\x49\x6d\xf8\x0d\xab\xf0\xbc\ \xdb\xfb\x49\x75\x46\x9b\x83\xfe\x04\x93\xd4\x86\xdf\xb0\x0a\xcf\
\x56\x31\x06\x29\x27\x34\x0d\x54\x3b\xa1\x39\x47\x68\x16\xb8\xf3\ \x6b\x15\x63\x90\x72\x42\xd3\x40\xb5\x13\x9a\xd9\x42\xb3\x55\xd1\
\x36\x43\x68\x96\x8f\x82\x3c\xa1\xa3\xf1\x73\xf2\x81\x51\x17\x04\ \x49\xc1\x12\x97\x19\x7e\x37\xd9\x93\xa9\x83\x53\x51\x3a\x25\xbe\
\x1a\x95\x52\xdc\x19\x73\x62\x13\x4f\x96\xac\xec\x5c\x09\x1f\x99\ \x6c\x93\x22\x34\x79\x31\x72\x8d\x97\x7c\x8e\x05\x1f\x71\xcc\xad\
\xef\x92\x6e\x2a\x55\x96\x3b\xd3\xf0\x4a\x04\xe4\xb4\xbe\x23\x15\ \x94\xe1\xbd\x84\x18\x04\x35\xaf\xcc\xee\x41\xd4\x44\x49\x6f\x41\
\x38\xfc\x79\xbd\xc3\x5f\xd6\x37\xfc\x35\x97\x0e\xec\x0c\x6a\xc4\ \x87\x63\x46\x47\x25\x77\xb4\x61\xee\xb7\x06\xe8\x7a\x06\xd0\x7a\
\xbf\x85\xa0\xc6\x25\xb0\x10\xd4\xb8\x0a\x5d\x10\x2d\xc3\x3a\x17\ \xbe\xde\x2d\x19\x0e\x1b\x1f\x75\x47\xf2\x99\x76\x42\x81\x6b\x9e\
\xc1\x00\x50\xe3\x1a\x18\x00\x6a\x5c\x82\x97\xd4\xf9\xa1\xea\x5e\ \x33\xec\x84\xf2\x81\xbf\x27\x74\x34\x7e\x41\x3e\x02\x85\x82\x0e\
\x86\x08\x88\x1a\x97\x22\x02\xa2\xd4\x72\xd4\x6e\xaa\x94\xf4\xf3\ \xa7\x42\x04\x77\xc6\x82\xde\xc4\xc3\x54\x2b\x3b\x4a\xc5\x47\xe6\
\x37\xf3\x93\x64\xe6\x5b\x2b\xdf\xa0\x15\x77\xa8\x17\xf3\xdd\x18\ \x53\xbc\x9b\x4a\x95\xe5\x8e\xf1\xbc\x0e\x14\x39\xa9\xef\x14\x11\
\x9f\x56\x6c\x27\xb5\x89\xe6\xca\xaa\xbe\x02\x1d\xbf\x80\x41\xf4\ \x0e\x7f\x56\xef\xf0\x17\xf5\x0d\x7f\xc5\x85\x03\x9b\xe1\x1a\xf1\
\x8d\xbf\x2b\xc4\x84\xf5\x6c\xd9\x13\x2f\xb0\xe1\x89\x23\x89\x4a\ \x6f\x21\xa8\x71\x09\x2c\x04\x35\xae\x42\x17\x44\xcb\xb0\xce\x45\
\x46\x6e\x2d\xf2\x0e\x49\xb8\x4d\x86\x5e\x3d\xd6\x0f\x0e\xf0\x96\ \x30\x00\xd4\xb8\x06\x06\x80\x1a\x97\xe0\x15\x75\x7e\xc8\xba\x97\
\x5d\x73\x26\x06\x7b\x7c\xdf\xfd\x0d\x6f\x6b\xf7\x5d\x2a\xcb\x5c\ \x21\x02\xa2\xc6\xa5\x88\x80\x28\xb5\x1c\xb5\x9b\x2a\x25\x43\x5b\
\x28\x5d\xcc\x0a\x4b\x2c\xe0\xdf\xd1\x14\xfb\x00\x88\x26\x4f\xe3\ \xcd\xfc\xbc\xb0\xf9\xd6\xca\x37\x68\xc5\x1d\xea\xc5\xdc\x95\xc6\
\xb8\xad\xf1\xac\xeb\x97\x79\x21\xb2\x2d\x91\x40\x25\xc5\xcf\xb2\ \x8d\x1b\x73\x1e\x6c\xa2\xb9\xb2\xaa\x0f\x9f\xc7\xef\x1c\x09\xfa\
\xdf\xbc\x7e\xe1\xe9\xdc\x4d\xd8\x59\x77\xbf\xbd\x25\x40\x68\xf8\ \xc6\xc5\x1b\x62\xc2\x3a\x73\xed\x21\x2f\xd8\xe3\xc7\x91\x44\x05\
\x08\x3c\x24\x9c\xca\x25\xcf\x02\x3f\x53\xfe\x61\xbd\x9d\x9f\x69\ \x23\xb7\x16\x79\x07\x24\xf4\x0c\x41\xaf\x1e\xeb\x2b\xdc\x7f\x70\
\xad\x7e\xa6\x05\xe9\xcd\x5b\xed\x67\x7a\x87\x47\x1c\xf0\xee\x33\ \x73\x0c\x0c\x7b\xfc\xd0\xfd\x0d\x3f\x50\xe0\xbb\x54\x94\xb9\x43\
\x0c\x97\x28\x7b\xee\x81\x82\xaa\x91\xcc\x09\x84\x9c\xe2\x45\x8b\ \xbd\x98\x15\x96\x58\xc0\xbf\xa3\x29\xf6\x11\x10\x4d\x9e\xc6\x71\
\x81\xfd\xbc\x33\x32\x09\xe2\x45\xc5\x0b\x9f\x78\xc1\xf3\xb1\xe1\ \x5b\xe3\xf1\xee\x2f\xf3\xa2\xc2\x5b\x22\x81\x4a\x8a\x9f\x65\x3f\
\x9c\x27\x83\xe0\x39\x3a\xad\xf0\xee\xe5\x28\x75\x26\x8c\xc3\xb8\ \xf3\xfe\xd2\xd3\xe9\xca\xb0\xb5\xef\x7e\x7b\x07\xbb\x69\x85\x8f\
\x2e\x73\xd1\x83\x85\x2a\x29\x14\x99\x36\x86\x03\xcd\x40\x5d\xd9\ \xc0\x43\x81\x53\xb9\xe4\x59\xe0\x5a\xcd\x3f\x9f\xba\x73\xad\xae\
\x5e\xd6\xf3\x2d\x1b\x3b\x18\x92\xc0\xa6\xea\xa7\x72\x32\x39\x59\ \xd5\xb5\xba\x20\xa3\x7f\xab\x5d\xab\xef\xf1\x54\x0f\x5e\xf7\x87\
\x99\xe8\x2b\x6a\x17\x6b\x14\x6b\x61\xe5\xf7\x2c\x20\x66\x4e\x7a\ \x11\x42\x69\x8f\xfa\x50\x50\x35\x82\x39\x2a\x10\x53\xbc\x5b\x54\
\x5d\xed\x9f\xed\x93\x11\x95\x03\xee\x5f\xed\x37\x9b\xfb\x98\x6b\ \xd9\x2f\x9a\x23\x93\x20\x5e\x64\xbc\xf0\x89\xa7\x5e\x8c\x0d\xe7\
\xd4\x1e\xf3\xfb\x11\x1d\x87\xc9\x52\x9d\x3f\x3f\xe9\xe7\x37\x52\ \x3c\x19\xa8\x17\xe8\xa7\xc5\xeb\xc6\xa3\x6c\xb1\x30\xf4\xe8\xba\
\x8c\x3e\x82\xb1\xd2\x15\x13\x89\xc9\x35\xa9\x56\xf0\x9e\x33\x51\ \xcc\x45\xa7\x2d\xaa\xa4\x50\x64\x5a\xbf\x19\x34\x03\x75\x65\x7b\
\x81\x18\x99\x11\x95\x86\x24\x5e\x62\xa0\xd4\xec\xda\xd1\xdc\x1a\ \x59\x8f\x1b\xcb\x0e\x86\x24\xb0\xa9\xfa\xa9\x9c\x4c\x4e\x56\x26\
\xe3\x54\xc0\x9f\x2e\xd7\x4d\x40\xb2\x33\xdf\x55\x9d\xcf\xdf\xf5\ \xfa\x8a\xda\xc5\x1a\xc5\x5a\x58\xf9\x3d\x8b\x01\x9b\xc3\x8d\x97\
\x7b\x20\xea\x6c\xc1\x9e\xe1\x26\x74\x7d\x61\x0f\x0d\xec\xe0\x15\ \xfb\xa7\xfb\x64\x44\xc5\x80\xfb\x97\xfb\xcd\xe6\x3e\xa6\xd7\xb5\
\xa7\x9e\x18\x1c\x0e\x91\xb9\x74\x85\x46\x40\x7a\xdc\x7c\x40\xae\ \xc7\xfc\x7e\x44\xc7\x61\x7e\x60\xe7\xcf\x6b\xfd\xfc\x56\x04\xa3\
\xf1\x53\x4c\x2f\x27\x41\xa0\xcd\x9a\x0c\x40\x3e\x4d\xd4\x30\xac\ \x4f\x60\xac\x74\x83\x89\xc0\x7c\xb2\x54\x2b\x78\xcf\x99\x48\x15\
\x9f\x07\x8c\x01\x56\x95\x83\x24\x25\xc0\x32\xa1\x79\x88\xbb\x79\ \x8c\xcc\x88\x52\x43\x12\x2f\x31\x50\x6a\x76\xed\x68\x6e\x8d\x71\
\x20\x61\x6f\x2b\x03\xcb\xa6\xcc\x64\x23\x68\x56\xb9\x16\x50\x16\ \x2a\xe0\x4f\x97\xeb\x26\x20\xd9\x99\xef\xca\xce\xe7\xef\xfa\x3d\
\xad\xd7\xc3\x45\x5d\x0f\x58\xf6\xb8\x7e\x36\x8a\xa2\xda\x35\xe1\ \x10\x75\xb6\x60\xcf\x70\x13\xba\xbe\xb0\x87\x06\x76\xf0\x9a\x53\
\xc8\xec\x76\xe6\x00\x33\xab\x5d\x0b\x30\x61\x56\x41\x36\x30\x51\ \x2f\x18\x1c\x0c\x91\xb9\x74\x85\x46\x40\x7a\xdc\x7c\x40\xae\xf0\
\xed\x5a\x80\x49\x64\x80\x65\x43\x94\x6a\x52\x1e\xac\x64\x01\xf6\ \xeb\x63\xaf\x26\x4a\x69\xb3\x26\x03\x90\xeb\x89\x1c\x86\xf5\xf3\
\xd4\x96\x4c\x69\x41\xaa\xb4\xc8\x05\xdd\xeb\x33\x93\x9b\x6a\x66\ \x80\x31\xc0\xca\x72\x90\xa4\x04\x58\x26\x34\x0f\x71\x37\x0f\x24\
\x31\x7b\x36\xa3\x2a\x00\x00\xfa\xce\xb8\xf4\x05\x03\xe9\xbe\x1d\ \xec\x6d\x65\x60\xd9\x2c\xb1\x6c\x04\xcd\x2a\xd7\x02\xca\xa2\xf5\
\x17\xad\x93\x81\x4f\xbd\x8e\xe3\xe1\xa1\x47\xf7\x29\x9e\xb3\xc4\ \x7a\xb8\xa8\xeb\x01\xcb\x46\x36\xb2\x51\x14\xd5\xae\x09\x47\x66\
\x1d\x8c\x29\xd5\x2d\xc0\x04\x60\xfc\x36\xde\x57\xea\x28\x79\xbb\ \xb7\x33\x07\x98\x59\xed\x5a\x80\x09\x13\x69\xb2\x81\x89\x6a\xd7\
\x31\x6b\x62\xba\xf4\x44\xd0\x01\x35\xf8\xda\x9c\xea\x9c\xf5\x89\ \x02\x4c\x22\xe9\x31\x1b\xa2\x54\x93\xf2\x60\x25\x0b\xb0\xa7\xb6\
\xc5\x06\x23\xf8\xe5\x06\xab\x91\xf0\x37\x09\xa6\x63\x34\x35\xf5\ \x60\x52\x0b\x52\xa9\x45\x2e\xe8\x5e\x9f\x99\x74\x6c\x33\x8b\xd9\
\xf4\x12\x61\x8f\xf6\x7d\xe7\x12\x00\xbe\x0f\x1f\xa7\x9d\xe3\xf3\ \xb3\x19\x55\x02\x00\xd0\x77\xc6\x3d\x47\x98\x3b\xe2\xdb\x71\xd1\
\xcb\x76\x63\x1a\xaa\x33\x7c\xfb\x61\x47\x2e\xc3\xaf\xcd\x68\xc3\ \x3a\x19\xf8\xd4\xeb\x38\x1e\x9e\xf3\x75\x9f\xe2\xd1\x62\xdc\xc1\
\x38\xdd\xdb\x49\xf3\x3c\xd9\xdd\x45\x33\xab\x3b\xf3\x53\xd9\xa5\ \x98\x52\xdd\x02\x4c\x00\xc6\x6f\xe3\x7d\xa5\x6e\x4f\x68\x37\x66\
\x49\xa0\x76\xad\x98\x9e\x1d\x9f\xad\x16\xc7\x88\xd3\x04\x8e\x8f\ \x4d\x4c\x97\x5e\xa0\x3a\xa0\x06\xdf\x98\x83\xcc\xb3\x3e\xb1\xd8\
\xcb\xe0\xf8\xf4\xbc\x99\xea\xee\xa4\x32\x1c\x9f\xac\x0e\xc7\x67\ \x60\x04\x3f\x56\x62\x35\x12\xfe\x26\x6a\x3a\x46\x53\x53\x4f\x2f\
\xd5\xe2\xf8\x2c\x49\x78\xad\xf3\xa3\x55\xe2\xb8\x75\xde\xda\x40\ \x11\xf6\x68\xdf\x77\x2e\x00\xe0\xfb\xf0\x71\xda\x39\x3a\xbb\x68\
\x1c\x87\xd7\xca\x57\x8c\xd9\xd6\x4a\x31\xdb\x3c\x5b\x1b\x66\x97\ \x37\xa6\xa1\x3a\xc3\xb7\x1f\x76\xe4\x32\xfc\xc0\x92\x36\x8c\xd3\
\x97\x10\xe1\x0d\x28\xd5\x62\xf6\xf4\x22\xc9\xc8\x67\xa7\x65\x30\ \xbd\x1d\x37\xcf\x92\xdd\x9d\x37\xb3\xba\x33\x3f\xa5\x5d\x9a\x04\
\x7b\x7c\x7a\xb2\x05\xb2\x37\xbc\xe3\xa1\x5a\xcc\x1e\x1f\xa7\x30\ \x6a\xd7\x8a\xe9\xd9\x89\xf1\x6a\x71\x8c\x38\x4d\xe0\xf8\xa8\x0c\
\x7b\xbe\x4a\x9a\xad\x12\xb3\xe7\xe5\x25\x6e\x74\x4f\x76\xb5\x48\ \x8e\x4f\xce\x9a\xa9\xee\x8e\x2b\xc3\xf1\xf1\xea\x70\x7c\x5a\x2d\
\x6e\xa6\xe8\xb7\x75\x59\x4a\x32\x9c\xa0\xbf\x26\xd1\x5d\xa6\x9a\ \x8e\x4f\x93\x84\xd7\x3a\x3b\x5c\x25\x8e\x5b\x67\xad\x0d\xc4\x71\
\xdc\x14\xdb\x21\x76\xe7\x57\xc5\xd6\x43\xda\x42\x2b\x25\x25\x5a\ \xf8\x25\x85\x8a\x31\xdb\x5a\x29\x66\x9b\xa7\x6b\xc3\xec\xf2\x12\
\xad\xb3\xc7\x18\x23\xf3\xb1\x1c\x7f\x84\xfa\x76\x63\xc2\x3b\x7b\ \x22\xbc\xf4\xa7\x5a\xcc\x9e\x9c\x27\x19\xf9\xf4\xa4\x0c\x66\x8f\
\xff\x07\xbf\xef\x72\xe5\ \x4e\x8e\xb7\x40\xf6\x86\xd7\x9a\x54\x8b\xd9\xa3\xa3\x14\x66\xcf\
\x56\x49\xb3\x55\x62\xf6\xac\xbc\xc4\x8d\xae\x86\xaf\x16\xc9\xcd\
\x14\xfd\xb6\x2e\x4a\x49\x86\x63\xf4\xd7\x24\xba\xcb\x54\x93\x9b\
\x62\x3b\xc4\xae\xb9\xab\xd8\x7a\x48\x5b\x68\xa5\xa4\x44\xab\x75\
\xfa\x18\x63\x64\x3e\x96\xe3\x8f\x50\xdf\x6e\x4c\x78\x67\xef\xff\
\x40\xba\x52\xd7\
\x00\x00\x07\xb5\ \x00\x00\x07\xb5\
\x00\ \x00\
\x00\x1a\x6e\x78\x9c\xed\x58\x5d\x6f\xe3\xb8\x15\x7d\xcf\xaf\x50\ \x00\x1a\x6e\x78\x9c\xed\x58\x5d\x6f\xe3\xb8\x15\x7d\xcf\xaf\x50\
@ -52924,60 +52929,60 @@ qt_resource_struct = "\
\x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x01\x64\ \x00\x00\x00\x64\x00\x00\x00\x00\x00\x01\x00\x00\x01\x64\
\x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x04\xc4\ \x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x04\xc4\
\x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x03\x12\ \x00\x00\x00\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x03\x12\
\x00\x00\x06\xce\x00\x01\x00\x00\x00\x01\x00\x0a\xf7\xe1\ \x00\x00\x06\xce\x00\x01\x00\x00\x00\x01\x00\x0a\xf8\x2f\
\x00\x00\x04\x7c\x00\x00\x00\x00\x00\x01\x00\x0a\x54\xca\ \x00\x00\x04\x7c\x00\x00\x00\x00\x00\x01\x00\x0a\x55\x18\
\x00\x00\x09\x04\x00\x01\x00\x00\x00\x01\x00\x0b\xbc\x53\ \x00\x00\x09\x04\x00\x01\x00\x00\x00\x01\x00\x0b\xbc\xa1\
\x00\x00\x0b\x6c\x00\x01\x00\x00\x00\x01\x00\x0c\x8c\xef\ \x00\x00\x0b\x6c\x00\x01\x00\x00\x00\x01\x00\x0c\x8d\x3d\
\x00\x00\x05\x86\x00\x01\x00\x00\x00\x01\x00\x0a\x94\x75\ \x00\x00\x05\x86\x00\x01\x00\x00\x00\x01\x00\x0a\x94\xc3\
\x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x0b\x15\x2b\ \x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x0b\x15\x79\
\x00\x00\x08\x2a\x00\x01\x00\x00\x00\x01\x00\x0b\x7d\xd9\ \x00\x00\x08\x2a\x00\x01\x00\x00\x00\x01\x00\x0b\x7e\x27\
\x00\x00\x07\x8a\x00\x00\x00\x00\x00\x01\x00\x0b\x3e\xfa\ \x00\x00\x07\x8a\x00\x00\x00\x00\x00\x01\x00\x0b\x3f\x48\
\x00\x00\x09\x9e\x00\x01\x00\x00\x00\x01\x00\x0b\xfc\xf4\ \x00\x00\x09\x9e\x00\x01\x00\x00\x00\x01\x00\x0b\xfd\x42\
\x00\x00\x0b\xbc\x00\x01\x00\x00\x00\x01\x00\x0c\xa9\x13\ \x00\x00\x0b\xbc\x00\x01\x00\x00\x00\x01\x00\x0c\xa9\x61\
\x00\x00\x04\xc2\x00\x01\x00\x00\x00\x01\x00\x0a\x6d\xec\ \x00\x00\x04\xc2\x00\x01\x00\x00\x00\x01\x00\x0a\x6e\x3a\
\x00\x00\x08\x50\x00\x01\x00\x00\x00\x01\x00\x0b\x83\x9d\ \x00\x00\x08\x50\x00\x01\x00\x00\x00\x01\x00\x0b\x83\xeb\
\x00\x00\x06\xf0\x00\x00\x00\x00\x00\x01\x00\x0b\x02\x95\ \x00\x00\x06\xf0\x00\x00\x00\x00\x00\x01\x00\x0b\x02\xe3\
\x00\x00\x04\xe6\x00\x01\x00\x00\x00\x01\x00\x0a\x73\x6b\ \x00\x00\x04\xe6\x00\x01\x00\x00\x00\x01\x00\x0a\x73\xb9\
\x00\x00\x07\x5e\x00\x01\x00\x00\x00\x01\x00\x0b\x2d\xf0\ \x00\x00\x07\x5e\x00\x01\x00\x00\x00\x01\x00\x0b\x2e\x3e\
\x00\x00\x04\x9e\x00\x01\x00\x00\x00\x01\x00\x0a\x63\x80\ \x00\x00\x04\x9e\x00\x01\x00\x00\x00\x01\x00\x0a\x63\xce\
\x00\x00\x0a\xf6\x00\x00\x00\x00\x00\x01\x00\x0c\x6f\x1b\ \x00\x00\x0a\xf6\x00\x00\x00\x00\x00\x01\x00\x0c\x6f\x69\
\x00\x00\x03\xfc\x00\x01\x00\x00\x00\x01\x00\x0a\x2f\x38\ \x00\x00\x03\xfc\x00\x01\x00\x00\x00\x01\x00\x0a\x2f\x86\
\x00\x00\x05\xd6\x00\x01\x00\x00\x00\x01\x00\x0a\xaf\x94\ \x00\x00\x05\xd6\x00\x01\x00\x00\x00\x01\x00\x0a\xaf\xe2\
\x00\x00\x0a\xae\x00\x01\x00\x00\x00\x01\x00\x0c\x57\xec\ \x00\x00\x0a\xae\x00\x01\x00\x00\x00\x01\x00\x0c\x58\x3a\
\x00\x00\x0a\xd0\x00\x01\x00\x00\x00\x01\x00\x0c\x65\x87\ \x00\x00\x0a\xd0\x00\x01\x00\x00\x00\x01\x00\x0c\x65\xd5\
\x00\x00\x05\xb4\x00\x00\x00\x00\x00\x01\x00\x0a\x9d\x7b\ \x00\x00\x05\xb4\x00\x00\x00\x00\x00\x01\x00\x0a\x9d\xc9\
\x00\x00\x03\xca\x00\x01\x00\x00\x00\x01\x00\x0a\x27\x7f\ \x00\x00\x03\xca\x00\x01\x00\x00\x00\x01\x00\x0a\x27\xcd\
\x00\x00\x08\xba\x00\x01\x00\x00\x00\x01\x00\x0b\xa5\x29\ \x00\x00\x08\xba\x00\x01\x00\x00\x00\x01\x00\x0b\xa5\x77\
\x00\x00\x09\xf8\x00\x00\x00\x00\x00\x01\x00\x0c\x0d\x3c\ \x00\x00\x09\xf8\x00\x00\x00\x00\x00\x01\x00\x0c\x0d\x8a\
\x00\x00\x06\x2a\x00\x01\x00\x00\x00\x01\x00\x0a\xc1\x04\ \x00\x00\x06\x2a\x00\x01\x00\x00\x00\x01\x00\x0a\xc1\x52\
\x00\x00\x0a\x1c\x00\x00\x00\x00\x00\x01\x00\x0c\x23\xef\ \x00\x00\x0a\x1c\x00\x00\x00\x00\x00\x01\x00\x0c\x24\x3d\
\x00\x00\x07\xe4\x00\x00\x00\x00\x00\x01\x00\x0b\x56\xad\ \x00\x00\x07\xe4\x00\x00\x00\x00\x00\x01\x00\x0b\x56\xfb\
\x00\x00\x05\x38\x00\x01\x00\x00\x00\x01\x00\x0a\x83\x6b\ \x00\x00\x05\x38\x00\x01\x00\x00\x00\x01\x00\x0a\x83\xb9\
\x00\x00\x0b\x8c\x00\x00\x00\x00\x00\x01\x00\x0c\x97\x9d\ \x00\x00\x0b\x8c\x00\x00\x00\x00\x00\x01\x00\x0c\x97\xeb\
\x00\x00\x06\x84\x00\x00\x00\x00\x00\x01\x00\x0a\xd8\x43\ \x00\x00\x06\x84\x00\x00\x00\x00\x00\x01\x00\x0a\xd8\x91\
\x00\x00\x04\x28\x00\x00\x00\x00\x00\x01\x00\x0a\x37\x3f\ \x00\x00\x04\x28\x00\x00\x00\x00\x00\x01\x00\x0a\x37\x8d\
\x00\x00\x0b\xec\x00\x00\x00\x00\x00\x01\x00\x0c\xb4\xec\ \x00\x00\x0b\xec\x00\x00\x00\x00\x00\x01\x00\x0c\xb5\x3a\
\x00\x00\x0a\x64\x00\x00\x00\x00\x00\x01\x00\x0c\x41\x76\ \x00\x00\x0a\x64\x00\x00\x00\x00\x00\x01\x00\x0c\x41\xc4\
\x00\x00\x04\x4c\x00\x01\x00\x00\x00\x01\x00\x0a\x4c\x5f\ \x00\x00\x04\x4c\x00\x01\x00\x00\x00\x01\x00\x0a\x4c\xad\
\x00\x00\x0a\x8c\x00\x01\x00\x00\x00\x01\x00\x0c\x50\x9d\ \x00\x00\x0a\x8c\x00\x01\x00\x00\x00\x01\x00\x0c\x50\xeb\
\x00\x00\x09\x26\x00\x01\x00\x00\x00\x01\x00\x0b\xc4\xfc\ \x00\x00\x09\x26\x00\x01\x00\x00\x00\x01\x00\x0b\xc5\x4a\
\x00\x00\x0b\x1c\x00\x01\x00\x00\x00\x01\x00\x0c\x77\xa8\ \x00\x00\x0b\x1c\x00\x01\x00\x00\x00\x01\x00\x0c\x77\xf6\
\x00\x00\x06\xac\x00\x01\x00\x00\x00\x01\x00\x0a\xea\x82\ \x00\x00\x06\xac\x00\x01\x00\x00\x00\x01\x00\x0a\xea\xd0\
\x00\x00\x07\xbc\x00\x01\x00\x00\x00\x01\x00\x0b\x4c\xfc\ \x00\x00\x07\xbc\x00\x01\x00\x00\x00\x01\x00\x0b\x4d\x4a\
\x00\x00\x09\x7c\x00\x00\x00\x00\x00\x01\x00\x0b\xe8\x63\ \x00\x00\x09\x7c\x00\x00\x00\x00\x00\x01\x00\x0b\xe8\xb1\
\x00\x00\x05\x5c\x00\x01\x00\x00\x00\x01\x00\x0a\x8a\x34\ \x00\x00\x05\x5c\x00\x01\x00\x00\x00\x01\x00\x0a\x8a\x82\
\x00\x00\x08\x0a\x00\x00\x00\x00\x00\x01\x00\x0b\x68\x65\ \x00\x00\x08\x0a\x00\x00\x00\x00\x00\x01\x00\x0b\x68\xb3\
\x00\x00\x06\x0a\x00\x01\x00\x00\x00\x01\x00\x0a\xbb\x85\ \x00\x00\x06\x0a\x00\x01\x00\x00\x00\x01\x00\x0a\xbb\xd3\
\x00\x00\x09\xc8\x00\x01\x00\x00\x00\x01\x00\x0c\x03\x69\ \x00\x00\x09\xc8\x00\x01\x00\x00\x00\x01\x00\x0c\x03\xb7\
\x00\x00\x08\x92\x00\x01\x00\x00\x00\x01\x00\x0b\x99\xb7\ \x00\x00\x08\x92\x00\x01\x00\x00\x00\x01\x00\x0b\x9a\x05\
\x00\x00\x08\xdc\x00\x01\x00\x00\x00\x01\x00\x0b\xac\x7d\ \x00\x00\x08\xdc\x00\x01\x00\x00\x00\x01\x00\x0b\xac\xcb\
\x00\x00\x0b\x42\x00\x01\x00\x00\x00\x01\x00\x0c\x82\x6d\ \x00\x00\x0b\x42\x00\x01\x00\x00\x00\x01\x00\x0c\x82\xbb\
\x00\x00\x0a\x40\x00\x01\x00\x00\x00\x01\x00\x0c\x36\xc6\ \x00\x00\x0a\x40\x00\x01\x00\x00\x00\x01\x00\x0c\x37\x14\
\x00\x00\x05\x08\x00\x01\x00\x00\x00\x01\x00\x0a\x7b\x49\ \x00\x00\x05\x08\x00\x01\x00\x00\x00\x01\x00\x0a\x7b\x97\
\x00\x00\x08\x72\x00\x00\x00\x00\x00\x01\x00\x0b\x89\xe5\ \x00\x00\x08\x72\x00\x00\x00\x00\x00\x01\x00\x0b\x8a\x33\
\x00\x00\x06\x58\x00\x00\x00\x00\x00\x01\x00\x0a\xc8\xe9\ \x00\x00\x06\x58\x00\x00\x00\x00\x00\x01\x00\x0a\xc9\x37\
\x00\x00\x07\x3e\x00\x01\x00\x00\x00\x01\x00\x0b\x24\x7c\ \x00\x00\x07\x3e\x00\x01\x00\x00\x00\x01\x00\x0b\x24\xca\
\x00\x00\x09\x4a\x00\x00\x00\x00\x00\x01\x00\x0b\xcc\x4d\ \x00\x00\x09\x4a\x00\x00\x00\x00\x00\x01\x00\x0b\xcc\x9b\
\x00\x00\x03\x76\x00\x01\x00\x00\x00\x01\x00\x0a\x0d\xd7\ \x00\x00\x03\x76\x00\x01\x00\x00\x00\x01\x00\x0a\x0d\xd7\
\x00\x00\x03\xa2\x00\x01\x00\x00\x00\x01\x00\x0a\x17\x44\ \x00\x00\x03\xa2\x00\x01\x00\x00\x00\x01\x00\x0a\x17\x44\
" "

View File

@ -1021,6 +1021,26 @@ such as &quot;Arial:Bold&quot;</string>
</item> </item>
</layout> </layout>
</item> </item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_22">
<item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_13">
<property name="toolTip">
<string>When this is checked, the Draft tools will create Part primitives instead of Draft objects, when available.</string>
</property>
<property name="text">
<string>Use Part Primitives</string>
</property>
<property name="prefEntry" stdset="0">
<cstring>UsePartPrimitives</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Draft</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_14"> <layout class="QHBoxLayout" name="horizontalLayout_14">
<item> <item>

View File

@ -1250,7 +1250,7 @@ def getWire(wire,nospline=False):
v1 = edge.Vertexes[0].Point v1 = edge.Vertexes[0].Point
if len(edge.Vertexes) < 2: if len(edge.Vertexes) < 2:
points.append((v1.x,v1.y,v1.z,None,None,0.0)) points.append((v1.x,v1.y,v1.z,None,None,0.0))
elif (isinstance(edge.Curve,Part.Circle)): elif DraftGeomUtils.geomType(edge) == "Circle":
mp = DraftGeomUtils.findMidpoint(edge) mp = DraftGeomUtils.findMidpoint(edge)
v2 = edge.Vertexes[-1].Point v2 = edge.Vertexes[-1].Point
c = edge.Curve.Center c = edge.Curve.Center
@ -1278,7 +1278,7 @@ def getWire(wire,nospline=False):
if not DraftGeomUtils.isClockwise(edge): if not DraftGeomUtils.isClockwise(edge):
bul = -bul bul = -bul
points.append((v1.x,v1.y,v1.z,None,None,bul)) points.append((v1.x,v1.y,v1.z,None,None,bul))
elif (isinstance(edge.Curve,Part.BSplineCurve)) and (not nospline): elif (DraftGeomUtils.geomType(edge) == "BSplineCurve") and (not nospline):
spline = getSplineSegs(edge) spline = getSplineSegs(edge)
spline.pop() spline.pop()
for p in spline: for p in spline:
@ -1303,7 +1303,7 @@ def writeShape(ob,dxfobject,nospline=False):
for wire in ob.Shape.Wires: # polylines for wire in ob.Shape.Wires: # polylines
for e in wire.Edges: for e in wire.Edges:
processededges.append(e.hashCode()) processededges.append(e.hashCode())
if (len(wire.Edges) == 1) and isinstance(wire.Edges[0].Curve,Part.Circle): if (len(wire.Edges) == 1) and (DraftGeomUtils.geomType(wire.Edges[0]) == "Circle"):
center, radius, ang1, ang2 = getArcData(wire.Edges[0]) center, radius, ang1, ang2 = getArcData(wire.Edges[0])
if len(wire.Edges[0].Vertexes) == 1: # circle if len(wire.Edges[0].Vertexes) == 1: # circle
dxfobject.append(dxfLibrary.Circle(center, radius, dxfobject.append(dxfLibrary.Circle(center, radius,
@ -1323,7 +1323,7 @@ def writeShape(ob,dxfobject,nospline=False):
if not(e.hashCode() in processededges): loneedges.append(e) if not(e.hashCode() in processededges): loneedges.append(e)
# print "lone edges ",loneedges # print "lone edges ",loneedges
for edge in loneedges: for edge in loneedges:
if (isinstance(edge.Curve,Part.BSplineCurve)) and ((not nospline) or (len(edge.Vertexes) == 1)): # splines if (DraftGeomUtils.geomType(edge) == "BSplineCurve") and ((not nospline) or (len(edge.Vertexes) == 1)): # splines
points = [] points = []
spline = getSplineSegs(edge) spline = getSplineSegs(edge)
for p in spline: for p in spline:
@ -1331,7 +1331,7 @@ def writeShape(ob,dxfobject,nospline=False):
dxfobject.append(dxfLibrary.PolyLine(points, [0.0,0.0,0.0], dxfobject.append(dxfLibrary.PolyLine(points, [0.0,0.0,0.0],
0, color=getACI(ob), 0, color=getACI(ob),
layer=getGroup(ob,exportList))) layer=getGroup(ob,exportList)))
elif isinstance(edge.Curve,Part.Circle): # curves elif DraftGeomUtils.geomType(edge) == "Circle": # curves
center, radius, ang1, ang2 = getArcData(edge) center, radius, ang1, ang2 = getArcData(edge)
if len(edge.Vertexes) == 1: # circles if len(edge.Vertexes) == 1: # circles
dxfobject.append(dxfLibrary.Circle(center, radius, dxfobject.append(dxfLibrary.Circle(center, radius,

View File

@ -257,13 +257,13 @@ def export(exportList,filename):
oca.write("# edges\r\n") oca.write("# edges\r\n")
count = 1 count = 1
for e in edges: for e in edges:
if isinstance(e.Curve,Part.Line): if DraftGeomUtils.geomType(e) == "Line"):
oca.write("L"+str(count)+"=") oca.write("L"+str(count)+"=")
oca.write(writepoint(e.Vertexes[0].Point)) oca.write(writepoint(e.Vertexes[0].Point))
oca.write(" ") oca.write(" ")
oca.write(writepoint(e.Vertexes[-1].Point)) oca.write(writepoint(e.Vertexes[-1].Point))
oca.write("\r\n") oca.write("\r\n")
elif isinstance(e.Curve,Part.Circle): elif DraftGeomUtils.geomType(e) == "Circle"):
if (len(e.Vertexes) > 1): if (len(e.Vertexes) > 1):
oca.write("C"+str(count)+"=ARC ") oca.write("C"+str(count)+"=ARC ")
oca.write(writepoint(e.Vertexes[0].Point)) oca.write(writepoint(e.Vertexes[0].Point))