# How-to: Combine multiple models with different unit

**URL:** <https://forum.techsoft3d.com/t/how-to-combine-multiple-models-with-different-unit/2633>\
**Category:** HOOPS Exchange\
**Tags:** code, knowledge-base, how-to\
**Created:** [September 8, 2023, 2:20am UTC](https://forum.techsoft3d.com/t/how-to-combine-multiple-models-with-different-unit/2633 "2023-09-08T02:20:34Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![rie](https://avatars.discourse-cdn.com/v4/letter/r/a6a055/32.png) [@rie](https://forum.techsoft3d.com/u/rie)\
**Post date:** [September 8, 2023, 2:20am UTC](https://forum.techsoft3d.com/t/how-to-combine-multiple-models-with-different-unit/2633/1 "2023-09-08T02:20:34Z")

</div>

To combine multiple models which are defined in different unit to a prc file, you can create a product occurrence with scale for [A3DAsmProductOccurrenceData::m\_pLocation](https://docs.techsoft3d.com/hoops/exchange/api/c/structures/A3DAsmProductOccurrenceData.html#c.A3DAsmProductOccurrenceData.m_pLocation), to display the model in the same unit.

```auto
// specify input file
A3DImport sImport1(acSrcFileName1); // model in millimeter
A3DImport sImport2(acSrcFileName2); // model in meter

// specify output file
A3DExport sExport(acDstFileName);

A3DStatus iRet;
A3DAsmModelFileData sModelFileData;

// import #1
iRet = sHoopsExchangeLoader.Import(sImport1);

A3D_INITIALIZE_DATA(A3DAsmModelFileData, sModelFileData);
iRet = A3DAsmModelFileGet(sHoopsExchangeLoader.m_psModelFile, &sModelFileData);

// create instances
A3DAsmProductOccurrence* pInstance1ProductOccurrence = NULL;

A3DAsmProductOccurrenceData sProductOccurrenceData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sProductOccurrenceData);
sProductOccurrenceData.m_ppPOccurrences = sModelFileData.m_ppPOccurrences;
sProductOccurrenceData.m_uiPOccurrencesSize = sModelFileData.m_uiPOccurrencesSize;
A3DAsmProductOccurrenceCreate(&sProductOccurrenceData, &pInstance1ProductOccurrence);

// import #2
iRet = sHoopsExchangeLoader.Import(sImport2);
iRet = A3DAsmModelFileGet(sHoopsExchangeLoader.m_psModelFile, &sModelFileData);

sProductOccurrenceData.m_ppPOccurrences = sModelFileData.m_ppPOccurrences;
sProductOccurrenceData.m_uiPOccurrencesSize = sModelFileData.m_uiPOccurrencesSize;

A3DAsmProductOccurrence* pInstance2ProductOccurrence = NULL;

// Set scale for second model : meter to millimeter 
A3DMiscCartesianTransformationData sTransformationData;
A3D_INITIALIZE_DATA(A3DMiscCartesianTransformationData, sTransformationData);
sTransformationData.m_sOrigin.m_dX = 0.;
sTransformationData.m_sOrigin.m_dY = 0.;
sTransformationData.m_sOrigin.m_dZ = 0.;
sTransformationData.m_sXVector.m_dX = 1.;
sTransformationData.m_sXVector.m_dY = 0.;
sTransformationData.m_sXVector.m_dZ = 0.;
sTransformationData.m_sYVector.m_dX = 0.;
sTransformationData.m_sYVector.m_dY = 1.;
sTransformationData.m_sYVector.m_dZ = 0.;
sTransformationData.m_sScale.m_dX = 1000.;
sTransformationData.m_sScale.m_dY = 1000.;
sTransformationData.m_sScale.m_dZ = 1000.;
A3DMiscCartesianTransformationCreate(&sTransformationData, &sProductOccurrenceData.m_pLocation);

iRet = A3DAsmProductOccurrenceCreate(&sProductOccurrenceData, &pInstance2ProductOccurrence);

// create root product occurrence
A3DAsmProductOccurrence* pRootProductOccurrence = NULL;
A3DAsmProductOccurrenceData sRootProductOccurrenceData;
A3D_INITIALIZE_DATA(A3DAsmProductOccurrenceData, sRootProductOccurrenceData);
sRootProductOccurrenceData.m_uiPOccurrencesSize = 2;
sRootProductOccurrenceData.m_ppPOccurrences = (A3DAsmProductOccurrence**)
malloc(sRootProductOccurrenceData.m_uiPOccurrencesSize * A3DUns32(sizeof(A3DAsmProductOccurrence*)));

sRootProductOccurrenceData.m_ppPOccurrences[0] = pInstance1ProductOccurrence;
sRootProductOccurrenceData.m_ppPOccurrences[1] = pInstance2ProductOccurrence;

iRet = A3DAsmProductOccurrenceCreate(&sRootProductOccurrenceData, &pRootProductOccurrence);
free(sRootProductOccurrenceData.m_ppPOccurrences);

// creating a ModelFile
A3DAsmModelFile* pModelFile;
A3DAsmModelFileData sData;
A3D_INITIALIZE_DATA(A3DAsmModelFileData, sData);
sData.m_uiPOccurrencesSize = 1;
sData.m_ppPOccurrences =
		(A3DAsmProductOccurrence**)malloc(sData.m_uiPOccurrencesSize * A3DUns32(sizeof(A3DAsmProductOccurrence*)));
sData.m_ppPOccurrences[0] = pRootProductOccurrence;
sData.m_bUnitFromCAD = true;
sData.m_dUnit = 1.; // millimeters
iRet = A3DAsmModelFileCreate(&sData, &pModelFile);

sHoopsExchangeLoader.m_psModelFile = pModelFile;
iRet = sHoopsExchangeLoader.Export(sExport);

```
