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

This commit is contained in:
wmayer 2012-04-23 17:35:03 +02:00
commit b27a3a11cc
24 changed files with 972 additions and 380 deletions

View File

@ -37,7 +37,7 @@ PROPERTY_SOURCE(App::DocumentObjectGroup, App::DocumentObject)
DocumentObjectGroup::DocumentObjectGroup() DocumentObjectGroup::DocumentObjectGroup()
{ {
ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_ReadOnly|Prop_Output),"List of referenced objects"); ADD_PROPERTY_TYPE(Group,(0),"Base",(App::PropertyType)(Prop_Output),"List of referenced objects");
} }
DocumentObjectGroup::~DocumentObjectGroup() DocumentObjectGroup::~DocumentObjectGroup()
@ -179,13 +179,13 @@ PyObject *DocumentObjectGroup::getPyObject()
return Py::new_reference_to(PythonObject); return Py::new_reference_to(PythonObject);
} }
// Python Sketcher feature --------------------------------------------------------- // Python feature ---------------------------------------------------------
namespace App { namespace App {
/// @cond DOXERR /// @cond DOXERR
PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup) PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup)
template<> const char* App::DocumentObjectGroupPython::getViewProviderName(void) const { template<> const char* App::DocumentObjectGroupPython::getViewProviderName(void) const {
return "Gui::ViewProviderDocumentObjectGroup"; return "Gui::ViewProviderDocumentObjectGroupPython";
} }
/// @endcond /// @endcond

View File

@ -1420,6 +1420,7 @@ void Application::initTypes(void)
Gui::ViewProviderDocumentObject ::init(); Gui::ViewProviderDocumentObject ::init();
Gui::ViewProviderFeature ::init(); Gui::ViewProviderFeature ::init();
Gui::ViewProviderDocumentObjectGroup ::init(); Gui::ViewProviderDocumentObjectGroup ::init();
Gui::ViewProviderDocumentObjectGroupPython ::init();
Gui::ViewProviderGeometryObject ::init(); Gui::ViewProviderGeometryObject ::init();
Gui::ViewProviderInventorObject ::init(); Gui::ViewProviderInventorObject ::init();
Gui::ViewProviderVRMLObject ::init(); Gui::ViewProviderVRMLObject ::init();

View File

@ -221,3 +221,15 @@ QIcon ViewProviderDocumentObjectGroup::getIcon() const
QIcon::Normal, QIcon::On); QIcon::Normal, QIcon::On);
return groupIcon; return groupIcon;
} }
// Python feature -----------------------------------------------------------------------
namespace Gui {
/// @cond DOXERR
PROPERTY_SOURCE_TEMPLATE(Gui::ViewProviderDocumentObjectGroupPython, Gui::ViewProviderDocumentObjectGroup)
/// @endcond
// explicit template instantiation
template class GuiExport ViewProviderPythonFeatureT<ViewProviderDocumentObjectGroup>;
}

View File

@ -26,6 +26,7 @@
#include "ViewProviderDocumentObject.h" #include "ViewProviderDocumentObject.h"
#include "ViewProviderPythonFeature.h"
namespace Gui { namespace Gui {
@ -63,6 +64,7 @@ private:
std::vector<ViewProvider*> nodes; std::vector<ViewProvider*> nodes;
}; };
typedef ViewProviderPythonFeatureT<ViewProviderDocumentObjectGroup> ViewProviderDocumentObjectGroupPython;
} // namespace Gui } // namespace Gui

View File

@ -21,7 +21,7 @@
#* * #* *
#*************************************************************************** #***************************************************************************
import ArchCell,FreeCAD,FreeCADGui,Draft,ArchCommands import FreeCAD,FreeCADGui,Draft,ArchCommands
from PyQt4 import QtCore from PyQt4 import QtCore
__title__="FreeCAD Building" __title__="FreeCAD Building"
@ -31,14 +31,11 @@ __url__ = "http://free-cad.sourceforge.net"
def makeBuilding(objectslist=None,join=False,name="Building"): def makeBuilding(objectslist=None,join=False,name="Building"):
'''makeBuilding(objectslist,[joinmode]): creates a building including the '''makeBuilding(objectslist,[joinmode]): creates a building including the
objects from the given list. If joinmode is True, components will be joined.''' objects from the given list. If joinmode is True, components will be joined.'''
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name) obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython",name)
_Building(obj) _Building(obj)
_ViewProviderBuilding(obj.ViewObject) _ViewProviderBuilding(obj.ViewObject)
if objectslist: if objectslist:
obj.Components = objectslist obj.Group = objectslist
for comp in obj.Components:
comp.ViewObject.hide()
obj.JoinMode = join
return obj return obj
class _CommandBuilding: class _CommandBuilding:
@ -66,18 +63,32 @@ class _CommandBuilding:
FreeCAD.ActiveDocument.commitTransaction() FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
class _Building(ArchCell._Cell): class _Building:
"The Building object" "The Building object"
def __init__(self,obj): def __init__(self,obj):
ArchCell._Cell.__init__(self,obj)
self.Type = "Building" self.Type = "Building"
obj.Proxy = self
class _ViewProviderBuilding(ArchCell._ViewProviderCell): def execute(self,obj):
pass
def onChanged(self,obj,prop):
pass
class _ViewProviderBuilding:
"A View Provider for the Building object" "A View Provider for the Building object"
def __init__(self,vobj): def __init__(self,vobj):
ArchCell._ViewProviderCell.__init__(self,vobj) vobj.Proxy = self
def getIcon(self): def getIcon(self):
return ":/icons/Arch_Building_Tree.svg" return ":/icons/Arch_Building_Tree.svg"
def attach(self,vobj):
self.Object = vobj.Object
return
def claimChildren(self):
return self.Object.Group
FreeCADGui.addCommand('Arch_Building',_CommandBuilding()) FreeCADGui.addCommand('Arch_Building',_CommandBuilding())

View File

@ -39,12 +39,18 @@ def addComponents(objectsList,host):
if not isinstance(objectsList,list): if not isinstance(objectsList,list):
objectsList = [objectsList] objectsList = [objectsList]
tp = Draft.getType(host) tp = Draft.getType(host)
if tp in ["Cell","Floor","Building","Site"]: if tp in ["Cell"]:
c = host.Components c = host.Components
for o in objectsList: for o in objectsList:
if not o in c: if not o in c:
c.append(o) c.append(o)
host.Components = c host.Components = c
elif tp in ["Floor","Building","Site"]:
c = host.Group
for o in objectsList:
if not o in c:
c.append(o)
host.Group = c
elif tp in ["Wall","Structure"]: elif tp in ["Wall","Structure"]:
a = host.Additions a = host.Additions
for o in objectsList: for o in objectsList:

View File

@ -21,7 +21,7 @@
#* * #* *
#*************************************************************************** #***************************************************************************
import ArchCell,FreeCAD,FreeCADGui,Draft,ArchCommands import FreeCAD,FreeCADGui,Draft,ArchCommands
from PyQt4 import QtCore from PyQt4 import QtCore
__title__="FreeCAD Arch Floor" __title__="FreeCAD Arch Floor"
@ -32,14 +32,11 @@ def makeFloor(objectslist=None,join=True,name="Floor"):
'''makeFloor(objectslist,[joinmode]): creates a floor including the '''makeFloor(objectslist,[joinmode]): creates a floor including the
objects from the given list. If joinmode is False, components will objects from the given list. If joinmode is False, components will
not be joined.''' not be joined.'''
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name) obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython",name)
_Floor(obj) _Floor(obj)
_ViewProviderFloor(obj.ViewObject) _ViewProviderFloor(obj.ViewObject)
if objectslist: if objectslist:
obj.Components = objectslist obj.Group = objectslist
for comp in obj.Components:
comp.ViewObject.hide()
obj.JoinMode = join
return obj return obj
class _CommandFloor: class _CommandFloor:
@ -67,20 +64,34 @@ class _CommandFloor:
FreeCAD.ActiveDocument.commitTransaction() FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
class _Floor(ArchCell._Cell): class _Floor:
"The Cell object" "The Cell object"
def __init__(self,obj): def __init__(self,obj):
ArchCell._Cell.__init__(self,obj)
obj.addProperty("App::PropertyLength","Height","Base", obj.addProperty("App::PropertyLength","Height","Base",
"The height of this floor") "The height of this floor")
self.Type = "Floor" self.Type = "Floor"
obj.Proxy = self
class _ViewProviderFloor(ArchCell._ViewProviderCell): def execute(self,obj):
pass
def onChanged(self,obj,prop):
pass
class _ViewProviderFloor:
"A View Provider for the Cell object" "A View Provider for the Cell object"
def __init__(self,vobj): def __init__(self,vobj):
ArchCell._ViewProviderCell.__init__(self,vobj) vobj.Proxy = self
def getIcon(self): def getIcon(self):
return ":/icons/Arch_Floor_Tree.svg" return ":/icons/Arch_Floor_Tree.svg"
def attach(self,vobj):
self.Object = vobj.Object
return
def claimChildren(self):
return self.Object.Group
FreeCADGui.addCommand('Arch_Floor',_CommandFloor()) FreeCADGui.addCommand('Arch_Floor',_CommandFloor())

View File

@ -157,9 +157,11 @@ class _ViewProviderSectionPlane(ArchComponent.ViewProviderComponent):
class _ArchDrawingView: class _ArchDrawingView:
def __init__(self, obj): def __init__(self, obj):
obj.addProperty("App::PropertyLink","Source","Base","The linked object") obj.addProperty("App::PropertyLink","Source","Base","The linked object")
obj.addProperty("App::PropertyEnumeration","RenderingMode","Base","The rendering mode to use") obj.addProperty("App::PropertyEnumeration","RenderingMode","Drawing View","The rendering mode to use")
obj.addProperty("App::PropertyFloat","LineWidth","Drawing View","The line width of the rendered objects")
obj.RenderingMode = ["Solid","Wireframe"] obj.RenderingMode = ["Solid","Wireframe"]
obj.RenderingMode = "Solid" obj.RenderingMode = "Solid"
obj.LineWidth = 0.35
obj.Proxy = self obj.Proxy = self
self.Type = "DrawingView" self.Type = "DrawingView"
@ -179,28 +181,35 @@ class _ArchDrawingView:
if obj.Source.Objects: if obj.Source.Objects:
svg = '' svg = ''
cp = ArchCommands.getCutVolume(obj.Source.Objects,obj.Source.Placement) cp = ArchCommands.getCutVolume(obj.Source.Objects,obj.Source.Placement)
print "cp:",cp self.sections = []
sections = []
if cp: if cp:
cutvolume = cp[0].extrude(cp[1]) cutvolume = cp[0].extrude(cp[1])
shapes = [] shapes = []
colors = []
for o in obj.Source.Objects: for o in obj.Source.Objects:
color = o.ViewObject.DiffuseColor[0]
print "adding ",o.Name," with color ",color
if cp: if cp:
shapes.append(o.Shape.cut(cutvolume)) for s in o.Shape.Solids:
shapes.append(s.cut(cutvolume))
colors.append(color)
sec = o.Shape.section(cp[0]) sec = o.Shape.section(cp[0])
if sec.Edges: if sec.Edges:
sec = Part.Wire(fcgeo.sortEdges(sec.Edges)) wires = fcgeo.findWires(sec.Edges)
for w in wires:
sec = Part.Wire(fcgeo.sortEdges(w.Edges))
sec = Part.Face(sec) sec = Part.Face(sec)
sections.append(sec) self.sections.append(sec)
else: else:
shapes.append(o.Shape) shapes.append(o.Shape)
colors.append(color)
linewidth = obj.LineWidth/obj.Scale
if obj.RenderingMode == "Solid": if obj.RenderingMode == "Solid":
svg += self.renderVRM(shapes,obj.Source.Placement) svg += self.renderVRM(shapes,obj.Source.Placement,colors,linewidth)
else: else:
svg += self.renderOCC(shapes,obj.Source.Proxy.getNormal(obj.Source)) svg += self.renderOCC(shapes,obj.Source.Proxy.getNormal(obj.Source),linewidth)
print "sections:",sections for s in self.sections:
for s in sections: svg += self.renderSection(s,obj.Source.Placement,linewidth*2)
svg += self.renderSection(s,obj.Source.Placement)
result = '' result = ''
result += '<g id="' + obj.Name + '"' result += '<g id="' + obj.Name + '"'
result += ' transform="' result += ' transform="'
@ -210,11 +219,11 @@ class _ArchDrawingView:
result += '">\n' result += '">\n'
result += svg result += svg
result += '</g>\n' result += '</g>\n'
print "complete node:",result #print "complete node:",result
return result return result
return '' return ''
def renderOCC(self,shapes,direction): def renderOCC(self,shapes,direction,linewidth):
"renders an SVG fragment with the OCC method" "renders an SVG fragment with the OCC method"
shapes = shapes[:] shapes = shapes[:]
if shapes: if shapes:
@ -223,21 +232,25 @@ class _ArchDrawingView:
base = base.fuse(sh) base = base.fuse(sh)
result = Drawing.projectToSVG(base,fcvec.neg(direction)) result = Drawing.projectToSVG(base,fcvec.neg(direction))
if result: if result:
result = result.replace('stroke-width="0.35"','stroke-width="0.01 px"') result = result.replace('stroke-width="0.35"','stroke-width="' + str(linewidth) + 'px"')
return result return result
return '' return ''
def renderVRM(self,shapes,placement): def renderVRM(self,shapes,placement,colors,linewidth):
"renders an SVG fragment with the ArchVRM method" "renders an SVG fragment with the ArchVRM method"
import ArchVRM import ArchVRM
render = ArchVRM.Renderer() render = ArchVRM.Renderer()
render.setWorkingPlane(FreeCAD.Placement(placement)) render.setWorkingPlane(FreeCAD.Placement(placement))
for s in shapes: for i in range(len(shapes)):
render.add(s) if colors:
svg = render.getSVG() render.add(shapes[i],colors[i])
else:
render.add(shapes[i])
svg = render.getSVG(linewidth=linewidth)
print render.info()
return svg return svg
def renderSection(self,shape,placement): def renderSection(self,shape,placement,linewidth):
"renders a plane parallel to the section plane" "renders a plane parallel to the section plane"
placement = FreeCAD.Placement(placement) placement = FreeCAD.Placement(placement)
u = placement.Rotation.multVec(FreeCAD.Vector(1,0,0)) u = placement.Rotation.multVec(FreeCAD.Vector(1,0,0))
@ -262,8 +275,8 @@ class _ArchDrawingView:
svg += 'z ' svg += 'z '
svg += '" ' svg += '" '
svg += 'stroke="#000000" ' svg += 'stroke="#000000" '
svg += 'stroke-width="0.02 px" ' svg += 'stroke-width="' + str(linewidth) + 'px" '
svg += 'style="stroke-width:0.01;' svg += 'style="stroke-width:' + str(linewidth) + ';'
svg += 'stroke-miterlimit:1;' svg += 'stroke-miterlimit:1;'
svg += 'stroke-linejoin:round;' svg += 'stroke-linejoin:round;'
svg += 'stroke-dasharray:none;' svg += 'stroke-dasharray:none;'

View File

@ -21,7 +21,7 @@
#* * #* *
#*************************************************************************** #***************************************************************************
import ArchCell,FreeCAD,FreeCADGui,Draft,ArchCommands import FreeCAD,FreeCADGui,Draft,ArchCommands
from PyQt4 import QtCore from PyQt4 import QtCore
__title__="FreeCAD Site" __title__="FreeCAD Site"
@ -31,12 +31,11 @@ __url__ = "http://free-cad.sourceforge.net"
def makeSite(objectslist=None,name="Site"): def makeSite(objectslist=None,name="Site"):
'''makeBuilding(objectslist): creates a site including the '''makeBuilding(objectslist): creates a site including the
objects from the given list.''' objects from the given list.'''
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name) obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython",name)
_Site(obj) _Site(obj)
_ViewProviderSite(obj.ViewObject) _ViewProviderSite(obj.ViewObject)
if objectslist: if objectslist:
obj.Components = objectslist obj.Group = objectslist
obj.JoinMode = False
return obj return obj
class _CommandSite: class _CommandSite:
@ -64,11 +63,11 @@ class _CommandSite:
FreeCAD.ActiveDocument.commitTransaction() FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
class _Site(ArchCell._Cell): class _Site:
"The Site object" "The Site object"
def __init__(self,obj): def __init__(self,obj):
ArchCell._Cell.__init__(self,obj)
self.Type = "Site" self.Type = "Site"
obj.Proxy = self
def execute(self,obj): def execute(self,obj):
pass pass
@ -76,12 +75,19 @@ class _Site(ArchCell._Cell):
def onChanged(self,obj,prop): def onChanged(self,obj,prop):
pass pass
class _ViewProviderSite(ArchCell._ViewProviderCell): class _ViewProviderSite:
"A View Provider for the Site object" "A View Provider for the Site object"
def __init__(self,vobj): def __init__(self,vobj):
ArchCell._ViewProviderCell.__init__(self,vobj) vobj.Proxy = self
def getIcon(self): def getIcon(self):
return ":/icons/Arch_Site_Tree.svg" return ":/icons/Arch_Site_Tree.svg"
def attach(self,vobj):
self.Object = vobj.Object
return
def claimChildren(self):
return self.Object.Group
FreeCADGui.addCommand('Arch_Site',_CommandSite()) FreeCADGui.addCommand('Arch_Site',_CommandSite())

View File

@ -44,8 +44,10 @@ class Renderer:
p.buildDummy() p.buildDummy()
""" """
self.defaultFill = (0.9,0.9,0.9,1.0) # the default fill color
self.wp = wp self.wp = wp
self.faces = [] self.faces = []
self.fills = []
self.oriented = False self.oriented = False
self.trimmed = False self.trimmed = False
self.sorted = False self.sorted = False
@ -65,14 +67,39 @@ class Renderer:
self.wp = wp self.wp = wp
if DEBUG: print "Renderer set on " + str(self.wp) if DEBUG: print "Renderer set on " + str(self.wp)
def add(self,faces): def add(self,faces,colors=None):
"add faces, shape or object to this renderer" "add faces, shape or object to this renderer, optionally with face colors"
def setcolors(colors,n):
if colors:
if isinstance(colors,tuple) and len(colors) == 4:
for i in range(n):
self.fills.append(colors)
elif len(colors) == n:
self.fills.extend(colors)
else:
c = []
for i in range(n):
c.append(colors[0])
self.fills.extend(c)
else:
c = []
for i in range(n):
c.append(self.defaultFill)
self.fills.extend(c)
if isinstance(faces,list): if isinstance(faces,list):
f = faces f = faces
setcolors(colors,len(f))
elif hasattr(faces,"Faces"): elif hasattr(faces,"Faces"):
f = faces.Faces f = faces.Faces
setcolors(colors,len(f))
elif hasattr(faces,"Shape"): elif hasattr(faces,"Shape"):
f = faces.Shape.Faces f = faces.Shape.Faces
if hasattr(faces,"ViewObject") and not colors:
colors = faces.ViewObject.DiffuseColor
setcolors(colors,len(f))
if DEBUG: print "adding ", len(f), " faces" if DEBUG: print "adding ", len(f), " faces"
self.faces.extend(f) self.faces.extend(f)
self.oriented = False self.oriented = False
@ -82,6 +109,7 @@ class Renderer:
def clean(self): def clean(self):
"removes all faces from this renderer" "removes all faces from this renderer"
self.faces = [] self.faces = []
self.fills = []
self.oriented = False self.oriented = False
self.trimmed = False self.trimmed = False
self.sorted = False self.sorted = False
@ -96,7 +124,8 @@ class Renderer:
for i in range(len(self.faces)): for i in range(len(self.faces)):
r += " face " + str(i) + " : center " + str(self.faces[i].CenterOfMass) r += " face " + str(i) + " : center " + str(self.faces[i].CenterOfMass)
r += " : normal " + str(self.faces[i].normalAt(0,0)) r += " : normal " + str(self.faces[i].normalAt(0,0))
r += ", " + str(len(self.faces[i].Vertexes)) + " verts\n" r += ", " + str(len(self.faces[i].Vertexes)) + " verts"
r += ", color: " + self.getFill(self.fills[i]) + "\n"
return r return r
def addLabels(self): def addLabels(self):
@ -128,11 +157,14 @@ class Renderer:
if not self.faces: if not self.faces:
return return
faces = [] faces = []
for f in (self.faces): fills = []
if self.isVisible(f): for i in range(len(self.faces)):
faces.append(f) if self.isVisible(self.faces[i]):
faces.append(self.faces[i])
fills.append(self.fills[i])
if DEBUG: print len(self.faces)-len(faces) , " faces removed, ", len(faces), " faces retained" if DEBUG: print len(self.faces)-len(faces) , " faces removed, ", len(faces), " faces retained"
self.faces = faces self.faces = faces
self.fills = fills
self.trimmed = True self.trimmed = True
def projectFace(self,face): def projectFace(self,face):
@ -324,11 +356,13 @@ class Renderer:
faces = self.faces[:] faces = self.faces[:]
if DEBUG: print "sorting ",len(self.faces)," faces" if DEBUG: print "sorting ",len(self.faces)," faces"
sfaces = [] sfaces = []
sfills = []
loopcount = 0 loopcount = 0
notfoundstack = 0 notfoundstack = 0
while faces: while faces:
if DEBUG: print "loop ", loopcount if DEBUG: print "loop ", loopcount
f1 = faces[0] f1 = faces[0]
fi1 = self.fills[self.faces.index(f1)]
if sfaces and (notfoundstack < len(faces)): if sfaces and (notfoundstack < len(faces)):
if DEBUG: print "using ordered stack, notfound = ",notfoundstack if DEBUG: print "using ordered stack, notfound = ",notfoundstack
p = self.findPosition(f1,sfaces) p = self.findPosition(f1,sfaces)
@ -341,26 +375,32 @@ class Renderer:
# position found, we insert it # position found, we insert it
faces.remove(f1) faces.remove(f1)
sfaces.insert(p,f1) sfaces.insert(p,f1)
sfills.insert(p,fi1)
notfoundstack = 0 notfoundstack = 0
else: else:
# either there is no stack, or no more face can be compared # either there is no stack, or no more face can be compared
# find a root, 2 faces that can be compared # find a root, 2 faces that can be compared
if DEBUG: print "using unordered stack, notfound = ",notfoundstack if DEBUG: print "using unordered stack, notfound = ",notfoundstack
for f2 in faces[1:]: for f2 in faces[1:]:
fi2 = self.fills[self.faces.index(f2)]
if DEBUG: print "comparing face",str(self.faces.index(f1))," with face",str(self.faces.index(f2)) if DEBUG: print "comparing face",str(self.faces.index(f1))," with face",str(self.faces.index(f2))
r = self.compare(f1,f2) r = self.compare(f1,f2)
if r == 1: if r == 1:
faces.remove(f2) faces.remove(f2)
sfaces.append(f2) sfaces.append(f2)
sfills.append(fi2)
faces.remove(f1) faces.remove(f1)
sfaces.append(f1) sfaces.append(f1)
sfills.append(fi1)
notfoundstack = 0 notfoundstack = 0
break break
elif r == 2: elif r == 2:
faces.remove(f1) faces.remove(f1)
sfaces.append(f1) sfaces.append(f1)
sfills.append(fi1)
faces.remove(f2) faces.remove(f2)
sfaces.append(f2) sfaces.append(f2)
sfills.append(fi2)
notfoundstack = 0 notfoundstack = 0
break break
else: else:
@ -374,6 +414,7 @@ class Renderer:
if DEBUG: print "done Z sorting. ", len(sfaces), " faces retained, ", len(self.faces)-len(sfaces), " faces lost." if DEBUG: print "done Z sorting. ", len(sfaces), " faces retained, ", len(self.faces)-len(sfaces), " faces lost."
self.faces = sfaces self.faces = sfaces
self.fills = sfills
self.sorted = True self.sorted = True
def buildDummy(self): def buildDummy(self):
@ -391,15 +432,25 @@ class Renderer:
c = Part.makeCompound(faces) c = Part.makeCompound(faces)
Part.show(c) Part.show(c)
def getSVG(self): def getFill(self,fill):
"Returns a SVG fill value"
r = str(hex(int(fill[0]*255)))[2:].zfill(2)
g = str(hex(int(fill[1]*255)))[2:].zfill(2)
b = str(hex(int(fill[2]*255)))[2:].zfill(2)
col = "#"+r+g+b
return col
def getSVG(self,linewidth=0.01):
"Returns a SVG fragment" "Returns a SVG fragment"
if DEBUG: print len(self.faces), " faces and ", len(self.fills), " fills."
if not self.sorted: if not self.sorted:
self.sort() self.sort()
svg = '' svg = ''
for f in self.faces: for i in range(len(self.faces)):
fill = self.getFill(self.fills[i])
svg +='<path ' svg +='<path '
svg += 'd="' svg += 'd="'
for w in f.Wires: for w in self.faces[i].Wires:
edges = fcgeo.sortEdges(w.Edges) edges = fcgeo.sortEdges(w.Edges)
v = edges[0].Vertexes[0].Point v = edges[0].Vertexes[0].Point
svg += 'M '+ str(v.x) +' '+ str(v.y) + ' ' svg += 'M '+ str(v.x) +' '+ str(v.y) + ' '
@ -415,12 +466,12 @@ class Renderer:
svg += 'z ' svg += 'z '
svg += '" ' svg += '" '
svg += 'stroke="#000000" ' svg += 'stroke="#000000" '
svg += 'stroke-width="0.01 px" ' svg += 'stroke-width="' + str(linewidth) + '" '
svg += 'style="stroke-width:0.01;' svg += 'style="stroke-width:0.01;'
svg += 'stroke-miterlimit:1;' svg += 'stroke-miterlimit:1;'
svg += 'stroke-linejoin:round;' svg += 'stroke-linejoin:round;'
svg += 'stroke-dasharray:none;' svg += 'stroke-dasharray:none;'
svg += 'fill:#aaaaaa;' svg += 'fill:' + fill + ';'
svg += 'fill-rule: evenodd' svg += 'fill-rule: evenodd'
svg += '"/>\n' svg += '"/>\n'
return svg return svg

View File

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

View File

@ -165,20 +165,17 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_4"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<item> <item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_2"> <widget class="Gui::PrefCheckBox" name="gui::prefcheckbox">
<property name="toolTip"> <property name="toolTip">
<string>if this is checked, the internal Arch IFC parser will be use to build Arch objects from known IFC types.</string> <string>If this is checked, the IFCOpenShell importer will be used, allowing to import more IFC types</string>
</property> </property>
<property name="text"> <property name="text">
<string>use internal IFC parser</string> <string>Use IFCOpenShell if available</string>
</property>
<property name="checked">
<bool>true</bool>
</property> </property>
<property name="prefEntry" stdset="0"> <property name="prefEntry" stdset="0">
<cstring>useIfcParser</cstring> <cstring>useIfcOpenShell</cstring>
</property> </property>
<property name="prefPath" stdset="0"> <property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring> <cstring>Mod/Arch</cstring>
@ -188,17 +185,34 @@
</layout> </layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox"> <widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_2">
<property name="toolTip"> <property name="toolTip">
<string>If this is checked, the IFCOpenShell importer will be used for objects not handled by the internal parser</string> <string>Creates groups for each Arch object type</string>
</property> </property>
<property name="text"> <property name="text">
<string>Use IFCOpenShell</string> <string>Group components by types</string>
</property> </property>
<property name="prefEntry" stdset="0"> <property name="prefEntry" stdset="0">
<cstring>useIfcOpenShell</cstring> <cstring>createIfcGroups</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_3">
<property name="text">
<string>Import furniture (can make the model heavy)</string>
</property>
<property name="prefEntry" stdset="0">
<cstring>importIfcFurniture</cstring>
</property> </property>
<property name="prefPath" stdset="0"> <property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring> <cstring>Mod/Arch</cstring>

View File

@ -21,16 +21,18 @@
#* * #* *
#*************************************************************************** #***************************************************************************
import ifcReader, FreeCAD, Arch, Draft, os, sys, time, tempfile, Part import ifcReader, FreeCAD, Arch, Draft, os, sys, time, Part
from draftlibs import fcvec from draftlibs import fcvec
__title__="FreeCAD IFC importer" __title__="FreeCAD IFC importer"
__author__ = "Yorik van Havre" __author__ = "Yorik van Havre"
__url__ = "http://free-cad.sourceforge.net" __url__ = "http://free-cad.sourceforge.net"
# config
DEBUG = True DEBUG = True
SCHEMA = "http://www.steptools.com/support/stdev_docs/express/ifc2x3/ifc2x3_tc1.exp" SCHEMA = "http://www.steptools.com/support/stdev_docs/express/ifc2x3/ifc2x3_tc1.exp"
SKIP = ["IfcOpeningElement"] SKIP = ["IfcOpeningElement","IfcSpace"]
# end config
if open.__module__ == '__builtin__': if open.__module__ == '__builtin__':
pyopen = open # because we'll redefine open below pyopen = open # because we'll redefine open below
@ -41,13 +43,15 @@ def open(filename):
doc = FreeCAD.newDocument(docname) doc = FreeCAD.newDocument(docname)
doc.Label = decode(docname) doc.Label = decode(docname)
FreeCAD.ActiveDocument = doc FreeCAD.ActiveDocument = doc
global createIfcGroups, useIfcOpenShell, importIfcFurniture
createIfcGroups = useIfcOpenShell = importIfcFurniture = False
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch") p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
op = p.GetBool("useIfcOpenShell") useIfcOpenShell = p.GetBool("useIfcOpenShell")
ip = p.GetBool("useIfcParser") createIfcGroups = p.GetBool("createIfcGroups")
if op: importIfcFurniture = p.GetBool("importIfcFurniture")
readOpenShell(filename,useParser=ip) if not importIfcFurniture:
else: SKIP.append("IfcFurnishingElement")
readInternal(filename) read(filename)
return doc return doc
def decode(name): def decode(name):
@ -85,47 +89,72 @@ def getIfcOpenShell():
else: else:
return True return True
def readOpenShell(filename,useParser=False): def read(filename):
"Parses an IFC file with IfcOpenShell" "Parses an IFC file with IfcOpenShell"
altifc = None # parsing the IFC file
if useParser: t1 = time.time()
altifc = parseFile(filename) schema=getSchema()
if schema:
if DEBUG: global ifc
if DEBUG: print "opening",filename,"..."
ifc = ifcReader.IfcDocument(filename,schema=schema,debug=DEBUG)
else:
FreeCAD.Console.PrintWarning("IFC Schema not found, IFC import disabled.\n")
return None
t2 = time.time()
if DEBUG: print "Successfully loaded",ifc,"in %s s" % ((t2-t1))
if getIfcOpenShell(): if useIfcOpenShell and getIfcOpenShell():
USESHAPES = False # use the IfcOpenShell parser
useShapes = False
if hasattr(IfcImport,"USE_BREP_DATA"): if hasattr(IfcImport,"USE_BREP_DATA"):
IfcImport.Settings(IfcImport.USE_BREP_DATA,True) IfcImport.Settings(IfcImport.USE_BREP_DATA,True)
USESHAPES = True useShapes = True
if IfcImport.Init(filename): if IfcImport.Init(filename):
while True: while True:
obj = IfcImport.Get() obj = IfcImport.Get()
if DEBUG: print "parsing ",obj.id,": ",obj.name," of type ",obj.type if DEBUG: print "parsing ",obj.id,": ",obj.name," of type ",obj.type
meshdata = [] meshdata = []
n = obj.name
if not n: n = "Unnamed"
# retrieving name
n = obj.name
if not n:
n = "Unnamed"
# build shape
shape = None
if useShapes:
shape = getShape(obj)
# skip types
if obj.type in SKIP: if obj.type in SKIP:
pass pass
# walls # walls
elif altifc and (obj.type == "IfcWallStandardCase"): elif obj.type == "IfcWallStandardCase":
makeWall(altifc.Entities[obj.id],shape = getShape(obj) if USESHAPES else None) makeWall(ifc.Entities[obj.id],shape)
# windows # windows
elif altifc and (obj.type in ["IfcWindow","IfcDoor"]): elif obj.type in ["IfcWindow","IfcDoor"]:
makeWindow(altifc.Entities[obj.id],shape = getShape(obj) if USESHAPES else None) makeWindow(ifc.Entities[obj.id],shape)
# structs # structs
elif altifc and (obj.type in ["IfcBeam","IfcColumn","IfcSlab"]): elif obj.type in ["IfcBeam","IfcColumn","IfcSlab"]:
makeStructure(altifc.Entities[obj.id],shape = getShape(obj) if USESHAPES else None) makeStructure(ifc.Entities[obj.id],shape)
elif USESHAPES: # furniture
# treat as Parts elif obj.type == "IfcFurnishingElement":
sh = getShape(obj) nobj = FreeCAD.ActiveDocument.addObject("Part::Feature","Furniture")
nobj.Shape = shape
elif shape:
# treat as dumb parts
nobj = FreeCAD.ActiveDocument.addObject("Part::Feature",n) nobj = FreeCAD.ActiveDocument.addObject("Part::Feature",n)
nobj.Shape = sh nobj.Shape = shape
else: else:
# treat as meshes # treat as meshes
me,pl = getMesh(obj) me,pl = getMesh(obj)
@ -135,59 +164,49 @@ def readOpenShell(filename,useParser=False):
if not IfcImport.Next(): if not IfcImport.Next():
break break
if altifc:
order(altifc)
IfcImport.CleanUp()
return None
def readInternal(filename): IfcImport.CleanUp()
"processes an ifc file and add its objects to the given document"
t1 = time.time() else:
ifc = parseFile(filename) # use the internal python parser
t2 = time.time()
if DEBUG: print "Successfully loaded",ifc,"in %s s" % ((t2-t1))
# getting walls # getting walls
for w in ifc.getEnt("IFCWALLSTANDARDCASE"): for w in ifc.getEnt("IfcWallStandardCase"):
makeWall(w) makeWall(w)
# getting windows and doors # getting windows and doors
for w in (ifc.getEnt("IFCWINDOW") + ifc.getEnt("IFCDOOR")): for w in (ifc.getEnt("IfcWindow") + ifc.getEnt("IfcDoor")):
makeWindow(w) makeWindow(w)
# getting structs # getting structs
for w in (ifc.getEnt("IFCSLAB") + ifc.getEnt("IFCBEAM") + ifc.getEnt("IFCCOLUMN")): for w in (ifc.getEnt("IfcSlab") + ifc.getEnt("IfcBeam") + ifc.getEnt("IfcColumn")):
makeWindow(w) makeStructure(w)
order(ifc) order(ifc)
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
t3 = time.time() t3 = time.time()
if DEBUG: print "done processing",ifc,"in %s s" % ((t3-t1)) if DEBUG: print "done processing",ifc,"in %s s" % ((t3-t1))
def order(ifc):
"orders the already generated elements by building and by floor"
# getting floors
for f in ifc.getEnt("IFCBUILDINGSTOREY"):
makeCell(f,"Floor")
# getting buildings
for b in ifc.getEnt("IFCBUILDING"):
makeCell(b,"Building")
# getting sites
for s in ifc.getEnt("IFCSITE"):
makeCell(s,"Site")
def parseFile(filename):
"parses an IFC file"
schema=getSchema()
if schema:
if DEBUG: global ifc
if DEBUG: print "opening",filename,"..."
ifc = ifcReader.IfcDocument(filename,schema=schema,debug=DEBUG)
return ifc
else:
FreeCAD.Console.PrintWarning("IFC Schema not found, IFC import disabled.\n")
return None return None
def makeCell(entity,mode="Cell"): def order(ifc):
"makes a cell in the freecad document" "orders the already generated elements by building and by floor"
# getting floors
for f in ifc.getEnt("IfcBuildingStorey"):
group(f,"Floor")
# getting buildings
for b in ifc.getEnt("IfcBuilding"):
group(b,"Building")
# getting sites
for s in ifc.getEnt("IfcSite"):
group(s,"Site")
def group(entity,mode=None):
"gathers the children of the given entity"
try: try:
if DEBUG: print "=====> making cell",entity.id if DEBUG: print "=====> making group",entity.id
placement = None placement = None
placement = getPlacement(entity.ObjectPlacement) placement = getPlacement(entity.ObjectPlacement)
if DEBUG: print "got cell placement",entity.id,":",placement if DEBUG: print "got cell placement",entity.id,":",placement
@ -208,37 +227,50 @@ def makeCell(entity,mode="Cell"):
if not isinstance(s,list): s = [s] if not isinstance(s,list): s = [s]
elts.extend(s) elts.extend(s)
print "found dependent elements: ",elts print "found dependent elements: ",elts
fcelts = []
groups = [['Wall','IfcWallStandardCase',[]],
['Window','IfcWindow',[]],
['Door','IfcDoor',[]],
['Slab','IfcSlab',[]],
['Beam','IfcBeam',[]],
['Column','IfcColumn',[]],
['Floor','IfcBuildingStorey',[]],
['Building','IfcBuilding',[]],
['Furniture','IfcFurnishingElement',[]]]
for e in elts: for e in elts:
if e.type == "IFCWALLSTANDARDCASE": for g in groups:
o = FreeCAD.ActiveDocument.getObject("Wall"+str(e.id)) if e.type.upper() == g[1].upper():
elif e.type == "IFCWINDOW": o = FreeCAD.ActiveDocument.getObject(g[0] + str(e.id))
o = FreeCAD.ActiveDocument.getObject("Window"+str(e.id))
elif e.type == "IFCDOOR":
o = FreeCAD.ActiveDocument.getObject("Door"+str(e.id))
elif e.type == "IFCSLAB":
o = FreeCAD.ActiveDocument.getObject("Slab"+str(e.id))
elif e.type == "IFCBEAM":
o = FreeCAD.ActiveDocument.getObject("Beam"+str(e.id))
elif e.type == "IFCCOLUMN":
o = FreeCAD.ActiveDocument.getObject("Column"+str(e.id))
elif e.type == "IFCBUILDINGSTOREY":
o = FreeCAD.ActiveDocument.getObject("Floor"+str(e.id))
elif e.type == "IFCBUILDING":
o = FreeCAD.ActiveDocument.getObject("Building"+str(e.id))
if o: if o:
fcelts.append(o) g[2].append(o)
print "groups:",groups
comps = []
if createIfcGroups:
if DEBUG: print "creating subgroups"
for g in groups:
if g[2]:
if g[0] in ['Building','Floor']:
comps.extend(g[2])
else:
fcg = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroup",g[0]+"s")
for o in g[2]:
fcg.addObject(o)
comps.append(fcg)
else:
for g in groups:
comps.extend(g[2])
name = mode + str(entity.id) name = mode + str(entity.id)
if mode == "Site": if mode == "Site":
cell = Arch.makeSite(fcelts,name=name) cell = Arch.makeSite(comps,name=name)
elif mode == "Floor": elif mode == "Floor":
cell = Arch.makeFloor(fcelts,join=False,name=name) cell = Arch.makeFloor(comps,name=name)
elif mode == "Building": elif mode == "Building":
cell = Arch.makeBuilding(fcelts,name=name) cell = Arch.makeBuilding(comps,name=name)
else:
cell = Arch.makeCell(fcelts,join=False,name=name)
except: except:
if DEBUG: print "error: skipping cell",entity.id if DEBUG: print "error: skipping group ",entity.id
def makeWall(entity,shape=None): def makeWall(entity,shape=None):
"makes a wall in the freecad document" "makes a wall in the freecad document"

View File

@ -171,6 +171,16 @@ def getType(obj):
return "Group" return "Group"
return "Unknown" return "Unknown"
def get3DView():
"get3DView(): returns the current view if it is 3D, or the first 3D view found, or None"
v = FreeCADGui.ActiveDocument.ActiveView
if str(type(v)) == "<type 'View3DInventorPy'>":
return v
v = FreeCADGui.ActiveDocument.mdiViewsOfType("Gui::View3DInventor")
if v:
return v[0]
return None
def isClone(obj,objtype): def isClone(obj,objtype):
"""isClone(obj,objtype): returns True if the given object is """isClone(obj,objtype): returns True if the given object is
a clone of an object of the given type""" a clone of an object of the given type"""
@ -1172,21 +1182,17 @@ def draftify(objectslist,makeblock=False):
return newobjlist[0] return newobjlist[0]
return newobjlist return newobjlist
def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=None): def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direction=None):
'''getSVG(object,[modifier],[textmodifier],[fillstyle],[direction]): '''getSVG(object,[scale], [linewidth],[fontsize],[fillstyle],[direction]):
returns a string containing a SVG representation of the given object. the modifier attribute returns a string containing a SVG representation of the given object,
specifies a scale factor for linewidths in %, and textmodifier specifies with the given linewidth and fontsize (used if the given object contains
a scale factor for texts, in % (both default = 100). You can also supply any text). You can also supply an arbitrary projection vector. the
an arbitrary projection vector.''' scale parameter allows to scale linewidths down, so they are resolution-independant.'''
import Part import Part
from draftlibs import fcgeo from draftlibs import fcgeo
svg = "" svg = ""
tmod = ((textmodifier-100)/2)+100 linewidth = linewidth/scale
if tmod == 0: tmod = 0.01 fontsize = (fontsize/scale)/2
modifier = 200-modifier
if modifier == 0: modifier = 0.01
pmod = (200-textmodifier)/20
if pmod == 0: pmod = 0.01
plane = None plane = None
if direction: if direction:
if direction != Vector(0,0,0): if direction != Vector(0,0,0):
@ -1259,8 +1265,8 @@ def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=N
if fill != 'none': svg += 'Z' if fill != 'none': svg += 'Z'
svg += '" ' svg += '" '
svg += 'stroke="' + stroke + '" ' svg += 'stroke="' + stroke + '" '
svg += 'stroke-width="' + str(width) + ' px" ' svg += 'stroke-width="' + str(linewidth) + ' px" '
svg += 'style="stroke-width:'+ str(width) svg += 'style="stroke-width:'+ str(linewidth)
svg += ';stroke-miterlimit:4' svg += ';stroke-miterlimit:4'
svg += ';stroke-dasharray:' + lstyle svg += ';stroke-dasharray:' + lstyle
svg += ';fill:' + fill + '"' svg += ';fill:' + fill + '"'
@ -1274,8 +1280,8 @@ def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=N
svg += '" cy="' + str(cen.y) svg += '" cy="' + str(cen.y)
svg += '" r="' + str(rad)+'" ' svg += '" r="' + str(rad)+'" '
svg += 'stroke="' + stroke + '" ' svg += 'stroke="' + stroke + '" '
svg += 'stroke-width="' + str(width) + ' px" ' svg += 'stroke-width="' + str(linewidth) + ' px" '
svg += 'style="stroke-width:'+ str(width) svg += 'style="stroke-width:'+ str(linewidth)
svg += ';stroke-miterlimit:4' svg += ';stroke-miterlimit:4'
svg += ';stroke-dasharray:' + lstyle svg += ';stroke-dasharray:' + lstyle
svg += ';fill:' + fill + '"' svg += ';fill:' + fill + '"'
@ -1319,35 +1325,36 @@ def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=N
svg += 'L '+str(p4.x)+' '+str(p4.y)+'" ' svg += 'L '+str(p4.x)+' '+str(p4.y)+'" '
svg += 'fill="none" stroke="' svg += 'fill="none" stroke="'
svg += getrgb(obj.ViewObject.LineColor) + '" ' svg += getrgb(obj.ViewObject.LineColor) + '" '
svg += 'stroke-width="' + str(obj.ViewObject.LineWidth/modifier) + ' px" ' svg += 'stroke-width="' + str(linewidth) + ' px" '
svg += 'style="stroke-width:'+ str(obj.ViewObject.LineWidth/modifier) svg += 'style="stroke-width:'+ str(linewidth)
svg += ';stroke-miterlimit:4;stroke-dasharray:none" ' svg += ';stroke-miterlimit:4;stroke-dasharray:none" '
svg += 'freecad:basepoint1="'+str(p1.x)+' '+str(p1.y)+'" ' svg += 'freecad:basepoint1="'+str(p1.x)+' '+str(p1.y)+'" '
svg += 'freecad:basepoint2="'+str(p4.x)+' '+str(p4.y)+'" ' svg += 'freecad:basepoint2="'+str(p4.x)+' '+str(p4.y)+'" '
svg += 'freecad:dimpoint="'+str(p2.x)+' '+str(p2.y)+'"' svg += 'freecad:dimpoint="'+str(p2.x)+' '+str(p2.y)+'"'
svg += '/>\n' svg += '/>\n'
svg += '<circle cx="'+str(p2.x)+'" cy="'+str(p2.y) svg += '<circle cx="'+str(p2.x)+'" cy="'+str(p2.y)
svg += '" r="'+str(obj.ViewObject.FontSize/(pmod))+'" ' svg += '" r="'+str(fontsize)+'" '
svg += 'fill="'+ getrgb(obj.ViewObject.LineColor) +'" stroke="none" ' svg += 'fill="'+ getrgb(obj.ViewObject.LineColor) +'" stroke="none" '
svg += 'style="stroke-miterlimit:4;stroke-dasharray:none" ' svg += 'style="stroke-miterlimit:4;stroke-dasharray:none" '
svg += 'freecad:skip="1"' svg += 'freecad:skip="1"'
svg += '/>\n' svg += '/>\n'
svg += '<circle cx="'+str(p3.x)+'" cy="'+str(p3.y) svg += '<circle cx="'+str(p3.x)+'" cy="'+str(p3.y)
svg += '" r="'+str(obj.ViewObject.FontSize/(pmod))+'" ' svg += '" r="'+str(fontsize)+'" '
svg += 'fill="#000000" stroke="none" ' svg += 'fill="#000000" stroke="none" '
svg += 'style="stroke-miterlimit:4;stroke-dasharray:none" ' svg += 'style="stroke-miterlimit:4;stroke-dasharray:none" '
svg += 'freecad:skip="1"' svg += 'freecad:skip="1"'
svg += '/>\n' svg += '/>\n'
svg += '<text id="' + obj.Name + '" fill="' svg += '<text id="' + obj.Name + '" fill="'
svg += getrgb(obj.ViewObject.LineColor) +'" font-size="' svg += getrgb(obj.ViewObject.LineColor) +'" font-size="'
svg += str(obj.ViewObject.FontSize*(tmod/5))+'" ' svg += str(fontsize)+'" '
svg += 'style="text-anchor:middle;text-align:center;' svg += 'style="text-anchor:middle;text-align:center;'
svg += 'font-family:'+obj.ViewObject.FontName+'" ' svg += 'font-family:'+obj.ViewObject.FontName+'" '
svg += 'transform="rotate('+str(math.degrees(angle)) svg += 'transform="rotate('+str(math.degrees(angle))
svg += ','+ str(tbase.x) + ',' + str(tbase.y) + ') ' svg += ','+ str(tbase.x) + ',' + str(tbase.y) + ') '
svg += 'translate(' + str(tbase.x) + ',' + str(tbase.y) + ') ' svg += 'translate(' + str(tbase.x) + ',' + str(tbase.y) + ') '
svg += 'scale('+str(tmod/2000)+',-'+str(tmod/2000)+')" ' #svg += 'scale('+str(tmod/2000)+',-'+str(tmod/2000)+') '
svg += 'freecad:skip="1"' svg += 'scale(1,-1) '
svg += '" freecad:skip="1"'
svg += '>\n' svg += '>\n'
svg += dimText % p3.sub(p2).Length svg += dimText % p3.sub(p2).Length
svg += '</text>\n</g>\n' svg += '</text>\n</g>\n'
@ -1358,7 +1365,7 @@ def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=N
svg = '<text id="' + obj.Name + '" fill="' svg = '<text id="' + obj.Name + '" fill="'
svg += getrgb(obj.ViewObject.TextColor) svg += getrgb(obj.ViewObject.TextColor)
svg += '" font-size="' svg += '" font-size="'
svg += str(obj.ViewObject.FontSize*(tmod/5))+'" ' svg += str(fontsize)+'" '
svg += 'style="text-anchor:middle;text-align:center;' svg += 'style="text-anchor:middle;text-align:center;'
svg += 'font-family:'+obj.ViewObject.FontName+'" ' svg += 'font-family:'+obj.ViewObject.FontName+'" '
svg += 'transform="' svg += 'transform="'
@ -1367,7 +1374,9 @@ def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=N
svg += 'rotate('+str(obj.ViewObject.Rotation) svg += 'rotate('+str(obj.ViewObject.Rotation)
svg += ','+ str(p.x) + ',' + str(p.y) + ') ' svg += ','+ str(p.x) + ',' + str(p.y) + ') '
svg += 'translate(' + str(p.x) + ',' + str(p.y) + ') ' svg += 'translate(' + str(p.x) + ',' + str(p.y) + ') '
svg +='scale('+str(tmod/2000)+','+str(-tmod/2000)+')">\n' #svg +='scale('+str(tmod/2000)+','+str(-tmod/2000)+')'
svg += 'scale(1,-1) '
svg += '">\n'
for l in obj.LabelText: for l in obj.LabelText:
svg += '<tspan>'+l+'</tspan>\n' svg += '<tspan>'+l+'</tspan>\n'
svg += '</text>\n' svg += '</text>\n'
@ -1378,7 +1387,6 @@ def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=N
lorig = getLineStyle(obj) lorig = getLineStyle(obj)
name = obj.Name name = obj.Name
stroke = getrgb(obj.ViewObject.LineColor) stroke = getrgb(obj.ViewObject.LineColor)
width = obj.ViewObject.LineWidth/modifier
fill = 'none' fill = 'none'
invpl = obj.Placement.inverse() invpl = obj.Placement.inverse()
n = 0 n = 0
@ -1422,7 +1430,6 @@ def getSVG(obj,modifier=100,textmodifier=100,fillstyle="shape color",direction=N
stroke = "none" stroke = "none"
else: else:
stroke = getrgb(obj.ViewObject.LineColor) stroke = getrgb(obj.ViewObject.LineColor)
width = obj.ViewObject.LineWidth/modifier
if len(obj.Shape.Vertexes) > 1: if len(obj.Shape.Vertexes) > 1:
wiredEdges = [] wiredEdges = []
@ -1794,12 +1801,12 @@ class _ViewProviderDimension:
if not proj: norm = Vector(0,0,1) if not proj: norm = Vector(0,0,1)
else: norm = fcvec.neg(p3.sub(p2).cross(proj)) else: norm = fcvec.neg(p3.sub(p2).cross(proj))
norm.normalize() norm.normalize()
va = FreeCADGui.ActiveDocument.ActiveView.getViewDirection() va = get3DView().getViewDirection()
if va.getAngle(norm) < math.pi/2: if va.getAngle(norm) < math.pi/2:
norm = fcvec.neg(norm) norm = fcvec.neg(norm)
u = p3.sub(p2) u = p3.sub(p2)
u.normalize() u.normalize()
c = FreeCADGui.ActiveDocument.ActiveView.getCameraNode() c = get3DView().getCameraNode()
r = c.orientation.getValue() r = c.orientation.getValue()
ru = Vector(r.multVec(coin.SbVec3f(1,0,0)).getValue()) ru = Vector(r.multVec(coin.SbVec3f(1,0,0)).getValue())
if ru.getAngle(u) > math.pi/2: u = fcvec.neg(u) if ru.getAngle(u) > math.pi/2: u = fcvec.neg(u)
@ -2511,19 +2518,18 @@ class _Polygon:
class _DrawingView: class _DrawingView:
def __init__(self, obj): def __init__(self, obj):
obj.addProperty("App::PropertyVector","Direction","Shape view","Projection direction") obj.addProperty("App::PropertyVector","Direction","Shape View","Projection direction")
obj.addProperty("App::PropertyFloat","LinewidthModifier","Drawing view","Modifies the linewidth of the lines inside this object") obj.addProperty("App::PropertyFloat","LineWidth","Drawing View","The width of the lines inside this object")
obj.addProperty("App::PropertyFloat","TextModifier","Drawing view","Modifies the size of the texts inside this object") obj.addProperty("App::PropertyFloat","FontSize","Drawing View","The size of the texts inside this object")
obj.addProperty("App::PropertyLink","Source","Base","The linked object") obj.addProperty("App::PropertyLink","Source","Base","The linked object")
obj.addProperty("App::PropertyEnumeration","FillStyle","Drawing view","Shape Fill Style") obj.addProperty("App::PropertyEnumeration","FillStyle","Drawing View","Shape Fill Style")
fills = ['shape color'] fills = ['shape color']
for f in FreeCAD.svgpatterns.keys(): for f in FreeCAD.svgpatterns.keys():
fills.append(f) fills.append(f)
obj.FillStyle = fills obj.FillStyle = fills
obj.Proxy = self obj.Proxy = self
obj.LinewidthModifier = 100 obj.LineWidth = 0.35
obj.TextModifier = 100 obj.FontSize = 12
self.Type = "DrawingView" self.Type = "DrawingView"
def execute(self, obj): def execute(self, obj):
@ -2531,12 +2537,12 @@ class _DrawingView:
obj.ViewResult = self.updateSVG(obj) obj.ViewResult = self.updateSVG(obj)
def onChanged(self, obj, prop): def onChanged(self, obj, prop):
if prop in ["X","Y","Scale","LinewidthModifier","TextModifier","FillStyle","Direction"]: if prop in ["X","Y","Scale","LineWidth","FontSize","FillStyle","Direction"]:
obj.ViewResult = self.updateSVG(obj) obj.ViewResult = self.updateSVG(obj)
def updateSVG(self, obj): def updateSVG(self, obj):
"encapsulates a svg fragment into a transformation node" "encapsulates a svg fragment into a transformation node"
svg = getSVG(obj.Source,obj.LinewidthModifier,obj.TextModifier,obj.FillStyle,obj.Direction) svg = getSVG(obj.Source,obj.Scale,obj.LineWidth,obj.FontSize,obj.FillStyle,obj.Direction)
result = '' result = ''
result += '<g id="' + obj.Name + '"' result += '<g id="' + obj.Name + '"'
result += ' transform="' result += ' transform="'

View File

@ -73,6 +73,7 @@ class Snapper:
self.trackLine = None self.trackLine = None
self.lastSnappedObject = None self.lastSnappedObject = None
self.active = True self.active = True
self.trackers = [[],[],[],[]] # view, grid, snap, extline
self.polarAngles = [90,45] self.polarAngles = [90,45]
@ -142,12 +143,20 @@ class Snapper:
return None return None
# setup trackers if needed # setup trackers if needed
if not self.tracker: v = Draft.get3DView()
self.tracker = DraftTrackers.snapTracker() if v in self.trackers[0]:
if not self.extLine: i = self.trackers[0].index(v)
self.extLine = DraftTrackers.lineTracker(dotted=True) self.grid = self.trackers[1][i]
if (not self.grid) and Draft.getParam("grid"): self.tracker = self.trackers[2][i]
self.extLine = self.trackers[3][i]
else:
self.grid = DraftTrackers.gridTracker() self.grid = DraftTrackers.gridTracker()
self.tracker = DraftTrackers.snapTracker()
self.extLine = DraftTrackers.lineTracker(dotted=True)
self.trackers[0].append(v)
self.trackers[1].append(self.grid)
self.trackers[2].append(self.tracker)
self.trackers[3].append(self.extLine)
# getting current snap Radius # getting current snap Radius
if not self.radius: if not self.radius:
@ -174,7 +183,7 @@ class Snapper:
point = self.getApparentPoint(screenpos[0],screenpos[1]) point = self.getApparentPoint(screenpos[0],screenpos[1])
# check if we snapped to something # check if we snapped to something
info = FreeCADGui.ActiveDocument.ActiveView.getObjectInfo((screenpos[0],screenpos[1])) info = Draft.get3DView().getObjectInfo((screenpos[0],screenpos[1]))
# checking if parallel to one of the edges of the last objects or to a polar direction # checking if parallel to one of the edges of the last objects or to a polar direction
@ -303,8 +312,9 @@ class Snapper:
def getApparentPoint(self,x,y): def getApparentPoint(self,x,y):
"returns a 3D point, projected on the current working plane" "returns a 3D point, projected on the current working plane"
pt = FreeCADGui.ActiveDocument.ActiveView.getPoint(x,y) view = Draft.get3DView()
dv = FreeCADGui.ActiveDocument.ActiveView.getViewDirection() pt = view.getPoint(x,y)
dv = view.getViewDirection()
return FreeCAD.DraftWorkingPlane.projectPoint(pt,dv) return FreeCAD.DraftWorkingPlane.projectPoint(pt,dv)
def snapToExtensions(self,point,last,constrain,eline): def snapToExtensions(self,point,last,constrain,eline):
@ -559,8 +569,9 @@ class Snapper:
def getScreenDist(self,dist,cursor): def getScreenDist(self,dist,cursor):
"returns a distance in 3D space from a screen pixels distance" "returns a distance in 3D space from a screen pixels distance"
p1 = FreeCADGui.ActiveDocument.ActiveView.getPoint(cursor) view = Draft.get3DView()
p2 = FreeCADGui.ActiveDocument.ActiveView.getPoint((cursor[0]+dist,cursor[1])) p1 = view.getPoint(cursor)
p2 = view.getPoint((cursor[0]+dist,cursor[1]))
return (p2.sub(p1)).Length return (p2.sub(p1)).Length
def getPerpendicular(self,edge,pt): def getPerpendicular(self,edge,pt):
@ -704,7 +715,7 @@ class Snapper:
self.pt = None self.pt = None
self.ui = FreeCADGui.draftToolBar self.ui = FreeCADGui.draftToolBar
self.view = FreeCADGui.ActiveDocument.ActiveView self.view = Draft.get3DView()
# setting a track line if we got an existing point # setting a track line if we got an existing point
if last: if last:

View File

@ -103,9 +103,6 @@ def msg(text=None,mode=None):
else: else:
FreeCAD.Console.PrintMessage(text) FreeCAD.Console.PrintMessage(text)
def get3DView():
return FreeCADGui.ActiveDocument.mdiViewsOfType("Gui::View3DInventor")[0]
def selectObject(arg): def selectObject(arg):
'''this is a scene even handler, to be called from the Draft tools '''this is a scene even handler, to be called from the Draft tools
when they need to select an object''' when they need to select an object'''
@ -116,7 +113,7 @@ def selectObject(arg):
if (arg["Type"] == "SoMouseButtonEvent"): if (arg["Type"] == "SoMouseButtonEvent"):
if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"):
cursor = arg["Position"] cursor = arg["Position"]
snapped = FreeCADGui.ActiveDocument.ActiveView.getObjectInfo((cursor[0],cursor[1])) snapped = Draft.get3DView().getObjectInfo((cursor[0],cursor[1]))
if snapped: if snapped:
obj = FreeCAD.ActiveDocument.getObject(snapped['Object']) obj = FreeCAD.ActiveDocument.getObject(snapped['Object'])
FreeCADGui.Selection.addSelection(obj) FreeCADGui.Selection.addSelection(obj)
@ -134,7 +131,7 @@ def getPoint(target,args,mobile=False,sym=False,workingplane=True):
''' '''
ui = FreeCADGui.draftToolBar ui = FreeCADGui.draftToolBar
view = FreeCADGui.ActiveDocument.ActiveView view = Draft.get3DView()
# get point # get point
if target.node: if target.node:
@ -149,8 +146,8 @@ def getPoint(target,args,mobile=False,sym=False,workingplane=True):
if (not plane.weak) and workingplane: if (not plane.weak) and workingplane:
# working plane was explicitely selected - project onto it # working plane was explicitely selected - project onto it
viewDirection = view.getViewDirection() viewDirection = view.getViewDirection()
if FreeCADGui.ActiveDocument.ActiveView.getCameraType() == "Perspective": if view.getCameraType() == "Perspective":
camera = FreeCADGui.ActiveDocument.ActiveView.getCameraNode() camera = view.getCameraNode()
p = camera.getField("position").getValue() p = camera.getField("position").getValue()
# view is from camera to point: # view is from camera to point:
viewDirection = point.sub(Vector(p[0],p[1],p[2])) viewDirection = point.sub(Vector(p[0],p[1],p[2]))
@ -173,7 +170,7 @@ def getPoint(target,args,mobile=False,sym=False,workingplane=True):
def getSupport(args): def getSupport(args):
"returns the supporting object and sets the working plane" "returns the supporting object and sets the working plane"
snapped = FreeCADGui.ActiveDocument.ActiveView.getObjectInfo((args["Position"][0],args["Position"][1])) snapped = Draft.get3DView().getObjectInfo((args["Position"][0],args["Position"][1]))
if not snapped: return None if not snapped: return None
obj = None obj = None
plane.save() plane.save()
@ -234,7 +231,7 @@ class SelectPlane:
self.doc = FreeCAD.ActiveDocument self.doc = FreeCAD.ActiveDocument
if self.doc: if self.doc:
FreeCAD.activeDraftCommand = self FreeCAD.activeDraftCommand = self
self.view = FreeCADGui.ActiveDocument.ActiveView self.view = Draft.get3DView()
self.ui = FreeCADGui.draftToolBar self.ui = FreeCADGui.draftToolBar
self.ui.selectPlaneUi() self.ui.selectPlaneUi()
msg(translate("draft", "Pick a face to define the drawing plane\n")) msg(translate("draft", "Pick a face to define the drawing plane\n"))
@ -253,7 +250,7 @@ class SelectPlane:
if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"): if (arg["State"] == "DOWN") and (arg["Button"] == "BUTTON1"):
cursor = arg["Position"] cursor = arg["Position"]
doc = FreeCADGui.ActiveDocument doc = FreeCADGui.ActiveDocument
info = doc.ActiveView.getObjectInfo((cursor[0],cursor[1])) info = Draft.get3DView().getObjectInfo((cursor[0],cursor[1]))
if info: if info:
try: try:
shape = doc.getObject(info["Object"]).Object.Shape shape = doc.getObject(info["Object"]).Object.Shape
@ -336,7 +333,7 @@ class Creator:
self.support = None self.support = None
self.commitList = [] self.commitList = []
self.doc = FreeCAD.ActiveDocument self.doc = FreeCAD.ActiveDocument
self.view = FreeCADGui.ActiveDocument.ActiveView self.view = Draft.get3DView()
self.featureName = name self.featureName = name
if not self.doc: if not self.doc:
self.finish() self.finish()
@ -1660,7 +1657,7 @@ class Modifier:
self.finish() self.finish()
else: else:
FreeCAD.activeDraftCommand = self FreeCAD.activeDraftCommand = self
self.view = get3DView() self.view = Draft.get3DView()
self.ui = FreeCADGui.draftToolBar self.ui = FreeCADGui.draftToolBar
FreeCADGui.draftToolBar.show() FreeCADGui.draftToolBar.show()
rot = self.view.getCameraNode().getField("orientation").getValue() rot = self.view.getCameraNode().getField("orientation").getValue()
@ -3650,7 +3647,7 @@ class Point:
return False return False
def Activated(self): def Activated(self):
self.view = FreeCADGui.ActiveDocument.ActiveView self.view = Draft.get3DView()
self.stack = [] self.stack = []
self.point = None self.point = None
# adding 2 callback functions # adding 2 callback functions

View File

@ -60,13 +60,10 @@ class Tracker:
todo.delay(self._removeSwitch, self.switch) todo.delay(self._removeSwitch, self.switch)
self.switch = None self.switch = None
def get3DView(self):
return FreeCADGui.ActiveDocument.mdiViewsOfType("Gui::View3DInventor")[0]
def _insertSwitch(self, switch): def _insertSwitch(self, switch):
'''insert self.switch into the scene graph. Must not be called '''insert self.switch into the scene graph. Must not be called
from an event handler (or other scene graph traversal).''' from an event handler (or other scene graph traversal).'''
sg=self.get3DView().getSceneGraph() sg=Draft.get3DView().getSceneGraph()
if self.ontop: if self.ontop:
sg.insertChild(switch,0) sg.insertChild(switch,0)
else: else:
@ -75,7 +72,7 @@ class Tracker:
def _removeSwitch(self, switch): def _removeSwitch(self, switch):
'''remove self.switch from the scene graph. As with _insertSwitch, '''remove self.switch from the scene graph. As with _insertSwitch,
must not be called during scene graph traversal).''' must not be called during scene graph traversal).'''
sg=self.get3DView().getSceneGraph() sg=Draft.get3DView().getSceneGraph()
sg.removeChild(switch) sg.removeChild(switch)
def on(self): def on(self):
@ -454,8 +451,8 @@ class PlaneTracker(Tracker):
"A working plane tracker" "A working plane tracker"
def __init__(self): def __init__(self):
# getting screen distance # getting screen distance
p1 = self.get3DView().getPoint((100,100)) p1 = Draft.get3DView().getPoint((100,100))
p2 = self.get3DView().getPoint((110,100)) p2 = Draft.get3DView().getPoint((110,100))
bl = (p2.sub(p1)).Length * (Draft.getParam("snapRange")/2) bl = (p2.sub(p1)).Length * (Draft.getParam("snapRange")/2)
self.trans = coin.SoTransform() self.trans = coin.SoTransform()
self.trans.translation.setValue([0,0,0]) self.trans.translation.setValue([0,0,0])

View File

@ -24,8 +24,6 @@ __title__="FreeCAD Draft Workbench - Init file"
__author__ = "Yorik van Havre <yorik@uncreated.net>" __author__ = "Yorik van Havre <yorik@uncreated.net>"
__url__ = ["http://free-cad.sourceforge.net"] __url__ = ["http://free-cad.sourceforge.net"]
import os,DraftTools
class DraftWorkbench (Workbench): class DraftWorkbench (Workbench):
"the Draft Workbench" "the Draft Workbench"
Icon = """ Icon = """
@ -179,9 +177,9 @@ class DraftWorkbench (Workbench):
else: else:
return return
try: try:
import macros,DraftTools,DraftGui import os,macros,DraftTools,DraftGui
self.appendMenu(["&Macro",str(DraftTools.translate("draft","Installed Macros"))],macros.macrosList) self.appendMenu(["&Macro",str(DraftTools.translate("draft","Installed Macros"))],macros.macrosList)
Log ('Loading Draft GUI...done\n') Log ('Loading Draft module...done\n')
except: except:
pass pass
self.cmdList = ["Draft_Line","Draft_Wire","Draft_Circle","Draft_Arc", self.cmdList = ["Draft_Line","Draft_Wire","Draft_Circle","Draft_Arc",

View File

@ -435,6 +435,15 @@ def getBoundary(shape):
if lut[e.hashCode()] == 1: bound.append(e) if lut[e.hashCode()] == 1: bound.append(e)
return bound return bound
def isLine(bsp):
"returns True if the given BSpline curve is a straight line"
step = bsp.LastParameter/10
b = bsp.tangent(0)
for i in range(10):
if bsp.tangent(i*step) != b:
return False
return True
def sortEdges(lEdges, aVertex=None): def sortEdges(lEdges, aVertex=None):
"an alternative, more accurate version of Part.__sortEdges__" "an alternative, more accurate version of Part.__sortEdges__"
@ -479,6 +488,11 @@ def sortEdges(lEdges, aVertex=None):
elif isinstance(result[3].Curve,Part.Circle): elif isinstance(result[3].Curve,Part.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):
if isLine(result[3].Curve):
return [Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()]
else:
return lEdges
else: else:
return lEdges return lEdges
@ -491,15 +505,20 @@ def sortEdges(lEdges, aVertex=None):
olEdges = sortEdges(lEdges, result[3].Vertexes[result[2]]) olEdges = sortEdges(lEdges, result[3].Vertexes[result[2]])
return olEdges return olEdges
# if the wire is closed there is no end so choose 1st Vertex # if the wire is closed there is no end so choose 1st Vertex
#print "closed wire, starting from ",lEdges[0].Vertexes[0].Point
return sortEdges(lEdges, lEdges[0].Vertexes[0]) return sortEdges(lEdges, lEdges[0].Vertexes[0])
else : else :
#print "looking ",aVertex.Point
result = lookfor(aVertex,lEdges) result = lookfor(aVertex,lEdges)
if result[0] != 0 : if result[0] != 0 :
del lEdges[result[1]] del lEdges[result[1]]
next = sortEdges(lEdges, result[3].Vertexes[-((-result[2])^1)]) next = sortEdges(lEdges, result[3].Vertexes[-((-result[2])^1)])
#print "result ",result[3].Vertexes[0].Point," ",result[3].Vertexes[1].Point, " compared to ",aVertex.Point
if isSameVertex(aVertex,result[3].Vertexes[0]): if isSameVertex(aVertex,result[3].Vertexes[0]):
#print "keeping"
olEdges += [result[3]] + next olEdges += [result[3]] + next
else: else:
#print "inverting", result[3].Curve
if isinstance(result[3].Curve,Part.Line): if isinstance(result[3].Curve,Part.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
@ -507,6 +526,12 @@ def sortEdges(lEdges, aVertex=None):
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):
if isLine(result[3].Curve):
newedge = Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()
olEdges += [newedge] + next
else:
olEdges += [result[3]] + next
else: else:
olEdges += [result[3]] + next olEdges += [result[3]] + next
return olEdges return olEdges
@ -514,6 +539,49 @@ def sortEdges(lEdges, aVertex=None):
return [] return []
def findWires(edgeslist):
'''finds connected wires in the given list of edges'''
def touches(e1,e2):
if len(e1.Vertexes) < 2:
return False
if len(e2.Vertexes) < 2:
return False
if fcvec.equals(e1.Vertexes[0].Point,e2.Vertexes[0].Point):
return True
if fcvec.equals(e1.Vertexes[0].Point,e2.Vertexes[-1].Point):
return True
if fcvec.equals(e1.Vertexes[-1].Point,e2.Vertexes[0].Point):
return True
if fcvec.equals(e1.Vertexes[-1].Point,e2.Vertexes[-1].Point):
return True
return False
edges = edgeslist[:]
wires = []
while edges:
e = edges[0]
if not wires:
# create first group
edges.remove(e)
wires.append([e])
else:
found = False
for w in wires:
if found:
break
for we in w:
if touches(e,we):
edges.remove(e)
w.append(e)
found = True
break
else:
# edge doesn't connect with any existing group
edges.remove(e)
wires.append([e])
return wires
def superWire(edgeslist,closed=False): def superWire(edgeslist,closed=False):
'''superWire(edges,[closed]): forces a wire between edges that don't necessarily '''superWire(edges,[closed]): forces a wire between edges that don't necessarily
have coincident endpoints. If closed=True, wire will always be closed''' have coincident endpoints. If closed=True, wire will always be closed'''
@ -704,8 +772,8 @@ def getNormal(shape):
n = e1.cross(e2).normalize() n = e1.cross(e2).normalize()
break break
if FreeCAD.GuiUp: if FreeCAD.GuiUp:
import FreeCADGui import Draft
vdir = FreeCADGui.ActiveDocument.ActiveView.getViewDirection() vdir = Draft.get3DView().getViewDirection()
if n.getAngle(vdir) < 0.78: n = fcvec.neg(n) if n.getAngle(vdir) < 0.78: n = fcvec.neg(n)
return n return n

View File

@ -76,11 +76,13 @@ PROPERTY_SOURCE(Drawing::FeatureViewPart, Drawing::FeatureView)
FeatureViewPart::FeatureViewPart(void) FeatureViewPart::FeatureViewPart(void)
{ {
static const char *group = "Shape view"; static const char *group = "Shape view";
static const char *vgroup = "Drawing view";
ADD_PROPERTY_TYPE(Direction ,(0,0,1.0),group,App::Prop_None,"Projection direction"); ADD_PROPERTY_TYPE(Direction ,(0,0,1.0),group,App::Prop_None,"Projection direction");
ADD_PROPERTY_TYPE(Source ,(0),group,App::Prop_None,"Shape to view"); ADD_PROPERTY_TYPE(Source ,(0),group,App::Prop_None,"Shape to view");
ADD_PROPERTY_TYPE(ShowHiddenLines ,(false),group,App::Prop_None,"Control the appearance of the dashed hidden lines"); ADD_PROPERTY_TYPE(ShowHiddenLines ,(false),group,App::Prop_None,"Control the appearance of the dashed hidden lines");
ADD_PROPERTY_TYPE(ShowSmoothLines ,(false),group,App::Prop_None,"Control the appearance of the smooth lines"); ADD_PROPERTY_TYPE(ShowSmoothLines ,(false),group,App::Prop_None,"Control the appearance of the smooth lines");
ADD_PROPERTY_TYPE(LineWidth,(0.35),vgroup,App::Prop_None,"The thickness of the resulting lines");
} }
FeatureViewPart::~FeatureViewPart() FeatureViewPart::~FeatureViewPart()
@ -196,7 +198,7 @@ App::DocumentObjectExecReturn *FeatureViewPart::execute(void)
ProjectionAlgos::SvgExtractionType type = ProjectionAlgos::Plain; ProjectionAlgos::SvgExtractionType type = ProjectionAlgos::Plain;
if (hidden) type = (ProjectionAlgos::SvgExtractionType)(type|ProjectionAlgos::WithHidden); if (hidden) type = (ProjectionAlgos::SvgExtractionType)(type|ProjectionAlgos::WithHidden);
if (smooth) type = (ProjectionAlgos::SvgExtractionType)(type|ProjectionAlgos::WithSmooth); if (smooth) type = (ProjectionAlgos::SvgExtractionType)(type|ProjectionAlgos::WithSmooth);
result << Alg.getSVG(type, this->Scale.getValue()); result << Alg.getSVG(type, this->LineWidth.getValue() / this->Scale.getValue());
result << "</g>" << endl; result << "</g>" << endl;

View File

@ -52,6 +52,7 @@ public:
App::PropertyVector Direction; App::PropertyVector Direction;
App::PropertyBool ShowHiddenLines; App::PropertyBool ShowHiddenLines;
App::PropertyBool ShowSmoothLines; App::PropertyBool ShowSmoothLines;
App::PropertyFloat LineWidth;
/** @name methods overide Feature */ /** @name methods overide Feature */

View File

@ -153,8 +153,10 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale)
{ {
std::stringstream result; std::stringstream result;
SVGOutput output; SVGOutput output;
float hfactor = 0.5f; // hidden line size factor, was 0.15f / 0.35f;
if (!H.IsNull() && (type & WithHidden)) { if (!H.IsNull() && (type & WithHidden)) {
float width = 0.15f/scale; float width = hfactor * scale;
BRepMesh::Mesh(H,0.1); BRepMesh::Mesh(H,0.1);
result << "<g" result << "<g"
//<< " id=\"" << ViewName << "\"" << endl //<< " id=\"" << ViewName << "\"" << endl
@ -162,14 +164,14 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale)
<< " stroke-width=\"" << width << "\"" << endl << " stroke-width=\"" << width << "\"" << endl
<< " stroke-linecap=\"butt\"" << endl << " stroke-linecap=\"butt\"" << endl
<< " stroke-linejoin=\"miter\"" << endl << " stroke-linejoin=\"miter\"" << endl
<< " stroke-dasharray=\"5 3\"" << endl << " stroke-dasharray=\"0.2,0.1\"" << endl
<< " fill=\"none\"" << endl << " fill=\"none\"" << endl
<< " >" << endl << " >" << endl
<< output.exportEdges(H) << output.exportEdges(H)
<< "</g>" << endl; << "</g>" << endl;
} }
if (!HO.IsNull() && (type & WithHidden)) { if (!HO.IsNull() && (type & WithHidden)) {
float width = 0.15f/scale; float width = hfactor * scale;
BRepMesh::Mesh(HO,0.1); BRepMesh::Mesh(HO,0.1);
result << "<g" result << "<g"
//<< " id=\"" << ViewName << "\"" << endl //<< " id=\"" << ViewName << "\"" << endl
@ -177,14 +179,14 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale)
<< " stroke-width=\"" << width << "\"" << endl << " stroke-width=\"" << width << "\"" << endl
<< " stroke-linecap=\"butt\"" << endl << " stroke-linecap=\"butt\"" << endl
<< " stroke-linejoin=\"miter\"" << endl << " stroke-linejoin=\"miter\"" << endl
<< " stroke-dasharray=\"5 3\"" << endl << " stroke-dasharray=\"0.02,0.1\"" << endl
<< " fill=\"none\"" << endl << " fill=\"none\"" << endl
<< " >" << endl << " >" << endl
<< output.exportEdges(HO) << output.exportEdges(HO)
<< "</g>" << endl; << "</g>" << endl;
} }
if (!VO.IsNull()) { if (!VO.IsNull()) {
float width = 0.35f/scale; float width = scale;
BRepMesh::Mesh(VO,0.1); BRepMesh::Mesh(VO,0.1);
result << "<g" result << "<g"
//<< " id=\"" << ViewName << "\"" << endl //<< " id=\"" << ViewName << "\"" << endl
@ -198,7 +200,7 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale)
<< "</g>" << endl; << "</g>" << endl;
} }
if (!V.IsNull()) { if (!V.IsNull()) {
float width = 0.35f/scale; float width = scale;
BRepMesh::Mesh(V,0.1); BRepMesh::Mesh(V,0.1);
result << "<g" result << "<g"
//<< " id=\"" << ViewName << "\"" << endl //<< " id=\"" << ViewName << "\"" << endl
@ -212,7 +214,7 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale)
<< "</g>" << endl; << "</g>" << endl;
} }
if (!V1.IsNull() && (type & WithSmooth)) { if (!V1.IsNull() && (type & WithSmooth)) {
float width = 0.35f/scale; float width = scale;
BRepMesh::Mesh(V1,0.1); BRepMesh::Mesh(V1,0.1);
result << "<g" result << "<g"
//<< " id=\"" << ViewName << "\"" << endl //<< " id=\"" << ViewName << "\"" << endl
@ -226,7 +228,7 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale)
<< "</g>" << endl; << "</g>" << endl;
} }
if (!H1.IsNull() && (type & WithSmooth) && (type & WithHidden)) { if (!H1.IsNull() && (type & WithSmooth) && (type & WithHidden)) {
float width = 0.15f/scale; float width = hfactor * scale;
BRepMesh::Mesh(H1,0.1); BRepMesh::Mesh(H1,0.1);
result << "<g" result << "<g"
//<< " id=\"" << ViewName << "\"" << endl //<< " id=\"" << ViewName << "\"" << endl
@ -234,7 +236,7 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale)
<< " stroke-width=\"" << width << "\"" << endl << " stroke-width=\"" << width << "\"" << endl
<< " stroke-linecap=\"butt\"" << endl << " stroke-linecap=\"butt\"" << endl
<< " stroke-linejoin=\"miter\"" << endl << " stroke-linejoin=\"miter\"" << endl
<< " stroke-dasharray=\"5 3\"" << endl << " stroke-dasharray=\"0.09,0.05\"" << endl
<< " fill=\"none\"" << endl << " fill=\"none\"" << endl
<< " >" << endl << " >" << endl
<< output.exportEdges(H1) << output.exportEdges(H1)

View File

@ -1365,7 +1365,7 @@ CmdSketcherCreateFillet::CmdSketcherCreateFillet()
sAppModule = "Sketcher"; sAppModule = "Sketcher";
sGroup = QT_TR_NOOP("Sketcher"); sGroup = QT_TR_NOOP("Sketcher");
sMenuText = QT_TR_NOOP("Create fillet"); sMenuText = QT_TR_NOOP("Create fillet");
sToolTipText = QT_TR_NOOP("Create a fillet between to lines or at a coincident point"); sToolTipText = QT_TR_NOOP("Create a fillet between two lines or at a coincidental point");
sWhatsThis = sToolTipText; sWhatsThis = sToolTipText;
sStatusTip = sToolTipText; sStatusTip = sToolTipText;
sPixmap = "Sketcher_CreateFillet"; sPixmap = "Sketcher_CreateFillet";

View File

@ -99,7 +99,6 @@
<File Id="LibPack55" Name="QtHelp4.dll" /> <File Id="LibPack55" Name="QtHelp4.dll" />
<File Id="LibPack56" Name="QtCLucene4.dll" /> <File Id="LibPack56" Name="QtCLucene4.dll" />
<File Id="LibPack52" Name="phonon4.dll" /> <File Id="LibPack52" Name="phonon4.dll" />
<File Id="LibPack53" Name="sketchflat.exe" />
<File Id="LibPack54" Name="assistant.exe" /> <File Id="LibPack54" Name="assistant.exe" />
<File Id="LibPack61" Name="TKBO.dll" /> <File Id="LibPack61" Name="TKBO.dll" />
<File Id="LibPack62" Name="TKBool.dll" /> <File Id="LibPack62" Name="TKBool.dll" />