add custom properties to all desired model items

By Xiaodong Liang

As we know, currently only COM API supports adding. The two posts introduce in detail:

http://adndevblog.typepad.com/aec/2012/05/create-attributes-and-properties-for-model-objects-using-net-api.html

http://adndevblog.typepad.com/aec/2012/08/addmodifyremove-custom-attribute-using-com-api.html

We got a question recently. In one workflow, the program asks the user to select one item, and adds some custom properties to the model item. It works well. But the developer wants to add the properties to the child items of the selected item as well. However it looks the adding method does not care about such scenario.

After investigating, the only way I can think of is to get the child items and add the properties again. The below code demos the steps:

private void addProToAllItems()    {        //get state object of COM API        ComApi.InwOpState3 oState = ComBridge.State;             // get the current selection        ModelItemCollection oCurrentMC =             Autodesk.Navisworks.Api.Application.ActiveDocument.            CurrentSelection.SelectedItems;             // add property to the selected paths        foreach (ModelItem oEachSelectedItem in oCurrentMC)        {            //convert the .NET collection to COM object            ComApi.InwOaPath oPath =                ComBridge.ToInwOaPath(oEachSelectedItem);                 // get properties collection of the path            ComApi.InwGUIPropertyNode2 propn =                (ComApi.InwGUIPropertyNode2)oState.GetGUIPropertyNode(oPath, true);                 // create new property category            // (new tab in the properties dialog)            ComApi.InwOaPropertyVec newPvec =                (ComApi.InwOaPropertyVec)oState.ObjectFactory(                ComApi.nwEObjectType.eObjectType_nwOaPropertyVec, null, null);            // create new property            ComApi.InwOaProperty newP =                (ComApi.InwOaProperty)oState.ObjectFactory(                ComApi.nwEObjectType.eObjectType_nwOaProperty, null, null);                 // set the name, us
ername and value of the new property            newP.name = "demo_Property_Name";            newP.UserName = "demo_Property_UserName";            newP.value = "demo_Property_Value";                 // add the new property to the new property category            newPvec.Properties().Add(newP);                 // add the new property category to the path            propn.SetUserDefined(0, "MyAttribute_InternalName",                                "MyAttribute", newPvec);                 // add the attribute to all child items                  // check if oEachItem.Children is empty             if (oEachSelectedItem.Children.Count() > 0)            {                //*********                // add attribute to all child items                foreach (ModelItem oEachChild in oEachSelectedItem.Children)                {                    //check if each child node is within the current selection                    // we will ignore this item because we've added already                    if (!oCurrentMC.Contains(oEachChild))                    {                        // convert the child node to a path e.g.                        ComApi.InwOaPath oAdditionalPath =                            ComBridge.ToInwOaPath(oEachChild);                             // get properties collection of the path                        ComApi.InwGUIPropertyNode2 propn2 =                            (ComApi.InwGUIPropertyNode2)oState.GetGUIPropertyNode(                                                    oAdditionalPath, true);                             // add the new property category to the path                        propn2.SetUserDefined(0, "MyAttribute_InternalName",       &
#160;                                    "MyAttribute", newPvec);                    }                }                          //**********                //or add the attribute to the specific child item                // e.g. the first 'geometry' node                if (oEachSelectedItem.HasGeometry)                {                    ModelItem oFirstGeoItem = oEachSelectedItem.FindFirstGeometry().Item;                    //check if each child node is within the current selection                    // we will ignore this item because we've added already                    if (!oCurrentMC.Contains(oFirstGeoItem))                    {                        // convert the child node to a path e.g.                        ComApi.InwOaPath oAdditionalPath =                            ComBridge.ToInwOaPath(oFirstGeoItem);                             // get properties collection of the path                        ComApi.InwGUIPropertyNode2 propn3 =                            (ComApi.InwGUIPropertyNode2)oState.GetGUIPropertyNode(                                                    oAdditionalPath, true);                             // add the new property category to the path                        propn3.SetUserDefined(0, "MyAttribute_InternalName",                                            "MyAttribute", newPvec);                    }                     }                // ......                  }        }    }

Comments

One response to “add custom properties to all desired model items”

  1. Hi
    I have problem to use this code in Naviesworks 2015 .NET API
    when I’m using it, I face 4 Errors on casting InwOaPropertyVec.
    I takes a picture from error: http://i57.tinypic.com/f2bo1.jpg
    tnx for help before you checking it :)

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading