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()
{
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()
@ -179,13 +179,13 @@ PyObject *DocumentObjectGroup::getPyObject()
return Py::new_reference_to(PythonObject);
}
// Python Sketcher feature ---------------------------------------------------------
// Python feature ---------------------------------------------------------
namespace App {
/// @cond DOXERR
PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup)
template<> const char* App::DocumentObjectGroupPython::getViewProviderName(void) const {
return "Gui::ViewProviderDocumentObjectGroup";
return "Gui::ViewProviderDocumentObjectGroupPython";
}
/// @endcond

View File

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

View File

@ -221,3 +221,15 @@ QIcon ViewProviderDocumentObjectGroup::getIcon() const
QIcon::Normal, QIcon::On);
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 "ViewProviderPythonFeature.h"
namespace Gui {
@ -63,6 +64,7 @@ private:
std::vector<ViewProvider*> nodes;
};
typedef ViewProviderPythonFeatureT<ViewProviderDocumentObjectGroup> ViewProviderDocumentObjectGroupPython;
} // namespace Gui

View File

@ -21,7 +21,7 @@
#* *
#***************************************************************************
import ArchCell,FreeCAD,FreeCADGui,Draft,ArchCommands
import FreeCAD,FreeCADGui,Draft,ArchCommands
from PyQt4 import QtCore
__title__="FreeCAD Building"
@ -31,14 +31,11 @@ __url__ = "http://free-cad.sourceforge.net"
def makeBuilding(objectslist=None,join=False,name="Building"):
'''makeBuilding(objectslist,[joinmode]): creates a building including the
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)
_ViewProviderBuilding(obj.ViewObject)
if objectslist:
obj.Components = objectslist
for comp in obj.Components:
comp.ViewObject.hide()
obj.JoinMode = join
obj.Group = objectslist
return obj
class _CommandBuilding:
@ -66,18 +63,32 @@ class _CommandBuilding:
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Building(ArchCell._Cell):
class _Building:
"The Building object"
def __init__(self,obj):
ArchCell._Cell.__init__(self,obj)
self.Type = "Building"
obj.Proxy = self
def execute(self,obj):
pass
class _ViewProviderBuilding(ArchCell._ViewProviderCell):
def onChanged(self,obj,prop):
pass
class _ViewProviderBuilding:
"A View Provider for the Building object"
def __init__(self,vobj):
ArchCell._ViewProviderCell.__init__(self,vobj)
vobj.Proxy = self
def getIcon(self):
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())

View File

@ -39,12 +39,18 @@ def addComponents(objectsList,host):
if not isinstance(objectsList,list):
objectsList = [objectsList]
tp = Draft.getType(host)
if tp in ["Cell","Floor","Building","Site"]:
if tp in ["Cell"]:
c = host.Components
for o in objectsList:
if not o in c:
c.append(o)
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"]:
a = host.Additions
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
__title__="FreeCAD Arch Floor"
@ -32,14 +32,11 @@ def makeFloor(objectslist=None,join=True,name="Floor"):
'''makeFloor(objectslist,[joinmode]): creates a floor including the
objects from the given list. If joinmode is False, components will
not be joined.'''
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython",name)
_Floor(obj)
_ViewProviderFloor(obj.ViewObject)
if objectslist:
obj.Components = objectslist
for comp in obj.Components:
comp.ViewObject.hide()
obj.JoinMode = join
obj.Group = objectslist
return obj
class _CommandFloor:
@ -67,20 +64,34 @@ class _CommandFloor:
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Floor(ArchCell._Cell):
class _Floor:
"The Cell object"
def __init__(self,obj):
ArchCell._Cell.__init__(self,obj)
obj.addProperty("App::PropertyLength","Height","Base",
"The height of this floor")
self.Type = "Floor"
obj.Proxy = self
def execute(self,obj):
pass
class _ViewProviderFloor(ArchCell._ViewProviderCell):
def onChanged(self,obj,prop):
pass
class _ViewProviderFloor:
"A View Provider for the Cell object"
def __init__(self,vobj):
ArchCell._ViewProviderCell.__init__(self,vobj)
vobj.Proxy = self
def getIcon(self):
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())

View File

@ -157,9 +157,11 @@ class _ViewProviderSectionPlane(ArchComponent.ViewProviderComponent):
class _ArchDrawingView:
def __init__(self, obj):
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"
obj.LineWidth = 0.35
obj.Proxy = self
self.Type = "DrawingView"
@ -179,28 +181,35 @@ class _ArchDrawingView:
if obj.Source.Objects:
svg = ''
cp = ArchCommands.getCutVolume(obj.Source.Objects,obj.Source.Placement)
print "cp:",cp
sections = []
self.sections = []
if cp:
cutvolume = cp[0].extrude(cp[1])
shapes = []
colors = []
for o in obj.Source.Objects:
color = o.ViewObject.DiffuseColor[0]
print "adding ",o.Name," with color ",color
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])
if sec.Edges:
sec = Part.Wire(fcgeo.sortEdges(sec.Edges))
sec = Part.Face(sec)
sections.append(sec)
wires = fcgeo.findWires(sec.Edges)
for w in wires:
sec = Part.Wire(fcgeo.sortEdges(w.Edges))
sec = Part.Face(sec)
self.sections.append(sec)
else:
shapes.append(o.Shape)
colors.append(color)
linewidth = obj.LineWidth/obj.Scale
if obj.RenderingMode == "Solid":
svg += self.renderVRM(shapes,obj.Source.Placement)
svg += self.renderVRM(shapes,obj.Source.Placement,colors,linewidth)
else:
svg += self.renderOCC(shapes,obj.Source.Proxy.getNormal(obj.Source))
print "sections:",sections
for s in sections:
svg += self.renderSection(s,obj.Source.Placement)
svg += self.renderOCC(shapes,obj.Source.Proxy.getNormal(obj.Source),linewidth)
for s in self.sections:
svg += self.renderSection(s,obj.Source.Placement,linewidth*2)
result = ''
result += '<g id="' + obj.Name + '"'
result += ' transform="'
@ -210,11 +219,11 @@ class _ArchDrawingView:
result += '">\n'
result += svg
result += '</g>\n'
print "complete node:",result
#print "complete node:",result
return result
return ''
def renderOCC(self,shapes,direction):
def renderOCC(self,shapes,direction,linewidth):
"renders an SVG fragment with the OCC method"
shapes = shapes[:]
if shapes:
@ -223,21 +232,25 @@ class _ArchDrawingView:
base = base.fuse(sh)
result = Drawing.projectToSVG(base,fcvec.neg(direction))
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 ''
def renderVRM(self,shapes,placement):
def renderVRM(self,shapes,placement,colors,linewidth):
"renders an SVG fragment with the ArchVRM method"
import ArchVRM
render = ArchVRM.Renderer()
render.setWorkingPlane(FreeCAD.Placement(placement))
for s in shapes:
render.add(s)
svg = render.getSVG()
for i in range(len(shapes)):
if colors:
render.add(shapes[i],colors[i])
else:
render.add(shapes[i])
svg = render.getSVG(linewidth=linewidth)
print render.info()
return svg
def renderSection(self,shape,placement):
def renderSection(self,shape,placement,linewidth):
"renders a plane parallel to the section plane"
placement = FreeCAD.Placement(placement)
u = placement.Rotation.multVec(FreeCAD.Vector(1,0,0))
@ -262,8 +275,8 @@ class _ArchDrawingView:
svg += 'z '
svg += '" '
svg += 'stroke="#000000" '
svg += 'stroke-width="0.02 px" '
svg += 'style="stroke-width:0.01;'
svg += 'stroke-width="' + str(linewidth) + 'px" '
svg += 'style="stroke-width:' + str(linewidth) + ';'
svg += 'stroke-miterlimit:1;'
svg += 'stroke-linejoin:round;'
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
__title__="FreeCAD Site"
@ -31,12 +31,11 @@ __url__ = "http://free-cad.sourceforge.net"
def makeSite(objectslist=None,name="Site"):
'''makeBuilding(objectslist): creates a site including the
objects from the given list.'''
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
obj = FreeCAD.ActiveDocument.addObject("App::DocumentObjectGroupPython",name)
_Site(obj)
_ViewProviderSite(obj.ViewObject)
if objectslist:
obj.Components = objectslist
obj.JoinMode = False
obj.Group = objectslist
return obj
class _CommandSite:
@ -64,11 +63,11 @@ class _CommandSite:
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
class _Site(ArchCell._Cell):
class _Site:
"The Site object"
def __init__(self,obj):
ArchCell._Cell.__init__(self,obj)
self.Type = "Site"
obj.Proxy = self
def execute(self,obj):
pass
@ -76,12 +75,19 @@ class _Site(ArchCell._Cell):
def onChanged(self,obj,prop):
pass
class _ViewProviderSite(ArchCell._ViewProviderCell):
class _ViewProviderSite:
"A View Provider for the Site object"
def __init__(self,vobj):
ArchCell._ViewProviderCell.__init__(self,vobj)
vobj.Proxy = self
def getIcon(self):
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())

View File

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

View File

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

View File

@ -165,20 +165,17 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_2">
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox">
<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 name="text">
<string>use internal IFC parser</string>
</property>
<property name="checked">
<bool>true</bool>
<string>Use IFCOpenShell if available</string>
</property>
<property name="prefEntry" stdset="0">
<cstring>useIfcParser</cstring>
<cstring>useIfcOpenShell</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring>
@ -188,17 +185,34 @@
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox">
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_2">
<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 name="text">
<string>Use IFCOpenShell</string>
<string>Group components by types</string>
</property>
<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 name="prefPath" stdset="0">
<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
__title__="FreeCAD IFC importer"
__author__ = "Yorik van Havre"
__url__ = "http://free-cad.sourceforge.net"
# config
DEBUG = True
SCHEMA = "http://www.steptools.com/support/stdev_docs/express/ifc2x3/ifc2x3_tc1.exp"
SKIP = ["IfcOpeningElement"]
SKIP = ["IfcOpeningElement","IfcSpace"]
# end config
if open.__module__ == '__builtin__':
pyopen = open # because we'll redefine open below
@ -41,13 +43,15 @@ def open(filename):
doc = FreeCAD.newDocument(docname)
doc.Label = decode(docname)
FreeCAD.ActiveDocument = doc
global createIfcGroups, useIfcOpenShell, importIfcFurniture
createIfcGroups = useIfcOpenShell = importIfcFurniture = False
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
op = p.GetBool("useIfcOpenShell")
ip = p.GetBool("useIfcParser")
if op:
readOpenShell(filename,useParser=ip)
else:
readInternal(filename)
useIfcOpenShell = p.GetBool("useIfcOpenShell")
createIfcGroups = p.GetBool("createIfcGroups")
importIfcFurniture = p.GetBool("importIfcFurniture")
if not importIfcFurniture:
SKIP.append("IfcFurnishingElement")
read(filename)
return doc
def decode(name):
@ -85,47 +89,72 @@ def getIfcOpenShell():
else:
return True
def readOpenShell(filename,useParser=False):
def read(filename):
"Parses an IFC file with IfcOpenShell"
altifc = None
if useParser:
altifc = parseFile(filename)
# parsing the IFC file
t1 = time.time()
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():
USESHAPES = False
if useIfcOpenShell and getIfcOpenShell():
# use the IfcOpenShell parser
useShapes = False
if hasattr(IfcImport,"USE_BREP_DATA"):
IfcImport.Settings(IfcImport.USE_BREP_DATA,True)
USESHAPES = True
useShapes = True
if IfcImport.Init(filename):
while True:
obj = IfcImport.Get()
if DEBUG: print "parsing ",obj.id,": ",obj.name," of type ",obj.type
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:
pass
# walls
elif altifc and (obj.type == "IfcWallStandardCase"):
makeWall(altifc.Entities[obj.id],shape = getShape(obj) if USESHAPES else None)
elif obj.type == "IfcWallStandardCase":
makeWall(ifc.Entities[obj.id],shape)
# windows
elif altifc and (obj.type in ["IfcWindow","IfcDoor"]):
makeWindow(altifc.Entities[obj.id],shape = getShape(obj) if USESHAPES else None)
elif obj.type in ["IfcWindow","IfcDoor"]:
makeWindow(ifc.Entities[obj.id],shape)
# structs
elif altifc and (obj.type in ["IfcBeam","IfcColumn","IfcSlab"]):
makeStructure(altifc.Entities[obj.id],shape = getShape(obj) if USESHAPES else None)
elif obj.type in ["IfcBeam","IfcColumn","IfcSlab"]:
makeStructure(ifc.Entities[obj.id],shape)
# furniture
elif obj.type == "IfcFurnishingElement":
nobj = FreeCAD.ActiveDocument.addObject("Part::Feature","Furniture")
nobj.Shape = shape
elif USESHAPES:
# treat as Parts
sh = getShape(obj)
elif shape:
# treat as dumb parts
nobj = FreeCAD.ActiveDocument.addObject("Part::Feature",n)
nobj.Shape = sh
nobj.Shape = shape
else:
# treat as meshes
me,pl = getMesh(obj)
@ -135,59 +164,49 @@ def readOpenShell(filename,useParser=False):
if not IfcImport.Next():
break
if altifc:
order(altifc)
IfcImport.CleanUp()
return None
def readInternal(filename):
"processes an ifc file and add its objects to the given document"
t1 = time.time()
ifc = parseFile(filename)
t2 = time.time()
if DEBUG: print "Successfully loaded",ifc,"in %s s" % ((t2-t1))
# getting walls
for w in ifc.getEnt("IFCWALLSTANDARDCASE"):
makeWall(w)
# getting windows and doors
for w in (ifc.getEnt("IFCWINDOW") + ifc.getEnt("IFCDOOR")):
makeWindow(w)
# getting structs
for w in (ifc.getEnt("IFCSLAB") + ifc.getEnt("IFCBEAM") + ifc.getEnt("IFCCOLUMN")):
makeWindow(w)
IfcImport.CleanUp()
else:
# use the internal python parser
# getting walls
for w in ifc.getEnt("IfcWallStandardCase"):
makeWall(w)
# getting windows and doors
for w in (ifc.getEnt("IfcWindow") + ifc.getEnt("IfcDoor")):
makeWindow(w)
# getting structs
for w in (ifc.getEnt("IfcSlab") + ifc.getEnt("IfcBeam") + ifc.getEnt("IfcColumn")):
makeStructure(w)
order(ifc)
FreeCAD.ActiveDocument.recompute()
t3 = time.time()
if DEBUG: print "done processing",ifc,"in %s s" % ((t3-t1))
return None
def order(ifc):
"orders the already generated elements by building and by floor"
# getting floors
for f in ifc.getEnt("IFCBUILDINGSTOREY"):
makeCell(f,"Floor")
for f in ifc.getEnt("IfcBuildingStorey"):
group(f,"Floor")
# getting buildings
for b in ifc.getEnt("IFCBUILDING"):
makeCell(b,"Building")
for b in ifc.getEnt("IfcBuilding"):
group(b,"Building")
# getting sites
for s in ifc.getEnt("IFCSITE"):
makeCell(s,"Site")
for s in ifc.getEnt("IfcSite"):
group(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
def makeCell(entity,mode="Cell"):
"makes a cell in the freecad document"
def group(entity,mode=None):
"gathers the children of the given entity"
try:
if DEBUG: print "=====> making cell",entity.id
if DEBUG: print "=====> making group",entity.id
placement = None
placement = getPlacement(entity.ObjectPlacement)
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]
elts.extend(s)
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:
if e.type == "IFCWALLSTANDARDCASE":
o = FreeCAD.ActiveDocument.getObject("Wall"+str(e.id))
elif e.type == "IFCWINDOW":
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:
fcelts.append(o)
name = mode+str(entity.id)
if mode == "Site":
cell = Arch.makeSite(fcelts,name=name)
elif mode == "Floor":
cell = Arch.makeFloor(fcelts,join=False,name=name)
elif mode == "Building":
cell = Arch.makeBuilding(fcelts,name=name)
for g in groups:
if e.type.upper() == g[1].upper():
o = FreeCAD.ActiveDocument.getObject(g[0] + str(e.id))
if 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:
cell = Arch.makeCell(fcelts,join=False,name=name)
for g in groups:
comps.extend(g[2])
name = mode + str(entity.id)
if mode == "Site":
cell = Arch.makeSite(comps,name=name)
elif mode == "Floor":
cell = Arch.makeFloor(comps,name=name)
elif mode == "Building":
cell = Arch.makeBuilding(comps,name=name)
except:
if DEBUG: print "error: skipping cell",entity.id
if DEBUG: print "error: skipping group ",entity.id
def makeWall(entity,shape=None):
"makes a wall in the freecad document"

View File

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

View File

@ -73,6 +73,7 @@ class Snapper:
self.trackLine = None
self.lastSnappedObject = None
self.active = True
self.trackers = [[],[],[],[]] # view, grid, snap, extline
self.polarAngles = [90,45]
@ -142,12 +143,20 @@ class Snapper:
return None
# setup trackers if needed
if not self.tracker:
self.tracker = DraftTrackers.snapTracker()
if not self.extLine:
self.extLine = DraftTrackers.lineTracker(dotted=True)
if (not self.grid) and Draft.getParam("grid"):
v = Draft.get3DView()
if v in self.trackers[0]:
i = self.trackers[0].index(v)
self.grid = self.trackers[1][i]
self.tracker = self.trackers[2][i]
self.extLine = self.trackers[3][i]
else:
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
if not self.radius:
@ -174,7 +183,7 @@ class Snapper:
point = self.getApparentPoint(screenpos[0],screenpos[1])
# 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
@ -303,8 +312,9 @@ class Snapper:
def getApparentPoint(self,x,y):
"returns a 3D point, projected on the current working plane"
pt = FreeCADGui.ActiveDocument.ActiveView.getPoint(x,y)
dv = FreeCADGui.ActiveDocument.ActiveView.getViewDirection()
view = Draft.get3DView()
pt = view.getPoint(x,y)
dv = view.getViewDirection()
return FreeCAD.DraftWorkingPlane.projectPoint(pt,dv)
def snapToExtensions(self,point,last,constrain,eline):
@ -559,8 +569,9 @@ class Snapper:
def getScreenDist(self,dist,cursor):
"returns a distance in 3D space from a screen pixels distance"
p1 = FreeCADGui.ActiveDocument.ActiveView.getPoint(cursor)
p2 = FreeCADGui.ActiveDocument.ActiveView.getPoint((cursor[0]+dist,cursor[1]))
view = Draft.get3DView()
p1 = view.getPoint(cursor)
p2 = view.getPoint((cursor[0]+dist,cursor[1]))
return (p2.sub(p1)).Length
def getPerpendicular(self,edge,pt):
@ -597,7 +608,7 @@ class Snapper:
for v in self.views:
v.setCursor(cur)
self.cursorMode = mode
def off(self):
"finishes snapping"
if self.tracker:
@ -704,7 +715,7 @@ class Snapper:
self.pt = None
self.ui = FreeCADGui.draftToolBar
self.view = FreeCADGui.ActiveDocument.ActiveView
self.view = Draft.get3DView()
# setting a track line if we got an existing point
if last:

View File

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

View File

@ -60,13 +60,10 @@ class Tracker:
todo.delay(self._removeSwitch, self.switch)
self.switch = None
def get3DView(self):
return FreeCADGui.ActiveDocument.mdiViewsOfType("Gui::View3DInventor")[0]
def _insertSwitch(self, switch):
'''insert self.switch into the scene graph. Must not be called
from an event handler (or other scene graph traversal).'''
sg=self.get3DView().getSceneGraph()
sg=Draft.get3DView().getSceneGraph()
if self.ontop:
sg.insertChild(switch,0)
else:
@ -75,7 +72,7 @@ class Tracker:
def _removeSwitch(self, switch):
'''remove self.switch from the scene graph. As with _insertSwitch,
must not be called during scene graph traversal).'''
sg=self.get3DView().getSceneGraph()
sg=Draft.get3DView().getSceneGraph()
sg.removeChild(switch)
def on(self):
@ -454,8 +451,8 @@ class PlaneTracker(Tracker):
"A working plane tracker"
def __init__(self):
# getting screen distance
p1 = self.get3DView().getPoint((100,100))
p2 = self.get3DView().getPoint((110,100))
p1 = Draft.get3DView().getPoint((100,100))
p2 = Draft.get3DView().getPoint((110,100))
bl = (p2.sub(p1)).Length * (Draft.getParam("snapRange")/2)
self.trans = coin.SoTransform()
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>"
__url__ = ["http://free-cad.sourceforge.net"]
import os,DraftTools
class DraftWorkbench (Workbench):
"the Draft Workbench"
Icon = """
@ -179,9 +177,9 @@ class DraftWorkbench (Workbench):
else:
return
try:
import macros,DraftTools,DraftGui
import os,macros,DraftTools,DraftGui
self.appendMenu(["&Macro",str(DraftTools.translate("draft","Installed Macros"))],macros.macrosList)
Log ('Loading Draft GUI...done\n')
Log ('Loading Draft module...done\n')
except:
pass
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)
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):
"an alternative, more accurate version of Part.__sortEdges__"
@ -479,6 +488,11 @@ def sortEdges(lEdges, aVertex=None):
elif isinstance(result[3].Curve,Part.Circle):
mp = findMidpoint(result[3])
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:
return lEdges
@ -491,15 +505,20 @@ def sortEdges(lEdges, aVertex=None):
olEdges = sortEdges(lEdges, result[3].Vertexes[result[2]])
return olEdges
# 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])
else :
#print "looking ",aVertex.Point
result = lookfor(aVertex,lEdges)
if result[0] != 0 :
del lEdges[result[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]):
#print "keeping"
olEdges += [result[3]] + next
else:
#print "inverting", result[3].Curve
if isinstance(result[3].Curve,Part.Line):
newedge = Part.Line(aVertex.Point,result[3].Vertexes[0].Point).toShape()
olEdges += [newedge] + next
@ -507,12 +526,61 @@ def sortEdges(lEdges, aVertex=None):
mp = findMidpoint(result[3])
newedge = Part.Arc(aVertex.Point,mp,result[3].Vertexes[0].Point).toShape()
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:
olEdges += [result[3]] + next
return olEdges
else :
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):
'''superWire(edges,[closed]): forces a wire between edges that don't necessarily
@ -704,8 +772,8 @@ def getNormal(shape):
n = e1.cross(e2).normalize()
break
if FreeCAD.GuiUp:
import FreeCADGui
vdir = FreeCADGui.ActiveDocument.ActiveView.getViewDirection()
import Draft
vdir = Draft.get3DView().getViewDirection()
if n.getAngle(vdir) < 0.78: n = fcvec.neg(n)
return n

View File

@ -76,11 +76,13 @@ PROPERTY_SOURCE(Drawing::FeatureViewPart, Drawing::FeatureView)
FeatureViewPart::FeatureViewPart(void)
{
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(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(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()
@ -196,7 +198,7 @@ App::DocumentObjectExecReturn *FeatureViewPart::execute(void)
ProjectionAlgos::SvgExtractionType type = ProjectionAlgos::Plain;
if (hidden) type = (ProjectionAlgos::SvgExtractionType)(type|ProjectionAlgos::WithHidden);
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;

View File

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

View File

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

View File

@ -621,7 +621,7 @@ public:
if (geom->getTypeId() == Part::GeomLineSegment::getClassTypeId()) {
const Part::GeomLineSegment *lineSeg = dynamic_cast<const Part::GeomLineSegment *>(geom);
EditCurve[0] = Base::Vector2D(lineSeg->getEndPoint().x, lineSeg->getEndPoint().y);
}
}
else
EditCurve[0] = onSketchPos;
@ -1365,7 +1365,7 @@ CmdSketcherCreateFillet::CmdSketcherCreateFillet()
sAppModule = "Sketcher";
sGroup = QT_TR_NOOP("Sketcher");
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;
sStatusTip = sToolTipText;
sPixmap = "Sketcher_CreateFillet";

View File

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