/*************************************************************************** * Copyright (c) 2013 Jürgen Riegel (FreeCAD@juergen-riegel.net) * * * * 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 #endif #include #include "ui_TaskCreateNodeSet.h" #include "TaskCreateNodeSet.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ViewProviderFemMesh.h" #include "FemSelectionGate.h" using namespace FemGui; using namespace Gui; TaskCreateNodeSet::TaskCreateNodeSet(Fem::FemSetNodesObject *pcObject,QWidget *parent) : TaskBox(Gui::BitmapFactory().pixmap("fem-fem-mesh-create-node-by-poly"), tr("Nodes set"), true, parent), pcObject(pcObject) { // we need a separate container widget to add all controls to proxy = new QWidget(this); ui = new Ui_TaskCreateNodeSet(); ui->setupUi(proxy); QMetaObject::connectSlotsByName(this); this->groupLayout()->addWidget(proxy); QObject::connect(ui->toolButton_Poly,SIGNAL(clicked()),this,SLOT(Poly())); QObject::connect(ui->toolButton_Pick,SIGNAL(clicked()),this,SLOT(Pick())); QObject::connect(ui->comboBox,SIGNAL(activated (int)),this,SLOT(SwitchMethod(int))); // check if the Link to the FemMesh is defined assert(pcObject->FemMesh.getValue()); MeshViewProvider = dynamic_cast(Gui::Application::Instance->getViewProvider( pcObject->FemMesh.getValue())); assert(MeshViewProvider); tempSet = pcObject->Nodes.getValues(); MeshViewProvider->setHighlightNodes(tempSet); ui->groupBox_AngleSearch->setEnabled(false); } void TaskCreateNodeSet::Poly(void) { Gui::Document* doc = Gui::Application::Instance->activeDocument(); Gui::MDIView* view = doc->getActiveView(); if (view->getTypeId().isDerivedFrom(Gui::View3DInventor::getClassTypeId())) { Gui::View3DInventorViewer* viewer = ((Gui::View3DInventor*)view)->getViewer(); viewer->setEditing(true); viewer->startSelection(Gui::View3DInventorViewer::Clip); viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), DefineNodesCallback,this); } } void TaskCreateNodeSet::Pick(void) { if (selectionMode == none){ selectionMode = PickElement; Gui::Selection().clearSelection(); Gui::Selection().addSelectionGate(new FemSelectionGate(FemSelectionGate::Element)); } } void TaskCreateNodeSet::SwitchMethod(int Value) { if(Value == 1){ ui->groupBox_AngleSearch->setEnabled(true); ui->toolButton_Pick->setEnabled(true); ui->toolButton_Poly->setEnabled(false); }else{ ui->groupBox_AngleSearch->setEnabled(false); ui->toolButton_Pick->setEnabled(false); ui->toolButton_Poly->setEnabled(true); } } void TaskCreateNodeSet::DefineNodesCallback(void * ud, SoEventCallback * n) { // show the wait cursor because this could take quite some time Gui::WaitCursor wc; TaskCreateNodeSet *taskBox = static_cast(ud); // When this callback function is invoked we must in either case leave the edit mode Gui::View3DInventorViewer* view = reinterpret_cast(n->getUserData()); view->setEditing(false); view->removeEventCallback(SoMouseButtonEvent::getClassTypeId(), DefineNodesCallback,ud); n->setHandled(); SbBool clip_inner; std::vector clPoly = view->getGLPolygon(&clip_inner); if (clPoly.size() < 3) return; if (clPoly.front() != clPoly.back()) clPoly.push_back(clPoly.front()); SoCamera* cam = view->getSoRenderManager()->getCamera(); SbViewVolume vv = cam->getViewVolume(); Gui::ViewVolumeProjection proj(vv); Base::Polygon2D polygon; for (std::vector::const_iterator it = clPoly.begin(); it != clPoly.end(); ++it) polygon.Add(Base::Vector2D((*it)[0],(*it)[1])); taskBox->DefineNodes(polygon,proj,clip_inner); } void TaskCreateNodeSet::DefineNodes(const Base::Polygon2D &polygon,const Gui::ViewVolumeProjection &proj,bool inner) { const SMESHDS_Mesh* data = const_cast(pcObject->FemMesh.getValue()->FemMesh.getValue().getSMesh())->GetMeshDS(); SMDS_NodeIteratorPtr aNodeIter = data->nodesIterator(); Base::Vector3f pt2d; if(! ui->checkBox_Add->isChecked()) tempSet.clear(); while (aNodeIter->more()) { const SMDS_MeshNode* aNode = aNodeIter->next(); Base::Vector3f vec(aNode->X(),aNode->Y(),aNode->Z()); pt2d = proj(vec); if (polygon.Contains(Base::Vector2D(pt2d.x, pt2d.y)) == inner) tempSet.insert(aNode->GetID()); } MeshViewProvider->setHighlightNodes(tempSet); } void TaskCreateNodeSet::onSelectionChanged(const Gui::SelectionChanges& msg) { if (selectionMode == none) return; if (msg.Type == Gui::SelectionChanges::AddSelection) { std::string subName(msg.pSubName); unsigned int i=0; for(;icheckBox_Add->isChecked()){ std::set tmp = pcObject->FemMesh.getValue()->FemMesh.getValue().getSurfaceNodes(elem,face); tempSet.insert(tmp.begin(),tmp.end()); }else tempSet = pcObject->FemMesh.getValue()->FemMesh.getValue().getSurfaceNodes(elem,face); selectionMode = none; Gui::Selection().rmvSelectionGate(); MeshViewProvider->setHighlightNodes(tempSet); } } TaskCreateNodeSet::~TaskCreateNodeSet() { delete ui; } #include "moc_TaskCreateNodeSet.cpp"