Hello, everyone!
I have a slicing program up and running!
Unfortunately, when I try to do large numbers of slices or larger objects,
my memory usage continually rises.
Initially I had visions of keeping a copy of the faces created by the slices
for better visualization, but re-worked my code to collapse everything (
optionally ) into simple strings so I can free the OCC objects.
But alas, I cannot figure out how to release the memory.
Here is my code. My slicing approach is different than the slicer you guys
implemented-- I am using BRepAlgoAPI_Cut so that my result is a face with
the edges and wires organized. BRepAlgo_Section is faster, but then I dont
have a face, and I was unable to figure out how to use
ShapeAnalysis:WireOrder to get the wires organized.
_anyway_ here is my slice code. the code in the #free memory section doesnt
seem to have had any effect.
Does anyone know how I should be freeing memory for the occ objects?
thanks in advance, code follows
dave
def _makeSlice(self,shapeToSlice,zLevel,curveTolerance=0.001):
s = Slice();
#change if layers are variable thickness
s.sliceHeight = self.sliceHeight;
s.zLevel = zLevel;
#make a cutting plane
p = gp.gp_Pnt ( 0,0,zLevel );
origin = gp.gp_Pnt(0,0,zLevel-1);
csys = gp.gp_Ax3(p,gp.gp().DZ())
cuttingPlane = gp.gp_Pln(csys);
bff = BRepBuilderAPI.BRepBuilderAPI_MakeFace(cuttingPlane);
face = bff.Face();
#odd, a halfspace is faster than a box?
hs = BRepPrimAPI.BRepPrimAPI_MakeHalfSpace(face,origin);
hs.Build();
halfspace = hs.Solid();
#bounds = getBoundingBox(shapeToSlice);
#c1 = gp.gp_Pnt( bounds[0], bounds[1],bounds[2] ); #lower left corner
#c2 = gp.gp_Pnt( bounds[3], bounds[4], zLevel ); #upper right corner
#bs = BRepPrimAPI.BRepPrimAPI_MakeBox(c1,c2);
#bs.Build();
#halfspace = bs.Solid();
#make the cut
bc = BRepAlgoAPI.BRepAlgoAPI_Cut(shapeToSlice,halfspace);
bc.Build();
cutShape = bc.Shape();
#search the shape for faces at the specified zlevel
texp = TopExp.TopExp_Explorer();
texp.Init(cutShape,TopAbs.TopAbs_FACE);
foundFace = False;
while ( texp.More() ):
face = ts.Face(texp.Current());
#logging.debug("Checking Face for zLevel " + str(zLevel));
if isAtZLevel(zLevel,face):
foundFace = True;
logging.debug( "Face is at zlevel" + str(zLevel) );
s.addFace(face);
texp.Next();
#free memory
hs.Delete();
halfspace.Nullify();
cutShape.Nullify();
bc.Delete();
texp.Destroy();
if not foundFace:
logging.warn("No faces found after slicing at zLevel " + str(zLevel) + "
!. Skipping This layer completely");
return None;
else:
return s;
_______________________________________________
Pythonocc-users mailing list
[email protected]
https://mail.gna.org/listinfo/pythonocc-users