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"); } }
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 } }
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); } } } } }