// Transform_Presentation.cpp: implementation of the Transform_Presentation class. // Transform shapes: apply gp_Trsf or gp_GTrsf transformation //////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Transform_Presentation.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef WNT #define EOL "\r\n" #define DELIM "\\" #else #define EOL "\n" #define DELIM "/" #endif // Initialization of global variable with an instance of this class OCCDemo_Presentation* OCCDemo_Presentation::Current = new Transform_Presentation; // Initialization of array of samples const Transform_Presentation::PSampleFuncType Transform_Presentation::SampleFuncs[] = { &Transform_Presentation::sample1, &Transform_Presentation::sample2 }; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// Transform_Presentation::Transform_Presentation() { myNbSamples = sizeof(SampleFuncs)/sizeof(PSampleFuncType); setName ("Transform shapes"); } ////////////////////////////////////////////////////////////////////// // Sample execution ////////////////////////////////////////////////////////////////////// void Transform_Presentation::DoSample() { getAISContext()->EraseAll(); if (myIndex >=0 && myIndex < myNbSamples) (this->*SampleFuncs[myIndex])(); } ////////////////////////////////////////////////////////////////////// // Auxiliary functions ////////////////////////////////////////////////////////////////////// Standard_Boolean Transform_Presentation::readShape(const Standard_CString theFileName, TopoDS_Shape& theShape) { theShape.Nullify(); TCollection_AsciiString aPath; aPath = aPath + GetDataDir() + DELIM + theFileName; BRep_Builder aBld; Standard_Boolean isRead = BRepTools::Read (theShape, aPath.ToCString(), aBld); if (!isRead) { aPath = aPath + " is not found"; setResultText(aPath.ToCString()); } return isRead; } // apply standard transformation and get transformed shape static TopoDS_Shape Transform(const TopoDS_Shape& aShape, const gp_Trsf& aTrsf) { BRepBuilderAPI_Transform aTransform(aTrsf); Standard_Boolean toCopy = Standard_False; // share entities if possible aTransform.Perform(aShape, toCopy); if (aTransform.IsDone()) return aTransform.Shape(); return TopoDS_Shape(); } // apply general transformation and get transformed shape static TopoDS_Shape GTransform(const TopoDS_Shape& aShape, const gp_GTrsf& aTrsf) { BRepBuilderAPI_GTransform aTransform(aTrsf); Standard_Boolean toCopy = Standard_False; // share entities if possible aTransform.Perform(aShape, toCopy); if (aTransform.IsDone()) return aTransform.Shape(); return TopoDS_Shape(); } ////////////////////////////////////////////////////////////////////// // Sample functions ////////////////////////////////////////////////////////////////////// void Transform_Presentation::sample1() { SetViewScale(4); setResultTitle ("Standard transformations"); // define initial shape static TopoDS_Shape aShape; TopoDS_Shape aNewShape; if (aShape.IsNull() && !readShape("shape1.brep",aShape)) return; TCollection_AsciiString aText; aText += "// Apply standard transformation and get transformed shape" EOL "TopoDS_Shape Transform(const TopoDS_Shape& aShape, const gp_Trsf& aTrsf)" EOL "{" EOL " BRepBuilderAPI_Transform aTransform(aTrsf);" EOL " Standard_Boolean toCopy = Standard_False; // share entities if possible" EOL " aTransform.Perform(aShape, toCopy);" EOL " if (aTransform.IsDone())" EOL " return aTransform.Shape();" EOL " return TopoDS_Shape();" EOL "}" EOL EOL "// ..." EOL EOL " // define initial shape and shape used for result" EOL " TopoDS_Shape aShape, aNewShape;" EOL " // aShape = ... ;" EOL EOL " // create standard transformation" EOL " gp_Trsf aTrsf;" EOL EOL " // define translation" EOL " Standard_Real dx=-80, dy=-60, dz=-50;" EOL " gp_Vec aVec(dx,dy,dz);" EOL " aTrsf.SetTranslation(aVec);" EOL EOL " aNewShape = Transform(aShape, aTrsf);" EOL EOL " // add rotation" EOL " gp_Trsf aRotTrsf;" EOL " gp_Pnt ax1Pnt(dx,dy,dz);" EOL " gp_Dir ax1Dir(0,0,1);" EOL " gp_Ax1 ax1 (ax1Pnt,ax1Dir);" EOL " Standard_Real angle = 60. * PI / 180;" EOL " aRotTrsf.SetRotation(ax1, angle);" EOL " aTrsf = aRotTrsf * aTrsf;" EOL EOL " aNewShape = Transform(aShape, aTrsf);" EOL EOL " // add scaling" EOL " gp_Trsf aScaleTrsf;" EOL " gp_Pnt scalePnt = ax1Pnt;" EOL " Standard_Real scaleFactor = 0.6;" EOL " aScaleTrsf.SetScale(scalePnt, scaleFactor);" EOL " aTrsf = aScaleTrsf * aTrsf;" EOL EOL " aNewShape = Transform(aShape, aTrsf);" EOL EOL " // add point mirror" EOL " gp_Trsf aMir1Trsf;" EOL " gp_Pnt mirPnt(dx/4,dy/4,dz/4);" EOL " aMir1Trsf.SetMirror(mirPnt);" EOL " aTrsf = aMir1Trsf * aTrsf;" EOL EOL " aNewShape = Transform(aShape, aTrsf);" EOL EOL " // add axial mirror" EOL " gp_Trsf aMir2Trsf;" EOL " gp_Ax1 mirAx1(gp_Pnt(0,0,0),gp_Dir(0,0,1));" EOL " aMir2Trsf.SetMirror(mirAx1);" EOL " aTrsf = aMir2Trsf * aTrsf;" EOL EOL " aNewShape = Transform(aShape, aTrsf);" EOL EOL " // add planar mirror" EOL " gp_Trsf aMir3Trsf;" EOL " gp_Ax2 mirAx2(gp_Pnt(-dx/4,0,0),gp_Dir(1,0,0));" EOL " aMir3Trsf.SetMirror(mirAx2);" EOL " aTrsf = aMir3Trsf * aTrsf;" EOL EOL " aNewShape = Transform(aShape, aTrsf);" EOL EOL; setResultText(aText.ToCString()); Handle(AIS_InteractiveObject) aIShape = drawShape (aShape); if (WAIT_A_SECOND) return; // create standard transformation gp_Trsf aTrsf; // define translation Standard_Real dx=-80, dy=-60, dz=-50; gp_Vec aVec(dx,dy,dz); aTrsf.SetTranslation(aVec); Handle(AIS_InteractiveObject) aIVec = drawVector(gp::Origin(),aVec,Quantity_NOC_WHITE); if (WAIT_A_LITTLE) return; aNewShape = Transform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } Handle(AIS_InteractiveObject) oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIVec); // add rotation gp_Trsf aRotTrsf; gp_Pnt ax1Pnt(dx,dy,dz); gp_Dir ax1Dir(0,0,1); gp_Ax1 ax1 (ax1Pnt,ax1Dir); Standard_Real angle = 60. * PI / 180; aRotTrsf.SetRotation(ax1, angle); aTrsf = aRotTrsf * aTrsf; Handle(AIS_InteractiveObject) aIAx1 = drawCurve(new Geom_Line(ax1),Quantity_NOC_WHITE); gp_Ax2 ax2(ax1Pnt.Translated(gp_Vec(0,0,70)),ax1Dir); Handle(Geom_Curve) aCirc = new Geom_TrimmedCurve(new Geom_Circle(ax2,20),0,angle); Handle(AIS_InteractiveObject) aICirc = drawCurve(aCirc,Quantity_NOC_WHITE,Standard_False); Handle(Prs3d_Drawer) aDrawer = new Prs3d_Drawer; aDrawer->Link()->SetLineArrowDraw(Standard_True); aDrawer->Link()->ArrowAspect()->SetLength(2); getAISContext()->SetLocalAttributes (aICirc, aDrawer); getAISContext()->Display (aICirc); if (WAIT_A_LITTLE) return; aNewShape = Transform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIAx1); getAISContext()->Erase(aICirc); // add scaling gp_Trsf aScaleTrsf; gp_Pnt scalePnt = ax1Pnt; Standard_Real scaleFactor = 0.6; aScaleTrsf.SetScale(scalePnt, scaleFactor); aTrsf = aScaleTrsf * aTrsf; Handle(AIS_InteractiveObject) aIPnt = drawPoint(scalePnt, Quantity_NOC_WHITE); if (WAIT_A_LITTLE) return; aNewShape = Transform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIPnt); // add point mirror gp_Trsf aMir1Trsf; gp_Pnt mirPnt(dx/4,dy/4,dz/4); aMir1Trsf.SetMirror(mirPnt); aTrsf = aMir1Trsf * aTrsf; aIPnt = drawPoint(mirPnt, Quantity_NOC_WHITE); if (WAIT_A_LITTLE) return; aNewShape = Transform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIPnt); // add axial mirror gp_Trsf aMir2Trsf; gp_Ax1 mirAx1(gp_Pnt(0,0,0),gp_Dir(0,0,1)); aMir2Trsf.SetMirror(mirAx1); aTrsf = aMir2Trsf * aTrsf; aIAx1 = drawCurve(new Geom_Line(mirAx1),Quantity_NOC_WHITE); if (WAIT_A_LITTLE) return; aNewShape = Transform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIAx1); // add planar mirror gp_Trsf aMir3Trsf; gp_Ax2 mirAx2(gp_Pnt(-dx/4,0,0),gp_Dir(1,0,0)); aMir3Trsf.SetMirror(mirAx2); aTrsf = aMir3Trsf * aTrsf; Handle(AIS_InteractiveObject) aIAx2 = drawSurface( new Geom_RectangularTrimmedSurface(new Geom_Plane(mirAx2),-50.,50.,-50.,50.), Quantity_NOC_WHITE); if (WAIT_A_LITTLE) return; aNewShape = Transform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIAx2); } void Transform_Presentation::sample2() { ResetView(); SetViewCenter(219.25218771377, 60.449092616063); SetViewScale(3.4554379699768); setResultTitle ("General transformations"); // define initial shape static TopoDS_Shape aShape; TopoDS_Shape aNewShape; if (aShape.IsNull() && !readShape("Pump_Nut.brep",aShape)) return; TCollection_AsciiString aText; aText += "// Apply general transformation and get transformed shape" EOL "TopoDS_Shape GTransform(const TopoDS_Shape& aShape, const gp_GTrsf& aTrsf)" EOL "{" EOL " BRepBuilderAPI_GTransform aTransform(aTrsf);" EOL " Standard_Boolean toCopy = Standard_False; // share entities if possible" EOL " aTransform.Perform(aShape, toCopy);" EOL " if (aTransform.IsDone())" EOL " return aTransform.Shape();" EOL " return TopoDS_Shape();" EOL "}" EOL EOL "// ..." EOL EOL " // define initial shape and shape used for result" EOL " TopoDS_Shape aShape, aNewShape;" EOL " // aShape = ... ;" EOL EOL " // create general transformation" EOL " gp_GTrsf aTrsf;" EOL EOL " // define affinity respect to line" EOL " gp_Ax1 ax1(gp_Pnt(81,280,0),gp_Dir(0,1,0));" EOL " Standard_Real ratio = 2;" EOL " aTrsf.SetAffinity(ax1, ratio);" EOL EOL " aNewShape = GTransform(aShape, aTrsf);" EOL EOL " // add affinity respect to plane" EOL " gp_GTrsf aTrsf1;" EOL " gp_Ax2 ax2(gp_Pnt(81,280,0),gp_Dir(0,1,0));" EOL " ratio = 8;" EOL " aTrsf1.SetAffinity(ax2, ratio);" EOL " aTrsf = aTrsf1 * aTrsf;" EOL EOL " aNewShape = GTransform(aShape, aTrsf);" EOL EOL; setResultText(aText.ToCString()); Handle(AIS_InteractiveObject) aIShape = drawShape (aShape); if (WAIT_A_SECOND) return; // create general transformation gp_GTrsf aTrsf; // define affinity respect to line gp_Ax1 ax1(gp_Pnt(81,280,0),gp_Dir(0,1,0)); Standard_Real ratio = 2; aTrsf.SetAffinity(ax1, ratio); Handle(AIS_InteractiveObject) aIAx1 = drawCurve(new Geom_Line(ax1),Quantity_NOC_WHITE); if (WAIT_A_LITTLE) return; aNewShape = GTransform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } Handle(AIS_InteractiveObject) oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIAx1); // add affinity respect to plane gp_GTrsf aTrsf1; gp_Ax2 ax2(gp_Pnt(81,280,0),gp_Dir(0,1,0)); ratio = 8; aTrsf1.SetAffinity(ax2, ratio); aTrsf.PreMultiply(aTrsf1); Handle(AIS_InteractiveObject) aIAx2 = drawSurface( new Geom_RectangularTrimmedSurface(new Geom_Plane(ax2),-100.,100.,-100.,100.), Quantity_NOC_WHITE); if (WAIT_A_LITTLE) return; aNewShape = GTransform(aShape, aTrsf); if (aNewShape.IsNull()) { aText += EOL "Error: transformation failure" EOL; setResultText(aText.ToCString()); return; } oldObj = aIShape; aIShape = drawShape (aNewShape); getAISContext()->Erase(oldObj); if (WAIT_A_SECOND) return; getAISContext()->Erase(aIAx2); }