ceshi/plugins/CA_PhysicalField/BoundarySetting.cpp

659 lines
19 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "BoundarySetting.h"
#include <vtkDataSetSurfaceFilter.h>
#include <vtkExtractGeometry.h>
#include <vtkPolyDataNormals.h>
#include "PhysicalField.h"
BoundarySetting::BoundarySetting()
{
m_picker = PropPickerInteractionStyle::New(this);
m_visualWidgetService = ServiceRegistry<VisualWidgetService>::instance().getService();
ServiceRegistry<VisualWidgetService>::instance().getService()->getInteractor()->AddObserver(vtkCommand::LeftButtonPressEvent, m_picker, 0.5f);
m_picker->setSelectModel(0);
}
void BoundarySetting::setPhyicalField(PhysicalField *physicalField)
{
m_physicalField = physicalField;
m_displacementLimitSettingWidget = m_physicalField->getDisplacementLimitSettingWidget();
m_distributedLoadSettingWidget = m_physicalField->getDistributedLoadSettingWidget();
}
void BoundarySetting::select()
{
m_gridFaceToCell.resize(m_faceNum+1);
m_gridFaceToPoint.resize(m_faceNum+1);
m_points = vtkSmartPointer<vtkPoints>::New();
m_cells = vtkSmartPointer<vtkCellArray>::New();
QMap<int,int>pointMap;
// for (const auto& quad : m_quads) {
// //真实的id
// int ids[4];
// ids[0] = quad.n2;
// ids[1] = quad.n3;
// ids[2] = quad.n4;
// ids[3] = quad.n5;
// //插入到points映射点的id
// for(int i=0;i<4;i++)
// {
// if(pointMap[ids[i]] == 1) continue;
// else
// {
// int id = (int)m_points->InsertNextPoint(m_nodes[ids[i]-1].x,m_nodes[ids[i]-1].y,m_nodes[ids[i]-1].z);
// pointMap[ids[i]] = 1;
// m_pointIdToTruePointId[id] = ids[i];
// m_truePointIdToPointId[ids[i]] = id;
// }
// }
// }
//m_cellPoly = vtkSmartPointer<vtkUnstructuredGrid>::New();
// for(const auto& node : m_nodes)
// {
// m_points->InsertNextPoint(node.x, node.y,node.z);
// }
// qDebug()<<"sssssssssss";
// m_cellPoly->SetPoints(m_points);
// //体
// for (const auto& quad2 : m_hexahedrons) {
// int quad[8];
// vtkSmartPointer<vtkHexahedron> hexpoly = vtkSmartPointer<vtkHexahedron>::New();
// quad[0]=quad2.n2;
// quad[1]=quad2.n3;
// quad[2]=quad2.n4;
// quad[3]=quad2.n5;
// quad[4]=quad2.n6;
// quad[5]=quad2.n7;
// quad[6]=quad2.n8;
// quad[7]=quad2.n9;
// hexpoly->GetPointIds()->SetId(0, quad[0]-1);
// hexpoly->GetPointIds()->SetId(1, quad[1]-1);
// hexpoly->GetPointIds()->SetId(2, quad[2]-1);
// hexpoly->GetPointIds()->SetId(3, quad[3]-1);
// hexpoly->GetPointIds()->SetId(4, quad[4]-1);
// hexpoly->GetPointIds()->SetId(5, quad[5]-1);
// hexpoly->GetPointIds()->SetId(6, quad[6]-1);
// hexpoly->GetPointIds()->SetId(7, quad[7]-1);
// m_cellPoly->InsertNextCell(hexpoly->GetCellType(), hexpoly->GetPointIds());
// }
// //面cell
// for (const auto& quad : m_quads) {
// // Add points
// vtkIdType ids[4];
// ids[0] = m_truePointIdToPointId[quad.n2];
// ids[1] = m_truePointIdToPointId[quad.n3];
// ids[2] = m_truePointIdToPointId[quad.n4];
// ids[3] = m_truePointIdToPointId[quad.n5];
// int id = m_cells->InsertNextCell(4, ids);
// int hexahedronsPos = 0;
// while(hexahedronsPos<m_hexahedrons.size())
// {
// QMap<int,int>temp;
// int j = hexahedronsPos;
// temp[m_hexahedrons[j].n2] = 1;
// temp[m_hexahedrons[j].n3] = 1;
// temp[m_hexahedrons[j].n4] = 1;
// temp[m_hexahedrons[j].n5] = 1;
// temp[m_hexahedrons[j].n6] = 1;
// temp[m_hexahedrons[j].n7] = 1;
// temp[m_hexahedrons[j].n8] = 1;
// temp[m_hexahedrons[j].n9] = 1;
// for(int i=0;i<4;i++)
// {
// if(temp[m_pointIdToTruePointId[ids[i]]] == 0) {hexahedronsPos++;break;}
// }
// if(j == hexahedronsPos)
// {
// //属于哪一个体
// m_faceToGridMap[id] = m_hexahedrons[j].id;
// //面存入grid面
// m_gridFaceToCell[quad.n1].push_back(id);
// //点存入grid面
// m_gridFaceToPoint[quad.n1].push_back(ids[0]);
// m_gridFaceToPoint[quad.n1].push_back(ids[1]);
// m_gridFaceToPoint[quad.n1].push_back(ids[2]);
// m_gridFaceToPoint[quad.n1].push_back(ids[3]);
// break;
// }
// }
// }
//面
// m_cellPoly = vtkSmartPointer<vtkPolyData>::New();
// m_cellPoly->SetPoints(m_points);
// m_cellPoly->SetPolys(m_cells);
// //点
// m_nodePoly = vtkSmartPointer<vtkPolyData>::New();
// m_nodePoly->SetPoints(m_points);
// m_nodePoly->SetPolys(m_cells);
//------------------------------------整体
// Create a mapper
// vtkSmartPointer<vtkDataSetMapper> mapper = vtkSmartPointer<vtkDataSetMapper>::New();
// mapper->SetInputData(m_cellPoly);
// m_faceActor = vtkSmartPointer<vtkActor>::New();
// m_faceActor->SetMapper(mapper);
// m_faceActor->GetProperty()->EdgeVisibilityOn();
// //设置颜色
// vtkDataArray *cellcolor = vtkUnsignedCharArray::New();
// cellcolor->SetNumberOfComponents(3);
// m_cellStructure->GetCellData()->SetScalars(cellcolor);
// cellcolor->SetNumberOfTuples(m_cellStructure->GetNumberOfCells());
// cellcolor->FillComponent(0, 255);
// cellcolor->FillComponent(1, 255);
// cellcolor->FillComponent(2, 255);
// //点
// vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
// sphereSource->SetRadius(0.00007); // Adjust the radius to change the size of the points
// vtkSmartPointer<vtkGlyph3D> glyphFilter = vtkSmartPointer<vtkGlyph3D>::New();
// glyphFilter->SetInputData(m_nodePoly);
// glyphFilter->SetSourceConnection(sphereSource->GetOutputPort());
// glyphFilter->SetColorModeToColorByScalar(); // Use scalar data for colors
// glyphFilter->Update();
// vtkSmartPointer<vtkPolyDataMapper> glyphMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
// glyphMapper->SetInputConnection(glyphFilter->GetOutputPort());
// glyphMapper->ScalarVisibilityOn(); // Ensure colors are visible
// glyphMapper->SetScalarModeToUsePointData();
// m_pointActor = vtkSmartPointer<vtkActor>::New();
// m_pointActor->SetMapper(glyphMapper);
// m_pointActor->SetPickable(false);
// //设置点颜色
// vtkSmartPointer<vtkUnsignedCharArray> pointColor = vtkSmartPointer<vtkUnsignedCharArray>::New();
// pointColor->SetNumberOfComponents(3);
// pointColor->SetName("Colors");
// pointColor->SetNumberOfTuples(m_nodePoly->GetNumberOfPoints());
// pointColor->FillComponent(0, 255);
// pointColor->FillComponent(1, 255);
// pointColor->FillComponent(2, 255);
// m_nodePoly->GetPointData()->SetScalars(pointColor);
// m_visualWidgetService->removeAllActor();
// m_visualWidgetService->addActor(m_faceActor);
// m_visualWidgetService->getRender()->ResetCamera();
// m_visualWidgetService->getrenderWindow()->Render();
}
void BoundarySetting::setSelectMode()
{
}
vtkSmartPointer<vtkUnstructuredGrid> BoundarySetting::getPointStructure()
{
return m_pointStructure;
}
bool BoundarySetting::setStructure(vtkSmartPointer<vtkUnstructuredGrid> cell,vtkSmartPointer<vtkUnstructuredGrid> point)
{
if(m_cellStructure == cell && m_pointStructure == point)
{
return false;
}
m_cellStructure = cell;
m_pointStructure = point;
m_uxSelectedPoint.clear();
m_uySelectedPoint.clear();
m_uzSelectedPoint.clear();
m_allSelectedPoint.clear();
m_oneSelectedFace.clear();
m_twoSelectedFace.clear();
m_threeSelectedFace.clear();
m_allSelectedFace.clear();
return true;
}
void BoundarySetting::setFaceToPoint(QVector<QSet<int>> point)
{
m_gridFaceToPoint = point;
}
void BoundarySetting::setFaceToCell(QVector<QVector<int>> cell)
{
m_gridFaceToCell = cell;
}
void BoundarySetting::setCellToGridMap(QMap <int , int> cellToGridMap)
{
m_faceToGridMap = cellToGridMap;
}
//设置选择方式0-不选1-选点2-选面
void BoundarySetting::setBoundarySettingStatus(int type)
{
m_picker->setSelectModel(type);
}
void BoundarySetting::set3DType(bool is3DType)
{
m_picker->set3DType(is3DType);
}
int BoundarySetting::getFaceNum()
{
return m_faceNum;
}
vtkSmartPointer<vtkUnstructuredGrid> BoundarySetting::getCellStructure()
{
return m_cellStructure;
}
int BoundarySetting::getFaceIdToGridId(int id)
{
return m_faceToGridMap[id];
}
int BoundarySetting::getPointIdToGridId(int id)
{
return m_pointIdToTruePointId[id];
}
//清除选中的点
void BoundarySetting::clearSelectedPoint()
{
double color[3] = {255,255,255};
double color2[3] = {255,0,255};
for (const int &point : m_picker->getSelectedPoint()) {
if(isSelectedPoint(point))
{
m_picker->setPointColor(point,color2);
}
else
{
m_picker->setPointColor(point,color);
}
}
m_picker->pointRefresh();
m_picker->clearSelectedPoint();
}
void BoundarySetting::setFaceData(bool enable[], double value[])
{
QSet<int>temp = m_picker->getSelectedFace();
if(enable[0])
{
for (const int &face : temp) {
m_oneSelectedFace.insert(face);
m_allSelectedFace.insert(face);
m_oneFace[face] = value[0];
}
}
else
{
for (const int &face : temp) {
m_oneSelectedFace.remove(face);
}
}
if(enable[1])
{
for (const int &face : temp) {
m_twoSelectedFace.insert(face);
m_allSelectedFace.insert(face);
m_twoFace[face] = value[1];
}
}
else
{
for (const int &face : temp) {
m_twoSelectedFace.remove(face);
}
}
if(enable[2])
{
for (const int &face : temp) {
m_threeSelectedFace.insert(face);
m_allSelectedFace.insert(face);
m_threeFace[face] = value[2];
}
}
else
{
for (const int &face : temp) {
m_threeSelectedFace.remove(face);
}
}
if(enable[0] || enable[1] || enable[2])
{
double color[3] = {255,255,255};
double color2[3] = {255,0,255};
for (const int &face : temp) {
if(isSelectedFace(face))
{
m_picker->setFaceColor(face,color2);
}
else
{
m_picker->setFaceColor(face,color);
}
}
m_picker->faceRefresh();
}
m_picker->clearSelectedFace();
}
void BoundarySetting::deleteFaceData()
{
QSet<int>temp = m_picker->getSelectedFace();
for (const int &face : temp) {
m_allSelectedFace.remove(face);
m_oneSelectedFace.remove(face);
m_twoSelectedFace.remove(face);
m_threeSelectedFace.remove(face);
}
clearSelectedFace();
}
void BoundarySetting::batchSelectFace(int id)
{
double color[3] = {255,255,255};
// clearSelectedFace();
vtkDataArray *facecolor = m_cellStructure->GetCellData()->GetScalars();
qDebug()<<id;
for(int i=0;i<m_gridFaceToCell[id].size();i++)
{
int cellId = m_gridFaceToCell[id][i];
qDebug()<<cellId-1;
m_picker->addSelectedFace(cellId-1);
}
color[1] = 0;
color[2] = 0;
m_picker->setFaceColor(m_picker->getSelectedFace(),color);
qDebug()<<"m_gridFaceToCell[id].size()";
}
bool BoundarySetting::isSelectedFace(int face)
{
if(m_faceShowModel == 0)
{
return m_allSelectedFace.contains(face);
}
else if(m_faceShowModel == 1)
{
return m_oneSelectedFace.contains(face);
}
else if(m_faceShowModel == 2)
{
return m_twoSelectedFace.contains(face);
}
else if(m_faceShowModel == 3)
{
return m_threeSelectedFace.contains(face);
}
}
void BoundarySetting::setFaceShowModel(int type)
{
m_faceShowModel = type;
//清理所有颜色
m_picker->clearFaceColor();
//更新对应的颜色
double color[3] = {255,0,255};
if(m_faceShowModel == 0)
{
m_picker->setFaceColor(m_allSelectedFace,color);
}
else if(m_faceShowModel == 1)
{
m_picker->setFaceColor(m_oneSelectedFace,color);
}
else if(m_faceShowModel == 2)
{
m_picker->setFaceColor(m_twoSelectedFace,color);
}
else if(m_faceShowModel == 3)
{
m_picker->setFaceColor(m_threeSelectedFace,color);
}
else if(m_faceShowModel == 4)
{
color[1] = 255;
color[2] = 255;
m_picker->setFaceColor(m_threeSelectedFace,color);
}
//更新选中的颜色
color[1] = 0;
color[2] = 0;
m_picker->setFaceColor(m_picker->getSelectedFace(),color);
}
void BoundarySetting::clearSelectedFace()
{
double color[3] = {255,255,255};
double color2[3] = {255,0,255};
for (const int &face : m_picker->getSelectedFace()) {
if(isSelectedFace(face))
{
m_picker->setFaceColor(face,color2);
}
else
{
m_picker->setFaceColor(face,color);
}
}
m_picker->faceRefresh();
m_picker->clearSelectedFace();
}
void BoundarySetting::batchSelectPoint(int id)
{
double color[3] = {255,255,255};
// m_picker->setPointColor(m_picker->getSelectedPoint(),color); 清除之前的
// m_picker->clearSelectedPoint();
vtkDataArray *pointcolor = m_pointStructure->GetPointData()->GetScalars();
for(int pointId:m_gridFaceToPoint[id])
{
m_picker->addSelectedPoint(pointId-1);
}
color[1] = 0;
color[2] = 0;
m_picker->setPointColor(m_picker->getSelectedPoint(),color);
}
vtkSmartPointer<vtkActor> BoundarySetting::getPointActor()
{
return m_pointActor;
}
void BoundarySetting::setPointData(bool enable[3],double value[3])
{
QSet<int>temp = m_picker->getSelectedPoint();
if(enable[0])
{
for (const int &point : temp) {
m_uxSelectedPoint.insert(point);
m_allSelectedPoint.insert(point);
m_uxPoint[point] = value[0];
}
}
else//删除之前设置的
{
for (const int &point : temp) {
m_uxSelectedPoint.remove(point);
}
}
if(enable[1])
{
for (const int &point : temp) {
m_uySelectedPoint.insert(point);
m_allSelectedPoint.insert(point);
m_uyPoint[point] = value[1];
}
}
else//删除之前设置的
{
for (const int &point : temp) {
m_uySelectedPoint.remove(point);
}
}
if(enable[2])
{
for (const int &point : temp) {
m_uzSelectedPoint.insert(point);
m_allSelectedPoint.insert(point);
m_uzPoint[point] = value[2];
}
}
else//删除之前设置的
{
for (const int &point : temp) {
m_uzSelectedPoint.remove(point);
}
}
if(enable[0] || enable[1] || enable[2])
{
double color[3] = {255,255,255};
double color2[3] = {255,0,255};
for (const int &point : temp) {
if(isSelectedPoint(point))
{
m_picker->setPointColor(point,color2);
}
else
{
m_picker->setPointColor(point,color);
}
}
m_picker->pointRefresh();
}
m_picker->clearSelectedPoint();
}
void BoundarySetting::deletePointData()
{
QSet<int>temp = m_picker->getSelectedPoint();
for (const int &point : temp) {
m_allSelectedPoint.remove(point);
m_uxSelectedPoint.remove(point);
m_uySelectedPoint.remove(point);
m_uzSelectedPoint.remove(point);
}
clearSelectedPoint();
}
void BoundarySetting::setPointShowModel(int type)
{
m_pointShowModel = type;
//清理所有颜色
m_picker->clearPointColor();
//更新对应的颜色
double color[3] = {255,0,255};
if(m_pointShowModel == 0)
{
m_picker->setPointColor(m_allSelectedPoint,color);
}
else if(m_pointShowModel == 1)
{
m_picker->setPointColor(m_uxSelectedPoint,color);
}
else if(m_pointShowModel == 2)
{
m_picker->setPointColor(m_uySelectedPoint,color);
}
else if(m_pointShowModel == 3)
{
m_picker->setPointColor(m_uzSelectedPoint,color);
}
//更新选中的颜色
color[1] = 0;
color[2] = 0;
m_picker->setPointColor(m_picker->getSelectedPoint(),color);
}
bool BoundarySetting::isSelectedPoint(int point)
{
if(m_pointShowModel == 0)
{
return m_allSelectedPoint.contains(point);
}
else if(m_pointShowModel == 1)
{
return m_uxSelectedPoint.contains(point);
}
else if(m_pointShowModel == 2)
{
return m_uySelectedPoint.contains(point);
}
else if(m_pointShowModel == 3)
{
return m_uzSelectedPoint.contains(point);
}
return true;
}
void BoundarySetting::showPointData(int point)
{
bool enable[3] = {false,false,false};
double value[3];
if(m_uxSelectedPoint.contains(point))
{
enable[0] = true;
value[0] = m_uxPoint[point];
}
if(m_uySelectedPoint.contains(point))
{
enable[1] = true;
value[1] = m_uyPoint[point];
}
if(m_uzSelectedPoint.contains(point))
{
enable[2] = true;
value[2] = m_uzPoint[point];
}
m_displacementLimitSettingWidget->showData(point,enable,value);
}
void BoundarySetting::showFaceData(int faceId)
{
bool enable[3] = {false,false,false};
double value[3];
if(m_oneSelectedFace.contains(faceId))
{
enable[0] = true;
value[0] = m_oneFace[faceId];
}
if(m_twoSelectedFace.contains(faceId))
{
enable[1] = true;
value[1] = m_twoFace[faceId];
}
if(m_threeSelectedFace.contains(faceId))
{
enable[2] = true;
value[2] = m_threeFace[faceId];
}
m_distributedLoadSettingWidget->showData(faceId,enable,value);
}