void TaskPadParameters::onButtonFace(const bool pressed) { PartDesign::Pad* pcPad = static_cast<PartDesign::Pad*>(PadView->getObject()); Part::Feature* support = pcPad->getSupport(); if (support == NULL) { // There is no support, so we can't select from it... return; } if (pressed) { Gui::Document* doc = Gui::Application::Instance->activeDocument(); if (doc) { doc->setHide(PadView->getObject()->getNameInDocument()); doc->setShow(support->getNameInDocument()); } Gui::Selection().clearSelection(); Gui::Selection().addSelectionGate (new ReferenceSelection(support, false, true, false)); } else { Gui::Selection().rmvSelectionGate(); Gui::Document* doc = Gui::Application::Instance->activeDocument(); if (doc) { doc->setShow(PadView->getObject()->getNameInDocument()); doc->setHide(support->getNameInDocument()); } } // Update button if onButtonFace() is called explicitly ui->buttonFace->setChecked(pressed); }
void DlgExtrusion::findShapes() { App::Document* activeDoc = App::GetApplication().getActiveDocument(); if (!activeDoc) return; Gui::Document* activeGui = Gui::Application::Instance->getDocument(activeDoc); this->document = activeDoc->getName(); this->label = activeDoc->Label.getValue(); std::vector<App::DocumentObject*> objs = activeDoc->getObjectsOfType (Part::Feature::getClassTypeId()); for (std::vector<App::DocumentObject*>::iterator it = objs.begin(); it!=objs.end(); ++it) { const TopoDS_Shape& shape = static_cast<Part::Feature*>(*it)->Shape.getValue(); if (canExtrude(shape)) { QTreeWidgetItem* item = new QTreeWidgetItem(ui->treeWidget); item->setText(0, QString::fromUtf8((*it)->Label.getValue())); item->setData(0, Qt::UserRole, QString::fromLatin1((*it)->getNameInDocument())); Gui::ViewProvider* vp = activeGui->getViewProvider(*it); if (vp) item->setIcon(0, vp->getIcon()); } } }
void Command::adjustCameraPosition() { Gui::Document* doc = Gui::Application::Instance->activeDocument(); if (doc) { Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(doc->getActiveView()); Gui::View3DInventorViewer* viewer = view->getViewer(); SoCamera* camera = viewer->getSoRenderManager()->getCamera(); if (!camera || !camera->isOfType(SoOrthographicCamera::getClassTypeId())) return; // get scene bounding box SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion()); action.apply(viewer->getSceneGraph()); SbBox3f box = action.getBoundingBox(); if (box.isEmpty()) return; // get cirumscribing sphere and check if camera is inside SbVec3f cam_pos = camera->position.getValue(); SbVec3f box_cnt = box.getCenter(); SbSphere bs; bs.circumscribe(box); float radius = bs.getRadius(); float distance_to_midpoint = (box_cnt-cam_pos).length(); if (radius >= distance_to_midpoint) { // Move the camera to the edge of the bounding sphere, while still // pointing at the scene. SbVec3f direction = cam_pos - box_cnt; (void) direction.normalize(); // we know this is not a null vector camera->position.setValue(box_cnt + direction * radius); // New distance to mid point distance_to_midpoint = (camera->position.getValue() - box.getCenter()).length(); camera->nearDistance = distance_to_midpoint - radius; camera->farDistance = distance_to_midpoint + radius; camera->focalDistance = distance_to_midpoint; } } }
void CmdPointsPolyCut::activated(int iMsg) { std::vector<App::DocumentObject*> docObj = Gui::Selection().getObjectsOfType(Points::Feature::getClassTypeId()); for (std::vector<App::DocumentObject*>::iterator it = docObj.begin(); it != docObj.end(); ++it) { if (it == docObj.begin()) { Gui::Document* doc = getActiveGuiDocument(); 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::Lasso); viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), PointsGui::ViewProviderPoints::clipPointsCallback); } else { return; } } Gui::ViewProvider* pVP = getActiveGuiDocument()->getViewProvider( *it ); pVP->startEditing(); } }
void StdCmdDelete::activated(int iMsg) { // go through all documents const SelectionSingleton& rSel = Selection(); const std::vector<App::Document*> docs = App::GetApplication().getDocuments(); for (std::vector<App::Document*>::const_iterator it = docs.begin(); it != docs.end(); ++it) { Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(*it); std::vector<Gui::SelectionObject> sel = rSel.getSelectionEx((*it)->getName()); if (!sel.empty()) { (*it)->openTransaction("Delete"); for (std::vector<Gui::SelectionObject>::iterator ft = sel.begin(); ft != sel.end(); ++ft) { Gui::ViewProvider* vp = pGuiDoc->getViewProvider(ft->getObject()); if (vp) { // ask the ViewProvider if its want to do some clean up if (vp->onDelete(ft->getSubNames())) doCommand(Doc,"App.getDocument(\"%s\").removeObject(\"%s\")" ,(*it)->getName(), ft->getFeatName()); } } (*it)->commitTransaction(); } } }
Py::Object interactiveFilletArc(const Py::Tuple& args) { Gui::Document* doc = Gui::Application::Instance->activeDocument(); if (doc) { Gui::View3DInventor* view = qobject_cast<Gui::View3DInventor*>(doc->getActiveView()); if (view) { Gui::View3DInventorViewer* viewer = view->getViewer(); SoSeparator* scene = static_cast<SoSeparator*>(viewer->getSceneGraph()); SoSeparator* node = new SoSeparator(); SoBaseColor* rgb = new SoBaseColor(); rgb->rgb.setValue(1,1,0); node->addChild(rgb); SoCoordinate3* coords = new SoCoordinate3(); node->addChild(coords); node->addChild(new SoLineSet()); scene->addChild(node); ObjectObserver* obs = new ObjectObserver(doc->getDocument()->getActiveObject(), coords); obs->attachDocument(doc->getDocument()); } } return Py::None(); }
void CmdFemDefineNodesSet::activated(int iMsg) { std::vector<App::DocumentObject*> docObj = Gui::Selection().getObjectsOfType(Fem::FemMeshObject::getClassTypeId()); for (std::vector<App::DocumentObject*>::iterator it = docObj.begin(); it != docObj.end(); ++it) { if (it == docObj.begin()) { Gui::Document* doc = getActiveGuiDocument(); 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); } else { return; } } //Gui::ViewProvider* pVP = getActiveGuiDocument()->getViewProvider(*it); //if (pVP->isVisible()) // pVP->startEditing(); } }
void Placement::revertTransformation() { for (std::set<std::string>::iterator it = documents.begin(); it != documents.end(); ++it) { Gui::Document* document = Application::Instance->getDocument(it->c_str()); if (!document) continue; std::vector<App::DocumentObject*> obj = document->getDocument()-> getObjectsOfType(App::DocumentObject::getClassTypeId()); if (!obj.empty()) { for (std::vector<App::DocumentObject*>::iterator it=obj.begin();it!=obj.end();++it) { std::map<std::string,App::Property*> props; (*it)->getPropertyMap(props); // search for the placement property std::map<std::string,App::Property*>::iterator jt; jt = std::find_if(props.begin(), props.end(), find_placement(this->propertyName)); if (jt != props.end()) { Base::Placement cur = static_cast<App::PropertyPlacement*>(jt->second)->getValue(); Gui::ViewProvider* vp = document->getViewProvider(*it); if (vp) vp->setTransformation(cur.toMatrix()); } } } } }
void DlgEvaluateMeshImp::on_repairDuplicatedPointsButton_clicked() { if (d->meshFeature) { const char* docName = App::GetApplication().getDocumentName(d->meshFeature->getDocument()); const char* objName = d->meshFeature->getNameInDocument(); Gui::Document* doc = Gui::Application::Instance->getDocument(docName); doc->openCommand("Remove duplicated points"); try { Gui::Application::Instance->runCommand( true, "App.getDocument(\"%s\").getObject(\"%s\").removeDuplicatedPoints()" , docName, objName); } catch (const Base::Exception& e) { QMessageBox::warning(this, tr("Duplicated points"), QString::fromLatin1(e.what())); } doc->commitCommand(); doc->getDocument()->recompute(); repairDuplicatedPointsButton->setEnabled(false); checkDuplicatedPointsButton->setChecked(false); removeViewProvider("MeshGui::ViewProviderMeshDuplicatedPoints"); } }
void CmdSketcherLeaveSketch::activated(int iMsg) { Gui::Document *doc = getActiveGuiDocument(); if (doc) { // checks if a Sketch Viewprovider is in Edit and is in no special mode SketcherGui::ViewProviderSketch* vp = dynamic_cast<SketcherGui::ViewProviderSketch*>(doc->getInEdit()); if (vp && vp->getSketchMode() != ViewProviderSketch::STATUS_NONE) vp->purgeHandler(); } openCommand("Sketch changed"); doCommand(Gui,"Gui.activeDocument().resetEdit()"); doCommand(Doc,"App.ActiveDocument.recompute()"); commitCommand(); }
bool DrawingView::onMsg(const char* pMsg, const char** ppReturn) { if (strcmp("ViewFit",pMsg) == 0) { viewAll(); return true; } else if (strcmp("Save",pMsg) == 0) { Gui::Document *doc = getGuiDocument(); if (doc) { doc->save(); return true; } } else if (strcmp("SaveAs",pMsg) == 0) { Gui::Document *doc = getGuiDocument(); if (doc) { doc->saveAs(); return true; } } else if(strcmp("Undo",pMsg) == 0 ) { Gui::Document *doc = getGuiDocument(); if (doc) { doc->undo(1); return true; } } else if(strcmp("Redo",pMsg) == 0 ) { Gui::Document *doc = getGuiDocument(); if (doc) { doc->redo(1); return true; } } return false; }
bool SweepWidget::accept() { if (d->loop.isRunning()) return false; Gui::SelectionFilter edgeFilter ("SELECT Part::Feature SUBELEMENT Edge COUNT 1.."); Gui::SelectionFilter partFilter ("SELECT Part::Feature COUNT 1"); bool matchEdge = edgeFilter.match(); bool matchPart = partFilter.match(); if (!matchEdge && !matchPart) { QMessageBox::critical(this, tr("Sweep path"), tr("Select one or more connected edges you want to sweep along.")); return false; } // get the selected object std::string selection; std::string spineObject, spineLabel; const std::vector<Gui::SelectionObject>& result = matchEdge ? edgeFilter.Result[0] : partFilter.Result[0]; selection = result.front().getAsPropertyLinkSubString(); spineObject = result.front().getFeatName(); spineLabel = result.front().getObject()->Label.getValue(); QString list, solid, frenet; if (d->ui.checkSolid->isChecked()) solid = QString::fromLatin1("True"); else solid = QString::fromLatin1("False"); if (d->ui.checkFrenet->isChecked()) frenet = QString::fromLatin1("True"); else frenet = QString::fromLatin1("False"); QTextStream str(&list); int count = d->ui.selector->selectedTreeWidget()->topLevelItemCount(); if (count < 1) { QMessageBox::critical(this, tr("Too few elements"), tr("At least one edge or wire is required.")); return false; } for (int i=0; i<count; i++) { QTreeWidgetItem* child = d->ui.selector->selectedTreeWidget()->topLevelItem(i); QString name = child->data(0, Qt::UserRole).toString(); if (name == QLatin1String(spineObject.c_str())) { QMessageBox::critical(this, tr("Wrong selection"), tr("'%1' cannot be used as profile and path.") .arg(QString::fromUtf8(spineLabel.c_str()))); return false; } str << "App.getDocument('" << d->document.c_str() << "')." << name << ", "; } try { Gui::WaitCursor wc; QString cmd; cmd = QString::fromLatin1( "App.getDocument('%5').addObject('Part::Sweep','Sweep')\n" "App.getDocument('%5').ActiveObject.Sections=[%1]\n" "App.getDocument('%5').ActiveObject.Spine=%2\n" "App.getDocument('%5').ActiveObject.Solid=%3\n" "App.getDocument('%5').ActiveObject.Frenet=%4\n" ) .arg(list) .arg(QLatin1String(selection.c_str())) .arg(solid) .arg(frenet) .arg(QString::fromLatin1(d->document.c_str())); Gui::Document* doc = Gui::Application::Instance->getDocument(d->document.c_str()); if (!doc) throw Base::Exception("Document doesn't exist anymore"); doc->openCommand("Sweep"); Gui::Application::Instance->runPythonCode((const char*)cmd.toLatin1(), false, false); doc->getDocument()->recompute(); App::DocumentObject* obj = doc->getDocument()->getActiveObject(); if (obj && !obj->isValid()) { std::string msg = obj->getStatusString(); doc->abortCommand(); throw Base::Exception(msg); } doc->commitCommand(); } catch (const Base::Exception& e) { QMessageBox::warning(this, tr("Input error"), QString::fromLatin1(e.what())); return false; } return true; }
/** * Constructs a VisualInspection as a child of 'parent', with the * name 'name' and widget flags set to 'f'. */ VisualInspection::VisualInspection(QWidget* parent, Qt::WindowFlags fl) : QDialog(parent, fl), ui(new Ui_VisualInspection) { ui->setupUi(this); connect(ui->treeWidgetActual, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(onActivateItem(QTreeWidgetItem*))); connect(ui->treeWidgetNominal, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(onActivateItem(QTreeWidgetItem*))); connect(ui->buttonBox, SIGNAL(helpRequested()), Gui::getMainWindow(), SLOT(whatsThis())); //FIXME: Not used yet ui->textLabel2->hide(); ui->thickness->hide(); ui->searchRadius->setUnit(Base::Unit::Length); ui->searchRadius->setRange(0, DBL_MAX); ui->thickness->setUnit(Base::Unit::Length); ui->thickness->setRange(0, DBL_MAX); App::Document* doc = App::GetApplication().getActiveDocument(); // disable Ok button and enable of at least one item in each view is on buttonOk = ui->buttonBox->button(QDialogButtonBox::Ok); buttonOk->setDisabled(true); if (!doc) { ui->treeWidgetActual->setDisabled(true); ui->treeWidgetNominal->setDisabled(true); return; } Gui::Document* gui = Gui::Application::Instance->getDocument(doc); std::vector<App::DocumentObject*> obj = doc->getObjects(); Base::Type point = Base::Type::fromName("Points::Feature"); Base::Type mesh = Base::Type::fromName("Mesh::Feature"); Base::Type shape = Base::Type::fromName("Part::Feature"); for (std::vector<App::DocumentObject*>::iterator it = obj.begin(); it != obj.end(); ++it) { if ((*it)->getTypeId().isDerivedFrom(point) || (*it)->getTypeId().isDerivedFrom(mesh) || (*it)->getTypeId().isDerivedFrom(shape)) { Gui::ViewProvider* view = gui->getViewProvider(*it); QIcon px = view->getIcon(); SingleSelectionItem* item1 = new SingleSelectionItem(ui->treeWidgetActual); item1->setText(0, QString::fromUtf8((*it)->Label.getValue())); item1->setData(0, Qt::UserRole, QString::fromLatin1((*it)->getNameInDocument())); item1->setCheckState(0, Qt::Unchecked); item1->setIcon(0, px); SingleSelectionItem* item2 = new SingleSelectionItem(ui->treeWidgetNominal); item2->setText(0, QString::fromUtf8((*it)->Label.getValue())); item2->setData(0, Qt::UserRole, QString::fromLatin1((*it)->getNameInDocument())); item2->setCheckState(0, Qt::Unchecked); item2->setIcon(0, px); item1->setCompetitiveItem(item2); item2->setCompetitiveItem(item1); } } loadSettings(); }
void Placement::slotActiveDocument(const Gui::Document& doc) { documents.insert(doc.getDocument()->getName()); }
Gui::MDIView* ViewProviderDocumentObject::getViewOfNode(SoNode* node) const { App::Document* pAppDoc = pcObject->getDocument(); Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(pAppDoc); return pGuiDoc->getViewOfNode(node); }
Gui::MDIView* ViewProviderDocumentObject::getEditingView() const { App::Document* pAppDoc = pcObject->getDocument(); Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(pAppDoc); return pGuiDoc->getEditingViewOfViewProvider(const_cast<ViewProviderDocumentObject*>(this)); }
void PropertyView::onSelectionChanged(const SelectionChanges& msg) { if (msg.Type != SelectionChanges::AddSelection && msg.Type != SelectionChanges::RmvSelection && msg.Type != SelectionChanges::SetSelection && msg.Type != SelectionChanges::ClrSelection) return; // group the properties by <name,id> std::map<std::pair<std::string, int>, std::vector<App::Property*> > propDataMap; std::map<std::pair<std::string, int>, std::vector<App::Property*> > propViewMap; std::vector<SelectionSingleton::SelObj> array = Gui::Selection().getCompleteSelection(); for (std::vector<SelectionSingleton::SelObj>::const_iterator it = array.begin(); it != array.end(); ++it) { App::DocumentObject *ob=0; ViewProvider *vp=0; std::map<std::string,App::Property*> dataMap; std::map<std::string,App::Property*> viewMap; if ((*it).pObject) { (*it).pObject->getPropertyMap(dataMap); ob = (*it).pObject; // get also the properties of the associated view provider Gui::Document* doc = Gui::Application::Instance->getDocument(it->pDoc); vp = doc->getViewProvider((*it).pObject); if(!vp) continue; vp->getPropertyMap(viewMap); } // store the properties with <name,id> as key in a map std::map<std::string,App::Property*>::iterator pt; if (ob) { for (pt = dataMap.begin(); pt != dataMap.end(); ++pt) { std::pair<std::string, int> nameType = std::make_pair <std::string, int>(pt->first, pt->second->getTypeId().getKey()); if (!ob->isHidden(pt->second) && !pt->second->StatusBits.test(3)) propDataMap[nameType].push_back(pt->second); } } // the same for the view properties if (vp) { for(pt = viewMap.begin(); pt != viewMap.end(); ++pt) { std::pair<std::string, int> nameType = std::make_pair <std::string, int>( pt->first, pt->second->getTypeId().getKey()); if (!vp->isHidden(pt->second) && !pt->second->StatusBits.test(3)) propViewMap[nameType].push_back(pt->second); } } } // the property must be part of each selected object, i.e. the number // of selected objects is equal to the number of properties with same // name and id std::map<std::pair<std::string, int>, std::vector<App::Property*> > ::const_iterator it; std::map<std::string, std::vector<App::Property*> > dataProps; for (it = propDataMap.begin(); it != propDataMap.end(); ++it) { if (it->second.size() == array.size()) { dataProps[it->first.first] = it->second; } } propertyEditorData->buildUp(dataProps); std::map<std::string, std::vector<App::Property*> > viewProps; for (it = propViewMap.begin(); it != propViewMap.end(); ++it) { if (it->second.size() == array.size()) { viewProps[it->first.first] = it->second; } } propertyEditorView->buildUp(viewProps); }
void VisualInspection::accept() { onActivateItem(0); if (buttonOk->isEnabled()) { QDialog::accept(); saveSettings(); // collect all nominal geometries QStringList nominalNames; for (QTreeWidgetItemIterator it(ui->treeWidgetNominal); *it; it++) { SingleSelectionItem* sel = (SingleSelectionItem*)*it; if (sel->checkState(0) == Qt::Checked) nominalNames << sel->data(0, Qt::UserRole).toString(); } double searchRadius = ui->searchRadius->value().getValue(); double thickness = ui->thickness->value().getValue(); // open a new command Gui::Document* doc = Gui::Application::Instance->activeDocument(); doc->openCommand("Visual Inspection"); // create a group Gui::Command::runCommand( Gui::Command::App, "App_activeDocument___InspectionGroup=App.ActiveDocument.addObject(\"Inspection::Group\",\"Inspection\")"); // for each actual geometry create an inspection feature for (QTreeWidgetItemIterator it(ui->treeWidgetActual); *it; it++) { SingleSelectionItem* sel = (SingleSelectionItem*)*it; if (sel->checkState(0) == Qt::Checked) { QString actualName = sel->data(0, Qt::UserRole).toString(); Gui::Command::doCommand(Gui::Command::App, "App_activeDocument___InspectionGroup.newObject(\"Inspection::Feature\",\"%s_Inspect\")", (const char*)actualName.toLatin1()); Gui::Command::doCommand(Gui::Command::App, "App.ActiveDocument.ActiveObject.Actual=App.ActiveDocument.%s\n" "App_activeDocument___activeObject___Nominals=list()\n" "App.ActiveDocument.ActiveObject.SearchRadius=%.3f\n" "App.ActiveDocument.ActiveObject.Thickness=%.3f\n", (const char*)actualName.toLatin1(), searchRadius, thickness); for (QStringList::Iterator it = nominalNames.begin(); it != nominalNames.end(); ++it) { Gui::Command::doCommand(Gui::Command::App, "App_activeDocument___activeObject___Nominals.append(App.ActiveDocument.%s)\n", (const char*)(*it).toLatin1()); } Gui::Command::doCommand(Gui::Command::App, "App.ActiveDocument.ActiveObject.Nominals=App_activeDocument___activeObject___Nominals\n" "del App_activeDocument___activeObject___Nominals\n"); } } Gui::Command::runCommand(Gui::Command::App, "del App_activeDocument___InspectionGroup\n"); doc->commitCommand(); doc->getDocument()->recompute(); // hide the checked features for (QTreeWidgetItemIterator it(ui->treeWidgetActual); *it; it++) { SingleSelectionItem* sel = (SingleSelectionItem*)*it; if (sel->checkState(0) == Qt::Checked) { Gui::Command::doCommand(Gui::Command::App , "Gui.ActiveDocument.getObject(\"%s\").Visibility=False" , (const char*)sel->data(0, Qt::UserRole).toString().toLatin1()); } } for (QTreeWidgetItemIterator it(ui->treeWidgetNominal); *it; it++) { SingleSelectionItem* sel = (SingleSelectionItem*)*it; if (sel->checkState(0) == Qt::Checked) { Gui::Command::doCommand(Gui::Command::App , "Gui.ActiveDocument.getObject(\"%s\").Visibility=False" , (const char*)sel->data(0, Qt::UserRole).toString().toLatin1()); } } } }
void CmdPartDesignBody::activated(int iMsg) { Q_UNUSED(iMsg); if ( !PartDesignGui::assureModernWorkflow( getDocument() ) ) return; App::Part *actPart = PartDesignGui::getActivePart (); App::Part* partOfBaseFeature = nullptr; std::vector<App::DocumentObject*> features = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()); App::DocumentObject* baseFeature = nullptr; bool viewAll = features.empty(); if (!features.empty()) { if (features.size() == 1) { baseFeature = features[0]; if ( baseFeature->isDerivedFrom ( PartDesign::Feature::getClassTypeId() ) && PartDesign::Body::findBodyOf ( baseFeature ) ) { // Prevent creating bodies based on features already belonging to other bodies QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Body can't be based on a PartDesign feature.")); baseFeature = nullptr; } else if (PartDesign::Body::findBodyOf ( baseFeature )){ QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("%1 already belongs to a body, can't use it as base feature for another body.") .arg(QString::fromUtf8(baseFeature->Label.getValue()))); baseFeature = nullptr; } else if ( baseFeature->isDerivedFrom ( Part::BodyBase::getClassTypeId() ) ) { // Prevent creating bodies based on bodies QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Body can't be based on another body.")); baseFeature = nullptr; } else { partOfBaseFeature = App::Part::getPartOfObject(baseFeature); if (partOfBaseFeature != 0 && partOfBaseFeature != actPart){ //prevent cross-part mess QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Base feature (%1) belongs to other part.") .arg(QString::fromUtf8(baseFeature->Label.getValue()))); baseFeature = nullptr; }; } } else { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Bad base feature"), QObject::tr("Body may be based no more than on one feature.")); return; } } openCommand("Add a Body"); std::string bodyName = getUniqueObjectName("Body"); // add the Body feature itself, and make it active doCommand(Doc,"App.activeDocument().addObject('PartDesign::Body','%s')", bodyName.c_str()); if (baseFeature) { if (partOfBaseFeature){ //withdraw base feature from Part, otherwise visibility mandess results doCommand(Doc,"App.activeDocument().%s.removeObject(App.activeDocument().%s)", partOfBaseFeature->getNameInDocument(), baseFeature->getNameInDocument()); } doCommand(Doc,"App.activeDocument().%s.BaseFeature = App.activeDocument().%s", bodyName.c_str(), baseFeature->getNameInDocument()); } addModule(Gui,"PartDesignGui"); // import the Gui module only once a session doCommand(Gui::Command::Gui, "Gui.activeView().setActiveObject('%s', App.activeDocument().%s)", PDBODYKEY, bodyName.c_str()); // Make the "Create sketch" prompt appear in the task panel doCommand(Gui,"Gui.Selection.clearSelection()"); doCommand(Gui,"Gui.Selection.addSelection(App.ActiveDocument.%s)", bodyName.c_str()); if (actPart) { doCommand(Doc,"App.activeDocument().%s.addObject(App.ActiveDocument.%s)", actPart->getNameInDocument(), bodyName.c_str()); } // The method 'SoCamera::viewBoundingBox' is still declared as protected in Coin3d versions // older than 4.0. #if COIN_MAJOR_VERSION >= 4 // if no part feature was there then auto-adjust the camera if (viewAll) { Gui::Document* doc = Gui::Application::Instance->getDocument(getDocument()); Gui::View3DInventor* view = doc ? qobject_cast<Gui::View3DInventor*>(doc->getActiveView()) : nullptr; if (view) { SoCamera* camera = view->getViewer()->getCamera(); SbViewportRegion vpregion = view->getViewer()->getViewportRegion(); float aspectratio = vpregion.getViewportAspectRatio(); float size = Gui::ViewProviderOrigin::defaultSize(); SbBox3f bbox; bbox.setBounds(-size,-size,-size,size,size,size); camera->viewBoundingBox(bbox, aspectratio, 1.0f); } } #endif updateActive(); }
void Workbench::slotActiveDocument(const Gui::Document& Doc) { switchToDocument(Doc.getDocument()); }
void ViewProviderBody::updateOriginDatumSize () { PartDesign::Body *body = static_cast<PartDesign::Body *> ( getObject() ); // Use different bounding boxes for datums and for origins: Gui::Document* gdoc = Gui::Application::Instance->getDocument(getObject()->getDocument()); if(!gdoc) return; Gui::MDIView* view = gdoc->getViewOfViewProvider(this); if(!view) return; Gui::View3DInventorViewer* viewer = static_cast<Gui::View3DInventor*>(view)->getViewer(); SoGetBoundingBoxAction bboxAction(viewer->getSoRenderManager()->getViewportRegion()); const auto & model = body->getFullModel (); // BBox for Datums is calculated from all visible objects but treating datums as their basepoints only SbBox3f bboxDatums = ViewProviderDatum::getRelevantBoundBox ( bboxAction, model ); // BBox for origin should take into account datums size also SbBox3f bboxOrigins = bboxDatums; for(App::DocumentObject* obj : model) { if ( obj->isDerivedFrom ( Part::Datum::getClassTypeId () ) ) { ViewProvider *vp = Gui::Application::Instance->getViewProvider(obj); if (!vp) { continue; } ViewProviderDatum *vpDatum = static_cast <ViewProviderDatum *> (vp) ; vpDatum->setExtents ( bboxDatums ); bboxAction.apply ( vp->getRoot () ); bboxOrigins.extendBy ( bboxAction.getBoundingBox () ); } } // get the bounding box values SbVec3f max = bboxOrigins.getMax(); SbVec3f min = bboxOrigins.getMin(); // obtain an Origin and it's ViewProvider App::Origin* origin = 0; Gui::ViewProviderOrigin* vpOrigin = 0; try { origin = body->getOrigin (); assert (origin); Gui::ViewProvider *vp = Gui::Application::Instance->getViewProvider(origin); if (!vp) { throw Base::Exception ("No view provider linked to the Origin"); } assert ( vp->isDerivedFrom ( Gui::ViewProviderOrigin::getClassTypeId () ) ); vpOrigin = static_cast <Gui::ViewProviderOrigin *> ( vp ); } catch (const Base::Exception &ex) { Base::Console().Error ("%s\n", ex.what() ); return; } // calculate the desired origin size Base::Vector3d size; for (uint_fast8_t i=0; i<3; i++) { size[i] = std::max ( fabs ( max[i] ), fabs ( min[i] ) ); if (size[i] < Precision::Confusion() ) { size[i] = Gui::ViewProviderOrigin::defaultSize(); } } vpOrigin->Size.setValue ( size*1.2 ); }
void DlgEvaluateMeshImp::on_repairAllTogether_clicked() { if (d->meshFeature) { Gui::WaitCursor wc; const char* docName = App::GetApplication().getDocumentName(d->meshFeature->getDocument()); const char* objName = d->meshFeature->getNameInDocument(); Gui::Document* doc = Gui::Application::Instance->getDocument(docName); doc->openCommand("Repair mesh"); bool run = false; bool self = true; int max_iter=10; const MeshKernel& rMesh = d->meshFeature->Mesh.getValue().getKernel(); try { do { run = false; { MeshEvalSelfIntersection eval(rMesh); if (self && !eval.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").fixSelfIntersections()", docName, objName); run = true; } else { self = false; // once no self-intersections found do not repeat it later on } qApp->processEvents(); } { MeshEvalFoldsOnSurface s_eval(rMesh); MeshEvalFoldsOnBoundary b_eval(rMesh); MeshEvalFoldOversOnSurface f_eval(rMesh); if (!s_eval.Evaluate() || !b_eval.Evaluate() || !f_eval.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").removeFoldsOnSurface()", docName, objName); run = true; } qApp->processEvents(); } { MeshEvalOrientation eval(rMesh); if (!eval.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").harmonizeNormals()", docName, objName); run = true; } qApp->processEvents(); } { MeshEvalTopology eval(rMesh); if (!eval.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").removeNonManifolds()", docName, objName); run = true; } qApp->processEvents(); } { MeshEvalRangeFacet rf(rMesh); MeshEvalRangePoint rp(rMesh); MeshEvalCorruptedFacets cf(rMesh); MeshEvalNeighbourhood nb(rMesh); if (!rf.Evaluate() || !rp.Evaluate() || !cf.Evaluate() || !nb.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").fixIndices()", docName, objName); run = true; } } { MeshEvalDegeneratedFacets eval(rMesh); if (!eval.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").fixDegenerations()", docName, objName); run = true; } qApp->processEvents(); } { MeshEvalDuplicateFacets eval(rMesh); if (!eval.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").removeDuplicatedFacets()", docName, objName); run = true; } qApp->processEvents(); } { MeshEvalDuplicatePoints eval(rMesh); if (!eval.Evaluate()) { Gui::Application::Instance->runCommand(true, "App.getDocument(\"%s\").getObject(\"%s\").removeDuplicatedPoints()", docName, objName); run = true; } qApp->processEvents(); } } while(checkRepeatButton->isChecked() && run && (--max_iter > 0)); } catch (const Base::Exception& e) { QMessageBox::warning(this, tr("Mesh repair"), QString::fromLatin1(e.what())); } catch (...) { QMessageBox::warning(this, tr("Mesh repair"), QString::fromLatin1("Unknown error occurred.")); } doc->commitCommand(); doc->getDocument()->recompute(); } }
void SweepWidget::findShapes() { App::Document* activeDoc = App::GetApplication().getActiveDocument(); Gui::Document* activeGui = Gui::Application::Instance->getDocument(activeDoc); if (!activeGui) return; d->document = activeDoc->getName(); std::vector<Part::Feature*> objs = activeDoc->getObjectsOfType<Part::Feature>(); for (std::vector<Part::Feature*>::iterator it = objs.begin(); it!=objs.end(); ++it) { TopoDS_Shape shape = (*it)->Shape.getValue(); if (shape.IsNull()) continue; // also allow compounds with a single face, wire or vertex or // if there are only edges building one wire if (shape.ShapeType() == TopAbs_COMPOUND) { Handle(TopTools_HSequenceOfShape) hEdges = new TopTools_HSequenceOfShape(); Handle(TopTools_HSequenceOfShape) hWires = new TopTools_HSequenceOfShape(); TopoDS_Iterator it(shape); int numChilds=0; TopoDS_Shape child; for (; it.More(); it.Next(), numChilds++) { if (!it.Value().IsNull()) { child = it.Value(); if (child.ShapeType() == TopAbs_EDGE) { hEdges->Append(child); } } } // a single child if (numChilds == 1) { shape = child; } // or all children are edges else if (hEdges->Length() == numChilds) { ShapeAnalysis_FreeBounds::ConnectEdgesToWires(hEdges, Precision::Confusion(), Standard_False, hWires); if (hWires->Length() == 1) shape = hWires->Value(1); } } if (shape.ShapeType() == TopAbs_FACE || shape.ShapeType() == TopAbs_WIRE || shape.ShapeType() == TopAbs_EDGE || shape.ShapeType() == TopAbs_VERTEX) { QString label = QString::fromUtf8((*it)->Label.getValue()); QString name = QString::fromLatin1((*it)->getNameInDocument()); QTreeWidgetItem* child = new QTreeWidgetItem(); child->setText(0, label); child->setToolTip(0, label); child->setData(0, Qt::UserRole, name); Gui::ViewProvider* vp = activeGui->getViewProvider(*it); if (vp) child->setIcon(0, vp->getIcon()); d->ui.selector->availableTreeWidget()->addTopLevelItem(child); } } }
bool SweepWidget::accept() { Gui::SelectionFilter edgeFilter ("SELECT Part::Feature SUBELEMENT Edge COUNT 1.."); Gui::SelectionFilter partFilter ("SELECT Part::Feature COUNT 1"); bool matchEdge = edgeFilter.match(); bool matchPart = partFilter.match(); if (!matchEdge && !matchPart) { QMessageBox::critical(this, tr("Sweep path"), tr("Select an edge or wire you want to sweep along.")); return false; } // get the selected object std::string selection; if (matchEdge) { const std::vector<Gui::SelectionObject>& result = edgeFilter.Result[0]; selection = result.front().getAsPropertyLinkSubString(); } else { const std::vector<Gui::SelectionObject>& result = partFilter.Result[0]; selection = result.front().getAsPropertyLinkSubString(); } QString list, solid, frenet; if (d->ui.checkSolid->isChecked()) solid = QString::fromAscii("True"); else solid = QString::fromAscii("False"); if (d->ui.checkFrenet->isChecked()) frenet = QString::fromAscii("True"); else frenet = QString::fromAscii("False"); QTextStream str(&list); int count = d->ui.selector->selectedTreeWidget()->topLevelItemCount(); if (count < 1) { QMessageBox::critical(this, tr("Too few elements"), tr("At least one edge or wire is required.")); return false; } for (int i=0; i<count; i++) { QTreeWidgetItem* child = d->ui.selector->selectedTreeWidget()->topLevelItem(i); QString name = child->data(0, Qt::UserRole).toString(); str << "App.getDocument('" << d->document.c_str() << "')." << name << ", "; } try { QString cmd; cmd = QString::fromAscii( "App.getDocument('%5').addObject('Part::Sweep','Sweep')\n" "App.getDocument('%5').ActiveObject.Sections=[%1]\n" "App.getDocument('%5').ActiveObject.Spine=%2\n" "App.getDocument('%5').ActiveObject.Solid=%3\n" "App.getDocument('%5').ActiveObject.Frenet=%4\n" ) .arg(list) .arg(QLatin1String(selection.c_str())) .arg(solid) .arg(frenet) .arg(QString::fromAscii(d->document.c_str())); Gui::Document* doc = Gui::Application::Instance->getDocument(d->document.c_str()); if (!doc) throw Base::Exception("Document doesn't exist anymore"); doc->openCommand("Sweep"); Gui::Application::Instance->runPythonCode((const char*)cmd.toAscii(), false, false); doc->commitCommand(); doc->getDocument()->recompute(); } catch (const Base::Exception& e) { Base::Console().Error("%s\n", e.what()); return false; } return true; }
bool FaceColors::accept() { Gui::Document* doc = Gui::Application::Instance->getDocument(d->vp->getObject()->getDocument()); doc->resetEdit(); return true; }
void PropertyView::onSelectionChanged(const SelectionChanges& msg) { if (msg.Type != SelectionChanges::AddSelection && msg.Type != SelectionChanges::RmvSelection && msg.Type != SelectionChanges::SetSelection && msg.Type != SelectionChanges::ClrSelection) return; // group the properties by <name,id> std::vector<PropInfo> propDataMap; std::vector<PropInfo> propViewMap; std::vector<SelectionSingleton::SelObj> array = Gui::Selection().getCompleteSelection(); for (std::vector<SelectionSingleton::SelObj>::const_iterator it = array.begin(); it != array.end(); ++it) { App::DocumentObject *ob=0; ViewProvider *vp=0; std::vector<App::Property*> dataList; std::map<std::string, App::Property*> viewList; if ((*it).pObject) { (*it).pObject->getPropertyList(dataList); ob = (*it).pObject; // get also the properties of the associated view provider Gui::Document* doc = Gui::Application::Instance->getDocument(it->pDoc); vp = doc->getViewProvider((*it).pObject); if(!vp) continue; // get the properties as map here because it doesn't matter to have them sorted alphabetically vp->getPropertyMap(viewList); } // store the properties with <name,id> as key in a map std::vector<App::Property*>::iterator pt; if (ob) { for (pt = dataList.begin(); pt != dataList.end(); ++pt) { PropInfo nameType; nameType.propName = ob->getPropertyName(*pt); nameType.propId = (*pt)->getTypeId().getKey(); if (!ob->isHidden(*pt) && !(*pt)->testStatus(App::Property::Hidden)) { std::vector<PropInfo>::iterator pi = std::find_if(propDataMap.begin(), propDataMap.end(), PropFind(nameType)); if (pi != propDataMap.end()) { pi->propList.push_back(*pt); } else { nameType.propList.push_back(*pt); propDataMap.push_back(nameType); } } } } // the same for the view properties if (vp) { std::map<std::string, App::Property*>::iterator pt; for (pt = viewList.begin(); pt != viewList.end(); ++pt) { PropInfo nameType; nameType.propName = pt->first; nameType.propId = pt->second->getTypeId().getKey(); if (!vp->isHidden(pt->second) && !pt->second->testStatus(App::Property::Hidden)) { std::vector<PropInfo>::iterator pi = std::find_if(propViewMap.begin(), propViewMap.end(), PropFind(nameType)); if (pi != propViewMap.end()) { pi->propList.push_back(pt->second); } else { nameType.propList.push_back(pt->second); propViewMap.push_back(nameType); } } } } } // the property must be part of each selected object, i.e. the number // of selected objects is equal to the number of properties with same // name and id std::vector<PropInfo>::const_iterator it; PropertyModel::PropertyList dataProps; for (it = propDataMap.begin(); it != propDataMap.end(); ++it) { if (it->propList.size() == array.size()) { dataProps.push_back(std::make_pair(it->propName, it->propList)); } } propertyEditorData->buildUp(dataProps); PropertyModel::PropertyList viewProps; for (it = propViewMap.begin(); it != propViewMap.end(); ++it) { if (it->propList.size() == array.size()) { viewProps.push_back(std::make_pair(it->propName, it->propList)); } } propertyEditorView->buildUp(viewProps); }
void CmdShapeInfo::activated(int iMsg) { static const char * const part_pipette[]={ "32 32 17 1", "# c #000000", "j c #080808", "b c #101010", "f c #1c1c1c", "g c #4c4c4c", "c c #777777", "a c #848484", "i c #9c9c9c", "l c #b9b9b9", "e c #cacaca", "n c #d6d6d6", "k c #dedede", "d c #e7e7e7", "m c #efefef", "h c #f7f7f7", "w c #ffffff", ". c None", "................................", ".....................#####......", "...................#######......", "...................#########....", "..................##########....", "..................##########....", "..................##########....", ".................###########....", "...............#############....", ".............###############....", ".............#############......", ".............#############......", "...............ab######.........", "..............cdef#####.........", ".............ghdacf####.........", "............#ehiacj####.........", "............awiaaf####..........", "...........iheacf##.............", "..........#kdaag##..............", ".........gedaacb#...............", ".........lwiac##................", ".......#amlaaf##................", ".......cheaag#..................", "......#ndaag##..................", ".....#imaacb#...................", ".....iwlacf#....................", "....#nlaag##....................", "....feaagj#.....................", "....caag##......................", "....ffbj##......................", "................................", "................................"}; Gui::Document* doc = Gui::Application::Instance->activeDocument(); Gui::View3DInventor* view = static_cast<Gui::View3DInventor*>(doc->getActiveView()); //if (view) { // Gui::View3DInventorViewer* viewer = view->getViewer(); // viewer->setEditing(true); // viewer->getWidget()->setCursor(QCursor(QPixmap(part_pipette),4,29)); // viewer->addEventCallback(SoMouseButtonEvent::getClassTypeId(), PartGui::ViewProviderPart::shapeInfoCallback); // } }
Gui::MDIView* ViewProviderDocumentObject::getActiveView() const { App::Document* pAppDoc = pcObject->getDocument(); Gui::Document* pGuiDoc = Gui::Application::Instance->getDocument(pAppDoc); return pGuiDoc->getActiveView(); }
void Placement::applyPlacement(const Base::Placement& p, bool incremental, bool data) { Gui::Document* document = Application::Instance->activeDocument(); if (!document) return; std::vector<App::DocumentObject*> sel = Gui::Selection().getObjectsOfType (App::DocumentObject::getClassTypeId(), document->getDocument()->getName()); if (!sel.empty()) { if (data) { document->openCommand("Placement"); for (std::vector<App::DocumentObject*>::iterator it=sel.begin();it!=sel.end();++it) { std::map<std::string,App::Property*> props; (*it)->getPropertyMap(props); // search for the placement property std::map<std::string,App::Property*>::iterator jt; jt = std::find_if(props.begin(), props.end(), find_placement(this->propertyName)); if (jt != props.end()) { Base::Placement cur = static_cast<App::PropertyPlacement*>(jt->second)->getValue(); if (incremental) cur = p * cur; else cur = p; Base::Vector3d pos = cur.getPosition(); const Base::Rotation& rt = cur.getRotation(); QString cmd = QString::fromAscii( "App.getDocument(\"%1\").%2.Placement=" "App.Placement(" "App.Vector(%3,%4,%5)," "App.Rotation(%6,%7,%8,%9))\n") .arg(QLatin1String((*it)->getDocument()->getName())) .arg(QLatin1String((*it)->getNameInDocument())) .arg(pos.x,0,'g',6) .arg(pos.y,0,'g',6) .arg(pos.z,0,'g',6) .arg(rt[0],0,'g',6) .arg(rt[1],0,'g',6) .arg(rt[2],0,'g',6) .arg(rt[3],0,'g',6); Application::Instance->runPythonCode((const char*)cmd.toAscii()); } } document->commitCommand(); try { document->getDocument()->recompute(); } catch (...) { } } // apply transformation only on view matrix not on placement property else { for (std::vector<App::DocumentObject*>::iterator it=sel.begin();it!=sel.end();++it) { std::map<std::string,App::Property*> props; (*it)->getPropertyMap(props); // search for the placement property std::map<std::string,App::Property*>::iterator jt; jt = std::find_if(props.begin(), props.end(), find_placement(this->propertyName)); if (jt != props.end()) { Base::Placement cur = static_cast<App::PropertyPlacement*>(jt->second)->getValue(); if (incremental) cur = p * cur; else cur = p; Gui::ViewProvider* vp = document->getViewProvider(*it); if (vp) vp->setTransformation(cur.toMatrix()); } } } } else { Base::Console().Warning("No object selected.\n"); } }