AutoCAD Map 3D Developer
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page
Set FDO layer filter
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
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.LayerDefiniti
objLayer.ForceRefresh()
Next
Regards
Matteo Conte
Re: Set FDO layer filter
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Have you ever refered to the QueryAndLocate and FeatureInspector sample in Map 3D SDK?
Daniel Du
Developer Technical Services
Autodesk Developer Network
Re: Set FDO layer filter
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
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
Re: Set FDO layer filter
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
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();
}
