NurbsSurfaceMesh Class Reference
 
 
 
NurbsSurfaceMesh Class Reference

#include <xsi_nurbssurfacemesh.h>


Class Description

A NurbsSurfaceMesh is a kind of Geometry.

We can navigate the NurbsSurfaceMesh using the generic terms such as Facets or Points or we can choose to use navigate using terms that are specific to the NurbsSurfaceMesh such as NurbsSurfaces, ControlPoints. There are some functions that do not fit with a generic terms such as Knots, which are specific to NURBS, this is why there are specific terms as well as generic terms.

See also:
Primitive::GetGeometry, X3DObject::AddGeometry, X3DObject::AddNurbsSurfaceMesh
Example:
                using namespace XSI;

                Application app;
                Model root = app.GetActiveSceneRoot();

                X3DObject mySphere;
                root.AddGeometry( L"Sphere", L"NurbsSurface", L"", mySphere );

                NurbsSurfaceMesh mySurfaceMesh(mySphere.GetActivePrimitive().GetGeometry());
Inheritance diagram for NurbsSurfaceMesh:
Geometry SIObject CBase

List of all members.

Public Member Functions

  NurbsSurfaceMesh ()
  ~NurbsSurfaceMesh ()
  NurbsSurfaceMesh (const CRef &in_ref)
  NurbsSurfaceMesh (const NurbsSurfaceMesh &in_obj)
  NurbsSurfaceMesh (const Geometry &in_obj)
bool  IsA (siClassID in_ClassID) const
siClassID  GetClassID () const
NurbsSurfaceMesh operator= (const NurbsSurfaceMesh &in_obj)
NurbsSurfaceMesh operator= (const Geometry &in_geom)
NurbsSurfaceMesh operator= (const CRef &in_ref)
CNurbsSurfaceRefArray  GetSurfaces () const
CStatus  GetClosestSurfacePosition (MATH::CVector3 &in_vPosition, LONG &out_lSurfaceIndex, double &out_dSquaredDistance, double &out_dUValue, double &out_dVValue, MATH::CVector3 &out_vPosition) const
CStatus  Get (siNurbsFormat in_siNurbsFormat, CNurbsSurfaceDataArray &out_surfaces) const
CStatus  Set (const CNurbsSurfaceDataArray &in_surfaces, siNurbsFormat in_siNurbsFormat=siSINurbs)
CStatus  AddSurfaceWithTrim (const CNurbsSurfaceData &in_surface, const CTrimCurveDataArray &in_trims, siNurbsFormat in_siNurbsFormat, NurbsSurface &out_Surface)
CStatus  AddSurface (const CNurbsSurfaceData &in_surface, siNurbsFormat in_siNurbsFormat, NurbsSurface &out_Surface)
CStatus  GetSubSurfaceIndexArray (const PointLocatorData &in_ptLocators, LONG in_nbPointLocatorsIndices, const LONG *in_pPointLocatorsIndices, LONG *out_pIndices) const
CStatus  GetNormalizedUVArray (const PointLocatorData &in_ptLocators, LONG in_nbPointLocatorsIndices, const LONG *in_pPointLocatorsIndices, float *out_pNormalizedUVs) const
PointLocatorData  ConstructPointLocators (LONG in_nbPointLocators, const LONG *in_pSubSurfaceIndices, const float *in_pNormalizedUVs) const

Constructor & Destructor Documentation

Default constructor.

Default destructor.

NurbsSurfaceMesh ( const CRef in_ref )

Constructor.

Parameters:
in_ref constant reference object.
NurbsSurfaceMesh ( const NurbsSurfaceMesh in_obj )

Copy constructor.

Parameters:
in_obj constant class object.
NurbsSurfaceMesh ( const Geometry in_obj )

Copy constructor.

Parameters:
in_obj Geometry object.

Member Function Documentation

bool IsA ( siClassID  in_ClassID ) const [virtual]

Returns true if a given class type is compatible with this API class.

Parameters:
in_ClassID class type.
Returns:
true if the class is compatible, false otherwise.

Reimplemented from Geometry.

siClassID GetClassID ( ) const [virtual]

Returns the type of the API class.

Returns:
The class type.

Reimplemented from Geometry.

NurbsSurfaceMesh& operator= ( const NurbsSurfaceMesh in_obj )

Creates an object from another object. The newly created object is set to empty if the input object is not compatible.

Parameters:
in_obj constant class object.
Returns:
The new NurbsCurveList object.
NurbsSurfaceMesh& operator= ( const Geometry in_geom )

Creates a Polygon object from a Geometry object. The newly created object is set to empty if the input Geometry object is not compatible.

Parameters:
in_geom constant class object.
Returns:
The new NurbsCurveList object.

Reimplemented from Geometry.

NurbsSurfaceMesh& operator= ( const CRef in_ref )

Creates an object from a reference object. The newly created object is set to empty if the input reference object is not compatible.

Parameters:
in_ref constant class object.
Returns:
The new NurbsCurveList object.

Reimplemented from Geometry.

CNurbsSurfaceRefArray GetSurfaces ( ) const

Returns an array of all NurbsSurface objects on this NurbsSurfaceMesh object.

Returns:
A NurbsSurface array.
CStatus GetClosestSurfacePosition ( MATH::CVector3 in_vPosition,
LONG &  out_lSurfaceIndex,
double &  out_dSquaredDistance,
double &  out_dUValue,
double &  out_dVValue,
MATH::CVector3 out_vPosition 
) const

Returns the surface index, position of the point on it, UV values and distance from the given position.

Parameters:
in_vPosition A position expressed in the NurbsSurfaceMesh object frame of reference.
Return values:
out_lSurfaceIndex The surface index to which the position is the closest.
out_dSquaredDistance The distance of the input position to the curve point.
out_dUValue The corresponding UValue on the NurbsSurface.
out_dVValue The corresponding VValue on the NurbsSurface.
out_vPosition The actual curve point position at U value.
Returns:
CStatus::OK success
CStatus::Fail other failure
CStatus Get ( siNurbsFormat  in_siNurbsFormat,
CNurbsSurfaceDataArray out_surfaces 
) const

Returns a complete data description of a nurbs surface mesh.

Parameters:
in_siNurbsFormat Specifies how the data is formatted.
Return values:
out_surfaces The data description of all surfaces.
Returns:
CStatus::OK success
CStatus::Fail other failure
CStatus Set ( const CNurbsSurfaceDataArray in_surfaces,
siNurbsFormat  in_siNurbsFormat = siSINurbs 
)

Sets from a complete data description of the nurbs surface mesh. This is only available from compiled operators. For non-compiled operators this property can only be set if the object has been frozen.

Note:
If you use this function on an object with clusters and you change the topology the burden of updating the clusters is on the user.
Parameters:
in_surfaces NurbsSurfaces data description.
in_siNurbsFormat Specifies how the data is formatted.
Returns:
CStatus::OK success
CStatus::AccessDenied function used outside of a plug-in operator context.
CStatus AddSurfaceWithTrim ( const CNurbsSurfaceData in_surface,
const CTrimCurveDataArray in_trims,
siNurbsFormat  in_siNurbsFormat,
NurbsSurface out_Surface 
)

Adds a trimmed surface to the mesh.

Parameters:
in_surface The surface descriptsion
in_trims The trims data that will apply to this surface.
in_siNurbsFormat The format of representation for the nurbs data.
Return values:
out_Surface The newly created surface.
Returns:
CStatus::OK success
CStatus::AccessDenied function used outside of a plug-in operator context.
CStatus AddSurface ( const CNurbsSurfaceData in_surface,
siNurbsFormat  in_siNurbsFormat,
NurbsSurface out_Surface 
)

Adds a surface to the mesh.

Parameters:
in_surface The surface description
in_siNurbsFormat The format of representation for the nurbs data.
Return values:
out_Surface The newly created surface.
Returns:
CStatus::OK success
CStatus::AccessDenied function used outside of a plug-in operator context.
CStatus GetSubSurfaceIndexArray ( const PointLocatorData in_ptLocators,
LONG  in_nbPointLocatorsIndices,
const LONG *  in_pPointLocatorsIndices,
LONG *  out_pIndices 
) const

Returns the subsurface indices on which point locators are defined. Notice that this information is part of the NURBS surface mesh point locator's definition, and depends on the topology only (won't change if the geometry is deformed).

The normalized UV parameters within the subsurface can be queried with NurbsSurfaceMesh::GetNormalizedUVArray.

Parameters:
in_ptLocators Contains the point locations to be queried.
in_nbPointLocatorsIndices Number of point locators to be queried (-1 if all)
in_pPointLocatorsIndices Point locator indices to be queried (not used if in_nbPointLocatorsIndices is -1)
Return values:
out_pIndices Returned subsurface indices. Size must be in_ptLocators.GetCount() if in_nbPointLocatorsIndices is -1, in_nbPointLocatorsIndices otherwise.
Returns:
CStatus::OK success
CStatus::Fail failure
See also:
NurbsSurfaceMesh::GetNormalizedUVArray, NurbsSurfaceMesh::ConstructPointLocators
Since:
5.0
Example:
This example topologically describes the point locators resulting from the shrink-wrapping of a cube onto a NURBS surface sphere.
                using namespace XSI;
                Application app;
                Model root = app.GetActiveSceneRoot();

                X3DObject meshCubeObj;
                root.AddGeometry( L"Cube", L"MeshSurface", L"", meshCubeObj );
                PolygonMesh meshCubeGeom( meshCubeObj.GetActivePrimitive().GetGeometry() );

                X3DObject NURBSSphereObj;
                root.AddGeometry( L"Sphere", L"NurbsSurface", L"", NURBSSphereObj );
                NurbsSurfaceMesh NURBSSphereGeom( NURBSSphereObj.GetActivePrimitive().GetGeometry() );

                MATH::CVector3Array posArray = meshCubeGeom.GetPoints().GetPositionArray();
                PointLocatorData cubeOnSpherePointLocators = NURBSSphereGeom.GetClosestLocations(posArray.GetCount(), (double*)&posArray[0]);

                LONG i;
                for(i = 0; i < cubeOnSpherePointLocators.GetCount(); i++)
                {
                        LONG subsurface;
                        NURBSSphereGeom.GetSubSurfaceIndexArray(
                                                        cubeOnSpherePointLocators,
                                                        1, &i, &subsurface);
                        float UVs[2];
                        NURBSSphereGeom.GetNormalizedUVArray(
                                                        cubeOnSpherePointLocators,
                                                        1, &i, UVs);
                        app.LogMessage(L"Point locator " + CString(CValue(i)) + L" is on subsurface " + CString(CValue(subsurface)) +
                                                        L" at {U = " + CString(CValue(UVs[0])) + L" , V = " + CString(CValue(UVs[1])) + L"}.");
                }
                //Expected results:
                //INFO : Point locator 0 is on subsurface 0 at {U = 1.35528e-016 , V = 0.30423}.
                //INFO : Point locator 1 is on subsurface 0 at {U = 0.75 , V = 0.304065}.
                //INFO : Point locator 2 is on subsurface 0 at {U = 2.45219e-017 , V = 0.695454}.
                //etc.
CStatus GetNormalizedUVArray ( const PointLocatorData in_ptLocators,
LONG  in_nbPointLocatorsIndices,
const LONG *  in_pPointLocatorsIndices,
float *  out_pNormalizedUVs 
) const

Returns the normalized UV surface parameters defining point locators. Notice that this information is part of NURBS surface mesh point locator's definition, and depends on the topology only (won't change if the geometry is deformed).

The subsurface index on which the normalized UVs apply can be queried with NurbsSurfaceMesh::GetSubSurfaceIndexArray.

Parameters:
in_ptLocators Contains the point locations to be queried.
in_nbPointLocatorsIndices Number of point locators to be queried (-1 if all)
in_pPointLocatorsIndices Point locator indices to be queried (not used if in_nbPointLocatorsIndices is -1)
Return values:
out_pNormalizedUVs Returned UV normalized values. Size must be 2*in_ptLocators.GetCount() if in_nbPointLocatorsIndices is -1, 2*in_nbPointLocatorsIndices otherwise.
Returns:
CStatus::OK success
CStatus::Fail failure
See also:
NurbsSurfaceMesh::GetSubSurfaceIndexArray, NurbsSurfaceMesh::ConstructPointLocators
Since:
5.0
Example:
Another example using this function can be found in NurbsSurfaceMesh::GetSubSurfaceIndexArray method's description.
Example:
This example creates point locators at random surface locations, and positions a Null at each of these point locators.
                using namespace XSI;

                void CreateNullsAtPointLocations( X3DObject& inObj, const PointLocatorData& inPointLocators )
                {
                        Geometry geom( inObj.GetActivePrimitive().GetGeometry() );

                        std::vector<double> posData, normData;
                        posData.resize(inPointLocators.GetCount()*3);
                        normData.resize(inPointLocators.GetCount()*3);

                        geom.EvaluatePositions(inPointLocators, -1, 0, &posData.front());
                        geom.EvaluateNormals(inPointLocators, siInterpolatedVertexGeometricNormals, -1, 0, &normData.front());

                        MATH::CVector3 trans;
                        MATH::CRotation rot;

                        LONG i;
                        for (i = 0; i < (LONG)posData.size(); i+=3)
                        {
                                Null nullObj;
                                inObj.AddNull(L"",nullObj);

                                trans.Set(posData[i], posData[i+1], posData[i+2]);
                                nullObj.PutLocalTranslation(trans);

                                trans.Set(normData[i], normData[i+1], normData[i+2]);
                                rot.SetFromXYZAxes( trans, trans, trans );
                                nullObj.PutLocalRotation(rot);
                        }
                }

                float GetNormalizedRandom(){return float(rand())/RAND_MAX;}

                LONG RandInRange(LONG in_bound)
                {
                        float fRand = GetNormalizedRandom()*0.99999f;
                        return (LONG)(in_bound*fRand);
                }

                void main()
                {
                        Application app;
                        Model root = app.GetActiveSceneRoot();

                        X3DObject NURBSSphereObj;
                        root.AddGeometry( L"Sphere", L"NurbsSurface", L"", NURBSSphereObj );
                        NurbsSurfaceMesh NURBSSphereGeom( NURBSSphereObj.GetActivePrimitive().GetGeometry() );

                        LONG nbPtLocators = 50;

                        std::vector<LONG> subSurfaceIndexArray;
                        std::vector<float> normalizedUVArray;

                        subSurfaceIndexArray.resize(nbPtLocators);
                        normalizedUVArray.resize(nbPtLocators*2);

                        LONG i;
                        for(i = 0; i < nbPtLocators; i++)
                        {
                                subSurfaceIndexArray[i] = 0;
                                normalizedUVArray[i*2] = NormalizedRand();
                                normalizedUVArray[i*2+1] = NormalizedRand();
                        }
                        PointLocatorData randomPointLocators = NURBSSphereGeom.ConstructPointLocators(nbPtLocators, &subSurfaceIndexArray.front(), &normalizedUVArray.front());

                        CreateNullsAtPointLocations(NURBSSphereObj, randomPointLocators);
                }
PointLocatorData ConstructPointLocators ( LONG  in_nbPointLocators,
const LONG *  in_pSubSurfaceIndices,
const float *  in_pNormalizedUVs 
) const

Builds a PointLocatorData from NurbsSurfaceMesh-specific topological information. Subsurface indices and normalized UV surface parameters are required in order to define each point locator. The UV array should contain two values for each specified subsurface index.

Notice that the returned point locators can be evaluated on any NurbsSurfaceMesh instance having the same topology.

Parameters:
in_nbPointLocators Number of points locators to be constructed
in_pSubSurfaceIndices Subsurface indices (size must be in_nbPoints)
in_pNormalizedUVs Normalized UV coordinates on the subsurface (size must be in_nbPoints*2)
Returns:
A new PointLocatorData object (.IsValid() == false if failed)
See also:
NurbsSurfaceMesh::GetNormalizedUVArray, NurbsSurfaceMesh::GetSubSurfaceIndexArray, Geometry::GetSurfacePointLocatorsFromPoints, PolygonMesh::ConstructPointLocators
Since:
5.0

The documentation for this class was generated from the following file: