From c12d2dd48c6c8ec94ce31af05a56c054fac6bc1d Mon Sep 17 00:00:00 2001 From: Alexander Pravdin Date: Thu, 8 Mar 2018 10:29:10 +0300 Subject: [PATCH] Draft: dimension and extension lines overshoots --- src/Mod/Draft/Draft.py | 133 ++++++++++++++++-- .../Resources/ui/preferences-drafttexts.ui | 72 ++++++++++ 2 files changed, 196 insertions(+), 9 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index ce92eb43e4..4ec3b98447 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -101,7 +101,8 @@ def getParamType(param): elif param in ["constructiongroupname","textfont","patternFile","template", "snapModes","FontFile","ClonePrefix","labeltype"]: return "string" - elif param in ["textheight","tolerance","gridSpacing","arrowsize","extlines","dimspacing"]: + elif param in ["textheight","tolerance","gridSpacing","arrowsize","extlines","dimspacing", + "dimovershoot","extovershoot"]: return "float" elif param in ["selectBaseObjects","alwaysSnap","grid","fillmode","saveonexit","maxSnap", "SvgLinesBlack","dxfStdSize","showSnapBar","hideSnapBar","alwaysShowGrid", @@ -304,18 +305,25 @@ def dimSymbol(symbol=None,invert=False): marker.addChild(f) return marker elif symbol == 4: - marker = coin.SoSeparator() - v = coin.SoVertexProperty() - v.vertex.set1Value(0, -1.5,-1.5,0) - v.vertex.set1Value(1, 1.5,1.5,0) - l = coin.SoLineSet() - l.vertexProperty = v - marker.addChild(l) - return marker + return dimDash((-1.5,-1.5,0),(1.5,1.5,0)) else: print("Draft.dimsymbol: Not implemented") return coin.SoSphere() +def dimDash(p1, p2): + '''dimDash(p1, p2): returns pivy SoSeparator. + Used for making Tick-2, DimOvershoot, ExtOvershoot dashes. + ''' + from pivy import coin + dash = coin.SoSeparator() + v = coin.SoVertexProperty() + v.vertex.set1Value(0, p1) + v.vertex.set1Value(1, p2) + l = coin.SoLineSet() + l.vertexProperty = v + dash.addChild(l) + return dash + def shapify(obj): '''shapify(object): transforms a parametric shape object into non-parametric and returns the new object''' @@ -2169,6 +2177,18 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct print("getSVG: arrow type not implemented") return svg + def getOvershoot(point,shootsize,color,linewidth,angle=0): + svg = '\n' + return svg + def getText(color,fontsize,fontname,angle,base,text,linespacing=0.5,align="center",flip=True): if not isinstance(text,list): text = text.split("\n") @@ -2309,6 +2329,17 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct svg += 'freecad:dimpoint="'+str(p2.x)+' '+str(p2.y)+'"' svg += '/>\n' + # drawing dimension and extension lines overshoots + if hasattr(obj.ViewObject,"DimOvershoot") and obj.ViewObject.DimOvershoot.Value: + shootsize = obj.ViewObject.DimOvershoot.Value/pointratio + svg += getOvershoot(p2,shootsize,stroke,linewidth,angle) + svg += getOvershoot(p3,shootsize,stroke,linewidth,angle+math.pi) + if hasattr(obj.ViewObject,"ExtOvershoot") and obj.ViewObject.ExtOvershoot.Value: + shootsize = obj.ViewObject.ExtOvershoot.Value/pointratio + shootangle = -DraftVecUtils.angle(p1.sub(p2)) + svg += getOvershoot(p2,shootsize,stroke,linewidth,shootangle) + svg += getOvershoot(p3,shootsize,stroke,linewidth,shootangle) + # drawing arrows if hasattr(obj.ViewObject,"ArrowType"): arrowsize = obj.ViewObject.ArrowSize.Value/pointratio @@ -3970,6 +4001,8 @@ class _ViewProviderDimension(_ViewProviderDraft): obj.addProperty("App::PropertyFloat","LineWidth","Draft",QT_TRANSLATE_NOOP("App::Property","Line width")) obj.addProperty("App::PropertyColor","LineColor","Draft",QT_TRANSLATE_NOOP("App::Property","Line color")) obj.addProperty("App::PropertyDistance","ExtLines","Draft",QT_TRANSLATE_NOOP("App::Property","Length of the extension lines")) + obj.addProperty("App::PropertyDistance","DimOvershoot","Draft",QT_TRANSLATE_NOOP("App::Property","The distance the dimension line is extended past the extension lines")) + obj.addProperty("App::PropertyDistance","ExtOvershoot","Draft",QT_TRANSLATE_NOOP("App::Property","Length of the extension line above the dimension line")) obj.addProperty("App::PropertyBool","FlipArrows","Draft",QT_TRANSLATE_NOOP("App::Property","Rotate the dimension arrows 180 degrees")) obj.addProperty("App::PropertyBool","FlipText","Draft",QT_TRANSLATE_NOOP("App::Property","Rotate the dimension text 180 degrees")) obj.addProperty("App::PropertyBool","ShowUnit","Draft",QT_TRANSLATE_NOOP("App::Property","Show the unit suffix")) @@ -3983,6 +4016,8 @@ class _ViewProviderDimension(_ViewProviderDraft): obj.ArrowType = arrowtypes obj.ArrowType = arrowtypes[getParam("dimsymbol",0)] obj.ExtLines = getParam("extlines",0.3) + obj.DimOvershoot = getParam("dimovershoot",0) + obj.ExtOvershoot = getParam("extovershoot",0) obj.Decimals = getParam("dimPrecision",2) obj.ShowUnit = getParam("showUnit",True) _ViewProviderDraft.__init__(self,obj) @@ -4014,7 +4049,13 @@ class _ViewProviderDimension(_ViewProviderDraft): self.trans1 = coin.SoTransform() self.coord2 = coin.SoCoordinate3() self.trans2 = coin.SoTransform() + self.transDimOvershoot1 = coin.SoTransform() + self.transDimOvershoot2 = coin.SoTransform() + self.transExtOvershoot1 = coin.SoTransform() + self.transExtOvershoot2 = coin.SoTransform() self.marks = coin.SoSeparator() + self.marksDimOvershoot = coin.SoSeparator() + self.marksExtOvershoot = coin.SoSeparator() self.drawstyle = coin.SoDrawStyle() self.line = coin.SoType.fromName("SoBrepEdgeSet").createInstance() self.coords = coin.SoCoordinate3() @@ -4024,6 +4065,8 @@ class _ViewProviderDimension(_ViewProviderDraft): self.node.addChild(self.coords) self.node.addChild(self.line) self.node.addChild(self.marks) + self.node.addChild(self.marksDimOvershoot) + self.node.addChild(self.marksExtOvershoot) self.node.addChild(label) self.node3d = coin.SoGroup() self.node3d.addChild(self.color) @@ -4031,6 +4074,8 @@ class _ViewProviderDimension(_ViewProviderDraft): self.node3d.addChild(self.coords) self.node3d.addChild(self.line) self.node3d.addChild(self.marks) + self.node3d.addChild(self.marksDimOvershoot) + self.node3d.addChild(self.marksExtOvershoot) self.node3d.addChild(label3d) vobj.addDisplayMode(self.node,"2D") vobj.addDisplayMode(self.node3d,"3D") @@ -4039,6 +4084,8 @@ class _ViewProviderDimension(_ViewProviderDraft): self.onChanged(vobj,"FontName") self.onChanged(vobj,"ArrowType") self.onChanged(vobj,"LineColor") + self.onChanged(vobj,"DimOvershoot") + self.onChanged(vobj,"ExtOvershoot") def updateData(self, obj, prop): "called when the base object is changed" @@ -4107,6 +4154,12 @@ class _ViewProviderDimension(_ViewProviderDraft): self.trans2.translation.setValue((self.p3.x,self.p3.y,self.p3.z)) self.coord2.point.setValue((self.p3.x,self.p3.y,self.p3.z)) + # calculate dimension and extension lines overshoots positions + self.transDimOvershoot1.translation.setValue((self.p2.x,self.p2.y,self.p2.z)) + self.transDimOvershoot2.translation.setValue((self.p3.x,self.p3.y,self.p3.z)) + self.transExtOvershoot1.translation.setValue((self.p2.x,self.p2.y,self.p2.z)) + self.transExtOvershoot2.translation.setValue((self.p3.x,self.p3.y,self.p3.z)) + # calculate the text position and orientation if hasattr(obj,"Normal"): if DraftVecUtils.isNull(obj.Normal): @@ -4127,6 +4180,8 @@ class _ViewProviderDimension(_ViewProviderDraft): u.normalize() v1 = norm.cross(u) rot1 = FreeCAD.Placement(DraftVecUtils.getPlaneRotation(u,v1,norm)).Rotation.Q + self.transDimOvershoot1.rotation.setValue((rot1[0],rot1[1],rot1[2],rot1[3])) + self.transDimOvershoot2.rotation.setValue((rot1[0],rot1[1],rot1[2],rot1[3])) if hasattr(obj.ViewObject,"FlipArrows"): if obj.ViewObject.FlipArrows: u = u.negative() @@ -4134,6 +4189,12 @@ class _ViewProviderDimension(_ViewProviderDraft): rot2 = FreeCAD.Placement(DraftVecUtils.getPlaneRotation(u,v2,norm)).Rotation.Q self.trans1.rotation.setValue((rot2[0],rot2[1],rot2[2],rot2[3])) self.trans2.rotation.setValue((rot2[0],rot2[1],rot2[2],rot2[3])) + u3 = self.p1.sub(self.p2) + u3.normalize() + v3 = norm.cross(u3) + rot3 = FreeCAD.Placement(DraftVecUtils.getPlaneRotation(u3,v3,norm)).Rotation.Q + self.transExtOvershoot1.rotation.setValue((rot3[0],rot3[1],rot3[2],rot3[3])) + self.transExtOvershoot2.rotation.setValue((rot3[0],rot3[1],rot3[2],rot3[3])) if hasattr(obj.ViewObject,"TextSpacing"): offset = DraftVecUtils.scaleTo(v1,obj.ViewObject.TextSpacing.Value) else: @@ -4267,6 +4328,60 @@ class _ViewProviderDimension(_ViewProviderDraft): self.node.insertChild(self.marks,2) self.node3d.insertChild(self.marks,2) vobj.Object.touch() + elif (prop == "DimOvershoot") and hasattr(vobj,"DimOvershoot"): + from pivy import coin + + # set scale + s = vobj.DimOvershoot.Value + self.transDimOvershoot1.scaleFactor.setValue((s,s,s)) + self.transDimOvershoot2.scaleFactor.setValue((s,s,s)) + + # remove existing nodes + self.node.removeChild(self.marksDimOvershoot) + self.node3d.removeChild(self.marksDimOvershoot) + + # set new nodes + self.marksDimOvershoot = coin.SoSeparator() + if vobj.DimOvershoot.Value: + self.marksDimOvershoot.addChild(self.color) + s1 = coin.SoSeparator() + s1.addChild(self.transDimOvershoot1) + s1.addChild(dimDash((-1,0,0),(0,0,0))) + self.marksDimOvershoot.addChild(s1) + s2 = coin.SoSeparator() + s2.addChild(self.transDimOvershoot2) + s2.addChild(dimDash((0,0,0),(1,0,0))) + self.marksDimOvershoot.addChild(s2) + self.node.insertChild(self.marksDimOvershoot,2) + self.node3d.insertChild(self.marksDimOvershoot,2) + vobj.Object.touch() + elif (prop == "ExtOvershoot") and hasattr(vobj,"ExtOvershoot"): + from pivy import coin + + # set scale + s = vobj.ExtOvershoot.Value + self.transExtOvershoot1.scaleFactor.setValue((s,s,s)) + self.transExtOvershoot2.scaleFactor.setValue((s,s,s)) + + # remove existing nodes + self.node.removeChild(self.marksExtOvershoot) + self.node3d.removeChild(self.marksExtOvershoot) + + # set new nodes + self.marksExtOvershoot = coin.SoSeparator() + if vobj.ExtOvershoot.Value: + self.marksExtOvershoot.addChild(self.color) + s1 = coin.SoSeparator() + s1.addChild(self.transExtOvershoot1) + s1.addChild(dimDash((0,0,0),(-1,0,0))) + self.marksExtOvershoot.addChild(s1) + s2 = coin.SoSeparator() + s2.addChild(self.transExtOvershoot2) + s2.addChild(dimDash((0,0,0),(-1,0,0))) + self.marksExtOvershoot.addChild(s2) + self.node.insertChild(self.marksExtOvershoot,2) + self.node3d.insertChild(self.marksExtOvershoot,2) + vobj.Object.touch() else: self.updateData(vobj.Object,"Start") diff --git a/src/Mod/Draft/Resources/ui/preferences-drafttexts.ui b/src/Mod/Draft/Resources/ui/preferences-drafttexts.ui index 3486295be2..380f8d7f0b 100644 --- a/src/Mod/Draft/Resources/ui/preferences-drafttexts.ui +++ b/src/Mod/Draft/Resources/ui/preferences-drafttexts.ui @@ -229,6 +229,78 @@ such as "Arial:Bold" + + + + + + Extension line overshoot + + + + + + + The default length of extension line above dimension line + + + mm + + + -9999.989999999999782 + + + 9999.989999999999782 + + + 0.000000000000000 + + + extovershoot + + + Mod/Draft + + + + + + + + + + + Dimension line overshoot + + + + + + + The default distance the dimension line is extended past extension lines + + + mm + + + -9999.989999999999782 + + + 9999.989999999999782 + + + 0.000000000000000 + + + dimovershoot + + + Mod/Draft + + + + +