405 lines
11 KiB
C++
405 lines
11 KiB
C++
|
#include "DialogCreateClip.h"
|
|||
|
#include "ui_DialogCreateClip.h"
|
|||
|
#include "RenderWindowManager.h"
|
|||
|
#include "PostTreeWidget.h"
|
|||
|
#include "ShearPlaneWidget.h"
|
|||
|
#include "FuncCallback.h"
|
|||
|
#include "RenderWindowManager.h"
|
|||
|
#include "RenderDirector.h"
|
|||
|
#include "GraphWidget.h"
|
|||
|
#include "PostRenderData/RenderDataObject.h"
|
|||
|
#include "PostRenderData/RenderDataManager.h"
|
|||
|
#include "PostRenderData/ClipRenderDataAlg.h"
|
|||
|
#include "PostRenderData/SliceRenderDataAlg.h"
|
|||
|
#include "PythonModule/PyAgent.h"
|
|||
|
#include <vtkDataSet.h>
|
|||
|
#include <QMessageBox>
|
|||
|
|
|||
|
namespace Post
|
|||
|
{
|
|||
|
CreateClipDialog::CreateClipDialog(PostTreeWidget *tree, bool isClip, QWidget *parent) : PostFunctionDialogBase(tree, parent),
|
|||
|
_ui(new Ui::CreateClipDialog),
|
|||
|
_isClip(isClip),
|
|||
|
_isEdit(false)
|
|||
|
{
|
|||
|
_ui->setupUi(this);
|
|||
|
|
|||
|
// this->setWindowFlags(Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint | Qt::Dialog);
|
|||
|
// this->setAttribute(Qt::WA_DeleteOnClose);
|
|||
|
|
|||
|
init();
|
|||
|
}
|
|||
|
|
|||
|
CreateClipDialog::CreateClipDialog(PostTreeWidget *tree, RenderDataObject *obj, bool isClip, QWidget *parent) : PostFunctionDialogBase(tree, parent),
|
|||
|
_ui(new Ui::CreateClipDialog),
|
|||
|
_isClip(isClip),
|
|||
|
_isEdit(true)
|
|||
|
{
|
|||
|
_ui->setupUi(this);
|
|||
|
|
|||
|
_editObject = obj;
|
|||
|
_parentObject = _editObject->getParentObj();
|
|||
|
|
|||
|
initEidtInterface();
|
|||
|
}
|
|||
|
|
|||
|
CreateClipDialog::~CreateClipDialog()
|
|||
|
{
|
|||
|
if (_shearPlane != nullptr)
|
|||
|
delete _shearPlane;
|
|||
|
delete _ui;
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::init()
|
|||
|
{
|
|||
|
if (_isClip)
|
|||
|
{
|
|||
|
_ui->nameLineEdit->setText(tr("Clip"));
|
|||
|
this->setWindowTitle(tr("CreateClip"));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_ui->nameLineEdit->setText(tr("Slice"));
|
|||
|
_ui->directionCheckBox->setVisible(false);
|
|||
|
this->setWindowTitle(tr("CreateSlice"));
|
|||
|
}
|
|||
|
setParentObject();
|
|||
|
|
|||
|
// connect(_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(setParentObject()));
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::initEidtInterface()
|
|||
|
{
|
|||
|
if (_editObject == nullptr)
|
|||
|
return;
|
|||
|
auto wid = _editObject->getRenderWinID();
|
|||
|
auto window = _windowManager->getRenderWindowByID(wid);
|
|||
|
if (window == nullptr)
|
|||
|
return;
|
|||
|
if (_shearPlane == nullptr)
|
|||
|
{
|
|||
|
_shearPlane = new ShearPlaneWidget(window, _editObject->getParentObj());
|
|||
|
|
|||
|
connect(_shearPlane->getCallback(), SIGNAL(updatePlaneWidgetSig(double *, double *)), this, SLOT(updatePlaneWidget(double *, double *)));
|
|||
|
}
|
|||
|
|
|||
|
double nor[3]{0};
|
|||
|
double ori[3]{0};
|
|||
|
|
|||
|
if (_isClip)
|
|||
|
{
|
|||
|
this->setWindowTitle(tr("CreateClip"));
|
|||
|
auto clip = dynamic_cast<ClipRenderDataAlg *>(_editObject);
|
|||
|
if (clip == nullptr)
|
|||
|
return;
|
|||
|
|
|||
|
_tree->setSelectedData(clip->getSelectedObjectHash());
|
|||
|
clip->getPlaneNormal(nor);
|
|||
|
clip->getPlaneOrigin(ori);
|
|||
|
|
|||
|
_ui->directionCheckBox->setChecked(!clip->getInsideOut());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
_ui->directionCheckBox->setVisible(false);
|
|||
|
this->setWindowTitle(tr("CreateSlice"));
|
|||
|
auto slice = dynamic_cast<SliceRenderDataAlg *>(_editObject);
|
|||
|
if (slice == nullptr)
|
|||
|
return;
|
|||
|
_tree->setSelectedData(slice->getSelectedObjectHash());
|
|||
|
slice->getPlaneNormal(nor);
|
|||
|
slice->getPlaneOrigin(ori);
|
|||
|
}
|
|||
|
|
|||
|
_ui->nameLineEdit->setText(_editObject->getName());
|
|||
|
|
|||
|
double bounds[6]{0};
|
|||
|
this->getSelectedObjectsBound(bounds);
|
|||
|
_shearPlane->setPlaceWidget(bounds);
|
|||
|
_shearPlane->setPlaneNormal(nor);
|
|||
|
_shearPlane->setPlaneOrigin(ori);
|
|||
|
|
|||
|
blockDoubleSpinBoxSignals(true);
|
|||
|
_ui->xDoubleSpinBox->setValue(ori[0]);
|
|||
|
_ui->yDoubleSpinBox->setValue(ori[1]);
|
|||
|
_ui->zDoubleSpinBox->setValue(ori[2]);
|
|||
|
_ui->xLineEdit->setText(QString::number(nor[0], 'g', 4));
|
|||
|
_ui->yLineEdit->setText(QString::number(nor[1], 'g', 4));
|
|||
|
_ui->zLineEdit->setText(QString::number(nor[2], 'g', 4));
|
|||
|
blockDoubleSpinBoxSignals(false);
|
|||
|
|
|||
|
window->reRender();
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::accept()
|
|||
|
{
|
|||
|
if (_parentObject == nullptr)
|
|||
|
{
|
|||
|
QMessageBox::warning(this, tr("Warning!"), tr("No selected data!"));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
QString name = _ui->nameLineEdit->text();
|
|||
|
if (name.isEmpty())
|
|||
|
{
|
|||
|
QMessageBox::warning(this, tr("Warning!"), tr("Input is wrong!"));
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
double org[3]{0};
|
|||
|
double nor[3]{0};
|
|||
|
|
|||
|
org[0] = _ui->xDoubleSpinBox->value();
|
|||
|
org[1] = _ui->yDoubleSpinBox->value();
|
|||
|
org[2] = _ui->zDoubleSpinBox->value();
|
|||
|
nor[0] = _ui->xLineEdit->text().toDouble();
|
|||
|
nor[1] = _ui->yLineEdit->text().toDouble();
|
|||
|
nor[2] = _ui->zLineEdit->text().toDouble();
|
|||
|
|
|||
|
QStringList codes{};
|
|||
|
QString algName;
|
|||
|
if (_isClip)
|
|||
|
{
|
|||
|
algName = QString("clip");
|
|||
|
codes += QString("clip = PostProcess.Clip()");
|
|||
|
codes += QString("clip.setInsideOut(%1)").arg(_ui->directionCheckBox->isChecked());
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
algName = QString("slice");
|
|||
|
codes += QString("slice = PostProcess.Slice()");
|
|||
|
}
|
|||
|
|
|||
|
codes += QString("%1.setName('%2')").arg(algName).arg(name);
|
|||
|
codes += QString("%1.setOrigin(%2,%3,%4)").arg(algName).arg(org[0]).arg(org[1]).arg(org[2]);
|
|||
|
codes += QString("%1.setNormal(%2,%3,%4)").arg(algName).arg(nor[0]).arg(nor[1]).arg(nor[2]);
|
|||
|
|
|||
|
auto dataHash = _tree->getSelectedData(_parentObject);
|
|||
|
auto objList = dataHash.uniqueKeys();
|
|||
|
for (auto obj : objList)
|
|||
|
{
|
|||
|
auto blockList = dataHash.values(obj);
|
|||
|
for (auto block : blockList)
|
|||
|
{
|
|||
|
codes += QString("%1.appendBlock(%2,%3)").arg(algName).arg(obj).arg(block);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (!_isEdit)
|
|||
|
{
|
|||
|
codes += QString("%1.setParentID(%2)").arg(algName).arg(_parentObject->getID());
|
|||
|
codes += QString("%1.create()").arg(algName);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
codes += QString("%1.setID(%2)").arg(algName).arg(_editObject->getID());
|
|||
|
codes += QString("%1.edit()").arg(algName);
|
|||
|
}
|
|||
|
_pyAgent->submit(codes);
|
|||
|
|
|||
|
// if (_isClip)
|
|||
|
// {
|
|||
|
// ClipRenderDataAlg* alg = new ClipRenderDataAlg(_parentObject);
|
|||
|
// alg->setSelectedObjectHash(_tree->getSelectedData(_parentObject));
|
|||
|
// alg->setPlaneNormal(nor);
|
|||
|
// alg->setPlaneOri(org);
|
|||
|
// alg->setInsideOut(!_ui->directionCheckBox->isChecked());
|
|||
|
//
|
|||
|
// alg->updateParam();
|
|||
|
// alg->updateAlg();
|
|||
|
// alg->update();
|
|||
|
//
|
|||
|
//
|
|||
|
// _parentObject->appendSubObjects(alg);
|
|||
|
// RenderDirector::getInstance()->renderDataObjectToWindow(alg, _parentObject->getRenderWinID());
|
|||
|
// }
|
|||
|
// else
|
|||
|
// {
|
|||
|
// SliceRenderDataAlg* alg = new SliceRenderDataAlg(_parentObject);
|
|||
|
// alg->setSelectedObjectHash(_tree->getSelectedData(_parentObject));
|
|||
|
// alg->setPlaneNormal(nor);
|
|||
|
// alg->setPlaneOri(org);
|
|||
|
//
|
|||
|
// alg->updateParam();
|
|||
|
// alg->updateAlg();
|
|||
|
// alg->update();
|
|||
|
//
|
|||
|
//
|
|||
|
// _parentObject->appendSubObjects(alg);
|
|||
|
// RenderDirector::getInstance()->renderDataObjectToWindow(alg, _parentObject->getRenderWinID());
|
|||
|
// }
|
|||
|
// _tree->updatePostTree();
|
|||
|
QDialog::accept();
|
|||
|
this->close();
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::reject()
|
|||
|
{
|
|||
|
QDialog::reject();
|
|||
|
this->close();
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::updateDisplayInterface()
|
|||
|
{
|
|||
|
showShearPlane();
|
|||
|
|
|||
|
blockDoubleSpinBoxSignals(true);
|
|||
|
double nor[3]{0};
|
|||
|
double org[3]{0};
|
|||
|
if (_shearPlane != nullptr)
|
|||
|
{
|
|||
|
_shearPlane->getPlaneNormal(nor);
|
|||
|
_shearPlane->getPlaneOrigin(org);
|
|||
|
}
|
|||
|
|
|||
|
_ui->xDoubleSpinBox->setValue(org[0]);
|
|||
|
_ui->yDoubleSpinBox->setValue(org[1]);
|
|||
|
_ui->zDoubleSpinBox->setValue(org[2]);
|
|||
|
_ui->xLineEdit->setText(QString::number(nor[0], 'g', 4));
|
|||
|
_ui->yLineEdit->setText(QString::number(nor[1], 'g', 4));
|
|||
|
_ui->zLineEdit->setText(QString::number(nor[2], 'g', 4));
|
|||
|
blockDoubleSpinBoxSignals(false);
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::showShearPlane()
|
|||
|
{
|
|||
|
if (_parentObject == nullptr)
|
|||
|
return;
|
|||
|
auto wid = _parentObject->getRenderWinID();
|
|||
|
auto window = _windowManager->getRenderWindowByID(wid);
|
|||
|
if (window == nullptr)
|
|||
|
return;
|
|||
|
if (_shearPlane == nullptr)
|
|||
|
{
|
|||
|
_shearPlane = new ShearPlaneWidget(window, _parentObject);
|
|||
|
|
|||
|
connect(_shearPlane->getCallback(), SIGNAL(updatePlaneWidgetSig(double *, double *)), this, SLOT(updatePlaneWidget(double *, double *)));
|
|||
|
}
|
|||
|
|
|||
|
double bounds[6]{0};
|
|||
|
double origin[3]{0};
|
|||
|
double normal[3]{1, 0, 0};
|
|||
|
this->getSelectedObjectsBound(bounds);
|
|||
|
_shearPlane->setPlaceWidget(bounds);
|
|||
|
|
|||
|
origin[0] = (bounds[1] + bounds[0]) / 2;
|
|||
|
origin[1] = (bounds[3] + bounds[2]) / 2;
|
|||
|
origin[2] = (bounds[5] + bounds[4]) / 2;
|
|||
|
|
|||
|
_shearPlane->setPlaneNormal(normal);
|
|||
|
_shearPlane->setPlaneOrigin(origin);
|
|||
|
|
|||
|
window->reRender();
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::getSelectedObjectsBound(double *bounds)
|
|||
|
{
|
|||
|
bool isFirst = false;
|
|||
|
// double mBounds[6]{ 0 };
|
|||
|
auto maxBounds = [](double *fBound, double *sBound)
|
|||
|
{
|
|||
|
// auto Max = [](double a, double b) {if (a < b) a = b; };
|
|||
|
// auto Min = [](double a, double b) {if (a > b) a = b; };
|
|||
|
//
|
|||
|
// Min(fBound[0], sBound[0]);
|
|||
|
// Max(fBound[1], sBound[1]);
|
|||
|
// Min(fBound[2], sBound[2]);
|
|||
|
// Max(fBound[3], sBound[3]);
|
|||
|
// Min(fBound[4], sBound[4]);
|
|||
|
// Max(fBound[5], sBound[5]);
|
|||
|
if (fBound[0] > sBound[0])
|
|||
|
fBound[0] = sBound[0];
|
|||
|
if (fBound[1] < sBound[1])
|
|||
|
fBound[1] = sBound[1];
|
|||
|
if (fBound[2] > sBound[2])
|
|||
|
fBound[2] = sBound[2];
|
|||
|
if (fBound[3] < sBound[3])
|
|||
|
fBound[3] = sBound[3];
|
|||
|
if (fBound[4] > sBound[4])
|
|||
|
fBound[4] = sBound[4];
|
|||
|
if (fBound[5] < sBound[5])
|
|||
|
fBound[5] = sBound[5];
|
|||
|
};
|
|||
|
|
|||
|
auto idList = _tree->getSelectedData(_parentObject).uniqueKeys();
|
|||
|
for (auto id : idList)
|
|||
|
{
|
|||
|
auto obj = _dataManager->getObjectByID(id);
|
|||
|
if (obj == nullptr)
|
|||
|
continue;
|
|||
|
|
|||
|
for (auto v : _tree->getSelectedData(_parentObject).values(id))
|
|||
|
{
|
|||
|
auto data = obj->getOutputData(v + 1);
|
|||
|
if (data == nullptr)
|
|||
|
continue;
|
|||
|
|
|||
|
if (!isFirst)
|
|||
|
{
|
|||
|
data->GetBounds(bounds);
|
|||
|
isFirst = true;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
double sBound[6]{0};
|
|||
|
data->GetBounds(sBound);
|
|||
|
maxBounds(bounds, sBound);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::blockDoubleSpinBoxSignals(bool b)
|
|||
|
{
|
|||
|
_ui->xDoubleSpinBox->blockSignals(b);
|
|||
|
_ui->yDoubleSpinBox->blockSignals(b);
|
|||
|
_ui->zDoubleSpinBox->blockSignals(b);
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::updatePlaneWidget(double *normal, double *origin)
|
|||
|
{
|
|||
|
blockDoubleSpinBoxSignals(true);
|
|||
|
_ui->xDoubleSpinBox->setValue(origin[0]);
|
|||
|
_ui->yDoubleSpinBox->setValue(origin[1]);
|
|||
|
_ui->zDoubleSpinBox->setValue(origin[2]);
|
|||
|
|
|||
|
_ui->xLineEdit->setText(QString::number(normal[0], 'g', 4));
|
|||
|
_ui->yLineEdit->setText(QString::number(normal[1], 'g', 4));
|
|||
|
_ui->zLineEdit->setText(QString::number(normal[2], 'g', 4));
|
|||
|
blockDoubleSpinBoxSignals(false);
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::on_xDoubleSpinBox_valueChanged(double x)
|
|||
|
{
|
|||
|
double origin[3]{0};
|
|||
|
|
|||
|
origin[0] = x;
|
|||
|
origin[1] = _ui->yDoubleSpinBox->value();
|
|||
|
origin[2] = _ui->zDoubleSpinBox->value();
|
|||
|
|
|||
|
_shearPlane->setPlaneOrigin(origin);
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::on_yDoubleSpinBox_valueChanged(double y)
|
|||
|
{
|
|||
|
double origin[3]{0};
|
|||
|
|
|||
|
origin[0] = _ui->xDoubleSpinBox->value();
|
|||
|
origin[1] = y;
|
|||
|
origin[2] = _ui->zDoubleSpinBox->value();
|
|||
|
|
|||
|
_shearPlane->setPlaneOrigin(origin);
|
|||
|
}
|
|||
|
|
|||
|
void CreateClipDialog::on_zDoubleSpinBox_valueChanged(double z)
|
|||
|
{
|
|||
|
double origin[3]{0};
|
|||
|
|
|||
|
origin[0] = _ui->xDoubleSpinBox->value();
|
|||
|
origin[1] = _ui->yDoubleSpinBox->value();
|
|||
|
origin[2] = z;
|
|||
|
|
|||
|
_shearPlane->setPlaneOrigin(origin);
|
|||
|
}
|
|||
|
|
|||
|
}
|