谈谈对AE的几个“偏僻”接口的认识---IPropertySupport,IClone,IPesistStream
2012-09-22 21:19 ArcScofield 阅读(1261) 评论(0) 编辑 收藏 举报概要:简介IPropertySupport,IClone,IPesistStream接口的用途以及具体应用的实例代码;
导航:
这三个接口均来自于ESRI.ArcGIS.esriSystem类库(class library),该类库是arcgis架构中得最底层得类库,用于支撑其他类库的操作;
用于设置“对象”的默认属性,该“对象”可以是点,线元素(marker element ,line elment)等Graphic element;
在Arcgis Engine 10中,实现(implement)该接口有Symbol对象,Element对象等,具体可以参考Arcgis Engine 10 帮助文档;
下面以,MapSurroundFrame对象为例,设置(应用)MapSurroundFrame的Border属性:
1 Object oldObject = null;//原对象 2 IPropertySupport propertySupport = m_MapSurroundFrame as IPropertySupport;//QI至IPropertySupport 3 IBorder border = this.frameDecorationControl.FrameProperties.Border;//获取border对象,frameDecorationControl是窗体中得一个自定义控件 4 if (null != border) 5 { 6 if (propertySupport.CanApply(border))//检查是否能设置(应用)该属性 7 { 8 oldObject = propertySupport.Apply(border);//设置(应用)mapsurroundframe对象的border属性 9 } 10 }
注:使用这个接口的时候,发现MapSurroundFrame对象并不是所有的属性都能设置,MapSurroundFrame对象只能设置(应用)
Border,Background ,Shadow 属性,至于Geometry(需接口转换),Mapsurround属性不能设置,propertySupport.
CanApply(mapsurround)始终返回的是false;初步判断,arcgis内部实现该接口时,并没有考虑设置其Geometry,Mapsurround等属性;
如果真是这样的话,这个接口对于MapSurroundFrame对象的使用价值已经不大,除非扩展该接口;
测试的图片:
选择,一个Border样式:
单击,应用:
用于控制对象的复制,该接口感觉有点像.NET中得ICloneable接口,其实,还是很不一样得;
1)Clone()
想必大家,Clone()方法用得最多,此方法用于深度复制一个对象,无需参数;
1 ISymbol m_oldSymbol = (ISymbol)((IClone)m_oldSymbol).Clone();
2)Assign(IClone src)
着重讲讲Assign 方法,需要传入一个对象,用于将该对象的所有属性赋值给另外一个对象,不同于clone()方法,clone方法不需要传入一个参数
例如:
将一个srcMapSurround 的对象的属性值赋值给 m_MapSurroundFrame对象
1 IMapSurroundFrame srcMapSurround = new MapSurroundFrameClass();//模板对象,可以设置其属性,此处略 2 IClone srcObject = srcMapSurround as IClone;//QI至IClone 3 4 IClone recieveObject = m_MapSurroundFrame as IClone;//QI至IClone,m_MapSurroundFrame-“接收”对象 5 recieveObject.Assign(srcObject);
3)IsEqual和IsIdentical
IsEqual和IsIdentical有较大差别,前者用于判断对象的属性值是否相等,如果你需要判断AE中的二个对象的属性值是否值相等(value equaltiy),
你无需才去写相关判断值相等的方法,AE大部分的对象都实现IClone接口,QI至IClone使用该方法就行了;后者判断对象的引用是否相同(reference equality);
用于控制对象的序列化和反序列化;该接口为.NET的一个接口;
实例:
序列化和反序列化symbol对象
1 public static void ReadSymbolStream(ISymbol symbol) 2 { 3 //stream 4 IMemoryBlobStream2 blobStream = new MemoryBlobStreamClass(); 5 blobStream.LoadFromFile(EnvironmentValue.DefaultSymbolPath); 6 IObjectStream objStream = new ObjectStreamClass(); 7 objStream.Stream = blobStream; 8 //反序列化 9 IPersistStream persistStream = symbol as IPersistStream; 10 persistStream.Load(objStream); 11 } 12 13 public static void WriteSymbolStream(ISymbol symbol) 14 { 15 IMemoryBlobStream2 blobStream = new MemoryBlobStreamClass(); 16 IObjectStream objStream = new ObjectStreamClass(); 17 objStream.Stream = blobStream; 18 //序列化 19 IPersistStream persistStream = symbol as IPersistStream; 20 persistStream.Save(objStream,1); 21 blobStream.SaveToFile(EnvironmentValue.DefaultSymbolPath); 22 }
注:EnvironmentValue.DefaultSymbolPath为序列化的路径,例如:"d:\DefaultSymbol.blb"
上面代码涉及了,AE中得Stream Object对象,具体可以参看arcgis engine 10帮助文档
参考:
Arcgis Enigne 对象模型图