[MSCE U14 C#]如何删除文档中的参数化单元定义?

我用DgnComponentDefinitionModelHandler的CreateCellDefinition方法定义了一个参数化单元,后面更新了库文件,然后想重新定义,需要删除现有定义,没有找到相关接口,DgnComponentDefinitionModelHandler有个更新定义的函数,但调用后没有效果,请问如何将现有参数化定义删除呢,或者有元其他可以更新定义的方法?

Parents
  • 如果当前dgn文件里边没有放置此参数单元定义相关的实例单元元素,则可以直接压缩一下文件然后重新连接去放置就可以。如果已经放置了,现在想Update一下当前dgn文件中单元的定义的话,需要通过反射调用一下程序集中一个internal的方法,详情请参考如下代码:

    private static DgnComponentDefinitionModelHandler LocateCellModelHandler(string name)
            {
                var opts = CellLibraryOptions.Include3d | CellLibraryOptions.IncludeAllLibraries | CellLibraryOptions.IncludeParametric;
                var libs = new CellLibraryCollection(opts);
                DgnModel cellModel = null;
                foreach (var lib in libs)
                {
                    if (name.Equals(lib.Name))
                    {
                        StatusInt status;
                        cellModel = lib.File.LoadRootModelById(out status, lib.File.FindModelIdByName(lib.Name), true, false, true);
                        break;
                    }
                }
    
                var hdlr = null != cellModel ? DgnComponentDefinitionHandler.GetForModel(cellModel) : null;
                return null != hdlr ? hdlr.DefinitionModelHandler : null;
            }
            public static void UpdateCellDef()
            {
                string cellName = "Double Door Cabinet";
                ParametricCellDefinitionElement cellDef = ParametricCellDefinitionElement.FindByName("Double Door Cabinet", Session.Instance.GetActiveDgnFile());
                if (null == cellDef)
                    return;
                var hdlr = LocateCellModelHandler(cellName);
                Type type = typeof(UpdateCellVm);
                ConstructorInfo[] conInfoArr = type.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic);
                if (0 == conInfoArr.Length)
                    return;
                object[] objArr = new object[2] { cellDef,hdlr  };
                object obj = conInfoArr[0].Invoke(objArr);
                MethodInfo oMethod = type.GetMethod("DoUpdate", BindingFlags.Instance | BindingFlags.NonPublic);
                oMethod.Invoke(obj, new Object[] { });
            }
    

    Answer Verified By: lingwei liu 

  • Type type = typeof(UpdateCellVm);这句中的UpdateCellVm报错啊,需要引入哪个命名空间?

  • 能否让我远程看一下?可以将TeamViewer的ID,密码发送到我的邮箱:hongqiang.guo@bentley.com

  • 我刚试了下,用MS自己的界面去操作,也有同样的问题,比如先放置一个参数化单元,然后用将这个单元及库都删掉,然后加载另一个修改过的参数化单元库(同名.cel文件),然后放置参数化单元,发现放置的还是第一次的模型。感觉一个.cel的参数化单元库只要加载一次,后面无论怎么删和更新,都没有效果。

  • 我上边的代码是针对Mstn自带的一个单元库C:\ProgramData\Bentley\MicroStation CONNECT Edition\Configuration\WorkSpaces\Example\WorkSets\MetroStation\DGN\Parametric Models\Double Door Cabinet.dgn中的Double Door Cabinet单元的,您可以创建一个新的dgn文件,然后连接这个单元库,放一个Double Door Cabinet单元,保存后,打开单元库,随便修改一下图形,例如模型中添加一个圆,然后保存,再回到新建的dgn文件里边运行程序就看到效果了。而您自己创建的单元库跟这里的情况唯一不同的地方就是单元库文件(*.cel文件)的路径是否在Mstn的配置变量(MS_DGNLIB)所指的路径下。如果在这个配置变量指定的路径下直接用上边的代码改一下单元名字即可,如果没有的话就需要自己指定路径然后打开外部文件读取单元所在的Model了。

  • 我用您给的例子试了下,确实没有问题。我的参数化模型比较复杂,是用Revit创建的族,里面不仅有参数,还有ItemType,是不是太复杂就会有问题

  • 刚又做了仔细的测试,确实是Revit族的问题,我将族中的ItemType删除后,一切正常。您提供的PCM.View.UpdateCellVm方案和DgnComponentDefinitionModelHandler.UpdateCellDefinition()都没有问题,亲测通过。非常感谢!

Reply Children
No Data