AutoCAD Map 3D Developer
Welcome to Autodesk’s AutoCAD Map 3D Developer Forums. Share your knowledge, ask questions, and explore popular AutoCAD Map 3D Developer topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Set FDO layer filter

4 REPLIES 4
Reply
Message 1 of 5
ced_abitat
958 Views, 4 Replies

Set FDO layer filter

Hi all,

   I need to set a fillter for all fdo layer in a map (as Query to filter data command).

To do this I wrote this code but the filter is not set. If I manualy run the "Query to filter data" command
If you launch the "Query to filter data" command manually  on a layer i find the filter set, and is applied only if I press the Ok or Apply button.I think that in my code is missing an instruction to apply the filter set.
Can you help me?

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

4 REPLIES 4
Message 2 of 5
Daniel.Du
in reply to: ced_abitat

Have you ever refered to the QueryAndLocate  and FeatureInspector sample in Map 3D SDK? 



Daniel Du
Developer Technical Services
Autodesk Developer Network

Message 3 of 5
Partha.Sarkar
in reply to: ced_abitat

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,

 



Partha Sarkar
Developer Technical Services
Autodesk Developer Network

Message 4 of 5
dr5156
in reply to: Partha.Sarkar

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

}

Regards,
Dayalan
Message 5 of 5
a.hajihasani
in reply to: ced_abitat

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.

Post to forums  

Autodesk Design & Make Report

”Boost