using PaintDotNet; using PaintDotNet.Base.CommTool; using PaintDotNet.Base.SettingModel; using PaintDotNet.DbOpreate.DbModel; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Metis.AutoAnalysis { class RulerPainter { public RulerModel rulerModel;//标尺样式信息 public int lineLength = 1;//标尺长度 public bool getLengthFromConfig = true;//是否从配置文件获取长度 private double micronRatio = 1; //标志 public mic_rulers xmlSaveModel;//存储标尺信息(xml或者预览拍摄选中标尺) /// /// 换算完的标尺信息,包含所有系统内得单位 /// public Dictionary rules = new Dictionary(); /// /// AxioVision标尺单位对应 /// public Dictionary rule = new Dictionary() { { 76, MeasurementUnit.Micron }, { 75, MeasurementUnit.Millimeter }, { 74, MeasurementUnit.Centimeter }, { 77, MeasurementUnit.Nano }, { 81, MeasurementUnit.Inch }, { 84, MeasurementUnit.Mil } }; public RulerPainter() { InitRulerInfo(); } private void InitRulerInfo() { //Startup.instance.InitRulerInfo(); this.rulerModel = Startup.instance.rulerModel; this.xmlSaveModel = Startup.instance.ruleDB; List mic_rulersAll = new List(); if (this.xmlSaveModel == null && mic_rulersAll.Count > 0) this.xmlSaveModel = mic_rulersAll[0]; this.rules.Clear(); if (this.xmlSaveModel != null && this.xmlSaveModel.pixel_length != 0) { //计算单位长度 比如0.05英寸/像素; 100纳米/像素; double unitLength = (double)(this.xmlSaveModel.physical_length / (decimal)this.xmlSaveModel.pixel_length); switch (this.xmlSaveModel.ruler_units) { case (int)MeasurementUnit.Inch://英寸 this.rules.Add(MeasurementUnit.Inch, unitLength); //英寸 this.rules.Add(MeasurementUnit.Mil, 1000 * unitLength); //米尔 this.rules.Add(MeasurementUnit.Centimeter, 2.54 * unitLength); //厘米 this.rules.Add(MeasurementUnit.Millimeter, 25.4 * unitLength); //毫米 this.rules.Add(MeasurementUnit.Micron, 25400 * unitLength); //微米 this.rules.Add(MeasurementUnit.Nano, 25400000 * unitLength); //纳米 break; case (int)MeasurementUnit.Mil://米尔 this.rules.Add(MeasurementUnit.Inch, 0.001 * unitLength); //英寸 this.rules.Add(MeasurementUnit.Mil, unitLength); //米尔 this.rules.Add(MeasurementUnit.Centimeter, 0.00254 * unitLength); //厘米 this.rules.Add(MeasurementUnit.Millimeter, 0.0254 * unitLength); //毫米 this.rules.Add(MeasurementUnit.Micron, 25.4 * unitLength); //微米 this.rules.Add(MeasurementUnit.Nano, 25400 * unitLength); //纳米 break; case (int)MeasurementUnit.Centimeter://厘米 this.rules.Add(MeasurementUnit.Inch, 0.3937008 * unitLength); //英寸 this.rules.Add(MeasurementUnit.Mil, 393.7008 * unitLength); //米尔 this.rules.Add(MeasurementUnit.Centimeter, unitLength); //厘米 this.rules.Add(MeasurementUnit.Millimeter, 10 * unitLength); //毫米 this.rules.Add(MeasurementUnit.Micron, 10000 * unitLength); //微米 this.rules.Add(MeasurementUnit.Nano, 10000000 * unitLength); //纳米 break; case (int)MeasurementUnit.Millimeter://毫米 this.rules.Add(MeasurementUnit.Inch, 0.0393701 * unitLength); //英寸 this.rules.Add(MeasurementUnit.Mil, 39.3701 * unitLength); //米尔 this.rules.Add(MeasurementUnit.Centimeter, 0.1 * unitLength); //厘米 this.rules.Add(MeasurementUnit.Millimeter, unitLength); //毫米 this.rules.Add(MeasurementUnit.Micron, 1000 * unitLength); //微米 this.rules.Add(MeasurementUnit.Nano, 1000000 * unitLength); //纳米 break; case (int)MeasurementUnit.Micron://微米 this.rules.Add(MeasurementUnit.Inch, 0.00003937007874 * unitLength); //英寸 this.rules.Add(MeasurementUnit.Mil, 0.03937007874 * unitLength); //米尔 this.rules.Add(MeasurementUnit.Centimeter, 0.0001 * unitLength); //厘米 this.rules.Add(MeasurementUnit.Millimeter, 0.001 * unitLength); //毫米 this.rules.Add(MeasurementUnit.Micron, unitLength); //微米 this.rules.Add(MeasurementUnit.Nano, 1000 * unitLength); //纳米 break; case (int)MeasurementUnit.Nano://纳米 this.rules.Add(MeasurementUnit.Inch, 3.9370e-8 * unitLength); //英寸 this.rules.Add(MeasurementUnit.Mil, 3.9370e-5 * unitLength); //米尔 this.rules.Add(MeasurementUnit.Centimeter, 1e-7 * unitLength); //厘米 this.rules.Add(MeasurementUnit.Millimeter, 1e-6 * unitLength); //毫米 this.rules.Add(MeasurementUnit.Micron, 0.001 * unitLength); //微米 this.rules.Add(MeasurementUnit.Nano, unitLength); //纳米 break; default: this.xmlSaveModel = null; break; } } } public decimal Multiple { get { return this.xmlSaveModel.gain_multiple; } } public decimal RulerValue { get { return this.rulerModel.autoRulerValue; } } /// /// 每像素实际单位长度 /// public double MicronRatioPerPixel { get { //config.xml中RulerId必须是数据库mic_ruler中已经存在的 var gainNumber = this.xmlSaveModel.gain_multiple;//获取放大倍数 if (getLengthFromConfig)//判断是否从配置文件获取长度 { lineLength = Convert.ToInt32(this.rulerModel.autoRulerValue);//标尺长度 要除以放大倍数 } Dictionary measurementUnitDictionary = this.rules; //以微米为基础单位 double micron = measurementUnitDictionary[MeasurementUnit.Micron];//每像素多少微米长度 double actualLineLength = (int)(lineLength / gainNumber);//除以放大倍数后的实际物理长度 int pixelLength = Convert.ToInt32(actualLineLength / micron);//换算为像素长度 //实际单位 MeasurementUnit unit = MeasurementUnit.Micron; micronRatio = measurementUnitDictionary[unit];//每像素实际单位长度 return micronRatio; } } public void DrawRuler(ref Bitmap bmp) { if (this.xmlSaveModel == null) return;//不能获得放大倍数 //config.xml中RulerId必须是数据库mic_ruler中已经存在的 var gainNumber = this.xmlSaveModel.gain_multiple;//获取放大倍数 if (getLengthFromConfig)//判断是否从配置文件获取长度 { lineLength = Convert.ToInt32(this.rulerModel.autoRulerValue);//标尺长度 要除以放大倍数 } Dictionary measurementUnitDictionary = this.rules; //以微米为基础单位 double micron = measurementUnitDictionary[MeasurementUnit.Micron];//每像素多少微米长度 double actualLineLength = (int)(lineLength / gainNumber);//除以放大倍数后的实际物理长度 int pixelLength = Convert.ToInt32(actualLineLength / micron);//换算为像素长度 //实际单位 MeasurementUnit unit = MeasurementUnit.Micron; micronRatio = measurementUnitDictionary[unit];//每像素实际单位长度 string unitAbbreviation = "µm"; SizeF windowSize = bmp.Size;//窗体尺寸 //线样式 Pen linePen = new Pen(Color.FromArgb(this.rulerModel.lineColor)); linePen.Width = (int)this.rulerModel.lineWidth; //边框样式 Pen borderPen = new Pen(Color.FromArgb(this.rulerModel.borderColor)); borderPen.Width = (int)this.rulerModel.borderWidth; int lineWidthOffset = (int)this.rulerModel.lineWidth / 2 - 1; int offset = borderPen.Width > 0 ? (int)(borderPen.Width / 2) - 2 : 0; //背景大小 decimal backLength = pixelLength * this.rulerModel.backgroundSize / 100; //垂线 decimal verticalLength = pixelLength * this.rulerModel.verticalLineLength / 100; //文字 string text = actualLineLength + unitAbbreviation; //string text = Math.Round(actualLineLength, MeasureDrawObject.decimalPlaces).ToString() + unitAbbreviation;//小数保留 decimal textHeight = pixelLength * this.rulerModel.textHeight / 100; Font textFont = new Font(this.rulerModel.textFont, (float)this.rulerModel.textFontSize); int fontNewHeight = lineWidthOffset + (int)(textHeight + new Decimal(textFont.Height)); int abc = fontNewHeight > ((int)verticalLength / 2 - 2) ? fontNewHeight : ((int)verticalLength / 2 - 2); //标尺最终尺寸 int rulerWidth = pixelLength + (int)(backLength * 2) + (int)(linePen.Width * 2) + offset * 2; int rulerHeight = (int)verticalLength / 2 + abc + (int)(backLength * 2) + lineWidthOffset + 2 + offset * 2; int rulerPosition = this.rulerModel.rulerPosition;//标尺位置 decimal rulerMargin = this.rulerModel.rulerMargin / 100;//标尺边距 float marginLR = (float)rulerMargin * windowSize.Width;//左右边距 float marginTB = (float)rulerMargin * windowSize.Height;//上下边距 float offsetBorder = borderPen.Width > 0 ? borderPen.Width / 2 : 0; PointF startPoint = new PointF(); switch (rulerPosition) { case 1://左上 startPoint.X = rulerWidth / 2f - lineWidthOffset + offsetBorder + marginLR; startPoint.Y = fontNewHeight + (float)backLength - lineWidthOffset + offsetBorder + marginTB; break; case 2://右上 startPoint.X = windowSize.Width - (rulerWidth / 2f - lineWidthOffset + offsetBorder) - marginLR; startPoint.Y = fontNewHeight + (float)backLength - lineWidthOffset + offsetBorder + marginTB; break; case 3://左下 startPoint.X = rulerWidth / 2f - lineWidthOffset + offsetBorder + marginLR; startPoint.Y = windowSize.Height - (rulerHeight - (fontNewHeight + (float)backLength)) - offsetBorder - marginTB; break; case 4://右下 startPoint.X = windowSize.Width - (rulerWidth / 2f - lineWidthOffset + offsetBorder) - marginLR; startPoint.Y = windowSize.Height - (rulerHeight - (fontNewHeight + (float)backLength)) - offsetBorder - marginTB; break; } Graphics g = Graphics.FromImage((Image)bmp); g.SmoothingMode = SmoothingMode.AntiAlias; RectangleF rectangle = new Rectangle(); DrawRulerHelper.drawRuler(this.rulerModel, g, startPoint, pixelLength, text, out rectangle); g.Dispose(); } } }