Plane CreateMountingSurfaceForGivenBasePoints(Function3D oFunc3D, string oMateName1, string oMateName2, string oMateName3)
{
    Mate[] arrMates1 = oFunc3D.GetTargetMates(true);
    Mate oMate1 = oFunc3D.FindTargetMate(oMateName1, false);
    Mate oMate2 = oFunc3D.FindTargetMate(oMateName2, false);
    Mate oMate3 = oFunc3D.FindTargetMate(oMateName3, false);
    Matrix3D oAbsTransfInv = oFunc3D.AbsoluteTransformation;
    oAbsTransfInv.Invert();
    PointD3D oPos1 = GetRelativePointD3D(oAbsTransfInv, oMate1.Transformation);
    PointD3D oPos2 = GetRelativePointD3D(oAbsTransfInv, oMate2.Transformation);
    PointD3D oPos3 = GetRelativePointD3D(oAbsTransfInv, oMate3.Transformation);
    Mesh oMesh = oFunc3D.Mesh;
    PointD3D[] arrFoundFace = null;
    Vector3D oNormalVector = new Vector3D();
    for (uint i = 1; i < oMesh.FaceCount; i++)
    {
        try
        {
            PointD3D[] arrFace = oMesh.get_FacePoints(i);
            oNormalVector = (Vector3D)oMesh.get_FaceNormalVector(i);
            if (IsPointInFaceBorder(arrFace, oPos1) &&
                IsPointInFaceBorder(arrFace, oPos2) &&
                    IsPointInFaceBorder(arrFace, oPos3))
            {
                arrFoundFace = arrFace;
                break;
            }
        }
        catch
        {
        }
    }
    if (arrFoundFace != null && arrFoundFace.Length > 0)
    {
        Plane oMountingSurface = new Placement3DService().CreateMountingSurface(oFunc3D, arrFoundFace, oNormalVector, true);
        return oMountingSurface;
    }
    return null;
}
PointD3D GetRelativePointD3D(Matrix3D oAbsTrasfInv, Matrix3D oPointTransf)
{
    Point3D oRelativePoint = oAbsTrasfInv.Transform(oPointTransf.Transform(new Point3D(0, 0, 0)));
    return new PointD3D(oRelativePoint.X, oRelativePoint.Y, oRelativePoint.Z);
}
bool IsPointInFaceBorder(PointD3D[] arrFace, PointD3D oPoint)
{
    foreach (PointD3D oFacePoint in arrFace)
    {
        if ((Math.Abs(oFacePoint.X - oPoint.X) < 1) && (Math.Abs(oFacePoint.Y - oPoint.Y) < 1) && (Math.Abs(oFacePoint.Z - oPoint.Z) < 1))
            return true;
    }
    return false;
}