代码改变世界

谈谈对AE的几个“偏僻”接口的认识---IPropertySupport,IClone,IPesistStream

2012-09-22 21:19  ArcScofield  阅读(1261)  评论(0编辑  收藏  举报

概要:简介IPropertySupport,IClone,IPesistStream接口的用途以及具体应用的实例代码;

 

导航:  

 


 

这三个接口均来自于ESRI.ArcGIS.esriSystem类库(class library),该类库是arcgis架构中得最底层得类库,用于支撑其他类库的操作;

1.IPropertySupport

用于设置“对象”的默认属性,该“对象”可以是点,线元素(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样式:

 

单击,应用:

 

 

 

2.IClone

用于控制对象的复制,该接口感觉有点像.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);

 

 

3.IPesistStream

用于控制对象的序列化和反序列化;该接口为.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帮助文档

 

参考:

Arcobject SDK for ArcGIS 10

Arcgis Enigne 对象模型图