Custom Symbols

319
2
09-02-2011 05:19 AM
Highlighted
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.
Reply
0 Kudos
2 Replies
Highlighted
by
New Contributor
Anyone?
Any idea?
Reply
0 Kudos
Highlighted
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);
            }
        }
Reply
0 Kudos