Add a part to an assembly

Top  Previous  Next

...or more properly how to add an occurrence of a part to an assembly. Here you go, and you specify the 3d position and optionally the 3d angles too...


HRESULT AddPartToAssemblyAtPosition (CComPtr<AssemblyComponentDefinition>& pAsmCompDef,

                                     const CString& kcsFullPathPartName,

                                     const double kxPos,

                                     const double kyPos,

                                     const double kzPos,

                                     CComPtr<ComponentOccurrence>& pPartOcc,

                                     CComQIPtr<PartComponentDefinition>& pPartCompDef,

                                     const double kxRotDegs /*=0.0*/,

                                     const double kyRotDegs /*=0.0*/,

                                     const double kzRotDegs /*=0.0*/) 


The positions are in the natural units of Inventor, usually cm

We return the occurence and its part component definition



    pPartOcc = nullptr ; 


    CComPtr<ComponentOccurrences> pOccurrencesList = nullptr;

    HRESULT hRes = pAsmCompDef->get_Occurrences (&pOccurrencesList) ;

    if (FAILED(hRes)) {

        return ReturnAndShowCOMError (hRes,L"AddPartToAssemblyAtPosition get_Occurrences failed") ;



    CComPtr<TransientGeometry> pTransGeom = GetTransGeomPtr () ;    

    CComPtr<Matrix> pPosMatrix;



    CComPtr<Vector> pVector; // Create a Vector to modify the Matrix



    // Make the matrix a "move to point" matrix...

    pPosMatrix->SetTranslation (pVector,VARIANT_TRUE) ;


    CComPtr<Matrix> pPosRotMatrix ;



    CComPtr<Vector> pZAxis ;

    hRes = pTransGeom->CreateVector (0,0,1,&pZAxis);

    if (FAILED(hRes)) {

        ShowCOMError (hRes,L"Could not create z axis vector") ;

        return false ;



    CComPtr<Point> pOrigin ;

    hRes = pTransGeom->CreatePoint (0,0,0,&pOrigin);

    const double kZRadsRot = RadsFromDegs(kzRotDegs);

    pPosRotMatrix->SetToRotation (kZRadsRot,pZAxis,pOrigin) ;




    hRes = pOccurrencesList->Add (CComBSTR(kcsFullPathPartName),pPosRotMatrix,&pPartOcc) ;

    if (FAILED(hRes)) {

        return ReturnAndShowCOMError (hRes,L"AddPartToAssemblyAtPosition Add failed") ;



    // Get the general component definition...

    CComQIPtr<ComponentDefinition> pCompDef ;

    hRes = pPartOcc->get_Definition (&pCompDef) ;

    if (FAILED(hRes)) {

        return ReturnAndShowCOMError (hRes,L"AddPartToAssemblyAtPosition could not get definition.") ;



    // Cast from the general sort of component definition to the specific PART component definition

    pPartCompDef = CComQIPtr<PartComponentDefinition>(pCompDef);

    if (pPartCompDef == nullptr) {

        gLogger.Printf (ekErrMsg,L"AddPartToAssemblyAtPosition could not cast to pPartCompDef.") ;

        return E_FAIL ;



    return S_OK ;




Text, images and diagrams © 2021 Owen F. Ransen. All rights reserved. (But copy the source code as much as you want!)