How to get a fast overview of signal layers

This example shows how to count element types and find the smallest element on each signal layer.
Important is to have an extra class with counters for each layer, otherwise the example will be very confusing and you need many int values to hold the results.

Here is the example code in C Sharp and VB:

 

 
private void buttonCreateHistogram_Click(object sender, EventArgs e)
    {
      IStep step = mainWindowPCBI.GetCurrentStep();
      if (step == null)
      {
        MessageBox.Show("Please load a job first to use this demo.", "No Job Loaded!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        return;
      }
 
      //for example we take all signal layer
      IMatrix matrix = mainWindowPCBI.GetMatrix();
      List<ResultForHistogram> ResultOverviewList = new List<ResultForHistogram>();
      foreach (string layerName in matrix.GetAllSignalLayerNames())
      {
        ILayer relevantLayer = step.GetLayer(layerName);
        if (relevantLayer == null) continue; //if job is modified it is possible wrong names in the matirx
 
        List<IObject> layerObjectList = relevantLayer.GetAllLayerObjects();
        //is there a elemt on the layer?
        if (layerObjectList.Count == 0) return;
 
        double smallestArea = double.MaxValue; //for beginning we use the highest value
        IODBObject smallesObject = null;
 
        ResultForHistogram layerHistogram = new ResultForHistogram();
        layerHistogram.LayerName = layerName;
 
        foreach (IODBObject relevantObject in layerObjectList)
        {
          //check area is possible smaller?
 
          if (relevantObject.Type == IObjectType.Pad)
          {
            layerHistogram.CountPads++;
            IPadSpecificsD pad = (IPadSpecificsD)relevantObject.GetSpecificsD();
 
            if (pad.Type == PCBI.Symbol_Type.rect) //special case for area
            {
              //rect has easiest way to calculate area
              PCBI.MathUtils.RectangleD boundsRelevanObject = relevantObject.GetBoundsD();
 
              double areaOfPad = boundsRelevanObject.Width * boundsRelevanObject.Height;
 
              if (areaOfPad < smallestArea)
              {
                //new smallest
                smallesObject = relevantObject;
                smallestArea = areaOfPad;
              }
            }
            else if (pad.Type == PCBI.Symbol_Type.r) //round pads are easy too
            {
              double areaOfPad = Math.Pow(pad.Diameter / 2, 2) * Math.PI;
 
              if (areaOfPad < smallestArea)
              {
                //new smallest
                smallesObject = relevantObject;
                smallestArea = areaOfPad;
              }
            }
            else
            {
              double areaOfPad = relevantObject.CalculateArea(true);
              if (areaOfPad < smallestArea)
              {
                //new smallest
                smallesObject = relevantObject;
                smallestArea = areaOfPad;
              }
            }
          }
          else
          {
            if (relevantObject.Type == IObjectType.Arc)
              layerHistogram.CountArcs++;
            else if (relevantObject.Type == IObjectType.Line)
              layerHistogram.CountLines++;
            else if (relevantObject.Type == IObjectType.Surface)
              layerHistogram.CountSurfaces++;
            else if (relevantObject.Type == IObjectType.Text)
              layerHistogram.CountText++;
 
            double areaOfPad = relevantObject.CalculateArea(true);
            if (areaOfPad < smallestArea)
            {
              //new smallest
              smallesObject = relevantObject;
              smallestArea = areaOfPad;
            }
          }
        }
        if (smallesObject != null)
        {
          smallesObject.Select(true); //mark as selected
          layerHistogram.SmallesElementArea = smallestArea;
        }
 
        ResultOverviewList.Add(layerHistogram);
      }
      //something went wrong?
      string errorLog = IAutomation.GetErrorLog();
      if (errorLog.Length > 0)
        System.Diagnostics.Debug.WriteLine(errorLog);
 
      if (ResultOverviewList.Count>0) //if there is a layer with elements show messagebox
      {
        StringBuilder sb = new StringBuilder();
 
        foreach (ResultForHistogram resultLayerHistogram in ResultOverviewList)
          sb.AppendLine(resultLayerHistogram.ToString());
 
        MessageBox.Show("Overview all signal layers "+Environment.NewLine + sb.ToString() , "Layer Histogram", MessageBoxButtons.OK, MessageBoxIcon.Information);
      }
      else
        MessageBox.Show("No results found, this demo works only for signal layers!", "No Layer Histogram", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
 
    }
    /// <summary>
    /// Special class to count informations and create report string.
    /// </summary>
    public class ResultForHistogram
    {
      public string LayerName = "";
 
      public int CountLines = 0;
      public int CountArcs = 0;
      public int CountSurfaces = 0;
      public int CountText = 0;
      public int CountPads = 0;
      public double SmallesElementArea = double.MaxValue;
 
      public override string ToString()
      {
        return LayerName + ": L " + CountLines + ", A " + CountArcs + ", S " + CountSurfaces + ", T " + CountText + ", P " + CountPads + " - smallest elemts size: " + SmallesElementArea.ToString() + " mils²";
      }
    }