Skip to main content
Version: v5.0

createCollections

The createCollections script creates search indexes for the collections and then upload the type map.

createIndex#

const createIndex = async () => {  //gets the composite collection for the project's BIM model  let compositeCollection = await IafScriptEngine.getCompositeCollection(    {      query: {        _userType: "bim_model_version",        _namespaces: {          $in: ctx._namespaces,        },        _itemClass: "NamedCompositeItem",      },    },    ctx,    { getLatestVersion: true }  );  console.log(    "Started createIndex.",    "Create index ==== getCompositeCollection.",    compositeCollection  );
  // gets the rvt_type_elements collection from the composite collection  let _userItemId = compositeCollection._userItemId;  let collectionInComposite = await IafScriptEngine.getCollectionInComposite(    _userItemId,    { _userType: "rvt_type_elements" },    ctx  );  console.log(    "Create index ==== getCollectionInComposite.",    collectionInComposite  );
  // Revit  let indexRes = await IafScriptEngine.createOrRecreateIndex(    {      // model type elememt colletcion      _id: collectionInComposite._userItemId,      indexDefs: [        {          key: { "Element Category": 1 },          options: {            name: "model_els_coll_id",            default_language: "english",          },        },      ],    },    ctx  );  console.log(    "Completed createIndex.",    "Create index ==== Create Or Recreate Index Index response.",    indexRes  );};

addTypeMap#

The type map is used later in the process to map the Revit types to the model elements.

Type map file selection#

The type map file selection code differs for a one-click orchestrator setup and a VS code extension setup:

Orchestrator file selection#

The script downloads the scripts directory:

const typeMapFile = "TypeMap.xlsx";//extracts the zip link for the scripts folder from the passed parametersconst { zipLink } = params.actualParams;//imports DataXlsx to extract spreadsheet dataconst { DataXlsx } = CoreUtils;//placeholder for processed spreadsheet datalet xlsxFile;
//downloads the project setup zip fileconst response = await fetch(zipLink);//uses response.unZippedFilePath for the directory pathconst directoryPath = response.unZippedFilePath;//constructs the path to the scripts folderconst filePath = `${directoryPath}/scripts`;

With the scripts folder downloaded, the readFilesRecursively function reads the content of each script in the folder and its subfolders to find the type map file:

await readFilesRecursively(filePath);
async function readFilesRecursively(dir) {  //uses fs.readdirSync to read the directory's contents  const files = await fs.readdirSync(dir);  for (const file of files) {    const filePath = `${dir}/${file}`;    //if the item does not have a file extension,     //it is a folder and the readFilesRecursively     //function is recursively called to read its files    if (!file.includes(".")) {      await readFilesRecursively(filePath); // Await the recursive call    } else {      try {        //if the file name equals TypeMap.xlsx        if (typeMapFile === file) {          //read the file synchronously and assign it to the variable xlsxFile          fileData = await fs.readFileSync(filePath);          xlsxFile = fileData;        }      } catch (error) {        null;      }    }  }}

VS code type map file selection#

The script requests that the user selects a type map spreadsheet file:

  async uploadTypeMap(input, libraries, ctx) {    const { PlatformApi, UiUtils, IafScriptEngine } = libraries        const proj = await PlatformApi.IafProj.getCurrent(ctx)
        const xlsxFiles = await UiUtils.IafLocalFile.selectFiles({ multiple: false, accept: ".xlsx" })

The script uses IafDataPlugin.readXLSXFiles from UiUtils to read the spreadsheet, then uses IafDataPlugin.workbookToJSON to transform the data to JSON data, which it then parses as objects using IafDataPlugin.parseGridData:

    const typeWorkbook = await UiUtils.IafDataPlugin.readXLSXFiles(xlsxFiles)        const wbJSON = UiUtils.IafDataPlugin.workbookToJSON(typeWorkbook[0])        const iaf_dt_grid_data = wbJSON.Sheet1        const iaf_dt_grid_as_objects = UiUtils.IafDataPlugin.parseGridData({ gridData: iaf_dt_grid_data })

Creating the type map collection#

The script creates a NamedUserCollection for the type map objects:

        const atm_defs_coll = await IafScriptEngine.createOrRecreateCollection(            {                _name: 'Type Map Def Collection',                _shortName: 'typemap_defs',                _namespaces: proj._namespaces,                _description: 'Revit Element Type Map Collection',                _userType: 'iaf_ref_type_map_defs_coll'            },       ctx    )

Finally, the parsed JSON objects are added to the Item Service and related to the type map collection:

        const atm_defs_items_res = await IafScriptEngine.createItemsBulk({            _userItemId: atm_defs_coll._userItemId,            _namespaces: ctx._namespaces,            items: iaf_dt_grid_as_objects        }, ctx)
        return atm_defs_items_res  }