From d8ebfe58c50b82df5eab35d6361023ee9e8c375b Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Wed, 14 Sep 2016 12:38:34 -0300 Subject: [PATCH] TechDraw: Extended Draft View --- src/Mod/Draft/Draft.py | 107 +++++++++++++------- src/Mod/TechDraw/App/DrawViewDraft.cpp | 29 +++++- src/Mod/TechDraw/App/DrawViewDraft.h | 8 +- src/Mod/TechDraw/Gui/AppTechDrawGui.cpp | 1 + src/Mod/TechDraw/Gui/Command.cpp | 9 +- src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp | 15 +++ src/Mod/TechDraw/Gui/ViewProviderSymbol.h | 11 ++ 7 files changed, 130 insertions(+), 50 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 4370a90d2..d956696c8 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -1712,12 +1712,20 @@ def getDXF(obj,direction=None): return result -def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direction=None,linestyle=None,color=None,linespacing=None): +def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direction=None,linestyle=None,color=None,linespacing=None,techdraw=False): '''getSVG(object,[scale], [linewidth],[fontsize],[fillstyle],[direction],[linestyle],[color],[linespacing]): 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.''' + + # if this is a group, gather all the svg views of its children + if obj.isDerivedFrom("App::DocumentObjectGroup"): + svg = "" + for child in obj.Group: + svg += getSVG(child,scale,linewidth,fontsize,fillstyle,direction,linestyle,color,linespacing,techdraw) + return svg + import Part, DraftGeomUtils pathdata = [] svg = "" @@ -1739,7 +1747,10 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct plane = direction stroke = "#000000" if color: - stroke = getrgb(color) + if "#" in color: + stroke = color + else: + stroke = getrgb(color) elif gui: if hasattr(obj.ViewObject,"LineColor"): stroke = getrgb(obj.ViewObject.LineColor) @@ -1754,12 +1765,18 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct l = p.GetString("svgDashdotLine","0.09,0.05,0.02,0.05") elif linestyle == "Dotted": l = p.GetString("svgDottedLine","0.02,0.02") + elif "," in linestyle: + l = linestyle if l: l = l.split(",") - # scale dashes - l = ",".join([str(float(d)/scale) for d in l]) - #print "lstyle ",l - return l + try: + # scale dashes + l = ",".join([str(float(d)/scale) for d in l]) + #print "lstyle ",l + except: + return "none" + else: + return l return "none" def getProj(vec): @@ -1770,6 +1787,8 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct ny = DraftVecUtils.project(vec,plane.v) ly = ny.Length if abs(ny.getAngle(plane.v)) > 0.1: ly = -ly + if techdraw: + ly = -ly return Vector(lx,ly,0) def getPattern(pat): @@ -1972,41 +1991,53 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct anchor = "start" else: anchor = "end" - svg = '' + svg += '\n' + else: + svg = '' + try: + svg += text[i] + except: + svg += text[i].decode("utf8") + svg += '\n' + svg += '\n' return svg diff --git a/src/Mod/TechDraw/App/DrawViewDraft.cpp b/src/Mod/TechDraw/App/DrawViewDraft.cpp index 2d7aba66d..a582d6874 100644 --- a/src/Mod/TechDraw/App/DrawViewDraft.cpp +++ b/src/Mod/TechDraw/App/DrawViewDraft.cpp @@ -52,8 +52,12 @@ DrawViewDraft::DrawViewDraft(void) static const char *group = "Draft view"; ADD_PROPERTY_TYPE(Source ,(0),group,App::Prop_None,"Draft object for this view"); - ADD_PROPERTY_TYPE(LineScale,(1.0),group,App::Prop_None,"Line width adjustment factor for this view"); + ADD_PROPERTY_TYPE(LineWidth,(0.35),group,App::Prop_None,"Line width of this view"); ADD_PROPERTY_TYPE(FontSize,(12.0),group,App::Prop_None,"Text size for this view"); + ADD_PROPERTY_TYPE(Direction ,(0,0,1.0),group,App::Prop_None,"Projection direction. The direction you are looking from."); + ADD_PROPERTY_TYPE(Color,(0.0f,0.0f,0.0f),group,App::Prop_None,"The default color of text and lines"); + ADD_PROPERTY_TYPE(LineStyle,("Solid") ,group,App::Prop_None,"A line style to use for this view. Can be Solid, Dashed, Dashdot, Dot or a SVG pattern like 0.20,0.20"); + ADD_PROPERTY_TYPE(LineSpacing,(1.0f),group,App::Prop_None,"The spacing between lines to use for multiline texts"); ScaleType.setValue("Custom"); } @@ -65,8 +69,12 @@ void DrawViewDraft::onChanged(const App::Property* prop) { if (!isRestoring()) { if (prop == &Source || - prop == &LineScale || - prop == &FontSize) { + prop == &LineWidth || + prop == &FontSize || + prop == &Direction || + prop == &Color || + prop == &LineStyle || + prop == &LineSpacing) { try { App::DocumentObjectExecReturn *ret = recompute(); delete ret; @@ -87,9 +95,20 @@ App::DocumentObjectExecReturn *DrawViewDraft::execute(void) std::string svgTail = getSVGTail(); std::string FeatName = getNameInDocument(); std::string SourceName = sourceObj->getNameInDocument(); + // Draft.getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direction=None,linestyle=None,color=None,linespacing=None,techdraw=False) std::stringstream paramStr; - paramStr << ",scale=" << LineScale.getValue() << ",fontsize=" << FontSize.getValue(); + App::Color col = Color.getValue(); + paramStr << ",scale=" << Scale.getValue() + << ",linewidth=" << LineWidth.getValue() + << ",fontsize=" << FontSize.getValue() + // TODO treat fillstyle here + << ",direction=FreeCAD.Vector(" << Direction.getValue().x << "," << Direction.getValue().y << "," << Direction.getValue().z << ")" + << ",linestyle=\"" << LineStyle.getValue() << "\"" + << ",color=\"" << col.asCSSString() << "\"" + << ",linespacing=" << LineSpacing.getValue() + // We must set techdraw to "true" becausea couple of things behave differently than in Drawing + << ",techdraw=True"; // this is ok for a starting point, but should eventually make dedicated Draft functions that build the svg for all the special cases // (Arch section, etc) @@ -124,7 +143,7 @@ namespace App { /// @cond DOXERR PROPERTY_SOURCE_TEMPLATE(TechDraw::DrawViewDraftPython, TechDraw::DrawViewDraft) template<> const char* TechDraw::DrawViewDraftPython::getViewProviderName(void) const { - return "TechDrawGui::ViewProviderSymbol"; + return "TechDrawGui::ViewProviderDraft"; } /// @endcond diff --git a/src/Mod/TechDraw/App/DrawViewDraft.h b/src/Mod/TechDraw/App/DrawViewDraft.h index 586fb8663..09602515e 100644 --- a/src/Mod/TechDraw/App/DrawViewDraft.h +++ b/src/Mod/TechDraw/App/DrawViewDraft.h @@ -44,8 +44,12 @@ public: virtual ~DrawViewDraft(); App::PropertyLink Source; - App::PropertyFloat LineScale; + App::PropertyFloat LineWidth; App::PropertyFloat FontSize; + App::PropertyVector Direction; + App::PropertyColor Color; + App::PropertyString LineStyle; + App::PropertyFloat LineSpacing; /** @name methods overide Feature */ //@{ @@ -55,7 +59,7 @@ public: /// returns the type name of the ViewProvider virtual const char* getViewProviderName(void) const { - return "TechDrawGui::ViewProviderSymbol"; + return "TechDrawGui::ViewProviderDraft"; } protected: diff --git a/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp b/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp index f502a9d6b..327a6d780 100644 --- a/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp +++ b/src/Mod/TechDraw/Gui/AppTechDrawGui.cpp @@ -96,6 +96,7 @@ void TechDrawGuiExport initTechDrawGui() TechDrawGui::ViewProviderViewClip::init(); TechDrawGui::ViewProviderAnnotation::init(); TechDrawGui::ViewProviderSymbol::init(); + TechDrawGui::ViewProviderDraft::init(); TechDrawGui::ViewProviderHatch::init(); TechDrawGui::ViewProviderSpreadsheet::init(); diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 0a04c6f35..b2d858c15 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -790,16 +790,15 @@ void CmdTechDrawDraftView::activated(int iMsg) return; } - std::vector shapes = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); - if (shapes.empty()) { + std::vector objects = getSelection().getObjectsOfType(App::DocumentObject::getClassTypeId()); + if (objects.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select at least 1 Part object.")); + QObject::tr("Select at least one object.")); return; } std::string PageName = page->getNameInDocument(); - std::string SourceName = shapes.front()->getNameInDocument(); - for (std::vector::iterator it = shapes.begin(); it != shapes.end(); ++it) { + for (std::vector::iterator it = objects.begin(); it != objects.end(); ++it) { std::string FeatName = getUniqueObjectName("DraftView"); std::string SourceName = (*it)->getNameInDocument(); openCommand("Create DraftView"); diff --git a/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp b/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp index b46a30512..827fb051a 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderSymbol.cpp @@ -84,3 +84,18 @@ TechDraw::DrawViewSymbol* ViewProviderSymbol::getViewObject() const { return dynamic_cast(pcObject); } + +//************************************************************************** +// Draft view + +PROPERTY_SOURCE(TechDrawGui::ViewProviderDraft, TechDrawGui::ViewProviderSymbol) + + +ViewProviderDraft::ViewProviderDraft() +{ + sPixmap = "actions/techdraw-draft-view.svg"; +} + +ViewProviderDraft::~ViewProviderDraft() +{ +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderSymbol.h b/src/Mod/TechDraw/Gui/ViewProviderSymbol.h index d5fdf9006..ffc081e4a 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderSymbol.h +++ b/src/Mod/TechDraw/Gui/ViewProviderSymbol.h @@ -54,6 +54,17 @@ public: virtual TechDraw::DrawViewSymbol* getViewObject() const; }; +class TechDrawGuiExport ViewProviderDraft : public ViewProviderSymbol +{ + PROPERTY_HEADER(TechDrawGui::ViewProviderDraft); + +public: + /// constructor + ViewProviderDraft(); + /// destructor + virtual ~ViewProviderDraft(); +}; + } // namespace TechDrawGui