public void Execute(IPCBIWindow parent) { this.parent = parent; IStep step = parent.GetCurrentStep(); if (step == null) { return; } List <string> columsStrings = new List <string>(); columsStrings.Add("Analyse Resource"); columsStrings.Add("Reference"); columsStrings.Add("Distance"); columsStrings.Add("Rule"); columsStrings.Add("Start"); columsStrings.Add("End"); PCB_Investigator.PCBIWindows.PCBIResultDialog resultDLG = new PCB_Investigator.PCBIWindows.PCBIResultDialog(columsStrings); double unit = 1; double distance = PCBI.MathUtils.IMath.MM2Mils(1.0f); if (parent.GetUnit()) { unit = 25.4; //MessageBox.Show("Component to Outline distance: " + PCBI.MathUtils.IMath.Mils2MM(distance).ToString("N3") + " micron", "DRC Component to Board Outline"); } else { //MessageBox.Show("Component to Outline distance: " + distance.ToString("N3") + " mils", "DRC Component to Board Outline"); unit = 1; } foreach (ICMPObject cmp in step.GetAllCMPObjects()) { PCBI.MathUtils.IPolyClass CMP_Poly = cmp.GetPolygonOutline(false); IODBObject boardOutline = parent.GetCurrentStep().GetPCBOutlineAsODBObject(); IPolyClass polyOutline = boardOutline.GetPolygonOutline(); PointD start = new PointD(0, 0); PointD end = new PointD(0, 0); double measuredDistance = cmp.GetPolygonOutline().DistanceTo(polyOutline, ref start, ref end); if (measuredDistance < distance) { ListViewItem lvi = new ListViewItem("Cpmp2Outline"); lvi.SubItems.Add(cmp.Ref); lvi.SubItems.Add((measuredDistance * unit).ToString()); lvi.SubItems.Add((distance * unit).ToString()); lvi.SubItems.Add((start * unit).ToString()); lvi.SubItems.Add((end * unit).ToString()); lvi.Tag = cmp; resultDLG.AddListViewItem(lvi); } } resultDLG.ItemSelectionChanged += ResultDLG_ItemSelectionChanged1;; resultDLG.Size = new Size(500, 350); resultDLG.Show(); }
public void Execute(IPCBIWindow parent) { if (parent.GetCurrentStep() == null) { return; } IStep step = parent.GetCurrentStep(); IFilter filter = new IFilter(parent); if (parent.GetCurrentStep() == null) { return; } if (step.GetCMPLayer(true) != null) { step.GetCMPLayer(true).EnableLayer(true); } if (step.GetCMPLayer(false) != null) { step.GetCMPLayer(false).EnableLayer(true); } double distance = PCBI.MathUtils.IMath.MM2Mils(0.5f); if (parent.GetUnit()) { MessageBox.Show("Component to Outline distance: " + PCBI.MathUtils.IMath.Mils2MM(distance).ToString("N3") + " micron", "DRC Component to Board Outline"); } else { MessageBox.Show("Component to Outline distance: " + distance.ToString("N3") + " mils", "DRC Component to Board Outline"); } foreach (ICMPObject cmp in step.GetAllCMPObjects()) { PCBI.MathUtils.IPolyClass CMP_Poly = cmp.GetPolygonOutline(false); IODBObject boardOutline = parent.GetCurrentStep().GetPCBOutlineAsODBObject(); IPolyClass polyOutline = boardOutline.GetPolygonOutline(); PointD start = new PointD(0, 0); PointD end = new PointD(0, 0); if (cmp.GetPolygonOutline().DistanceTo(polyOutline, ref start, ref end) < distance) { cmp.Select(true); } } parent.UpdateView(); }
private static bool?CheckPadsForFreeMask(IODBLayer SMLayer, IODBObject checkingPad) { if (checkingPad.Type == IObjectType.Pad) { bool foundFreeArea = false; //check is it free on mask layer? #region without cmps foreach (IODBObject maskObjects in SMLayer.GetAllObjectInRectangle(checkingPad.GetBoundsD())) { if (maskObjects.Bounds.Contains(checkingPad.Bounds)) //bounds included in mask object? { if (!maskObjects.DoesIntersect(checkingPad) || maskObjects.GetPolygonOutline().isEqualsTol(checkingPad.GetPolygonOutline())) //no intersection? { if (maskObjects.Type == IObjectType.Surface) { //surface is special with holes and convex or concave elements -> one more test if (maskObjects.IsPointOfSecondObjectIncluded(checkingPad)) { foundFreeArea = true; break; } } else { //mask object should be free! foundFreeArea = true; break; } } } } #endregion return(foundFreeArea); } return(null); }
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); } } } } }