diff --git a/src/Mod/TechDraw/App/AppTechDraw.cpp b/src/Mod/TechDraw/App/AppTechDraw.cpp index 351cd4dc5..3edf96b1e 100644 --- a/src/Mod/TechDraw/App/AppTechDraw.cpp +++ b/src/Mod/TechDraw/App/AppTechDraw.cpp @@ -32,6 +32,7 @@ //#include "DrawProjection.h" #include "DrawViewClip.h" #include "DrawHatch.h" +#include "DrawViewDraft.h" extern struct PyMethodDef TechDraw_methods[]; @@ -79,6 +80,7 @@ void TechDrawExport initTechDraw() TechDraw::DrawViewClip ::init(); TechDraw::DrawHatch ::init(); + TechDraw::DrawViewDraft ::init(); // Python Types TechDraw::DrawViewPython ::init(); diff --git a/src/Mod/TechDraw/App/CMakeLists.txt b/src/Mod/TechDraw/App/CMakeLists.txt index 9aea3c4b7..697b46503 100644 --- a/src/Mod/TechDraw/App/CMakeLists.txt +++ b/src/Mod/TechDraw/App/CMakeLists.txt @@ -71,7 +71,8 @@ SET(Draw_SRCS DrawViewSection.h DrawHatch.cpp DrawHatch.h -) + DrawViewDraft.cpp + DrawViewDraft.h) SET(TechDraw_SRCS AppTechDraw.cpp diff --git a/src/Mod/TechDraw/App/DrawViewDraft.cpp b/src/Mod/TechDraw/App/DrawViewDraft.cpp new file mode 100644 index 000000000..38d43c26b --- /dev/null +++ b/src/Mod/TechDraw/App/DrawViewDraft.cpp @@ -0,0 +1,134 @@ +/*************************************************************************** + * Copyright (c) WandererFan - 2016 (wandererfan@gmail.com) * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" + +#ifndef _PreComp_ +# include +#endif + +#include +#include + +#include +#include +#include +#include + +#include "DrawViewDraft.h" + +using namespace TechDraw; +using namespace std; + + +//=========================================================================== +// DrawViewDraft +//=========================================================================== + +PROPERTY_SOURCE(TechDraw::DrawViewDraft, TechDraw::DrawViewSymbol) + + +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(FontSize,(12.0),group,App::Prop_None,"Text size for this view"); + ScaleType.setValue("Custom"); +} + +DrawViewDraft::~DrawViewDraft() +{ +} + +void DrawViewDraft::onChanged(const App::Property* prop) +{ + if (!isRestoring()) { + if (prop == &Source || + prop == &LineScale || + prop == &FontSize) { + try { + App::DocumentObjectExecReturn *ret = recompute(); + delete ret; + } + catch (...) { + } + } + } + TechDraw::DrawViewSymbol::onChanged(prop); +} + +App::DocumentObjectExecReturn *DrawViewDraft::execute(void) +{ + App::DocumentObject* sourceObj = Source.getValue(); + if (sourceObj) { + std::string svgFrag; + std::string svgHead = getSVGHead(); + std::string svgTail = getSVGTail(); + std::string FeatName = getNameInDocument(); + std::string SourceName = sourceObj->getNameInDocument(); + + std::stringstream paramStr; + paramStr << ",scale=" << LineScale.getValue() << ",fontsize=" << FontSize.getValue(); + +// 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) +// like Draft.makeDrawingView, but we don't need to create the actual document objects in Draft, just the svg. + Base::Interpreter().runString("import Draft"); + Base::Interpreter().runStringArg("svgBody = Draft.getSVG(App.activeDocument().%s %s)", + SourceName.c_str(),paramStr.str().c_str()); +// Base::Interpreter().runString("print svgBody"); + Base::Interpreter().runStringArg("App.activeDocument().%s.Symbol = '%s' + svgBody + '%s'", + FeatName.c_str(),svgHead.c_str(),svgTail.c_str()); + } + return DrawView::execute(); +} + +std::string DrawViewDraft::getSVGHead(void) +{ + std::string head = std::string("\\n"); + return head; +} + +std::string DrawViewDraft::getSVGTail(void) +{ + std::string tail = "\\n"; + return tail; +} + +// Python Drawing feature --------------------------------------------------------- + +namespace App { +/// @cond DOXERR +PROPERTY_SOURCE_TEMPLATE(TechDraw::DrawViewDraftPython, TechDraw::DrawViewDraft) +template<> const char* TechDraw::DrawViewDraftPython::getViewProviderName(void) const { + return "TechDrawGui::ViewProviderSymbol"; +} +/// @endcond + +// explicit template instantiation +template class TechDrawExport FeaturePythonT; +} diff --git a/src/Mod/TechDraw/App/DrawViewDraft.h b/src/Mod/TechDraw/App/DrawViewDraft.h new file mode 100644 index 000000000..32df78593 --- /dev/null +++ b/src/Mod/TechDraw/App/DrawViewDraft.h @@ -0,0 +1,75 @@ +/*************************************************************************** + * Copyright (c) WandererFan - 2016 (wandererfan@gmail.com) * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + +#ifndef _DrawViewDraft_h_ +#define _DrawViewDraft_h_ + +#include +#include +#include +#include + +#include "DrawView.h" +#include "DrawViewSymbol.h" + +namespace TechDraw +{ + + +class TechDrawExport DrawViewDraft : public TechDraw::DrawViewSymbol +{ + PROPERTY_HEADER(TechDraw::DrawViewDraft); + +public: + /// Constructor + DrawViewDraft(void); + virtual ~DrawViewDraft(); + + App::PropertyLink Source; + App::PropertyFloat LineScale; + App::PropertyFloat FontSize; + + /** @name methods overide Feature */ + //@{ + /// recalculate the Feature + virtual App::DocumentObjectExecReturn *execute(void); + //@} + + /// returns the type name of the ViewProvider + virtual const char* getViewProviderName(void) const { + return "TechDrawGui::ViewProviderSymbol"; + } + +protected: + void onChanged(const App::Property* prop); + Base::BoundBox3d bbox; + std::string getSVGHead(void); + std::string getSVGTail(void); +}; + +typedef App::FeaturePythonT DrawViewDraftPython; + + +} //namespace TechDraw + + +#endif diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 6d38dea08..1459fc1c3 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,8 @@ #include #include +#include + #include #include #include @@ -57,6 +60,7 @@ #include #include #include +#include #include @@ -85,8 +89,8 @@ DEF_STD_CMD(CmdTechDrawNewPageDef); CmdTechDrawNewPageDef::CmdTechDrawNewPageDef() : Command("TechDraw_NewPageDef") { - sAppModule = "Drawing"; - sGroup = QT_TR_NOOP("Drawing"); + sAppModule = "TechDraw"; + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert new default drawing page"); sToolTipText = QT_TR_NOOP("Insert new default drawing page"); sWhatsThis = "TechDraw_NewPageDef"; @@ -154,8 +158,8 @@ DEF_STD_CMD(CmdTechDrawNewPage); CmdTechDrawNewPage::CmdTechDrawNewPage() : Command("TechDraw_NewPage") { - sAppModule = "Drawing"; - sGroup = QT_TR_NOOP("Drawing"); + sAppModule = "TechDraw"; + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert new drawing page from template"); sToolTipText = QT_TR_NOOP("Insert new drawing page from template"); sWhatsThis = "TechDraw_NewPage"; @@ -230,8 +234,8 @@ DEF_STD_CMD(CmdTechDrawNewView); CmdTechDrawNewView::CmdTechDrawNewView() : Command("TechDraw_NewView") { - sAppModule = "Drawing"; - sGroup = QT_TR_NOOP("Drawing"); + sAppModule = "TechDraw"; + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert view in drawing"); sToolTipText = QT_TR_NOOP("Insert a new View of a Part in the active drawing"); sWhatsThis = "TechDraw_NewView"; @@ -312,8 +316,8 @@ DEF_STD_CMD(CmdTechDrawNewViewSection); CmdTechDrawNewViewSection::CmdTechDrawNewViewSection() : Command("TechDraw_NewViewSection") { - sAppModule = "Drawing"; - sGroup = QT_TR_NOOP("Drawing"); + sAppModule = "TechDraw"; + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert section view in drawing"); sToolTipText = QT_TR_NOOP("Insert a new Section View of a Part in the active drawing"); sWhatsThis = "TechDraw_NewViewSecton"; @@ -366,8 +370,8 @@ DEF_STD_CMD_A(CmdTechDrawProjGroup); CmdTechDrawProjGroup::CmdTechDrawProjGroup() : Command("TechDraw_ProjGroup") { - sAppModule = "Drawing"; - sGroup = QT_TR_NOOP("Drawing"); + sAppModule = "TechDraw"; + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert Projection Group"); sToolTipText = QT_TR_NOOP("Insert 2D Projections of a 3D part into the active drawing"); sWhatsThis = "TechDraw_ProjGroup"; @@ -451,7 +455,7 @@ CmdTechDrawAnnotation::CmdTechDrawAnnotation() : Command("TechDraw_Annotation") { // setting the Gui eye-candy - sGroup = QT_TR_NOOP("Drawing"); + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("&Annotation"); sToolTipText = QT_TR_NOOP("Inserts an Annotation in the active drawing"); sWhatsThis = "TechDraw_Annotation"; @@ -495,7 +499,7 @@ CmdTechDrawClip::CmdTechDrawClip() : Command("TechDraw_Clip") { // seting the - sGroup = QT_TR_NOOP("Drawing"); + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("&Clip"); sToolTipText = QT_TR_NOOP("Inserts a clip group in the active drawing"); sWhatsThis = "TechDraw_Clip"; @@ -542,7 +546,7 @@ CmdTechDrawClipPlus::CmdTechDrawClipPlus() : Command("TechDraw_ClipPlus") { // seting the - sGroup = QT_TR_NOOP("Drawing"); + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("&ClipPlus"); sToolTipText = QT_TR_NOOP("Add a View to a clip group in the active drawing"); sWhatsThis = "TechDraw_ClipPlus"; @@ -611,7 +615,7 @@ DEF_STD_CMD_A(CmdTechDrawClipMinus); CmdTechDrawClipMinus::CmdTechDrawClipMinus() : Command("TechDraw_ClipMinus") { - sGroup = QT_TR_NOOP("Drawing"); + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("&ClipMinus"); sToolTipText = QT_TR_NOOP("Remove a View from a clip group in the active drawing"); sWhatsThis = "TechDraw_ClipMinus"; @@ -682,7 +686,7 @@ CmdTechDrawSymbol::CmdTechDrawSymbol() : Command("TechDraw_Symbol") { // setting the Gui eye-candy - sGroup = QT_TR_NOOP("Drawing"); + sGroup = QT_TR_NOOP("TechDraw"); sMenuText = QT_TR_NOOP("Insert SVG &Symbol"); sToolTipText = QT_TR_NOOP("Inserts a symbol from a svg file in the active drawing"); sWhatsThis = "TechDraw_Symbol"; @@ -707,7 +711,7 @@ void CmdTechDrawSymbol::activated(int iMsg) std::string PageName = pages.front()->getNameInDocument(); std::string FeatName = getUniqueObjectName("Symbol"); openCommand("Create Symbol"); - doCommand(Doc,"import Drawing"); + //doCommand(Doc,"import Drawing"); doCommand(Doc,"f = open(unicode(\"%s\",'utf-8'),'r')",(const char*)filename.toUtf8()); doCommand(Doc,"svg = f.read()"); doCommand(Doc,"f.close()"); @@ -726,6 +730,64 @@ bool CmdTechDrawSymbol::isActive(void) return (getActiveGuiDocument() ? true : false); } +//=========================================================================== +// TechDraw_DraftView +//=========================================================================== + +DEF_STD_CMD_A(CmdTechDrawDraftView); + +CmdTechDrawDraftView::CmdTechDrawDraftView() + : Command("TechDraw_DraftView") +{ + // setting the Gui eye-candy + sGroup = QT_TR_NOOP("TechDraw"); + sMenuText = QT_TR_NOOP("Insert a DraftView"); + sToolTipText = QT_TR_NOOP("Inserts a Draft WB object into the active drawing"); + sWhatsThis = "TechDraw_DraftView"; + sStatusTip = QT_TR_NOOP("Inserts a Draft WB object into the active drawing"); + sPixmap = "actions/drawing-draft-view"; +} + +void CmdTechDrawDraftView::activated(int iMsg) +{ +// std::vector pages = getSelection().getObjectsOfType(TechDraw::DrawPage::getClassTypeId()); + std::vector pages = getDocument()->getObjectsOfType(TechDraw::DrawPage::getClassTypeId()); + if (pages.empty()) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No page found"), + QObject::tr("Create a page first.")); + return; + } + + std::vector feats = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); + if (feats.empty()) { + feats = getSelection().getObjectsOfType(App::FeaturePython::getClassTypeId()); + if (feats.empty()) { + feats = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId()); + if (feats.empty()) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No Source Object"), + QObject::tr("Select a Draft object first.")); + return; + } + } + } + + std::string PageName = pages.front()->getNameInDocument(); + std::string SourceName = feats.front()->getNameInDocument(); + std::string FeatName = getUniqueObjectName("DraftView"); + + openCommand("Create DraftView"); + doCommand(Doc,"App.activeDocument().addObject('TechDraw::DrawViewDraft','%s')",FeatName.c_str()); + doCommand(Doc,"App.activeDocument().%s.Source = App.activeDocument().%s",FeatName.c_str(),SourceName.c_str()); + doCommand(Doc,"App.activeDocument().%s.addView(App.activeDocument().%s)",PageName.c_str(),FeatName.c_str()); + updateActive(); + commitCommand(); +} + +bool CmdTechDrawDraftView::isActive(void) +{ + return (getActiveGuiDocument() ? true : false); +} + //=========================================================================== // TechDraw_ExportPage @@ -801,4 +863,5 @@ void CreateTechDrawCommands(void) rcCmdMgr.addCommand(new CmdTechDrawClipMinus()); rcCmdMgr.addCommand(new CmdTechDrawSymbol()); rcCmdMgr.addCommand(new CmdTechDrawExportPage()); + rcCmdMgr.addCommand(new CmdTechDrawDraftView()); } diff --git a/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp b/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp index b11454c16..0b3a89078 100644 --- a/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewSymbol.cpp @@ -61,7 +61,7 @@ QGIViewSymbol::QGIViewSymbol(const QPoint &pos, QGraphicsScene *scene) :QGIView( QGIViewSymbol::~QGIViewSymbol() { - // m_svgItem belongs to this group and will be deleted by Qt + // m_svgItem belongs to this group and will be deleted by Qt delete(m_svgRender); } @@ -89,7 +89,7 @@ void QGIViewSymbol::updateView(bool update) viewSymbol->Symbol.isTouched()) { draw(); } - + if (viewSymbol->Scale.isTouched()) { setScale(viewSymbol->Scale.getValue()); draw(); @@ -114,6 +114,9 @@ void QGIViewSymbol::drawSvg() TechDraw::DrawViewSymbol *viewSymbol = dynamic_cast(getViewObject()); QString qs(QString::fromUtf8(viewSymbol->Symbol.getValue())); + if (qs.isEmpty()) { + return; + } QByteArray qba; qba.append(qs); if (!load(&qba)) { @@ -135,4 +138,3 @@ bool QGIViewSymbol::load(QByteArray *svgBytes) } #include "moc_QGIViewSymbol.cpp" - diff --git a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc index fd5c1a312..62907217c 100644 --- a/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc +++ b/src/Mod/TechDraw/Gui/Resources/TechDraw.qrc @@ -48,5 +48,6 @@ icons/ProjRight.svg icons/ProjTop.svg icons/actions/techdraw-projgroup.svg + icons/actions/drawing-draft-view.svg diff --git a/src/Mod/TechDraw/Gui/Resources/icons/actions/drawing-draft-view.svg b/src/Mod/TechDraw/Gui/Resources/icons/actions/drawing-draft-view.svg new file mode 100644 index 000000000..87ee3b46d --- /dev/null +++ b/src/Mod/TechDraw/Gui/Resources/icons/actions/drawing-draft-view.svg @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Jakub Steiner + + + http://jimmac.musichall.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/TechDraw/Gui/Workbench.cpp b/src/Mod/TechDraw/Gui/Workbench.cpp index 1427762f8..36c7479a3 100644 --- a/src/Mod/TechDraw/Gui/Workbench.cpp +++ b/src/Mod/TechDraw/Gui/Workbench.cpp @@ -71,6 +71,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const *draw << "TechDraw_ClipPlus"; *draw << "TechDraw_ClipMinus"; *draw << "TechDraw_NewDimension"; + *draw << "TechDraw_DraftView"; *draw << "TechDraw_ExportPage"; //*draw << "TechDraw_Open"; //*part << "TechDraw_NewA3Landscape"; @@ -96,6 +97,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const *views << "TechDraw_ProjGroup"; *views << "TechDraw_NewViewSection"; *views << "TechDraw_Annotation"; + *views << "TechDraw_DraftView"; Gui::ToolBarItem *clips = new Gui::ToolBarItem(root); clips->setCommand("TechDraw Clips"); @@ -139,6 +141,7 @@ Gui::ToolBarItem* Workbench::setupCommandBars() const *views << "TechDraw_ProjGroup"; *views << "TechDraw_NewViewSection"; *views << "TechDraw_Annotation"; + *views << "TechDraw_DraftView"; Gui::ToolBarItem *clips = new Gui::ToolBarItem(root); clips->setCommand("TechDraw Clips");