using PaintDotNet.Base.SettingModel;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Globalization;
using System.Runtime.Serialization;
using System.Windows.Forms;
using PaintDotNet.Base.CommTool;
using System.IO;
using PaintDotNet.Annotation.Enum;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.ComponentModel;
namespace PaintDotNet.Annotation.Label
{
///
/// 标注->自动标尺
///
public class DrawAutoRuler : DrawObject
{
private static Cursor handleCursor = new Cursor(PdnResources.GetResourceStream("Cursors.AnnotationPolyHandle.cur"));
///
/// 标注样式信息model
///
public RulerModel rulerModel;
public int lineLength = 1;//标尺长度
public bool getLengthFromConfig = true;//是否从配置文件获取长度
private double micronRatio = 1;
private decimal gainNumber = 0;//放大倍数
private bool isFirstDraw = true;//是否第一次绘制,决定初始位置
public DrawAutoRuler(ISurfaceBox surfaceBox) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawAutoRuler;
rulerModel = surfaceBox.GetRulerStyleModel();
startPoint = new PointF(0, 0);
//Dictionary measurementUnitDictionary = surfaceBox.getMeasureInfo();
//this.micronRatio = measurementUnitDictionary[MeasurementUnit.Micron];//每像素多少纳米长度
//this.gainNumber = surfaceBox.GetMic_Rulers();//获取放大倍数
//if (this.gainNumber == 0)
// this.gainNumber = 20;
Initialize();
}
public DrawAutoRuler(ISurfaceBox surfaceBox, List points, ParentStyleModel parentStyleModel, Object content) : base()
{
this.objectType = DrawClass.Label;
this.drawToolType = DrawToolType.DrawAutoRuler;
this.ISurfaceBox = surfaceBox;
this.isFirstDraw = false;
this.gainNumber = surfaceBox.GetGainMultiple();//获取放大倍数
if (this.gainNumber == 0)
this.gainNumber = 1;
rulerModel = (RulerModel)parentStyleModel;
startPoint = points[0];
lineLength = Convert.ToInt32(content.ToString());
getLengthFromConfig = false;
}
///
/// Clone this instance
///
public override DrawObject Clone()
{
DrawAutoRuler autoRuler = new DrawAutoRuler(ISurfaceBox);
autoRuler.objectType = DrawClass.Label;
autoRuler.drawToolType = DrawToolType.DrawAutoRuler;
autoRuler.ISurfaceBox = ISurfaceBox;
autoRuler.isFirstDraw = false;
autoRuler.startPoint = this.startPoint;
autoRuler.lineLength = this.lineLength;
autoRuler.getLengthFromConfig = this.getLengthFromConfig;
FillDrawObjectFields(autoRuler);
return autoRuler;
}
public override DrawObject Clone(ISurfaceBox surfaceBox)
{
DrawAutoRuler autoRuler = new DrawAutoRuler(surfaceBox);
autoRuler.objectType = DrawClass.Label;
autoRuler.drawToolType = DrawToolType.DrawAutoRuler;
autoRuler.ISurfaceBox = surfaceBox;
autoRuler.isFirstDraw = false;
autoRuler.startPoint = this.startPoint;
autoRuler.lineLength = this.lineLength;
autoRuler.getLengthFromConfig = this.getLengthFromConfig;
FillDrawObjectFields(autoRuler);
return autoRuler;
}
public override void Draw(Graphics g)
{
this.gainNumber = ISurfaceBox.GetMic_Rulers();//获取放大倍数
if (this.gainNumber == 0)
this.gainNumber = 1;
if (getLengthFromConfig)//判断是否从配置文件获取长度
{
lineLength = Convert.ToInt32(this.rulerModel.autoRulerValue);//标尺长度 要除以放大倍数
}
if (gainNumber < 1)
{
return;
}
Dictionary measurementUnitDictionary = ISurfaceBox.getMeasureInfo();
#region[以微米为基础单位]
double micron = measurementUnitDictionary[MeasurementUnit.Micron];//每像素多少微米长度
double actualLineLength = (int)(lineLength / gainNumber);//除以放大倍数后的实际物理长度
int pixelLength = Convert.ToInt32(actualLineLength / micron);//换算为像素长度
#endregion
g.SmoothingMode = SmoothingMode.AntiAlias;
//实际单位
MeasurementUnit unit = ISurfaceBox.GetMeasurementUnit();
micronRatio = measurementUnitDictionary[unit];//每像素实际单位长度
#region [单位缩写]
string unitAbbreviation = string.Empty;
switch (unit)
{
case MeasurementUnit.Inch:
actualLineLength = actualLineLength * micronRatio / micron;
unitAbbreviation = "in";
break;
case MeasurementUnit.Centimeter:
actualLineLength = actualLineLength * micronRatio / micron;
unitAbbreviation = "cm";
break;
case MeasurementUnit.Millimeter:
actualLineLength = actualLineLength * micronRatio / micron;
unitAbbreviation = "mm";
break;
case MeasurementUnit.Micron:
unitAbbreviation = "µm";
break;
case MeasurementUnit.Nano:
actualLineLength = actualLineLength * micronRatio / micron;
unitAbbreviation = "nm";
break;
case MeasurementUnit.Pixel:
unitAbbreviation = "PX";
break;
case MeasurementUnit.Mil:
actualLineLength = actualLineLength * micronRatio / micron;
unitAbbreviation = "mil";
break;
}
#endregion
//this.gainNumber = ISurfaceBox.GetMic_Rulers();//获取放大倍数
//if (this.gainNumber == 0)
// this.gainNumber = 1;
//if (getLengthFromConfig)//判断是否从配置文件获取长度
//{
// lineLength = Convert.ToInt32(this.rulerModel.autoRulerValue);//标尺长度 要除以放大倍数
//}
//if (gainNumber < 1)
//{
// return;
//}
//int actualLineLength = (int)(lineLength / 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 + 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;
if (isFirstDraw)
{
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;
}
isFirstDraw = false;
}
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();
}
}
}