ThinkGeo.com    |     Documentation    |     Premium Support

Problem with ThemeItem Selection

Dear Yale


As per Sample made in C Sharp for Map suite explorer, I have created ThemeItem and ThemeView Control in vb.net. I think there is something missing in code, so the event on check box change and selection of theme item not fire. Pleas help.


Private Sub SetupThemeItem(ByVal layer As Layer)Dim themeItem As New ThemeItem()

themeItem.ShapeName = layer.Name

AddHandler themeItem.ItemCheckedChanged, AddressOf themeItem_ItemCheckedChanged

AddHandler themeItem.ItemLinkClicked, AddressOf themeItem_ItemLinkClicked

AddHandler themeItem.ThemeItemClick, AddressOf themeItem_ThemeItemClick

AddHandler themeItem.ThemeItemRightClick, AddressOf themeItem_ThemeItemRightClickEnd Sub


Private Sub themeItem_ItemCheckedChanged(ByVal sender As Object, ByVal e As ShapeEventArgs)If DirectCast(winformsMap1.Overlays(0), LayerOverlay).Layers.Contains(e.ShapeName) Then

winformsMap1.Overlays(0).Lock.EnterWriteLock()

Try

DirectCast(winformsMap1.Overlays(0), LayerOverlay).Layers(e.ShapeName).IsVisible = e.IsShow

Finally

winformsMap1.Overlays(0).Lock.ExitWriteLock()

End Try 

 Try

DrawImage()

Catch

End Try

End If

End Sub

But the ThemeItem_ItemCheckedChanged Event not fire. Or Please can you provide Map Suite Explorer Sample copy in Vb.net


Regrards

Sanjay 


 


 


 



 ThemeView.Items.Add(layer.Name, themeItem)


 End Sub



Sanjay,


Thanks for your posts and questions.
 
I am sorry to say that it is very hard to provide the VB sample for Map Suite Explorer for now as the project is somehow huge, is it possible to provide me your sample to recreate this issue, I reviewed the code above and I did not find any problem with it.
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Yale, 
  
 I have attached my sample with ticket no 3370. Please review my code and correct is if any, so that I will able to check / uncheck the layer and selct that layer for movement up/down 
 Regards 
 Sanjay

Sanjay, 
  
 I have replied to you via the ticket, please check. 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Yale, 
  
 I have Tab FeatureLayer, it shows data. I have done thematic color or this layer. So, I before implementing thematic color, I want to make copy of FeatureLayer. So the thematic color can apply on copy of FeatureLayer, and original not be disturbed.  
 How to made a clone of FeatureLayer. 
  
 Regards 
 Sanjay

Sanjay, 
  
 Thanks for your post and questions. 
  
 We need to consider using the serialization/deserialization for the feature layer, while I am sorry to say that for now not all feature layer can be serialized, following posts shows how to serialize the shape file feature layer, pls take a look if you are intested. 
 gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/8134/afv/topic/Default.aspx 
  
 Any more questions please feel free to let me know. 
  
 Thanks. 
  
 Yale 


Yale, 
 I don’t want to save layer permanently into my disk. I just want to make copy of feature layer for a session. 
  
 Regards 
 Sanjay

Sanjay, 
  
 You can save all features to a InMemoryFeatureLayer, about how to add feature you can look at HowDoI samples->AddFeaturesFromAFeatureLayer sample. 
  
 Thanks, 
  
 James

James, 
  
 I think you didn’t understand properly. I am not trying to copy a feature, although I am trying to copy a TabFileFeatureLayer, which will be treated as different object. 
  
 If any thing more you want to clear please let me know. 
  
 Regards 
 Sanjay

Sanjay,


Thanks for your post and feedbacks.
 
If you want to keep this copy in memory or session, why not try to save those properties used to construct the feature layer instead, for example, try to keep the pathFileName, idColumnName, featureSchemaName instead of keeping the TabFeatureLayer, and then try to create a new TabFeatureLayer using these properties when needed. What is your opinion?
 
Any more questions please feel free to let me know.
 
Thanks.
 
Yale

Yale, 
  
 You mean to say to create a new TabFeatureLayer with different name, whenever required, with help of already loaded tab file. It could be one solution. 
  
 Actually where I required a copy of TabFeatureLayer, that is different form. Initially when TabFutureLayer created that process is wriiten on Main form. Also I have to find the file name from a colletion of Tab File. Is the copy facility not availalable in API? 
  
 What is cloneDeep?  
 It is working with Layer, but not with FeatureLayer? 
  
 Regards 
 Sanjay 


Sanjay, 
  
 CloneDeep rely on serializable, however TabFeatureLayer didn’t support serializable so that you couldn’t use CloneDeep to copy it. 
  
 I have updated the FdoExtension and make the TabFeatureLayer support it, please get the latest version 4.5.143.0 tommorrow and have a try. 
  
 Thanks, 
  
 James

James, 

 


After download from customer portal, how I use this update. Please guide me.




In updated version, which property will be use. Please brief them. 

Regards 

Sanjay



Sanjay,


As your mention by using CloneDeep API:


                TabFileFeatureLayer layer = new TabFileFeatureLayer(@"..\..\SampleData\Data\HoustonMuniBdySamp_Boundary.TAB", "FID", "OGRSchema", "HoustonMuniBdySamp_Boundary", "GEOMETRY");
                layer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.CreateSimpleAreaStyle(GeoColor.FromArgb(100, GeoColor.SimpleColors.Green), GeoColor.SimpleColors.Green);
                layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

                TabFileFeatureLayer copiedLayer = layer.CloneDeep() as TabFileFeatureLayer;

James



James, 
  
 How to update DLL file. 
  
 Regards

Sanjay, 
  
 You can find the old FdoExtension.dll on your disk, delete it and copy the new FdoExtension.dll to the same folder, or you can change the reference of your application and point to the new FdoExtension.dll. 
  
 Thanks, 
  
 James

James, 



I have changed the FdoExtentio.dll (4.5.0.144 and 4.5.144.0 both Tested), but I am getting error like 



Type 'MapSuiteFdoExtension.GeoFdoFeatureSource' in Assembly 'MapSuiteFdoExtension, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable. 



Actually my proceess of copy like this, 



Dim Layer As FeatureLayer = winformsMap1.FindFeatureLayer(drpTable.Text.Trim)

 'drpTable.Text contains the name of TabFeatureLayer 

dim copiedLayer As TabFileFeatureLayer = TryCast(Layer.CloneDeep(), TabFileFeatureLayer)


its generates error, also I have tried like below but same result



Dim


 


 t As TabFileFeatureLayer = TryCast(Layer, TabFileFeatureLayer)

Dim copiedLayer As TabFileFeatureLayer = t.CloneDeep

Regards 

Sanjay


 



Sanjay,


You may find the wrong layer which type is not TabFileFeatureLayer, because I did following test, it works properly.


            Dim layer As New TabFileFeatureLayer()

            Dim copiedLayer As TabFileFeatureLayer = TryCast(layer.CloneDeep(), TabFileFeatureLayer)


Thanks,


James



James,


You are right. I am also not getting error when I have created a new TabFeatureLayer and try to use CloneDeep API in the same module.


Please try to like this.


On page load


Dim worldLayer As New TabFileFeatureLayer("D:\Desktop Working\New Folder\upw vector\vector.tab", Nothing)worldLayer.Name = "Vector"

Dim customLineStyle As Style = New AreaStyle(New GeoPen(GeoColor.SimpleColors.Black, 1))

Dim customAreaStyle As Style = New LineStyle(New GeoPen(GeoColor.SimpleColors.Black, 1))

Dim customPointStyle As Style = New PointStyle(PointSymbolType.Star, New GeoSolidBrush(GeoColor.SimpleColors.LightGreen), 10)

worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(customAreaStyle)worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(customPointStyle)worldLayer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(customLineStyle)worldLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20

Dim staticOverlay As New LayerOverlay()

staticOverlay.Layers.Add("WorldLayer", worldLayer)

WinformsMap1.Overlays.Add(staticOverlay)

Process.GetCurrentProcess().ProcessorAffinity = CType(1, System.IntPtr)

worldLayer.Open()

WinformsMap1.CurrentExtent = worldLayer.GetBoundingBox

worldLayer.Close()

WinformsMap1.Refresh()


 


Now click on copy button and try to use following code:



Dim


 Layer As FeatureLayer = WinformsMap1.FindFeatureLayer("WorldLayer")

Layer.Close()

Dim copiedLayer As TabFileFeatureLayer = TryCast(Layer.CloneDeep(), TabFileFeatureLayer)

We can not careate a new TabFeatureLayer (as you shown) for copy purpose, beacuse TabFeatureLayer is already created. We have to find the FeatureLayer to create copy, I tried with above code. If anything wrong with code please let me know. In other way you can try to make copy with WinForms1.FindFeatureLayer


Thanks


Sanjay 

 



WinformsMap1.MapUnit = GeographyUnit.DecimalDegree

WinformsMap1.BackgroundOverlay.BackgroundBrush = New GeoSolidBrush(GeoColor.SimpleColors.Transparent)


Now Create a Button to copy above created TabFileFeatureLayer:

I have Created Like below:

Dim Layer As FeatureLayer = WinformsMap1.FindFeatureLayer("WorldLayer")

Layer.Close()

Dim copiedLayer As TabFileFeatureLayer = TryCast(Layer.CloneDeep(), TabFileFeatureLayer)WinformsMap1.CurrentExtent =New RectangleShape(-90, 45, 90, -45)

 



Sanjay, 
  
 I tested your code and I can recreate your problem, I think you need to CloneDeep TabFileFeatureLayer before calling TabFileFeatureLayer.Open(), otherwise it will throw exception, the reason is that when you call open method, it will load some unmanaged source which can’t be serialize. 
  
 Sorry for inconvenice. 
  
 James