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();