Add bone joint mark menu
parent
c9aafb6a18
commit
da277c7f80
|
@ -540,6 +540,7 @@ DocumentWindow::DocumentWindow()
|
||||||
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::addNode, m_document, &Document::addNode);
|
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::addNode, m_document, &Document::addNode);
|
||||||
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::scaleNodeByAddRadius, m_document, &Document::scaleNodeByAddRadius);
|
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::scaleNodeByAddRadius, m_document, &Document::scaleNodeByAddRadius);
|
||||||
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::moveNodeBy, m_document, &Document::moveNodeBy);
|
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::moveNodeBy, m_document, &Document::moveNodeBy);
|
||||||
|
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::setNodeBoneJointState, m_document, &Document::setNodeBoneJointState);
|
||||||
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::setNodeOrigin, m_document, &Document::setNodeOrigin);
|
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::setNodeOrigin, m_document, &Document::setNodeOrigin);
|
||||||
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::removeNode, m_document, &Document::removeNode);
|
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::removeNode, m_document, &Document::removeNode);
|
||||||
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::removePart, m_document, &Document::removePart);
|
connect(canvasGraphicsWidget, &SkeletonGraphicsWidget::removePart, m_document, &Document::removePart);
|
||||||
|
|
|
@ -260,6 +260,18 @@ void SkeletonGraphicsWidget::showContextMenu(const QPoint& pos)
|
||||||
subMenu->addAction(&colorizeAsAutoColorAction);
|
subMenu->addAction(&colorizeAsAutoColorAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QAction markAsBoneJointAction(tr("Bone Joint"), this);
|
||||||
|
QAction markAsNotBoneJointAction(tr("Not Bone Joint"), this);
|
||||||
|
if (hasNodeSelection()) {
|
||||||
|
QMenu* subMenu = contextMenu.addMenu(tr("Mark As"));
|
||||||
|
|
||||||
|
connect(&markAsBoneJointAction, &QAction::triggered, this, &SkeletonGraphicsWidget::markSelectedAsBoneJoint);
|
||||||
|
subMenu->addAction(&markAsBoneJointAction);
|
||||||
|
|
||||||
|
connect(&markAsNotBoneJointAction, &QAction::triggered, this, &SkeletonGraphicsWidget::markSelectedAsNotBoneJoint);
|
||||||
|
subMenu->addAction(&markAsNotBoneJointAction);
|
||||||
|
}
|
||||||
|
|
||||||
QAction selectAllAction(tr("Select All"), this);
|
QAction selectAllAction(tr("Select All"), this);
|
||||||
if (hasItems()) {
|
if (hasItems()) {
|
||||||
connect(&selectAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::selectAll);
|
connect(&selectAllAction, &QAction::triggered, this, &SkeletonGraphicsWidget::selectAll);
|
||||||
|
@ -2858,3 +2870,46 @@ void SkeletonGraphicsWidget::ikMove(dust3d::Uuid endEffectorId, QVector3D target
|
||||||
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
|
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
|
||||||
thread->start();
|
thread->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SkeletonGraphicsWidget::setNodeBoneJointStates(const std::vector<dust3d::Uuid>& nodeIds, bool boneJoint)
|
||||||
|
{
|
||||||
|
if (nodeIds.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
emit batchChangeBegin();
|
||||||
|
for (const auto& it : nodeIds) {
|
||||||
|
emit setNodeBoneJointState(it, boneJoint);
|
||||||
|
}
|
||||||
|
emit batchChangeEnd();
|
||||||
|
emit groupOperationAdded();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SkeletonGraphicsWidget::markSelectedAsBoneJoint()
|
||||||
|
{
|
||||||
|
std::set<SkeletonGraphicsNodeItem*> nodeItems;
|
||||||
|
readMergedSkeletonNodeSetFromRangeSelection(&nodeItems);
|
||||||
|
if (nodeItems.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::vector<dust3d::Uuid> nodeIds;
|
||||||
|
for (const auto& it : nodeItems) {
|
||||||
|
nodeIds.push_back(it->id());
|
||||||
|
}
|
||||||
|
|
||||||
|
setNodeBoneJointStates(nodeIds, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SkeletonGraphicsWidget::markSelectedAsNotBoneJoint()
|
||||||
|
{
|
||||||
|
std::set<SkeletonGraphicsNodeItem*> nodeItems;
|
||||||
|
readMergedSkeletonNodeSetFromRangeSelection(&nodeItems);
|
||||||
|
if (nodeItems.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::vector<dust3d::Uuid> nodeIds;
|
||||||
|
for (const auto& it : nodeItems) {
|
||||||
|
nodeIds.push_back(it->id());
|
||||||
|
}
|
||||||
|
|
||||||
|
setNodeBoneJointStates(nodeIds, false);
|
||||||
|
}
|
||||||
|
|
|
@ -396,6 +396,7 @@ signals:
|
||||||
void addNode(float x, float y, float z, float radius, dust3d::Uuid fromNodeId);
|
void addNode(float x, float y, float z, float radius, dust3d::Uuid fromNodeId);
|
||||||
void scaleNodeByAddRadius(dust3d::Uuid nodeId, float amount);
|
void scaleNodeByAddRadius(dust3d::Uuid nodeId, float amount);
|
||||||
void moveNodeBy(dust3d::Uuid nodeId, float x, float y, float z);
|
void moveNodeBy(dust3d::Uuid nodeId, float x, float y, float z);
|
||||||
|
void setNodeBoneJointState(const dust3d::Uuid& nodeId, bool boneJoint);
|
||||||
void removeNode(dust3d::Uuid nodeId);
|
void removeNode(dust3d::Uuid nodeId);
|
||||||
void removePart(dust3d::Uuid partId);
|
void removePart(dust3d::Uuid partId);
|
||||||
void setEditMode(Document::EditMode mode);
|
void setEditMode(Document::EditMode mode);
|
||||||
|
@ -572,6 +573,8 @@ public slots:
|
||||||
void shortcutChamferedOrNotSelectedPart();
|
void shortcutChamferedOrNotSelectedPart();
|
||||||
void shortcutSelectAll();
|
void shortcutSelectAll();
|
||||||
void shortcutEscape();
|
void shortcutEscape();
|
||||||
|
void markSelectedAsBoneJoint();
|
||||||
|
void markSelectedAsNotBoneJoint();
|
||||||
private slots:
|
private slots:
|
||||||
void turnaroundImageReady();
|
void turnaroundImageReady();
|
||||||
|
|
||||||
|
@ -598,6 +601,7 @@ private:
|
||||||
void rotateItems(const std::set<SkeletonGraphicsNodeItem*>& nodeItems, int degree, QVector2D center);
|
void rotateItems(const std::set<SkeletonGraphicsNodeItem*>& nodeItems, int degree, QVector2D center);
|
||||||
void rotateAllSideProfile(int degree);
|
void rotateAllSideProfile(int degree);
|
||||||
bool isFloatEqual(float a, float b);
|
bool isFloatEqual(float a, float b);
|
||||||
|
void setNodeBoneJointStates(const std::vector<dust3d::Uuid>& nodeIds, bool boneJoint);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Document* m_document = nullptr;
|
const Document* m_document = nullptr;
|
||||||
|
|
Loading…
Reference in New Issue