After more investigation of why NotDone is thrown, I have found some info. The Fuse operation has ErrorStatus() function on it. I found that it returns the error code 110.
Then I looked into OCC code to find out what 110 stands for. I think these two locations in code can throw that error [1<https://github.com/tpaviot/oce/blob/master/src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.cxx#L315>] and [2<https://github.com/tpaviot/oce/blob/master/src/BRepAlgoAPI/BRepAlgoAPI_BooleanOperation.cxx#L390> ] The actual error code is 10. Further digging for it, I found that there are two locations that throw that error code. [1<https://github.com/tpaviot/oce/blob/master/src/BOP/BOP_ShellSolid.cxx#L145>] and [2<https://github.com/tpaviot/oce/blob/master/src/BOP/BOP_WireSolid.cxx#L90> ] Both are caused by issues with type of the shape that is passed as arguments. It looks like the code has problem if one shape is of type TopAbs_SHELL and other is TopAbs_SOLID. In our case I tried to find out the ShapeType's of the two shapes we pass. One of them (box created by BRepPrimAPI_MakeBox) is TopAbs_SOLID and the other (that we constructed by hand) is TopAbs_COMPOUND. This confuses me because arg type checking code has no condition that mentions COMPOUND shape type. Any ideas are welcome. -- Jayesh On Thu, Dec 8, 2011 at 12:56 PM, Jayesh Salvi <jayeshsa...@gmail.com> wrote: > Hi, > > I tried to write PythonOCC equivalent of the STLReader code that Thomas > provided. You can find it in this gist: https://gist.github.com/1446374 > > I use a representation of a cube in the form of vertex-faces data and > build a compound shape in the same way as done in STL reader code. The > final shape gets successfully built. However when I try to perform a > boolean fuse operation with another shape I get > > RuntimeError: StdFail_NotDone > BRep_API: command not done > > (See the commented lines at the end in above mentioned code) > Any idea how to investigate this further? > Thanks, > -- > Jayesh > > > > On Thu, Dec 1, 2011 at 8:47 AM, Jayesh Salvi <jayeshsa...@gmail.com>wrote: > >> Thomas, >> >> I had the same idea, so I tried a shortcut method. I converted the mesh >> data of a simple cube into STL and tried to load it using STLReader API (of >> PythonOCC). I got NotDone failure, if I recall correctly. I will try to >> port the code snippet to python and see if that helps. >> -- >> Jayesh >> >> >> On Wed, Nov 30, 2011 at 3:10 PM, Thomas Paviot <tpav...@gmail.com> wrote: >> >>> 2011/11/30 Thomas Paviot <tpav...@gmail.com> >>> >>>> 2011/11/30 Jayesh Salvi <jayeshsa...@gmail.com> >>>> >>>>> Thomas, >>>>> >>>>> Is there a way to do this other way around? i.e. if I have mesh >>>>> information how do I convert it to Solid. >>>>> >>>> >>>> I think we should have a look at the STL Importer implemented in OCC. >>>> They actually convert mesh information into solids. >>>> >>>> >>>>> I think that's what Chris was asking too. I've tried to do it >>>>> (here<https://gist.github.com/1351019>), >>>>> but the solids I create do not behave correctly in subsequent boolean >>>>> operations on them. >>>>> >>>>> Any hint will be appreciated. Thanks. >>>>> -- >>>>> Jayesh >>>>> >>>>> >>>> Thomas >>>> >>>> >>> Attached below a snippet of the OCC code from STL_Reader.cxx. The >>> algorithm for mesh to TopoDS_Shape conversion can be ported to python. >>> >>> Thomas >>> >>> === >>> void StlAPI_Reader::Read(TopoDS_Shape& aShape, const Standard_CString >>> aFileName) >>> { >>> OSD_Path aFile(aFileName); >>> >>> Handle(StlMesh_Mesh) aSTLMesh = RWStl::ReadFile(aFile); >>> Standard_Integer NumberDomains = aSTLMesh->NbDomains(); >>> Standard_Integer iND; >>> gp_XYZ p1, p2, p3; >>> TopoDS_Vertex Vertex1, Vertex2, Vertex3; >>> TopoDS_Face AktFace; >>> TopoDS_Wire AktWire; >>> BRepBuilderAPI_Sewing aSewingTool; >>> Standard_Real x1, y1, z1; >>> Standard_Real x2, y2, z2; >>> Standard_Real x3, y3, z3; >>> >>> aSewingTool.Init(1.0e-06,Standard_True); >>> >>> TopoDS_Compound aComp; >>> BRep_Builder BuildTool; >>> BuildTool.MakeCompound( aComp ); >>> >>> StlMesh_MeshExplorer aMExp (aSTLMesh); >>> >>> for (iND=1;iND<=NumberDomains;iND++) >>> { >>> for (aMExp.InitTriangle (iND); aMExp.MoreTriangle (); >>> aMExp.NextTriangle ()) >>> { >>> aMExp.TriangleVertices (x1,y1,z1,x2,y2,z2,x3,y3,z3); >>> p1.SetCoord(x1,y1,z1); >>> p2.SetCoord(x2,y2,z2); >>> p3.SetCoord(x3,y3,z3); >>> >>> if ((!(p1.IsEqual(p2,0.0))) && (!(p1.IsEqual(p3,0.0)))) >>> { >>> Vertex1 = BRepBuilderAPI_MakeVertex(p1); >>> Vertex2 = BRepBuilderAPI_MakeVertex(p2); >>> Vertex3 = BRepBuilderAPI_MakeVertex(p3); >>> >>> AktWire = BRepBuilderAPI_MakePolygon( Vertex1, Vertex2, Vertex3, >>> Standard_True); >>> >>> if( !AktWire.IsNull()) >>> { >>> AktFace = BRepBuilderAPI_MakeFace( AktWire); >>> if(!AktFace.IsNull()) >>> BuildTool.Add( aComp, AktFace ); >>> } >>> } >>> } >>> } >>> aSTLMesh->Clear(); >>> >>> aSewingTool.Load( aComp ); >>> aSewingTool.Perform(); >>> aShape = aSewingTool.SewedShape(); >>> if ( aShape.IsNull() ) >>> aShape = aComp; >>> } >>> >>> >>> _______________________________________________ >>> Pythonocc-users mailing list >>> Pythonocc-users@gna.org >>> https://mail.gna.org/listinfo/pythonocc-users >>> >>> >> >
_______________________________________________ Pythonocc-users mailing list Pythonocc-users@gna.org https://mail.gna.org/listinfo/pythonocc-users