Browse Source

compdfkit(win) - MeasureSetting

weixiangjie 11 months ago
parent
commit
fdea281ffa

+ 26 - 2
Demo/Examples/Compdfkit_Tools/Measure/MeasureControl.xaml.cs

@@ -21,6 +21,7 @@ using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
 using System.Windows.Shapes;
 using ComPDFKit.Tool.Help;
+using ComPDFKit.Viewer.Annot;
 using ComPDFKitViewer.BaseObject;
 
 
@@ -37,6 +38,8 @@ namespace Compdfkit_Tools.Measure
         private PDFViewControl PdfViewControl = new PDFViewControl();
 
         private PanelState panelState = PanelState.GetInstance();
+        
+        private CPDFAnnotation currentAnnot = null;
 
         public event EventHandler ExpandEvent;
 
@@ -108,10 +111,11 @@ namespace Compdfkit_Tools.Measure
             if (baseAnnot != null)
             {
                 AnnotData annotData = baseAnnot.GetAnnotData();
-                AnnotParam annotParam = ParamConverter.CPDFDataConverterToMeasureAnnotParam(
+                AnnotParam annotParam = ParamConverter.CPDFDataConverterToAnnotParam(
                     PdfViewControl.GetCPDFViewer().GetDocument(), annotData.PageIndex, annotData.Annot);
                 measurePropertyControl.SetPropertyForMeasureCreate(annotParam, annotData.Annot, PdfViewControl);
                 SetMeasureInfoPanel(annotData.Annot, annotParam);
+                currentAnnot = annotData.Annot;
             }
 
             panelState.RightPanel = PanelState.RightPanelState.PropertyPanel;
@@ -412,7 +416,26 @@ namespace Compdfkit_Tools.Measure
             }
             SettingPanel.ReturnToInfoPanel = true;
             SetInfoPanelVisble(false, true);
-            SettingPanel.BindMeasureSetting();
+            AnnotParam annotParam = ParamConverter.CPDFDataConverterToAnnotParam(
+                PdfViewControl.GetCPDFViewer().GetDocument(), currentAnnot.Page.PageIndex, currentAnnot);
+            SettingPanel.BindMeasureSetting(GetMeasureInfoFromParam(annotParam));
+        }
+
+        private CPDFMeasureInfo GetMeasureInfoFromParam(AnnotParam param)
+        {
+            if(param is LineMeasureParam lineParam)
+            {
+                return lineParam.measureInfo;
+            }
+            if (param is PolyLineMeasureParam polyLineParam)
+            {
+                return polyLineParam.measureInfo;
+            }
+            if (param is PolygonMeasureParam polygonParam)
+            {
+                return polygonParam.measureInfo;
+            }
+            return null;
         }
 
         private void SettingPanel_CancelEvent(object sender, EventArgs e)
@@ -423,6 +446,7 @@ namespace Compdfkit_Tools.Measure
         private void SettingPanel_DoneEvent(object sender, EventArgs e)
         {
             SetInfoPanelVisble(SettingPanel.ReturnToInfoPanel, false);
+            SettingPanel.SaveMeasureSetting(currentAnnot);
         }
 
         public void SetInfoPanelVisble(bool measureInfo, bool measureSetting)

+ 1 - 1
Demo/Examples/Compdfkit_Tools/Measure/MeasureInfoPanel.xaml.cs

@@ -159,7 +159,7 @@ namespace Compdfkit_Tools.Measure
             Point startPoint = new Point(lineAnnot.Points[0].x, lineAnnot.Points[0].y);
             Point endPoint = new Point(lineAnnot.Points[1].x, lineAnnot.Points[1].y);
             Vector moveVector = endPoint - startPoint;
-            AnglePolyLineText.Text = ((int)Math.Abs(Vector.AngleBetween(moveVector, standVector))) + "°";
+            AngleText.Text = ((int)Math.Abs(Vector.AngleBetween(moveVector, standVector))) + "°";
             
             double showLength = lineMeasure.GetMeasurementResults(CPDFCaptionType.CPDF_CAPTION_LENGTH);
             XText.Text = ((int)Math.Abs(moveVector.X)).ToString();

+ 5 - 3
Demo/Examples/Compdfkit_Tools/Measure/MeasureSettingPanel.xaml

@@ -37,18 +37,20 @@
                 <TextBlock FontSize="14" Grid.Row="1" Margin="0,10,0,10" Text="{Binding Converter={StaticResource PropertyPanelResourceConverter}, ConverterParameter=Text_Dimensions}"></TextBlock>
                 <StackPanel Grid.Row="2" Orientation="Horizontal">
                     <TextBox Name="RulerBaseText" Width="110"  VerticalContentAlignment="Center" FontSize="14"
+                             Text="1"
                              InputMethod.IsInputMethodEnabled="False"
                              PreviewKeyDown="TextBox_PreviewKeyDown"
                              CommandManager.PreviewCanExecute="TextBox_CanExecute" MaxLength="6">
                         
                     </TextBox>
                     <ComboBox Name="RulerBaseUnitCombo" Width="110" FontSize="14" Margin="10,0,0,0" VerticalContentAlignment="Center">
-                        <ComboBoxItem Content="{Binding Converter={StaticResource PropertyPanelResourceConverter}, ConverterParameter=Scale_IN}"></ComboBoxItem>
-                        <ComboBoxItem IsSelected="True" Content="{Binding Converter={StaticResource PropertyPanelResourceConverter}, ConverterParameter=Scale_CM}"></ComboBoxItem>
-                        <ComboBoxItem Content="{Binding Converter={StaticResource PropertyPanelResourceConverter}, ConverterParameter=Scale_MM}"></ComboBoxItem>
+                        <ComboBoxItem Tag="in" Content="{Binding Converter={StaticResource PropertyPanelResourceConverter}, ConverterParameter=Scale_IN}"></ComboBoxItem>
+                        <ComboBoxItem Tag="cm" IsSelected="True" Content="{Binding Converter={StaticResource PropertyPanelResourceConverter}, ConverterParameter=Scale_CM}"></ComboBoxItem>
+                        <ComboBoxItem Tag="mm" Content="{Binding Converter={StaticResource PropertyPanelResourceConverter}, ConverterParameter=Scale_MM}"></ComboBoxItem>
                     </ComboBox>
                     <TextBlock FontSize="14" Margin="10,0,10,0">=</TextBlock>
                     <TextBox Name="RulerTranslateText" Width="110" FontSize="14" VerticalContentAlignment="Center"
+                             Text="1"
                              InputMethod.IsInputMethodEnabled="False"
                              PreviewKeyDown="TextBox_PreviewKeyDown"
                              CommandManager.PreviewCanExecute="TextBox_CanExecute" MaxLength="6">

+ 168 - 69
Demo/Examples/Compdfkit_Tools/Measure/MeasureSettingPanel.xaml.cs

@@ -6,6 +6,7 @@ using System.Collections.Generic;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Input;
+using ComPDFKit.Tool.SettingParam;
 
 
 namespace Compdfkit_Tools.Measure
@@ -340,47 +341,48 @@ namespace Compdfkit_Tools.Measure
             }
         }
 
-        public void BindMeasureSetting()
+        public void BindMeasureSetting(CPDFMeasureInfo measureInfo)
         {
-            //if (UpdateArgsList != null && UpdateArgsList.Count>0)
-            //{
-            //    return;
-            //}
-            //RulerBaseText.Text = MeasureSetting.RulerBase.ToString();
-            //RulerTranslateText.Text = MeasureSetting.RulerTranslate.ToString();
-            //RulerTranslateCombo.SelectedIndex = -1;
-            //RulerBaseUnitCombo.SelectedIndex = -1;
-            //PrecisionBox.SelectedIndex = -1;
-            //if (MeasureSetting.RulerBaseUnit == "in")
-            //{
-            //    RulerBaseUnitCombo.SelectedIndex = 0;
-            //}
-            //if (MeasureSetting.RulerBaseUnit == "cm")
-            //{
-            //    RulerBaseUnitCombo.SelectedIndex = 1;
-            //}
-            //if (MeasureSetting.RulerBaseUnit == "mm")
-            //{
-            //    RulerBaseUnitCombo.SelectedIndex = 2;
-            //}
+            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.Content.ToString() == MeasureSetting.RulerTranslateUnit.ToString())
-            //    {
-            //        RulerTranslateCombo.SelectedIndex = i;
-            //    }
-            //}
+            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;
+                }
+            }
 
-            //for (int i = 0; i < PrecisionBox.Items.Count; i++)
-            //{
-            //    ComboBoxItem checkItem = PrecisionBox.Items[i] as ComboBoxItem;
-            //    if (checkItem != null && checkItem.Content.ToString() == ((decimal)MeasureSetting.Precision).ToString())
-            //    {
-            //        PrecisionBox.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)
         //{
@@ -425,42 +427,139 @@ namespace Compdfkit_Tools.Measure
         //    }
         //}
 
-        //private void SaveMeasureSetting()
-        //{
-        //    if (double.TryParse(RulerBaseText.Text, out double ruleBase))
-        //    {
-        //        MeasureSetting.RulerBase = ruleBase;
-        //    }
+        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.Content.ToString();
-        //    }
+            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 (double.TryParse(RulerTranslateText.Text, out double ruletranBase))
+            {
+                measureSetting.RulerTranslate = ruletranBase;
+            }
 
-        //    if (RulerTranslateCombo.SelectedItem != null)
-        //    {
-        //        ComboBoxItem checkItem = RulerTranslateCombo.SelectedItem as ComboBoxItem;
-        //        MeasureSetting.RulerTranslateUnit = checkItem.Content.ToString();
-        //    }
+            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;
-        //        }
-        //    }
+            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;
-        //}
+            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)
         {