diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index d01edf979..e0e5e4baf 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -1262,18 +1262,42 @@ MDIView* Document::getActiveView(void) const Gui::MDIView* Document::getViewOfViewProvider(Gui::ViewProvider* vp) const { - std::list mdis = getMDIViews(); + std::list mdis = getMDIViewsOfType(View3DInventor::getClassTypeId()); for (std::list::const_iterator it = mdis.begin(); it != mdis.end(); ++it) { - if ((*it)->getTypeId().isDerivedFrom(View3DInventor::getClassTypeId())) { - View3DInventor* view = static_cast(*it); - if (view->getViewer()->hasViewProvider(vp)) - return *it; - } + View3DInventor* view = static_cast(*it); + if (view->getViewer()->hasViewProvider(vp)) + return *it; } return 0; } +Gui::MDIView* Document::getFirstViewOfViewProvider(Gui::ViewProvider* vp) const +{ + // first try the active view + Gui::MDIView* view = getActiveView(); + if (view && view->isDerivedFrom(View3DInventor::getClassTypeId())) { + View3DInventor* view3d = static_cast(view); + if (view3d->getViewer()->hasViewProvider(vp)) + return view; + } + + return getViewOfViewProvider(vp); +} + +std::list Document::getViewsOfViewProvider(Gui::ViewProvider* vp) const +{ + std::list views; + std::list mdis = getMDIViewsOfType(View3DInventor::getClassTypeId()); + for (std::list::const_iterator it = mdis.begin(); it != mdis.end(); ++it) { + View3DInventor* view = static_cast(*it); + if (view->getViewer()->hasViewProvider(vp)) + views.push_back(*it); + } + + return views; +} + //-------------------------------------------------------------------------- // UNDO REDO transaction handling //-------------------------------------------------------------------------- diff --git a/src/Gui/Document.h b/src/Gui/Document.h index 21bee19ff..0a7c68582 100644 --- a/src/Gui/Document.h +++ b/src/Gui/Document.h @@ -148,8 +148,10 @@ public: //@{ /// Getter for the active view Gui::MDIView* getActiveView(void) const; + Gui::MDIView* getFirstViewOfViewProvider(Gui::ViewProvider*) const; Gui::MDIView* getViewOfViewProvider(Gui::ViewProvider*) const; - /// Creat a new view + std::list getViewsOfViewProvider(Gui::ViewProvider*) const; + /// Create a new view void createView(const Base::Type& typeId); /** send messages to the active view * Send a specific massage to the active view and is able to recive a diff --git a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp index 0d302fb70..ed582d7e8 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.cpp @@ -166,6 +166,9 @@ void ConstraintView::contextMenuEvent (QContextMenuEvent* event) ); rename->setEnabled(item != 0); + QAction* center = menu.addAction(tr("Center sketch"), this, SLOT(centerSelectedItems())); + center->setEnabled(item != 0); + QAction* remove = menu.addAction(tr("Delete"), this, SLOT(deleteSelectedItems()), QKeySequence(QKeySequence::Delete)); remove->setEnabled(!items.isEmpty()); @@ -198,6 +201,11 @@ void ConstraintView::renameCurrentItem() editItem(item); } +void ConstraintView::centerSelectedItems() +{ + Q_EMIT emitCenterSelectedItems(); +} + void ConstraintView::deleteSelectedItems() { App::Document* doc = App::GetApplication().getActiveDocument(); @@ -245,6 +253,10 @@ TaskSketcherConstrains::TaskSketcherConstrains(ViewProviderSketch *sketchView) ui->listWidgetConstraints, SIGNAL(itemChanged(QListWidgetItem *)), this , SLOT (on_listWidgetConstraints_itemChanged(QListWidgetItem *)) ); + QObject::connect( + ui->listWidgetConstraints, SIGNAL(emitCenterSelectedItems()), + this , SLOT (on_listWidgetConstraints_emitCenterSelectedItems()) + ); QObject::connect( ui->listWidgetConstraints, SIGNAL(onUpdateDrivingStatus(QListWidgetItem *, bool)), this , SLOT (on_listWidgetConstraints_updateDrivingStatus(QListWidgetItem *, bool)) @@ -312,6 +324,11 @@ void TaskSketcherConstrains::on_comboBoxFilter_currentIndexChanged(int) slotConstraintsChanged(); } +void TaskSketcherConstrains::on_listWidgetConstraints_emitCenterSelectedItems() +{ + sketchView->centerSelection(); +} + void TaskSketcherConstrains::on_listWidgetConstraints_itemSelectionChanged(void) { std::string doc_name = sketchView->getSketchObject()->getDocument()->getName(); diff --git a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h index c58ee2fda..ee5dbd490 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h +++ b/src/Mod/Sketcher/Gui/TaskSketcherConstrains.h @@ -51,10 +51,12 @@ protected: Q_SIGNALS: void onUpdateDrivingStatus(QListWidgetItem *item, bool status); + void emitCenterSelectedItems(); protected Q_SLOTS: void modifyCurrentItem(); void renameCurrentItem(); + void centerSelectedItems(); void deleteSelectedItems(); void doSelectConstraints(); void updateDrivingStatus(); @@ -76,10 +78,11 @@ private: public Q_SLOTS: void on_comboBoxFilter_currentIndexChanged(int); - void on_listWidgetConstraints_itemSelectionChanged(void); + void on_listWidgetConstraints_itemSelectionChanged(void); void on_listWidgetConstraints_itemActivated(QListWidgetItem *item); void on_listWidgetConstraints_itemChanged(QListWidgetItem * item); void on_listWidgetConstraints_updateDrivingStatus(QListWidgetItem *item, bool status); + void on_listWidgetConstraints_emitCenterSelectedItems(void); protected: void changeEvent(QEvent *e); diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 25348399c..380f5776d 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -1821,6 +1821,40 @@ SbVec3s ViewProviderSketch::getDisplayedSize(const SoImage *iconPtr) const return iconSize; } +void ViewProviderSketch::centerSelection() +{ + Gui::Document* doc = Gui::Application::Instance->getDocument(getObject()->getDocument()); + Gui::View3DInventor* view = qobject_cast(doc->getFirstViewOfViewProvider(this)); + if (!view || !edit) + return; + + SoGroup* group = new SoGroup(); + group->ref(); + + for (int i=0; i < edit->constrGroup->getNumChildren(); i++) { + if (edit->SelConstraintSet.find(i) != edit->SelConstraintSet.end()) { + SoSeparator *sep = dynamic_cast(edit->constrGroup->getChild(i)); + group->addChild(sep); + } + } + + Gui::View3DInventorViewer* viewer = view->getViewer(); + SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion()); + action.apply(group); + group->unref(); + + SbBox3f box = action.getBoundingBox(); + if (!box.isEmpty()) { + // get cirumscribing sphere + SoCamera* camera = viewer->getSoRenderManager()->getCamera(); + SbVec3f direction; + camera->orientation.getValue().multVec(SbVec3f(0, 0, 1), direction); + SbVec3f box_cnt = box.getCenter(); + SbVec3f cam_pos = box_cnt + camera->focalDistance.getValue() * direction; + camera->position.setValue(cam_pos); + } +} + void ViewProviderSketch::doBoxSelection(const SbVec2s &startPos, const SbVec2s &endPos, const Gui::View3DInventorViewer *viewer) { diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.h b/src/Mod/Sketcher/Gui/ViewProviderSketch.h index c806e36b2..5511f9407 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.h +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.h @@ -165,6 +165,9 @@ public: const Gui::View3DInventorViewer *viewer, const SbVec2s &cursorPos); + /*! Look at the center of the bounding of all selected items */ + void centerSelection(); + /// box selection method void doBoxSelection(const SbVec2s &startPos, const SbVec2s &endPos, const Gui::View3DInventorViewer *viewer);