void paintSelection() { #if 0 SoAnnotation* hudRoot = new SoAnnotation; hudRoot->ref(); SoOrthographicCamera* hudCam = new SoOrthographicCamera(); hudCam->viewportMapping = SoCamera::LEAVE_ALONE; // Set the position in the window. // [0, 0] is in the center of the screen. // SoTranslation* hudTrans = new SoTranslation; hudTrans->translation.setValue(-1.0f, -1.0f, 0.0f); QImage image(100,100,QImage::Format_ARGB32_Premultiplied); image.fill(0x00000000); SoSFImage sfimage; Gui::BitmapFactory().convert(image, sfimage); SoImage* hudImage = new SoImage(); hudImage->image = sfimage; // Assemble the parts... // hudRoot->addChild(hudCam); hudRoot->addChild(hudTrans); hudRoot->addChild(hudImage); Gui::View3DInventorViewer* viewer = this->getViewer(); static_cast<SoGroup*>(viewer->getSceneGraph())->addChild(hudRoot); QWidget* gl = viewer->getGLWidget(); DrawingPlane pln(hudImage->image, viewer, gl); gl->installEventFilter(&pln); QEventLoop loop; QObject::connect(&pln, SIGNAL(emitSelection()), &loop, SLOT(quit())); loop.exec(); static_cast<SoGroup*>(viewer->getSceneGraph())->removeChild(hudRoot); #endif }
void ViewProviderInspection::inspectCallback(void * ud, SoEventCallback * n) { Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(n->getUserData()); const SoEvent* ev = n->getEvent(); if (ev->getTypeId() == SoMouseButtonEvent::getClassTypeId()) { const SoMouseButtonEvent * mbe = static_cast<const SoMouseButtonEvent *>(ev); // Mark all incoming mouse button events as handled, especially, to deactivate the selection node n->getAction()->setHandled(); n->setHandled(); if (mbe->getButton() == SoMouseButtonEvent::BUTTON2 && mbe->getState() == SoButtonEvent::UP) { n->setHandled(); // context-menu QMenu menu; QAction* fl = menu.addAction(QObject::tr("Annotation")); fl->setCheckable(true); fl->setChecked(addflag); QAction* cl = menu.addAction(QObject::tr("Leave info mode")); QAction* id = menu.exec(QCursor::pos()); if (fl == id) { addflag = fl->isChecked(); } else if (cl == id) { // post an event to a proxy object to make sure to avoid problems // when opening a modal dialog QApplication::postEvent( new ViewProviderProxyObject(view->getGLWidget()), new QEvent(QEvent::User)); view->setEditing(false); view->getWidget()->setCursor(QCursor(Qt::ArrowCursor)); view->setRedirectToSceneGraph(false); view->setRedirectToSceneGraphEnabled(false); view->removeEventCallback(SoButtonEvent::getClassTypeId(), inspectCallback); } } else if (mbe->getButton() == SoMouseButtonEvent::BUTTON1 && mbe->getState() == SoButtonEvent::UP) { const SoPickedPoint * point = n->getPickedPoint(); if (point == NULL) { Base::Console().Message("No point picked.\n"); return; } n->setHandled(); // check if we have picked one a node of the view provider we are insterested in Gui::ViewProvider* vp = static_cast<Gui::ViewProvider*>(view->getViewProviderByPath(point->getPath())); if (vp && vp->getTypeId().isDerivedFrom(ViewProviderInspection::getClassTypeId())) { ViewProviderInspection* that = static_cast<ViewProviderInspection*>(vp); QString info = that->inspectDistance(point); Gui::getMainWindow()->setPaneText(1,info); if (addflag) ViewProviderProxyObject::addFlag(view, info, point); else Gui::ToolTip::showText(QCursor::pos(), info); } else { // the nearest picked point was not part of the view provider SoRayPickAction action(view->getViewportRegion()); action.setPickAll(TRUE); action.setPoint(mbe->getPosition()); action.apply(view->getSceneManager()->getSceneGraph()); const SoPickedPointList& pps = action.getPickedPointList(); for (int i=0; i<pps.getLength(); ++i) { const SoPickedPoint * point = pps[i]; vp = static_cast<Gui::ViewProvider*>(view->getViewProviderByPath(point->getPath())); if (vp && vp->getTypeId().isDerivedFrom(ViewProviderInspection::getClassTypeId())) { ViewProviderInspection* that = static_cast<ViewProviderInspection*>(vp); QString info = that->inspectDistance(point); Gui::getMainWindow()->setPaneText(1,info); if (addflag) ViewProviderProxyObject::addFlag(view, info, point); else Gui::ToolTip::showText(QCursor::pos(), info); break; } } } } } // toggle between inspection and navigation mode else if (ev->getTypeId().isDerivedFrom(SoKeyboardEvent::getClassTypeId())) { const SoKeyboardEvent * const ke = static_cast<const SoKeyboardEvent *>(ev); if (ke->getState() == SoButtonEvent::DOWN && ke->getKey() == SoKeyboardEvent::ESCAPE) { SbBool toggle = view->isRedirectedToSceneGraph(); view->setRedirectToSceneGraph(!toggle); n->setHandled(); } } }
void EditDatumDialog::exec(bool atCursor) { // Return if constraint doesn't have editable value if (Constr->Type == Sketcher::Distance || Constr->Type == Sketcher::DistanceX || Constr->Type == Sketcher::DistanceY || Constr->Type == Sketcher::Radius || Constr->Type == Sketcher::Angle) { if (sketch->hasConflicts()) { QMessageBox::critical(qApp->activeWindow(), QObject::tr("Distance constraint"), QObject::tr("Not allowed to edit the datum because the sketch contains conflicting constraints")); return; } Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView(); Gui::View3DInventorViewer *viewer = static_cast<Gui::View3DInventor *>(mdi)->getViewer(); QDialog dlg(viewer->getGLWidget()); Ui::InsertDatum ui_ins_datum; ui_ins_datum.setupUi(&dlg); double datum = Constr->Value; Base::Quantity init_val; if (Constr->Type == Sketcher::Angle) { datum = Base::toDegrees<double>(datum); dlg.setWindowTitle(tr("Insert angle")); init_val.setUnit(Base::Unit::Angle); ui_ins_datum.label->setText(tr("Angle:")); ui_ins_datum.labelEdit->setParamGrpPath(QByteArray("User parameter:BaseApp/History/SketcherAngle")); } else if (Constr->Type == Sketcher::Radius) { dlg.setWindowTitle(tr("Insert radius")); init_val.setUnit(Base::Unit::Length); ui_ins_datum.label->setText(tr("Radius:")); ui_ins_datum.labelEdit->setParamGrpPath(QByteArray("User parameter:BaseApp/History/SketcherLength")); } else { dlg.setWindowTitle(tr("Insert length")); init_val.setUnit(Base::Unit::Length); ui_ins_datum.label->setText(tr("Length:")); ui_ins_datum.labelEdit->setParamGrpPath(QByteArray("User parameter:BaseApp/History/SketcherLength")); } //ui_ins_datum.lineEdit->setParamGrpPath("User parameter:History/Sketcher/SetDatum"); if (Constr->Type == Sketcher::Angle || ((Constr->Type == Sketcher::DistanceX || Constr->Type == Sketcher::DistanceY) && Constr->FirstPos == Sketcher::none || Constr->Second != Sketcher::Constraint::GeoUndef)) // hide negative sign init_val.setValue(std::abs(datum)); else // show negative sign init_val.setValue(datum); ui_ins_datum.labelEdit->setValue(init_val); ui_ins_datum.labelEdit->selectNumber(); if (atCursor) dlg.setGeometry(QCursor::pos().x() - dlg.geometry().width() / 2, QCursor::pos().y(), dlg.geometry().width(), dlg.geometry().height()); if (dlg.exec()) { Base::Quantity newQuant = ui_ins_datum.labelEdit->getQuantity(); if (newQuant.isQuantity()) { // save the value for the history ui_ins_datum.labelEdit->pushToHistory(); double newDatum = newQuant.getValue(); if (Constr->Type == Sketcher::Angle || ((Constr->Type == Sketcher::DistanceX || Constr->Type == Sketcher::DistanceY) && Constr->FirstPos == Sketcher::none || Constr->Second != Sketcher::Constraint::GeoUndef)) { // Permit negative values to flip the sign of the constraint if (newDatum >= 0) // keep the old sign newDatum = ((datum >= 0) ? 1 : -1) * std::abs(newDatum); else // flip sign newDatum = ((datum >= 0) ? -1 : 1) * std::abs(newDatum); } try { Gui::Command::openCommand("Modify sketch constraints"); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.setDatum(%i,App.Units.Quantity('%f %s'))", sketch->getNameInDocument(), ConstrNbr, newDatum, (const char*)newQuant.getUnit().getString().toUtf8()); Gui::Command::commitCommand(); Gui::Command::updateActive(); } catch (const Base::Exception& e) { QMessageBox::critical(qApp->activeWindow(), QObject::tr("Dimensional constraint"), QString::fromUtf8(e.what())); Gui::Command::abortCommand(); } } } } }