/*************************************************************************** * Copyright (c) 2008 Werner Mayer * * * * 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 # include # include # include # include #endif #include "ViewProviderBoolean.h" #include #include #include #include #include using namespace PartGui; PROPERTY_SOURCE(PartGui::ViewProviderBoolean,PartGui::ViewProviderPart) ViewProviderBoolean::ViewProviderBoolean() { } ViewProviderBoolean::~ViewProviderBoolean() { } std::vector ViewProviderBoolean::claimChildren(void)const { std::vector temp; temp.push_back(static_cast(getObject())->Base.getValue()); temp.push_back(static_cast(getObject())->Tool.getValue()); return temp; } QIcon ViewProviderBoolean::getIcon(void) const { App::DocumentObject* obj = getObject(); if (obj) { Base::Type type = obj->getTypeId(); if (type == Base::Type::fromName("Part::Common")) return Gui::BitmapFactory().pixmap("Part_Common"); else if (type == Base::Type::fromName("Part::Fuse")) return Gui::BitmapFactory().pixmap("Part_Fuse"); else if (type == Base::Type::fromName("Part::Cut")) return Gui::BitmapFactory().pixmap("Part_Cut"); else if (type == Base::Type::fromName("Part::Section")) return Gui::BitmapFactory().pixmap("Part_Section"); } return ViewProviderPart::getIcon(); } void ViewProviderBoolean::updateData(const App::Property* prop) { PartGui::ViewProviderPart::updateData(prop); if (prop->getTypeId() == Part::PropertyShapeHistory::getClassTypeId()) { const std::vector& hist = static_cast (prop)->getValues(); if (hist.size() != 2) return; Part::Boolean* objBool = dynamic_cast(getObject()); Part::Feature* objBase = dynamic_cast(objBool->Base.getValue()); Part::Feature* objTool = dynamic_cast(objBool->Tool.getValue()); if (objBase && objTool) { const TopoDS_Shape& baseShape = objBase->Shape.getValue(); const TopoDS_Shape& toolShape = objTool->Shape.getValue(); const TopoDS_Shape& boolShape = objBool->Shape.getValue(); TopTools_IndexedMapOfShape baseMap, toolMap, boolMap; TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); TopExp::MapShapes(toolShape, TopAbs_FACE, toolMap); TopExp::MapShapes(boolShape, TopAbs_FACE, boolMap); Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); Gui::ViewProvider* vpTool = Gui::Application::Instance->getViewProvider(objTool); std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); std::vector colTool = static_cast(vpTool)->DiffuseColor.getValues(); std::vector colBool; colBool.resize(boolMap.Extent(), this->ShapeColor.getValue()); bool setColor=false; if (colBase.size() == baseMap.Extent()) { applyColor(hist[0], colBase, colBool); setColor = true; } else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) { colBase.resize(baseMap.Extent(), colBase[0]); applyColor(hist[0], colBase, colBool); setColor = true; } if (colTool.size() == toolMap.Extent()) { applyColor(hist[1], colTool, colBool); setColor = true; } else if (!colTool.empty() && colTool[0] != this->ShapeColor.getValue()) { colTool.resize(toolMap.Extent(), colTool[0]); applyColor(hist[1], colTool, colBool); setColor = true; } if (setColor) this->DiffuseColor.setValues(colBool); } } else if (prop->getTypeId() == App::PropertyLink::getClassTypeId()) { App::DocumentObject *pBase = static_cast(prop)->getValue(); if (pBase) Gui::Application::Instance->hideViewProvider(pBase); } } bool ViewProviderBoolean::onDelete(const std::vector &) { // get the input shapes Part::Boolean* pBool = static_cast(getObject()); App::DocumentObject *pBase = pBool->Base.getValue(); App::DocumentObject *pTool = pBool->Tool.getValue(); if (pBase) Gui::Application::Instance->showViewProvider(pBase); if (pTool) Gui::Application::Instance->showViewProvider(pTool); return true; } PROPERTY_SOURCE(PartGui::ViewProviderMultiFuse,PartGui::ViewProviderPart) ViewProviderMultiFuse::ViewProviderMultiFuse() { } ViewProviderMultiFuse::~ViewProviderMultiFuse() { } std::vector ViewProviderMultiFuse::claimChildren(void)const { return std::vector(static_cast(getObject())->Shapes.getValues()); } QIcon ViewProviderMultiFuse::getIcon(void) const { return Gui::BitmapFactory().pixmap("Part_Fuse"); } void ViewProviderMultiFuse::updateData(const App::Property* prop) { PartGui::ViewProviderPart::updateData(prop); if (prop->getTypeId() == Part::PropertyShapeHistory::getClassTypeId()) { const std::vector& hist = static_cast (prop)->getValues(); Part::MultiFuse* objBool = dynamic_cast(getObject()); std::vector sources = objBool->Shapes.getValues(); if (hist.size() != sources.size()) return; const TopoDS_Shape& boolShape = objBool->Shape.getValue(); TopTools_IndexedMapOfShape boolMap; TopExp::MapShapes(boolShape, TopAbs_FACE, boolMap); std::vector colBool; colBool.resize(boolMap.Extent(), this->ShapeColor.getValue()); bool setColor=false; int index=0; for (std::vector::iterator it = sources.begin(); it != sources.end(); ++it, ++index) { Part::Feature* objBase = dynamic_cast(*it); const TopoDS_Shape& baseShape = objBase->Shape.getValue(); TopTools_IndexedMapOfShape baseMap; TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); if (colBase.size() == baseMap.Extent()) { applyColor(hist[index], colBase, colBool); setColor = true; } else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) { colBase.resize(baseMap.Extent(), colBase[0]); applyColor(hist[index], colBase, colBool); setColor = true; } } if (setColor) this->DiffuseColor.setValues(colBool); } else if (prop->getTypeId() == App::PropertyLinkList::getClassTypeId()) { std::vector pShapes = static_cast(prop)->getValues(); for (std::vector::iterator it = pShapes.begin(); it != pShapes.end(); ++it) { if (*it) Gui::Application::Instance->hideViewProvider(*it); } } } bool ViewProviderMultiFuse::onDelete(const std::vector &) { // get the input shapes Part::MultiFuse* pBool = static_cast(getObject()); std::vector pShapes = pBool->Shapes.getValues(); for (std::vector::iterator it = pShapes.begin(); it != pShapes.end(); ++it) { if (*it) Gui::Application::Instance->showViewProvider(*it); } return true; } bool ViewProviderMultiFuse::canDragObjects() const { return true; } void ViewProviderMultiFuse::dragObject(App::DocumentObject* obj) { Part::MultiFuse* pBool = static_cast(getObject()); std::vector pShapes = pBool->Shapes.getValues(); for (std::vector::iterator it = pShapes.begin(); it != pShapes.end(); ++it) { if (*it == obj) { pShapes.erase(it); pBool->Shapes.setValues(pShapes); break; } } } bool ViewProviderMultiFuse::canDropObjects() const { return true; } void ViewProviderMultiFuse::dropObject(App::DocumentObject* obj) { Part::MultiFuse* pBool = static_cast(getObject()); std::vector pShapes = pBool->Shapes.getValues(); pShapes.push_back(obj); pBool->Shapes.setValues(pShapes); } PROPERTY_SOURCE(PartGui::ViewProviderMultiCommon,PartGui::ViewProviderPart) ViewProviderMultiCommon::ViewProviderMultiCommon() { } ViewProviderMultiCommon::~ViewProviderMultiCommon() { } std::vector ViewProviderMultiCommon::claimChildren(void)const { return std::vector(static_cast(getObject())->Shapes.getValues()); } QIcon ViewProviderMultiCommon::getIcon(void) const { return Gui::BitmapFactory().pixmap("Part_Common"); } void ViewProviderMultiCommon::updateData(const App::Property* prop) { PartGui::ViewProviderPart::updateData(prop); if (prop->getTypeId() == Part::PropertyShapeHistory::getClassTypeId()) { const std::vector& hist = static_cast (prop)->getValues(); Part::MultiCommon* objBool = dynamic_cast(getObject()); std::vector sources = objBool->Shapes.getValues(); if (hist.size() != sources.size()) return; const TopoDS_Shape& boolShape = objBool->Shape.getValue(); TopTools_IndexedMapOfShape boolMap; TopExp::MapShapes(boolShape, TopAbs_FACE, boolMap); std::vector colBool; colBool.resize(boolMap.Extent(), this->ShapeColor.getValue()); bool setColor=false; int index=0; for (std::vector::iterator it = sources.begin(); it != sources.end(); ++it, ++index) { Part::Feature* objBase = dynamic_cast(*it); const TopoDS_Shape& baseShape = objBase->Shape.getValue(); TopTools_IndexedMapOfShape baseMap; TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); if (colBase.size() == baseMap.Extent()) { applyColor(hist[index], colBase, colBool); setColor = true; } else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) { colBase.resize(baseMap.Extent(), colBase[0]); applyColor(hist[index], colBase, colBool); setColor = true; } } if (setColor) this->DiffuseColor.setValues(colBool); } else if (prop->getTypeId() == App::PropertyLinkList::getClassTypeId()) { std::vector pShapes = static_cast(prop)->getValues(); for (std::vector::iterator it = pShapes.begin(); it != pShapes.end(); ++it) { if (*it) Gui::Application::Instance->hideViewProvider(*it); } } } bool ViewProviderMultiCommon::onDelete(const std::vector &) { // get the input shapes Part::MultiCommon* pBool = static_cast(getObject()); std::vector pShapes = pBool->Shapes.getValues(); for (std::vector::iterator it = pShapes.begin(); it != pShapes.end(); ++it) { if (*it) Gui::Application::Instance->showViewProvider(*it); } return true; } bool ViewProviderMultiCommon::canDragObjects() const { return true; } void ViewProviderMultiCommon::dragObject(App::DocumentObject* obj) { Part::MultiCommon* pBool = static_cast(getObject()); std::vector pShapes = pBool->Shapes.getValues(); for (std::vector::iterator it = pShapes.begin(); it != pShapes.end(); ++it) { if (*it == obj) { pShapes.erase(it); pBool->Shapes.setValues(pShapes); break; } } } bool ViewProviderMultiCommon::canDropObjects() const { return true; } void ViewProviderMultiCommon::dropObject(App::DocumentObject* obj) { Part::MultiCommon* pBool = static_cast(getObject()); std::vector pShapes = pBool->Shapes.getValues(); pShapes.push_back(obj); pBool->Shapes.setValues(pShapes); }