+ use quantity boxes in fillet/chamfer dialog

This commit is contained in:
wmayer 2016-02-28 11:24:36 +01:00
parent e3aba10762
commit 92c2b18350
3 changed files with 60 additions and 27 deletions

View File

@ -66,6 +66,7 @@
#include <Gui/Application.h> #include <Gui/Application.h>
#include <Gui/BitmapFactory.h> #include <Gui/BitmapFactory.h>
#include <Gui/Command.h> #include <Gui/Command.h>
#include <Gui/QuantitySpinBox.h>
#include <Gui/WaitCursor.h> #include <Gui/WaitCursor.h>
#include <Gui/Selection.h> #include <Gui/Selection.h>
#include <Gui/SelectionFilter.h> #include <Gui/SelectionFilter.h>
@ -75,6 +76,8 @@
using namespace PartGui; using namespace PartGui;
Q_DECLARE_METATYPE(Base::Quantity)
FilletRadiusDelegate::FilletRadiusDelegate(QObject *parent) : QItemDelegate(parent) FilletRadiusDelegate::FilletRadiusDelegate(QObject *parent) : QItemDelegate(parent)
{ {
} }
@ -85,8 +88,8 @@ QWidget *FilletRadiusDelegate::createEditor(QWidget *parent, const QStyleOptionV
if (index.column() < 1) if (index.column() < 1)
return 0; return 0;
QDoubleSpinBox *editor = new QDoubleSpinBox(parent); Gui::QuantitySpinBox *editor = new Gui::QuantitySpinBox(parent);
editor->setDecimals(Base::UnitsApi::getDecimals()); editor->setUnit(Base::Unit::Length);
editor->setMinimum(0.0); editor->setMinimum(0.0);
editor->setMaximum(INT_MAX); editor->setMaximum(INT_MAX);
editor->setSingleStep(0.1); editor->setSingleStep(0.1);
@ -96,22 +99,23 @@ QWidget *FilletRadiusDelegate::createEditor(QWidget *parent, const QStyleOptionV
void FilletRadiusDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const void FilletRadiusDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{ {
double value = index.model()->data(index, Qt::EditRole).toDouble(); Base::Quantity value = index.model()->data(index, Qt::EditRole).value<Base::Quantity>();
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor); Gui::QuantitySpinBox *spinBox = static_cast<Gui::QuantitySpinBox*>(editor);
spinBox->setValue(value); spinBox->setValue(value);
} }
void FilletRadiusDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, void FilletRadiusDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const const QModelIndex &index) const
{ {
QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor); Gui::QuantitySpinBox *spinBox = static_cast<Gui::QuantitySpinBox*>(editor);
spinBox->interpretText(); spinBox->interpretText();
//double value = spinBox->value(); //double value = spinBox->value();
//QString value = QString::fromLatin1("%1").arg(spinBox->value(),0,'f',2); //QString value = QString::fromLatin1("%1").arg(spinBox->value(),0,'f',2);
QString value = QLocale::system().toString(spinBox->value(),'f',Base::UnitsApi::getDecimals()); //QString value = QLocale::system().toString(spinBox->value().getValue(),'f',Base::UnitsApi::getDecimals());
Base::Quantity value = spinBox->value();
model->setData(index, value, Qt::EditRole); model->setData(index, QVariant::fromValue<Base::Quantity>(value), Qt::EditRole);
} }
void FilletRadiusDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, void FilletRadiusDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
@ -149,6 +153,17 @@ bool FilletRadiusModel::setData (const QModelIndex & index, const QVariant & val
return ok; return ok;
} }
QVariant FilletRadiusModel::data(const QModelIndex& index, int role) const
{
QVariant value = QStandardItemModel::data(index, role);
if (role == Qt::DisplayRole && index.column() >= 1) {
Base::Quantity q = value.value<Base::Quantity>();
QString str = q.getUserString();
return str;
}
return value;
}
// -------------------------------------------------------------- // --------------------------------------------------------------
namespace PartGui { namespace PartGui {
@ -207,8 +222,8 @@ DlgFilletEdges::DlgFilletEdges(FilletType type, Part::FilletBase* fillet, QWidge
ui->setupUi(this); ui->setupUi(this);
ui->filletStartRadius->setMaximum(INT_MAX); ui->filletStartRadius->setMaximum(INT_MAX);
ui->filletEndRadius->setMaximum(INT_MAX); ui->filletEndRadius->setMaximum(INT_MAX);
ui->filletStartRadius->setDecimals(Base::UnitsApi::getDecimals()); ui->filletStartRadius->setUnit(Base::Unit::Length);
ui->filletEndRadius->setDecimals(Base::UnitsApi::getDecimals()); ui->filletEndRadius->setUnit(Base::Unit::Length);
d->object = 0; d->object = 0;
d->selection = new EdgeFaceSelection(d->object); d->selection = new EdgeFaceSelection(d->object);
@ -557,8 +572,10 @@ void DlgFilletEdges::setupFillet(const std::vector<App::DocumentObject*>& objs)
if (it != d->edge_ids.end()) { if (it != d->edge_ids.end()) {
int index = it - d->edge_ids.begin(); int index = it - d->edge_ids.begin();
model->setData(model->index(index, 0), Qt::Checked, Qt::CheckStateRole); model->setData(model->index(index, 0), Qt::Checked, Qt::CheckStateRole);
model->setData(model->index(index, 1), QVariant(QLocale::system().toString(et->radius1,'f',Base::UnitsApi::getDecimals()))); //model->setData(model->index(index, 1), QVariant(QLocale::system().toString(et->radius1,'f',Base::UnitsApi::getDecimals())));
model->setData(model->index(index, 2), QVariant(QLocale::system().toString(et->radius2,'f',Base::UnitsApi::getDecimals()))); //model->setData(model->index(index, 2), QVariant(QLocale::system().toString(et->radius2,'f',Base::UnitsApi::getDecimals())));
model->setData(model->index(index, 1), QVariant::fromValue<Base::Quantity>(Base::Quantity(et->radius1, Base::Unit::Length)));
model->setData(model->index(index, 2), QVariant::fromValue<Base::Quantity>(Base::Quantity(et->radius2, Base::Unit::Length)));
startRadius = et->radius1; startRadius = et->radius1;
endRadius = et->radius2; endRadius = et->radius2;
@ -675,8 +692,10 @@ void DlgFilletEdges::on_shapeObject_activated(int index)
for (std::vector<int>::iterator it = d->edge_ids.begin(); it != d->edge_ids.end(); ++it) { for (std::vector<int>::iterator it = d->edge_ids.begin(); it != d->edge_ids.end(); ++it) {
model->setData(model->index(index, 0), QVariant(tr("Edge%1").arg(*it))); model->setData(model->index(index, 0), QVariant(tr("Edge%1").arg(*it)));
model->setData(model->index(index, 0), QVariant(*it), Qt::UserRole); model->setData(model->index(index, 0), QVariant(*it), Qt::UserRole);
model->setData(model->index(index, 1), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals()))); //model->setData(model->index(index, 1), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals())));
model->setData(model->index(index, 2), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals()))); //model->setData(model->index(index, 2), QVariant(QLocale::system().toString(1.0,'f',Base::UnitsApi::getDecimals())));
model->setData(model->index(index, 1), QVariant::fromValue<Base::Quantity>(Base::Quantity(1.0,Base::Unit::Length)));
model->setData(model->index(index, 2), QVariant::fromValue<Base::Quantity>(Base::Quantity(1.0,Base::Unit::Length)));
std::stringstream element; std::stringstream element;
element << "Edge" << *it; element << "Edge" << *it;
if (Gui::Selection().isSelected(part, element.str().c_str())) if (Gui::Selection().isSelected(part, element.str().c_str()))
@ -770,32 +789,30 @@ void DlgFilletEdges::on_filletType_activated(int index)
ui->treeView->resizeColumnToContents(2); ui->treeView->resizeColumnToContents(2);
} }
void DlgFilletEdges::on_filletStartRadius_valueChanged(double radius) void DlgFilletEdges::on_filletStartRadius_valueChanged(const Base::Quantity& radius)
{ {
QAbstractItemModel* model = ui->treeView->model(); QAbstractItemModel* model = ui->treeView->model();
QString text = QLocale::system().toString(radius,'f',Base::UnitsApi::getDecimals());
for (int i=0; i<model->rowCount(); ++i) { for (int i=0; i<model->rowCount(); ++i) {
QVariant value = model->index(i,0).data(Qt::CheckStateRole); QVariant value = model->index(i,0).data(Qt::CheckStateRole);
Qt::CheckState checkState = static_cast<Qt::CheckState>(value.toInt()); Qt::CheckState checkState = static_cast<Qt::CheckState>(value.toInt());
// is item checked // is item checked
if (checkState & Qt::Checked) { if (checkState & Qt::Checked) {
model->setData(model->index(i, 1), QVariant(text)); model->setData(model->index(i, 1), QVariant::fromValue<Base::Quantity>(radius));
} }
} }
} }
void DlgFilletEdges::on_filletEndRadius_valueChanged(double radius) void DlgFilletEdges::on_filletEndRadius_valueChanged(const Base::Quantity& radius)
{ {
QAbstractItemModel* model = ui->treeView->model(); QAbstractItemModel* model = ui->treeView->model();
QString text = QLocale::system().toString(radius,'f',Base::UnitsApi::getDecimals());
for (int i=0; i<model->rowCount(); ++i) { for (int i=0; i<model->rowCount(); ++i) {
QVariant value = model->index(i,0).data(Qt::CheckStateRole); QVariant value = model->index(i,0).data(Qt::CheckStateRole);
Qt::CheckState checkState = static_cast<Qt::CheckState>(value.toInt()); Qt::CheckState checkState = static_cast<Qt::CheckState>(value.toInt());
// is item checked // is item checked
if (checkState & Qt::Checked) { if (checkState & Qt::Checked) {
model->setData(model->index(i, 2), QVariant(text)); model->setData(model->index(i, 2), QVariant::fromValue<Base::Quantity>(radius));
} }
} }
} }
@ -846,13 +863,15 @@ bool DlgFilletEdges::accept()
if (checkState & Qt::Checked) { if (checkState & Qt::Checked) {
// the index value of the edge // the index value of the edge
int id = model->index(i,0).data(Qt::UserRole).toInt(); int id = model->index(i,0).data(Qt::UserRole).toInt();
double r1 = model->index(i,1).data().toDouble(); Base::Quantity r1 = model->index(i,1).data(Qt::EditRole).value<Base::Quantity>();
double r2 = r1; Base::Quantity r2 = r1;
if (end_radius) if (end_radius)
r2 = model->index(i,2).data().toDouble(); r2 = model->index(i,2).data(Qt::EditRole).value<Base::Quantity>();
code += QString::fromLatin1( code += QString::fromLatin1(
"__fillets__.append((%1,%2,%3))\n") "__fillets__.append((%1,%2,%3))\n")
.arg(id).arg(r1,0,'f',Base::UnitsApi::getDecimals()).arg(r2,0,'f',Base::UnitsApi::getDecimals()); .arg(id)
.arg(r1.getValue(),0,'f',Base::UnitsApi::getDecimals())
.arg(r2.getValue(),0,'f',Base::UnitsApi::getDecimals());
todo = true; todo = true;
} }
} }

View File

@ -67,6 +67,7 @@ public:
Qt::ItemFlags flags (const QModelIndex & index) const; Qt::ItemFlags flags (const QModelIndex & index) const;
bool setData (const QModelIndex & index, const QVariant & value, bool setData (const QModelIndex & index, const QVariant & value,
int role = Qt::EditRole); int role = Qt::EditRole);
QVariant data(const QModelIndex&, int role = Qt::DisplayRole) const;
void updateCheckStates(); void updateCheckStates();
Q_SIGNALS: Q_SIGNALS:
@ -104,8 +105,8 @@ private Q_SLOTS:
void on_selectAllButton_clicked(); void on_selectAllButton_clicked();
void on_selectNoneButton_clicked(); void on_selectNoneButton_clicked();
void on_filletType_activated(int); void on_filletType_activated(int);
void on_filletStartRadius_valueChanged(double); void on_filletStartRadius_valueChanged(const Base::Quantity&);
void on_filletEndRadius_valueChanged(double); void on_filletEndRadius_valueChanged(const Base::Quantity&);
void toggleCheckState(const QModelIndex&); void toggleCheckState(const QModelIndex&);
void onHighlightEdges(); void onHighlightEdges();

View File

@ -98,7 +98,10 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QDoubleSpinBox" name="filletStartRadius"> <widget class="Gui::QuantitySpinBox" name="filletStartRadius">
<property name="unit" stdset="0">
<string notr="true">mm</string>
</property>
<property name="singleStep"> <property name="singleStep">
<double>0.100000000000000</double> <double>0.100000000000000</double>
</property> </property>
@ -108,7 +111,10 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QDoubleSpinBox" name="filletEndRadius"> <widget class="Gui::QuantitySpinBox" name="filletEndRadius">
<property name="unit" stdset="0">
<string notr="true">mm</string>
</property>
<property name="singleStep"> <property name="singleStep">
<double>0.100000000000000</double> <double>0.100000000000000</double>
</property> </property>
@ -177,6 +183,13 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<customwidgets>
<customwidget>
<class>Gui::QuantitySpinBox</class>
<extends>QWidget</extends>
<header>Gui/QuantitySpinBox.h</header>
</customwidget>
</customwidgets>
<tabstops> <tabstops>
<tabstop>shapeObject</tabstop> <tabstop>shapeObject</tabstop>
<tabstop>filletType</tabstop> <tabstop>filletType</tabstop>