[TD]fix crash on bad centerline selection

This commit is contained in:
wandererfan
2020-04-17 07:38:40 -04:00
committed by WandererFan
parent e511c123e4
commit 1c5b2c8e27
3 changed files with 50 additions and 43 deletions

View File

@@ -581,13 +581,13 @@ void CmdTechDrawCenterLineGroup::activated(int iMsg)
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
switch(iMsg) {
case 0:
case 0: //faces
execCenterLine(this);
break;
case 1:
case 1: //2 lines
exec2LineCenterLine(this);
break;
case 2:
case 2: //2 points
exec2PointCenterLine(this);
break;
default:
@@ -743,29 +743,23 @@ void execCenterLine(Gui::Command* cmd)
if (!faceNames.empty()) {
Gui::Control().showDialog(new TaskDlgCenterLine(baseFeat,
page,
faceNames));
faceNames,
false));
} else if (edgeNames.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
return;
} else {
std::string edgeName = edgeNames.front();
int geomIdx = DrawUtil::getIndexFromName(edgeName);
const std::vector<TechDraw::BaseGeom *> &geoms = baseFeat->getEdgeGeometry();
BaseGeom* bg = geoms.at(geomIdx);
// int clIdx = bg->sourceIndex();
// TechDraw::CenterLine* cl = baseFeat->getCenterLineByIndex(clIdx);
std::string tag = bg->getCosmeticTag();
TechDraw::CenterLine* cl = baseFeat->getCenterLine(tag);
TechDraw::CenterLine* cl = baseFeat->getCenterLineBySelection(edgeNames.front());
if (cl == nullptr) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
QObject::tr("Selection is not a CenterLine."));
return;
}
Gui::Control().showDialog(new TaskDlgCenterLine(baseFeat,
page,
edgeNames.front()));
edgeNames.front(),
true));
}
}
@@ -825,25 +819,19 @@ void exec2LineCenterLine(Gui::Command* cmd)
if (selectedEdges.size() == 2) {
Gui::Control().showDialog(new TaskDlgCenterLine(dvp,
page,
selectedEdges));
selectedEdges,
false));
} else if (selectedEdges.size() == 1) {
std::string edgeName = selectedEdges.front();
int geomIdx = DrawUtil::getIndexFromName(edgeName);
const std::vector<TechDraw::BaseGeom *> &geoms = dvp->getEdgeGeometry();
BaseGeom* bg = geoms.at(geomIdx);
// int clIdx = bg->sourceIndex();
// TechDraw::CenterLine* cl = dvp->getCenterLineByIndex(clIdx);
std::string tag = bg->getCosmeticTag();
TechDraw::CenterLine* cl = dvp->getCenterLine(tag);
TechDraw::CenterLine* cl = dvp->getCenterLineBySelection(selectedEdges.front());
if (cl == nullptr) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
QObject::tr("Selection is not a CenterLine."));
return;
} else {
// Base::Console().Message("CMD::2LineCenter - show edit dialog here\n");
Gui::Control().showDialog(new TaskDlgCenterLine(dvp,
page,
selectedEdges.front()));
selectedEdges.front(),
true));
}
} else { //not create, not edit, what is this???
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
@@ -942,14 +930,23 @@ void exec2PointCenterLine(Gui::Command* cmd)
if (!vertexNames.empty() && (vertexNames.size() == 2)) {
Gui::Control().showDialog(new TaskDlgCenterLine(baseFeat,
page,
vertexNames));
vertexNames,
false));
} else if (!edgeNames.empty() && (edgeNames.size() == 1)) {
TechDraw::CenterLine* cl = baseFeat->getCenterLineBySelection(edgeNames.front());
if (cl == nullptr) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("Selection is not a CenterLine."));
return;
}
Gui::Control().showDialog(new TaskDlgCenterLine(baseFeat,
page,
edgeNames.front()));
edgeNames.front(),
false));
} else if (vertexNames.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
QObject::tr("Need 2 Vertices or 1 CenterLine."));
return;
}
}

View File

@@ -74,15 +74,16 @@ using namespace TechDrawGui;
//ctor for edit
TaskCenterLine::TaskCenterLine(TechDraw::DrawViewPart* partFeat,
TechDraw::DrawPage* page,
std::string edgeName) :
std::string edgeName,
bool editMode) :
ui(new Ui_TaskCenterLine),
m_partFeat(partFeat),
m_basePage(page),
m_createMode(false),
m_edgeName(edgeName),
m_type(0), //0 - Face, 1 - 2 Lines, 2 - 2 points
m_mode(0) //0 - vertical, 1 - horizontal, 2 - aligned
m_mode(0), //0 - vertical, 1 - horizontal, 2 - aligned
m_editMode(editMode)
{
// Base::Console().Message("TCL::TCL() - edit mode\n");
ui->setupUi(this);
@@ -104,14 +105,16 @@ TaskCenterLine::TaskCenterLine(TechDraw::DrawViewPart* partFeat,
//ctor for creation
TaskCenterLine::TaskCenterLine(TechDraw::DrawViewPart* partFeat,
TechDraw::DrawPage* page,
std::vector<std::string> subNames) :
std::vector<std::string> subNames,
bool editMode) :
ui(new Ui_TaskCenterLine),
m_partFeat(partFeat),
m_basePage(page),
m_createMode(true),
m_subNames(subNames),
m_type(0), //0 - Face, 1 - 2 Lines, 2 - 2 points
m_mode(0) //0 - vertical, 1 - horizontal, 2 - aligned
m_mode(0), //0 - vertical, 1 - horizontal, 2 - aligned
m_editMode(editMode)
{
// Base::Console().Message("TCL::TCL() - create mode\n");
if ( (m_basePage == nullptr) ||
@@ -501,10 +504,11 @@ bool TaskCenterLine::reject()
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TaskDlgCenterLine::TaskDlgCenterLine(TechDraw::DrawViewPart* partFeat,
TechDraw::DrawPage* page,
std::vector<std::string> subNames)
std::vector<std::string> subNames,
bool editMode)
: TaskDialog()
{
widget = new TaskCenterLine(partFeat,page,subNames);
widget = new TaskCenterLine(partFeat,page,subNames, editMode);
taskbox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("actions/techdraw-facecenterline"),
widget->windowTitle(), true, 0);
taskbox->groupLayout()->addWidget(widget);
@@ -513,10 +517,11 @@ TaskDlgCenterLine::TaskDlgCenterLine(TechDraw::DrawViewPart* partFeat,
TaskDlgCenterLine::TaskDlgCenterLine(TechDraw::DrawViewPart* partFeat,
TechDraw::DrawPage* page,
std::string edgeName)
std::string edgeName,
bool editMode)
: TaskDialog()
{
widget = new TaskCenterLine(partFeat,page, edgeName);
widget = new TaskCenterLine(partFeat,page, edgeName, editMode);
taskbox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("actions/techdraw-facecenterline"),
widget->windowTitle(), true, 0);
taskbox->groupLayout()->addWidget(widget);

View File

@@ -75,10 +75,12 @@ class TaskCenterLine : public QWidget
public:
TaskCenterLine(TechDraw::DrawViewPart* baseFeat,
TechDraw::DrawPage* page,
std::vector<std::string> subNames);
std::vector<std::string> subNames,
bool editMode);
TaskCenterLine(TechDraw::DrawViewPart* baseFeat,
TechDraw::DrawPage* page,
std::string edgeName);
std::string edgeName,
bool editMode);
~TaskCenterLine();
public Q_SLOTS:
@@ -145,6 +147,7 @@ private:
int m_clIdx;
int m_type;
int m_mode;
bool m_editMode;
};
class TaskDlgCenterLine : public Gui::TaskView::TaskDialog
@@ -154,10 +157,12 @@ class TaskDlgCenterLine : public Gui::TaskView::TaskDialog
public:
TaskDlgCenterLine(TechDraw::DrawViewPart* baseFeat,
TechDraw::DrawPage* page,
std::vector<std::string> subNames);
std::vector<std::string> subNames,
bool editMode);
TaskDlgCenterLine(TechDraw::DrawViewPart* baseFeat,
TechDraw::DrawPage* page,
std::string edgeName);
std::string edgeName,
bool editMode);
~TaskDlgCenterLine();
public: