413 lines
11 KiB
C++
413 lines
11 KiB
C++
#include "OCCTBase.h"
|
|
#include "referenceHeader.h"
|
|
#include <BRepPrimAPI_MakeBox.hxx>
|
|
|
|
|
|
// ===================================================================
|
|
// 常用函数方法
|
|
// ===================================================================
|
|
|
|
|
|
OCCTShapeType str2OCCTShapeType(QString str)
|
|
{
|
|
if (str.isEmpty()) {
|
|
return OCCTShapeType::NoneType;
|
|
}
|
|
else if (str.toUpper() == "STL") {
|
|
return OCCTShapeType::STL;
|
|
}
|
|
else if (str.toUpper() == "STEP") {
|
|
return OCCTShapeType::STEP;
|
|
}
|
|
else if (str.toUpper() == "IGES") {
|
|
return OCCTShapeType::IGES;
|
|
}
|
|
else {
|
|
return OCCTShapeType::NoneType;
|
|
}
|
|
return OCCTShapeType();
|
|
}
|
|
|
|
QStringList getOCCTShapeTypeEmnu()
|
|
{
|
|
QStringList list;
|
|
list.push_back(QString(u8"STL"));
|
|
list.push_back(QString(u8"STEP"));
|
|
list.push_back(QString(u8"IGES"));
|
|
|
|
return list;
|
|
}
|
|
|
|
QString getOCCTShapeTypeFilterString()
|
|
{
|
|
return QString(u8"STL Files (*.stl);;STL Files (*.stla);;step Files (*.stp);;step Files (*.step);;IGES Files (*.iges);;IGES Files (*.igs)");
|
|
}
|
|
|
|
QString get_STL_FilterString()
|
|
{
|
|
return QString(u8"STL Files (*.stl);;STL Files (*.stla)");
|
|
}
|
|
|
|
QString get_STEP_FilterString()
|
|
{
|
|
return QString(u8"step Files (*.stp);;step Files (*.step)");
|
|
}
|
|
|
|
QString get_IGES_FilterString()
|
|
{
|
|
return QString(u8"IGES Files (*.iges);;IGES Files (*.igs)");
|
|
}
|
|
|
|
QString getOCCTShapeTypeFilterString(OCCTShapeType switch_on)
|
|
{
|
|
switch (switch_on)
|
|
{
|
|
case(OCCTShapeType::STL): {return get_STL_FilterString(); }
|
|
case(OCCTShapeType::STEP): {return get_STEP_FilterString(); }
|
|
case(OCCTShapeType::IGES): {return get_IGES_FilterString(); }
|
|
|
|
default:
|
|
return getOCCTShapeTypeFilterString();
|
|
}
|
|
}
|
|
|
|
QString getOCCTShapeTypeFilterString(QString str)
|
|
{
|
|
return getOCCTShapeTypeFilterString(str2OCCTShapeType(str));
|
|
}
|
|
|
|
bool SaveTopoDs_Stl(QString FilePath, const TopoDS_Shape& shape) {
|
|
// 将形状保存为 STL 文件
|
|
qDebug() << u8"SaveTopoDs_Stl " << FilePath;
|
|
StlAPI_Writer writer;
|
|
writer.Write(shape, FilePath.toStdString().c_str()); // 保存为stl模型
|
|
return true;
|
|
}
|
|
bool SaveTopoDs_Step(QString FilePath, const TopoDS_Shape& shape) {
|
|
qDebug() << u8"SaveTopoDs_Step " << FilePath;
|
|
STEPControl_Writer writer;
|
|
writer.Transfer(shape, STEPControl_AsIs);
|
|
writer.Write(FilePath.toStdString().c_str());
|
|
return true;
|
|
}
|
|
bool SaveTopoDs_IGES(QString FilePath,const TopoDS_Shape& shape) {
|
|
qDebug() << u8"SaveTopoDs_IGES " << FilePath;
|
|
IGESControl_Writer writer;
|
|
writer.AddShape(shape);
|
|
writer.Write(FilePath.toStdString().c_str());
|
|
return true;
|
|
}
|
|
|
|
bool SaveTopoDs(QString FilePath,const TopoDS_Shape& DataShape, OCCTShapeType shapetype)
|
|
{
|
|
switch (shapetype)
|
|
{
|
|
case(OCCTShapeType::STL): { // 保存为stl
|
|
|
|
SaveTopoDs_Stl(FilePath, DataShape);
|
|
break;
|
|
}
|
|
case(OCCTShapeType::STEP): {
|
|
SaveTopoDs_Step(FilePath, DataShape);
|
|
break;
|
|
}
|
|
case(OCCTShapeType::IGES): {
|
|
|
|
SaveTopoDs_IGES(FilePath, DataShape);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
TopoDS_Shape ReadTopoDs_IGES(QString Filepath) {
|
|
IGESControl_Reader reader;
|
|
reader.ReadFile(Filepath.toStdString().c_str());
|
|
reader.TransferRoots();
|
|
TopoDS_Shape shape = reader.OneShape();
|
|
return shape;
|
|
}
|
|
TopoDS_Shape ReadTopoDs_Stl(QString Filepath) {
|
|
TopoDS_Shape shape_TopoDs;
|
|
StlAPI_Reader aReader_Stl;
|
|
aReader_Stl.Read(shape_TopoDs, Filepath.toStdString().c_str());
|
|
return shape_TopoDs;
|
|
}
|
|
TopoDS_Shape ReadTopoDs_Step(QString Filepath) {
|
|
TopoDS_Shape shape;
|
|
STEPControl_Reader reader;
|
|
IFSelect_ReturnStatus status = reader.ReadFile(Filepath.toStdString().c_str());
|
|
if (status == IFSelect_RetDone) {
|
|
reader.TransferRoots();
|
|
shape = reader.OneShape();
|
|
return shape;
|
|
}
|
|
else {
|
|
return shape;
|
|
}
|
|
}
|
|
|
|
OCCTShapeType ReadTopoDs_Shape(QString filepath, TopoDS_Shape& shape_TopoDs)
|
|
{
|
|
QFileInfo fileinfo(filepath);
|
|
QString filename = fileinfo.fileName();
|
|
QString fileSuffix = fileinfo.suffix();
|
|
OCCTShapeType shapetype;
|
|
if (fileSuffix.compare(u8"stl") == 0 || fileSuffix.compare(u8"stla") == 0) {
|
|
shapetype = OCCTShapeType::STL;
|
|
shape_TopoDs = ReadTopoDs_Stl(filepath);
|
|
return shapetype;
|
|
}
|
|
else if (fileSuffix.compare(u8"step") == 0 || fileSuffix.compare(u8"stp") == 0) {
|
|
shapetype = OCCTShapeType::STEP;
|
|
shape_TopoDs = ReadTopoDs_Step(filepath);
|
|
return shapetype;
|
|
}
|
|
else if (fileSuffix.compare(u8"iges") == 0 || fileSuffix.compare(u8"igs") == 0) {
|
|
shapetype = OCCTShapeType::IGES;
|
|
shape_TopoDs = ReadTopoDs_IGES(filepath);
|
|
return shapetype;
|
|
}
|
|
else {
|
|
qDebug() << QString(u8"=================open Model ====================\n");
|
|
qDebug() << QString(u8"don't open model\n");
|
|
qDebug() << filepath;
|
|
qDebug() << QString(u8"=====================================\n");
|
|
return OCCTShapeType::NoneType;
|
|
}
|
|
}
|
|
|
|
TopoDS_Shape MergedTopoShape(std::vector<TopoDS_Shape> TopoDS_Shapelist)
|
|
{
|
|
// 创建一个复合体
|
|
TopoDS_Compound compound;
|
|
BRep_Builder builder;
|
|
builder.MakeCompound(compound);
|
|
|
|
// 将所有的形状添加到复合体中
|
|
for (const TopoDS_Shape& shape : TopoDS_Shapelist) {
|
|
builder.Add(compound, shape);
|
|
}
|
|
|
|
// 返回合并后的复合体
|
|
return compound;
|
|
|
|
}
|
|
|
|
void ChangeModelColor(Handle(AIS_Shape)& aisShape, Quantity_Color& redColor)
|
|
{
|
|
|
|
// 将颜色应用到模型
|
|
aisShape->SetColor(redColor);
|
|
}
|
|
|
|
|
|
|
|
TopoDS_Shape CreateArrow(const gp_Dir& direction, Standard_Real length, Standard_Real radius) {
|
|
// 创建一个圆柱作为箭头的主体
|
|
gp_Pnt origin(0, 0, 0);
|
|
gp_Ax2 axis(origin, direction);
|
|
BRepPrimAPI_MakeCylinder cylinder(axis, radius, length - radius * 2);
|
|
|
|
// 创建一个圆锥作为箭头的尖端
|
|
gp_Pnt tip = origin.Translated(length * gp_Vec(direction));
|
|
gp_Ax2 coneAxis(tip, direction);
|
|
BRepPrimAPI_MakeCone cone(coneAxis, radius * 2, 0, radius * 2);
|
|
|
|
// 合并圆柱和圆锥
|
|
TopoDS_Compound compound;
|
|
BRep_Builder builder;
|
|
builder.MakeCompound(compound);
|
|
builder.Add(compound, cylinder.Shape());
|
|
builder.Add(compound, cone.Shape());
|
|
|
|
return compound;
|
|
|
|
}
|
|
|
|
gp_Trsf GetTransFormFromVector(const gp_Vec& vectorA, const gp_Vec& vectorB)
|
|
{
|
|
// 计算旋转轴和旋转角度
|
|
gp_Vec rotationAxis = vectorA.Crossed(vectorB);
|
|
Standard_Real rotationAngle = vectorA.Angle(vectorB);
|
|
if (rotationAxis.X() != 0 || rotationAxis.Y() != 0 || rotationAxis.Z() != 0) {
|
|
// 创建变换,绕旋转轴旋转指定角度
|
|
gp_Trsf transformation;
|
|
transformation.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), rotationAxis), rotationAngle);
|
|
return transformation;
|
|
}
|
|
else {
|
|
// 创建变换,绕旋转轴旋转指定角度
|
|
gp_Trsf transformation;
|
|
transformation.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), gp_Vec(0, 0, 1)), 0);
|
|
return transformation;
|
|
}
|
|
|
|
}
|
|
|
|
TopoDS_Shape Process_RotationThetaPhi_MoveXYZ(TopoDS_Shape shape, double theta, double phi, double X, double Y, double Z)
|
|
{
|
|
gp_Vec Position(gp_Pnt(0, 0, 0), gp_Pnt(X, Y, Z));
|
|
gp_Trsf rotationTransform_theta;
|
|
rotationTransform_theta.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0, 1, 0)), theta); // 绕 y 轴旋转
|
|
gp_Trsf rotationTransform_phi;
|
|
rotationTransform_phi.SetRotation(gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)), phi); // 绕 z 轴旋转
|
|
gp_Trsf moveTransform_xyz;
|
|
moveTransform_xyz.SetTranslation(Position);
|
|
|
|
BRepBuilderAPI_Transform shapeTransform_theta(shape, rotationTransform_theta);
|
|
TopoDS_Shape tempShape_theta = shapeTransform_theta.Shape();
|
|
BRepBuilderAPI_Transform shapeTransform_phi(tempShape_theta, rotationTransform_phi);
|
|
TopoDS_Shape tempShape_phi = shapeTransform_phi.Shape();
|
|
BRepBuilderAPI_Transform shapeTransform_move(tempShape_phi, moveTransform_xyz);
|
|
TopoDS_Shape result = shapeTransform_move.Shape();
|
|
|
|
return result;
|
|
}
|
|
|
|
TopoDS_Shape CreateCartesianCoordinatesAxis(double xlength, double ylength, double zlength)
|
|
{
|
|
|
|
// 创建三个方向的箭头
|
|
TopoDS_Shape arrow1 = CreateArrow(gp_Dir(1, 0, 0), xlength, xlength*0.05); // X方向
|
|
TopoDS_Shape arrow2 = CreateArrow(gp_Dir(0, 1, 0), ylength, ylength*0.05); // Y方向
|
|
TopoDS_Shape arrow3 = CreateArrow(gp_Dir(0, 0, 1), zlength, zlength*0.05); // Z方向
|
|
|
|
// 创建雷达模型
|
|
|
|
gp_Ax2 modelCoor = gp_Ax2(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1), gp_Dir(1, 0, 0));
|
|
|
|
|
|
// 创建一个包含所有箭头的复合体
|
|
TopoDS_Compound compound;
|
|
BRep_Builder builder;
|
|
|
|
|
|
builder.MakeCompound(compound);
|
|
builder.Add(compound, arrow1);
|
|
builder.Add(compound, arrow2);
|
|
builder.Add(compound, arrow3);
|
|
|
|
return compound;
|
|
}
|
|
|
|
TopoDS_Shape CreateBox(double x, double y, double z)
|
|
{
|
|
// 创建一个长方体
|
|
BRepPrimAPI_MakeBox box(gp_Pnt(-x / 2, -y / 2, -z / 2), gp_Pnt(x / 2, y / 2, z / 2));
|
|
return box.Shape();
|
|
}
|
|
|
|
TopoDS_Shape CreateCylinder(double radius, double height)
|
|
{
|
|
BRepPrimAPI_MakeCylinder makeCylinder(radius, height);
|
|
TopoDS_Shape cylinderShape = makeCylinder.Shape();
|
|
return cylinderShape;
|
|
}
|
|
|
|
TopoDS_Shape CreateCone(double radius1, double radius2, double height)
|
|
{
|
|
BRepPrimAPI_MakeCone mkCone = BRepPrimAPI_MakeCone::BRepPrimAPI_MakeCone(radius1, radius2, height);
|
|
TopoDS_Shape coneShape = mkCone.Shape();
|
|
|
|
return coneShape;
|
|
}
|
|
|
|
TopoDS_Shape CreateSphere(double radius)
|
|
{
|
|
return TopoDS_Shape();
|
|
}
|
|
|
|
TopoDS_Shape CreateTorus(double majorRadius, double minorRadius)
|
|
{
|
|
return TopoDS_Shape();
|
|
}
|
|
|
|
TopoDS_Shape Cut(TopoDS_Shape& shape1, TopoDS_Shape& shape2)
|
|
{
|
|
|
|
return TopoDS_Shape();
|
|
}
|
|
|
|
TopoDS_Shape Fuse(TopoDS_Shape& shape1, TopoDS_Shape& shape2)
|
|
{
|
|
|
|
return TopoDS_Shape();
|
|
}
|
|
|
|
TopoDS_Shape Rotate(TopoDS_Shape& shape, gp_Ax1 axis, double angle)
|
|
{
|
|
// 进行旋转
|
|
angle= angle * M_PI / 180;
|
|
gp_Trsf rotation;
|
|
rotation.SetRotation(axis, angle); // X
|
|
BRepBuilderAPI_Transform rotateTransform_X(shape, rotation);
|
|
return rotateTransform_X.Shape();
|
|
}
|
|
|
|
TopoDS_Shape Translate(TopoDS_Shape& shape, gp_Vec move_vec)
|
|
{
|
|
gp_Trsf translation;
|
|
translation.SetTranslation(move_vec);
|
|
BRepBuilderAPI_Transform translateTransform(shape, translation);
|
|
return translateTransform.Shape();
|
|
}
|
|
|
|
TopoDS_Shape Scale(TopoDS_Shape& shape, gp_Pnt refrenceCenter, double scale)
|
|
{
|
|
gp_Trsf scaleTransform;
|
|
scaleTransform.SetScale(refrenceCenter, scale);
|
|
BRepBuilderAPI_Transform scaleTransformBuilder(shape, scaleTransform);
|
|
return scaleTransformBuilder.Shape();
|
|
}
|
|
|
|
TopoDS_Shape createConicalHorn(double bottomRadius, double bottomHeight, double topRadius, double topHeight)
|
|
{
|
|
|
|
BRepPrimAPI_MakeCone mkCone = BRepPrimAPI_MakeCone::BRepPrimAPI_MakeCone(bottomRadius,topRadius,topHeight);
|
|
TopoDS_Shape coneShape = mkCone.Shape();
|
|
|
|
// 整体平移
|
|
gp_Vec trans_vec(gp_Pnt(0, 0, 0), gp_Pnt(0, 0, bottomHeight));
|
|
gp_Trsf move_trsf;
|
|
move_trsf.SetTranslation(trans_vec);
|
|
BRepBuilderAPI_Transform shapeTransform_move(coneShape, move_trsf); // fly_Z --> incidenceAngle
|
|
TopoDS_Shape tempShape = shapeTransform_move.Shape(); // 平移卫星模型
|
|
|
|
|
|
BRepPrimAPI_MakeCylinder makeCylinder(bottomRadius, bottomHeight);
|
|
TopoDS_Shape cylinderShape = makeCylinder.Shape();
|
|
|
|
// 创建一个包含所有箭头的复合体
|
|
TopoDS_Compound compound;
|
|
BRep_Builder builder;
|
|
|
|
builder.MakeCompound(compound);
|
|
builder.Add(compound, tempShape);
|
|
builder.Add(compound, cylinderShape);
|
|
|
|
return compound;
|
|
}
|
|
|
|
TopoDS_Shape createPyramidalHorn(double bottomWidth, double bottomHeight, double bottomAtl, double topWidth, double topHeight, double topAtl)
|
|
{
|
|
|
|
|
|
|
|
return TopoDS_Shape();
|
|
}
|
|
|
|
TopoDS_Shape CreateWedge(double x, double y, double z)
|
|
{
|
|
|
|
|
|
|
|
|
|
return TopoDS_Shape();
|
|
}
|