Add rotate operation to menu
- Add rotate 90/-90 degree to facilitate nodes editing - Enable docs.dust3d.org domainmaster
parent
d05c43d714
commit
e26095981b
20
README.md
20
README.md
|
@ -1,13 +1,13 @@
|
|||
<a href="https://dust3d.readthedocs.io/en/latest/install.html" target="_blank"><image src="https://raw.githubusercontent.com/huxingyi/dust3d/master/dust3d-logo.png" width="81" height="50"></a>
|
||||
<a href="http://docs.dust3d.org/en/latest/install.html" target="_blank"><image src="https://raw.githubusercontent.com/huxingyi/dust3d/master/dust3d-logo.png" width="81" height="50"></a>
|
||||
|
||||
[![appveyor status](https://ci.appveyor.com/api/projects/status/github/huxingyi/dust3d?branch=master&svg=true)](https://ci.appveyor.com/project/huxingyi/dust3d) [![travis status](https://travis-ci.org/huxingyi/dust3d.svg?branch=master)](https://travis-ci.org/huxingyi/dust3d) [![readthedocs status](https://readthedocs.org/projects/dust3d/badge/?version=latest)](https://dust3d.readthedocs.io/en/latest/?badge=latest)
|
||||
[![appveyor status](https://ci.appveyor.com/api/projects/status/github/huxingyi/dust3d?branch=master&svg=true)](https://ci.appveyor.com/project/huxingyi/dust3d) [![travis status](https://travis-ci.org/huxingyi/dust3d.svg?branch=master)](https://travis-ci.org/huxingyi/dust3d) [![readthedocs status](https://readthedocs.org/projects/dust3d/badge/?version=latest)](http://docs.dust3d.org/en/latest/?badge=latest)
|
||||
|
||||
Overview
|
||||
----------
|
||||
Dust3D is a brand new 3D modeling software. It helps you create a 3D watertight base model in seconds. Use it to speed up your character modeling in game making, 3D printing, and so on.
|
||||
|
||||
[Download Dust3D](https://dust3d.readthedocs.io/en/latest/install.html)
|
||||
[Online Dust3D Reference Guide](https://dust3d.readthedocs.io/en/latest/index.html)
|
||||
[Download Dust3D](http://docs.dust3d.org/en/latest/install.html)
|
||||
[Online Dust3D Reference Guide](http://docs.dust3d.org)
|
||||
|
||||
Examples
|
||||
----------------------
|
||||
|
@ -15,19 +15,19 @@ Examples
|
|||
|
||||
<a href="https://youtu.be/wQerDObDjOs" target="_blank"><image src="https://raw.githubusercontent.com/huxingyi/dust3d/master/docs/examples/modeling-mosquito/make-a-3d-model-from-scratch-using-dust3d-video-thumbnail.png" width="480" height="270"></a>
|
||||
|
||||
[Modeling Ant using Dust3D](https://dust3d.readthedocs.io/en/latest/examples/modeling-ant/index.html)
|
||||
[Modeling Ant using Dust3D](http://docs.dust3d.org/en/latest/examples/modeling-ant/index.html)
|
||||
|
||||
<a href="https://dust3d.readthedocs.io/en/latest/examples/modeling-ant/index.html">
|
||||
<a href="http://docs.dust3d.org/en/latest/examples/modeling-ant/index.html">
|
||||
<image src="https://raw.githubusercontent.com/huxingyi/dust3d/master/docs/examples/modeling-ant/modeling-ant-dust3d-screenshot.png" width="320" height="192"></a>
|
||||
|
||||
[Modeling Camel using Dust3D](https://dust3d.readthedocs.io/en/latest/examples/modeling-camel/index.html)
|
||||
[Modeling Camel using Dust3D](http://docs.dust3d.org/en/latest/examples/modeling-camel/index.html)
|
||||
|
||||
<a href="https://dust3d.readthedocs.io/en/latest/examples/modeling-camel/index.html">
|
||||
<a href="http://docs.dust3d.org/en/latest/examples/modeling-camel/index.html">
|
||||
<image src="https://raw.githubusercontent.com/huxingyi/dust3d/master/docs/examples/modeling-camel/modeling-camel-dust3d-screenshot.png" width="320" height="192"></a>
|
||||
|
||||
[Modeling Horse using Dust3D](https://dust3d.readthedocs.io/en/latest/examples/modeling-horse/index.html)
|
||||
[Modeling Horse using Dust3D](http://docs.dust3d.org/en/latest/examples/modeling-horse/index.html)
|
||||
|
||||
<a href="https://dust3d.readthedocs.io/en/latest/examples/modeling-horse/index.html">
|
||||
<a href="http://docs.dust3d.org/en/latest/examples/modeling-horse/index.html">
|
||||
<image src="https://raw.githubusercontent.com/huxingyi/dust3d/master/docs/examples/modeling-horse/modeling-horse-dust3d-screenshot.png" width="320" height="192"></a>
|
||||
|
||||
Free Dust3D Models
|
||||
|
|
|
@ -85,6 +85,14 @@ V Flip
|
|||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Flip selected nodes vertically.
|
||||
|
||||
Rotate 90 (Clockwise)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Rotate selected nodes 90 degree. If you can hardly edit some nodes in normal front/side view, rotate it then edit it, and rotate it back after you finish editing.
|
||||
|
||||
Rotate 90 (Counterclockwise)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Rotate selected nodes -90 degree.
|
||||
|
||||
Align To
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Align selected nodes with center anchor globally or selected nodes' center locally. Normally, the center anchor(a Triangle) is not show up, you can turn on the Part Mirror to make it visible, then turn Part Mirror off, the center anchor would not gone once showed.
|
||||
|
|
|
@ -11,7 +11,7 @@ isEmpty(VERSION) {
|
|||
|
||||
REPOSITORY_URL = "https://github.com/huxingyi/dust3d"
|
||||
ISSUES_URL = "https://github.com/huxingyi/dust3d/issues"
|
||||
REFERENCE_GUIDE_URL = "https://dust3d.readthedocs.io"
|
||||
REFERENCE_GUIDE_URL = "http://docs.dust3d.org"
|
||||
|
||||
QMAKE_TARGET_COMPANY = Dust3D
|
||||
QMAKE_TARGET_PRODUCT = Dust3D
|
||||
|
|
|
@ -304,6 +304,18 @@ SkeletonDocumentWindow::SkeletonDocumentWindow() :
|
|||
connect(m_flipVerticallyAction, &QAction::triggered, m_graphicsWidget, &SkeletonGraphicsWidget::flipVertically);
|
||||
m_editMenu->addAction(m_flipVerticallyAction);
|
||||
|
||||
m_rotateClockwiseAction = new QAction(tr("Rotate 90 (Clockwise)"), this);
|
||||
connect(m_rotateClockwiseAction, &QAction::triggered, [=] {
|
||||
m_graphicsWidget->rotateClockwise90Degree();
|
||||
});
|
||||
m_editMenu->addAction(m_rotateClockwiseAction);
|
||||
|
||||
m_rotateCounterclockwiseAction = new QAction(tr("Rotate 90 (Counterclockwise)"), this);
|
||||
connect(m_rotateCounterclockwiseAction, &QAction::triggered, [=] {
|
||||
m_graphicsWidget->rotateCounterclockwise90Degree();
|
||||
});
|
||||
m_editMenu->addAction(m_rotateCounterclockwiseAction);
|
||||
|
||||
m_alignToMenu = new QMenu(tr("Align To"));
|
||||
|
||||
m_alignToGlobalCenterAction = new QAction(tr("Global Center"), this);
|
||||
|
@ -376,6 +388,8 @@ SkeletonDocumentWindow::SkeletonDocumentWindow() :
|
|||
m_pasteAction->setEnabled(m_document->hasPastableContentInClipboard());
|
||||
m_flipHorizontallyAction->setEnabled(m_graphicsWidget->hasMultipleSelection());
|
||||
m_flipVerticallyAction->setEnabled(m_graphicsWidget->hasMultipleSelection());
|
||||
m_rotateClockwiseAction->setEnabled(m_graphicsWidget->hasMultipleSelection());
|
||||
m_rotateCounterclockwiseAction->setEnabled(m_graphicsWidget->hasMultipleSelection());
|
||||
m_alignToGlobalCenterAction->setEnabled(m_graphicsWidget->hasSelection() && m_document->originSettled());
|
||||
m_alignToGlobalVerticalCenterAction->setEnabled(m_graphicsWidget->hasSelection() && m_document->originSettled());
|
||||
m_alignToGlobalHorizontalCenterAction->setEnabled(m_graphicsWidget->hasSelection() && m_document->originSettled());
|
||||
|
|
|
@ -94,6 +94,8 @@ private:
|
|||
QAction *m_pasteAction;
|
||||
QAction *m_flipHorizontallyAction;
|
||||
QAction *m_flipVerticallyAction;
|
||||
QAction *m_rotateClockwiseAction;
|
||||
QAction *m_rotateCounterclockwiseAction;
|
||||
|
||||
QMenu *m_alignToMenu;
|
||||
QAction *m_alignToGlobalCenterAction;
|
||||
|
|
|
@ -174,6 +174,18 @@ void SkeletonGraphicsWidget::showContextMenu(const QPoint &pos)
|
|||
contextMenu.addAction(&flipVerticallyAction);
|
||||
}
|
||||
|
||||
QAction rotateClockwiseAction(tr("Rotate 90 (Clockwise)"), this);
|
||||
if (hasMultipleSelection()) {
|
||||
connect(&rotateClockwiseAction, &QAction::triggered, this, &SkeletonGraphicsWidget::rotateClockwise90Degree);
|
||||
contextMenu.addAction(&rotateClockwiseAction);
|
||||
}
|
||||
|
||||
QAction rotateCounterclockwiseAction(tr("Rotate 90 (Counterclockwise)"), this);
|
||||
if (hasMultipleSelection()) {
|
||||
connect(&rotateCounterclockwiseAction, &QAction::triggered, this, &SkeletonGraphicsWidget::rotateCounterclockwise90Degree);
|
||||
contextMenu.addAction(&rotateCounterclockwiseAction);
|
||||
}
|
||||
|
||||
QAction alignToLocalCenterAction(tr("Local Center"), this);
|
||||
QAction alignToLocalVerticalCenterAction(tr("Local Vertical Center"), this);
|
||||
QAction alignToLocalHorizontalCenterAction(tr("Local Horizontal Center"), this);
|
||||
|
@ -921,6 +933,7 @@ void SkeletonGraphicsWidget::flipHorizontally()
|
|||
if (nodeItems.empty())
|
||||
return;
|
||||
QVector2D center = centerOfNodeItemSet(nodeItems);
|
||||
emit batchChangeBegin();
|
||||
for (const auto &nodeItem: nodeItems) {
|
||||
QPointF origin = nodeItem->origin();
|
||||
float offset = origin.x() - center.x();
|
||||
|
@ -931,6 +944,8 @@ void SkeletonGraphicsWidget::flipHorizontally()
|
|||
emit moveNodeBy(nodeItem->id(), 0, 0, unifiedOffset);
|
||||
}
|
||||
}
|
||||
emit batchChangeEnd();
|
||||
emit groupOperationAdded();
|
||||
}
|
||||
|
||||
void SkeletonGraphicsWidget::flipVertically()
|
||||
|
@ -940,12 +955,31 @@ void SkeletonGraphicsWidget::flipVertically()
|
|||
if (nodeItems.empty())
|
||||
return;
|
||||
QVector2D center = centerOfNodeItemSet(nodeItems);
|
||||
emit batchChangeBegin();
|
||||
for (const auto &nodeItem: nodeItems) {
|
||||
QPointF origin = nodeItem->origin();
|
||||
float offset = origin.y() - center.y();
|
||||
float unifiedOffset = -sceneRadiusToUnified(offset * 2);
|
||||
emit moveNodeBy(nodeItem->id(), 0, unifiedOffset, 0);
|
||||
}
|
||||
emit batchChangeEnd();
|
||||
emit groupOperationAdded();
|
||||
}
|
||||
|
||||
void SkeletonGraphicsWidget::rotateClockwise90Degree()
|
||||
{
|
||||
emit batchChangeBegin();
|
||||
emit rotateSelected(90);
|
||||
emit batchChangeEnd();
|
||||
emit groupOperationAdded();
|
||||
}
|
||||
|
||||
void SkeletonGraphicsWidget::rotateCounterclockwise90Degree()
|
||||
{
|
||||
emit batchChangeBegin();
|
||||
emit rotateSelected(360 - 90);
|
||||
emit batchChangeEnd();
|
||||
emit groupOperationAdded();
|
||||
}
|
||||
|
||||
bool SkeletonGraphicsWidget::mouseRelease(QMouseEvent *event)
|
||||
|
|
|
@ -436,6 +436,8 @@ public slots:
|
|||
void copy();
|
||||
void flipHorizontally();
|
||||
void flipVertically();
|
||||
void rotateClockwise90Degree();
|
||||
void rotateCounterclockwise90Degree();
|
||||
void removeAllContent();
|
||||
void breakSelected();
|
||||
void connectSelected();
|
||||
|
|
Loading…
Reference in New Issue