mirror of
https://github.com/NGSolve/netgen.git
synced 2025-01-13 22:50:33 +05:00
Call PropagateProperties in OCCGeometry::HealGeometry()
This commit is contained in:
parent
dd06cbaddd
commit
dad62afcee
@ -435,6 +435,12 @@ namespace netgen
|
|||||||
TopExp_Explorer exp0;
|
TopExp_Explorer exp0;
|
||||||
TopExp_Explorer exp1;
|
TopExp_Explorer exp1;
|
||||||
|
|
||||||
|
const auto Apply = [](auto & rebuild, auto & shape) {
|
||||||
|
auto newshape = rebuild->Apply(shape);
|
||||||
|
PropagateProperties(*rebuild, newshape);
|
||||||
|
return newshape;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
for (exp0.Init(shape, TopAbs_COMPOUND); exp0.More(); exp0.Next()) nrc++;
|
for (exp0.Init(shape, TopAbs_COMPOUND); exp0.More(); exp0.Next()) nrc++;
|
||||||
for (exp0.Init(shape, TopAbs_COMPSOLID); exp0.More(); exp0.Next()) nrcs++;
|
for (exp0.Init(shape, TopAbs_COMPSOLID); exp0.More(); exp0.Next()) nrcs++;
|
||||||
@ -443,14 +449,14 @@ namespace netgen
|
|||||||
|
|
||||||
{
|
{
|
||||||
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
||||||
rebuild->Apply(shape);
|
Apply(rebuild, shape);
|
||||||
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
||||||
{
|
{
|
||||||
TopoDS_Edge edge = TopoDS::Edge(exp1.Current());
|
TopoDS_Edge edge = TopoDS::Edge(exp1.Current());
|
||||||
if ( BRep_Tool::Degenerated(edge) )
|
if ( BRep_Tool::Degenerated(edge) )
|
||||||
rebuild->Remove(edge);
|
rebuild->Remove(edge);
|
||||||
}
|
}
|
||||||
shape = rebuild->Apply(shape);
|
shape = Apply(rebuild, shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildFMap();
|
BuildFMap();
|
||||||
@ -474,7 +480,7 @@ namespace netgen
|
|||||||
|
|
||||||
Handle(ShapeFix_Face) sff;
|
Handle(ShapeFix_Face) sff;
|
||||||
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
||||||
rebuild->Apply(shape);
|
Apply(rebuild, shape);
|
||||||
|
|
||||||
for (exp0.Init (shape, TopAbs_FACE); exp0.More(); exp0.Next())
|
for (exp0.Init (shape, TopAbs_FACE); exp0.More(); exp0.Next())
|
||||||
{
|
{
|
||||||
@ -512,20 +518,20 @@ namespace netgen
|
|||||||
// face (after the healing process)
|
// face (after the healing process)
|
||||||
// GetProperties(face);
|
// GetProperties(face);
|
||||||
}
|
}
|
||||||
shape = rebuild->Apply(shape);
|
shape = Apply(rebuild, shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
||||||
rebuild->Apply(shape);
|
Apply(rebuild, shape);
|
||||||
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
||||||
{
|
{
|
||||||
TopoDS_Edge edge = TopoDS::Edge(exp1.Current());
|
TopoDS_Edge edge = TopoDS::Edge(exp1.Current());
|
||||||
if ( BRep_Tool::Degenerated(edge) )
|
if ( BRep_Tool::Degenerated(edge) )
|
||||||
rebuild->Remove(edge);
|
rebuild->Remove(edge);
|
||||||
}
|
}
|
||||||
shape = rebuild->Apply(shape);
|
shape = Apply(rebuild, shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -535,7 +541,7 @@ namespace netgen
|
|||||||
|
|
||||||
Handle(ShapeFix_Wire) sfw;
|
Handle(ShapeFix_Wire) sfw;
|
||||||
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
||||||
rebuild->Apply(shape);
|
Apply(rebuild, shape);
|
||||||
|
|
||||||
|
|
||||||
for (exp0.Init (shape, TopAbs_FACE); exp0.More(); exp0.Next())
|
for (exp0.Init (shape, TopAbs_FACE); exp0.More(); exp0.Next())
|
||||||
@ -595,14 +601,14 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shape = rebuild->Apply(shape);
|
shape = Apply(rebuild, shape);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
BuildFMap();
|
BuildFMap();
|
||||||
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
||||||
rebuild->Apply(shape);
|
Apply(rebuild, shape);
|
||||||
|
|
||||||
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
||||||
{
|
{
|
||||||
@ -621,7 +627,7 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
shape = rebuild->Apply(shape);
|
shape = Apply(rebuild, shape);
|
||||||
|
|
||||||
//delete rebuild; rebuild = NULL;
|
//delete rebuild; rebuild = NULL;
|
||||||
}
|
}
|
||||||
@ -630,14 +636,14 @@ namespace netgen
|
|||||||
|
|
||||||
{
|
{
|
||||||
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
Handle(ShapeBuild_ReShape) rebuild = new ShapeBuild_ReShape;
|
||||||
rebuild->Apply(shape);
|
Apply(rebuild, shape);
|
||||||
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
for (exp1.Init (shape, TopAbs_EDGE); exp1.More(); exp1.Next())
|
||||||
{
|
{
|
||||||
TopoDS_Edge edge = TopoDS::Edge(exp1.Current());
|
TopoDS_Edge edge = TopoDS::Edge(exp1.Current());
|
||||||
if ( BRep_Tool::Degenerated(edge) )
|
if ( BRep_Tool::Degenerated(edge) )
|
||||||
rebuild->Remove(edge);
|
rebuild->Remove(edge);
|
||||||
}
|
}
|
||||||
shape = rebuild->Apply(shape);
|
shape = Apply(rebuild, shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -684,7 +690,9 @@ namespace netgen
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
shape = sfwf->Shape();
|
auto newshape = sfwf->Shape();
|
||||||
|
PropagateProperties(*sfwf->Context(), newshape);
|
||||||
|
shape = newshape;
|
||||||
|
|
||||||
//delete sfwf; sfwf = NULL;
|
//delete sfwf; sfwf = NULL;
|
||||||
//delete rebuild; rebuild = NULL;
|
//delete rebuild; rebuild = NULL;
|
||||||
@ -716,7 +724,9 @@ namespace netgen
|
|||||||
sffsm -> SetPrecision (tolerance);
|
sffsm -> SetPrecision (tolerance);
|
||||||
sffsm -> Perform();
|
sffsm -> Perform();
|
||||||
|
|
||||||
shape = sffsm -> FixShape();
|
auto newshape = sffsm -> FixShape();
|
||||||
|
PropagateProperties(*sffsm->Context(), newshape);
|
||||||
|
shape = newshape;
|
||||||
//delete sffsm; sffsm = NULL;
|
//delete sffsm; sffsm = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -745,6 +755,7 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
|
|
||||||
sewedObj.Perform();
|
sewedObj.Perform();
|
||||||
|
PropagateProperties(sewedObj, shape);
|
||||||
|
|
||||||
if (!sewedObj.SewedShape().IsNull())
|
if (!sewedObj.SewedShape().IsNull())
|
||||||
shape = sewedObj.SewedShape();
|
shape = sewedObj.SewedShape();
|
||||||
@ -763,7 +774,7 @@ namespace netgen
|
|||||||
if ( BRep_Tool::Degenerated(edge) )
|
if ( BRep_Tool::Degenerated(edge) )
|
||||||
rebuild->Remove(edge);
|
rebuild->Remove(edge);
|
||||||
}
|
}
|
||||||
shape = rebuild->Apply(shape);
|
shape = Apply(rebuild, shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -981,6 +992,15 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto fixFaceOrientation = [=] (TopoDS_Shape & face)
|
||||||
|
{
|
||||||
|
if(dimension != 2) return;
|
||||||
|
auto occface = OCCFace(face);
|
||||||
|
auto normal = occface.GetNormal(occ2ng(GetVertices(face)[0]));
|
||||||
|
if(normal[2] < 0)
|
||||||
|
face.Reverse();
|
||||||
|
};
|
||||||
|
|
||||||
// Free Shells
|
// Free Shells
|
||||||
for (exp1.Init(shape, TopAbs_SHELL, TopAbs_SOLID); exp1.More(); exp1.Next())
|
for (exp1.Init(shape, TopAbs_SHELL, TopAbs_SOLID); exp1.More(); exp1.Next())
|
||||||
{
|
{
|
||||||
@ -998,6 +1018,7 @@ namespace netgen
|
|||||||
TopoDS_Face face = TopoDS::Face(exp2.Current());
|
TopoDS_Face face = TopoDS::Face(exp2.Current());
|
||||||
if (fmap.FindIndex(face) < 1)
|
if (fmap.FindIndex(face) < 1)
|
||||||
{
|
{
|
||||||
|
fixFaceOrientation(face);
|
||||||
fmap.Add (face);
|
fmap.Add (face);
|
||||||
|
|
||||||
for (exp3.Init(face, TopAbs_WIRE); exp3.More(); exp3.Next())
|
for (exp3.Init(face, TopAbs_WIRE); exp3.More(); exp3.Next())
|
||||||
@ -1033,6 +1054,7 @@ namespace netgen
|
|||||||
for (auto face : MyExplorer(shape, TopAbs_FACE, TopAbs_SHELL))
|
for (auto face : MyExplorer(shape, TopAbs_FACE, TopAbs_SHELL))
|
||||||
if (!fmap.Contains(face))
|
if (!fmap.Contains(face))
|
||||||
{
|
{
|
||||||
|
fixFaceOrientation(face);
|
||||||
fmap.Add (face);
|
fmap.Add (face);
|
||||||
for (auto wire : MyExplorer(face, TopAbs_WIRE))
|
for (auto wire : MyExplorer(face, TopAbs_WIRE))
|
||||||
if (!wmap.Contains(wire))
|
if (!wmap.Contains(wire))
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
#include "occ_utils.hpp"
|
#include "occ_utils.hpp"
|
||||||
#include "occmeshsurf.hpp"
|
#include "occmeshsurf.hpp"
|
||||||
|
|
||||||
|
#include <BOPAlgo_BuilderShape.hxx>
|
||||||
|
#include <BRepTools_ReShape.hxx>
|
||||||
|
#include <BRepBuilderAPI_MakeShape.hxx>
|
||||||
|
#include <BRepBuilderAPI_Sewing.hxx>
|
||||||
#include <Quantity_ColorRGBA.hxx>
|
#include <Quantity_ColorRGBA.hxx>
|
||||||
#include <STEPCAFControl_Reader.hxx>
|
#include <STEPCAFControl_Reader.hxx>
|
||||||
#include <StepBasic_MeasureValueMember.hxx>
|
#include <StepBasic_MeasureValueMember.hxx>
|
||||||
@ -434,6 +438,14 @@ namespace netgen
|
|||||||
DLL_HEADER extern bool OCCMeshFace (const OCCGeometry & geom, Mesh & mesh, FlatArray<int, PointIndex> glob2loc,
|
DLL_HEADER extern bool OCCMeshFace (const OCCGeometry & geom, Mesh & mesh, FlatArray<int, PointIndex> glob2loc,
|
||||||
const MeshingParameters & mparam, int nr, int projecttype, bool delete_on_failure);
|
const MeshingParameters & mparam, int nr, int projecttype, bool delete_on_failure);
|
||||||
|
|
||||||
|
inline auto GetModified(BRepBuilderAPI_MakeShape & builder, TopoDS_Shape shape) { return builder.Modified(shape); }
|
||||||
|
inline auto GetModified(BRepTools_History & history, TopoDS_Shape shape) { return history.Modified(shape); }
|
||||||
|
inline auto GetModified(BOPAlgo_BuilderShape & builder, TopoDS_Shape shape) { return builder.Modified(shape); }
|
||||||
|
inline ArrayMem<TopoDS_Shape, 1> GetModified(BRepBuilderAPI_Sewing& builder, TopoDS_Shape shape) { return {builder.Modified(shape)}; }
|
||||||
|
inline auto GetModified(BRepTools_ReShape& reshape, TopoDS_Shape shape) {
|
||||||
|
auto history = reshape.History();
|
||||||
|
return history->Modified(shape);
|
||||||
|
}
|
||||||
|
|
||||||
template <class TBuilder>
|
template <class TBuilder>
|
||||||
void PropagateIdentifications (TBuilder & builder, TopoDS_Shape shape, std::optional<Transformation<3>> trafo = nullopt)
|
void PropagateIdentifications (TBuilder & builder, TopoDS_Shape shape, std::optional<Transformation<3>> trafo = nullopt)
|
||||||
@ -459,7 +471,7 @@ namespace netgen
|
|||||||
for (TopExp_Explorer e(shape, typ); e.More(); e.Next())
|
for (TopExp_Explorer e(shape, typ); e.More(); e.Next())
|
||||||
{
|
{
|
||||||
auto s = e.Current();
|
auto s = e.Current();
|
||||||
for (auto mods : builder.Modified(s))
|
for (auto mods : GetModified(builder, s))
|
||||||
{
|
{
|
||||||
auto index = mod_indices.FindIndex(s)-1;
|
auto index = mod_indices.FindIndex(s)-1;
|
||||||
modifications[index].Add(mods);
|
modifications[index].Add(mods);
|
||||||
@ -538,7 +550,7 @@ namespace netgen
|
|||||||
if(!OCCGeometry::HaveProperties(s))
|
if(!OCCGeometry::HaveProperties(s))
|
||||||
continue;
|
continue;
|
||||||
auto prop = OCCGeometry::GetProperties(s);
|
auto prop = OCCGeometry::GetProperties(s);
|
||||||
for (auto mods : builder.Modified(s))
|
for (auto mods : GetModified(builder, s))
|
||||||
OCCGeometry::GetProperties(mods).Merge(prop);
|
OCCGeometry::GetProperties(mods).Merge(prop);
|
||||||
}
|
}
|
||||||
if(have_identifications)
|
if(have_identifications)
|
||||||
|
Loading…
Reference in New Issue
Block a user