[TD]fix Quadrant/Midpoint selection

This commit is contained in:
wandererfan
2019-11-03 09:35:22 -05:00
committed by WandererFan
parent e987560314
commit afa807d6fe

View File

@@ -82,7 +82,9 @@ void execQuadrant(Gui::Command* cmd);
void execCenterLine(Gui::Command* cmd);
void exec2LineCenterLine(Gui::Command* cmd);
void exec2PointCenterLine(Gui::Command* cmd);
std::vector<std::string> getSelectedSubElements(Gui::Command* cmd,
TechDraw::DrawViewPart* &dvp,
std::string subType = "Edge");
//===========================================================================
// TechDraw_Leader
@@ -123,12 +125,12 @@ void CmdTechDrawLeaderLine::activated(int iMsg)
if (!selection.empty()) {
baseFeat = dynamic_cast<TechDraw::DrawView *>(selection[0].getObject());
if( baseFeat == nullptr ) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("Can not attach leader. No base View selected."));
return;
}
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("You must select a base View for the line."));
return;
}
@@ -238,7 +240,6 @@ void CmdTechDrawCosmeticVertexGrp::activated(int iMsg)
default:
Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n",iMsg);
};
// Base::Console().Message("CMD::CosmeticVertexGrp - activated - exits\n");
}
Gui::Action * CmdTechDrawCosmeticVertexGrp::createAction(void)
@@ -321,96 +322,60 @@ void execCosmeticVertex(Gui::Command* cmd)
return;
}
//shapes not empty and only contains dvp
TechDraw::DrawViewPart* baseFeat = nullptr;
baseFeat = dynamic_cast<TechDraw::DrawViewPart*>((*shapes.begin()));
if (baseFeat == nullptr) {
Base::Console().Message("CMD::CosmeticVertex - 1st shape is not DVP. WTF?\n");
return;
}
Gui::Control().showDialog(new TaskDlgCosVertex(baseFeat,
page));
// Base::Console().Message("execCosmeticVertex - exits\n");
}
void execMidpoints(Gui::Command* cmd)
{
// Base::Console().Message("execMidpoints()\n");
TechDraw::DrawViewPart * objFeat = 0;
std::vector<std::string> SubNames;
TechDraw::DrawViewPart * dvp = nullptr;
std::vector<std::string> selectedEdges = getSelectedSubElements(cmd, dvp, "Edge");
std::vector<Gui::SelectionObject> selection = cmd->getSelection().getSelectionEx();
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
SubNames = (*itSel).getSubNames();
}
if ( (dvp == nullptr) ||
(selectedEdges.empty()) ) {
return;
}
for (auto& s: SubNames) {
if (TechDraw::DrawUtil::getGeomTypeFromName(s) == "Edge") {
continue;
} else {
std::stringstream edgeMsg;
edgeMsg << "Please select only Edges for this function";
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"),
QObject::tr(edgeMsg.str().c_str()));
return;
}
}
const std::vector<TechDraw::BaseGeom*> edges = objFeat->getEdgeGeometry();
double scale = objFeat->getScale();
for (auto& s: SubNames) {
const std::vector<TechDraw::BaseGeom*> edges = dvp->getEdgeGeometry();
double scale = dvp->getScale();
for (auto& s: selectedEdges) {
int GeoId(TechDraw::DrawUtil::getIndexFromName(s));
TechDraw::BaseGeom* geom = edges.at(GeoId);
Base::Vector3d mid = geom->getMidPoint();
mid = DrawUtil::invertY(mid);
objFeat->addCosmeticVertex(mid / scale);
dvp->addCosmeticVertex(mid / scale);
}
cmd->updateActive();
dvp->recomputeFeature();
}
void execQuadrant(Gui::Command* cmd)
{
// Base::Console().Message("execQuadrant()\n");
TechDraw::DrawViewPart * objFeat = 0;
std::vector<std::string> SubNames;
TechDraw::DrawViewPart* dvp = nullptr;
std::vector<std::string> selectedEdges = getSelectedSubElements(cmd, dvp, "Edge");
std::vector<Gui::SelectionObject> selection = cmd->getSelection().getSelectionEx();
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
SubNames = (*itSel).getSubNames();
}
if ( (dvp == nullptr) ||
(selectedEdges.empty()) ) {
return;
}
for (auto& s: SubNames) {
if (TechDraw::DrawUtil::getGeomTypeFromName(s) == "Edge") {
continue;
} else {
std::stringstream edgeMsg;
edgeMsg << "Please select only Edges for this function";
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"),
QObject::tr(edgeMsg.str().c_str()));
return;
}
}
const std::vector<TechDraw::BaseGeom*> edges = objFeat->getEdgeGeometry();
double scale = objFeat->getScale();
for (auto& s: SubNames) {
const std::vector<TechDraw::BaseGeom*> edges = dvp->getEdgeGeometry();
double scale = dvp->getScale();
for (auto& s: selectedEdges) {
int GeoId(TechDraw::DrawUtil::getIndexFromName(s));
TechDraw::BaseGeom* geom = edges.at(GeoId);
std::vector<Base::Vector3d> quads = geom->getQuads();
for (auto& q: quads) {
Base::Vector3d iq = DrawUtil::invertY(q);
objFeat->addCosmeticVertex(iq / scale);
dvp->addCosmeticVertex(iq / scale);
}
}
cmd->updateActive();
dvp->recomputeFeature();
}
DEF_STD_CMD_A(CmdTechDrawCosmeticVertex)
@@ -496,6 +461,8 @@ void CmdTechDrawMidpoints::activated(int iMsg)
return;
}
execMidpoints(this);
updateActive();
Gui::Selection().clearSelection();
}
bool CmdTechDrawMidpoints::isActive(void)
@@ -533,6 +500,8 @@ void CmdTechDrawQuadrant::activated(int iMsg)
return;
}
execQuadrant(this);
updateActive();
Gui::Selection().clearSelection();
}
bool CmdTechDrawQuadrant::isActive(void)
@@ -736,28 +705,28 @@ void execCenterLine(Gui::Command* cmd)
if (!selection.empty()) {
baseFeat = dynamic_cast<TechDraw::DrawViewPart *>(selection[0].getObject());
if( baseFeat == nullptr ) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No base View in Selection."));
return;
}
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("You must select a base View for the line."));
return;
}
std::vector<std::string> SubNames;
std::vector<std::string> subNames;
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
baseFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
SubNames = (*itSel).getSubNames();
subNames = (*itSel).getSubNames();
}
}
std::vector<std::string> faceNames;
std::vector<std::string> edgeNames;
for (auto& s: SubNames) {
for (auto& s: subNames) {
std::string geomType = DrawUtil::getGeomTypeFromName(s);
if (geomType == "Face") {
faceNames.push_back(s);
@@ -768,7 +737,7 @@ void execCenterLine(Gui::Command* cmd)
if ( (faceNames.empty()) &&
(edgeNames.empty()) ) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("You must select a Face(s) or an existing CenterLine."));
return;
}
@@ -777,7 +746,7 @@ void execCenterLine(Gui::Command* cmd)
page,
faceNames));
} else if (edgeNames.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
return;
} else {
@@ -788,7 +757,7 @@ void execCenterLine(Gui::Command* cmd)
int clIdx = bg->sourceIndex();
TechDraw::CenterLine* cl = baseFeat->getCenterLineByIndex(clIdx);
if (cl == nullptr) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
return;
}
@@ -844,69 +813,38 @@ void exec2LineCenterLine(Gui::Command* cmd)
if (!page) {
return;
}
TechDraw::DrawViewPart* dvp = nullptr;
std::vector<std::string> selectedEdges = getSelectedSubElements(cmd, dvp, "Edge");
std::vector<Gui::SelectionObject> selection = cmd->getSelection().getSelectionEx();
TechDraw::DrawViewPart* baseFeat = nullptr;
if (!selection.empty()) {
baseFeat = dynamic_cast<TechDraw::DrawViewPart *>(selection[0].getObject());
if( baseFeat == nullptr ) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QObject::tr("No base View in Selection."));
return;
}
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QObject::tr("You must select a base View for the line."));
return;
}
std::vector<std::string> SubNames;
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
baseFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
SubNames = (*itSel).getSubNames();
}
}
std::vector<std::string> faceNames;
std::vector<std::string> edgeNames;
for (auto& s: SubNames) {
std::string geomType = DrawUtil::getGeomTypeFromName(s);
if (geomType == "Edge") {
edgeNames.push_back(s);
}
}
if (edgeNames.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QObject::tr("You must select 2 lines or an existing CenterLine."));
if ( (dvp == nullptr) ||
(selectedEdges.empty()) ) {
return;
}
if (!edgeNames.empty() && (edgeNames.size() == 2)) {
Gui::Control().showDialog(new TaskDlgCenterLine(baseFeat,
if (selectedEdges.size() == 2) {
Gui::Control().showDialog(new TaskDlgCenterLine(dvp,
page,
edgeNames));
} else if (!edgeNames.empty() && (edgeNames.size() == 1)) {
std::string edgeName = edgeNames.front();
selectedEdges));
} else if (selectedEdges.size() == 1) {
std::string edgeName = selectedEdges.front();
int geomIdx = DrawUtil::getIndexFromName(edgeName);
const std::vector<TechDraw::BaseGeom *> &geoms = baseFeat->getEdgeGeometry();
const std::vector<TechDraw::BaseGeom *> &geoms = dvp->getEdgeGeometry();
BaseGeom* bg = geoms.at(geomIdx);
int clIdx = bg->sourceIndex();
TechDraw::CenterLine* cl = baseFeat->getCenterLineByIndex(clIdx);
TechDraw::CenterLine* cl = dvp->getCenterLineByIndex(clIdx);
if (cl == nullptr) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
return;
} else {
Base::Console().Message("CMD::2LineCenter - show edit dialog here\n");
Gui::Control().showDialog(new TaskDlgCenterLine(baseFeat,
// Base::Console().Message("CMD::2LineCenter - show edit dialog here\n");
Gui::Control().showDialog(new TaskDlgCenterLine(dvp,
page,
edgeNames.front()));
selectedEdges.front()));
}
} else if (edgeNames.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QObject::tr("No CenterLine in selection."));
} else { //not create, not edit, what is this???
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("Selection not understood."));
return;
}
}
@@ -962,28 +900,28 @@ void exec2PointCenterLine(Gui::Command* cmd)
if (!selection.empty()) {
baseFeat = dynamic_cast<TechDraw::DrawViewPart *>(selection[0].getObject());
if( baseFeat == nullptr ) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No base View in Selection."));
return;
}
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("You must select a base View for the line."));
return;
}
std::vector<std::string> SubNames;
std::vector<std::string> subNames;
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
baseFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
SubNames = (*itSel).getSubNames();
subNames = (*itSel).getSubNames();
}
}
std::vector<std::string> edgeNames;
std::vector<std::string> vertexNames;
for (auto& s: SubNames) {
for (auto& s: subNames) {
std::string geomType = DrawUtil::getGeomTypeFromName(s);
if (geomType == "Vertex") {
vertexNames.push_back(s);
@@ -994,7 +932,7 @@ void exec2PointCenterLine(Gui::Command* cmd)
if (vertexNames.empty() &&
edgeNames.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("You must select 2 Vertexes or an existing CenterLine."));
return;
}
@@ -1007,7 +945,7 @@ void exec2PointCenterLine(Gui::Command* cmd)
page,
edgeNames.front()));
} else if (vertexNames.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No CenterLine in selection."));
return;
}
@@ -1070,17 +1008,17 @@ void CmdTechDrawCosmeticEraser::activated(int iMsg)
}
TechDraw::DrawViewPart * objFeat = nullptr;
std::vector<std::string> SubNames;
std::vector<std::string> subNames;
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
objFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
SubNames = (*itSel).getSubNames();
subNames = (*itSel).getSubNames();
}
std::vector<std::string> cv2Delete;
std::vector<int> ce2Delete;
std::vector<int> cl2Delete;
for (auto& s: SubNames) {
for (auto& s: subNames) {
int idx = TechDraw::DrawUtil::getIndexFromName(s);
std::string geomType = TechDraw::DrawUtil::getGeomTypeFromName(s);
if (geomType == "Edge") {
@@ -1189,27 +1127,27 @@ void CmdTechDrawDecorateLine::activated(int iMsg)
if (!selection.empty()) {
baseFeat = dynamic_cast<TechDraw::DrawViewPart *>(selection[0].getObject());
if( baseFeat == nullptr ) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("No View in Selection."));
return;
}
} else {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr("You must select a View and/or line(s)."));
return;
}
std::vector<std::string> SubNames;
std::vector<std::string> subNames;
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
baseFeat = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
SubNames = (*itSel).getSubNames();
subNames = (*itSel).getSubNames();
}
}
std::vector<std::string> edgeNames;
for (auto& s: SubNames) {
for (auto& s: subNames) {
std::string geomType = DrawUtil::getGeomTypeFromName(s);
if (geomType == "Edge") {
edgeNames.push_back(s);
@@ -1379,3 +1317,45 @@ void CreateTechDrawCommandsAnnotate(void)
//===========================================================================
// Selection Validation Helpers
//===========================================================================
std::vector<std::string> getSelectedSubElements(Gui::Command* cmd,
TechDraw::DrawViewPart* &dvp,
std::string subType)
{
// Base::Console().Message("getSelectedSubElements() - dvp: %X\n", dvp);
std::vector<std::string> selectedSubs;
std::vector<std::string> subNames;
dvp = nullptr;
std::vector<Gui::SelectionObject> selection = cmd->getSelection().getSelectionEx();
std::vector<Gui::SelectionObject>::iterator itSel = selection.begin();
for (; itSel != selection.end(); itSel++) {
if ((*itSel).getObject()->isDerivedFrom(TechDraw::DrawViewPart::getClassTypeId())) {
dvp = static_cast<TechDraw::DrawViewPart*> ((*itSel).getObject());
subNames = (*itSel).getSubNames();
break;
}
}
if (dvp == nullptr) {
std::stringstream edgeMsg;
edgeMsg << "No Part View in Selection";
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr(edgeMsg.str().c_str()));
return selectedSubs;
}
for (auto& s: subNames) {
if (TechDraw::DrawUtil::getGeomTypeFromName(s) == subType) {
selectedSubs.push_back(s);
}
}
if (selectedSubs.empty()) {
std::stringstream edgeMsg;
edgeMsg << "No " << subType << " in Selection";
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong Selection"),
QObject::tr(edgeMsg.str().c_str()));
return selectedSubs;
}
return selectedSubs;
}