You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Component/FITKGeoCompOCC/FITKOCCModelCurve.cpp

1039 lines
34 KiB
C++

#include "FITKOCCModelCurve.h"
#include <gp_Pnt.hxx>
#include <gp_Circ.hxx>
#include <gp_Elips.hxx>
#include <gp_Hypr.hxx>
#include <gp_Parab.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <Geom_OffsetCurve.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS.hxx>
#include <BRep_Tool.hxx>
#include <Geom_Curve.hxx>
#include <gce_MakeCirc.hxx>
#include <gce_MakeElips.hxx>
#include <gce_MakeHypr.hxx>
#include <gce_MakeParab.hxx>
#include <GeomAPI_IntSS.hxx>
#include <GeomProjLib.hxx>
#include <TopoDS_Face.hxx>
#include <BRepAlgoAPI_Section.hxx>
#include <BOPAlgo_PaveFiller.hxx>
#include <BOPDS_DS.hxx>
#include <GeomAPI_PointsToBSpline.hxx>
#include <Geom_BSplineCurve.hxx>
#include <GeomLib_Tool.hxx>
#include <Geom_BezierCurve.hxx>
#include <TopExp_Explorer.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <GC_MakeArcOfEllipse.hxx>
#include <GC_MakeArcOfHyperbola.hxx>
#include <GC_MakeArcOfParabola.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <GeomAPI_ProjectPointOnSurf.hxx>
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeoEnum.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKVirtualTopoManager.h"
#include "FITKOCCVirtualTopoCreator.h"
#include "FITK_Kernel/FITKAppFramework/FITKAppFramework.h"
#include "FITK_Kernel/FITKAppFramework/FITKGlobalData.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeoCommandList.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKGeoInterfaceFactory.h"
#include "FITK_Interface/FITKInterfaceGeometry/FITKAbsGeoModelSurface.h"
namespace OCC
{
// 构造函数
FITKOCCModelLine::FITKOCCModelLine() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelLine::update()
{
return true;
}
// 构造函数
FITKOCCModelSegment::FITKOCCModelSegment() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelSegment::update()
{
gp_Pnt start(m_StartPoint[0], m_StartPoint[1], m_StartPoint[2]);
gp_Pnt end(m_EndPoint[0], m_EndPoint[1], m_EndPoint[2]);
try {
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(start, end).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelWire::FITKOCCModelWire() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelWire::update()
{
int count = m_Points.count();
if (count < 2) return false;
BRepBuilderAPI_MakeWire wire;
try {
for (int i = 1; i < count; ++i) {
gp_Pnt start(m_Points.at(i - 1)[0], m_Points.at(i - 1)[1], m_Points.at(i - 1)[2]);
gp_Pnt end(m_Points.at(i)[0], m_Points.at(i)[1], m_Points.at(i)[2]);
wire.Add(BRepBuilderAPI_MakeEdge(start, end));
}
_occShapeAgent->updateShape(wire.Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelCircle::FITKOCCModelCircle() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelCircle::update()
{
gp_Ax2 ax2;
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
gp_Dir dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]);
gp_Dir yDir(m_YDirection[0], m_YDirection[1], m_YDirection[2]);
ax2.SetLocation(center);
ax2.SetDirection(dir);
ax2.SetYDirection(yDir);
gp_Circ c(ax2, m_Radius);
try {
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(c).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelThreePointsCircle::FITKOCCModelThreePointsCircle() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelThreePointsCircle::update()
{
try
{
auto p1 = m_Points.at(0);
auto p2 = m_Points.at(1);
auto p3 = m_Points.at(2);
gce_MakeCirc circle(gp_Pnt(p1[0], p1[1], p1[2]), gp_Pnt(p2[0], p2[1], p2[2]), gp_Pnt(p3[0], p3[1], p3[2]));
if (!circle.IsDone()) {
printLog("Failed to make circle!", 3);
return false;
}
gp_Circ c = circle.Value();
BRepBuilderAPI_MakeEdge edge(c);
if (!edge.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
auto loc = c.Location();
m_Origin = { loc.X(), loc.Y(), loc.Z() };
m_Radius = c.Radius();
auto pos = c.Position();
gp_Dir dir = pos.XDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.YDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.Direction();
m_ZDirection = { dir.X(), dir.Y(), dir.Z() };
_occShapeAgent->updateShape(edge.Shape());
return true;
}
catch (...)
{
printLog("Failed to make circle!", 3);
return false;
}
}
// 构造函数
FITKOCCModelCircleArc::FITKOCCModelCircleArc() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelCircleArc::update()
{
gp_Ax2 ax2;
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
gp_Dir dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]);
gp_Dir yDir(m_YDirection[0], m_YDirection[1], m_YDirection[2]);
ax2.SetLocation(center);
ax2.SetDirection(dir);
ax2.SetYDirection(yDir);
gp_Circ circle(ax2, m_Radius);
gp_Pnt start(m_StartPoint[0], m_StartPoint[1], m_StartPoint[2]);
gp_Pnt end(m_EndPoint[0], m_EndPoint[1], m_EndPoint[2]);
try {
GC_MakeArcOfCircle circleArc(circle, start, end, true);
if (!circleArc.IsDone()) return false;
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(circleArc.Value()).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelEllipse::FITKOCCModelEllipse() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelEllipse::update()
{
gp_Elips e;
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
e.SetPosition(
gp_Ax2(center,
gp_Dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]),
gp_Dir(m_XDirection[0], m_XDirection[1], m_XDirection[2]))
);
e.SetMajorRadius(m_MajorRadius);
e.SetMinorRadius(m_MinorRadius);
try {
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(e).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelThreePointsEllipse::FITKOCCModelThreePointsEllipse() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelThreePointsEllipse::update()
{
try
{
gce_MakeElips ellipse(
gp_Pnt(m_MajorPoint[0], m_MajorPoint[1], m_MajorPoint[2]),
gp_Pnt(m_MinorPoint[0], m_MinorPoint[1], m_MinorPoint[2]),
gp_Pnt(m_Origin[0], m_Origin[1], m_Origin[2]));
gp_Elips e = ellipse.Value();
BRepBuilderAPI_MakeEdge edge(e);
if (!edge.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
auto loc = e.Location();
m_Origin = { loc.X(), loc.Y(), loc.Z() };
m_MajorRadius = e.MajorRadius();
m_MinorRadius = e.MinorRadius();
auto pos = e.Position();
gp_Dir dir = pos.XDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.YDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.Direction();
m_ZDirection = { dir.X(), dir.Y(), dir.Z() };
_occShapeAgent->updateShape(edge.Shape());
return true;
}
catch (...)
{
printLog("Failed to make ellipse!", 3);
return false;
}
}
// 构造函数
FITKOCCModelEllipseArc::FITKOCCModelEllipseArc() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelEllipseArc::update()
{
gp_Elips e;
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
e.SetPosition(
gp_Ax2(center,
gp_Dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]),
gp_Dir(m_XDirection[0], m_XDirection[1], m_XDirection[2]))
);
e.SetMajorRadius(m_MajorRadius);
e.SetMinorRadius(m_MinorRadius);
gp_Pnt start(m_StartPoint[0], m_StartPoint[1], m_StartPoint[2]);
gp_Pnt end(m_EndPoint[0], m_EndPoint[1], m_EndPoint[2]);
try {
GC_MakeArcOfEllipse ellipseArc(e, start, end, true);
if (!ellipseArc.IsDone()) return false;
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(ellipseArc.Value()).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelHyperbola::FITKOCCModelHyperbola() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelHyperbola::update()
{
gp_Hypr h;
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
h.SetPosition(
gp_Ax2(center,
gp_Dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]),
gp_Dir(m_XDirection[0], m_XDirection[1], m_XDirection[2]))
);
h.SetMajorRadius(m_MajorRadius);
h.SetMinorRadius(m_MinorRadius);
try {
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(h).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelThreePointsHyperbola::FITKOCCModelThreePointsHyperbola() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelThreePointsHyperbola::update()
{
try
{
gce_MakeHypr hyper(
gp_Pnt(m_MajorPoint[0], m_MajorPoint[1], m_MajorPoint[2]),
gp_Pnt(m_MinorPoint[0], m_MinorPoint[1], m_MinorPoint[2]),
gp_Pnt(m_Origin[0], m_Origin[1], m_Origin[2]));
gp_Hypr h = hyper.Value();
BRepBuilderAPI_MakeEdge edge(h);
if (!edge.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
auto loc = h.Location();
m_Origin = { loc.X(), loc.Y(), loc.Z() };
m_MajorRadius = h.MajorRadius();
m_MinorRadius = h.MinorRadius();
auto pos = h.Position();
gp_Dir dir = pos.XDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.YDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.Direction();
m_ZDirection = { dir.X(), dir.Y(), dir.Z() };
_occShapeAgent->updateShape(edge.Shape());
return true;
}
catch (...)
{
printLog("Failed to make hyperbola!", 3);
return false;
}
}
FITKOCCModelHyperbolaArc::FITKOCCModelHyperbolaArc() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
bool FITKOCCModelHyperbolaArc::update()
{
gp_Hypr h;
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
h.SetPosition(
gp_Ax2(center,
gp_Dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]),
gp_Dir(m_XDirection[0], m_XDirection[1], m_XDirection[2]))
);
h.SetMajorRadius(m_MajorRadius);
h.SetMinorRadius(m_MinorRadius);
gp_Pnt start(m_StartPoint[0], m_StartPoint[1], m_StartPoint[2]);
gp_Pnt end(m_EndPoint[0], m_EndPoint[1], m_EndPoint[2]);
try {
GC_MakeArcOfHyperbola hyperArc(h, start, end, false);
if (!hyperArc.IsDone()) return false;
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(hyperArc.Value()).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelParabola::FITKOCCModelParabola() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelParabola::update()
{
gp_Parab p;
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
p.SetPosition(
gp_Ax2(center,
gp_Dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]),
gp_Dir(m_XDirection[0], m_XDirection[1], m_XDirection[2]))
);
p.SetFocal(m_FocalLength);
try {
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(p).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelThreePointsParabola::FITKOCCModelThreePointsParabola() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelThreePointsParabola::update()
{
try
{
auto p1 = m_Points.at(1);
auto p2 = m_Points.at(2);
auto p3 = m_Points.at(0);
gp_Ax1 ax1(gp_Pnt(p1[0], p1[1], p1[2]), gp_Dir(p2[0] - p1[0], p2[1] - p1[1], p2[2] - p1[2]));
gce_MakeParab parab(ax1, gp_Pnt(p3[0], p3[1], p3[2]));
if (!parab.IsDone()) {
printLog("Failed to make parabola!", 3);
return false;
}
gp_Parab p = parab.Value();
BRepBuilderAPI_MakeEdge edge(p);
if (!edge.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
auto loc = p.Location();
m_Origin = { loc.X(), loc.Y(), loc.Z() };
m_FocalLength = p.Focal();
auto pos = p.Position();
gp_Dir dir = pos.XDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.YDirection();
m_XDirection = { dir.X(), dir.Y(), dir.Z() };
dir = pos.Direction();
m_ZDirection = { dir.X(), dir.Y(), dir.Z() };
_occShapeAgent->updateShape(edge.Shape());
return true;
}
catch (const std::exception&)
{
printLog("Failed to make parabola!", 3);
return false;
}
}
FITKOCCModelParabolaArc::FITKOCCModelParabolaArc() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
bool FITKOCCModelParabolaArc::update()
{
gp_Pnt center(m_Origin[0], m_Origin[1], m_Origin[2]);
gp_Ax2 ax2(center,
gp_Dir(m_ZDirection[0], m_ZDirection[1], m_ZDirection[2]),
gp_Dir(m_XDirection[0], m_XDirection[1], m_XDirection[2]));
auto x = ax2.Direction();
x = ax2.XDirection();
gp_Parab p(ax2, m_FocalLength);
gp_Pnt start(m_StartPoint[0], m_StartPoint[1], m_StartPoint[2]);
gp_Pnt end(m_EndPoint[0], m_EndPoint[1], m_EndPoint[2]);
try {
GC_MakeArcOfParabola paraArc(p, start, end, true);
if (!paraArc.IsDone()) return false;
_occShapeAgent->updateShape(BRepBuilderAPI_MakeEdge(paraArc.Value()).Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelBeizeByControlPoints::FITKOCCModelBeizeByControlPoints() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelBeizeByControlPoints::update()
{
TColgp_Array1OfPnt aPoles(1, m_ControlPoints.size());
for (int i = 0; i < m_ControlPoints.size(); ++i)
{
auto xyz = m_ControlPoints[i];
aPoles.SetValue(i + 1, gp_Pnt(xyz[0], xyz[1], xyz[2]));
}
try {
// Create Bezier curve.
Handle(Geom_BezierCurve) aBezierCurve = new Geom_BezierCurve(aPoles);
BRepBuilderAPI_MakeEdge anAisBezierCurve(aBezierCurve);
if (!anAisBezierCurve.IsDone()) return false;
_occShapeAgent->updateShape(anAisBezierCurve.Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelBsplineByThroughPoints::FITKOCCModelBsplineByThroughPoints() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelBsplineByThroughPoints::update()
{
Handle(TColgp_HArray1OfPnt) aPoles = new TColgp_HArray1OfPnt(1, m_ThroughPoints.size());
for (int i = 0; i < m_ThroughPoints.size(); ++i)
{
auto xyz = m_ThroughPoints[i];
aPoles->SetValue(i + 1, gp_Pnt(xyz[0], xyz[1], xyz[2]));
}
try {
GeomAPI_Interpolate bspline_generator(aPoles, false, 1e-7);
bspline_generator.Perform();
if (!bspline_generator.IsDone()) return false;
Handle(Geom_BSplineCurve) bSplineCurve = bspline_generator.Curve();
BRepBuilderAPI_MakeEdge anBCurve(bSplineCurve);
if (!anBCurve.IsDone()) return false;
_occShapeAgent->updateShape(anBCurve.Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
// 构造函数
FITKOCCModelTrimmedCurve::FITKOCCModelTrimmedCurve() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
// 更新数据
bool FITKOCCModelTrimmedCurve::update()
{
//gp_Pnt pt(m_X, m_Y, m_Z);
//_occShapeAgent->updateShape(BRepBuilderAPI_MakeVertex(pt).Shape());
return false;
}
FITKOCCModelOffsetCurve::FITKOCCModelOffsetCurve() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
bool FITKOCCModelOffsetCurve::update()
{
if (m_SourceCurve.isNull()) return false;
auto geoCmdList = FITKGLODATA->getGeometryData<Interface::FITKGeoCommandList>();
auto cmd = geoCmdList->getDataByID(m_SourceCurve.CmdId);
if (cmd == nullptr) return false;
auto vShape = cmd->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSEdge, m_SourceCurve.VirtualTopoId);
if (vShape == nullptr) return false;
TopoDS_Shape shape = vShape->getTopoShape();
if (shape.ShapeType() != TopAbs_ShapeEnum::TopAbs_EDGE) return false;
TopoDS_Edge edge = TopoDS::Edge(shape);
if (edge.IsNull()) return false;
try {
Standard_Real first, last;
Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, first, last);
if (curve.IsNull()) return false;
gp_Vec vec = curve->DN(first, 1);
vec.Cross(gp_Vec(m_Dir[0], m_Dir[1], m_Dir[2]));
Handle(Geom_OffsetCurve) offsetCurve = new Geom_OffsetCurve(curve, m_Offset, gp_Dir(-vec.X(), -vec.Y(), -vec.Z()));
if (offsetCurve.IsNull()) return false;
BRepBuilderAPI_MakeEdge offsetEdge(offsetCurve, first, last);
offsetEdge.Build();
if (!offsetEdge.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
_occShapeAgent->updateShape(offsetEdge.Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
FITKOCCModelCurveProjectionOnSurface::FITKOCCModelCurveProjectionOnSurface() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
bool FITKOCCModelCurveProjectionOnSurface::update()
{
// 数据校验
if (m_SourceCurve.isNull() || m_SourceSurface.isNull()) return false;
auto geoCmdList = FITKGLODATA->getGeometryData<Interface::FITKGeoCommandList>();
/** 获取原始线形状 */
/*@{*/
auto curveCmd = geoCmdList->getDataByID(m_SourceCurve.CmdId);
if (curveCmd == nullptr) return false;
auto curveVShape = curveCmd->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSEdge, m_SourceCurve.VirtualTopoId);
if (curveVShape == nullptr) return false;
TopoDS_Shape curveShape = curveVShape->getTopoShape();
if (curveShape.ShapeType() != TopAbs_ShapeEnum::TopAbs_EDGE) return false;
TopoDS_Edge edge = TopoDS::Edge(curveShape);
if (edge.IsNull()) return false;
Standard_Real first, last;
Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, first, last);
if (curve.IsNull()) return false;
Handle(Geom_TrimmedCurve) trimmedCurve = new Geom_TrimmedCurve(curve, first, last);
if (trimmedCurve.IsNull()) return false;
/*@}*/
/** 获取原始面形状 */
/*@{*/
auto surfaceCmd = geoCmdList->getDataByID(m_SourceSurface.CmdId);
if (surfaceCmd == nullptr) return false;
auto surfaceVShape = surfaceCmd->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSFace, m_SourceSurface.VirtualTopoId);
if (surfaceVShape == nullptr) return false;
TopoDS_Shape surfaceShape = surfaceVShape->getTopoShape();
if (surfaceShape.ShapeType() != TopAbs_ShapeEnum::TopAbs_FACE) return false;
TopoDS_Face face = TopoDS::Face(surfaceShape);
if (face.IsNull()) return false;
Handle(Geom_Surface) surface = BRep_Tool::Surface(face);
if (surface.IsNull()) return false;
/*@}*/
try {
/** 计算投影曲线 */
/*@{*/
Handle(Geom_Curve) projCurve = GeomProjLib::Project(trimmedCurve, surface);
if (projCurve.IsNull()) {
printLog("Failed to build shape!", 3);
return false;
}
/*@}*/
/** 计算端点投影 */
/*@{*/
gp_Pnt pntFirst = curve->Value(first);
gp_Pnt pntLast = curve->Value(last);
GeomAPI_ProjectPointOnSurf projFirst(pntFirst, surface);
GeomAPI_ProjectPointOnSurf projLast(pntLast, surface);
if (projFirst.NbPoints() != 1 || projLast.NbPoints() != 1 || projFirst.Point(1).Distance(projLast.Point(1)) < Precision::Confusion()) {
printLog("Failed to build projection!", 3);
return false;
}
pntFirst = projFirst.Point(1);
pntLast = projLast.Point(1);
Standard_Real newFirst, newLast;
if (
!GeomLib_Tool::Parameter(projCurve, pntFirst, Precision::Confusion(), newFirst) ||
!GeomLib_Tool::Parameter(projCurve, pntLast, Precision::Confusion(), newLast)) {
printLog("Failed to build projection!", 3);
return false;
}
/*@}*/
/** 转换拓扑形状 */
/*@{*/
BRepBuilderAPI_MakeEdge projEdge(projCurve, newFirst, newLast);
projEdge.Build();
if (!projEdge.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
/*@}*/
_occShapeAgent->updateShape(projEdge.Shape());
//_occShapeAgent->updateShape(projEdge.Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
FITKOCCModelSurfaceIntersectionSurface::FITKOCCModelSurfaceIntersectionSurface() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
bool FITKOCCModelSurfaceIntersectionSurface::update()
{
// 数据校验
if (m_SourceSurface1.isNull() || m_SourceSurface2.isNull()) return false;
auto geoCmdList = FITKGLODATA->getGeometryData<Interface::FITKGeoCommandList>();
/** 获取原始面1形状 */
/*@{*/
auto surface1Cmd = geoCmdList->getDataByID(m_SourceSurface1.CmdId);
if (surface1Cmd == nullptr) return false;
auto surface1VShape = surface1Cmd->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSFace, m_SourceSurface1.VirtualTopoId);
if (surface1VShape == nullptr) return false;
TopoDS_Shape surface1Shape = surface1VShape->getTopoShape();
if (surface1Shape.ShapeType() != TopAbs_ShapeEnum::TopAbs_FACE) return false;
TopoDS_Face face1 = TopoDS::Face(surface1Shape);
if (face1.IsNull()) return false;
Handle(Geom_Surface) surface1 = BRep_Tool::Surface(face1);
if (surface1.IsNull()) return false;
/*@}*/
/** 获取原始面2形状 */
/*@{*/
auto surface2Cmd = geoCmdList->getDataByID(m_SourceSurface2.CmdId);
if (surface2Cmd == nullptr) return false;
auto surface2VShape = surface2Cmd->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSFace, m_SourceSurface2.VirtualTopoId);
if (surface2VShape == nullptr) return false;
TopoDS_Shape surface2Shape = surface2VShape->getTopoShape();
if (surface2Shape.ShapeType() != TopAbs_ShapeEnum::TopAbs_FACE) return false;
TopoDS_Face face2 = TopoDS::Face(surface2Shape);
if (face2.IsNull()) return false;
Handle(Geom_Surface) surface2 = BRep_Tool::Surface(face2);
if (surface2.IsNull()) return false;
/*@}*/
try {
/** 使用BRepAlgoAPI_Section计算相交 */
/*@{*/
BRepAlgoAPI_Section ss(face1, face2);
if (!ss.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
_occShapeAgent->updateShape(ss.Shape());
/*@}*/
/** 使用GeomAPI_IntSS计算相交 */
/*@{*/
/*GeomAPI_IntSS ss(surface1, surface2, 1.0e-7);
if (!ss.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
// 转换拓扑形状
if (ss.NbLines() == 0) return false;
Handle(Geom_Curve) c = ss.Line(1);
BRepBuilderAPI_MakeEdge interEdge(c, c->FirstParameter(), c->LastParameter());
interEdge.Build();
if (!interEdge.IsDone()) {
printLog("Failed to build shape!", 3);
return false;
}
_occShapeAgent->updateShape(ss.Shape());
*/
/*@}*/
/** 使用BOPAlgo_PaveFiller计算相交 */
/*@{*/
/*BOPAlgo_PaveFiller ss;
ss.AddArgument(face1);
ss.AddArgument(face2);
ss.Perform();
if (ss.HasErrors()) {
printLog("Failed to build shape!", 3);
return false;
}
// 转换拓扑形状
int count = ss.DS().NbShapes();
if (count == 0) return false;
for (int i = 0; i < count; ++i) {
auto shape = ss.DS().Shape(i + 1);
if (shape.ShapeType() != TopAbs_ShapeEnum::TopAbs_EDGE) continue;
_occShapeAgent->updateShape(shape);
break;
}*/
/*@}*/
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
FITKOCCModelBridgeCurve::FITKOCCModelBridgeCurve() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
bool FITKOCCModelBridgeCurve::update()
{
if (m_SourceCurve1.isNull() || m_SourceCurve2.isNull()) return false;
if (m_Parameter1 < 1 || m_Parameter2 < 1) {
printLog(tr("Parameter must greater than or equal 1.0."), 3);
return false;
}
auto geoCmdList = FITKGLODATA->getGeometryData<Interface::FITKGeoCommandList>();
/** 第一条曲线端点 */
/*@{*/
auto curveCmd1 = geoCmdList->getDataByID(m_SourceCurve1.CmdId);
if (curveCmd1 == nullptr) return false;
auto curveVShape1 = curveCmd1->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSEdge, m_SourceCurve1.VirtualTopoId);
if (curveVShape1 == nullptr) return false;
TopoDS_Shape curveShape1 = curveVShape1->getTopoShape();
if (curveShape1.ShapeType() != TopAbs_ShapeEnum::TopAbs_EDGE) return false;
TopoDS_Edge edge1 = TopoDS::Edge(curveShape1);
if (edge1.IsNull()) return false;
Standard_Real first;
Standard_Real last;
Handle(Geom_Curve) curve1 = BRep_Tool::Curve(edge1, first, last);
if (curve1.IsNull()) return false;
try {
gp_Pnt pnt1 = m_UseStartEnd1 ? curve1->Value(first) : curve1->Value(last);
gp_Vec vec1 = m_UseStartEnd1 ? curve1->DN(first, 1) : curve1->DN(last, 1);
vec1.Scale(m_Parameter1 / vec1.Magnitude());
gp_Pnt pnt2;
if (m_UseStartEnd1)
pnt2 = gp_Pnt(pnt1.X() - vec1.X(), pnt1.Y() - vec1.Y(), pnt1.Z() - vec1.Z());
else
pnt2 = gp_Pnt(pnt1.X() + vec1.X(), pnt1.Y() + vec1.Y(), pnt1.Z() + vec1.Z());
/*@}*/
/** 第二条曲线端点 */
/*@{*/
auto curveCmd2 = geoCmdList->getDataByID(m_SourceCurve2.CmdId);
if (curveCmd2 == nullptr) return false;
auto curveVShape2 = curveCmd2->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSEdge, m_SourceCurve2.VirtualTopoId);
if (curveVShape2 == nullptr) return false;
TopoDS_Shape curveShape2 = curveVShape2->getTopoShape();
if (curveShape2.ShapeType() != TopAbs_ShapeEnum::TopAbs_EDGE) return false;
TopoDS_Edge edge2 = TopoDS::Edge(curveShape2);
if (edge2.IsNull()) return false;
Handle(Geom_Curve) curve2 = BRep_Tool::Curve(edge2, first, last);
if (curve2.IsNull()) return false;
gp_Pnt pnt4 = m_UseStartEnd2 ? curve2->Value(first) : curve2->Value(last);
gp_Vec vec2 = m_UseStartEnd2 ? curve2->DN(first, 1) : curve2->DN(last, 1);
vec2.Scale(m_Parameter2 / vec2.Magnitude());
gp_Pnt pnt3;
if (m_UseStartEnd2)
pnt3 = gp_Pnt(pnt4.X() - vec2.X(), pnt4.Y() - vec2.Y(), pnt4.Z() - vec2.Z());
else
pnt3 = gp_Pnt(pnt4.X() + vec2.X(), pnt4.Y() + vec2.Y(), pnt4.Z() + vec2.Z());
/*@}*/
TColgp_Array1OfPnt pnts(1, 4);
pnts.SetValue(1, pnt1);
pnts.SetValue(2, pnt2);
pnts.SetValue(3, pnt3);
pnts.SetValue(4, pnt4);
Standard_Integer KNum = 3;
TColStd_Array1OfReal knots(1, KNum);
for (int i = 0; i < KNum; ++i)
{
knots.SetValue(i + 1, i);
}
TColStd_Array1OfInteger mults(1, KNum);
for (int i = 0; i < KNum; ++i)
{
if (i == 0 || i == KNum - 1)
{
mults.SetValue(i + 1, 3);
}
else
{
mults.SetValue(i + 1, 1);
}
}
Handle(Geom_BSplineCurve) hCurve = new Geom_BSplineCurve(pnts, knots, mults, 2);
GeomLib_Tool parameterTool;
Standard_Real p1, p4;
parameterTool.Parameter(hCurve, pnt1, Precision::Confusion(), p1);
parameterTool.Parameter(hCurve, pnt4, Precision::Confusion(), p4);
BRepBuilderAPI_MakeEdge anEdge(hCurve, p1, p4);
_occShapeAgent->updateShape(anEdge.Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
FITKOCCModelSurfaceEdge::FITKOCCModelSurfaceEdge() :OCCShapeAgent(this)
{
_shapeAgent = _occShapeAgent;
}
bool FITKOCCModelSurfaceEdge::update()
{
if (m_SourceSurface.isNull() || m_EdgeVirtualTopoId < 0) return false;
auto geoCmdList = FITKGLODATA->getGeometryData<Interface::FITKGeoCommandList>();
/** 获取原始面形状 */
/*@{*/
auto surfaceCmd = geoCmdList->getDataByID(m_SourceSurface.CmdId);
if (surfaceCmd == nullptr) return false;
auto edgeVShape = surfaceCmd->getShapeT<FITKOCCTopoShape>(Interface::FITKGeoEnum::VTopoShapeType::VSEdge, m_EdgeVirtualTopoId);
if (edgeVShape == nullptr) return false;
TopoDS_Shape edgeShape = edgeVShape->getTopoShape();
if (edgeShape.ShapeType() != TopAbs_ShapeEnum::TopAbs_EDGE) return false;
TopoDS_Edge edge = TopoDS::Edge(edgeShape);
if (edge.IsNull()) return false;
/*@}*/
try {
Standard_Real first, last;
Handle(Geom_Curve) curve = BRep_Tool::Curve(edge, first, last);
if (curve.IsNull()) return false;
BRepBuilderAPI_MakeEdge anEdge(curve, first, last);
_occShapeAgent->updateShape(anEdge.Shape());
}
catch (...)
{
printLog(tr("Failed to make curve!"), 3);
return false;
}
return true;
}
}