PartDesign: Be more helpful if user clicks on a Sketchbased feature icon without having selected any sketch
This commit is contained in:
parent
5db59ce258
commit
858ad6b207
|
@ -54,6 +54,63 @@ using namespace std;
|
|||
|
||||
#include "FeaturePickDialog.h"
|
||||
|
||||
namespace Gui {
|
||||
//===========================================================================
|
||||
// Common utility functions
|
||||
//===========================================================================
|
||||
|
||||
// Take a list of Part2DObjects and erase those which are not eligible for creating a
|
||||
// SketchBased feature. If supportRequired is true, also erase those that cannot be used to define
|
||||
// a Subtractive feature
|
||||
void validateSketches(std::vector<App::DocumentObject*>& sketches, const bool supportRequired)
|
||||
{
|
||||
std::vector<App::DocumentObject*>::iterator s = sketches.begin();
|
||||
|
||||
while (s != sketches.end()) {
|
||||
// Check whether this sketch is already being used by another feature
|
||||
if ((*s)->getInList().size() != 0) {
|
||||
// TODO: Display some information message that this sketch was removed?
|
||||
s = sketches.erase(s);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check whether the sketch shape is valid
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(*s);
|
||||
const TopoDS_Shape& shape = sketch->Shape.getValue();
|
||||
if (shape.IsNull()) {
|
||||
s = sketches.erase(s);
|
||||
continue;
|
||||
// TODO: Display some information message that this sketch was removed?
|
||||
}
|
||||
|
||||
// count free wires
|
||||
int ctWires=0;
|
||||
TopExp_Explorer ex;
|
||||
for (ex.Init(shape, TopAbs_WIRE); ex.More(); ex.Next()) {
|
||||
ctWires++;
|
||||
}
|
||||
if (ctWires == 0) {
|
||||
s = sketches.erase(s);
|
||||
continue;
|
||||
// TODO: Display some information message that this sketch was removed?
|
||||
}
|
||||
|
||||
// Check for support
|
||||
if (supportRequired) {
|
||||
App::DocumentObject* support = sketch->Support.getValue();
|
||||
if (support == NULL) {
|
||||
s = sketches.erase(s);
|
||||
continue;
|
||||
// TODO: Display some information message that this sketch was removed?
|
||||
}
|
||||
}
|
||||
|
||||
// All checks passed - go on to next candidate
|
||||
s++;
|
||||
}
|
||||
}
|
||||
} // namespace Gui
|
||||
|
||||
//===========================================================================
|
||||
// Part_Pad
|
||||
//===========================================================================
|
||||
|
@ -118,37 +175,30 @@ CmdPartDesignPad::CmdPartDesignPad()
|
|||
|
||||
void CmdPartDesignPad::activated(int iMsg)
|
||||
{
|
||||
unsigned int n = getSelection().countObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
if (n != 1) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("Select a sketch or 2D object."));
|
||||
return;
|
||||
}
|
||||
|
||||
std::string FeatName = getUniqueObjectName("Pad");
|
||||
|
||||
std::vector<App::DocumentObject*> Sel = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(Sel.front());
|
||||
const TopoDS_Shape& shape = sketch->Shape.getValue();
|
||||
if (shape.IsNull()) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is empty."));
|
||||
return;
|
||||
}
|
||||
|
||||
// count free wires
|
||||
int ctWires=0;
|
||||
TopExp_Explorer ex;
|
||||
for (ex.Init(shape, TopAbs_WIRE); ex.More(); ex.Next()) {
|
||||
ctWires++;
|
||||
}
|
||||
if (ctWires == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is not a wire."));
|
||||
return;
|
||||
// Get a valid sketch from the user
|
||||
// First check selections
|
||||
std::vector<App::DocumentObject*> sketches = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, false);
|
||||
// Next let the user choose from a list of all eligible objects
|
||||
if (sketches.size() == 0) {
|
||||
sketches = getDocument()->getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, false);
|
||||
if (sketches.size() == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid sketches in this document"),
|
||||
QObject::tr("Please create a sketch or 2D object first"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// If there is more than one selection/possibility, show dialog and let user pick sketch
|
||||
if (sketches.size() > 1) {
|
||||
PartDesignGui::FeaturePickDialog Dlg(sketches);
|
||||
if ((Dlg.exec() != QDialog::Accepted) || (sketches = Dlg.getFeatures()).empty())
|
||||
return; // Cancelled or nothing selected
|
||||
}
|
||||
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(sketches.front());
|
||||
App::DocumentObject* support = sketch->Support.getValue();
|
||||
std::string FeatName = getUniqueObjectName("Pad");
|
||||
|
||||
openCommand("Make Pad");
|
||||
doCommand(Doc,"App.activeDocument().addObject(\"PartDesign::Pad\",\"%s\")",FeatName.c_str());
|
||||
|
@ -196,41 +246,30 @@ CmdPartDesignPocket::CmdPartDesignPocket()
|
|||
|
||||
void CmdPartDesignPocket::activated(int iMsg)
|
||||
{
|
||||
unsigned int n = getSelection().countObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
if (n != 1) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("Select a sketch or 2D object."));
|
||||
return;
|
||||
// Get a valid sketch from the user
|
||||
// First check selections
|
||||
std::vector<App::DocumentObject*> sketches = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, true);
|
||||
// Next let the user choose from a list of all eligible objects
|
||||
if (sketches.size() == 0) {
|
||||
sketches = getDocument()->getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, true);
|
||||
if (sketches.size() == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid sketches in this document"),
|
||||
QObject::tr("Please create a sketch or 2D object first. It must have a support face on a solid"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// If there is more than one selection/possibility, show dialog and let user pick sketch
|
||||
if (sketches.size() > 1) {
|
||||
PartDesignGui::FeaturePickDialog Dlg(sketches);
|
||||
if ((Dlg.exec() != QDialog::Accepted) || (sketches = Dlg.getFeatures()).empty())
|
||||
return; // Cancelled or nothing selected
|
||||
}
|
||||
|
||||
std::string FeatName = getUniqueObjectName("Pocket");
|
||||
|
||||
std::vector<App::DocumentObject*> Sel = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(Sel.front());
|
||||
const TopoDS_Shape& shape = sketch->Shape.getValue();
|
||||
if (shape.IsNull()) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is empty."));
|
||||
return;
|
||||
}
|
||||
|
||||
// count free wires
|
||||
int ctWires=0;
|
||||
TopExp_Explorer ex;
|
||||
for (ex.Init(shape, TopAbs_WIRE); ex.More(); ex.Next()) {
|
||||
ctWires++;
|
||||
}
|
||||
if (ctWires == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is not a wire."));
|
||||
return;
|
||||
}
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(sketches.front());
|
||||
App::DocumentObject* support = sketch->Support.getValue();
|
||||
if (support == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No Support"),
|
||||
QObject::tr("The sketch has to have a support for the pocket feature.\nCreate the sketch on a face."));
|
||||
return;
|
||||
}
|
||||
std::string FeatName = getUniqueObjectName("Pocket");
|
||||
|
||||
openCommand("Make Pocket");
|
||||
doCommand(Doc,"App.activeDocument().addObject(\"PartDesign::Pocket\",\"%s\")",FeatName.c_str());
|
||||
|
@ -272,37 +311,30 @@ CmdPartDesignRevolution::CmdPartDesignRevolution()
|
|||
|
||||
void CmdPartDesignRevolution::activated(int iMsg)
|
||||
{
|
||||
unsigned int n = getSelection().countObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
if (n != 1) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("Select a sketch or 2D object."));
|
||||
return;
|
||||
}
|
||||
|
||||
std::string FeatName = getUniqueObjectName("Revolution");
|
||||
|
||||
std::vector<App::DocumentObject*> Sel = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(Sel.front());
|
||||
const TopoDS_Shape& shape = sketch->Shape.getValue();
|
||||
if (shape.IsNull()) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is empty."));
|
||||
return;
|
||||
}
|
||||
|
||||
// count free wires
|
||||
int ctWires=0;
|
||||
TopExp_Explorer ex;
|
||||
for (ex.Init(shape, TopAbs_WIRE); ex.More(); ex.Next()) {
|
||||
ctWires++;
|
||||
}
|
||||
if (ctWires == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is not a wire."));
|
||||
return;
|
||||
// Get a valid sketch from the user
|
||||
// First check selections
|
||||
std::vector<App::DocumentObject*> sketches = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, false);
|
||||
// Next let the user choose from a list of all eligible objects
|
||||
if (sketches.size() == 0) {
|
||||
sketches = getDocument()->getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, false);
|
||||
if (sketches.size() == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid sketches in this document"),
|
||||
QObject::tr("Please create a sketch or 2D object first"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// If there is more than one selection/possibility, show dialog and let user pick sketch
|
||||
if (sketches.size() > 1) {
|
||||
PartDesignGui::FeaturePickDialog Dlg(sketches);
|
||||
if ((Dlg.exec() != QDialog::Accepted) || (sketches = Dlg.getFeatures()).empty())
|
||||
return; // Cancelled or nothing selected
|
||||
}
|
||||
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(sketches.front());
|
||||
App::DocumentObject* support = sketch->Support.getValue();
|
||||
std::string FeatName = getUniqueObjectName("Revolution");
|
||||
|
||||
openCommand("Make Revolution");
|
||||
doCommand(Doc,"App.activeDocument().addObject(\"PartDesign::Revolution\",\"%s\")",FeatName.c_str());
|
||||
|
@ -349,37 +381,30 @@ CmdPartDesignGroove::CmdPartDesignGroove()
|
|||
|
||||
void CmdPartDesignGroove::activated(int iMsg)
|
||||
{
|
||||
unsigned int n = getSelection().countObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
if (n != 1) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("Select a sketch or 2D object."));
|
||||
return;
|
||||
}
|
||||
|
||||
std::string FeatName = getUniqueObjectName("Groove");
|
||||
|
||||
std::vector<App::DocumentObject*> Sel = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(Sel.front());
|
||||
const TopoDS_Shape& shape = sketch->Shape.getValue();
|
||||
if (shape.IsNull()) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is empty."));
|
||||
return;
|
||||
}
|
||||
|
||||
// count free wires
|
||||
int ctWires=0;
|
||||
TopExp_Explorer ex;
|
||||
for (ex.Init(shape, TopAbs_WIRE); ex.More(); ex.Next()) {
|
||||
ctWires++;
|
||||
}
|
||||
if (ctWires == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("The shape of the selected object is not a wire."));
|
||||
return;
|
||||
// Get a valid sketch from the user
|
||||
// First check selections
|
||||
std::vector<App::DocumentObject*> sketches = getSelection().getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, true);
|
||||
// Next let the user choose from a list of all eligible objects
|
||||
if (sketches.size() == 0) {
|
||||
sketches = getDocument()->getObjectsOfType(Part::Part2DObject::getClassTypeId());
|
||||
Gui::validateSketches(sketches, true);
|
||||
if (sketches.size() == 0) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("No valid sketches in this document"),
|
||||
QObject::tr("Please create a sketch or 2D object first. It must have a support face on a solid"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
// If there is more than one selection/possibility, show dialog and let user pick sketch
|
||||
if (sketches.size() > 1) {
|
||||
PartDesignGui::FeaturePickDialog Dlg(sketches);
|
||||
if ((Dlg.exec() != QDialog::Accepted) || (sketches = Dlg.getFeatures()).empty())
|
||||
return; // Cancelled or nothing selected
|
||||
}
|
||||
|
||||
Part::Part2DObject* sketch = static_cast<Part::Part2DObject*>(sketches.front());
|
||||
App::DocumentObject* support = sketch->Support.getValue();
|
||||
std::string FeatName = getUniqueObjectName("Groove");
|
||||
|
||||
openCommand("Make Groove");
|
||||
doCommand(Doc,"App.activeDocument().addObject(\"PartDesign::Groove\",\"%s\")",FeatName.c_str());
|
||||
|
|
Loading…
Reference in New Issue
Block a user