#include "GeometryBoolWidget.h" #include "ui_GeometryBoolWidget.h" #include "GUIFrame/MainWindow.h" #include "OperatorsInterface/ParaWidgetInterfaceOperator.h" #include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h" #include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h" #include "FITK_Kernel/FITKCore/FITKOperatorRepo.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoCommand.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKGeoCommandList.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoOperBool.h" #include "FITK_Interface/FITKInterfaceGeometry/FITKGeoInterfaceFactory.h" #include namespace GUI { GeometryBoolWidget::GeometryBoolWidget(BoolType type, EventOper::ParaWidgetInterfaceOperator* oper) : GeometryWidgetBase(nullptr, oper, dynamic_cast(FITKAPP->getGlobalData()->getMainWindow())), _type(type), _oper(oper) { _ui = new Ui::GeometryBoolWidget(); _ui->setupUi(this); init(); _ui->pushButton_Body1->hide(); _ui->pushButton_Body2->hide(); QString typeName = ""; switch (_type) { case GUI::BoolType::GeoBoolFause: typeName = tr("Fause"); break; case GUI::BoolType::GeoBoolCut:typeName = tr("Cut"); break; case GUI::BoolType::GeoBoolCommon:typeName = tr("Common"); break; } _ui->groupBox_Type->setTitle(typeName); Interface::FITKGeoCommandList* geometryData = FITKAPP->getGlobalData()->getGeometryData(); if (geometryData == nullptr) return; QString name = geometryData->checkName(tr("Bool-1")); _ui->lineEdit_Name->setText(name); } GeometryBoolWidget::~GeometryBoolWidget() { if (_ui) { delete _ui; _ui = nullptr; } } void GeometryBoolWidget::init() { _ui->comboBox_Body1->clear(); _ui->comboBox_Body2->clear(); _ui->comboBox_Body1->addItem(tr("None"), -1); _ui->comboBox_Body2->addItem(tr("None"), -1); Interface::FITKGeoCommandList* geometryData = FITKAPP->getGlobalData()->getGeometryData(); if (geometryData == nullptr) return; for (int i = 0; i < geometryData->getDataCount(); i++) { Interface::FITKAbsGeoCommand* geoObj = geometryData->getDataByIndex(i); if (geoObj == nullptr)continue; QString name = geoObj->getDataObjectName(); int id = geoObj->getDataObjectID(); _ui->comboBox_Body1->addItem(name, id); _ui->comboBox_Body2->addItem(name, id); } } void GeometryBoolWidget::on_comboBox_Body1_activated(int index) { int box1Id = _ui->comboBox_Body1->currentData().toInt(); int box2Id = _ui->comboBox_Body2->currentData().toInt(); if (box2Id == box1Id) { _ui->comboBox_Body2->setCurrentIndex(0); } } void GeometryBoolWidget::on_comboBox_Body2_activated(int index) { int box1Id = _ui->comboBox_Body1->currentData().toInt(); int box2Id = _ui->comboBox_Body2->currentData().toInt(); if (box2Id == box1Id) { _ui->comboBox_Body1->setCurrentIndex(0); } } void GeometryBoolWidget::on_pushButton_Body1_clicked() { } void GeometryBoolWidget::on_pushButton_Body2_clicked() { } void GeometryBoolWidget::on_pushButton_Apply_clicked() { Interface::FITKGeoCommandList* geometryData = FITKAPP->getGlobalData()->getGeometryData(); if (geometryData == nullptr) return; Interface::FITKInterfaceGeometryFactory* geoFactory = Interface::FITKInterfaceGeometryFactory::getInstance(); if (geoFactory == nullptr)return; if (_oper == nullptr)return; if (!checkValue())return; Interface::FITKAbsGeoCommand* geo1 = geometryData->getDataByID(_ui->comboBox_Body1->currentData().toInt()); Interface::FITKAbsGeoCommand* geo2 = geometryData->getDataByID(_ui->comboBox_Body2->currentData().toInt()); if (geo1 == nullptr)return; if (geo2 == nullptr)return; auto geoBoolOper = geoFactory->createCommandT(Interface::FITKGeoEnum::FITKGeometryComType::FGTBool); if (geoBoolOper == nullptr)return; geoBoolOper->setDataObjectName(_ui->lineEdit_Name->text()); switch (_type) { case GUI::BoolType::GeoBoolFause: geoBoolOper->setBoolOperType(Interface::FITKAbsGeoOperBool::GBTAdd); break; case GUI::BoolType::GeoBoolCut: geoBoolOper->setBoolOperType(Interface::FITKAbsGeoOperBool::GBTCut); break; case GUI::BoolType::GeoBoolCommon: geoBoolOper->setBoolOperType(Interface::FITKAbsGeoOperBool::GBTCommon); break; } geoBoolOper->setGeoShape1(geo1->getShapeAgent()); geoBoolOper->setGeoShape2(geo2->getShapeAgent()); geoBoolOper->update(); _obj = geoBoolOper; //创建Default面组 createDefaultFaceGroup(_obj); //几何关联的网格区域尺寸 createMeshSizeGeo(); geometryData->appendDataObj(geoBoolOper); //隐藏原模型 geo1->enable(false); geo2->enable(false); if (_oper) { _oper->setArgs("geo1ObjID", geo1->getDataObjectID()); _oper->setArgs("geo2ObjID", geo2->getDataObjectID()); _oper->setArgs("objID", geoBoolOper->getDataObjectID()); _oper->execProfession(); QString actionName = "actionGeoBoolEdit"; QObject sender; sender.setObjectName(actionName); auto acOper = Core::FITKOperatorRepo::getInstance()->getOperatorT(actionName); if (acOper == nullptr)return; acOper->setEmitter(&sender); acOper->setArgs("objID", geoBoolOper->getDataObjectID()); acOper->actionTriggered(); } } bool GeometryBoolWidget::checkValue() { int box1Id = _ui->comboBox_Body1->currentData().toInt(); int box2Id = _ui->comboBox_Body2->currentData().toInt(); auto outputMessage = [&](QString message) { QMessageBox::warning(this, tr("Warring"), message, QMessageBox::Ok); }; if (box1Id == -1 || box2Id == -1) { outputMessage(tr("Input Wrong!")); return false; } if (box1Id == box2Id) { outputMessage(tr("Input Wrong!")); return false; } QString name = _ui->lineEdit_Name->text(); Interface::FITKGeoCommandList* geometryData = FITKAPP->getGlobalData()->getGeometryData(); if (geometryData->getDataByName(name)) { outputMessage(tr("%1 exist!").arg(name)); return false; } return true; } }