LAMPCAE/src/GeometryCommand/GeoCommandMakeMatrix.cpp

458 lines
11 KiB
C++

#include "GeoCommandMakeMatrix.h"
#include "Geometry/geometryData.h"
#include "Geometry/geometrySet.h"
#include <TopoDS_Shape.hxx>
#include <gp_Ax2.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <TopoDS_Compound.hxx>
#include <BRep_Builder.hxx>
#include "Geometry/geometryParaMakeMatrix.h"
#include <QDebug>
namespace Command
{
CommandMakeMatrix::CommandMakeMatrix(GUI::MainWindow *m, MainWidget::PreWindow *p)
: GeoCommandBase(m, p)
{
}
bool CommandMakeMatrix::execute()
{
bool success = false;
const int count = _bodys.size();
if (_selectLinear)
{
QMultiHash<Geometry::GeometrySet *, int>::iterator iter = _solidhash.begin();
for (; iter != _solidhash.end(); ++iter)
{
Geometry::GeometrySet *set = iter.key();
QList<int> indexList = _solidhash.values(set);
TopoDS_Shape *shape = set->getShape(4, iter.value());
TopoDS_Compound aRes;
BRep_Builder aBuilder;
aBuilder.MakeCompound(aRes);
//获取vectors
QList<double *> vectors;
if (_selectDir2)
{
QList<double *> vecDir1List = getDir1Vector();
if (vecDir1List.size() < 1)
success = false;
QList<double *> vecDir2List = getDir2Vector();
if (vecDir2List.size() < 1)
success = false;
vectors = getVecSumlist(vecDir1List, vecDir2List);
}
else
{
vectors = getDir1Vector();
}
if (vectors.size() < 1)
success = false;
for (int i = 0; i < vectors.size(); ++i)
{
gp_Vec vec(vectors[i][0], vectors[i][1], vectors[i][2]);
gp_Trsf aTrsf;
aTrsf.SetTranslation(vec);
BRepBuilderAPI_Transform aBRespTrsf(*shape, aTrsf, true);
aBRespTrsf.Build();
if (!aBRespTrsf.IsDone())
continue;
aBuilder.Add(aRes, aBRespTrsf.Shape());
}
success = true;
TopoDS_Shape *mshape = new TopoDS_Shape;
*mshape = aRes;
QString name = QString("LinearMaxtrix-%1").arg(set->getName());
Geometry::GeometrySet *newset = new Geometry::GeometrySet;
newset->setName(name);
newset->setShape(mshape);
_geoData->appendGeometrySet(newset);
Geometry::GeometryParaMatrix *para = new Geometry::GeometryParaMatrix;
para->setOriSet(set);
for (int k = 0; k < indexList.size(); k++)
{
para->appendBody(set, indexList[k]);
}
para->setCurrentIndex(0);
para->setDirection1(_dir1);
para->setReverse1(_reverse1);
para->setDistance1(_dir1Distance);
para->setCount1(_dir1Count);
para->setShowDir2(_selectDir2);
newset->setParameter(para);
if (_selectDir2)
{
para->setDirection2(_dir2);
para->setReverse2(_reverse2);
para->setDistance2(_dir2Distance);
para->setCount2(_dir2Count);
}
if (_isEdit)
{
_geoData->removeTopGeometrySet(_editSet);
_releasenew = true;
_releaseEdit = false;
}
emit showSet(newset);
_resultHash.insert(newset, set);
}
}
if (_selectWire)
{
gp_Pnt pt(_basicPoint[0], _basicPoint[1], _basicPoint[2]);
getVecWire();
gp_Dir vec(_axisdir[0], _axisdir[1], _axisdir[2]);
gp_Ax1 ax;
ax.SetLocation(pt);
ax.SetDirection(vec);
QMultiHash<Geometry::GeometrySet *, int>::iterator iter = _solidhash.begin();
for (; iter != _solidhash.end(); ++iter)
{
Geometry::GeometrySet *set = iter.key();
QList<int> indexList = _solidhash.values(set);
TopoDS_Shape *shape = set->getShape(4, iter.value());
TopoDS_Compound aRes;
BRep_Builder aBuilder;
aBuilder.MakeCompound(aRes);
QList<double *> angleList = getAngleList();
for (int i = 0; i < angleList.size(); ++i)
{
gp_Trsf aTrsf;
aTrsf.SetRotation(ax, *angleList[i]);
BRepBuilderAPI_Transform aBRespTrsf(*shape, aTrsf, true);
aBRespTrsf.Build();
if (!aBRespTrsf.IsDone())
continue;
aBuilder.Add(aRes, aBRespTrsf.Shape());
if (aRes.IsNull())
continue;
}
success = true;
TopoDS_Shape *mshape = new TopoDS_Shape;
*mshape = aRes;
QString name = QString("WireMaxtrix-%1").arg(set->getName());
Geometry::GeometrySet *newset = new Geometry::GeometrySet;
newset->setName(name);
newset->setShape(mshape);
_geoData->appendGeometrySet(newset);
Geometry::GeometryParaMatrix *para = new Geometry::GeometryParaMatrix;
para->setOriSet(set);
for (int k = 0; k < indexList.size(); k++)
{
para->appendBody(set, indexList[k]);
}
para->setCurrentIndex(1);
para->setAxis(_basicPoint);
para->setAxisDir(_axisdir);
para->setAxisCount(_wireCount);
para->setAngle(_degree);
newset->setParameter(para);
if (_isEdit)
{
_geoData->removeTopGeometrySet(_editSet);
}
emit showSet(newset);
_resultHash.insert(newset, set);
}
}
emit updateGeoTree();
GeoCommandBase::execute();
return success;
}
void CommandMakeMatrix::undo()
{
if (_isEdit)
{
Geometry::GeometryModelParaBase *pm = _editSet->getParameter();
Geometry::GeometryParaMatrix *p = dynamic_cast<Geometry::GeometryParaMatrix *>(pm);
if (p == nullptr)
return;
Geometry::GeometrySet *ori = p->getOriSet();
if (ori == nullptr)
return;
auto newset = _resultHash.key(ori);
if (newset == nullptr)
return;
_geoData->replaceSet(_editSet, newset);
newset->removeSubSet(ori);
_editSet->removeSubSet(ori);
_geoData->removeTopGeometrySet(ori);
_geoData->appendGeometrySet(ori);
emit showSet(ori);
emit showSet(_editSet);
emit removeDisplayActor(newset);
emit updateGeoTree();
_releasenew = true;
_releaseEdit = false;
return;
}
QList<Geometry::GeometrySet *> geoList = _resultHash.keys();
for (int i = 0; i < geoList.size(); ++i)
{
Geometry::GeometrySet *set = geoList.at(i);
_geoData->removeTopGeometrySet(set);
emit removeDisplayActor(set);
}
emit updateGeoTree();
}
void CommandMakeMatrix::redo()
{
if (_isEdit)
{
Geometry::GeometryModelParaBase *pm = _editSet->getParameter();
Geometry::GeometryParaMatrix *p = dynamic_cast<Geometry::GeometryParaMatrix *>(pm);
if (p == nullptr)
return;
Geometry::GeometrySet *ori = p->getOriSet();
if (ori == nullptr)
return;
auto newset = _resultHash.key(ori);
if (newset == nullptr)
return;
_geoData->replaceSet(newset, _editSet);
newset->removeSubSet(ori);
_editSet->removeSubSet(ori);
_geoData->removeTopGeometrySet(ori);
_geoData->appendGeometrySet(ori);
emit showSet(ori);
emit showSet(newset);
emit removeDisplayActor(_editSet);
emit updateGeoTree();
_releasenew = false;
_releaseEdit = true;
return;
}
QList<Geometry::GeometrySet *> geoList = _resultHash.keys();
for (int i = 0; i < geoList.size(); ++i)
{
Geometry::GeometrySet *set = geoList.at(i);
_geoData->appendGeometrySet(set);
emit showSet(set);
}
emit updateGeoTree();
}
void CommandMakeMatrix::releaseResult()
{
QList<Geometry::GeometrySet *> geoList = _resultHash.keys();
for (int i = 0; i < geoList.size(); ++i)
{
Geometry::GeometrySet *set = geoList.at(i);
delete set;
}
}
void CommandMakeMatrix::setBodys(QMultiHash<Geometry::GeometrySet *, int> b)
{
_solidhash = b;
}
void CommandMakeMatrix::setSelectLinear(bool s)
{
_selectLinear = s;
}
void CommandMakeMatrix::setSelectWire(bool s)
{
_selectWire = s;
}
void CommandMakeMatrix::setOptionIndex(int i)
{
if (i == 0)
{
_selectLinear = true;
_selectWire = false;
}
else
{
_selectLinear = false;
_selectWire = true;
}
}
void CommandMakeMatrix::setBasicPoint(double *bp)
{
for (int i = 0; i < 3; ++i)
{
_basicPoint[i] = bp[i];
}
}
void CommandMakeMatrix::setAxisDir(double *dir)
{
for (int i = 0; i < 3; i++)
{
_axisdir[i] = dir[i];
}
}
void CommandMakeMatrix::setDir1(double *dir)
{
_dir1[0] = dir[0];
_dir1[1] = dir[1];
_dir1[2] = dir[2];
}
void CommandMakeMatrix::setReverse1(bool s)
{
_reverse1 = s;
}
void CommandMakeMatrix::setDir1Distance(double d)
{
_dir1Distance = d;
}
void CommandMakeMatrix::setDir1Count(int count)
{
_dir1Count = count;
}
void CommandMakeMatrix::setDir2IsChecked(bool k)
{
_selectDir2 = k;
}
void CommandMakeMatrix::setDir2(double *dir)
{
_dir2[0] = dir[0];
_dir2[1] = dir[1];
_dir2[2] = dir[2];
}
void CommandMakeMatrix::setReverse2(bool s)
{
_reverse2 = s;
}
void CommandMakeMatrix::setDir2Distance(double d)
{
_dir2Distance = d;
}
void CommandMakeMatrix::setDir2Count(int count)
{
_dir2Count = count;
}
void CommandMakeMatrix::setWireCount(int s)
{
_wireCount = s;
}
void CommandMakeMatrix::setDegree(double d)
{
_degree = d;
}
void CommandMakeMatrix::setWireRevers(bool s)
{
_reversewire = s;
}
void CommandMakeMatrix::getVecWire()
{
double mod = _axisdir[0] * _axisdir[0] + _axisdir[1] * _axisdir[1] + _axisdir[2] * _axisdir[2];
if (mod < 0.000001)
return;
if (_reversewire)
for (int i = 0; i < 3; ++i)
_axisdir[i] *= -1;
}
QList<double *> CommandMakeMatrix::getAngleList()
{
QList<double *> angleList{};
for (int i = 1; i < _wireCount; ++i)
{
double temp = _degree * i;
double *angle = new double;
*angle = temp * PI / 180.00;
angleList.append(angle);
}
return angleList;
}
QList<double *> CommandMakeMatrix::getDir1Vector()
{
QList<double *> vectors{};
if (_reverse1)
{
for (int i = 0; i < 3; ++i)
_dir1[i] *= -1;
}
double mod = sqrt(_dir1[0] * _dir1[0] + _dir1[1] * _dir1[1] + _dir1[2] * _dir1[2]);
for (int i = 1; i < _dir1Count; ++i)
{
double *veccopy = new double[3]{};
double length = i * _dir1Distance;
double fac = length / mod;
for (int i = 0; i < 3; ++i)
{
veccopy[i] = fac * _dir1[i];
}
vectors.append(veccopy);
}
return vectors;
}
QList<double *> CommandMakeMatrix::getDir2Vector()
{
QList<double *> vectors{};
if (_reverse2)
{
for (int i = 0; i < 3; ++i)
_dir2[i] *= -1;
}
double mod = sqrt(_dir2[0] * _dir2[0] + _dir2[1] * _dir2[1] + _dir2[2] * _dir2[2]);
for (int i = 1; i < _dir2Count; ++i)
{
double *veccopy = new double[3]{};
double length = i * _dir2Distance;
double fac = length / mod;
for (int i = 0; i < 3; ++i)
{
veccopy[i] = fac * _dir2[i];
}
vectors.append(veccopy);
}
return vectors;
}
QList<double *> CommandMakeMatrix::getVecSumlist(QList<double *> dir1list, QList<double *> dir2list)
{
QList<double *> sumList{};
for (int i = 0; i < dir1list.size(); ++i)
{
for (int j = 0; j < dir2list.size(); ++j)
{
double *vecTmep = new double[3]{};
vecTmep[0] = (dir1list[i][0] + dir2list[j][0]);
vecTmep[1] = (dir1list[i][1] + dir2list[j][1]);
vecTmep[2] = (dir1list[i][2] + dir2list[j][2]);
sumList.append(vecTmep);
}
}
sumList.append(dir1list);
sumList.append(dir2list);
return sumList;
}
}