Custom Symbols

519
2
09-02-2011 05:19 AM
ToniMc
by
New Contributor
How to build custom symbols? Something like one in attachment.
It consists of three independent parts.
1 is simple line, which size can change
2 is some symbol, markerSymbol...
3 is place for text, envelope or rectangle, or another symbol.
Maybe could try with multilayer symbols?
Any idea, but it has to be simple and optimized so graphic
could update easily.
0 Kudos
2 Replies
ToniMc
by
New Contributor
Anyone?
Any idea?
0 Kudos
ToniMc
by
New Contributor
I have solved this issue by grouping 3 elements with IGroupElement.
If some is interesting, put group element on map through OnMouseDown event

  
   private IStyleGalleryItem m_StyleGalleryItem:
 
   private void MainForm_Load(object sender, EventArgs e)
        {           
            // Symbology control should be set on windows form first
            string sInstall = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path;
            axSymbologyControl1.LoadStyleFile(sInstall + "\\Styles\\ESRI.ServerStyle");
            axSymbologyControl1.StyleClass = esriSymbologyStyleClass.esriStyleClassMarkerSymbols;           
        }

     private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
        {           
            try
            {                
                IPoint point = new PointClass();               

                point.PutCoords(e.mapX, e.mapY);
                IGraphicsContainer pGraphicsContainer = (IGraphicsContainer)axMapControl1.ActiveView.FocusMap;                                

                // ---  Element 1 ----------------------------------------------------------------
                
                IElement pElement1 = null;
                pElement1 = new MarkerElementClass();
                
                pElement1.Geometry = point;

                IMarkerElement markerElement1 = (IMarkerElement)pElement1;                
                m_StyleGalleryItem = axSymbologyControl1.GetStyleClass(esriSymbologyStyleClass.esriStyleClassMarkerSymbols).GetItem(7);
                IMarkerSymbol markerSymbol1 = (IMarkerSymbol)m_StyleGalleryItem.Item;
                markerSymbol1.Size = 25;
                markerElement1.Symbol = markerSymbol1;

                // ---  Element 2 -----------------------------------------------------------------
                                                
                IElement pElement2 = null;

                IPoint pCalloutPoint = new PointClass();                
                pCalloutPoint.PutCoords(e.mapX, e.mapY);

                TextElementClass textElement = new TextElementClass();

                textElement.Geometry = pCalloutPoint;

                textElement.Text = "text";

                TextSymbolClass textSymbol = new TextSymbolClass();

                IFontDisp font;
                font = new StdFontClass() as IFontDisp;
                font.Name = "Arial";
                font.Bold = true;

                textSymbol.Font = font;
                textSymbol.Size = 7;                

                IRgbColor pColor = new RgbColorClass();
                pColor.Red = 0;
                pColor.Blue = 0;
                pColor.Green = 0;

                textSymbol.Color = pColor;
                textSymbol.XOffset = 13;
                textSymbol.YOffset = -13;

                BalloonCalloutClass callout = new BalloonCalloutClass();                
                callout.Style = esriBalloonCalloutStyle.esriBCSRectangle;                
                callout.PutMargins(2, 1, 1, 0);                

                IRgbColor background = new RgbColorClass();
                background.Red = 200;
                background.Blue = 255;
                background.Green = 255;

                ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
                simpleFillSymbol.Color = background;
                callout.Symbol = simpleFillSymbol;
                textSymbol.Background = callout;

                textElement.Symbol = textSymbol;

                pElement2 = textElement as IElement;
                              
                // ---  Element 3 -----------------------------------------------------------------

                IPoint p1 = new PointClass();
                IPoint p2 = new PointClass();               

                p1 = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);               
                p2 = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x - 30, e.y - 30);                               
                                
                IPolyline polyline = new PolylineClass();               

                polyline.FromPoint = p1;
                polyline.ToPoint = p2;                

                ILineElement lineElement = new LineElementClass();                
                IRgbColor color = new RgbColorClass();
                color.Red = 255;
                color.Green = 120;
                color.Blue = 100;
                ISimpleLineSymbol symbol = new SimpleLineSymbolClass();
                symbol.Color = color;
                symbol.Width = 2;

                lineElement.Symbol = symbol;

                IElement pElement3 = (IElement)lineElement;
                pElement3.Geometry = (IGeometry)polyline;            

  // Group elements into group element  
                IGroupElement group = new GroupElementClass();
                group.AddElement(pElement2);
                group.AddElement(pElement1);
                group.AddElement(pElement3);                

                axMapControl1.ActiveView.GraphicsContainer.AddElement((IElement)group, 0);
                axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);                
            }
            catch (Exception exc)
            {
                System.Windows.Forms.MessageBox.Show(exc.Message);
            }
        }
0 Kudos