Skip to content

Commit

Permalink
OCC: addSphere, addSquare
Browse files Browse the repository at this point in the history
  • Loading branch information
benoit128 committed Dec 6, 2024
1 parent 37def7a commit 1bc46f7
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 41 deletions.
63 changes: 29 additions & 34 deletions Cassiopee/OCC/OCC/Atomic/addSphere.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/

#include "occ.h"
#include "TopoDS.hxx"
#include "TopoDS_Shape.hxx"
#include "TopTools_IndexedMapOfShape.hxx"
#include "TopExp.hxx"
Expand All @@ -31,7 +32,7 @@
PyObject* K_OCC::addSphere(PyObject* self, PyObject* args)
{
PyObject* hook; E_Float xc, yc, zc, R;
if (!PYPARSETUPLE_(args, O_ RRRR_, &hook, &xc, &yc, &zc, &R)) return NULL;
if (!PYPARSETUPLE_(args, O_ TRRR_ R_, &hook, &xc, &yc, &zc, &R)) return NULL;

void** packet = NULL;
#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 7) || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 1)
Expand All @@ -40,47 +41,39 @@ PyObject* K_OCC::addSphere(PyObject* self, PyObject* args)
packet = (void**) PyCapsule_GetPointer(hook, NULL);
#endif

/* previous shape or compound */
/*
TopoDS_Shape* psh = (TopoDS_Shape*)packet[0];
if (psh != NULL)
{
TopAbs_ShapeEnum ptype = psh->ShapeType();
if (ptype == TopAbs_COMPOUND)
{
printf("previous is a compoud\n");
// == TopAbs_COMPOUND
//for(TopoDS_Iterator anExp(psh); anExp.More(); anExp.Next()){
//const TopoDS_Shape &curShape1 = anExp.Value();}
}
else
{ printf("previous is a shape\n"); }
}*/
//TopoDS_Shape* shp = (TopoDS_Shape*) packet[0];
TopTools_IndexedMapOfShape& surfaces = *(TopTools_IndexedMapOfShape*)packet[1];

/* new sphere */
gp_Pnt center(xc, yc, zc);
BRepPrimAPI_MakeSphere makerSphere(center, R);
TopoDS_Shape sphere = makerSphere.Shape();

/* another sphere */
//gp_Pnt center2(xc+2, yc, zc);
//BRepPrimAPI_MakeSphere makerSphere2(center2, R);
//TopoDS_Shape sphere2 = makerSphere2.Shape();
// Rebuild a single compound
BRep_Builder builder;
TopoDS_Compound compound;
builder.MakeCompound(compound);

for (E_Int i = 1; i <= surfaces.Extent(); i++)
{
TopoDS_Face F = TopoDS::Face(surfaces(i));
builder.Add(compound, F);
}

// Building a Compound
//TopoDS_Compound sh;
//BRep_Builder aBuilder;
//aBuilder.MakeCompound(sh);
//aBuilder.Add(sh, sphere);
//aBuilder.Add(sh, sphere2);

/* export */
TopoDS_Shape* newshp = new TopoDS_Shape(sphere);
//TopoDS_Shape* newshp = new TopoDS_Compound(sh);

TopTools_IndexedMapOfShape* sfs = new TopTools_IndexedMapOfShape();
TopExp::MapShapes(sphere, TopAbs_FACE, *sfs);
TopTools_IndexedMapOfShape& surfaces2 = *(TopTools_IndexedMapOfShape*)sfs;
for (E_Int i = 1; i <= surfaces2.Extent(); i++)
{
TopoDS_Face F = TopoDS::Face(surfaces2(i));
builder.Add(compound, F);
}
delete sfs;

TopoDS_Shape* newshp = new TopoDS_Shape(compound);

// Rebuild the hook
packet[0] = newshp;

// Extract surfaces
TopTools_IndexedMapOfShape* ptr = (TopTools_IndexedMapOfShape*)packet[1];
delete ptr;
Expand All @@ -94,6 +87,8 @@ PyObject* K_OCC::addSphere(PyObject* self, PyObject* args)
TopTools_IndexedMapOfShape* se = new TopTools_IndexedMapOfShape();
TopExp::MapShapes(*newshp, TopAbs_EDGE, *se);
packet[2] = se;
printf("INFO: after addSphere: Nb edges=%d\n", se->Extent());
printf("INFO: after addSphere: Nb faces=%d\n", sf->Extent());

Py_INCREF(Py_None);
return Py_None;
Expand Down
100 changes: 100 additions & 0 deletions Cassiopee/OCC/OCC/Atomic/addSquare.cpp
Original file line number Diff line number Diff line change
@@ -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 <http://www.gnu.org/licenses/>.
*/

#include "occ.h"
#include "TopoDS.hxx"
#include "TopoDS_Shape.hxx"
#include "TopTools_IndexedMapOfShape.hxx"
#include "TopExp.hxx"
#include "TopExp_Explorer.hxx"
#include "BRepPrimAPI_MakeSphere.hxx"
#include "BRep_Builder.hxx"
#include "BRepBuilderAPI_MakeEdge.hxx"
#include "BRepBuilderAPI_MakeWire.hxx"
#include "BRepBuilderAPI_MakeFace.hxx"

//=====================================================================
// Add a square to CAD hook
//=====================================================================
PyObject* K_OCC::addSquare(PyObject* self, PyObject* args)
{
PyObject* hook; E_Float x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4;
if (!PYPARSETUPLE_(args, O_ TRRR_ TRRR_ TRRR_ TRRR_, &hook, &x1, &y1, &z1,
&x2, &y2, &z2, &x3, &y3, &z3, &x4, &y4, &z4)) 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

//TopoDS_Shape* shp = (TopoDS_Shape*) packet[0];
TopTools_IndexedMapOfShape& surfaces = *(TopTools_IndexedMapOfShape*)packet[1];

/* new square */
gp_Pnt p1(x1, y1, z1); // Bottom left
gp_Pnt p2(x2, y2, z2); // Bottom right
gp_Pnt p3(x3, y3, z3); // Top right
gp_Pnt p4(x4, y4, z4); // Top left

TopoDS_Edge edge1 = BRepBuilderAPI_MakeEdge(p1, p2);
TopoDS_Edge edge2 = BRepBuilderAPI_MakeEdge(p2, p3);
TopoDS_Edge edge3 = BRepBuilderAPI_MakeEdge(p3, p4);
TopoDS_Edge edge4 = BRepBuilderAPI_MakeEdge(p4, p1);

TopoDS_Wire wire = BRepBuilderAPI_MakeWire(edge1, edge2, edge3, edge4);
TopoDS_Face face = BRepBuilderAPI_MakeFace(wire);

// Rebuild a single compound
BRep_Builder builder;
TopoDS_Compound compound;
builder.MakeCompound(compound);

for (E_Int i = 1; i <= surfaces.Extent(); i++)
{
TopoDS_Face F = TopoDS::Face(surfaces(i));
builder.Add(compound, F);
}
builder.Add(compound, face);

TopoDS_Shape* newshp = new TopoDS_Shape(compound);

// Rebuild the hook
packet[0] = newshp;
// Extract surfaces
TopTools_IndexedMapOfShape* ptr = (TopTools_IndexedMapOfShape*)packet[1];
delete ptr;
TopTools_IndexedMapOfShape* sf = new TopTools_IndexedMapOfShape();
TopExp::MapShapes(*newshp, TopAbs_FACE, *sf);
packet[1] = sf;

// Extract edges
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 addSphere: Nb edges=%d\n", se->Extent());
printf("INFO: after addSphere: Nb faces=%d\n", sf->Extent());

Py_INCREF(Py_None);
return Py_None;

}
8 changes: 2 additions & 6 deletions Cassiopee/OCC/OCC/Atomic/mergeCAD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ PyObject* K_OCC::mergeCAD(PyObject* self, PyObject* args)
#else
packet1 = (void**) PyCapsule_GetPointer(hook1, NULL);
#endif
TopoDS_Shape* shp1 = (TopoDS_Shape*) packet1[0];
//TopoDS_Shape* shp1 = (TopoDS_Shape*) packet1[0];
TopTools_IndexedMapOfShape& surfaces1 = *(TopTools_IndexedMapOfShape*)packet1[1];

void** packet2 = NULL;
Expand All @@ -48,7 +48,7 @@ PyObject* K_OCC::mergeCAD(PyObject* self, PyObject* args)
#else
packet2 = (void**) PyCapsule_GetPointer(hook2, NULL);
#endif
TopoDS_Shape* shp2 = (TopoDS_Shape*) packet2[0];
//TopoDS_Shape* shp2 = (TopoDS_Shape*) packet2[0];
TopTools_IndexedMapOfShape& surfaces2 = *(TopTools_IndexedMapOfShape*)packet2[1];

// Rebuild a single compound
Expand Down Expand Up @@ -95,8 +95,4 @@ PyObject* K_OCC::mergeCAD(PyObject* self, PyObject* args)
#endif

return hook;


Py_INCREF(Py_None);
return Py_None;
}
3 changes: 2 additions & 1 deletion Cassiopee/OCC/OCC/occ.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ static PyMethodDef Pyocc [] =

{"bottle", K_OCC::bottle, METH_VARARGS},
{"addSphere", K_OCC::addSphere, METH_VARARGS},

{"addSquare", K_OCC::addSquare, METH_VARARGS},

{"getNbFaces", K_OCC::getNbFaces, METH_VARARGS},
{"getNbEdges", K_OCC::getNbEdges, METH_VARARGS},
{"getFileAndFormat", K_OCC::getFileAndFormat, METH_VARARGS},
Expand Down
1 change: 1 addition & 0 deletions Cassiopee/OCC/OCC/occ.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ namespace K_OCC

PyObject* bottle(PyObject* self, PyObject* args);
PyObject* addSphere(PyObject* self, PyObject* args);
PyObject* addSquare(PyObject* self, PyObject* args);

PyObject* getNbFaces(PyObject* self, PyObject* args);
PyObject* getNbEdges(PyObject* self, PyObject* args);
Expand Down
1 change: 1 addition & 0 deletions Cassiopee/OCC/srcs.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ def getFiles(module):

'OCC/Atomic/bottle.cpp',
'OCC/Atomic/addSphere.cpp',
'OCC/Atomic/addSquare.cpp',

'OCC/Atomic/meshEdge.cpp',
'OCC/Atomic/meshEdge2.cpp',
Expand Down

0 comments on commit 1bc46f7

Please sign in to comment.