Add cut face chamfer tool.

master
Jeremy Hu 2019-02-27 22:29:03 +09:30
parent 86978d0ac3
commit cbaccb0116
5 changed files with 64 additions and 21 deletions

View File

@ -8,7 +8,6 @@
enum class CutTemplate
{
Quad = 0,
Triangle,
Count
};
@ -19,8 +18,6 @@ QString CutTemplateToDispName(CutTemplate cutTemplate) \
switch (cutTemplate) { \
case CutTemplate::Quad: \
return QObject::tr("Quad"); \
case CutTemplate::Triangle: \
return QObject::tr("Triangle"); \
default: \
return ""; \
} \
@ -37,12 +34,6 @@ std::vector<QVector2D> CutTemplateToPoints(CutTemplate cutTemplate) \
{ 1.0, 1.0}, \
{-1.0, 1.0}, \
}; \
case CutTemplate::Triangle: \
return { \
{0, -1.0}, \
{1.732, 0}, \
{0, 1.0}, \
}; \
default: \
return { \
{-1.0, -1.0}, \

View File

@ -7,6 +7,7 @@
#include <QSizePolicy>
#include <QFileDialog>
#include <QSizePolicy>
#include <nodemesh/misc.h>
#include "partwidget.h"
#include "theme.h"
#include "floatnumberwidget.h"
@ -495,9 +496,10 @@ void PartWidget::showCutTemplateSettingPopup(const QPoint &pos)
initShortCuts(popup, graphicsWidget);
std::vector<QPushButton *> presetButtons;
for (size_t i = 0; i < (size_t)CutTemplate::Count; ++i) {
CutTemplate cutTemplate = (CutTemplate)i;
QPushButton *button = new QPushButton(CutTemplateToDispName(cutTemplate));
{
CutTemplate cutTemplate = CutTemplate::Quad;
QPushButton *button = new QPushButton(tr("Reset"));
connect(button, &QPushButton::clicked, [cutTemplate, &cutDocument, this]() {
auto points = CutTemplateToPoints(cutTemplate);
cutDocument.fromCutTemplate(points);
@ -508,6 +510,36 @@ void PartWidget::showCutTemplateSettingPopup(const QPoint &pos)
presetButtons.push_back(button);
}
/*
{
QPushButton *button = new QPushButton(tr("Subdivide"));
connect(button, &QPushButton::clicked, [&cutDocument, this]() {
std::vector<QVector2D> cutTemplate;
cutDocument.toCutTemplate(cutTemplate);
nodemesh::subdivideFace2D(&cutTemplate);
cutDocument.fromCutTemplate(cutTemplate);
emit setPartCutTemplate(m_partId, cutTemplate);
emit groupOperationAdded();
});
Theme::initToolButton(button);
presetButtons.push_back(button);
}
*/
{
QPushButton *button = new QPushButton(tr("Chamfer"));
connect(button, &QPushButton::clicked, [&cutDocument, this]() {
std::vector<QVector2D> cutTemplate;
cutDocument.toCutTemplate(cutTemplate);
nodemesh::chamferFace2D(&cutTemplate);
cutDocument.fromCutTemplate(cutTemplate);
emit setPartCutTemplate(m_partId, cutTemplate);
emit groupOperationAdded();
});
Theme::initToolButton(button);
presetButtons.push_back(button);
}
QVBoxLayout *layout = new QVBoxLayout;
QHBoxLayout *presetButtonsLayout = new QHBoxLayout;
for (const auto &it: presetButtons)

View File

@ -491,3 +491,27 @@ void nodemesh::trim(std::vector<QVector3D> *vertices, bool normalize)
}
}
}
void nodemesh::subdivideFace2D(std::vector<QVector2D> *face)
{
auto oldFace = *face;
face->clear();
for (size_t i = 0; i < oldFace.size(); ++i) {
size_t j = (i + 1) % oldFace.size();
QVector2D direct = (oldFace[i] + oldFace[j]).normalized();
float length = (oldFace[i].length() + oldFace[j].length()) * 0.4; // 0.4 = 0.5 * 0.8
face->push_back(oldFace[i] * 0.8);
face->push_back(direct * length);
}
}
void nodemesh::chamferFace2D(std::vector<QVector2D> *face)
{
auto oldFace = *face;
face->clear();
for (size_t i = 0; i < oldFace.size(); ++i) {
size_t j = (i + 1) % oldFace.size();
face->push_back(oldFace[i] * 0.8 + oldFace[j] * 0.2);
face->push_back(oldFace[i] * 0.2 + oldFace[j] * 0.8);
}
}

View File

@ -1,6 +1,7 @@
#ifndef NODEMESH_MISC_H
#define NODEMESH_MISC_H
#include <QVector3D>
#include <QVector2D>
#include <vector>
#include <set>
#include <QString>
@ -31,6 +32,8 @@ size_t weldSeam(const std::vector<QVector3D> &sourceVertices, const std::vector<
std::vector<QVector3D> &destVertices, std::vector<std::vector<size_t>> &destTriangles);
bool isManifold(const std::vector<std::vector<size_t>> &faces);
void trim(std::vector<QVector3D> *vertices, bool normalize=false);
void subdivideFace2D(std::vector<QVector2D> *face);
void chamferFace2D(std::vector<QVector2D> *face);
}

View File

@ -1,4 +1,5 @@
#include <nodemesh/modifier.h>
#include <nodemesh/misc.h>
#include <QVector2D>
#include <QDebug>
@ -47,15 +48,7 @@ void Modifier::createIntermediateNode(const Node &firstNode, const Node &secondN
void Modifier::subdivide()
{
for (auto &node: m_nodes) {
auto oldCutTemplate = node.cutTemplate;
node.cutTemplate.clear();
for (size_t i = 0; i < oldCutTemplate.size(); ++i) {
size_t j = (i + 1) % oldCutTemplate.size();
QVector2D direct = (oldCutTemplate[i] + oldCutTemplate[j]).normalized();
float length = (oldCutTemplate[i].length() + oldCutTemplate[j].length()) * 0.4; // 0.4 = 0.5 * 0.8
node.cutTemplate.push_back(oldCutTemplate[i] * 0.8);
node.cutTemplate.push_back(direct * length);
}
subdivideFace2D(&node.cutTemplate);
}
}