private void CopyAllViasToNewLayer(IPCBIWindow parent, string layerName, string newLayerName)
        {
            IStep curStep = parent.GetCurrentStep();

            if (curStep == null)
            {
                MessageBox.Show("No Job loaded, please load a job before start this script!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }
            ILayer relevantLayer = curStep.GetLayer(layerName);
            ILayer NewLayer      = curStep.GetLayer(newLayerName);

            if (NewLayer == null || relevantLayer == null || !(NewLayer is IODBLayer))
            {
                MessageBox.Show("Check Layers, something is wrong!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            List <IODBObject> ViaList = new List <IODBObject>();

            //check all elements for via attribute
            foreach (IObject obj in relevantLayer.GetAllLayerObjects())
            {
                if (obj is IODBObject)
                {
                    if (((IODBObject)obj).Type == IObjectType.Pad)
                    {
                        Dictionary <PCBI.FeatureAttributeEnum, string> attributesOfPad = ((IODBObject)obj).GetAttributesDictionary();

                        if (attributesOfPad.ContainsKey(PCBI.FeatureAttributeEnum.pad_usage))
                        {
                            if (attributesOfPad[PCBI.FeatureAttributeEnum.pad_usage] == "via")
                            {
                                ViaList.Add((IODBObject)obj);
                            }
                        }
                    }
                }
            }
            IFilter filter = new IFilter(parent); //to create copies on new layer

            //add vias to new layer
            foreach (IODBObject viaPad in ViaList)
            {
                IPadSpecificsD padInfo = (IPadSpecificsD)viaPad.GetSpecificsD();

                int toolNr = IFilter.AddToolDefinitionRound((IODBLayer)NewLayer, (float)padInfo.Diameter, -1);

                IODBObject newViaPad = filter.CreatePad((IODBLayer)NewLayer);

                newViaPad.SetSpecifics(padInfo, toolNr);
                newViaPad.SetAttribute("pad_usage=via");
            }
        }
コード例 #2
0
        public void CreatePads()
        {
            IFilter filter = new IFilter(Parent);

            IStep curStep = Parent.GetCurrentStep();

            if (curStep == null)
            {
                MessageBox.Show("No Job loaded, please load a job before start this script!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

                return;
            }
            IODBLayer fiducialLayer = filter.CreateEmptyODBLayer("copper", curStep.Name);

            if (fiducialLayer == null)
            {
                MessageBox.Show("Can't create new layer!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);

                return;
            }

            float outerDiameter = 1800;
            float innerDiameter = 1000;

            int shapeIndex = IFilter.AddToolDefinitionDonut(fiducialLayer, outerDiameter / 25.4f, innerDiameter / 25.4f, 0);

            PCBI.MathUtils.PointD startLine = new PCBI.MathUtils.PointD(0, 0);
            float distance = 2540 / 25.4f;

            for (int y = 0; y < 39; y++)
            {
                for (int i = 0; i < 63; i++)
                {
                    IODBObject     pad = filter.CreatePad(fiducialLayer);
                    IPadSpecificsD ps  = new IPadSpecificsD();
                    ps.Location   = new PCBI.MathUtils.PointD(startLine.X, startLine.Y);
                    ps.ShapeIndex = shapeIndex;
                    ps.Positive   = true;
                    pad.SetSpecifics(ps);
                    startLine.X += distance;
                }
                startLine.Y += distance;
                startLine.X  = 0;
            }
            IMatrix matrix = Parent.GetMatrix();

            matrix.UpdateDataAndList();
            Parent.UpdateView();
        }
        public void Execute(IPCBIWindow parent)
        {
            IFilter filter = new IFilter(parent);

            IStep curStep = parent.GetCurrentStep();

            if (curStep == null)
            {
                return;
            }

            List <IODBObject> selectedElements = curStep.GetSelectedElements();

            //create list with all selected elements to make a new symbol of it
            List <IObjectSpecificsD> newSymbolSpecs = new List <IObjectSpecificsD>();
            string relLayerName = "";

            PCBI.MathUtils.RectangleD bounds = new PCBI.MathUtils.RectangleD();
            int indexOfLastElement           = 1;

            foreach (IODBObject obj in selectedElements)
            {
                newSymbolSpecs.Add(obj.GetSpecificsD());
                relLayerName = obj.GetParentLayerName();
                if (bounds == RectangleD.Empty)
                {
                    bounds = obj.GetBoundsD();
                }
                else
                {
                    bounds = PCBI.MathUtils.RectangleD.Union(bounds, obj.GetBoundsD());
                }
                indexOfLastElement = obj.GetIndexOnLayer();
            }

            IODBLayer relLayer = (IODBLayer)curStep.GetLayer(relLayerName);

            if (relLayer == null)
            {
                return;
            }

            //create new symbol for pads, the name must be unique. We try it with the index of one of the elements.
            int nr = IFilter.AddToolDefinitionSpecial(relLayer, parent, "testsymbol3" + indexOfLastElement, newSymbolSpecs, -bounds.GetMidPoint().X, -bounds.GetMidPoint().Y);

            if (nr < 0)
            {
                //no new symbol was created, maybe name is already existing
                return;
            }

            //delete old elements
            IAutomation.SuppressUserNotifications = false; //otherwise the delete action will be blocked
            parent.UIAction.Execute(ID_ActionItem.ID_DELETE);

            IODBObject pad = filter.CreatePad(relLayer);

            IPadSpecificsD padSpec = (IPadSpecificsD)pad.GetSpecificsD();

            padSpec.Location = bounds.GetMidPoint();
            pad.SetSpecifics(padSpec, nr);
            pad.SetAttribute("new symbol attribute");

            pad.Select(true);

            parent.UpdateView();
        }
            private void CreateNewDrillODBLayer(PCBI.Automation.IFilter filter, string newLayerName, IPCBIWindow parent, List <IODBObject> currIODBObjectList, bool activateLayer)
            {
                if (currIODBObjectList.Count == 0)
                {
                    return;
                }

                IODBLayer layer = filter.CreateEmptyODBLayer(newLayerName, parent.GetCurrentStep().Name);
                Dictionary <string, int> shapeList = new Dictionary <string, int>();

                foreach (IODBObject obj in currIODBObjectList)
                {
                    if (obj.Type == IObjectType.Pad)
                    {
                        IPadSpecificsD specPad = (IPadSpecificsD)obj.GetSpecificsD();
                        if (!shapeList.ContainsKey(specPad.ODBSymbol_String))
                        {
                            int newShapeIndex = IFilter.AddToolFromODBString(layer, specPad.ODBSymbol_String, shapeList.Count);
                            shapeList.Add(specPad.ODBSymbol_String, newShapeIndex);
                        }
                        IODBObject     pad       = filter.CreatePad(layer);
                        IPadSpecificsD padInfosD = (IPadSpecificsD)obj.GetSpecificsD();
                        padInfosD.ShapeIndex = shapeList[specPad.ODBSymbol_String];
                        pad.SetSpecifics(padInfosD, shapeList[specPad.ODBSymbol_String]);
                    }
                    else if (obj.Type == IObjectType.Line)
                    {
                        ILineSpecificsD specLine = (ILineSpecificsD)obj.GetSpecificsD();
                        if (!shapeList.ContainsKey(specLine.ODBSymbol_String))
                        {
                            int newShapeIndex = IFilter.AddToolFromODBString(layer, specLine.ODBSymbol_String, shapeList.Count);
                            shapeList.Add(specLine.ODBSymbol_String, newShapeIndex);
                        }
                        IODBObject      line           = filter.CreateLine(layer);
                        ILineSpecificsD lineSpecificsD = (ILineSpecificsD)obj.GetSpecificsD();
                        lineSpecificsD.ShapeIndex = shapeList[specLine.ODBSymbol_String];
                        line.SetSpecifics(lineSpecificsD);
                    }
                    else if (obj.Type == IObjectType.Arc)
                    {
                        IArcSpecificsD specArc = (IArcSpecificsD)obj.GetSpecificsD();
                        if (!shapeList.ContainsKey(specArc.ODBSymbol_String))
                        {
                            int newShapeIndex = IFilter.AddToolFromODBString(layer, specArc.ODBSymbol_String, shapeList.Count);
                            shapeList.Add(specArc.ODBSymbol_String, newShapeIndex);
                        }
                        IODBObject     arc           = filter.CreateArc(layer);
                        IArcSpecificsD specificsArcD = (IArcSpecificsD)obj.GetSpecificsD();
                        specificsArcD.ShapeIndex = shapeList[specArc.ODBSymbol_String];
                        arc.SetSpecifics(specificsArcD);
                    }
                    else if (obj.Type == IObjectType.Surface)
                    {
                        IODBObject         surface           = filter.CreatePolygon(layer);
                        ISurfaceSpecificsD surfaceSpecificsD = (ISurfaceSpecificsD)obj.GetSpecificsD();
                        surface.SetSpecifics(surfaceSpecificsD);
                    }
                    else if (obj.Type == IObjectType.Text)
                    {
                        IODBObject      text           = filter.CreateText(layer);
                        ITextSpecificsD textSpecificsD = (ITextSpecificsD)obj.GetSpecificsD();
                        text.SetSpecifics(textSpecificsD);
                    }
                }
                if (activateLayer)
                {
                    layer.EnableLayer(true);
                }

                IMatrix matrix = parent.GetMatrix();

                matrix.SetMatrixLayerType(layer.LayerName, MatrixLayerType.Drill);
                matrix.SetMatrixLayerContext(layer.LayerName, MatrixLayerContext.Board);
            }
        public void Execute(IPCBIWindow parent)
        {
            string PackageName    = "TESTPUNKT";
            bool   topSide        = true;
            bool   useFlattenStep = true;

            if (!parent.JobIsLoaded)
            {
                return;
            }
            IFilter filter = new IFilter(parent);
            IStep   step   = parent.GetCurrentStep();
            IMatrix matrix = parent.GetMatrix();

            if (matrix == null)
            {
                return;
            }

            step.TurnOffAllLayer();
            step.ClearSelection();
            //nicht für flatten step, da durch Threads zu langsam und dann evtl die neuen Daten wieder gelöscht werden!
            if (!useFlattenStep)
            {
                matrix.DelateLayer("testpoint_locations_top", false);
                matrix.DelateLayer("testpoint_locations_bot", false);
            }
            if (topSide)
            {
                CreateForOneSide(true, step, filter, PackageName, matrix.GetAllDrillLayersForThisLayer(matrix.GetTopSignalLayer()));
            }
            else
            {
                CreateForOneSide(false, step, filter, PackageName, matrix.GetAllDrillLayersForThisLayer(matrix.GetBotSignalLayer()));
            }

            //gitter 500x500

            IODBLayer  rasterLayer = filter.CreateEmptyODBLayer("raster", step.Name);
            int        shapeIndex  = IFilter.AddToolDefinitionRound(rasterLayer, 10);
            RectangleF boundsStep  = step.GetBounds();

            int countYLines = (int)(boundsStep.Height / 500) + 1;
            int countXLines = (int)(boundsStep.Width / 500) + 1;

            for (int y = 0; y <= countYLines; y++)
            {
                for (int x = 0; x <= countXLines; x++)
                {
                    for (int i = 0; i < 5; i++) //5 sublines
                    {
                        int yVal = y * 500;
                        int xVal = x * 500;
                        if (x < countXLines)
                        {
                            CreateHorLine(filter, rasterLayer, shapeIndex, yVal, xVal + i * 100 + 25);
                        }
                        if (y < countYLines)
                        {
                            CreateVertLine(filter, rasterLayer, shapeIndex, yVal + i * 100 + 25, xVal);
                        }
                    }
                }
            }

            for (int y = 0; y < countYLines; y++)
            {
                #region draw text
                IODBObject      textForPad = filter.CreateText(rasterLayer);
                ITextSpecificsD text       = (ITextSpecificsD)textForPad.GetSpecificsD();

                text.Text        = "Y" + (y + 1);
                text.TextSize    = new SizeF(50, 80);
                text.Location    = new PCBI.MathUtils.PointD(-120, y * 500 + 200);
                text.WidthFactor = 1;
                textForPad.SetSpecifics(text);

                //right side
                IODBObject      textForPad2 = filter.CreateText(rasterLayer);
                ITextSpecificsD text2       = (ITextSpecificsD)textForPad.GetSpecificsD();

                text2.Text        = text.Text;
                text2.TextSize    = new SizeF(50, 80);
                text2.Location    = new PCBI.MathUtils.PointD(countXLines * 500 + 120, y * 500 + 200);
                text2.WidthFactor = 1;
                textForPad2.SetSpecifics(text2);
            }
            for (int x = 0; x < countXLines; x++)
            {
                IODBObject      textForPad = filter.CreateText(rasterLayer);
                ITextSpecificsD text       = (ITextSpecificsD)textForPad.GetSpecificsD();

                text.Text        = "X" + (x + 1);
                text.TextSize    = new SizeF(50, 80);
                text.Location    = new PCBI.MathUtils.PointD(x * 500 + 200, -100);
                text.Rotation    = -90;
                text.WidthFactor = 1;
                textForPad.SetSpecifics(text);

                //top side
                IODBObject      textForPad2 = filter.CreateText(rasterLayer);
                ITextSpecificsD text2       = (ITextSpecificsD)textForPad.GetSpecificsD();

                text2.Text        = text.Text;
                text2.TextSize    = new SizeF(50, 80);
                text2.Location    = new PCBI.MathUtils.PointD(x * 500 + 300, countYLines * 500 + 100);
                text2.Rotation    = 90;
                text2.WidthFactor = 1;
                textForPad2.SetSpecifics(text2);
                #endregion
            }

            foreach (string drillName in matrix.GetAllDrillLayerNames())
            {
                IODBLayer drillLayer = (IODBLayer)step.GetLayer(drillName);

                foreach (IODBObject drill in drillLayer.GetAllLayerObjects())
                {
                    Dictionary <PCBI.FeatureAttributeEnum, string> attribs = drill.GetAttributesDictionary();

                    if (drill.Type == IObjectType.Pad && attribs.ContainsKey(PCBI.FeatureAttributeEnum.drill) && attribs.ContainsKey(PCBI.FeatureAttributeEnum.geometry))
                    {
                        if (attribs[PCBI.FeatureAttributeEnum.drill].ToUpperInvariant() == "NON_PLATED" && attribs[PCBI.FeatureAttributeEnum.geometry].ToUpperInvariant() == "ICTAUFNAHME")
                        {
                            IODBObject     drillMarker = filter.CreatePad(rasterLayer);
                            IPadSpecificsD drillSpec   = (IPadSpecificsD)drill.GetSpecificsD();

                            int shapeIndexNew = IFilter.AddToolDefinitionRound(rasterLayer, (float)drillSpec.Diameter);
                            drillSpec.ShapeIndex = shapeIndexNew;
                            drillMarker.SetSpecifics(drillSpec);
                        }
                    }
                }
            }

            matrix.UpdateDataAndList();

            if (!useFlattenStep)
            {
                parent.UIAction.Execute(ID_ActionItem.ID_PRINT_PREVIEW);
            }
        }
        void CreateForOneSide(bool top, IStep step, IFilter filter, string PackageName, List <string> DrillLayers)
        {
            ICMPLayer compLayer = step.GetCMPLayer(top);

            if (compLayer == null)
            {
                return;
            }

            IODBLayer newLayer = filter.CreateEmptyODBLayer("testpoint_locations_" + (top ? "top" : "bot"), step.Name);

            if (newLayer == null)
            {
                return;
            }

            List <IODBLayer> allDrillLayers = new List <IODBLayer>();

            foreach (string drillName in DrillLayers)
            {
                allDrillLayers.Add((IODBLayer)step.GetLayer(drillName));
            }

            int shapeIndex           = IFilter.AddToolDefinitionRound(newLayer, 75);
            int shapeIndexConnection = IFilter.AddToolDefinitionRound(newLayer, 1);

            foreach (ICMPObject cmp in compLayer.GetAllLayerObjects())
            {
                if (!cmp.UsedPackageName.Contains(PackageName))
                {
                    continue;
                }

                IODBObject     markerPad = filter.CreatePad(newLayer);
                IPadSpecificsD pad       = (IPadSpecificsD)markerPad.GetSpecificsD();

                pad.Location   = new PCBI.MathUtils.PointD(cmp.Position);
                pad.ShapeIndex = shapeIndex;

                markerPad.SetSpecifics(pad);
                markerPad.ObjectColor = Color.Green;
                markerPad.SetAttribute("Steel needle <BST> (Testpoint)");
                bool special = false;
                foreach (IODBLayer drillLayer in allDrillLayers)
                {
                    #region check drills
                    foreach (IODBObject drill in drillLayer.GetAllObjectsOnPosition(cmp.Position))
                    {
                        Dictionary <PCBI.FeatureAttributeEnum, string> attribs = drill.GetAttributesDictionary();

                        if (attribs.ContainsKey(PCBI.FeatureAttributeEnum.drill))
                        {
                            if (attribs[PCBI.FeatureAttributeEnum.drill].ToUpperInvariant() == "VIA")
                            {
                                markerPad.ObjectColor = Color.Blue;
                                markerPad.SetAttribute("Pyramid <H> (Via)");
                                special = true;
                                break;
                            }
                        }
                    }
                    if (special)
                    {
                        break;
                    }
                    #endregion
                }
                if (!special)
                {
                    //check for component pin
                    foreach (ICMPObject comp in compLayer.GetAllObjectsOnPosition(cmp.Position))
                    {
                        if (comp == cmp)
                        {
                            continue;              //testpunkt selbst wird ignoriert
                        }
                        foreach (IPin pin in comp.GetPinList())
                        {
                            PCBI.MathUtils.IPolyClass cmpPoly = pin.GetPolygonOutline(comp);
                            if (cmpPoly.PointInPolygon(pad.Location))
                            {
                                markerPad.ObjectColor = Color.Red;
                                markerPad.SetAttribute("Serrated <C>"); //hier evtl noch überprüfen ob pin bzw. body drüber liegt?
                                special = true;                         //oder Serrated with overlapping plastic <CS>
                                break;
                            }
                        }
                        if (special)
                        {
                            break;
                        }
                    }
                }
            }
            foreach (ICMPObject cmp in compLayer.GetAllLayerObjects()) //neue schleife da erst alle pads plaziert werden sollen!
            {
                if (!cmp.UsedPackageName.Contains(PackageName))
                {
                    continue;
                }

                IODBObject      textForPad = filter.CreateText(newLayer);
                ITextSpecificsD text       = (ITextSpecificsD)textForPad.GetSpecificsD();

                text.Text        = cmp.Ref.Remove(0, 2); //Annahme das alle mit TP beginnen
                text.TextSize    = new SizeF(25, 50);
                text.Location    = new PCBI.MathUtils.PointD(cmp.Position.X + 50, cmp.Position.Y - 10);
                text.WidthFactor = 0.6;
                textForPad.SetSpecifics(text);
                textForPad.ObjectColor = Color.DarkGray;

                //text location should not be intersecting!
                List <IObject> otherObjectsOnSameLocation = newLayer.GetAllObjectInRectangle(textForPad.GetBoundsD());
                int            offset     = 50;
                bool           horChecked = false;
                while (otherObjectsOnSameLocation.Count > 1)
                {
                    //move text
                    if (horChecked)
                    {
                        text.Location = new PCBI.MathUtils.PointD(cmp.Position.X, cmp.Position.Y + offset);
                    }
                    else
                    {
                        text.Location = new PCBI.MathUtils.PointD(cmp.Position.X - offset - textForPad.GetBoundsD().Width, cmp.Position.Y - 10);
                    }
                    offset    += 50;
                    horChecked = true;
                    textForPad.SetSpecifics(text);
                    otherObjectsOnSameLocation = newLayer.GetAllObjectInRectangle(textForPad.GetBoundsD());
                }

                IODBObject      connectionLine = filter.CreateLine(newLayer);
                ILineSpecificsD line           = (ILineSpecificsD)connectionLine.GetSpecificsD();

                line.ShapeIndex = shapeIndexConnection;
                line.Start      = new PCBI.MathUtils.PointD(cmp.Position);
                line.End        = new PCBI.MathUtils.PointD(text.Location.X, text.Location.Y + 25);
                connectionLine.SetSpecifics(line);
                connectionLine.ObjectColor = Color.LightGray;
            }
        }
        private static void CreateComponents(bool top, ICMPLayer CMPLayer, IODBLayer frontLayer, IODBLayer sideLayer, float offset, IFilter filter, bool allValuesInMM)
        {
            if (CMPLayer == null)
            {
                return;
            }
            foreach (ICMPObject component in CMPLayer.GetAllLayerObjects())
            {
                float height = (float)component.CompHEIGHT;
                IPackageSpecificsD usedPackage = component.GetPackageSpecificsD();
                if (height == 0)
                {
                    height = usedPackage.Height;
                }
                if (height == 0)
                {
                    #region check height
                    //check attributes
                    foreach (string attrib in component.GetComponentAttributes())
                    {
                        if (attrib.ToLowerInvariant().Contains("height"))
                        {
                            string[] attribtValueFinder = attrib.Split('=');

                            if (attribtValueFinder.Length > 1)
                            {
                                float.TryParse(attribtValueFinder[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out height);
                            }
                            else if (attribtValueFinder[0].Contains("\'"))
                            {
                                string subStr = attribtValueFinder[0].Substring(attribtValueFinder[0].IndexOf('\'') + 1);
                                if (subStr.Contains("\'"))
                                {
                                    subStr = subStr.Substring(0, subStr.IndexOf('\''));
                                    float.TryParse(subStr, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out height);
                                }
                            }
                        }
                    }
                    #endregion
                }
                if (allValuesInMM)
                {
                    height = (float)IMath.MM2Mils(height);
                }

                #region front layer
                int componentFront = IFilter.AddToolDefinitionRect(frontLayer, (float)component.Bounds.Width, height, (float)component.Bounds.Width, false);

                IODBObject cmpFront = filter.CreatePad(frontLayer);

                IPadSpecificsD padCMPFront = (IPadSpecificsD)cmpFront.GetSpecificsD();

                if (top)
                {
                    padCMPFront.Location = new PointD(component.Bounds.X + component.Bounds.Width / 2, offset + height / 2);
                }
                else
                {
                    padCMPFront.Location = new PointD(component.Bounds.X + component.Bounds.Width / 2, -(offset + height / 2));
                }

                cmpFront.SetSpecifics(padCMPFront, componentFront);
                cmpFront.FreeText = component.Ref;
                if (top)
                {
                    cmpFront.ObjectColorTemporary(Color.Silver);
                }
                else
                {
                    cmpFront.ObjectColorTemporary(Color.Gray);
                }
                #endregion
                #region side layer
                int componentSide = IFilter.AddToolDefinitionRect(sideLayer, (float)component.Bounds.Height, (float)component.Bounds.Height, height, false);

                IODBObject cmpSide = filter.CreatePad(sideLayer);

                IPadSpecificsD padCMPSide = (IPadSpecificsD)cmpSide.GetSpecificsD();

                if (top)
                {
                    padCMPSide.Location = new PointD(offset + height / 2, component.Bounds.Y + component.Bounds.Height / 2);
                }
                else
                {
                    padCMPSide.Location = new PointD(-(offset + height / 2), component.Bounds.Y + component.Bounds.Height / 2);
                }

                cmpSide.SetSpecifics(padCMPSide, componentSide);
                cmpSide.FreeText = component.Ref;
                if (top)
                {
                    cmpSide.ObjectColorTemporary(Color.Silver);
                }
                else
                {
                    cmpSide.ObjectColorTemporary(Color.Gray);
                }
                #endregion
            }
        }
コード例 #8
0
        private void fillNODDataList(IPCBIWindow parent, IStep step, IMatrix matrix, List <ICMPObject> lstAllCMPList, List <ThtPin> topTHTPinList, List <ThtPin> botTHTPinList, out List <string> dataList, List <INet> lstINetINetList, List <IODBObject> lstListOfAllDrillObjects, ref List <string> errorLogFile)
        {
            int inCounter4NONENetName = 0;

            dataList = new List <string>();
            string     strTopSigLay = matrix.GetTopSignalLayer();
            string     strBotSigLay = matrix.GetBotSignalLayer();
            IODBLayer  iodblayTopSig, iodblayBotSig, iodblayCurrSigLay;
            string     strPosition = string.Empty;
            string     strTecn     = string.Empty;
            string     strNetName  = string.Empty;
            string     strCmpRef   = string.Empty;
            string     strInfo     = string.Empty;
            ICMPObject iCmOCMPObject;
            char       chrWhiteSpa = ' ';
            int        minAbstand  = 15;
            int        maxAbstand  = 52;
            int        dist        = betterToRead;



            if (lstAllCMPList == null)
            {
                errorLogFile.Add("Method: fillNODDataList + lstAllCMPList is null");
                return;
            }


            // to get the maximum name length

            /*if (lstAllCMPList.Count > 0)
             * {
             *  foreach (ICMPObject cmp in lstAllCMPList)
             *  {
             *      if (cmp != null && !string.IsNullOrEmpty(cmp.PartName))
             *      {
             *          if (maxAbstand < cmp.PartName.Length)
             *          {
             *              maxAbstand = cmp.PartName.Length;
             *          }
             *      }
             *      else
             *      {
             *          errorLogFile.Add("Method: fillNODDataList + lstAllCMPList is null");
             *          return;
             *      }
             *  }
             * }
             * else
             * {
             *  MessageBox.Show("No componentens could be found");
             *  return;
             * }
             *
             *
             *
             * if (lstINetINetList.Count > 0)
             * {
             *  foreach (INet tempNet in lstINetINetList)
             *  {
             *      if (tempNet != null && !string.IsNullOrEmpty(tempNet.NetName))
             *      {
             *          if (maxAbstand < tempNet.NetName.Length)
             *          {
             *              maxAbstand = tempNet.NetName.Length;
             *          }
             *      }
             *      else
             *      {
             *          errorLogFile.Add("Method: fillNODDataList + lstINetInetList is null");
             *          return;
             *      }
             *  }
             * }
             * else
             * {
             *  MessageBox.Show("No componentens could be found");
             *  return;
             * }*/

            maxAbstand = maxAbstand + 2;


            if (!string.IsNullOrEmpty(strTopSigLay))
            {
                iodblayTopSig = (IODBLayer)step.GetLayer(strTopSigLay);
            }
            else
            {
                errorLogFile.Add("Method: fillNODDataList + strTopSigLay is null");
                iodblayTopSig = null;
            }

            if (!string.IsNullOrEmpty(strBotSigLay))
            {
                iodblayBotSig = (IODBLayer)step.GetLayer(strBotSigLay);
            }
            else
            {
                errorLogFile.Add("Method: fillNODDataList + strBotSigLay is null");
                iodblayBotSig = null;
            }

            dataList.Add("* " + "NetName".PadRight(minAbstand, chrWhiteSpa) + "CMP-Ref".PadRight(minAbstand, chrWhiteSpa) + "PinNr.".PadRight(minAbstand, chrWhiteSpa) + "X".PadRight(minAbstand, chrWhiteSpa) + "Y".PadRight(minAbstand, chrWhiteSpa) + "PadSize".PadRight(minAbstand, chrWhiteSpa) + "Pinposition".PadRight(minAbstand, chrWhiteSpa) + "CMP-Typ".PadRight(minAbstand, chrWhiteSpa) + "TEST".PadRight(minAbstand, chrWhiteSpa) + "CHANNEL".PadRight(minAbstand, chrWhiteSpa) + "USER");
            dataList.Add("* ");

            foreach (INet net in lstINetINetList)
            {
                if (net == null)
                {
                    errorLogFile.Add("Method: fillNODDataList + net is null");
                    return;
                }
                List <INetObject> lstNetComponentList = net.ComponentList;

                if (lstNetComponentList == null)
                {
                    errorLogFile.Add("Method: fillNODDataList + lstNetComponentList is null");
                    return;
                }
                foreach (INetObject inetObj in lstNetComponentList)
                {
                    iCmOCMPObject = inetObj.ICMP;
                    if (iCmOCMPObject == null)
                    {
                        errorLogFile.Add("Method: fillNODDataList + iCmOCMPObject is null");
                        continue;
                    }
                    strTecn = string.Empty;


                    bool boPinIsTopSoldered = true;
                    bool boPinIsPartOfTHT   = false;

                    if (!useTHTSearch)
                    {
                        boPinIsTopSoldered = iCmOCMPObject.PlacedTop;
                    }
                    else
                    {
                        if (iCmOCMPObject.PlacedTop)        // true is top layer
                        {
                            boPinIsTopSoldered = true;

                            foreach (var entry in topTHTPinList)
                            {
                                if (entry == null)
                                {
                                    errorLogFile.Add("Method: fillNODDataList + entry is null");
                                    return;
                                }
                                if (entry.Cmp.Ref == iCmOCMPObject.Ref)
                                {
                                    boPinIsPartOfTHT   = true;
                                    boPinIsTopSoldered = false;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            boPinIsTopSoldered = false;

                            foreach (var entry in botTHTPinList)
                            {
                                if (entry == null)
                                {
                                    errorLogFile.Add("Method: fillNODDataList + entry is null");
                                    return;
                                }
                                if (entry.Cmp.Ref == iCmOCMPObject.Ref)
                                {
                                    boPinIsPartOfTHT   = true;
                                    boPinIsTopSoldered = true;
                                    break;
                                }
                            }
                        }
                    }


                    if (boPinIsPartOfTHT == true)
                    {
                        strTecn = "T";
                    }
                    else
                    {
                        strTecn = "S";
                    }

                    if (boPinIsTopSoldered)
                    {
                        strPosition = "T";
                        if (iodblayTopSig != null)
                        {
                            iodblayCurrSigLay = iodblayTopSig;
                        }
                        else
                        {
                            errorLogFile.Add("Method: fillNODDataList + iodblayTopSig is null");
                            return;
                        }
                    }
                    else
                    {
                        strPosition = "B";
                        if (iodblayBotSig != null)
                        {
                            iodblayCurrSigLay = iodblayBotSig;
                        }
                        else
                        {
                            errorLogFile.Add("Method: fillNODDataList + iodblayBotSig is null");
                            return;
                        }
                    }

                    IPin pin = inetObj.GetIPin();
                    {
                        if (pin == null)
                        {
                            errorLogFile.Add("Method: fillNODDataList + pin is null");
                            continue;
                        }
                        IODBObject iodbobPinPad = null;
                        if (iodblayCurrSigLay != null)
                        {
                            iodbobPinPad = pin.GetIPinPad(iodblayCurrSigLay, iCmOCMPObject);
                        }

                        if (net.NetName == null)
                        {
                            errorLogFile.Add("Method: fillNODDataList + net.NetName is null");
                            return;
                        }
                        if (net.NetName == "$NONE$")
                        {
                            strNetName = '"' + net.NetName + inCounter4NONENetName.ToString(System.Globalization.CultureInfo.InvariantCulture) + '"';
                            inCounter4NONENetName++;
                        }
                        else
                        {
                            strNetName = '"' + net.NetName + '"';
                        }
                        strCmpRef = '"' + iCmOCMPObject.Ref + '"';

                        string strPadString = string.Empty;
                        double holeDiameter = 0;
                        bool   rotationExists = false;
                        bool   holeExists = false;
                        double doWidth = 0, doHeight = 0, doDegree = 0;


                        if (iodbobPinPad != null)
                        {
                            IObjectSpecificsD spec = iodbobPinPad.GetSpecificsD();
                            if (spec == null)
                            {
                                errorLogFile.Add("Method: fillNODDataList + spec is null");
                                return;
                            }

                            if (spec is IPadSpecificsD)
                            {
                                IPadSpecificsD pSpec = (IPadSpecificsD)spec;
                                //pSpec.ShapeIndex
                                if (pSpec == null)
                                {
                                    errorLogFile.Add("Method: fillNODDataList + pSpec is null");
                                    return;
                                }
                                IFilter filter = new IFilter(parent);

                                if (filter == null)
                                {
                                    errorLogFile.Add("Method: fillNODDataList + filter is null");
                                    return;
                                }

                                IFilter.ToolDefinition toolDef = filter.GetSymbolByShapeIndex(pSpec.ShapeIndex, iodblayCurrSigLay);
                                if (toolDef == null)
                                {
                                    errorLogFile.Add("Method: fillNODDataList + toolDef is null");
                                    return;
                                }

                                switch (toolDef.Type)
                                {
                                case PCBI.Symbol_Type.r:                //round

                                    foreach (IODBObject drill in lstListOfAllDrillObjects)
                                    {
                                        if (drill == null)
                                        {
                                            errorLogFile.Add("Method: fillNODDataList + drill is null");
                                            return;
                                        }
                                        if (drill.IsPointOfSecondObjectIncluded(iodbobPinPad))
                                        {
                                            holeExists   = true;
                                            holeDiameter = drill.GetDiameter();
                                        }
                                    }
                                    if (holeExists)
                                    {
                                        strPadString = "R" + Math.Round(toolDef.Diameter, 0).ToString(System.Globalization.CultureInfo.InvariantCulture) + "H" + Math.Round(holeDiameter, 0).ToString(System.Globalization.CultureInfo.InvariantCulture);
                                    }
                                    else
                                    {
                                        strPadString = "R" + Math.Round(toolDef.Diameter, 0).ToString(System.Globalization.CultureInfo.InvariantCulture);
                                    }
                                    break;

                                case PCBI.Symbol_Type.s:                // square
                                                                        //toolDef.Diameter;
                                    RectangleD bounds = iodbobPinPad.GetBoundsD();

                                    if (bounds == null)
                                    {
                                        errorLogFile.Add("Method: fillNODDataList + bounds are null");
                                        return;
                                    }

                                    if (pSpec.Rotation != 0)
                                    {
                                        IPolyClass padPoly = iodbobPinPad.GetPolygonOutline();
                                        if (padPoly == null)
                                        {
                                            errorLogFile.Add("Method: fillNODDataList + padPoly is null");
                                            return;
                                        }
                                        padPoly.Rotate(-pSpec.Rotation);
                                        padPoly.UpdateBounds();
                                        bounds = padPoly.GetBounds();
                                    }
                                    strPadString = "X" + Math.Round(bounds.Height, 0).ToString(System.Globalization.CultureInfo.InvariantCulture);
                                    break;

                                case PCBI.Symbol_Type.rect:
                                default:
                                    RectangleD rectBounds = iodbobPinPad.GetBoundsD();
                                    if (rectBounds == null)
                                    {
                                        errorLogFile.Add("Method: fillNODDataList + bounds are null");
                                        return;
                                    }

                                    if (pSpec.Rotation != 0)
                                    {
                                        doDegree       = pSpec.Rotation;
                                        rotationExists = true;
                                        IPolyClass padPoly = iodbobPinPad.GetPolygonOutline();
                                        if (padPoly == null)
                                        {
                                            errorLogFile.Add("Method: fillNODDataList + padPoly is null");
                                            return;
                                        }
                                        padPoly.Rotate(-pSpec.Rotation);
                                        padPoly.UpdateBounds();
                                        rectBounds = padPoly.GetBounds();
                                    }
                                    doWidth  = rectBounds.Width;
                                    doHeight = rectBounds.Height;

                                    if (rotationExists)
                                    {
                                        strPadString = "X" + Math.Round(doWidth, 0).ToString(System.Globalization.CultureInfo.InvariantCulture) + "Y" + Math.Round(doHeight, 0).ToString(System.Globalization.CultureInfo.InvariantCulture) + "A" + Math.Round(doDegree, 0).ToString(System.Globalization.CultureInfo.InvariantCulture);
                                    }
                                    else
                                    {
                                        foreach (IODBObject drill in lstListOfAllDrillObjects)
                                        {
                                            if (drill == null)
                                            {
                                                errorLogFile.Add("Method: fillNODDataList + drill is null");
                                                return;
                                            }
                                            if (drill.IsPointOfSecondObjectIncluded(iodbobPinPad))
                                            {
                                                holeExists   = true;
                                                holeDiameter = drill.GetDiameter();
                                            }
                                        }
                                        if (holeExists)
                                        {
                                            strPadString = "X" + Math.Round(doWidth, 0).ToString(System.Globalization.CultureInfo.InvariantCulture) + "Y" + Math.Round(doHeight, 0).ToString(System.Globalization.CultureInfo.InvariantCulture) + "H" + Math.Round(holeDiameter, 0).ToString(System.Globalization.CultureInfo.InvariantCulture);
                                        }
                                        else
                                        {
                                            strPadString = "X" + Math.Round(doWidth, 0).ToString(System.Globalization.CultureInfo.InvariantCulture) + "Y" + Math.Round(doHeight, 0).ToString(System.Globalization.CultureInfo.InvariantCulture);
                                        }
                                    }


                                    break;
                                }
                            }
                        }
                        else
                        {
                            strPadString = "0";
                            errorLogFile.Add("Method: fillNODDataList + iodbobPinPad is null");
                            return;
                        }
                        string strXValue = (Math.Round(IMath.Mils2MM(pin.GetIPinPositionD(iCmOCMPObject).X), digits)).ToString(System.Globalization.CultureInfo.InvariantCulture);
                        string strYValue = (Math.Round(IMath.Mils2MM(pin.GetIPinPositionD(iCmOCMPObject).Y), digits)).ToString(System.Globalization.CultureInfo.InvariantCulture);



                        strInfo = string.Concat(strNetName.PadRight(strNetName.Length + dist, chrWhiteSpa),
                                                strCmpRef.PadRight(strCmpRef.Length + dist, chrWhiteSpa),
                                                pin.PinNumber.PadRight(pin.PinNumber.Length + dist, chrWhiteSpa),
                                                strXValue.PadRight(strXValue.Length + dist, chrWhiteSpa),
                                                strYValue.PadRight(strYValue.Length + dist, chrWhiteSpa),
                                                strPadString.PadRight(strPadString.Length + dist, chrWhiteSpa),
                                                strPosition.PadRight(strPosition.Length + dist, chrWhiteSpa),
                                                strTecn.PadRight(strTecn.Length + dist, chrWhiteSpa),
                                                "Y".PadRight(2, chrWhiteSpa),
                                                "0".PadRight(2, chrWhiteSpa), " ");

                        if (!dataList.Contains(strInfo))
                        {
                            dataList.Add(strInfo);
                        }
                    }
                }
            }
        }