Hi all,
I need to set a fillter for all fdo layer in a map (as Query to filter data command).
Dim objLayers As MgLayerCollection = objMap.GetLayers()
For Each objLayer As MgLayerBase In objLayers
Dim objLayerDefId As MgResourceIdentifier = objLayer.GetLayerDefinition()
Dim objByteReader As MgByteReader = objResourceServ.GetResourceContent(objLayerDefId)
Dim objXML As XmlDocument = New XmlDocument()
Dim objSerializer As New XmlSerializer(GetType(LayerDefinition))
Dim objLayerV As LayerDefinition = TryCast(objSerializer.Deserialize(New StringReader(objByteReader.ToString)), LayerDefinition)
Dim objVectorLayerDef As VectorLayerDefinitionType = TryCast(objLayerV.Item, VectorLayerDefinitionType)
objVectorLayerDef.Filter = strFilter
Dim objXs As New XmlSerializer(objLayerV.[GetType]())
Dim objWriter As New StringWriter()
objXs.Serialize(objWriter, objLayerV)
Dim objBuffer As Byte() = StringToBytes(objWriter.ToString())
Dim objSource As New MgByteSource(objBuffer, objBuffer.Length)
' Update the resource in Map
objResourceServ.SetResource(objLayer.LayerDefinition, objSource.GetReader(), Nothing)
objLayer.ForceRefresh()
Next
Regards
Matteo Conte
Have you ever refered to the QueryAndLocate and FeatureInspector sample in Map 3D SDK?
Matteo had contacted DevTech / ADN team on this issue and I worked with him to resolve this; It's now resolved.
Once you update the XML LayerDefinition, you need to update the resource in Map and then call the layer.ForceRefresh(). Here is the relevant code snippet :
// Update the resource in Map
ResourceService.SetResource(layer.LayerDefinition, source.GetReader(), null);
// layer.ForceRefresh();
layer.ForceRefresh();
Thanks,
i am having same issue. but your solution is not working for me. could you please review my below code
//Select Entity on Map
Editor acEditor = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
SelectionSetss = GetAcSelectionSetSingleGeom(acEditor);
ObjectIdCollection objIdColle = newObjectIdCollection(ss.GetObjectIds());
MgSelectionBase mgSe = AcMapFeatureEntityService.GetSelection(ss);
AcMapMap acMap = AcMapMap.GetCurrentMap();
MgLayerCollectionmgLayColl = acMap.GetLayers();
MgLayerBase parcelsLayer1 = mgLayColl.GetItem("EL_ADMIN_AREA");
stringfcName1 = parcelsLayer1.GetFeatureClassName();
intII = mgSe.GetSelectedFeaturesCount(parcelsLayer1, fcName1);
MgFeatureReader featureReader = mgSe.GetSelectedFeatures(parcelsLayer1, parcelsLayer1.FeatureClassName, true);
MgFeatureService fs = AcMapServiceFactory.GetService(MgServiceType.FeatureService) asMgFeatureService;
if(featureReader.ReadNext())
{
stringgeometryName = parcelsLayer1.GetFeatureGeometryName();
MgByteReadergeometryData = featureReader.GetGeometry(geometryName);
MgAgfReaderWriter agfReaderWriter = newMgAgfReaderWriter();
MgGeometrygeometry = agfReaderWriter.Read(geometryData);
MgPolygon mgPoly = geometry asMgPolygon;
MgWktReaderWriter wktReaderWriter = newMgWktReaderWriter();
stringwkt = wktReaderWriter.Write(mgPoly);
wkt = wkt.Replace(
"POLYGON", "POLYGON XYZ ");
wkt = wkt.Replace(
",", " 0,");
wkt = wkt.Replace(
"))", " 0))");
string filter = "GEOM INSIDE GeomFromText('" + wkt + "')";
AcMapLayer layer1 = mgLayColl.GetItem("EL_CONDUCTOR") asAcMapLayer;
MgResourceIdentifierlayerDefId = layer1.GetLayerDefinition();
MgResourceService rs = AcMapServiceFactory.GetService(MgServiceType.ResourceService) asMgResourceService;
MgByteReaderlayerReader = rs.GetResourceContent(layerDefId);
XmlDocument objXML = newXmlDocument();
XmlSerializer objSerializer = newXmlSerializer(typeof(LayerDefinition));
LayerDefinition objLayerDef = objSerializer.Deserialize(newStringReader(layerReader.ToString())) asLayerDefinition;
VectorLayerDefinitionType objVectorLayerDef = objLayerDef.Item asVectorLayerDefinitionType;
objVectorLayerDef.Filter = filter;
using (StringWriter objWriter = newStringWriter())
{
XmlSerializer objXs = newXmlSerializer(typeof(LayerDefinition));
objXs.Serialize(objWriter, objLayerDef);
byte[] unicodeBytes = Encoding.Unicode.GetBytes(objWriter.ToString());
byte[] utf8Bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, unicodeBytes);
MgByteSource objSource = newMgByteSource(utf8Bytes, utf8Bytes.Length);
rs.SetResource(layer1.LayerDefinition, objSource.GetReader(),
null);
layer1.ForceRefresh();
//layer1.NeedsRefresh();
}
}
if (featureReader != null)
featureReader.Close();
}
Hi. I read the post and followed the steps, but I get the following error: Invalid argument(s): The layer definition Xml is invalid. Here is my code:
[CommandMethod("MyTestCommand" ,CommandFlags.Transparent|CommandFlags.Modal)] public void MyTestCommand() { MgResourceService objResourceServ = (MgResourceService)AcMapServiceFactory.GetService(MgServiceType.ResourceService); MgLayerBase objLayer = AcMapMap.GetCurrentMap().GetLayers()[0]; MgResourceIdentifier objLayerDefId = objLayer.GetLayerDefinition(); MgByteReader objByteReader = objResourceServ.GetResourceContent(objLayerDefId); XmlDocument objXML = new XmlDocument(); XmlSerializer objSerializer = new XmlSerializer(typeof(OSGeo.MapGuide.Schema.LayerDefinition.LayerDefinition)); OSGeo.MapGuide.Schema.LayerDefinition.LayerDefinition objLayerV = (OSGeo.MapGuide.Schema.LayerDefinition.LayerDefinition)objSerializer.Deserialize(new StringReader(objByteReader.ToString())); OSGeo.MapGuide.Schema.LayerDefinition.VectorLayerDefinitionType objVectorLayerDef = (OSGeo.MapGuide.Schema.LayerDefinition.VectorLayerDefinitionType)objLayerV.Item; objVectorLayerDef.Filter = "Geometry INTERSECTS GeomFromText('POLYGON ((135450.170691914 176714.481673732, 136292.021019111 176121.027356537, 135961.299875354 175651.879698467, 135119.449548157 176245.334015662, 135450.170691914 176714.481673732))') "; XmlSerializer objXs = new XmlSerializer(objLayerV.GetType()); StringWriter objWriter = new StringWriter(); objXs.Serialize(objWriter, objLayerV); //byte[] objBuffer = Encoding.Unicode.GetBytes(objWriter.ToString()); byte[] objBuffer = new byte[objWriter.ToString().Length * sizeof(char)]; System.Buffer.BlockCopy(objWriter.ToString().ToCharArray(), 0, objBuffer, 0, objBuffer.Length); MgByteSource objSource = new MgByteSource(objBuffer, objBuffer.Length); objResourceServ.SetResource(objLayer.LayerDefinition, objSource.GetReader(), null); objLayer.ForceRefresh(); }
Can anyone help me on this issue? I'll appreciate that greatly.
Can't find what you're looking for? Ask the community or share your knowledge.