public static CIMMarker CreateMarker(CIMColor color, double size, MarkerStyle style) { var geometry = CreateMarkerGeometry(style); var symbol = CreatePolygonSymbol(color); var graphic = new CIMMarkerGraphic { Geometry = geometry, Symbol = symbol }; var marker = new CIMVectorMarker(); marker.ColorLocked = false; marker.Enable = true; marker.Size = size >= 0 ? size : DefaultMarkerSize; marker.AnchorPointUnits = SymbolUnits.Relative; marker.BillboardMode3D = BillboardMode.FaceNearPlane; marker.DominantSizeAxis3D = DominantSizeAxis.Y; marker.ScaleSymbolsProportionally = true; marker.RespectFrame = true; marker.MarkerGraphics = new[] { graphic }; marker.Frame = style == MarkerStyle.Circle ? GeometryFactory.CreateEnvelope(-5, -5, 5, 5) : graphic.Geometry.Extent; return(marker); }
private void SetFramePrimitiveNames(CIMPointSymbol symbol, string key) { if (symbol == null) { return; } // verify that the point symbol has only one vector marker layer if (symbol.SymbolLayers == null) { return; } if (symbol.SymbolLayers.Length != 1) { return; } CIMVectorMarker marker = symbol.SymbolLayers[0] as CIMVectorMarker; if (marker == null) { return; } if (marker.MarkerGraphics == null) { return; } // find the fill marker CIMMarkerGraphic fill = null; CIMMarkerGraphic outline = null; double maxArea = 0; double maxLength = 0; foreach (var graphic in marker.MarkerGraphics) { if (graphic == null) { continue; } var hasFill = SymbolUtil.HasFill(graphic.Symbol as CIMMultiLayerSymbol); var hasStroke = SymbolUtil.IsStroke(graphic.Symbol as CIMMultiLayerSymbol); if (graphic.Geometry is ArcGIS.Core.Geometry.Multipart geom) { if (hasFill) { double area = Math.Abs(geom.Area); if (area > maxArea) { maxArea = area; fill = graphic; } } if (hasStroke) { double length = Math.Abs(geom.Length); if (length > maxLength) { maxLength = length; outline = graphic; } } } } // add the primitive names foreach (var graphic in marker.MarkerGraphics) { if (graphic == fill) { SymbolUtil.SetPrimitiveNames(graphic.Symbol as CIMMultiLayerSymbol, "frame_fill", "frame_outline", false, false); } else if (graphic == outline) { SymbolUtil.SetPrimitiveNames(graphic.Symbol as CIMMultiLayerSymbol, "frame_outline", "frame_outline", false, false); } else { SymbolUtil.SetPrimitiveNames(graphic.Symbol as CIMMultiLayerSymbol, "frame_outline", "frame_outline", false, false); } } ++_updatedSymbols; }
protected async override void OnClick() { // To use this utility, you need to add the style that you want to update to your ArcGIS Pro project // If necessary and not alreadly listed, update the line below to include the name of the style that // you want to update // Note: no ".stylx" extension List <string> stylxFiles = new List <string>() { "mil2525d", "mil2525c", "app6b" }; string stylxUpdatedNames = string.Empty; foreach (string stylxToUpdateName in stylxFiles) { StyleProjectItem projectStyleItem = null; try { projectStyleItem = Project.Current.GetItems <StyleProjectItem>().First(x => x.Name == stylxToUpdateName); } catch (Exception ex) { projectStyleItem = null; } if (projectStyleItem == null) { continue; } stylxUpdatedNames += stylxToUpdateName + ";"; //update point symbols var ptSymbols = await projectStyleItem.SearchSymbolsAsync(StyleItemType.PointSymbol, ""); await QueuedTask.Run(() => { foreach (SymbolStyleItem s in ptSymbols) { CIMPointSymbol symbol = (CIMPointSymbol)s.Symbol; if (symbol == null) { continue; } try { var lyrs = symbol.SymbolLayers; foreach (CIMVectorMarker x in lyrs) { if (x.ScaleSymbolsProportionally == false) { x.ScaleSymbolsProportionally = true; } } symbol.SymbolLayers = lyrs; s.Symbol = symbol; projectStyleItem.UpdateItem(s); } catch (Exception ex2) { } } }); //update line symbols var lineSymbols = await projectStyleItem.SearchSymbolsAsync(StyleItemType.LineSymbol, ""); await QueuedTask.Run(() => { foreach (SymbolStyleItem s in lineSymbols) { try { if (s.Symbol is CIMLineSymbol) { CIMLineSymbol symbol = (CIMLineSymbol)s.Symbol; var lyrs = symbol.SymbolLayers; foreach (CIMSymbolLayer lyr in lyrs) { CIMVectorMarker x = lyr as CIMVectorMarker; if (x != null) { if (x.ScaleSymbolsProportionally == false) { x.ScaleSymbolsProportionally = true; } } } symbol.SymbolLayers = lyrs; s.Symbol = symbol; } else if (s.Symbol is CIMPointSymbol) { CIMPointSymbol symbol = (CIMPointSymbol)s.Symbol; var lyrs = symbol.SymbolLayers; foreach (CIMSymbolLayer lyr in lyrs) { CIMVectorMarker x = lyr as CIMVectorMarker; if (x != null) { if (x.ScaleSymbolsProportionally == false) { x.ScaleSymbolsProportionally = true; } } } symbol.SymbolLayers = lyrs; s.Symbol = symbol; s.ItemType = StyleItemType.LineSymbol; } projectStyleItem.UpdateItem(s); } catch (Exception ex3) { } } }); //update polygon symbols var polygonSymbols = await projectStyleItem.SearchSymbolsAsync(StyleItemType.PolygonSymbol, ""); await QueuedTask.Run(() => { foreach (SymbolStyleItem s in polygonSymbols) { try { if (s.Symbol is CIMPolygonSymbol) { CIMPolygonSymbol symbol = (CIMPolygonSymbol)s.Symbol; var lyrs = symbol.SymbolLayers; foreach (CIMSymbolLayer lyr in lyrs) { CIMVectorMarker x = lyr as CIMVectorMarker; if (x != null) { if (x.ScaleSymbolsProportionally == false) { x.ScaleSymbolsProportionally = true; } } } symbol.SymbolLayers = lyrs; s.Symbol = symbol; } else if (s.Symbol is CIMPointSymbol) { CIMPointSymbol symbol = (CIMPointSymbol)s.Symbol; var lyrs = symbol.SymbolLayers; foreach (CIMSymbolLayer lyr in lyrs) { CIMVectorMarker x = lyr as CIMVectorMarker; if (x != null) { if (x.ScaleSymbolsProportionally == false) { x.ScaleSymbolsProportionally = true; } } } symbol.SymbolLayers = lyrs; s.Symbol = symbol; s.ItemType = StyleItemType.PolygonSymbol; } projectStyleItem.UpdateItem(s); } catch (Exception ex3) { } } }); } // end foreach if (string.IsNullOrEmpty(stylxUpdatedNames)) { string stylxs = string.Join(";", stylxFiles); ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Could not find any styles: " + stylxs + " in Project"); } else { ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show("Stylx Update DONE, styles updated:" + stylxUpdatedNames); } } // OnClick