How to get the cut shell by a cutting plane

While HOOPS Visualize has a cutting plane geometry that allows the developer to visualize the cut model with the capping, HOOPS Visualize does not have a capability to get the cut shell geometry, that is necessary to calculate the area of the cut model, etc. Because HOOPS Visualize is not a modeler, you have to license a modeler SDK, or do it yourself. The following code snippet gives you an idea of how to do it. It uses one simple mathmatics equation, and simple HOOPS Shell handling.

        // Step 1 : Get Points and FaceList from HPS Shell
        HPS::PointArray Points;
        HPS::IntArray FaceList;

        int iPointSize = (int)Points.size();
        int iFaceListSize = (int)FaceList.size();

        double a = cutting_plane_normal.x;
        double b = cutting_plane_normal.y;
        double c = cutting_plane_normal.z;
        double d = cutting_planes[translating_plane_offset].d;
        double x;
        double y;
        double z;

        // Step 2 : Extract Points and FaceList that are located in the positive side of the cutting plane
        int iPointCountOut = 0;

        HPS::BoolArray PointSide;
        HPS::IntArray PointMap;
        HPS::PointArray PointsOut;
        HPS::IntArray FaceListOut;

        // Evaluate which side each point belongs to, and make another point array with points that are all in positive side
        for (int i = 0; i < iPointSize; i++)
                x = Points[i].x;
                y = Points[i].y;
                z = Points[i].z;
                if (a * x + b * y + c * z + d > 0)

        // Evaluate if each triangle belongs to the positive side, and make another face list array with points that are all on the positive side
        for (int i = 0; i < iFaceListSize; i += 4)
                if (FaceList[i] != 3)
                        char msg[1024];
                        sprintf_s(msg, 1024, "not a triangle");
                        MessageBoxA(NULL, msg, NULL, 0);

                int u = FaceList[i + 1];
                int v = FaceList[i + 2];
                int w = FaceList[i + 3];

                if (PointSide[u] && PointSide[v] && PointSide[w])

        // Step 3 : Insert Shell in order to visually check the result
        m_keyShellCut.InsertShell(PointsOut, FaceListOut);
1 Like