Add Midpoint and Quadrant Cosmetic Vertex

This commit is contained in:
wandererfan
2019-05-20 09:17:04 -04:00
parent 3f7570ad80
commit 108038df91
10 changed files with 480 additions and 88 deletions

View File

@@ -51,6 +51,7 @@
#include <Mod/TechDraw/App/DrawViewAnnotation.h>
#include <Mod/TechDraw/App/DrawPage.h>
#include <Mod/TechDraw/App/DrawUtil.h>
#include <Mod/TechDraw/App/Geometry.h>
#include <Mod/TechDraw/Gui/QGVPage.h>
#include "DrawGuiUtil.h"
@@ -67,6 +68,11 @@ using namespace std;
//internal functions
bool _checkSelectionHatch(Gui::Command* cmd);
void execCosmeticVertex(Gui::Command* cmd);
void execMidpoints(Gui::Command* cmd);
void execQuadrant(Gui::Command* cmd);
//===========================================================================
// TechDraw_Leader
//===========================================================================
@@ -164,15 +170,6 @@ void CmdTechDrawRichAnno::activated(int iMsg)
TechDraw::DrawView* baseFeat = nullptr;
if (!selection.empty()) {
baseFeat = dynamic_cast<TechDraw::DrawView *>(selection[0].getObject());
// if( baseFeat == nullptr ) {
// QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
// QObject::tr("Can not attach leader. No base View selected."));
// return;
// }
// } else {
// QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Selection Error"),
// QObject::tr("You must select a base View for the line."));
// return;
}
Gui::Control().showDialog(new TaskDlgRichAnno(baseFeat,
@@ -186,10 +183,237 @@ bool CmdTechDrawRichAnno::isActive(void)
return (havePage && haveView);
}
DEF_STD_CMD_ACL(CmdTechDrawCosmeticVertexGrp);
CmdTechDrawCosmeticVertexGrp::CmdTechDrawCosmeticVertexGrp()
: Command("TechDraw_CosmeticVertexGrp")
{
sAppModule = "TechDraw";
sGroup = QT_TR_NOOP("TechDraw");
sMenuText = QT_TR_NOOP("Insert Cosmetic Vertex");
sToolTipText = QT_TR_NOOP("Insert Cosmetic Vertex");
sWhatsThis = "TechDraw_CosmeticVertexGrp";
sStatusTip = sToolTipText;
// eType = ForEdit;
}
void CmdTechDrawCosmeticVertexGrp::activated(int iMsg)
{
// Base::Console().Message("CMD::CosmeticVertexGrp - activated(%d)\n", iMsg);
Gui::TaskView::TaskDialog *dlg = Gui::Control().activeDialog();
if (dlg != nullptr) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Task In Progress"),
QObject::tr("Close active task dialog and try again."));
return;
}
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
pcAction->setIcon(pcAction->actions().at(iMsg)->icon());
switch(iMsg) {
case 0:
execCosmeticVertex(this);
break;
case 1:
execMidpoints(this);
break;
case 2:
execQuadrant(this);
break;
default:
Base::Console().Message("CMD::CVGrp - invalid iMsg: %d\n",iMsg);
};
// Base::Console().Message("CMD::CosmeticVertexGrp - activated - exits\n");
}
Gui::Action * CmdTechDrawCosmeticVertexGrp::createAction(void)
{
Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow());
pcAction->setDropDownMenu(true);
applyCommandData(this->className(), pcAction);
QAction* p1 = pcAction->addAction(QString());
p1->setIcon(Gui::BitmapFactory().iconFromTheme("actions/techdraw-point"));
p1->setObjectName(QString::fromLatin1("TechDraw_CosmeticVertex"));
p1->setWhatsThis(QString::fromLatin1("TechDraw_CosmeticVertx"));
QAction* p2 = pcAction->addAction(QString());
p2->setIcon(Gui::BitmapFactory().iconFromTheme("actions/techdraw-midpoint"));
p2->setObjectName(QString::fromLatin1("TechDraw_Midpoints"));
p2->setWhatsThis(QString::fromLatin1("TechDraw_Midpoints"));
QAction* p3 = pcAction->addAction(QString());
p3->setIcon(Gui::BitmapFactory().iconFromTheme("actions/techdraw-quadrant"));
p3->setObjectName(QString::fromLatin1("TechDraw_Quadrant"));
p3->setWhatsThis(QString::fromLatin1("TechDraw_Quadrant"));
_pcAction = pcAction;
languageChange();
pcAction->setIcon(p1->icon());
int defaultId = 0;
pcAction->setProperty("defaultAction", QVariant(defaultId));
return pcAction;
}
void CmdTechDrawCosmeticVertexGrp::languageChange()
{
Command::languageChange();
if (!_pcAction)
return;
Gui::ActionGroup* pcAction = qobject_cast<Gui::ActionGroup*>(_pcAction);
QList<QAction*> a = pcAction->actions();
QAction* arc1 = a[0];
arc1->setText(QApplication::translate("CmdTechDrawCosmeticVertexGrp","Cosmetic Vertex"));
arc1->setToolTip(QApplication::translate("TechDraw_CosmeticVertex","Insert a Cosmetic Vertix into a View"));
arc1->setStatusTip(arc1->toolTip());
QAction* arc2 = a[1];
arc2->setText(QApplication::translate("CmdMidpoints","Midpoints"));
arc2->setToolTip(QApplication::translate("TechDraw_Midpoints","Insert Cosmetic Vertex at midpoint of Edge(s)"));
arc2->setStatusTip(arc2->toolTip());
QAction* arc3 = a[2];
arc3->setText(QApplication::translate("CmdQuadrant","Quadrant"));
arc3->setToolTip(QApplication::translate("TechDraw_Quadrant","Insert Cosmetic Vertex at quadrant points of Circle(s)"));
arc3->setStatusTip(arc3->toolTip());
}
bool CmdTechDrawCosmeticVertexGrp::isActive(void)
{
bool havePage = DrawGuiUtil::needPage(this);
bool haveView = DrawGuiUtil::needView(this, false);
return (havePage && haveView);
}
//===========================================================================
// TechDraw_CosmeticVertex
//===========================================================================
void execCosmeticVertex(Gui::Command* cmd)
{
// Base::Console().Message("execCosmeticVertex()\n");
TechDraw::DrawPage* page = DrawGuiUtil::findPage(cmd);
if (!page) {
return;
}
std::vector<App::DocumentObject*> shapes = cmd->getSelection().
getObjectsOfType(TechDraw::DrawViewPart::getClassTypeId());
if (shapes.empty()) {
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
QObject::tr("No DrawViewPart objects in this selection"));
return;
}
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;
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();
}
}
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;
}
}
//combine 2 loops?
const std::vector<TechDrawGeometry::BaseGeom*> edges = objFeat->getEdgeGeometry();
double scale = objFeat->getScale();
for (auto& s: SubNames) {
int GeoId(TechDraw::DrawUtil::getIndexFromName(s));
TechDrawGeometry::BaseGeom* geom = edges.at(GeoId);
Base::Vector2d mid = geom->getMidPoint();
Base::Vector3d mid3(mid.x / scale, - mid.y / scale, 0.0);
objFeat->addRandomVertex(mid3);
}
cmd->updateActive();
// Base::Console().Message("execMidpoints - exits\n");
}
void execQuadrant(Gui::Command* cmd)
{
// Base::Console().Message("execQuadrant()\n");
TechDraw::DrawViewPart * objFeat = 0;
std::vector<std::string> SubNames;
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();
}
}
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;
}
}
//combine 2 loops?
const std::vector<TechDrawGeometry::BaseGeom*> edges = objFeat->getEdgeGeometry();
double scale = objFeat->getScale();
bool nonCircles = false;
for (auto& s: SubNames) {
int GeoId(TechDraw::DrawUtil::getIndexFromName(s));
TechDrawGeometry::BaseGeom* geom = edges.at(GeoId);
//TODO: should this be restricted to circles??
// if (geom->geomType == TechDrawGeometry::CIRCLE) {
std::vector<Base::Vector2d> quads = geom->getQuads();
for (auto& q: quads) {
Base::Vector3d q3(q.x / scale, - q.y / scale, 0.0);
objFeat->addRandomVertex(q3);
}
// } else {
// nonCircles = true;
// }
}
if (nonCircles) {
std::stringstream edgeMsg;
edgeMsg << "Non circular edges found in selection.";
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Incorrect Selection"),
QObject::tr(edgeMsg.str().c_str()));
}
cmd->updateActive();
// Base::Console().Message("execQuadrant - exits\n");
}
DEF_STD_CMD_A(CmdTechDrawCosmeticVertex);
CmdTechDrawCosmeticVertex::CmdTechDrawCosmeticVertex()
@@ -272,21 +496,7 @@ void CmdTechDrawMidpoints::activated(int iMsg)
QObject::tr("Close active task dialog and try again."));
return;
}
TechDraw::DrawPage* page = DrawGuiUtil::findPage(this);
if (!page) {
return;
}
std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx();
// TechDraw::DrawView* baseFeat = nullptr;
// if (!selection.empty()) {
// baseFeat = dynamic_cast<TechDraw::DrawView *>(selection[0].getObject());
// }
// Gui::Control().showDialog(new TaskDlgMidpoints(baseFeat,
// page));
Base::Console().Message("CMD::Midpoints - start dialog here!\n");
execMidpoints(this);
}
bool CmdTechDrawMidpoints::isActive(void)
@@ -323,21 +533,7 @@ void CmdTechDrawQuadrant::activated(int iMsg)
QObject::tr("Close active task dialog and try again."));
return;
}
TechDraw::DrawPage* page = DrawGuiUtil::findPage(this);
if (!page) {
return;
}
std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx();
// TechDraw::DrawView* baseFeat = nullptr;
// if (!selection.empty()) {
// baseFeat = dynamic_cast<TechDraw::DrawView *>(selection[0].getObject());
// }
// Gui::Control().showDialog(new TaskDlgQuadrant(baseFeat,
// page));
Base::Console().Message("CMD::Quadrant - start dialog here!\n");
execQuadrant(this);
}
bool CmdTechDrawQuadrant::isActive(void)
@@ -393,6 +589,7 @@ void CreateTechDrawCommandsAnnotate(void)
rcCmdMgr.addCommand(new CmdTechDrawLeaderLine());
rcCmdMgr.addCommand(new CmdTechDrawRichAnno());
rcCmdMgr.addCommand(new CmdTechDrawCosmeticVertexGrp());
rcCmdMgr.addCommand(new CmdTechDrawCosmeticVertex());
rcCmdMgr.addCommand(new CmdTechDrawMidpoints());
rcCmdMgr.addCommand(new CmdTechDrawQuadrant());

View File

@@ -510,13 +510,8 @@ void QGIViewPart::drawViewPart()
QGIVertex *item = new QGIVertex(i);
TechDraw::CosmeticVertex* cv = viewPart->getCosmeticVertexByLink(i);
if (cv != nullptr) {
Base::Console().Message("QGIVP::draw - found a cv!\n");
cv->dump("QGIVP::draw");
// item->setNormalColor(vertexColor);
item->setNormalColor(cv->color.asValue<QColor>());
item->setRadius(cv->size);
// item->setRadius(lineWidth * vertexScaleFactor);
// item->setStyle(cv->style);
} else {
item->setNormalColor(vertexColor);
item->setRadius(lineWidth * vertexScaleFactor);
@@ -527,23 +522,6 @@ void QGIViewPart::drawViewPart()
item->setZValue(ZVALUE::VERTEX);
}
}
// //draw cosmetic vertices
// int cosmoVertStart = 1000;
// std::vector<CosmeticVertex*> cVerts = viewPart->getCosmeticVertex();
// Base::Console().Message("QGIVP::draw - %s - cVerts: %d\n",getViewName(),cVerts.size());
// std::vector<CosmeticVertex*>::const_iterator itcVert = cVerts.begin();
// for(int i = 0 ; itcVert != cVerts.end(); ++itcVert, i++) {
// QGIVertex *item = new QGIVertex(cosmoVertStart + i);
// item->setNormalColor((*itcVert)->color.asValue<QColor>());
// item->setPrettyNormal();
// addToGroup(item);
// //TODO: need to apply scale to position unless position is already scaled
// item->setPos(Rez::guiX((*itcVert)->pageLocation.x), - Rez::guiX((*itcVert)->pageLocation.y));
// item->setRadius((*itcVert)->size);
// item->setStyle((Qt::PenStyle)(*itcVert)->style);
// item->setZValue(ZVALUE::VERTEX);
// Base::Console().Message("QGIVP::draw - cVert.toCSV: %s \n",(*itcVert)->toCSV().c_str());
// }
}
//draw detail highlights

View File

@@ -181,7 +181,7 @@ void QGTracker::hoverMoveEvent(QGraphicsSceneHoverEvent* event)
void QGTracker::keyPressEvent(QKeyEvent * event)
{
Base::Console().Message("QGT::keyPressEvent()\n");
// Base::Console().Message("QGT::keyPressEvent()\n");
if (event->key() == Qt::Key_Escape) {
terminateDrawing();
}
@@ -237,7 +237,7 @@ QPointF QGTracker::snapToAngle(QPointF dumbPt)
//mouse event reactions
void QGTracker::onMousePress(QPointF pos)
{
Base::Console().Message("QGT::onMousePress(%s)\n", TechDraw::DrawUtil::formatVector(pos).c_str());
// Base::Console().Message("QGT::onMousePress(%s)\n", TechDraw::DrawUtil::formatVector(pos).c_str());
m_points.push_back(pos);
TrackerMode mode = getTrackerMode();
if (m_points.size() > 1) {
@@ -259,12 +259,10 @@ void QGTracker::onMousePress(QPointF pos)
break;
}
} else if (m_points.size() == 1) { //first point selected
Base::Console().Message("QGT::onMousePress - m_points.size == 1\n");
getPickedQGIV(pos);
setCursor(Qt::CrossCursor);
// Q_EMIT qViewPicked(pos, m_qgParent); //not in use yet.
if (mode == TrackerMode::Point) {
Base::Console().Message("QGT::onMousePress - mode = Point\n");
setPoint(m_points);
terminateDrawing();
}
@@ -301,7 +299,7 @@ void QGTracker::onMouseMove(QPointF pos)
void QGTracker::onDoubleClick(QPointF pos)
{
Base::Console().Message("QGTracker::onDoubleClick()\n");
// Base::Console().Message("QGTracker::onDoubleClick()\n");
Q_UNUSED(pos);
TrackerMode mode = getTrackerMode();
if (mode == TrackerMode::Point) {
@@ -474,7 +472,7 @@ std::vector<Base::Vector3d> QGTracker::convertPoints(void)
void QGTracker::terminateDrawing(void)
{
Base::Console().Message("QGTracker::terminateDrawing()\n");
// Base::Console().Message("QGTracker::terminateDrawing()\n");
m_track->hide();
setCursor(Qt::ArrowCursor);
Q_EMIT drawingFinished(m_points, m_qgParent);

View File

@@ -166,8 +166,8 @@ void TaskCosVertex::addCosVertex(QPointF qPos)
void TaskCosVertex::onTrackerClicked(bool b)
{
Q_UNUSED(b);
Base::Console().Message("TCV::onTrackerClicked() m_pbTrackerState: %d\n",
m_pbTrackerState);
// Base::Console().Message("TCV::onTrackerClicked() m_pbTrackerState: %d\n",
// m_pbTrackerState);
if (m_pbTrackerState == TRACKERCANCEL) {
removeTracker();
@@ -222,7 +222,7 @@ void TaskCosVertex::startTracker(void)
void TaskCosVertex::onTrackerFinished(std::vector<QPointF> pts, QGIView* qgParent)
{
Base::Console().Message("TCV::onTrackerFinished()\n");
// Base::Console().Message("TCV::onTrackerFinished()\n");
if (pts.empty()) {
Base::Console().Error("TaskCosVertex - no points available\n");
return;

View File

@@ -155,9 +155,10 @@ Gui::ToolBarItem* Workbench::setupToolBars() const
*anno << "TechDraw_Annotation";
*anno << "TechDraw_LeaderLine";
*anno << "TechDraw_RichAnno";
*anno << "TechDraw_CosmeticVertex";
*anno << "TechDraw_Midpoints";
*anno << "TechDraw_Quadrant";
*anno << "TechDraw_CosmeticVertexGrp";
// *anno << "TechDraw_CosmeticVertex";
// *anno << "TechDraw_Midpoints";
// *anno << "TechDraw_Quadrant";
return root;
}
@@ -221,9 +222,10 @@ Gui::ToolBarItem* Workbench::setupCommandBars() const
*anno << "TechDraw_Annotation";
*anno << "TechDraw_LeaderLine";
*anno << "TechDraw_RichAnno";
*anno << "TechDraw_CosmeticVertex";
*anno << "TechDraw_Midpoints";
*anno << "TechDraw_Quadrant";
*anno << "TechDraw_CosmeticVertexGrp";
// *anno << "TechDraw_CosmeticVertex";
// *anno << "TechDraw_Midpoints";
// *anno << "TechDraw_Quadrant";
return root;
}