void getReferencedSelection(const App::DocumentObject* thisObj, const Gui::SelectionChanges& msg, App::DocumentObject*& selObj, std::vector<std::string>& selSub) { if (strcmp(thisObj->getDocument()->getName(), msg.pDocName) != 0) return; selObj = thisObj->getDocument()->getObject(msg.pObjectName); if (selObj == thisObj) return; std::string subname = msg.pSubName; //check if the selection is an external reference and ask the user what to do //of course only if thisObj is in a body, as otherwise the old workflow would not //be supportet PartDesign::Body* body = PartDesignGui::getBodyFor(thisObj, false); bool originfeature = selObj->isDerivedFrom(App::OriginFeature::getClassTypeId()); if(!originfeature && body) { PartDesign::Body* selBody = PartDesignGui::getBodyFor(selObj, false); if(!selBody || body != selBody) { auto* pcActivePart = PartDesignGui::getPartFor(body, false); QDialog* dia = new QDialog; Ui_Dialog dlg; dlg.setupUi(dia); dia->setModal(true); int result = dia->exec(); if(result == QDialog::DialogCode::Rejected) { selObj = NULL; return; } else if(!dlg.radioXRef->isChecked()) { auto copy = PartDesignGui::TaskFeaturePick::makeCopy(selObj, subname, dlg.radioIndependent->isChecked()); if(selBody) body->addFeature(copy); else pcActivePart->addObject(copy); selObj = copy; subname.erase(std::remove_if(subname.begin(), subname.end(), &isdigit), subname.end()); subname.append("1"); } } } // Remove subname for planes and datum features if (PartDesign::Feature::isDatum(selObj)) { subname = ""; } selSub = std::vector<std::string>(1,subname); }
CFrmSettings::CFrmSettings() { this->gvc = gvContext(); Ui_Dialog tempDia; tempDia.setupUi(this); graph = NULL; activeWindow = NULL; QString path; #ifndef WIN32 char *s = getenv("GVEDIT_PATH"); if (s) path = s; else path = GVEDIT_DATADIR; #endif connect(WIDGET(QPushButton, pbAdd), SIGNAL(clicked()), this, SLOT(addSlot())); connect(WIDGET(QPushButton, pbNew), SIGNAL(clicked()), this, SLOT(newSlot())); connect(WIDGET(QPushButton, pbOpen), SIGNAL(clicked()), this, SLOT(openSlot())); connect(WIDGET(QPushButton, pbSave), SIGNAL(clicked()), this, SLOT(saveSlot())); connect(WIDGET(QPushButton, btnOK), SIGNAL(clicked()), this, SLOT(okSlot())); connect(WIDGET(QPushButton, btnCancel), SIGNAL(clicked()), this, SLOT(cancelSlot())); connect(WIDGET(QPushButton, pbOut), SIGNAL(clicked()), this, SLOT(outputSlot())); connect(WIDGET(QPushButton, pbHelp), SIGNAL(clicked()), this, SLOT(helpSlot())); connect(WIDGET(QComboBox, cbScope), SIGNAL(currentIndexChanged(int)), this, SLOT(scopeChangedSlot(int))); scopeChangedSlot(0); #ifndef WIN32 loadAttrs(path + "/attrs.txt", WIDGET(QComboBox, cbNameG), WIDGET(QComboBox, cbNameN), WIDGET(QComboBox, cbNameE)); #else loadAttrs("../share/graphviz/gvedit/attributes.txt", WIDGET(QComboBox, cbNameG), WIDGET(QComboBox, cbNameN), WIDGET(QComboBox, cbNameE)); #endif setWindowIcon(QIcon(":/images/icon.png")); }
bool TaskDlgPipeParameters::accept() { std::string name = vp->getObject()->getNameInDocument(); //see what to do with external references //check the prerequisites for the selected objects //the user has to decide which option we should take if external references are used PartDesign::Pipe* pcPipe = static_cast<PartDesign::Pipe*>(getPipeView()->getObject()); auto pcActiveBody = PartDesignGui::getBodyFor(pcPipe, false); //auto pcActivePart = PartDesignGui::getPartFor(pcActiveBody, false); std::vector<App::DocumentObject*> copies; bool ext = false; if(!pcActiveBody->hasFeature(pcPipe->Spine.getValue()) && !pcActiveBody->getOrigin()->hasObject(pcPipe->Spine.getValue())) ext = true; else if(!pcActiveBody->hasFeature(pcPipe->AuxillerySpine.getValue()) && !pcActiveBody->getOrigin()->hasObject(pcPipe->AuxillerySpine.getValue())) ext = true; else { for(App::DocumentObject* obj : pcPipe->Sections.getValues()) { if(!pcActiveBody->hasFeature(obj) && !pcActiveBody->getOrigin()->hasObject(obj)) ext = true; } } if(ext) { QDialog* dia = new QDialog; Ui_Dialog dlg; dlg.setupUi(dia); dia->setModal(true); int result = dia->exec(); if(result == QDialog::DialogCode::Rejected) return false; else if(!dlg.radioXRef->isChecked()) { if(!pcActiveBody->hasFeature(pcPipe->Spine.getValue()) && !pcActiveBody->getOrigin()->hasObject(pcPipe->Spine.getValue())) { pcPipe->Spine.setValue(PartDesignGui::TaskFeaturePick::makeCopy(pcPipe->Spine.getValue(), "", dlg.radioIndependent->isChecked()), pcPipe->Spine.getSubValues()); copies.push_back(pcPipe->Spine.getValue()); } else if(!pcActiveBody->hasFeature(pcPipe->AuxillerySpine.getValue()) && !pcActiveBody->getOrigin()->hasObject(pcPipe->AuxillerySpine.getValue())){ pcPipe->AuxillerySpine.setValue(PartDesignGui::TaskFeaturePick::makeCopy(pcPipe->AuxillerySpine.getValue(), "", dlg.radioIndependent->isChecked()), pcPipe->AuxillerySpine.getSubValues()); copies.push_back(pcPipe->AuxillerySpine.getValue()); } std::vector<App::DocumentObject*> objs; int index = 0; for(App::DocumentObject* obj : pcPipe->Sections.getValues()) { if(!pcActiveBody->hasFeature(obj) && !pcActiveBody->getOrigin()->hasObject(obj)) { objs.push_back(PartDesignGui::TaskFeaturePick::makeCopy(obj, "", dlg.radioIndependent->isChecked())); copies.push_back(objs.back()); } else objs.push_back(obj); index++; } pcPipe->Sections.setValues(objs); } } try { Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); if (!vp->getObject()->isValid()) throw Base::Exception(vp->getObject()->getStatusString()); Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()"); Gui::Command::commitCommand(); //we need to add the copied features to the body after the command action, as otherwise freecad crashs unexplainable for(auto obj : copies) { //Dead code: pcActiveBody was previously used without checking for null, so it won't be null here either. //if(pcActiveBody) pcActiveBody->addFeature(obj); //else if (pcActivePart) // pcActivePart->addObject(obj); } } catch (const Base::Exception& e) { QMessageBox::warning(parameter, tr("Input error"), QString::fromUtf8(e.what())); return false; } return true; }
bool TaskDlgDatumParameters::accept() { std::string name = DatumView->getObject()->getNameInDocument(); Part::Datum* pcDatum = static_cast<Part::Datum*>(DatumView->getObject()); auto pcActiveBody = PartDesignGui::getBodyFor(pcDatum, false); auto pcActivePart = PartDesignGui::getPartFor(pcActiveBody, false); std::vector<App::DocumentObject*> copies; //see if we are able to assign a mode if (parameter->getActiveMapMode() == mmDeactivated) { QMessageBox msg; msg.setWindowTitle(tr("Incompatible reference set")); msg.setText(tr("There is no attachment mode that fits the current set" " of references. If you choose to continue, the feature will remain where" " it is now, and will not be moved as the references change." " Continue?")); msg.addButton(QMessageBox::Yes); auto btNo = msg.addButton(QMessageBox::No); msg.setDefaultButton(btNo); msg.setIcon(QMessageBox::Warning); msg.exec(); if (msg.clickedButton() == btNo) return false; } //see what to do with external references //check the prerequisites for the selected objects //the user has to decide which option we should take if external references are used bool ext = false; for(App::DocumentObject* obj : pcDatum->Support.getValues()) { if(!pcActiveBody->hasFeature(obj) && !pcActiveBody->getOrigin()->hasObject(obj)) ext = true; } if(ext) { // TODO rewrite this to be shared with CmdPartDesignNewSketch::activated() (2015-10-20, Fat-Zer) QDialog* dia = new QDialog; Ui_Dialog dlg; dlg.setupUi(dia); dia->setModal(true); int result = dia->exec(); if(result == QDialog::DialogCode::Rejected) return false; else if(!dlg.radioXRef->isChecked()) { std::vector<App::DocumentObject*> objs; std::vector<std::string> subs = pcDatum->Support.getSubValues(); int index = 0; for(App::DocumentObject* obj : pcDatum->Support.getValues()) { if(!pcActiveBody->hasFeature(obj) && !pcActiveBody->getOrigin()->hasObject(obj)) { objs.push_back(PartDesignGui::TaskFeaturePick::makeCopy(obj, subs[index], dlg.radioIndependent->isChecked())); copies.push_back(objs.back()); subs[index] = ""; } else objs.push_back(obj); index++; } pcDatum->Support.setValues(objs, subs); } } try { //DeepSOIC: changed this to heavily rely on dialog constantly updating feature properties if (pcDatum->superPlacement.isTouched()){ Base::Placement plm = pcDatum->superPlacement.getValue(); double yaw, pitch, roll; plm.getRotation().getYawPitchRoll(yaw,pitch,roll); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.superPlacement = App.Placement(App.Vector(%.10f, %.10f, %.10f), App.Rotation(%.10f, %.10f, %.10f))", name.c_str(), plm.getPosition().x, plm.getPosition().y, plm.getPosition().z, yaw, pitch, roll); } Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.MapReversed = %s", name.c_str(), pcDatum->MapReversed.getValue() ? "True" : "False"); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.Support = %s", name.c_str(), pcDatum->Support.getPyReprString().c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.%s.MapMode = '%s'", name.c_str(), AttachEngine::getModeName(eMapMode(pcDatum->MapMode.getValue())).c_str()); Gui::Command::doCommand(Gui::Command::Doc,"App.ActiveDocument.recompute()"); if (!DatumView->getObject()->isValid()) throw Base::Exception(DatumView->getObject()->getStatusString()); Gui::Command::doCommand(Gui::Command::Gui, "Gui.activeDocument().resetEdit()"); Gui::Command::commitCommand(); //we need to add the copied features to the body after the command action, as otherwise freecad crashs unexplainable for(auto obj : copies) { if(pcActiveBody) pcActiveBody->addFeature(obj); else if (pcActivePart) pcActivePart->addObject(obj); } } catch (const Base::Exception& e) { QMessageBox::warning(parameter, tr("Datum dialog: Input error"), QString::fromLatin1(e.what())); return false; } return true; }