From 99a996423134b8ed2faee416fc1bb8521f894943 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Thu, 12 Mar 2020 18:38:04 -0400 Subject: [PATCH] [TD]support App::Link in View Source --- src/Mod/TechDraw/App/DrawProjGroup.cpp | 2 + src/Mod/TechDraw/App/DrawViewPart.cpp | 3 + src/Mod/TechDraw/App/ShapeExtractor.cpp | 112 +++++++++++++++++++++--- src/Mod/TechDraw/App/ShapeExtractor.h | 2 + src/Mod/TechDraw/Gui/Command.cpp | 4 +- 5 files changed, 108 insertions(+), 15 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawProjGroup.cpp b/src/Mod/TechDraw/App/DrawProjGroup.cpp index 9d1e1a8e8d..33abf5829a 100644 --- a/src/Mod/TechDraw/App/DrawProjGroup.cpp +++ b/src/Mod/TechDraw/App/DrawProjGroup.cpp @@ -72,6 +72,8 @@ DrawProjGroup::DrawProjGroup(void) : ADD_PROPERTY_TYPE(Source ,(0), group, App::Prop_None,"Shape to view"); Source.setScope(App::LinkScope::Global); + Source.setAllowExternal(true); + ADD_PROPERTY_TYPE(Anchor, (0), group, App::Prop_None, "The root view to align projections with"); Anchor.setScope(App::LinkScope::Global); diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 7baa73d14d..0ae66f5773 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -142,6 +142,8 @@ DrawViewPart::DrawViewPart(void) : //properties that affect Geometry ADD_PROPERTY_TYPE(Source ,(0),group,App::Prop_None,"3D Shape to view"); Source.setScope(App::LinkScope::Global); + Source.setAllowExternal(true); + ADD_PROPERTY_TYPE(Direction ,(0.0,-1.0,0.0), group,App::Prop_None,"Projection Plane normal. The direction you are looking from."); ADD_PROPERTY_TYPE(XDirection ,(0.0,0.0,0.0), @@ -244,6 +246,7 @@ App::DocumentObjectExecReturn *DrawViewPart::execute(void) } return App::DocumentObject::StdReturn; } + std::vector sources = Source.getValues(); TopoDS_Shape shape = getSourceShape(); if (shape.IsNull()) { diff --git a/src/Mod/TechDraw/App/ShapeExtractor.cpp b/src/Mod/TechDraw/App/ShapeExtractor.cpp index 40029f0589..35b4303449 100644 --- a/src/Mod/TechDraw/App/ShapeExtractor.cpp +++ b/src/Mod/TechDraw/App/ShapeExtractor.cpp @@ -39,12 +39,14 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -67,7 +69,6 @@ std::vector ShapeExtractor::getShapes2d(const std::vector(l); -// App::Property* gProp = l->getPropertyByName("Group"); if (gex != nullptr) { std::vector objs = gex->Group.getValues(); for (auto& d: objs) { @@ -92,24 +93,34 @@ std::vector ShapeExtractor::getShapes2d(const std::vector links) { +// Base::Console().Message("SE::getShapes() - links in: %d\n", links.size()); TopoDS_Shape result; std::vector sourceShapes; for (auto& l:links) { - auto shape = Part::Feature::getShape(l); - if(!shape.IsNull()) { -// BRepTools::Write(shape, "DVPgetShape.brep"); //debug - if (shape.ShapeType() > TopAbs_COMPSOLID) { //simple shape - sourceShapes.push_back(shape); - } else { //complex shape - std::vector drawable = extractDrawableShapes(shape); - if (!drawable.empty()) { - sourceShapes.insert(sourceShapes.end(),drawable.begin(),drawable.end()); - } + if (l->getTypeId().isDerivedFrom(App::Link::getClassTypeId())) { + App::Link* xLink = dynamic_cast(l); + std::vector xShapes = getXShapes(xLink); + if (!xShapes.empty()) { + sourceShapes.insert(sourceShapes.end(), xShapes.begin(), xShapes.end()); + continue; } } else { - std::vector shapeList = getShapesFromObject(l); - sourceShapes.insert(sourceShapes.end(),shapeList.begin(),shapeList.end()); + auto shape = Part::Feature::getShape(l); + if(!shape.IsNull()) { + // BRepTools::Write(shape, "DVPgetShape.brep"); //debug + if (shape.ShapeType() > TopAbs_COMPSOLID) { //simple shape + sourceShapes.push_back(shape); + } else { //complex shape + std::vector drawable = extractDrawableShapes(shape); + if (!drawable.empty()) { + sourceShapes.insert(sourceShapes.end(),drawable.begin(),drawable.end()); + } + } + } else { + std::vector shapeList = getShapesFromObject(l); + sourceShapes.insert(sourceShapes.end(),shapeList.begin(),shapeList.end()); + } } } @@ -136,6 +147,81 @@ TopoDS_Shape ShapeExtractor::getShapes(const std::vector l return result; } +std::vector ShapeExtractor::getXShapes(const App::Link* xLink) +{ +// Base::Console().Message("SE::getXShapes(%X) - %s\n", xLink, xLink->getNameInDocument()); + std::vector xSourceShapes; + if (xLink == nullptr) { + return xSourceShapes; + } + + std::vector children = xLink->getLinkedChildren(); + Base::Placement linkPlm; + if (xLink->hasPlacement()) { + linkPlm = xLink->getLinkPlacementProperty()->getValue(); + } + + if (!children.empty()) { + for (auto& l:children) { +//What to do with LinkGroup??? +// if (l->getTypeId().isDerivedFrom(App::LinkGroup::getClassTypeId())) { +// Base::Console().Message("SE::getXShapes - found a LinkGroup\n"); +// } + Base::Placement childPlm; + if (l->getTypeId().isDerivedFrom(App::LinkElement::getClassTypeId())) { + App::LinkElement* cLinkElem = dynamic_cast(l); + if (cLinkElem->hasPlacement()) { + childPlm = cLinkElem->getLinkPlacementProperty()->getValue(); + } + } + auto shape = Part::Feature::getShape(l); + if(!shape.IsNull()) { + Base::Placement netPlm = linkPlm; + netPlm *= childPlm; + if (xLink->hasPlacement()) { + Part::TopoShape ts(shape); + ts.setPlacement(netPlm); + shape = ts.getShape(); + } + if (shape.ShapeType() > TopAbs_COMPSOLID) { //simple shape + xSourceShapes.push_back(shape); + } else { //complex shape + std::vector drawable = extractDrawableShapes(shape); + if (!drawable.empty()) { + xSourceShapes.insert(xSourceShapes.end(),drawable.begin(),drawable.end()); + } + } + } else { + Base::Console().Message("SE::getXShapes - no shape from getXShape\n"); + } + } + } else { + int depth = 1; //0 is default value, related to recursion of Links??? + App::DocumentObject* link = xLink->getLink(depth); + if (link != nullptr) { + auto shape = Part::Feature::getShape(link); + if(!shape.IsNull()) { + if (xLink->hasPlacement()) { + Part::TopoShape ts(shape); + ts.setPlacement(linkPlm); + shape = ts.getShape(); + } + + if (shape.ShapeType() > TopAbs_COMPSOLID) { //simple shape + xSourceShapes.push_back(shape); + } else { //complex shape + std::vector drawable = extractDrawableShapes(shape); + if (!drawable.empty()) { + xSourceShapes.insert(xSourceShapes.end(),drawable.begin(),drawable.end()); + } + } + } + } + } + return xSourceShapes; +} + + std::vector ShapeExtractor::getShapesFromObject(const App::DocumentObject* docObj) { // Base::Console().Message("SE::getShapesFromObject(%s)\n", docObj->getNameInDocument()); diff --git a/src/Mod/TechDraw/App/ShapeExtractor.h b/src/Mod/TechDraw/App/ShapeExtractor.h index ae163d675a..373e1dea52 100644 --- a/src/Mod/TechDraw/App/ShapeExtractor.h +++ b/src/Mod/TechDraw/App/ShapeExtractor.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -46,6 +47,7 @@ class TechDrawExport ShapeExtractor public: static TopoDS_Shape getShapes(const std::vector links); static std::vector getShapes2d(const std::vector links); + static std::vector getXShapes(const App::Link* xLink); static std::vector getShapesFromObject(const App::DocumentObject* docObj); static TopoDS_Shape getShapesFused(const std::vector links); static std::vector extractDrawableShapes(const TopoDS_Shape shapeIn); diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index 6434468041..738a7455b3 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -316,7 +316,7 @@ void CmdTechDrawView::activated(int iMsg) if (obj->isDerivedFrom(TechDraw::DrawPage::getClassTypeId()) ) { continue; } - if (obj != nullptr) { //can this happen? + if (obj != nullptr) { shapes.push_back(obj); } if(partObj != nullptr) { @@ -333,7 +333,7 @@ void CmdTechDrawView::activated(int iMsg) if ((shapes.empty())) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("No Shapes or Groups in this selection")); + QObject::tr("No Shapes, Groups or Links in this selection")); return; }