
Tue, 11/30/2010 - 18:18
Hi everyone,
I'm trying to use BRepAlgoAPI_Cut but there is something dosent work. I'm trying to make a simple cube with an hole, a cylinder one.
Please take e look to the following code :
Create a cube:
void CSampleViewer3dDoc::OnBaseBox()
{
CNewBaseBoxDlg Dlg;
if(Dlg.DoModal()!=IDOK) return;
BRepPrimAPI_MakeBox B(gp_Pnt(Dlg.m_x, Dlg.m_y, Dlg.m_z), Dlg.m_w, Dlg.m_l, Dlg.m_h);
aBaseBox = new AIS_Shape(B.Shape());
myAISContext->SetColor(aBaseBox,Quantity_NOC_MATRABLUE);
myAISContext->SetMaterial(aBaseBox,Graphic3d_NOM_PLASTIC);
myAISContext->SetDisplayMode(aBaseBox,1);
myAISContext->Display(aBaseBox);
Fit();
}
Create a cylinder and cut
void CSampleViewer3dDoc::OnShapeHole()
{
CNewBaseCylinderDlg Dlg;
if(Dlg.DoModal()!=IDOK) return;
BRepPrimAPI_MakeCylinder B(((Dlg.m_x, Dlg.m_y, Dlg.m_z),(Dlg.m_x1, Dlg.m_y1, Dlg.m_z1)), Dlg.m_h, Dlg.m_r);
Handle(AIS_Shape) aHoleCyl = new AIS_Shape(B.Shape());
myAISContext->SetDisplayMode(aHoleCyl,1);
myAISContext->SetColor(aHoleCyl,Quantity_NOC_MATRABLUE);
myAISContext->SetMaterial(aHoleCyl,Graphic3d_NOM_PLASTIC);
myAISContext->SetDisplayMode(aHoleCyl,1);
myAISContext->Display(aHoleCyl);
Fit();
Sleep(500);
TopoDS_Shape Cut = BRepAlgoAPI_Cut(aBaseBox,aHoleCyl);
Handle (AIS_Shape) ais18 = new AIS_Shape(Cut);
myAISContext->SetColor(ais18,Quantity_NOC_CORAL2);
myAISContext->SetMaterial(ais18,Graphic3d_NOM_PLASTIC);
myAISContext->Display(ais18);
Fit()
}
And there is an error:
error C2665: 'BRepAlgoAPI_Cut::BRepAlgoAPI_Cut' : none of the 3 overloads could convert all the argument types
Appreciate for your help.
Tue, 11/30/2010 - 21:13
Error in this: "TopoDS_Shape Cut = BRepAlgoAPI_Cut(aBaseBox,aHoleCyl);"
"aBaseBox" and "aHoleCyl" is "AIS_Shape", but must be a "TopoDS_Shape".
You must use yors "B" from "BRepPrimAPI_MakeBox" and "BRepPrimAPI_MakeCylinder".
Sample:
BRepPrimAPI_MakeBox myBox(gp_Pnt(Dlg.m_x, Dlg.m_y, Dlg.m_z), Dlg.m_w, Dlg.m_l, Dlg.m_h);
BRepPrimAPI_MakeCylinder myCyl(((Dlg.m_x, Dlg.m_y, Dlg.m_z),(Dlg.m_x1, Dlg.m_y1, Dlg.m_z1)), Dlg.m_h, Dlg.m_r);
TopoDS_Shape Cut = BRepAlgoAPI_Cut(myBox, myCyl);
Wed, 12/01/2010 - 13:26
Appreciate for your advise. Unluckly, there is the same error message when I rebuild it.
Attached is the .cpp file.
Wed, 12/01/2010 - 21:53
I do not compile your file. It's big and may contain more than one error with Cut operation :)
So, I wrote a working sample for you. Try this:
////////////////
// vars
Standard_Real cylRadius = 15.;
Standard_Real cylH = 150.;
Standard_Real boxL = 100.;
Standard_Real boxW = 80.;
Standard_Real boxH = 50.;
TopoDS_Shape resultBox;
// make Box
BRepPrimAPI_MakeBox myBox( gp_Pnt( 0, 0, 0 ), boxL, boxW, boxH );
// make axis of direction for cylinder
gp_Ax2 cylAx2(gp_Pnt( 50, 50, 0 ), gp_Dir( gp_Vec( gp_Pnt(0,0,0), gp_Pnt(0,0,100) ) ) );
// make cylinder
BRepPrimAPI_MakeCylinder myCyl( cylAx2, cylRadius, cylH );
// make Cut operation and get result
resultBox = BRepAlgoAPI_Cut( myBox, myCyl.Shape() );
// show myBox
Handle(AIS_Shape) myBoxAIS = new AIS_Shape( myBox );
myAISContext->SetColor( myBoxAIS, Quantity_NOC_RED );
myAISContext->SetMaterial( myBoxAIS, Graphic3d_NOM_SHINY_PLASTIC );
myAISContext->SetDisplayMode( myBoxAIS, AIS_Shaded );
myAISContext->SetCurrentObject( myBoxAIS, Standard_True);
myAISContext->Display( myBoxAIS );
// wait
Sleep(1500);
// show myCyl
Handle(AIS_Shape) myCylAIS = new AIS_Shape( myCyl );
myAISContext->SetColor( myCylAIS, Quantity_NOC_GREEN );
myAISContext->SetMaterial( myCylAIS, Graphic3d_NOM_SHINY_PLASTIC );
myAISContext->SetDisplayMode( myCylAIS, AIS_Shaded );
myAISContext->SetCurrentObject( myCylAIS, Standard_True);
myAISContext->Display( myCylAIS );
// wait
Sleep(1500);
// delete objects
myAISContext->Erase( myBoxAIS );
myAISContext->Erase( myCylAIS );
// show result of Cut
Handle(AIS_Shape) resultBoxAIS = new AIS_Shape( resultBox );
myAISContext->SetColor( resultBoxAIS, Quantity_NOC_MATRABLUE );
myAISContext->SetMaterial( resultBoxAIS, Graphic3d_NOM_SHINY_PLASTIC );
myAISContext->SetDisplayMode( resultBoxAIS, AIS_Shaded );
myAISContext->SetCurrentObject( resultBoxAIS, Standard_True);
myAISContext->Display( resultBoxAIS );
// THE END
////////////////
Thu, 12/02/2010 - 03:05
Thanks for your kindly help. My programe's condition is creating the box and cylinder in two functions, and cut function is in the made cylinder function; consider that the BRepAlgoAPI_Cut could not identify the handle box,so I define the handle of the box. I don't know whether it is available or not.
Thu, 12/02/2010 - 13:21
If you want use 2 functions, you must define "TopoDS_Shape myBox" in global section.
For example in "*.h" file:
....
private:
TopoDS_Shape myBox;
....
And then use it in your functions. Or, you may use function which returns a TopoDS_Shape and use this function in other functions. Example:
TopoDS_Shape MyClass::getMyBox()
{
...
TopoDS_Shape box = BRepPrimAPI_MakeBox(gp_Pnt(Dlg.m_x, Dlg.m_y, Dlg.m_z), Dlg.m_w, Dlg.m_l, Dlg.m_h);
return box;
}
void MyClass::someFunction()
{
...
resultBox = BRepAlgoAPI_Cut( getMyBox(), myCyl.Shape() );
}
Thu, 12/09/2010 - 17:59
sorry to reply too late. I tried your method.But there are errors on defined "TopoDS_Shape MyClass::getMyBox()",the error is :
overloaded function differs only by return type from 'void CSampleViewer3dDoc::OnBaseBox(void)
I think the problem can be simplied as :how BRepAlgoAPI_Cut can transfer the box which in getMyBox()?
Fri, 12/10/2010 - 07:30
Did you rename "MyClass" to your class's name like "CSampleViewer3dDoc"?
You make some errors in class construction. Please read chapter "Object Oriented Programming" on http://www.cplusplus.com/doc/tutorial/
Fri, 12/10/2010 - 14:23
Yeah, I'm sure.But there is an error:
'TopoDS_Shape CSampleViewer3dDoc::OnBaseBox(void)' : overloaded function differs only by return type from 'void CSampleViewer3dDoc::OnBaseBox(void)'
May I get your msn and have a chat online? My msn:chenyao3505@hotmail.com
Appreciate for your help.
Fri, 12/10/2010 - 15:30
I don't have msn. You can contact with me by using Jabber, ICQ, or Skype.
Jabber: heXus at jabber dot org
ICQ: 2 66 66 94 16
Skype name: heXus® //(symbol "®" required)
Fri, 12/10/2010 - 15:44
Also check your "*.h" file for definition of "OnBaseBox(void)" function. You must have in class "CSampleViewer3dDoc" this definition:
// in includes
#include
// in your "*.h" file where class's functions is.
TopoDS_Shape OnBaseBox(void);
I think, error happens because you have definition like this:
void OnBaseBox(void);
but must be "TopoDS_Shape OnBaseBox(void);".