Hi
I am trying to Apply Location query on Query to Filter Data in .NET
Anyone please provide the sample code or procedure to program
Dayalan
I am not sure for what you want. You can use Predicate delegate (with Invoke method) for your custom query inside the loop. Or you can use LINQ with where condition.
-Khoa
Hi all,
I am using AutoCAD Map3d Enterprise 2012.
We have "Query to Filter data" out-of-box functionality. In this i want to apply "Location" query filter using .net programming
Some one please help me...
Regards
Dayalan
Here is an example that should get you going. I believe that I have posted something similiar on the Map3d forum a few years back. You may have better luck there.
public void getbasemap() { Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = HostApplicationServices.WorkingDatabase; ProjectModel prjModel = HostMapApplicationServices.Application.ActiveProject; string current_projection = prjModel.Projection; ProjectOptions prjOptions = prjModel.Options; DrawingSet drawingset = prjModel.DrawingSet; MapApplication mapApi = HostMapApplicationServices.Application; //Yes, we need to use an alias Aliases aliases = mapApi.Aliases; string The_Keymap_alias = "FinalPathToKeymapDWG"; //Go get the file name string The_Keymap = Get_(ref CWDS, "FinalPathToKeymapDWG"); //Remove Alias try { aliases.RemoveAlias(The_Keymap_alias); } catch (MapException) { doc.Editor.WriteMessage("\nFailed to remove alias ... probably OK."); } //Add Alias try { aliases.AddAlias(The_Keymap_alias, The_Keymap); } catch (MapException) { doc.Editor.WriteMessage("\nFailed to add alias. NOT good."); } drawingset.AttachDrawing(The_Keymap_alias); //Get the current query and set the mode draw/preview... QueryModel qryModel = prjModel.CurQuery; qryModel.Mode = Autodesk.Gis.Map.Constants.QueryType.QueryDraw; qryModel.Clear(); // The root query object QueryBranch qb_root = QueryBranch.Create(); // By location condition // No need for window locationtype here I want the entire drawing LocationCondition locationcondition = new LocationCondition(); locationcondition.LocationType = Autodesk.Gis.Map.Constants.LocationType.LocationCrossing; locationcondition.Boundary = AllBoundary.Create(); // Make a branch QueryBranch qblocation = QueryBranch.Create(); qblocation.AppendOperand(locationcondition); // append it to the root qb_root.AppendOperand(qblocation); // By Properties condition PropertyCondition propertycondition = new PropertyCondition(); propertycondition.JoinOperator = Autodesk.Gis.Map.Constants.JoinOperator.OperatorAnd; propertycondition.PropertyType = Autodesk.Gis.Map.Constants.PropertyType.Layer; propertycondition.ConditionOperator = Autodesk.Gis.Map.Constants.ConditionOperator.ConditionEqual; //Go get the list of layers string The_KeymapLayers = Get_(ref CWDS, "KeymapLayers"); propertycondition.Value = The_KeymapLayers; // Make a branch QueryBranch qbproperties = QueryBranch.Create(); qbproperties.AppendOperand(propertycondition); // append it to the root qb_root.AppendOperand(qbproperties); // Construct it qryModel.Define(qb_root); // Execute it ObjectIdCollection queried_keymap_objs_collection = qryModel.Execute(drawingset); // some local cleanup qb_root.Clear(); qblocation.Clear(); qbproperties.Clear(); qryModel.Clear(); locationcondition.Dispose(); // // Now we wish to see everything so that we can construct the Viewports for the small // viewport the contains the "whole" drawing. // AcadApplication pApp; pApp = (Autodesk.AutoCAD.Interop.AcadApplication)Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication; pApp.ZoomExtents(); // // These globals are used for/by the Viewports // KEYMAP_EXTENTS_MAX = db.Extmax; KEYMAP_EXTENTS_MIN = db.Extmin; KEYMAP_EXTENTS_center = new Point2d((KEYMAP_EXTENTS_MAX.X + KEYMAP_EXTENTS_MIN.X) / 2, (KEYMAP_EXTENTS_MAX.Y + KEYMAP_EXTENTS_MIN.Y) / 2); drawingset.DetachDrawing(The_Keymap_alias); }
r,
dennis
Thanks for reply. I am able to create my own Query to filte data using Location on map option in C#.net. But The below last refresh option is not working.
I could see the applied query in Create query form. but it is not refreshed on map.
Any one please help me.
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;
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.NeedsRefresh();
layer1.ForceRefresh();
Please, be a good citizen and use the correct forum. The Map3d Developer and the OSGeo Mapguide forums. I am very sure these folks would appreciate it. I know I will.
r,
dennis
Can't find what you're looking for? Ask the community or share your knowledge.