CustomTables in Sheets and Drawings

Top  Previous  Next

This example C++ code shows how to create a custom table in an IDW Inventor drawing:

 

void CreateExampleTable (CComPtr<Sheet>& pSheet)

{

    wchar_t* ColNames[128] = {L"Column One",L"Column Two",L"Column Three"};

 

    // These contents are after the title row and the header row

    const int ikNumCols = 3 ; 

    const int ikNumRows = 5 ;  // 7 with header and column titles

 

    SAFEARRAY* pstrColumns = CreateSafeStringArray(ikNumCols, ColNames);

 

    CComPtr<CustomTables> pCustomTables  ;

    pSheet->get_CustomTables (&pCustomTables) ;

 

    // This is top left of the table. Sheet origin is bottom left.

    // In Europe this coordinate system is usually cm in a sheet

    CComPtr<Point2d> ptTable; // Create a 2d point

    GetTransGeomPtr()->CreatePoint2d(10.0,10.0,&ptTable);   

 

    CComVariant varEmpty ;   

    CComPtr<CustomTable> pCustomTable  ;

    pCustomTables->Add (CComBSTR(L"HOLES"),ptTable,ikNumCols,ikNumRows,&pstrColumns,

                        varEmpty, // the contents will be added later

                        varEmpty, // use the default widths

                        varEmpty, // use the default heights

                        varEmpty, // no more info

                        &pCustomTable) ; // table returned

 

    /*

     * Here we add contents by using put_Value in every cell

     */

    for (UINT iRow = 1 ; iRow <= ikNumRows ; iRow++) { 

        // Get the row where we want to add data...

        CComPtr<Row> pRow  ;

        pCustomTable->Rows->get_Item (long(iRow),&pRow) ;

 

        for (UINT iCol = 1 ; iCol <= ikNumCols ; iCol++) {

            // Get the column of the row where we want to add data...

            CComPtr<Cell> pCell  ;

            pRow->get_Item (CComVariant(iCol),&pCell) ;

 

            // Demo example text...

            wchar_t szCellContents[_MAX_PATH] ;

            swprintf_s (szCellContents,L"R%d C%d",iRow,iCol) ;

 

            // Put the data in the cell...

            pCell->put_Value (CComBSTR (szCellContents)) ;

        }

    }

 

    SafeArrayDestroy (pstrColumns) ;

}

 

The resulting table looks like this:

 

Custom-Tables-in-IDW-Files

 

The code does not include error checking, which you should add in your own versions.

 

If you want to specify column widths you need to pass in a VARIANT which is an array of doubles, see WidthsVariant below:

 

    VARIANT WidthsVariant ;

    double ColWidths[5] = {2.5,3.5,4.5,6.5,2.5} ;

    CreateDoubleVariantArray (WidthsVariant,ColWidths,5) ;

 

    CComVariant varEmpty ;   

    CComPtr<CustomTable> pCustomTable  ;

    HRESULT hRes = pCustomTables->Add (CComBSTR(L"Special Data"),

                                       ptTable,

                                       ikNumCols,ikNumRows,&pstrColumns,

                                       varEmpty, // the contents will be added later

                                       WidthsVariant, // widths of columns

                                       varEmpty, // use the default heights

                                       varEmpty, // no more info

                                       &pCustomTable) ; // table returned

 

 

 

 

Positioning objects in a Sheet.

 

 

 

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