From 84de2766ebe9e60661058cbc30bfe72f61e48156 Mon Sep 17 00:00:00 2001 From: benoit128 Date: Wed, 18 Sep 2024 11:06:57 +0200 Subject: [PATCH] OCC: add fillet, removeFaces, fillHole --- Cassiopee/CPlot/apps/tkCADFix.py | 134 ++++++++++++++++++++++- Cassiopee/OCC/OCC/Atomic/addFillet.cpp | 83 ++++++++++++++ Cassiopee/OCC/OCC/Atomic/fillHole.cpp | 100 +++++++++++++++++ Cassiopee/OCC/OCC/Atomic/freeHook.cpp | 17 --- Cassiopee/OCC/OCC/Atomic/removeFaces.cpp | 82 ++++++++++++++ Cassiopee/OCC/OCC/Atomic/sewing.cpp | 8 +- Cassiopee/OCC/OCC/occ.cpp | 3 + Cassiopee/OCC/OCC/occ.h | 3 + Cassiopee/OCC/srcs.py | 5 +- 9 files changed, 411 insertions(+), 24 deletions(-) create mode 100644 Cassiopee/OCC/OCC/Atomic/addFillet.cpp create mode 100644 Cassiopee/OCC/OCC/Atomic/fillHole.cpp create mode 100644 Cassiopee/OCC/OCC/Atomic/removeFaces.cpp diff --git a/Cassiopee/CPlot/apps/tkCADFix.py b/Cassiopee/CPlot/apps/tkCADFix.py index 8fbac6729..ae9c2247b 100644 --- a/Cassiopee/CPlot/apps/tkCADFix.py +++ b/Cassiopee/CPlot/apps/tkCADFix.py @@ -62,12 +62,119 @@ def sewCAD(event=None): faces = Internal.getNodeFromName1(CTK.t, 'FACES') faces[2] = [] CTK.setCursor(2, WIDGETS['frame']) - OCC._meshAllEdges(hook, CTK.t, hmax=hmax, hausd=hausd) + OCC._meshAllEdges(hook, CTK.t, hmax=hmax, hausd=hausd) # loose manual remeshing OCC._meshAllFacesTri(hook, CTK.t, hmax=hmax, hausd=hausd) CTK.setCursor(0, WIDGETS['frame']) CTK.display(CTK.t) CTK.TXT.insert('START', 'CAD sewed with %g.\n'%tol) +#============================================================================== +def filletCAD(event=None): + import OCC.PyTree as OCC + if CTK.CADHOOK is None: return + radius = CTK.varsFromWidget(VARS[3].get(), 1)[0] + hook = CTK.CADHOOK + [hmax, hausd] = OCC.getCADcontainer(CTK.t) + # Get selected edges + nzs = CPlot.getSelectedZones() + edges = [] + for nz in nzs: + nob = CTK.Nb[nz]+1 + noz = CTK.Nz[nz] + z = CTK.t[2][nob][2][noz] + print(z[0]) + CAD = Internal.getNodeFromName1(z, 'CAD') + if CAD is not None: + no = Internal.getNodeFromName1(CAD, 'no') + no = Internal.getValue(no) + edges.append(no) + if edges == []: + CTK.TXT.insert('START', 'No valid edges in selection.\n') + return + OCC.occ.addFillet(hook, edges, radius) + + # remesh CAD and redisplay + edges = Internal.getNodeFromName1(CTK.t, 'EDGES') + edges[2] = [] + faces = Internal.getNodeFromName1(CTK.t, 'FACES') + faces[2] = [] + CTK.setCursor(2, WIDGETS['frame']) + OCC._meshAllEdges(hook, CTK.t, hmax=hmax, hausd=hausd) # loose manual remeshing... + OCC._meshAllFacesTri(hook, CTK.t, hmax=hmax, hausd=hausd) + CTK.setCursor(0, WIDGETS['frame']) + CTK.display(CTK.t) + CTK.TXT.insert('START', 'Fillet added.\n') + +#============================================================================== +def removeFaces(event=None): + import OCC.PyTree as OCC + if CTK.CADHOOK is None: return + hook = CTK.CADHOOK + [hmax, hausd] = OCC.getCADcontainer(CTK.t) + # Get selected edges + nzs = CPlot.getSelectedZones() + faces = [] + for nz in nzs: + nob = CTK.Nb[nz]+1 + noz = CTK.Nz[nz] + z = CTK.t[2][nob][2][noz] + CAD = Internal.getNodeFromName1(z, 'CAD') + if CAD is not None: + no = Internal.getNodeFromName1(CAD, 'no') + no = Internal.getValue(no) + faces.append(no) + if faces == []: + CTK.TXT.insert('START', 'No valid faces in selection.\n') + return + OCC.occ.removeFaces(hook, faces) + + # remesh CAD and redisplay + edges = Internal.getNodeFromName1(CTK.t, 'EDGES') + edges[2] = [] + faces = Internal.getNodeFromName1(CTK.t, 'FACES') + faces[2] = [] + CTK.setCursor(2, WIDGETS['frame']) + OCC._meshAllEdges(hook, CTK.t, hmax=hmax, hausd=hausd) # loose manual remeshing... + OCC._meshAllFacesTri(hook, CTK.t, hmax=hmax, hausd=hausd) + CTK.setCursor(0, WIDGETS['frame']) + CTK.display(CTK.t) + CTK.TXT.insert('START', 'Faces removed from CAD.\n') + +#============================================================================== +def fillHole(event=None): + import OCC.PyTree as OCC + if CTK.CADHOOK is None: return + hook = CTK.CADHOOK + [hmax, hausd] = OCC.getCADcontainer(CTK.t) + # Get selected edges + nzs = CPlot.getSelectedZones() + edges = [] + for nz in nzs: + nob = CTK.Nb[nz]+1 + noz = CTK.Nz[nz] + z = CTK.t[2][nob][2][noz] + CAD = Internal.getNodeFromName1(z, 'CAD') + if CAD is not None: + no = Internal.getNodeFromName1(CAD, 'no') + no = Internal.getValue(no) + edges.append(no) + if edges == []: + CTK.TXT.insert('START', 'No valid edges in selection.\n') + return + OCC.occ.fillHole(hook, edges) + + # remesh CAD and redisplay + edges = Internal.getNodeFromName1(CTK.t, 'EDGES') + edges[2] = [] + faces = Internal.getNodeFromName1(CTK.t, 'FACES') + faces[2] = [] + CTK.setCursor(2, WIDGETS['frame']) + OCC._meshAllEdges(hook, CTK.t, hmax=hmax, hausd=hausd) # loose manual remeshing... + OCC._meshAllFacesTri(hook, CTK.t, hmax=hmax, hausd=hausd) + CTK.setCursor(0, WIDGETS['frame']) + CTK.display(CTK.t) + CTK.TXT.insert('START', 'Fill hole in CAD.\n') + #============================================================================== # Create app widgets #============================================================================== @@ -103,8 +210,10 @@ def createApp(win): # -1- CAD file format - V = TK.StringVar(win); V.set('fmt_step'); VARS.append(V) V.set(fileFmt) - # -2- Sewing toplerance - + # -2- Sewing tolerance - V = TK.StringVar(win); V.set('1.e-6'); VARS.append(V) + # -3- Fillet radius - + V = TK.StringVar(win); V.set('0.1'); VARS.append(V) # Read/write CAD file B = TTK.Button(Frame, text="Read", command=readCAD) @@ -132,6 +241,27 @@ def createApp(win): BB = CTK.infoBulle(parent=B, text='Sewing tolerance.') B.bind('', sewCAD) + # Fillet + B = TTK.Button(Frame, text="Fillet", command=filletCAD) + B.grid(row=3, column=0, sticky=TK.EW) + BB = CTK.infoBulle(parent=B, text='Make a fillet from edges selection.') + + B = TTK.Entry(Frame, textvariable=VARS[3], background='White', width=10) + B.grid(row=3, column=1, sticky=TK.EW) + BB = CTK.infoBulle(parent=B, text='Fillet radius.') + B.bind('', filletCAD) + + # Remove faces + B = TTK.Button(Frame, text="Remove faces", command=removeFaces) + B.grid(row=4, column=0, columnspan=2, sticky=TK.EW) + BB = CTK.infoBulle(parent=B, text='Remove selected faces from CAD.') + + # Fill hole + B = TTK.Button(Frame, text="Fill hole", command=fillHole) + B.grid(row=5, column=0, columnspan=2, sticky=TK.EW) + BB = CTK.infoBulle(parent=B, text='Fill hole from CAD edges.') + + #============================================================================== # Called to display widgets #============================================================================== diff --git a/Cassiopee/OCC/OCC/Atomic/addFillet.cpp b/Cassiopee/OCC/OCC/Atomic/addFillet.cpp new file mode 100644 index 000000000..8f4269628 --- /dev/null +++ b/Cassiopee/OCC/OCC/Atomic/addFillet.cpp @@ -0,0 +1,83 @@ +/* + Copyright 2013-2024 Onera. + + This file is part of Cassiopee. + + Cassiopee is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Cassiopee is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Cassiopee. If not, see . +*/ +// Add fillet from edges +#include "occ.h" + +#include "TopoDS.hxx" +#include "BRep_Tool.hxx" +#include "TopExp.hxx" +#include "TopExp_Explorer.hxx" +#include "TopTools_IndexedMapOfShape.hxx" +#include "ShapeBuild_ReShape.hxx" +#include "BRep_Builder.hxx" +#include "BRepFilletAPI_MakeFillet.hxx" + +//===================================================================== +// Remove some faces and rebuild compound +//===================================================================== +PyObject* K_OCC::addFillet(PyObject* self, PyObject* args) +{ + PyObject* hook; PyObject* listEdges; E_Float radius; + if (!PYPARSETUPLE_(args, OO_ R_, &hook, &listEdges, &radius)) return NULL; + + void** packet = NULL; +#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 1) + packet = (void**) PyCObject_AsVoidPtr(hook); +#else + packet = (void**) PyCapsule_GetPointer(hook, NULL); +#endif + + // get top shape + TopoDS_Shape* shp = (TopoDS_Shape*)packet[0]; + TopTools_IndexedMapOfShape& edges = *(TopTools_IndexedMapOfShape*)packet[2]; + TopTools_IndexedMapOfShape& surfaces = *(TopTools_IndexedMapOfShape*)packet[1]; + + // get edges + BRepFilletAPI_MakeFillet mkFillet(*shp); + for (E_Int no = 0; no < PyList_Size(listEdges); no++) + { + PyObject* noEdgeO = PyList_GetItem(listEdges, no); + E_Int noEdge = PyInt_AsLong(noEdgeO); + const TopoDS_Edge& E = TopoDS::Edge(edges(noEdge)); + mkFillet.Add(radius, E); + } + TopoDS_Shape shc = mkFillet.Shape(); + + // export + delete shp; + TopoDS_Shape* newshp = new TopoDS_Shape(shc); + + // Export + packet[0] = newshp; + TopTools_IndexedMapOfShape* ptr = (TopTools_IndexedMapOfShape*)packet[1]; + delete ptr; + TopTools_IndexedMapOfShape* sf = new TopTools_IndexedMapOfShape(); + TopExp::MapShapes(*newshp, TopAbs_FACE, *sf); + packet[1] = sf; + TopTools_IndexedMapOfShape* ptr2 = (TopTools_IndexedMapOfShape*)packet[2]; + delete ptr2; + TopTools_IndexedMapOfShape* se = new TopTools_IndexedMapOfShape(); + TopExp::MapShapes(*newshp, TopAbs_EDGE, *se); + packet[2] = se; + printf("INFO: after removeFaces: Nb edges=%d\n", se->Extent()); + printf("INFO: after removeFaces: Nb faces=%d\n", sf->Extent()); + + Py_INCREF(Py_None); + return Py_None; +} diff --git a/Cassiopee/OCC/OCC/Atomic/fillHole.cpp b/Cassiopee/OCC/OCC/Atomic/fillHole.cpp new file mode 100644 index 000000000..9e92880c1 --- /dev/null +++ b/Cassiopee/OCC/OCC/Atomic/fillHole.cpp @@ -0,0 +1,100 @@ +/* + Copyright 2013-2024 Onera. + + This file is part of Cassiopee. + + Cassiopee is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Cassiopee is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Cassiopee. If not, see . +*/ +// Fill hole from edges +#include "occ.h" + +#include "TopoDS.hxx" +#include "BRep_Tool.hxx" +#include "TopExp.hxx" +#include "TopExp_Explorer.hxx" +#include "TopTools_IndexedMapOfShape.hxx" +#include "ShapeBuild_ReShape.hxx" +#include "BRep_Builder.hxx" +#include "BRepBuilderAPI_MakeWire.hxx" +#include "BRepBuilderAPI_MakeFace.hxx" + +//===================================================================== +// Remove some faces and rebuild compound +//===================================================================== +PyObject* K_OCC::fillHole(PyObject* self, PyObject* args) +{ + PyObject* hook; PyObject* listEdges; + if (!PYPARSETUPLE_(args, OO_, &hook, &listEdges)) return NULL; + + void** packet = NULL; +#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 1) + packet = (void**) PyCObject_AsVoidPtr(hook); +#else + packet = (void**) PyCapsule_GetPointer(hook, NULL); +#endif + + // get top shape + TopoDS_Shape* shp = (TopoDS_Shape*)packet[0]; + TopTools_IndexedMapOfShape& edges = *(TopTools_IndexedMapOfShape*)packet[2]; + TopTools_IndexedMapOfShape& surfaces = *(TopTools_IndexedMapOfShape*)packet[1]; + + // get edges and make a wire + BRepBuilderAPI_MakeWire wireMaker; + for (E_Int no = 0; no < PyList_Size(listEdges); no++) + { + PyObject* noEdgeO = PyList_GetItem(listEdges, no); + E_Int noEdge = PyInt_AsLong(noEdgeO); + const TopoDS_Edge& E = TopoDS::Edge(edges(noEdge)); + wireMaker.Add(E); + } + TopoDS_Wire myWire = wireMaker.Wire(); + + // Build face on wire + BRepBuilderAPI_MakeFace faceMaker(myWire); + //faceMaker.Add(myWire); + TopoDS_Face F = faceMaker.Face(); + + // Add face to shape + //ShapeBuild_ReShape reshaper; + //reshaper.Add(F); // no add + //TopoDS_Shape shc = reshaper.Apply(*shp); + + TopoDS_Compound shc; + BRep_Builder aBuilder; + aBuilder.MakeCompound(shc); + aBuilder.Add(shc, *shp); + aBuilder.Add(shc, F); + + // export + delete shp; + TopoDS_Shape* newshp = new TopoDS_Shape(shc); + + // Export + packet[0] = newshp; + TopTools_IndexedMapOfShape* ptr = (TopTools_IndexedMapOfShape*)packet[1]; + delete ptr; + TopTools_IndexedMapOfShape* sf = new TopTools_IndexedMapOfShape(); + TopExp::MapShapes(*newshp, TopAbs_FACE, *sf); + packet[1] = sf; + TopTools_IndexedMapOfShape* ptr2 = (TopTools_IndexedMapOfShape*)packet[2]; + delete ptr2; + TopTools_IndexedMapOfShape* se = new TopTools_IndexedMapOfShape(); + TopExp::MapShapes(*newshp, TopAbs_EDGE, *se); + packet[2] = se; + printf("INFO: after removeFaces: Nb edges=%d\n", se->Extent()); + printf("INFO: after removeFaces: Nb faces=%d\n", sf->Extent()); + + Py_INCREF(Py_None); + return Py_None; +} diff --git a/Cassiopee/OCC/OCC/Atomic/freeHook.cpp b/Cassiopee/OCC/OCC/Atomic/freeHook.cpp index caea4b866..3fabd50e0 100644 --- a/Cassiopee/OCC/OCC/Atomic/freeHook.cpp +++ b/Cassiopee/OCC/OCC/Atomic/freeHook.cpp @@ -24,29 +24,12 @@ #include "TopoDS_Wire.hxx" #include "BRepCheck_Wire.hxx" #include "BRepTools_WireExplorer.hxx" -#include "ShapeAnalysis.hxx" -#include "BRepAdaptor_Curve.hxx" -#include "GCPnts_AbscissaPoint.hxx" -#include "GCPnts_UniformDeflection.hxx" -#include "GCPnts_UniformAbscissa.hxx" #include "TopExp.hxx" #include "TopExp_Explorer.hxx" #include "TopTools_IndexedMapOfShape.hxx" -#include "Geom2d_Curve.hxx" #include "BRepBuilderAPI_MakeFace.hxx" -#include "BRepGProp.hxx" -#include "ShapeUpgrade_FaceDivide.hxx" -#include "ShapeUpgrade_ShapeDivideArea.hxx" -#include "ShapeUpgrade_ShapeDivideClosed.hxx" -#include "ShapeUpgrade_ClosedFaceDivide.hxx" -#include "ShapeUpgrade_SplitSurfaceArea.hxx" -#include "TColGeom_SequenceOfSurface.hxx" -#include "ShapeExtend_CompositeSurface.hxx" -#include "ShapeBuild_ReShape.hxx" #include "BRep_Builder.hxx" -#include "ShapeUpgrade_ShapeDivideClosedEdges.hxx" -#include "GProp_GProps.hxx" //===================================================================== // Split shape by max area diff --git a/Cassiopee/OCC/OCC/Atomic/removeFaces.cpp b/Cassiopee/OCC/OCC/Atomic/removeFaces.cpp new file mode 100644 index 000000000..1aadb0091 --- /dev/null +++ b/Cassiopee/OCC/OCC/Atomic/removeFaces.cpp @@ -0,0 +1,82 @@ +/* + Copyright 2013-2024 Onera. + + This file is part of Cassiopee. + + Cassiopee is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Cassiopee is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Cassiopee. If not, see . +*/ +// Remove CAD faces and rebuild compound +#include "occ.h" + +#include "TopoDS.hxx" +#include "BRep_Tool.hxx" +#include "TopExp.hxx" +#include "TopExp_Explorer.hxx" +#include "TopTools_IndexedMapOfShape.hxx" +#include "ShapeBuild_ReShape.hxx" +#include "BRep_Builder.hxx" + +//===================================================================== +// Remove some faces and rebuild compound +//===================================================================== +PyObject* K_OCC::removeFaces(PyObject* self, PyObject* args) +{ + PyObject* hook; PyObject* listFaces; + if (!PYPARSETUPLE_(args, OO_, &hook, &listFaces)) return NULL; + + void** packet = NULL; +#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 1) + packet = (void**) PyCObject_AsVoidPtr(hook); +#else + packet = (void**) PyCapsule_GetPointer(hook, NULL); +#endif + + // get top shape + TopoDS_Shape* shp = (TopoDS_Shape*)packet[0]; + TopTools_IndexedMapOfShape& edges = *(TopTools_IndexedMapOfShape*)packet[2]; + TopTools_IndexedMapOfShape& surfaces = *(TopTools_IndexedMapOfShape*)packet[1]; + + ShapeBuild_ReShape reshaper; + for (E_Int no = 0; no < PyList_Size(listFaces); no++) + { + PyObject* noFaceO = PyList_GetItem(listFaces, no); + E_Int noFace = PyInt_AsLong(noFaceO); + const TopoDS_Face& F = TopoDS::Face(surfaces(noFace)); + printf("removing %d\n", noFace); + reshaper.Remove(F); + } + TopoDS_Shape shc = reshaper.Apply(*shp); + + // export + delete shp; + TopoDS_Shape* newshp = new TopoDS_Shape(shc); + + // Export + packet[0] = newshp; + TopTools_IndexedMapOfShape* ptr = (TopTools_IndexedMapOfShape*)packet[1]; + delete ptr; + TopTools_IndexedMapOfShape* sf = new TopTools_IndexedMapOfShape(); + TopExp::MapShapes(*newshp, TopAbs_FACE, *sf); + packet[1] = sf; + TopTools_IndexedMapOfShape* ptr2 = (TopTools_IndexedMapOfShape*)packet[2]; + delete ptr2; + TopTools_IndexedMapOfShape* se = new TopTools_IndexedMapOfShape(); + TopExp::MapShapes(*newshp, TopAbs_EDGE, *se); + packet[2] = se; + printf("INFO: after removeFaces: Nb edges=%d\n", se->Extent()); + printf("INFO: after removeFaces: Nb faces=%d\n", sf->Extent()); + + Py_INCREF(Py_None); + return Py_None; +} diff --git a/Cassiopee/OCC/OCC/Atomic/sewing.cpp b/Cassiopee/OCC/OCC/Atomic/sewing.cpp index 2b3c38621..aa2f51b74 100644 --- a/Cassiopee/OCC/OCC/Atomic/sewing.cpp +++ b/Cassiopee/OCC/OCC/Atomic/sewing.cpp @@ -56,17 +56,17 @@ PyObject* K_OCC::sewing(PyObject* self, PyObject* args) //TopTools_IndexedMapOfShape& edges = *(TopTools_IndexedMapOfShape*)packet[2]; //TopTools_IndexedMapOfShape& surfaces = *(TopTools_IndexedMapOfShape*)packet[1]; - // try on all shape + // try on top shape TopoDS_Shape* shp = (TopoDS_Shape*)packet[0]; - - printf("sew top shape\n"); - + // top shape + printf("Info: sewing top shape.\n"); const Standard_Real tolerance = tol; BRepBuilderAPI_Sewing sewer(tolerance); sewer.Add(*shp); sewer.Perform(); + // export TopoDS_Shape* newshp = new TopoDS_Shape(sewer.SewedShape()); packet[0] = newshp; diff --git a/Cassiopee/OCC/OCC/occ.cpp b/Cassiopee/OCC/OCC/occ.cpp index a9cd8f272..ff3d0af9b 100644 --- a/Cassiopee/OCC/OCC/occ.cpp +++ b/Cassiopee/OCC/OCC/occ.cpp @@ -71,6 +71,9 @@ static PyMethodDef Pyocc [] = {"fixShape", K_OCC::fixShape, METH_VARARGS}, {"trimFaces", K_OCC::trimFaces, METH_VARARGS}, {"sewing", K_OCC::sewing, METH_VARARGS}, + {"removeFaces", K_OCC::removeFaces, METH_VARARGS}, + {"fillHole", K_OCC::fillHole, METH_VARARGS}, + {"addFillet", K_OCC::addFillet, METH_VARARGS}, {"getOppData", K_OCC::getOppData, METH_VARARGS}, diff --git a/Cassiopee/OCC/OCC/occ.h b/Cassiopee/OCC/OCC/occ.h index bf43be65a..3a60460fd 100644 --- a/Cassiopee/OCC/OCC/occ.h +++ b/Cassiopee/OCC/OCC/occ.h @@ -70,6 +70,9 @@ namespace K_OCC PyObject* fixShape(PyObject* self, PyObject* args); PyObject* trimFaces(PyObject* self, PyObject* args); PyObject* sewing(PyObject* self, PyObject* args); + PyObject* removeFaces(PyObject* self, PyObject* args); + PyObject* fillHole(PyObject* self, PyObject* args); + PyObject* addFillet(PyObject* self, PyObject* args); PyObject* getOppData(PyObject* self, PyObject* args); diff --git a/Cassiopee/OCC/srcs.py b/Cassiopee/OCC/srcs.py index 48348d03d..039e1f100 100644 --- a/Cassiopee/OCC/srcs.py +++ b/Cassiopee/OCC/srcs.py @@ -59,7 +59,10 @@ def getFiles(module): 'OCC/Atomic/fix.cpp', 'OCC/Atomic/trim.cpp', 'OCC/Atomic/sewing.cpp', - + 'OCC/Atomic/removeFaces.cpp', + 'OCC/Atomic/fillHole.cpp', + 'OCC/Atomic/addFillet.cpp', + 'OCC/Atomic/getOppData.cpp'] import KCore.Dist as Dist