共享单元创建


Mstn中的共享单元(Shared Cell)是一种特殊的单元,大量使用共享单元可以显著节省Dgn文件的占用空间,这是因为其特殊的工作机制。我们在使用普通单元时,每创建一个单元,除了一个单元头元素以外,其包含的子元素也都会分别创建一份出来。而共享单元在创建时,会先在当前Dgn文件中创建一份不可见的共享单元定义元素,这个定义元素包含了所有子元素。而创建的共享单元其实只是一个头元素,其保存了对共享单元定义元素的引用。后台在使用共享单元时,会获取到其引用的定义元素,进而从定义元素上获取子元素。所以并不会像普通单元那样,每创建一份共享单元元素,其包含的子元素也都分别创建一份。我们在通过代码创建共享单元时,也要先创建出共享单元的定义元素,然后再去创建共享单元,最后指定共享单元引用的定义元素即可。如下代码演示了这一过程:

            double uorPerMe = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;
            DEllipse3d elli = new DEllipse3d(DPoint3d.Zero, new DVector3d(uorPerMe, 0, 0), new DVector3d(0, uorPerMe, 0));
            ArcElement arcEle = new ArcElement(Session.Instance.GetActiveDgnModel(), null, elli);
            string cellName = "MySharedCell";
            SharedCellDefinitionElement sharedCellDef = new SharedCellDefinitionElement(Session.Instance.GetActiveDgnModel(), cellName);
            sharedCellDef.AddChildElement(arcEle);
            sharedCellDef.AddChildComplete();
            sharedCellDef.AddToModel();
            DPoint3d origin = new DPoint3d(0, 0, 0);
            DPoint3d scale = new DPoint3d(1, 1, 1);
            DMatrix3d rotation = DMatrix3d.Identity;
            SharedCellElement sharedCellEle = new SharedCellElement(Session.Instance.GetActiveDgnModel(), null, cellName, origin, rotation, scale);
            sharedCellEle.SetDefinitionId(sharedCellDef.ElementId);
            TransformInfo tranInfo = new TransformInfo(DTransform3d.Identity);
            sharedCellEle.ApplyTransform(tranInfo);
            sharedCellEle.AddToModel();