Hi All
I am trying to create a graphic element with code and then to get the element by the name.
Code example below.
The FindElement does not find anything.
Open the element in Pro show that the name is still the default.
In all the samples of FindElement it looks by default names (Point, Point 1, etc).
Is it a bug??
Thanks
Mody
QueuedTask.Run(() =>
{
//Place symbol in the center of the map
var extent = MapView.Active.Extent;
var location = extent.Center;
//specify a symbol
var pt_symbol = SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.GreenRGB);
//create a CIMGraphic
var graphic = new CIMPointGraphic()
{
Symbol = pt_symbol.MakeSymbolReference(),
Location = location, //center of map
};
graphic.Name = "Mody";
graphicsLayer.AddElement(graphic);
var elems = graphicsLayer.FindElements(new List<string>() { "Mody"})[0];
});
Solved! Go to Solution.
Hi Mody,
This does look like a bug. Thanks for reporting it.
As a workaround, can you please try naming the element after creating it? That works for me.
var graphicsLayer = MapView.Active?.Map.TargetGraphicsLayer;
if (graphicsLayer == null) return;
QueuedTask.Run(() =>
{
//Place symbol in the center of the map
var extent = MapView.Active.Extent;
var location = extent.Center;
//specify a symbol
var pt_symbol = SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.GreenRGB);
//create a CIMGraphic
var graphic = new CIMPointGraphic()
{
Symbol = pt_symbol.MakeSymbolReference(),
Location = location, //center of map
};
graphic.Name = "MyCoolPoint";
graphicsLayer.AddElement(graphic);
var listOfElemToFind = new List<string>
{
"MyCoolPoint"
};
//This returns null
var elems = graphicsLayer.FindElements(listOfElemToFind);
//And so does this one.
var elem = graphicsLayer.FindElement("MyCoolPoint");
//The trick is to find the element you just added.
var ptElem = graphicsLayer.GetElements().FirstOrDefault();
//Rename now
ptElem.SetName("MyCoolPoint");
//This works now
elems = graphicsLayer.FindElements(listOfElemToFind);
//This works now
elem = graphicsLayer.FindElement("MyCoolPoint");
Hi Mody,
This does look like a bug. Thanks for reporting it.
As a workaround, can you please try naming the element after creating it? That works for me.
var graphicsLayer = MapView.Active?.Map.TargetGraphicsLayer;
if (graphicsLayer == null) return;
QueuedTask.Run(() =>
{
//Place symbol in the center of the map
var extent = MapView.Active.Extent;
var location = extent.Center;
//specify a symbol
var pt_symbol = SymbolFactory.Instance.ConstructPointSymbol(
ColorFactory.Instance.GreenRGB);
//create a CIMGraphic
var graphic = new CIMPointGraphic()
{
Symbol = pt_symbol.MakeSymbolReference(),
Location = location, //center of map
};
graphic.Name = "MyCoolPoint";
graphicsLayer.AddElement(graphic);
var listOfElemToFind = new List<string>
{
"MyCoolPoint"
};
//This returns null
var elems = graphicsLayer.FindElements(listOfElemToFind);
//And so does this one.
var elem = graphicsLayer.FindElement("MyCoolPoint");
//The trick is to find the element you just added.
var ptElem = graphicsLayer.GetElements().FirstOrDefault();
//Rename now
ptElem.SetName("MyCoolPoint");
//This works now
elems = graphicsLayer.FindElements(listOfElemToFind);
//This works now
elem = graphicsLayer.FindElement("MyCoolPoint");
Hi Uma
Thanks for the answer and code. I will try it.
What will happened if I add a few elements one by one?
Will GetElements().FirstOrDefault() always return the last element added?
If it is true then I need to do a loop with AddElement, GetElements().FirstOrDefault and SetName - for each element I would like to add - correct
Thanks
Mody
Hi,
Here is the screenshot of the items in my GraphicsLayer:
The order I added the points are like this:
1. Point was added first
2. MyCoolPoint was added second.
Thanks!
Uma
Hi Mody,
This issue is now fixed in ArcGIS Pro 2.7, which is the next release of Pro that will be out.
Thanks again for reporting this issue.
Uma