c# NavisWorks ModelItem isReadOnly() 始终为真

Posted

技术标签:

【中文标题】c# NavisWorks ModelItem isReadOnly() 始终为真【英文标题】:c# NavisWorks ModelItem isReadOnly() always true 【发布时间】:2021-06-16 04:48:39 【问题描述】:

我尝试在现有类别中为选定的 NavisWorks ModelItem`s 添加一些新属性

网络上的例子不多,它基于相同的 COM 方法。 但是有特殊的方法可以在 API 中添加可用的属性。 唯一的问题是对象被锁定。 有什么方法可以解锁吗?

    using ANA = Autodesk.Navisworks.Api;
...
    private void addProperty(string category, string prop, string value)
    
        var oDoc = Autodesk.Navisworks.Api.Application.ActiveDocument;
        ModelItemCollection selectionModelItems = new ModelItemCollection();
        ANA.Application.ActiveDocument.CurrentSelection.SelectedItems.CopyTo(selectionModelItems);
        //Clear the current selection
        ANA.Application.ActiveDocument.CurrentSelection.Clear();
        try
        
            foreach (ModelItem m in selectionModelItems)
            
                foreach (PropertyCategory p in m.PropertyCategories)
                
                    if (p.DisplayName != category) continue;
                    var property = new DataProperty(prop, prop, new VariantData(value));
                    p.Properties.Add(property);
                
            
        
        catch (Exception ex)
        
            MessageBox.Show(ex.Message);
        
    

执行结果:

【问题讨论】:

【参考方案1】:

由 Navisworks 创建的属性和类别是只读的。 您不能添加或修改由 Navisworks 创建的属性或类别。

您只能使用 COM 创建或添加用户定义的属性。 见:

https://adndevblog.typepad.com/aec/2012/05/create-attributes-and-properties-for-model-objects-using-net-api.html https://adndevblog.typepad.com/aec/2012/08/addmodifyremove-custom-attribute-using-com-api.html https://forums.autodesk.com/t5/navisworks-api/navisworks-api-add-user-data-tab/td-p/2916866

这是一个代码 sn-p(从上面提到的 xiaodong.liang 论坛帖子复制),它显示了如何使用 COM 添加用户定义的属性:

private void addProperty() 

  ComApi.InwOpState10 state;

  state = ComApiBridge.ComApiBridge.State;

  ModelItemCollection modelItemCollectionIn = new ModelItemCollection(Autodesk.Navisworks.Api.Application.ActiveDocument.CurrentSelection.SelectedItems);

  ComApi.InwOpSelection comSelectionOut =

    ComApiBridge.ComApiBridge.ToInwOpSelection(modelItemCollectionIn);

  ComApi.InwSelectionPathsColl oPaths = comSelectionOut.Paths();

  ComApi.InwOaPath3 oPath = (ComApi.InwOaPath3) oPaths.Last();

  ComApi.InwGUIPropertyNode2 propn = (ComApi.InwGUIPropertyNode2) state.GetGUIPropertyNode(oPath, true);

  ComApi.InwOaPropertyVec newPvec = (ComApi.InwOaPropertyVec) state.ObjectFactory(Autodesk.Navisworks.Api.Interop.ComApi.nwEObjectType.eObjectType_nwOaPropertyVec, null, null);

  ComApi.InwOaProperty newP = (ComApi.InwOaProperty) state.ObjectFactory(Autodesk.Navisworks.Api.Interop.ComApi.nwEObjectType.eObjectType_nwOaProperty, null, null);

  newP.name = "LXD_Property_Name";

  newP.UserName = "LXD_Property_UserName";

  newP.value = "LXD_Property_Value";

  newPvec.Properties().Add(newP);

  propn.SetUserDefined(0, "LXD_PropertyTab_Name", "LXD_PropertyTab_InteralName", newPvec);


【讨论】:

例如 iConstruct 插件锁定应用程序,并使用任何属性做任何事情。所以它绝对有可能以某种方式。如果没有办法使用它,为什么我们有这个方法?有点不合逻辑。

以上是关于c# NavisWorks ModelItem isReadOnly() 始终为真的主要内容,如果未能解决你的问题,请参考以下文章

做.net二次开发的高手留步!!我想用C#做一个Navisworks Manage 的插件

Navisworks问题

text 将纹理应用于modelItem

javascript 将纹理应用于modelItem

navisworks实际开始实际结束怎么改为不适用?

Forge ARKit - Navisworks 到 Unity