Пример #1
0
void Werkstuck::LZ(float endPunkt, float Rwz, float Lwz, float Rwz2) // прямое фрезерование по оси Z
// endPunkt - конечная точка
{
    Zwz=endPunkt;

    if (Zwz<H0) {

        gp_Pnt punkt_zent(Xwz,Ywz,Zwz);
        gp_Dir wzNormal = gp::DZ();
        gp_Ax2 wzAchse(punkt_zent,wzNormal);

        BRepPrimAPI_MakeCylinder zLZ(wzAchse,Rwz,Lwz);
        TopoDS_Shape sLZ=zLZ.Shape();

        if (Rwz2>0) {
            BRepFilletAPI_MakeFillet mkFillet(sLZ);
            TopExp_Explorer aEdgeExplorer(sLZ , TopAbs_EDGE);

            while(aEdgeExplorer.More()) {
                TopoDS_Edge aEdge = TopoDS::Edge(aEdgeExplorer.Current());
                mkFillet.Add(Rwz2 , aEdge);
                aEdgeExplorer.Next();
            }
            sLZ = mkFillet.Shape();
        }

        WS = BRepAlgo_Cut(WS,sLZ);

    }

}
Пример #2
0
void Werkstuck::LY(float endPunkt, float Rwz, float Lwz, float Rwz2) // прямое фрезерование по оси Х
// endPunkt - конечная точка
{
    if (Zwz<H0) {
        gp_Pnt punkt1(Xwz-Rwz,Ywz,Zwz);
        gp_Pnt punkt2(Xwz+Rwz,Ywz,Zwz);
        gp_Pnt punkt3(Xwz+Rwz,endPunkt,Zwz);
        gp_Pnt punkt4(Xwz,endPunkt,Zwz);
        if (endPunkt>=Ywz) punkt4.SetY(endPunkt+Rwz);
        else punkt4.SetY(endPunkt-Rwz);

        gp_Pnt punkt5(Xwz-Rwz,endPunkt,Zwz);


        Handle(Geom_TrimmedCurve) aSeg1 = GC_MakeSegment(punkt1 , punkt2);
        Handle(Geom_TrimmedCurve) aSeg2 = GC_MakeSegment(punkt2 , punkt3);
        Handle(Geom_TrimmedCurve) aSeg3 = GC_MakeArcOfCircle(punkt3,punkt4 ,punkt5);
        Handle(Geom_TrimmedCurve) aSeg4 = GC_MakeSegment(punkt5 , punkt1);

        TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aSeg1);
        TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aSeg2);
        TopoDS_Edge aEdge3 = BRepBuilderAPI_MakeEdge(aSeg3);
        TopoDS_Edge aEdge4 = BRepBuilderAPI_MakeEdge(aSeg4);

        TopoDS_Wire Basis  = BRepBuilderAPI_MakeWire(aEdge1 , aEdge2 , aEdge3, aEdge4);

        TopoDS_Face FlacheBasis = BRepBuilderAPI_MakeFace(Basis);


        if (firstRun) {
            fBasis = FlacheBasis;
            firstRun = false;
        } else {

            fBasis = BRepAlgo_Fuse(fBasis, FlacheBasis);

            gp_Vec PrismVec(0 , 0 , Lwz);

            TopoDS_Shape sLY = BRepPrimAPI_MakePrism(fBasis , PrismVec);

            if (Rwz2>0) {
                BRepFilletAPI_MakeFillet mkFillet(sLY);
                TopExp_Explorer aEdgeExplorer(sLY , TopAbs_EDGE);

                while(aEdgeExplorer.More()) {
                    TopoDS_Edge aEdge = TopoDS::Edge(aEdgeExplorer.Current());
                    mkFillet.Add(Rwz2 , aEdge);
                    aEdgeExplorer.Next();
                }
                sLY = mkFillet.Shape();
            }

            WS = BRepAlgo_Cut(WS,sLY);

            firstRun = true;
        }

        /*gp_Vec PrismVec(0 , 0 , Lwz);

        TopoDS_Shape sLY = BRepPrimAPI_MakePrism(FlacheBasis , PrismVec);

        if (Rwz2>0) {
            BRepFilletAPI_MakeFillet mkFillet(sLY);
            TopExp_Explorer aEdgeExplorer(sLY , TopAbs_EDGE);

            while(aEdgeExplorer.More()){
            TopoDS_Edge aEdge = TopoDS::Edge(aEdgeExplorer.Current());
            mkFillet.Add(Rwz2 , aEdge);
            aEdgeExplorer.Next();
            }
            sLY = mkFillet.Shape();
        }

        WS = BRepAlgo_Cut(WS,sLY);*/

    }
    Ywz=endPunkt;
}
Пример #3
0
TopoDS_Shape OCCPartFactory::makeBottle( const Standard_Real width,
                                        const Standard_Real height,
                                        const Standard_Real depth)
{
    //Profile : Define Support Points
    gp_Pnt aPnt1(-width / 2. , 0 , 0);
    gp_Pnt aPnt2(-width / 2. , -depth / 4. , 0);
    gp_Pnt aPnt3(0 , -depth / 2. , 0);
    gp_Pnt aPnt4(width / 2. , -depth / 4. , 0);
    gp_Pnt aPnt5(width / 2. , 0 , 0);
    
    //Profile : Define the Geometry
    Handle(Geom_TrimmedCurve) aArcOfCircle = GC_MakeArcOfCircle(aPnt2,aPnt3 ,aPnt4);
    Handle(Geom_TrimmedCurve) aSegment1      = GC_MakeSegment(aPnt1 , aPnt2);
    Handle(Geom_TrimmedCurve) aSegment2      = GC_MakeSegment(aPnt4 , aPnt5);
    
    //Profile : Define the Topology
    TopoDS_Edge aEdge1 = BRepBuilderAPI_MakeEdge(aSegment1);
    TopoDS_Edge aEdge2 = BRepBuilderAPI_MakeEdge(aArcOfCircle);
    TopoDS_Edge aEdge3 = BRepBuilderAPI_MakeEdge(aSegment2);
    TopoDS_Wire aWire  = BRepBuilderAPI_MakeWire(aEdge1 , aEdge2 , aEdge3);
    
    //Complete Profile
    gp_Ax1 xAxis = gp::OX();
    gp_Trsf aTrsf;
    
    aTrsf.SetMirror(xAxis);
    
    BRepBuilderAPI_Transform aBRepTrsf(aWire , aTrsf);
    TopoDS_Shape aMirroredShape = aBRepTrsf.Shape();
    TopoDS_Wire aMirroredWire = TopoDS::Wire(aMirroredShape);
    
    BRepBuilderAPI_MakeWire mkWire;
    
    mkWire.Add(aWire);
    mkWire.Add(aMirroredWire);
    
    TopoDS_Wire myWireProfile = mkWire.Wire();
    
    //Body : Prism the Profile
    TopoDS_Face myFaceProfile = BRepBuilderAPI_MakeFace(myWireProfile);
    gp_Vec      aPrismVec(0 , 0 , height);
    
    TopoDS_Shape myBody = BRepPrimAPI_MakePrism(myFaceProfile , aPrismVec);
    
    //Body : Apply Fillets
    BRepFilletAPI_MakeFillet mkFillet(myBody);
    TopExp_Explorer          aEdgeExplorer(myBody , TopAbs_EDGE);
    
    while (aEdgeExplorer.More())
    {
    
        TopoDS_Edge aEdge = TopoDS::Edge(aEdgeExplorer.Current());
    
        //Add edge to fillet algorithm
        mkFillet.Add(width / 12. , aEdge);
    
        aEdgeExplorer.Next();
    }
    
    myBody = mkFillet.Shape();
    
    //Body : Add the Neck
    gp_Pnt neckLocation(0 , 0 , height);
    gp_Dir neckNormal = gp::DZ();
    gp_Ax2 neckAx2(neckLocation , neckNormal);
    
    Standard_Real myNeckRadius = width / 4.;
    Standard_Real myNeckHeight = height / 10;
    
    BRepPrimAPI_MakeCylinder MKCylinder(neckAx2 , myNeckRadius , myNeckHeight);
    TopoDS_Shape myNeck = MKCylinder.Shape();
    
    myBody = BRepAlgoAPI_Fuse(myBody , myNeck);
    
    //Body : Create a Hollowed Solid
    TopoDS_Face   faceToRemove;
    Standard_Real zMax = -1;
    
    for (TopExp_Explorer aFaceExplorer(myBody , TopAbs_FACE) ; aFaceExplorer.More() ; aFaceExplorer.Next())
    {
    
        TopoDS_Face aFace = TopoDS::Face(aFaceExplorer.Current());
    
        //Check if <aFace> is the top face of the bottle's neck
        Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace);
    
        if (aSurface->DynamicType() == STANDARD_TYPE(Geom_Plane))
        {
    
            Handle(Geom_Plane) aPlane = Handle(Geom_Plane)::DownCast(aSurface);
    
            gp_Pnt        aPnt = aPlane->Location();
            Standard_Real aZ   = aPnt.Z();
    
            if (aZ > zMax)
            {
    
                zMax         = aZ;
                faceToRemove = aFace;
            }
        }
    }
    
    TopTools_ListOfShape facesToRemove;
    
    facesToRemove.Append(faceToRemove);

    myBody = BRepOffsetAPI_MakeThickSolid(myBody , facesToRemove , -width / 50 , 1.e-3);
    
    
    //return myBody;
    //Threading : Create Surfaces
    Handle(Geom_CylindricalSurface) aCyl1 = new Geom_CylindricalSurface(neckAx2 , myNeckRadius * 0.99);
    Handle(Geom_CylindricalSurface) aCyl2 = new Geom_CylindricalSurface(neckAx2 , myNeckRadius * 1.05);
    
    //Threading : Define 2D Curves
    gp_Pnt2d aPnt(2. * PI , myNeckHeight / 2.);
    gp_Dir2d aDir(2. * PI , myNeckHeight / 4.);
    gp_Ax2d aAx2d(aPnt , aDir);
    
    Standard_Real aMajor = 2. * PI;
    Standard_Real aMinor = myNeckHeight / 10;
    
    Handle(Geom2d_Ellipse) anEllipse1 = new Geom2d_Ellipse(aAx2d , aMajor , aMinor);
    Handle(Geom2d_Ellipse) anEllipse2 = new Geom2d_Ellipse(aAx2d , aMajor , aMinor / 4);
    
    Handle(Geom2d_TrimmedCurve) aArc1 = new Geom2d_TrimmedCurve(anEllipse1 , 0 , PI);
    Handle(Geom2d_TrimmedCurve) aArc2 = new Geom2d_TrimmedCurve(anEllipse2 , 0 , PI);
    
    gp_Pnt2d anEllipsePnt1 = anEllipse1->Value(0);
    gp_Pnt2d anEllipsePnt2 = anEllipse1->Value(PI);
    
    Handle(Geom2d_TrimmedCurve) aSegment = GCE2d_MakeSegment(anEllipsePnt1 , anEllipsePnt2);
    
    //Threading : Build Edges and Wires
    TopoDS_Edge aEdge1OnSurf1 = BRepBuilderAPI_MakeEdge(aArc1 , aCyl1);
    TopoDS_Edge aEdge2OnSurf1 = BRepBuilderAPI_MakeEdge(aSegment , aCyl1);
    TopoDS_Edge aEdge1OnSurf2 = BRepBuilderAPI_MakeEdge(aArc2 , aCyl2);
    TopoDS_Edge aEdge2OnSurf2 = BRepBuilderAPI_MakeEdge(aSegment , aCyl2);
    
    TopoDS_Wire threadingWire1 = BRepBuilderAPI_MakeWire(aEdge1OnSurf1 , aEdge2OnSurf1);
    TopoDS_Wire threadingWire2 = BRepBuilderAPI_MakeWire(aEdge1OnSurf2 , aEdge2OnSurf2);
    
    BRepLib::BuildCurves3d(threadingWire1);
    BRepLib::BuildCurves3d(threadingWire2);
    
    //Create Threading
    BRepOffsetAPI_ThruSections aTool(Standard_True);
    
    aTool.AddWire(threadingWire1);
    aTool.AddWire(threadingWire2);
    aTool.CheckCompatibility(Standard_False);
    
    TopoDS_Shape myThreading = aTool.Shape();
    
    //Building the resulting compound
    TopoDS_Compound aRes;
    BRep_Builder aBuilder;
    aBuilder.MakeCompound (aRes);
    
    aBuilder.Add (aRes, myBody);
    aBuilder.Add (aRes, myThreading);
    
    return aRes;
}