How to create a layer and simple objects

To create your own C# application with using of PCB-Investigator is very simple. First you have to add the reference to your project. In this example its only necessary to add one using from PCB-Investigator: using PCBI.Automation;

For easy starting we have added one button to start the creation.

This simple example can also be updated with net informations.

Here is the example code in C Sharp and VB:

private void buttonCreateJobAndAddDemoLayers_Click(object sender, EventArgs e)
    {
      IPCBIWindow window;
      if (parent == null)
      //create a new instance of PCB-Investigator
      {
        window = PCBI.Automation.IAutomation.CreateNewPCBIWindow(true);
        parent = window;
      }
      else
        //use the existing instance
        window = parent;
 
      PCBI.Automation.IFilter filter = new PCBI.Automation.IFilter(window);
 
      #region create new job
      try
      {
        string JobFullPath = filter.CreateAndLoadEmptyJob(@"C:\tests\FilterTests\Job1");
      }
      catch (Exception ex)
      {
        MessageBox.Show("Can't create new JobDirectory!\n" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
      }
      #endregion
 
      #region new layer
      CreateDemoODBLayer(filter);
 
      #endregion
 
      #region CMP-layer
      CreateDemoCMPLayer(window, filter);
      #endregion
    }
 
    /// <summary>
    /// This method creates an new component layer and add an cmp with some demo pins.
    /// </summary>
    /// <param name="window">The parent window to add the layer and cmp.</param>
    /// <param name="filter">An IFilter object to create the new items.</param>
    private static void CreateDemoCMPLayer(IPCBIWindow window, PCBI.Automation.IFilter filter)
    {
      ICMPLayer parentCMP = window.GetCurrentStep().GetCMPLayer(true);
      if (parentCMP == null)
        parentCMP = filter.CreateEmptyCMPLayer("cmp_top", "gerber"); //in this example the stepname is "gerber"
      ICMPObject component = filter.CreateComponent(parentCMP);
 
      IPackageSpecifics pack = filter.CreatePackage("testPack"); //one package for the demo-cmp
      #region outline of package
      GraphicsPath gp = new GraphicsPath();
 
      gp.AddLine(new Point(100, 100), new Point(100, 300));
      gp.AddLine(new Point(100, 300), new Point(300, 300));
      gp.AddLine(new Point(300, 300), new Point(300, 100));
      gp.AddLine(new Point(300, 100), new Point(100, 100));
 
      pack.SetGraphicsPath(gp);
      #endregion
 
      pack.AddEllipsePin(new PointF(101, 101), 35, "PinEl1");
      pack.AddRectanglePin(new RectangleF(279, 269, 40, 50), "PinRe1");
 
      #region more pins
      for (int i = 0; i < 5; i++)
      {
        ISurfaceSpecifics outline = pack.CreatePolygonPinSurface();
        outline.StartPolygon(false, new PointF(20, 50));
        outline.AddLine(new PointF(20, 50), new PointF(20, 70));
        outline.AddLine(new PointF(20, 70), new PointF(35, 70));
 
        outline.AddArc(new PointF(35, 70), new PointF(40, 65), new PointF(35, 65), true);
 
        outline.AddLine(new PointF(40, 65), new PointF(40, 50));
        outline.AddLine(new PointF(40, 50), new PointF(20, 50));
        outline.EndPolygon();
        pack.AddPolygonPin(new PointF(100 + i * 20, 150 + 1 * 5), outline, "PinPo" + i); //add the polygon pin with nr
      }
      #endregion
 
      var specifics = component.GetSpecifics();
      IComponentSpecifics spec = (IComponentSpecifics)specifics;
      spec.Height = 7;
      spec.Location = new PointF(1000, 500);
      spec.PartName = "partName2";
      spec.Value = "value2";
      spec.Attributes = "attributes2";
      spec.Reference = "Ref2";
      spec.PlacedTop = true;
 
      component.SetSpecifics(spec, pack);
    }
 
    /// <summary>
    /// An example to create an new layer and add some objects to show how to handle simple properties.
    /// </summary>
    /// <param name="filter">The IFilter object to create the elements.</param>
    private void CreateDemoODBLayer(PCBI.Automation.IFilter filter)
    {
      IODBLayer layer = filter.CreateEmptyODBLayer("layer1", "gerber");
 
      //tooldefinitions
      int index1 = IFilter.AddToolDefinitionRound(layer, 10, 0);
      int index2 = IFilter.AddToolDefinitionRect(layer, 20, 1, 20, 50, true);
      int index3 = IFilter.AddToolDefinitionDonut(layer, 50, 25, 2);
      int index4 = IFilter.AddToolDefinitionOct(layer, 40, 40, 40, 5, 3);
 
      #region firstArc
      //create an arc object
      IODBObject arc = filter.CreateArc(layer);
      IArcSpecifics specificsArc = new IArcSpecifics();
      specificsArc.Start = new PointF(100, 100);
      specificsArc.End = new PointF(100, 300);
      specificsArc.Center = new PointF(100, 200);
      specificsArc.ClockWise = true;
      specificsArc.Positiv = true;
      specificsArc.Diameter = 10;
      arc.SetSpecifics(specificsArc, 0);
      #endregion
 
      #region first+second+third Pad
      //create three pads
      IODBObject pad = filter.CreatePad(layer);
      IPadSpecifics padInfos = new IPadSpecifics();
      padInfos.Location = new PointF(400, 400);
      padInfos.Positiv = (true);
      pad.SetSpecifics(padInfos, index1); //its possible to use the same index more than one time
 
      IODBObject pad2 = filter.CreatePad(layer);
      padInfos = new IPadSpecifics();
      padInfos.Location = new PointF(300, 400);
      padInfos.Positiv = (true);
      pad2.SetSpecifics(padInfos, index2);
 
      IODBObject pad3 = filter.CreatePad(layer);
      padInfos = new IPadSpecifics();
      padInfos.Location = new PointF(200, 400);
      padInfos.Positiv = (true);
      pad3.SetSpecifics(padInfos, index3);
      #endregion
    }