How-to: Rotate a CAD model along an axis

To rotate a whole model along an axis, it is needed to edit its root PO transformation (ie the corresponding A3DAsmProductOccurrenceData::m_pLocation) accordingly.
Below are some examples of code implementation:

enum Axis { X, Y, Z };  // 3D Axis

// Set-up a X rotation matrix
void SetXRotation(const A3DDouble radianAngle, A3DDouble *p4x4Matrix)
{
	p4x4Matrix[0] = 1.0;	p4x4Matrix[4] = 0.0;			p4x4Matrix[8] = 0.0;			p4x4Matrix[12] = 0.0;
	p4x4Matrix[1] = 0.0;	p4x4Matrix[5] = cos(radianAngle);	p4x4Matrix[9] = -sin(radianAngle);	p4x4Matrix[13] = 0.0;
	p4x4Matrix[2] = 0.0;	p4x4Matrix[6] = sin(radianAngle);	p4x4Matrix[10] = cos(radianAngle);	p4x4Matrix[14] = 0.0;
	p4x4Matrix[3] = 0.0;	p4x4Matrix[7] = 0.0;			p4x4Matrix[11] = 0.0;			p4x4Matrix[15] = 0.0;
}

// Set-up a Y rotation matrix
void SetYRotation(const A3DDouble radianAngle, A3DDouble *p4x4Matrix)
{
	p4x4Matrix[0] = cos(radianAngle);	p4x4Matrix[4] = 0.0;	p4x4Matrix[8] = sin(radianAngle);	p4x4Matrix[12] = 0.0;
	p4x4Matrix[1] = 0.0;			p4x4Matrix[5] = 1.0;	p4x4Matrix[9] = 0.0;			p4x4Matrix[13] = 0.0;
	p4x4Matrix[2] = -sin(radianAngle);	p4x4Matrix[6] = 0.0;	p4x4Matrix[10] = cos(radianAngle);	p4x4Matrix[14] = 0.0;
	p4x4Matrix[3] = 0.0;			p4x4Matrix[7] = 0.0;	p4x4Matrix[11] = 0.0;			p4x4Matrix[15] = 0.0;
}

// Set-up a Z rotation matrix
void SetZRotation(const A3DDouble radianAngle, A3DDouble *p4x4Matrix)
{
	p4x4Matrix[0] = cos(radianAngle);	p4x4Matrix[4] = -sin(radianAngle);	p4x4Matrix[8] = 0.0;	p4x4Matrix[12] = 0.0;
	p4x4Matrix[1] = sin(radianAngle);	p4x4Matrix[5] = cos(radianAngle);	p4x4Matrix[9] = 0.0;	p4x4Matrix[13] = 0.0;
	p4x4Matrix[2] = 0.0;			p4x4Matrix[6] = 0.0;			p4x4Matrix[10] = 1.0;	p4x4Matrix[14] = 0.0;
	p4x4Matrix[3] = 0.0;			p4x4Matrix[7] = 0.0;			p4x4Matrix[11] = 0.0;	p4x4Matrix[15] = 0.0;
}

// Function that apply a rotation to a modelFilea long an axis.
void applyRotationToModelFile(A3DAsmModelFile *pModelFile, A3DDouble rotationDegreeAngle, Axis rotationAxis)
{
	A3DAsmModelFileData modelData;
	A3D_INITIALIZE_DATA(A3DAsmModelFileData, modelData);
	A3DAsmModelFileGet(pModelFile, &modelData);

	A3DAsmProductOccurrenceData rootPoData;
	A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, rootPoData);
	A3DAsmProductOccurrenceGet(modelData.m_ppPOccurrences[0], &rootPoData);

	A3DMiscGeneralTransformationData transfoData;
	A3D_INITIALIZE_DATA(A3DMiscGeneralTransformationData, transfoData);

	// We initialize an identity matrix
	transfoData.m_adCoeff[0] = 1.0;	transfoData.m_adCoeff[4] = 0.0;	transfoData.m_adCoeff[8] = 0.0;		transfoData.m_adCoeff[12] = 0.0;
	transfoData.m_adCoeff[1] = 0.0;	transfoData.m_adCoeff[5] = 1.0;	transfoData.m_adCoeff[9] = 0.0;		transfoData.m_adCoeff[13] = 0.0;
	transfoData.m_adCoeff[2] = 0.0;	transfoData.m_adCoeff[6] = 0.0;	transfoData.m_adCoeff[10] = 1.0;	transfoData.m_adCoeff[14] = 0.0;
	transfoData.m_adCoeff[3] = 0.0;	transfoData.m_adCoeff[7] = 0.0;	transfoData.m_adCoeff[11] = 0.0;	transfoData.m_adCoeff[15] = 0.0;

	// We apply the rotation to the model
	A3DDouble radianAngle = rotationDegreeAngle * M_PI / 180;

	if (rotationAxis == X)
		SetXRotation(radianAngle, transfoData.m_adCoeff);

	if (rotationAxis == Y)
		SetYRotation(radianAngle, transfoData.m_adCoeff);

	if (rotationAxis == Z)
		SetZRotation(radianAngle, transfoData.m_adCoeff);

	A3DMiscGeneralTransformation *pGeneralTransfo = nullptr;
	A3DMiscGeneralTransformationCreate(&transfoData, &pGeneralTransfo);

	rootPoData.m_pLocation = pGeneralTransfo;
        
        // We finally edit the root PO
	A3DAsmProductOccurrenceEdit(&rootPoData, modelData.m_ppPOccurrences[0]);
}