From eb0b8fbd32de8a905687847c2a9ca44020d8eaab Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Mon, 16 Apr 2012 19:54:30 -0300 Subject: [PATCH 01/18] Fixed bug #671 - Draft DrawingViews --- src/Mod/Draft/Draft.py | 14 ++++++++++++-- src/Mod/Draft/DraftSnap.py | 14 ++++++++------ src/Mod/Draft/DraftTools.py | 23 ++++++++++------------- src/Mod/Draft/DraftTrackers.py | 11 ++++------- src/Mod/Draft/draftlibs/fcgeo.py | 4 ++-- 5 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 772bcbf98..5d94b1f64 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -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)) == "": + 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""" @@ -1794,12 +1804,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) diff --git a/src/Mod/Draft/DraftSnap.py b/src/Mod/Draft/DraftSnap.py index 8285a1a99..8aee49b09 100644 --- a/src/Mod/Draft/DraftSnap.py +++ b/src/Mod/Draft/DraftSnap.py @@ -174,7 +174,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 +303,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 +560,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): @@ -704,7 +706,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: diff --git a/src/Mod/Draft/DraftTools.py b/src/Mod/Draft/DraftTools.py index 2ae012894..7b7c100a2 100644 --- a/src/Mod/Draft/DraftTools.py +++ b/src/Mod/Draft/DraftTools.py @@ -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 diff --git a/src/Mod/Draft/DraftTrackers.py b/src/Mod/Draft/DraftTrackers.py index 34c4acfdd..3cc6519d1 100644 --- a/src/Mod/Draft/DraftTrackers.py +++ b/src/Mod/Draft/DraftTrackers.py @@ -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]) diff --git a/src/Mod/Draft/draftlibs/fcgeo.py b/src/Mod/Draft/draftlibs/fcgeo.py index ee38aa8ee..8b55e4fc9 100755 --- a/src/Mod/Draft/draftlibs/fcgeo.py +++ b/src/Mod/Draft/draftlibs/fcgeo.py @@ -704,8 +704,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 From c01e948139bc808ce9ff707e1793d00959400fda Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Tue, 17 Apr 2012 18:55:14 -0300 Subject: [PATCH 02/18] Fixed bug 670 - Draft grid doesn't work in more than one viewport --- src/Mod/Draft/DraftSnap.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Mod/Draft/DraftSnap.py b/src/Mod/Draft/DraftSnap.py index 8aee49b09..caeeb5bed 100644 --- a/src/Mod/Draft/DraftSnap.py +++ b/src/Mod/Draft/DraftSnap.py @@ -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: @@ -599,7 +608,7 @@ class Snapper: for v in self.views: v.setCursor(cur) self.cursorMode = mode - + def off(self): "finishes snapping" if self.tracker: From 2a76595863e9ed8619f3acc112cc078c09b035c0 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Tue, 17 Apr 2012 20:47:10 -0300 Subject: [PATCH 03/18] Fixed bug in Draft dimensions --- src/Mod/Draft/Draft.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 5d94b1f64..be96ac60a 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -1804,12 +1804,12 @@ class _ViewProviderDimension: if not proj: norm = Vector(0,0,1) else: norm = fcvec.neg(p3.sub(p2).cross(proj)) norm.normalize() - va = get3DView.getViewDirection() + va = get3DView().getViewDirection() if va.getAngle(norm) < math.pi/2: norm = fcvec.neg(norm) u = p3.sub(p2) u.normalize() - c = get3DView.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) From 25c81962f86603fb4fc7dfd735426115ecd73feb Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Mon, 12 Mar 2012 22:42:38 -0300 Subject: [PATCH 04/18] Added LineWidth property to Part DrawingViews Views of Part objects, when added to a DrawingPage, now have an adjustable LineWidth property, set to 0.35 by default. --- src/Mod/Drawing/App/FeatureViewPart.cpp | 4 +++- src/Mod/Drawing/App/FeatureViewPart.h | 1 + src/Mod/Drawing/App/ProjectionAlgos.cpp | 20 +++++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/Mod/Drawing/App/FeatureViewPart.cpp b/src/Mod/Drawing/App/FeatureViewPart.cpp index 3d09db914..f4f755338 100644 --- a/src/Mod/Drawing/App/FeatureViewPart.cpp +++ b/src/Mod/Drawing/App/FeatureViewPart.cpp @@ -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 << "" << endl; diff --git a/src/Mod/Drawing/App/FeatureViewPart.h b/src/Mod/Drawing/App/FeatureViewPart.h index 466cad207..68ad3551f 100644 --- a/src/Mod/Drawing/App/FeatureViewPart.h +++ b/src/Mod/Drawing/App/FeatureViewPart.h @@ -52,6 +52,7 @@ public: App::PropertyVector Direction; App::PropertyBool ShowHiddenLines; App::PropertyBool ShowSmoothLines; + App::PropertyFloat LineWidth; /** @name methods overide Feature */ diff --git a/src/Mod/Drawing/App/ProjectionAlgos.cpp b/src/Mod/Drawing/App/ProjectionAlgos.cpp index cb82c3e8e..77a2191f0 100644 --- a/src/Mod/Drawing/App/ProjectionAlgos.cpp +++ b/src/Mod/Drawing/App/ProjectionAlgos.cpp @@ -153,8 +153,10 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale) { std::stringstream result; SVGOutput output; + float hfactor = 0.15f / 0.35f; + if (!H.IsNull() && (type & WithHidden)) { - float width = 0.15f/scale; + float width = hfactor * scale; BRepMesh::Mesh(H,0.1); result << "" << endl << output.exportEdges(H) << "" << endl; } if (!HO.IsNull() && (type & WithHidden)) { - float width = 0.15f/scale; + float width = hfactor * scale; BRepMesh::Mesh(HO,0.1); result << "" << endl << output.exportEdges(HO) << "" << endl; } if (!VO.IsNull()) { - float width = 0.35f/scale; + float width = scale; BRepMesh::Mesh(VO,0.1); result << "" << endl; } if (!V.IsNull()) { - float width = 0.35f/scale; + float width = scale; BRepMesh::Mesh(V,0.1); result << "" << endl; } if (!V1.IsNull() && (type & WithSmooth)) { - float width = 0.35f/scale; + float width = scale; BRepMesh::Mesh(V1,0.1); result << "" << endl; } if (!H1.IsNull() && (type & WithSmooth) && (type & WithHidden)) { - float width = 0.15f/scale; + float width = hfactor * scale; BRepMesh::Mesh(H1,0.1); result << "" << endl << output.exportEdges(H1) From 8a70eca7280a00dbc12e61281056a7d671a46fb7 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Tue, 17 Apr 2012 20:28:59 -0300 Subject: [PATCH 05/18] Modified Draft DrawingView object to match new Drawing module linewidth style --- src/Mod/Draft/Draft.py | 68 ++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index be96ac60a..853385fc8 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -1182,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): @@ -1269,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 + '"' @@ -1284,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 + '"' @@ -1329,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 += '\n' + #svg +='scale('+str(tmod/2000)+','+str(-tmod/2000)+')' + svg += 'scale(1,-1) ' + svg += '">\n' for l in obj.LabelText: svg += ''+l+'\n' svg += '\n' @@ -1388,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 @@ -1432,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 = [] @@ -2521,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): @@ -2541,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 += ' Date: Wed, 18 Apr 2012 10:02:15 -0300 Subject: [PATCH 06/18] Set Drawing hidden linewidth to half the normal linewidth --- src/Mod/Drawing/App/ProjectionAlgos.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mod/Drawing/App/ProjectionAlgos.cpp b/src/Mod/Drawing/App/ProjectionAlgos.cpp index 77a2191f0..a5f844619 100644 --- a/src/Mod/Drawing/App/ProjectionAlgos.cpp +++ b/src/Mod/Drawing/App/ProjectionAlgos.cpp @@ -153,7 +153,7 @@ std::string ProjectionAlgos::getSVG(SvgExtractionType type, float scale) { std::stringstream result; SVGOutput output; - float hfactor = 0.15f / 0.35f; + float hfactor = 0.5f; // hidden line size factor, was 0.15f / 0.35f; if (!H.IsNull() && (type & WithHidden)) { float width = hfactor * scale; From d89c170e9ff4a120015db53f1f730955e2ea960a Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 18 Apr 2012 15:46:50 -0300 Subject: [PATCH 07/18] Changed Group property of App::DocumentObjectGroup to writeable So in App::DocumentObjectGroupPython instance there is an easy way to manipulate group contents. --- src/App/DocumentObjectGroup.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App/DocumentObjectGroup.cpp b/src/App/DocumentObjectGroup.cpp index ceb0fca72..53b3eb1dd 100644 --- a/src/App/DocumentObjectGroup.cpp +++ b/src/App/DocumentObjectGroup.cpp @@ -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() From 41523af62c1753d9dd4a2915698d44610bb273e6 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 18 Apr 2012 16:59:26 -0300 Subject: [PATCH 08/18] Added ViewProviderDocumentObjectGroupPython --- src/App/DocumentObjectGroup.cpp | 2 +- src/Gui/Application.cpp | 1 + src/Gui/ViewProviderDocumentObjectGroup.cpp | 12 ++++++++++++ src/Gui/ViewProviderDocumentObjectGroup.h | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/App/DocumentObjectGroup.cpp b/src/App/DocumentObjectGroup.cpp index 53b3eb1dd..3ab0151ea 100644 --- a/src/App/DocumentObjectGroup.cpp +++ b/src/App/DocumentObjectGroup.cpp @@ -185,7 +185,7 @@ 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 diff --git a/src/Gui/Application.cpp b/src/Gui/Application.cpp index 2ce260bc3..d62c36b4e 100644 --- a/src/Gui/Application.cpp +++ b/src/Gui/Application.cpp @@ -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(); diff --git a/src/Gui/ViewProviderDocumentObjectGroup.cpp b/src/Gui/ViewProviderDocumentObjectGroup.cpp index 14927fbc2..13b2be0f0 100644 --- a/src/Gui/ViewProviderDocumentObjectGroup.cpp +++ b/src/Gui/ViewProviderDocumentObjectGroup.cpp @@ -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; +} diff --git a/src/Gui/ViewProviderDocumentObjectGroup.h b/src/Gui/ViewProviderDocumentObjectGroup.h index 7157898e7..aab975750 100644 --- a/src/Gui/ViewProviderDocumentObjectGroup.h +++ b/src/Gui/ViewProviderDocumentObjectGroup.h @@ -26,6 +26,7 @@ #include "ViewProviderDocumentObject.h" +#include "ViewProviderPythonFeature.h" namespace Gui { @@ -63,6 +64,7 @@ private: std::vector nodes; }; +typedef ViewProviderPythonFeatureT ViewProviderDocumentObjectGroupPython; } // namespace Gui From 05823711acb396361839bb57d201f2d0f05dc021 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 18 Apr 2012 18:03:33 -0300 Subject: [PATCH 09/18] Arch groups now use DocumentObjectGroupPython --- src/Mod/Arch/ArchBuilding.py | 31 +++++++++++++++++++++---------- src/Mod/Arch/ArchCommands.py | 8 +++++++- src/Mod/Arch/ArchFloor.py | 31 +++++++++++++++++++++---------- src/Mod/Arch/ArchSite.py | 22 ++++++++++++++-------- 4 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/Mod/Arch/ArchBuilding.py b/src/Mod/Arch/ArchBuilding.py index 96f1bc067..6a2cb2c33 100644 --- a/src/Mod/Arch/ArchBuilding.py +++ b/src/Mod/Arch/ArchBuilding.py @@ -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()) diff --git a/src/Mod/Arch/ArchCommands.py b/src/Mod/Arch/ArchCommands.py index b25d0c68f..5c9a75713 100644 --- a/src/Mod/Arch/ArchCommands.py +++ b/src/Mod/Arch/ArchCommands.py @@ -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: diff --git a/src/Mod/Arch/ArchFloor.py b/src/Mod/Arch/ArchFloor.py index 4e17d1660..f5b9d435e 100644 --- a/src/Mod/Arch/ArchFloor.py +++ b/src/Mod/Arch/ArchFloor.py @@ -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()) diff --git a/src/Mod/Arch/ArchSite.py b/src/Mod/Arch/ArchSite.py index eb3f5a1fd..5da538e5a 100644 --- a/src/Mod/Arch/ArchSite.py +++ b/src/Mod/Arch/ArchSite.py @@ -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()) From b0840ef34929d9a5d1f63fbc1f94fe27d771035d Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 18 Apr 2012 19:48:20 -0300 Subject: [PATCH 10/18] Big cleanup of IFC importer --- src/Mod/Arch/Arch_rc.py | 584 ++++++++++++++++---- src/Mod/Arch/Resources/ui/archprefs-base.ui | 40 +- src/Mod/Arch/importIFC.py | 226 ++++---- 3 files changed, 624 insertions(+), 226 deletions(-) diff --git a/src/Mod/Arch/Arch_rc.py b/src/Mod/Arch/Arch_rc.py index f56440b2c..cfb5796f4 100644 --- a/src/Mod/Arch/Arch_rc.py +++ b/src/Mod/Arch/Arch_rc.py @@ -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(): diff --git a/src/Mod/Arch/Resources/ui/archprefs-base.ui b/src/Mod/Arch/Resources/ui/archprefs-base.ui index 88b1ba306..ec9b787c0 100644 --- a/src/Mod/Arch/Resources/ui/archprefs-base.ui +++ b/src/Mod/Arch/Resources/ui/archprefs-base.ui @@ -165,20 +165,17 @@ - + - + - if this is checked, the internal Arch IFC parser will be use to build Arch objects from known IFC types. + If this is checked, the IFCOpenShell importer will be used, allowing to import more IFC types - use internal IFC parser - - - true + Use IFCOpenShell if available - useIfcParser + useIfcOpenShell Mod/Arch @@ -188,17 +185,34 @@ - + - + - If this is checked, the IFCOpenShell importer will be used for objects not handled by the internal parser + Creates groups for each Arch object type - Use IFCOpenShell + Group components by types - useIfcOpenShell + createIfcGroups + + + Mod/Arch + + + + + + + + + + + Import furniture (can make the model heavy) + + + importIfcFurniture Mod/Arch diff --git a/src/Mod/Arch/importIFC.py b/src/Mod/Arch/importIFC.py index 56d379413..87dd09796 100644 --- a/src/Mod/Arch/importIFC.py +++ b/src/Mod/Arch/importIFC.py @@ -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" From 06c683dcf308c2f342419442d96943d9703f99ee Mon Sep 17 00:00:00 2001 From: jriegel Date: Thu, 19 Apr 2012 08:25:26 +0200 Subject: [PATCH 11/18] remove unnecessary template code from document group and small fix in installer --- src/App/Application.cpp | 1 - src/App/DocumentObjectGroup.cpp | 12 ------------ src/App/DocumentObjectGroup.h | 4 +--- src/WindowsInstaller/LibPack.wxs | 1 - 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/src/App/Application.cpp b/src/App/Application.cpp index a622eecf2..21ce1f2e6 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -1022,7 +1022,6 @@ void Application::initTypes(void) App ::GeometryPython ::init(); App ::Document ::init(); App ::DocumentObjectGroup ::init(); - App ::DocumentObjectGroupPython ::init(); App ::DocumentObjectFileIncluded::init(); App ::InventorObject ::init(); App ::VRMLObject ::init(); diff --git a/src/App/DocumentObjectGroup.cpp b/src/App/DocumentObjectGroup.cpp index ceb0fca72..78899c53e 100644 --- a/src/App/DocumentObjectGroup.cpp +++ b/src/App/DocumentObjectGroup.cpp @@ -179,16 +179,4 @@ PyObject *DocumentObjectGroup::getPyObject() return Py::new_reference_to(PythonObject); } -// Python Sketcher feature --------------------------------------------------------- -namespace App { -/// @cond DOXERR -PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup) -template<> const char* App::DocumentObjectGroupPython::getViewProviderName(void) const { - return "Gui::ViewProviderDocumentObjectGroup"; -} -/// @endcond - -// explicit template instantiation -template class AppExport FeaturePythonT; -} diff --git a/src/App/DocumentObjectGroup.h b/src/App/DocumentObjectGroup.h index a7a4537df..3afb50c9c 100644 --- a/src/App/DocumentObjectGroup.h +++ b/src/App/DocumentObjectGroup.h @@ -24,7 +24,7 @@ #ifndef APP_DOCUMENTOBJECTGROUP_H #define APP_DOCUMENTOBJECTGROUP_H -#include "FeaturePython.h" +//#include "FeaturePython.h" #include "DocumentObject.h" #include "PropertyLinks.h" #include @@ -99,8 +99,6 @@ private: void removeObjectFromDocument(DocumentObject*); }; -typedef App::FeaturePythonT DocumentObjectGroupPython; - } //namespace App diff --git a/src/WindowsInstaller/LibPack.wxs b/src/WindowsInstaller/LibPack.wxs index 37b4da8ce..612146892 100644 --- a/src/WindowsInstaller/LibPack.wxs +++ b/src/WindowsInstaller/LibPack.wxs @@ -99,7 +99,6 @@ - From d12fbc632ade36a052ad8cd268b17515b880f6df Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Thu, 19 Apr 2012 20:00:18 -0300 Subject: [PATCH 12/18] Arch Vector renderer now supports face colors --- src/Mod/Arch/ArchSectionPlane.py | 45 ++++++++++++------- src/Mod/Arch/ArchVRM.py | 76 +++++++++++++++++++++++++++----- 2 files changed, 92 insertions(+), 29 deletions(-) diff --git a/src/Mod/Arch/ArchSectionPlane.py b/src/Mod/Arch/ArchSectionPlane.py index 50cc067bf..4282d97f6 100644 --- a/src/Mod/Arch/ArchSectionPlane.py +++ b/src/Mod/Arch/ArchSectionPlane.py @@ -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,14 +181,18 @@ class _ArchDrawingView: if obj.Source.Objects: svg = '' cp = ArchCommands.getCutVolume(obj.Source.Objects,obj.Source.Placement) - print "cp:",cp 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)) @@ -194,13 +200,14 @@ class _ArchDrawingView: 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 + svg += self.renderOCC(shapes,obj.Source.Proxy.getNormal(obj.Source),linewidth) for s in sections: - svg += self.renderSection(s,obj.Source.Placement) + svg += self.renderSection(s,obj.Source.Placement,linewidth*2) result = '' result += ' Date: Thu, 19 Apr 2012 20:24:45 -0300 Subject: [PATCH 13/18] Remove unnecessary module loading at Draft init --- src/Mod/Draft/InitGui.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Mod/Draft/InitGui.py b/src/Mod/Draft/InitGui.py index 7ec5028ed..9ae60310d 100644 --- a/src/Mod/Draft/InitGui.py +++ b/src/Mod/Draft/InitGui.py @@ -24,8 +24,6 @@ __title__="FreeCAD Draft Workbench - Init file" __author__ = "Yorik van Havre " __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", From 173af46744ed45c77f870f06f21555244df48fa3 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Fri, 20 Apr 2012 13:07:42 -0300 Subject: [PATCH 14/18] Bugfixes in Arch Section plane --- src/Mod/Arch/ArchSectionPlane.py | 9 ++++--- src/Mod/Arch/ArchVRM.py | 3 +-- src/Mod/Draft/draftlibs/fcgeo.py | 43 ++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/Mod/Arch/ArchSectionPlane.py b/src/Mod/Arch/ArchSectionPlane.py index 4282d97f6..b50f0f5b4 100644 --- a/src/Mod/Arch/ArchSectionPlane.py +++ b/src/Mod/Arch/ArchSectionPlane.py @@ -195,9 +195,10 @@ class _ArchDrawingView: 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.Face(fcgeo.sortEdges(w)) + sections.append(sec) else: shapes.append(o.Shape) colors.append(color) @@ -237,7 +238,7 @@ class _ArchDrawingView: def renderVRM(self,shapes,placement,colors,linewidth): "renders an SVG fragment with the ArchVRM method" import ArchVRM - render = ArchVRM.Renderer(debug=False) + render = ArchVRM.Renderer() render.setWorkingPlane(FreeCAD.Placement(placement)) for i in range(len(shapes)): if colors: diff --git a/src/Mod/Arch/ArchVRM.py b/src/Mod/Arch/ArchVRM.py index d910c7cae..c062d912e 100644 --- a/src/Mod/Arch/ArchVRM.py +++ b/src/Mod/Arch/ArchVRM.py @@ -31,7 +31,7 @@ MAXLOOP = 10 # the max number of loop before abort class Renderer: "A renderer object" - def __init__(self,wp=None,debug=None): + def __init__(self,wp=None): """ Creates a renderer with a default Draft WorkingPlane @@ -44,7 +44,6 @@ class Renderer: p.buildDummy() """ - if debug != None: DEBUG = debug self.defaultFill = (0.9,0.9,0.9,1.0) # the default fill color self.wp = wp self.faces = [] diff --git a/src/Mod/Draft/draftlibs/fcgeo.py b/src/Mod/Draft/draftlibs/fcgeo.py index 8b55e4fc9..d0543ee49 100755 --- a/src/Mod/Draft/draftlibs/fcgeo.py +++ b/src/Mod/Draft/draftlibs/fcgeo.py @@ -513,6 +513,49 @@ def sortEdges(lEdges, aVertex=None): 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 From e871a10c9eff9dc7d655dd7061ae5379aa175039 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 21 Apr 2012 12:30:31 +0200 Subject: [PATCH 15/18] 0000676: Typographical error --- src/Mod/Sketcher/Gui/CommandCreateGeo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp index 89685e99a..02e508e76 100644 --- a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp +++ b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp @@ -621,7 +621,7 @@ public: if (geom->getTypeId() == Part::GeomLineSegment::getClassTypeId()) { const Part::GeomLineSegment *lineSeg = dynamic_cast(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"; From 7c03a49dfe1968cdd5777486790958cf52f830df Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sat, 21 Apr 2012 17:06:27 -0300 Subject: [PATCH 16/18] Fixed a bug in Draft fcgeo.sortEdges --- src/Mod/Draft/draftlibs/fcgeo.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/Mod/Draft/draftlibs/fcgeo.py b/src/Mod/Draft/draftlibs/fcgeo.py index d0543ee49..783417663 100755 --- a/src/Mod/Draft/draftlibs/fcgeo.py +++ b/src/Mod/Draft/draftlibs/fcgeo.py @@ -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,6 +526,12 @@ 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 From 19b428f36ecbff212098bc094c6e1ee91471aa7e Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sun, 22 Apr 2012 17:37:00 -0300 Subject: [PATCH 17/18] Revert 'remove unnecessary template code from document group' Reverts commit 06c683dcf308c2f342419442d96943d9703f99ee, because used by the Arch module --- src/App/Application.cpp | 1 + src/App/DocumentObjectGroup.cpp | 12 ++++++++++++ src/App/DocumentObjectGroup.h | 4 +++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/App/Application.cpp b/src/App/Application.cpp index 21ce1f2e6..a622eecf2 100644 --- a/src/App/Application.cpp +++ b/src/App/Application.cpp @@ -1022,6 +1022,7 @@ void Application::initTypes(void) App ::GeometryPython ::init(); App ::Document ::init(); App ::DocumentObjectGroup ::init(); + App ::DocumentObjectGroupPython ::init(); App ::DocumentObjectFileIncluded::init(); App ::InventorObject ::init(); App ::VRMLObject ::init(); diff --git a/src/App/DocumentObjectGroup.cpp b/src/App/DocumentObjectGroup.cpp index d871f3a4e..1c16e0e51 100644 --- a/src/App/DocumentObjectGroup.cpp +++ b/src/App/DocumentObjectGroup.cpp @@ -179,4 +179,16 @@ PyObject *DocumentObjectGroup::getPyObject() return Py::new_reference_to(PythonObject); } +// Python feature --------------------------------------------------------- +namespace App { +/// @cond DOXERR +PROPERTY_SOURCE_TEMPLATE(App::DocumentObjectGroupPython, App::DocumentObjectGroup) +template<> const char* App::DocumentObjectGroupPython::getViewProviderName(void) const { + return "Gui::ViewProviderDocumentObjectGroupPython"; +} +/// @endcond + +// explicit template instantiation +template class AppExport FeaturePythonT; +} diff --git a/src/App/DocumentObjectGroup.h b/src/App/DocumentObjectGroup.h index 3afb50c9c..a7a4537df 100644 --- a/src/App/DocumentObjectGroup.h +++ b/src/App/DocumentObjectGroup.h @@ -24,7 +24,7 @@ #ifndef APP_DOCUMENTOBJECTGROUP_H #define APP_DOCUMENTOBJECTGROUP_H -//#include "FeaturePython.h" +#include "FeaturePython.h" #include "DocumentObject.h" #include "PropertyLinks.h" #include @@ -99,6 +99,8 @@ private: void removeObjectFromDocument(DocumentObject*); }; +typedef App::FeaturePythonT DocumentObjectGroupPython; + } //namespace App From eb17950d852ec289cad69b70f6aac28d855a9eaa Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Sun, 22 Apr 2012 18:11:17 -0300 Subject: [PATCH 18/18] Fixed bug in Arch section plane --- src/Mod/Arch/ArchSectionPlane.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Mod/Arch/ArchSectionPlane.py b/src/Mod/Arch/ArchSectionPlane.py index b50f0f5b4..04a8fb1d3 100644 --- a/src/Mod/Arch/ArchSectionPlane.py +++ b/src/Mod/Arch/ArchSectionPlane.py @@ -181,7 +181,7 @@ class _ArchDrawingView: if obj.Source.Objects: svg = '' cp = ArchCommands.getCutVolume(obj.Source.Objects,obj.Source.Placement) - sections = [] + self.sections = [] if cp: cutvolume = cp[0].extrude(cp[1]) shapes = [] @@ -197,8 +197,9 @@ class _ArchDrawingView: if sec.Edges: wires = fcgeo.findWires(sec.Edges) for w in wires: - sec = Part.Face(fcgeo.sortEdges(w)) - sections.append(sec) + sec = Part.Wire(fcgeo.sortEdges(w.Edges)) + sec = Part.Face(sec) + self.sections.append(sec) else: shapes.append(o.Shape) colors.append(color) @@ -207,7 +208,7 @@ class _ArchDrawingView: svg += self.renderVRM(shapes,obj.Source.Placement,colors,linewidth) else: svg += self.renderOCC(shapes,obj.Source.Proxy.getNormal(obj.Source),linewidth) - for s in sections: + for s in self.sections: svg += self.renderSection(s,obj.Source.Placement,linewidth*2) result = '' result += '