using PaintDotNet.Base.SettingModel; using PaintDotNet.SettingModel; using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Globalization; using System.Runtime.Serialization; using System.Windows.Forms; //using PaintDotNet.Startup; using PaintDotNet.CommTool; using System.IO; using static PaintDotNet.SettingModel.LabelStyleModel; using PaintDotNet.Annotation.Enum; using System.Collections.Generic; using System.Drawing.Imaging; using PaintDotNet.Base.CommTool; using System.ComponentModel; namespace PaintDotNet.Annotation.Other { /// /// 标注->自动标尺 /// public class AutoRulerDraw : DrawObject { private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur")); /// /// 标注样式信息model /// public RulerModel rulerModel; public int lineLength = 1;//标尺长度 public bool getLengthFromConfig = true; double micronRatio = 1; decimal gainNumber = 0; public AutoRulerDraw(ISurfaceBox surfaceBox) : base() { this.objectType = DrawClass.Other; this.drawToolType = DrawToolType.AutoRulerDraw; rulerModel = surfaceBox.GetRulerStyleModel(); startPoint = new PointF(0, 0); Dictionary measurementUnitDictionary = surfaceBox.getMeasureInfo(); this.micronRatio = measurementUnitDictionary[MeasurementUnit.Micron];//每像素多少纳米长度 this.gainNumber = surfaceBox.GetGainMultiple();//获取放大倍数 if (this.gainNumber == 0) this.gainNumber = 20; Initialize(); } public AutoRulerDraw(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base() { this.objectType = DrawClass.Other; this.drawToolType = DrawToolType.AutoRulerDraw; this.ISurfaceBox = surfaceBox; rulerModel = (RulerModel)parentStyleModel; startPoint = points[0]; lineLength = Convert.ToInt32(content.ToString()); getLengthFromConfig = false; } /// /// Clone this instance /// public override DrawObject Clone() { AutoRulerDraw autoRuler = new AutoRulerDraw(ISurfaceBox); autoRuler.objectType = DrawClass.Other; autoRuler.drawToolType = DrawToolType.AutoRulerDraw; autoRuler.ISurfaceBox = ISurfaceBox; autoRuler.startPoint = this.startPoint; autoRuler.lineLength = this.lineLength; autoRuler.getLengthFromConfig = this.getLengthFromConfig; FillDrawObjectFields(autoRuler); return autoRuler; } public override void Draw(Graphics g) { g.SmoothingMode = SmoothingMode.AntiAlias; if (getLengthFromConfig)//判断是否从配置文件获取长度 { lineLength = Convert.ToInt32(this.rulerModel.autoRulerValue);//标尺长度 要除以放大倍数 } int actualLineLength = lineLength / (int)gainNumber;//除以放大倍数后的实际物理长度 int pixelLength = Convert.ToInt32(actualLineLength / micronRatio);//换算为像素长度 SizeF windowSize = this.ISurfaceBox.GetDocumentSize();//窗体尺寸 //线样式 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 + "μm"; 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; 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; } DrawRulerHelper.drawRuler(this.rulerModel, g, startPoint, pixelLength, text, out rectangle); } public override int HandleCount { get { return 1; } } /// /// Get handle pointscroll by 1-based number /// /// /// public override PointF GetHandle(int handleNumber) { return new PointF(rectangle.X, rectangle.Y); } /// /// Hit test. /// Return value: -1 - no hit /// 0 - hit anywhere /// > 1 - handle number /// /// /// public override int HitTest(Point point) { if (Selected) { for (int i = 1; i <= HandleCount; i++) { if (GetHandleRectangle(i).Contains(point)) return i; } } if (PointInObject(point)) return 0; return -1; } protected override bool PointInObject(Point point) { return rectangle.Contains(point); } public override bool IntersectsWith(Rectangle rectangle) { return Rectangle.IntersectsWith(rectangle); } public override Cursor GetHandleCursor(int handleNumber) { return Cursors.Default; } public override void MoveHandleTo(Point point, int handleNumber) { startPoint = point; } public override void Move(int deltaX, int deltaY) { int x = ISurfaceBox.UnscaleScalar(deltaX); int y = ISurfaceBox.UnscaleScalar(deltaY); startPoint.X += x; startPoint.Y += y; rectangle.X += x; rectangle.Y += y; } public override RectangleF GetBoundingBox() { return rectangle; } public override List GetPoints() { List points = new List(); points.Add(startPoint); return points; } public override ParentStyleModel GetStyle() { return rulerModel; } public override string GetContent() { return lineLength.ToString(); } } }