using ComPDFKit.Measure; using ComPDFKit.PDFAnnotation; using Compdfkit_Tools.PDFControl; using System; using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using ComPDFKit.Tool.SettingParam; namespace Compdfkit_Tools.Measure { /// /// MeasureSettingPanel.xaml 的交互逻辑 /// public partial class MeasureSettingPanel : UserControl { public event EventHandler CancelEvent; public event EventHandler DoneEvent; public PDFViewControl PdfViewControl { get; set; } public bool ReturnToInfoPanel { get; set; } //public List UpdateArgsList { get; set; } = new List(); public MeasureSettingPanel() { InitializeComponent(); } private void ButtonCancel_Click(object sender, RoutedEventArgs e) { //if (UpdateArgsList != null && UpdateArgsList.Count > 0) //{ // ReturnToInfoPanel = false; //} //UpdateArgsList?.Clear(); CancelEvent?.Invoke(this, e); ReturnToInfoPanel = false; } public void ShowAreaAndLength(Visibility visibility) { if (visibility == Visibility.Visible) { SettingPanel.Height = 350; } else { SettingPanel.Height = 290; } AreaAndLength.Visibility = visibility; } private void ButtonDone_Click(object sender, RoutedEventArgs e) { if (string.IsNullOrEmpty(RulerBaseText.Text) || string.IsNullOrEmpty(RulerTranslateText.Text)) { MessageBox.Show("Scale is not greater than zero"); return; } if (double.TryParse(RulerBaseText.Text, out double ruleBase)) { if (ruleBase <= 0) { MessageBox.Show("Scale is not greater than zero"); return; } } if (double.TryParse(RulerTranslateText.Text, out double ruletranBase)) { if (ruletranBase <= 0) { MessageBox.Show("Scale is not greater than zero"); return; } } //if (UpdateArgsList != null && UpdateArgsList.Count == 0) //{ // SaveMeasureSetting(); //} //if (UpdateArgsList != null && UpdateArgsList.Count > 0) //{ // List allowTypeList = new List() // { // AnnotArgsType.LineMeasure, // AnnotArgsType.PolyLineMeasure, // AnnotArgsType.PolygonMeasure // }; // foreach (AnnotHandlerEventArgs args in UpdateArgsList) // { // if (allowTypeList.Contains(args.EventType)) // { // CPDFAnnotation pdfAnnot = args.GetPDFAnnot(); // switch (pdfAnnot.Type) // { // case C_ANNOTATION_TYPE.C_ANNOTATION_LINE: // { // CPDFLineAnnotation lineAnnot = (CPDFLineAnnotation)pdfAnnot; // if (lineAnnot.IsMersured()) // { // CPDFDistanceMeasure lineMeasure = lineAnnot.GetDistanceMeasure(); // CPDFMeasureInfo measureInfo = lineMeasure.MeasureInfo; // if (PrecisionBox.SelectedValue != null) // { // ComboBoxItem checkItem = PrecisionBox.SelectedValue as ComboBoxItem; // if (double.TryParse(checkItem.Content.ToString(), out double precision)) // { // measureInfo.Precision = GetMeasureSavePrecision(precision); // } // } // if (double.TryParse(RulerBaseText.Text, out double ruleBasedata)) // { // measureInfo.RulerBase = (float)ruleBasedata; // } // if (RulerBaseUnitCombo.SelectedItem != null) // { // ComboBoxItem RulerBaseUnitcheckItem = RulerBaseUnitCombo.SelectedItem as ComboBoxItem; // measureInfo.RulerBaseUnit = RulerBaseUnitcheckItem.Content.ToString(); // } // if (double.TryParse(RulerTranslateText.Text, out double ruletranBasedata)) // { // measureInfo.RulerTranslate = (float)ruletranBasedata; // } // if (RulerTranslateCombo.SelectedItem != null) // { // ComboBoxItem RulerTranslatecheckItem = RulerTranslateCombo.SelectedItem as ComboBoxItem; // measureInfo.RulerTranslateUnit = RulerTranslatecheckItem.Content.ToString(); // } // lineMeasure.SetMeasureInfo(measureInfo); // lineMeasure.SetMeasureScale( // measureInfo.RulerBase, // measureInfo.RulerBaseUnit, // measureInfo.RulerTranslate, // measureInfo.RulerTranslateUnit); // lineMeasure.UpdateAnnotMeasure(); // lineAnnot.UpdateAp(); // args.Draw(); // if (PdfViewControl != null && PdfViewControl.PDFView != null) // { // CPDFViewer viewer = PdfViewControl.PDFView; // if (viewer != null && viewer.UndoManager != null) // { // viewer.UndoManager.CanSave = true; // } // } // } // } // break; // case C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE: // { // CPDFPolylineAnnotation polylineAnnot = (CPDFPolylineAnnotation)pdfAnnot; // if (polylineAnnot.IsMersured()) // { // CPDFPerimeterMeasure polylineMeasure = polylineAnnot.GetPerimeterMeasure(); // CPDFMeasureInfo measureInfo = polylineMeasure.MeasureInfo; // if (PrecisionBox.SelectedValue != null) // { // ComboBoxItem checkItem = PrecisionBox.SelectedValue as ComboBoxItem; // if (double.TryParse(checkItem.Content.ToString(), out double precision)) // { // measureInfo.Precision = GetMeasureSavePrecision(precision); // } // } // if (double.TryParse(RulerBaseText.Text, out double ruleBasedata)) // { // measureInfo.RulerBase = (float)ruleBasedata; // } // if (RulerBaseUnitCombo.SelectedItem != null) // { // ComboBoxItem RulerBaseUnitcheckItem = RulerBaseUnitCombo.SelectedItem as ComboBoxItem; // measureInfo.RulerBaseUnit = RulerBaseUnitcheckItem.Content.ToString(); // } // if (double.TryParse(RulerTranslateText.Text, out double ruletranBasedata)) // { // measureInfo.RulerTranslate = (float)ruletranBasedata; // } // if (RulerTranslateCombo.SelectedItem != null) // { // ComboBoxItem RulerTranslatecheckItem = RulerTranslateCombo.SelectedItem as ComboBoxItem; // measureInfo.RulerTranslateUnit = RulerTranslatecheckItem.Content.ToString(); // } // polylineMeasure.SetMeasureInfo(measureInfo); // polylineMeasure.SetMeasureScale( // measureInfo.RulerBase, // measureInfo.RulerBaseUnit, // measureInfo.RulerTranslate, // measureInfo.RulerTranslateUnit); // polylineMeasure.UpdateAnnotMeasure(); // polylineAnnot.UpdateAp(); // args.Draw(); // if (PdfViewControl != null && PdfViewControl.PDFView != null) // { // CPDFViewer viewer = PdfViewControl.PDFView; // if (viewer != null && viewer.UndoManager != null) // { // viewer.UndoManager.CanSave = true; // } // } // } // } // break; // case C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON: // { // CPDFPolygonAnnotation areaAnnot = (CPDFPolygonAnnotation)pdfAnnot; // if (areaAnnot.IsMersured()) // { // CPDFAreaMeasure areaMeasure = areaAnnot.GetAreaMeasure(); // CPDFMeasureInfo measureInfo = areaMeasure.MeasureInfo; // if (PrecisionBox.SelectedValue != null) // { // ComboBoxItem checkItem = PrecisionBox.SelectedValue as ComboBoxItem; // if (double.TryParse(checkItem.Content.ToString(), out double precision)) // { // measureInfo.Precision = GetMeasureSavePrecision(precision); // } // } // if (double.TryParse(RulerBaseText.Text, out double ruleBasedata)) // { // measureInfo.RulerBase = (float)ruleBasedata; // } // if (RulerBaseUnitCombo.SelectedItem != null) // { // ComboBoxItem RulerBaseUnitcheckItem = RulerBaseUnitCombo.SelectedItem as ComboBoxItem; // measureInfo.RulerBaseUnit = RulerBaseUnitcheckItem.Content.ToString(); // } // if (double.TryParse(RulerTranslateText.Text, out double ruletranBasedata)) // { // measureInfo.RulerTranslate = (float)ruletranBasedata; // } // if (RulerTranslateCombo.SelectedItem != null) // { // ComboBoxItem RulerTranslatecheckItem = RulerTranslateCombo.SelectedItem as ComboBoxItem; // measureInfo.RulerTranslateUnit = RulerTranslatecheckItem.Content.ToString(); // } // measureInfo.CaptionType = CPDFCaptionType.CPDF_CAPTION_NONE; // if ((bool)AreaCheckBox.IsChecked) // { // measureInfo.CaptionType |= CPDFCaptionType.CPDF_CAPTION_AREA; // } // if ((bool)LengthCheckBox.IsChecked) // { // measureInfo.CaptionType |= CPDFCaptionType.CPDF_CAPTION_LENGTH; // } // areaMeasure.SetMeasureInfo(measureInfo); // areaMeasure.SetMeasureScale( // measureInfo.RulerBase, // measureInfo.RulerBaseUnit, // measureInfo.RulerTranslate, // measureInfo.RulerTranslateUnit); // areaMeasure.UpdateAnnotMeasure(); // areaAnnot.UpdateAp(); // args.Draw(); // if(PdfViewControl!=null && PdfViewControl.PDFView!=null) // { // CPDFViewer viewer = PdfViewControl.PDFView; // if(viewer!=null && viewer.UndoManager!=null) // { // viewer.UndoManager.CanSave = true; // } // } // } // } // break; // default: // break; // } // } // } // ReturnToInfoPanel = false; //} //UpdateArgsList?.Clear(); DoneEvent?.Invoke(this, e); ReturnToInfoPanel = false; } private int GetMeasureSavePrecision(double Precision) { if (Precision == 1) { return CPDFMeasure.PRECISION_VALUE_ZERO; } if (Precision == 0.1) { return CPDFMeasure.PRECISION_VALUE_ONE; } if (Precision == 0.01) { return CPDFMeasure.PRECISION_VALUE_TWO; } if (Precision == 0.001) { return CPDFMeasure.PRECISION_VALUE_THREE; } if (Precision == 0.0001) { return CPDFMeasure.PRECISION_VALUE_FOUR; } return 0; } private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { List allowKeys = new List() { Key.Delete, Key.Back, Key.Enter, Key.NumPad0, Key.NumPad1, Key.NumPad2, Key.NumPad3, Key.NumPad4, Key.NumPad5, Key.NumPad6, Key.NumPad7, Key.NumPad8, Key.NumPad9, Key.D0, Key.D1, Key.D2, Key.D3, Key.D4, Key.D5, Key.D6, Key.D7, Key.D8, Key.D9, Key.Left, Key.Right, Key.OemPeriod,Key.Decimal }; if (allowKeys.Contains(e.Key) == false) { e.Handled = true; } } private void TextBox_CanExecute(object sender, CanExecuteRoutedEventArgs e) { try { if (e.Command == ApplicationCommands.Paste && Clipboard.ContainsText()) { string checkText = Clipboard.GetText(); if (int.TryParse(checkText, out int value)) { e.CanExecute = true; } e.Handled = true; } } catch (Exception ex) { } } public void BindMeasureSetting(CPDFMeasureInfo measureInfo) { if(measureInfo == null) { return; } RulerBaseText.Text = measureInfo.RulerBase.ToString(); RulerTranslateText.Text = measureInfo.RulerTranslate.ToString(); RulerTranslateCombo.SelectedIndex = -1; RulerBaseUnitCombo.SelectedIndex = -1; PrecisionBox.SelectedIndex = -1; if (measureInfo.RulerBaseUnit == "in") { RulerBaseUnitCombo.SelectedIndex = 0; } if (measureInfo.RulerBaseUnit == "cm") { RulerBaseUnitCombo.SelectedIndex = 1; } if (measureInfo.RulerBaseUnit == "mm") { RulerBaseUnitCombo.SelectedIndex = 2; } for (int i = 0; i < RulerTranslateCombo.Items.Count; i++) { ComboBoxItem checkItem = RulerTranslateCombo.Items[i] as ComboBoxItem; if (checkItem != null && checkItem.Tag.ToString() == measureInfo.RulerTranslateUnit.ToString()) { RulerTranslateCombo.SelectedIndex = i; } } string precision = GetMeasureShowPrecision(measureInfo.Precision).ToString(); for (int i = 0; i < PrecisionBox.Items.Count; i++) { ComboBoxItem checkItem = PrecisionBox.Items[i] as ComboBoxItem; if (checkItem != null && checkItem.Content.ToString() == precision) { PrecisionBox.SelectedIndex = i; } } } //public void BindMeasureSetting(MeasureEventArgs measureEventArgs) //{ // if (measureEventArgs != null) // { // RulerBaseText.Text = measureEventArgs.RulerBase.ToString(); // RulerTranslateText.Text = measureEventArgs.RulerTranslate.ToString(); // RulerTranslateCombo.SelectedIndex = -1; // RulerBaseUnitCombo.SelectedIndex = -1; // PrecisionBox.SelectedIndex = -1; // if (measureEventArgs.RulerBaseUnit == "in") // { // RulerBaseUnitCombo.SelectedIndex = 0; // } // if (measureEventArgs.RulerBaseUnit == "cm") // { // RulerBaseUnitCombo.SelectedIndex = 1; // } // if (measureEventArgs.RulerBaseUnit == "mm") // { // RulerBaseUnitCombo.SelectedIndex = 2; // } // for (int i = 0; i < RulerTranslateCombo.Items.Count; i++) // { // ComboBoxItem checkItem = RulerTranslateCombo.Items[i] as ComboBoxItem; // if (checkItem != null && checkItem.Content.ToString() == measureEventArgs.RulerTranslateUnit.ToString()) // { // RulerTranslateCombo.SelectedIndex = i; // } // } // for (int i = 0; i < PrecisionBox.Items.Count; i++) // { // ComboBoxItem checkItem = PrecisionBox.Items[i] as ComboBoxItem; // if (checkItem != null && checkItem.Content.ToString() == ((decimal)measureEventArgs.Precision).ToString()) // { // PrecisionBox.SelectedIndex = i; // } // } // } //} public void SaveMeasureSetting(CPDFAnnotation annot) { MeasureSetting measureSetting = new MeasureSetting(); if (double.TryParse(RulerBaseText.Text, out double ruleBase)) { measureSetting.RulerBase = ruleBase; } if (RulerBaseUnitCombo.SelectedItem != null) { ComboBoxItem checkItem = RulerBaseUnitCombo.SelectedItem as ComboBoxItem; measureSetting.RulerBaseUnit = checkItem.Tag.ToString(); } if (double.TryParse(RulerTranslateText.Text, out double ruletranBase)) { measureSetting.RulerTranslate = ruletranBase; } if (RulerTranslateCombo.SelectedItem != null) { ComboBoxItem checkItem = RulerTranslateCombo.SelectedItem as ComboBoxItem; measureSetting.RulerTranslateUnit = checkItem.Tag.ToString(); } if (PrecisionBox.SelectedValue != null) { ComboBoxItem checkItem = PrecisionBox.SelectedValue as ComboBoxItem; if (double.TryParse(checkItem.Content.ToString(), out double precision)) { measureSetting.Precision = precision; } } measureSetting.IsShowArea = (bool)AreaCheckBox?.IsChecked; measureSetting.IsShowLength = (bool)LengthCheckBox?.IsChecked; UpdateAnnotWithSetting(annot, measureSetting); } private void UpdateAnnotWithSetting(CPDFAnnotation annot, MeasureSetting measureSetting) { if(annot is CPDFLineAnnotation lineAnnot) { if (lineAnnot.IsMersured()) { CPDFDistanceMeasure lineMeasure = lineAnnot.GetDistanceMeasure(); CPDFMeasureInfo info = lineMeasure.MeasureInfo; info.RulerBaseUnit = measureSetting.RulerBaseUnit; info.RulerBase = (float)measureSetting.RulerBase; info.RulerTranslateUnit = measureSetting.RulerTranslateUnit; info.RulerTranslate = (float)measureSetting.RulerTranslate; info.Precision = GetMeasureSavePrecision(measureSetting.Precision); lineAnnot.GetDistanceMeasure().SetMeasureInfo(info); lineAnnot.GetDistanceMeasure().SetMeasureScale(info.RulerBase, info.RulerBaseUnit, info.RulerTranslate, info.RulerTranslateUnit); lineAnnot.GetDistanceMeasure().UpdateAnnotMeasure(); lineAnnot.UpdateAp(); PdfViewControl.UpdateAnnotFrame(); } } else if(annot is CPDFPolylineAnnotation polylineAnnot) { if (polylineAnnot.IsMersured()) { CPDFPerimeterMeasure polylineMeasure = polylineAnnot.GetPerimeterMeasure(); CPDFMeasureInfo info = polylineMeasure.MeasureInfo; info.RulerBaseUnit = measureSetting.RulerBaseUnit; info.RulerBase = (float)measureSetting.RulerBase; info.RulerTranslateUnit = measureSetting.RulerTranslateUnit; info.RulerTranslate = (float)measureSetting.RulerTranslate; info.Precision = GetMeasureSavePrecision(measureSetting.Precision); polylineAnnot.GetPerimeterMeasure().SetMeasureInfo(info); polylineAnnot.GetPerimeterMeasure().SetMeasureScale(info.RulerBase, info.RulerBaseUnit, info.RulerTranslate, info.RulerTranslateUnit); polylineAnnot.GetPerimeterMeasure().UpdateAnnotMeasure(); polylineAnnot.UpdateAp(); PdfViewControl.UpdateAnnotFrame(); } } else if(annot is CPDFPolygonAnnotation areaAnnot) { if (areaAnnot.IsMersured()) { CPDFAreaMeasure areaMeasure = areaAnnot.GetAreaMeasure(); CPDFMeasureInfo info = areaMeasure.MeasureInfo; info.RulerBaseUnit = measureSetting.RulerBaseUnit; info.RulerBase = (float)measureSetting.RulerBase; info.RulerTranslateUnit = measureSetting.RulerTranslateUnit; info.RulerTranslate = (float)measureSetting.RulerTranslate; info.Precision = GetMeasureSavePrecision(measureSetting.Precision); info.CaptionType = CPDFCaptionType.CPDF_CAPTION_NONE; if (measureSetting.IsShowArea) { info.CaptionType |= CPDFCaptionType.CPDF_CAPTION_AREA; } if (measureSetting.IsShowLength) { info.CaptionType |= CPDFCaptionType.CPDF_CAPTION_LENGTH; } areaAnnot.GetAreaMeasure().SetMeasureInfo(info); areaAnnot.GetAreaMeasure().SetMeasureScale(info.RulerBase, info.RulerBaseUnit, info.RulerTranslate, info.RulerTranslateUnit); areaAnnot.GetAreaMeasure().UpdateAnnotMeasure(); areaAnnot.UpdateAp(); PdfViewControl.UpdateAnnotFrame(); } } } private double GetMeasureShowPrecision(int precision) { if (precision == CPDFMeasure.PRECISION_VALUE_ZERO) { return 1; } if (CPDFMeasure.PRECISION_VALUE_ONE == precision) { return 0.1; } if (CPDFMeasure.PRECISION_VALUE_TWO == precision) { return 0.01; } if (CPDFMeasure.PRECISION_VALUE_THREE == precision) { return 0.001; } if (CPDFMeasure.PRECISION_VALUE_FOUR == precision) { return 0.0001; } return 0; } public void ChangedCheckBoxIsChecked(bool Area, bool Lenght) { AreaCheckBox.IsChecked = Area; LengthCheckBox.IsChecked = Lenght; } } }