Browse Source

compdfkit(win) - 测量Demo 更换为弹窗

liyuxuan 1 year ago
parent
commit
a9dae5eddb

+ 7 - 0
Demo/Examples/Compdfkit_Tools/Compdfkit_Tools.csproj

@@ -332,6 +332,9 @@
     <Compile Include="Measure\MeasurePropertyControl.xaml.cs">
       <DependentUpon>MeasurePropertyControl.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Measure\MeasureSettingDialog.xaml.cs">
+      <DependentUpon>MeasureSettingDialog.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Measure\MeasureSettingPanel.xaml.cs">
       <DependentUpon>MeasureSettingPanel.xaml</DependentUpon>
     </Compile>
@@ -850,6 +853,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Measure\MeasureSettingDialog.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
     <Page Include="Measure\MeasureSettingPanel.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 0 - 7
Demo/Examples/Compdfkit_Tools/Measure/MeasureControl.xaml

@@ -58,13 +58,6 @@
                 <local:MeasureInfoPanel x:Name="InfoPanel" Width="300" HorizontalAlignment="Right" Margin="0,20,30,0"
                                         Visibility="Collapsed" VerticalAlignment="Top" 
                                         SettingClick="MeasureInfoPanel_SettingClick"></local:MeasureInfoPanel>
-
-                <local:MeasureSettingPanel x:Name="SettingPanel" HorizontalAlignment="Center" VerticalAlignment="Center" 
-                                           Visibility="Collapsed"
-                                           CancelEvent="SettingPanel_CancelEvent"
-                                           DoneEvent="SettingPanel_DoneEvent">
-                    
-                </local:MeasureSettingPanel>
             </Grid>
             <Border Grid.Column="3" Name="PropertyContainer" Grid.Row="1" Visibility="Collapsed" ></Border>
             <cpdfcommon:PageNumberControl  Grid.Column="2" Grid.Row="1" x:Name="FloatPageTool" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,20"></cpdfcommon:PageNumberControl>

+ 10 - 0
Demo/Examples/Compdfkit_Tools/Measure/MeasureControl.xaml.cs

@@ -32,6 +32,7 @@ namespace Compdfkit_Tools.Measure
     public partial class MeasureControl : UserControl
     {
         public MeasurePropertyControl measurePropertyControl = new MeasurePropertyControl();
+        public MeasureSettingDialog SettingPanel = new MeasureSettingDialog();
         private CPDFDisplaySettingsControl displaySettingsControl;
 
         private PDFViewControl PdfViewControl = new PDFViewControl();
@@ -44,6 +45,10 @@ namespace Compdfkit_Tools.Measure
         {
             InitializeComponent();
             MeasureSetting.MeasureChanged += MeasureSetting_MeasureChanged;
+            SettingPanel.CancelEvent -= SettingPanel_CancelEvent;
+            SettingPanel.DoneEvent -= SettingPanel_DoneEvent;
+            SettingPanel.CancelEvent += SettingPanel_CancelEvent;
+            SettingPanel.DoneEvent += SettingPanel_DoneEvent;
         }
 
         private void MeasureSetting_MeasureChanged(object sender, MeasureEventArgs e)
@@ -505,6 +510,11 @@ namespace Compdfkit_Tools.Measure
             }
             InfoPanel.Visibility = measureInfo ? Visibility.Visible : Visibility.Collapsed;
             SettingPanel.Visibility = measureSetting ? Visibility.Visible : Visibility.Collapsed;
+            if(SettingPanel.Visibility == Visibility.Visible)
+            {
+                SettingPanel.Owner=Window.GetWindow(this);
+                SettingPanel.ShowDialog();
+            }
         }
 
         public void SetMeasureInfoType(CPDFMeasureType measureType)

+ 100 - 0
Demo/Examples/Compdfkit_Tools/Measure/MeasureSettingDialog.xaml

@@ -0,0 +1,100 @@
+<Window x:Class="Compdfkit_Tools.Measure.MeasureSettingDialog"
+        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+        xmlns:local="clr-namespace:Compdfkit_Tools.Measure"
+        mc:Ignorable="d"
+        Title="MeasureSettingDialog" Height="350" Width="530" WindowStyle="None" WindowStartupLocation="CenterOwner"
+        ShowInTaskbar="False">
+    <Grid>
+        <Border BorderBrush="LightGray" CornerRadius="4" Background="White" Width="530" Height="350">
+            <Border.Effect>
+                <DropShadowEffect BlurRadius="20" ShadowDepth="0" Color="Black" Opacity="0.4"/>
+            </Border.Effect>
+
+            <Grid Margin="20">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="auto"></RowDefinition>
+                    <RowDefinition Height="auto"></RowDefinition>
+                    <RowDefinition Height="auto"></RowDefinition>
+                    <RowDefinition Height="auto"></RowDefinition>
+                    <RowDefinition Height="auto"></RowDefinition>
+                </Grid.RowDefinitions>
+                <TextBlock FontSize="16">Settings</TextBlock>
+
+                <Grid Grid.Row="1" Margin="0,20,0,0">
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="auto"></RowDefinition>
+                        <RowDefinition Height="auto"></RowDefinition>
+                        <RowDefinition Height="auto"></RowDefinition>
+                        <RowDefinition Height="auto"></RowDefinition>
+                        <RowDefinition Height="auto"></RowDefinition>
+                    </Grid.RowDefinitions>
+                    <TextBlock FontSize="14" FontWeight="Bold">Custom Scale</TextBlock>
+                    <TextBlock FontSize="14" Grid.Row="1" Margin="0,10,0,10">Drawing dimensions: Actual size</TextBlock>
+                    <StackPanel Grid.Row="2" Orientation="Horizontal">
+                        <TextBox Name="RulerBaseText" Width="110"  VerticalContentAlignment="Center" FontSize="14"
+                         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>in</ComboBoxItem>
+                            <ComboBoxItem IsSelected="True">cm</ComboBoxItem>
+                            <ComboBoxItem>mm</ComboBoxItem>
+                        </ComboBox>
+                        <TextBlock FontSize="14" Margin="10,0,10,0">=</TextBlock>
+                        <TextBox Name="RulerTranslateText" Width="110" FontSize="14" VerticalContentAlignment="Center"
+                         InputMethod.IsInputMethodEnabled="False"
+                         PreviewKeyDown="TextBox_PreviewKeyDown"
+                         CommandManager.PreviewCanExecute="TextBox_CanExecute" MaxLength="6">
+
+                        </TextBox>
+                        <ComboBox Name="RulerTranslateCombo" Width="110" FontSize="14" Margin="10,0,0,0" VerticalContentAlignment="Center">
+                            <ComboBoxItem>pt</ComboBoxItem>
+                            <ComboBoxItem IsSelected="True">cm</ComboBoxItem>
+                            <ComboBoxItem>in</ComboBoxItem>
+                            <ComboBoxItem>mm</ComboBoxItem>
+                            <ComboBoxItem>m</ComboBoxItem>
+                            <ComboBoxItem>km</ComboBoxItem>
+                            <ComboBoxItem>ft</ComboBoxItem>
+                            <ComboBoxItem>yd</ComboBoxItem>
+                            <ComboBoxItem>mi</ComboBoxItem>
+                        </ComboBox>
+                    </StackPanel>
+                    <TextBlock Grid.Row="3" Margin="0,10,0,10" FontSize="14">
+                Precision
+                    </TextBlock>
+                    <ComboBox Name="PrecisionBox" Grid.Row="4" Width="110" HorizontalAlignment="Left">
+                        <ComboBoxItem>1</ComboBoxItem>
+                        <ComboBoxItem >0.1</ComboBoxItem>
+                        <ComboBoxItem IsSelected="True">0.01</ComboBoxItem>
+                        <ComboBoxItem>0.001</ComboBoxItem>
+                        <ComboBoxItem>0.0001</ComboBoxItem>
+                    </ComboBox>
+                </Grid>
+
+                <Separator Grid.Row="2" Margin="0,10,0,10"></Separator>
+
+                <Grid Grid.Row="3" >
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="auto"></RowDefinition>
+                        <RowDefinition Height="auto"></RowDefinition>
+                        <RowDefinition Height="auto"></RowDefinition>
+                    </Grid.RowDefinitions>
+
+                    <TextBlock FontSize="14" >Show Caption</TextBlock>
+                    <CheckBox x:Name="LengthCheckBox" IsChecked="True" Grid.Row="1" Margin="0,10,0,10" FontSize="14">Length</CheckBox>
+                    <CheckBox x:Name="AreaCheckBox" IsChecked="True" Grid.Row="2" FontSize="14">Area</CheckBox>
+                </Grid>
+
+                <StackPanel Grid.Row="4" HorizontalAlignment="Right" Orientation="Horizontal">
+                    <Button Width="110" Height="32" Click="ButtonCancel_Click">Cancel</Button>
+                    <Button Width="110" Height="32" Click="ButtonDone_Click" Margin="10,0,0,0">Done</Button>
+                </StackPanel>
+            </Grid>
+        </Border>
+    </Grid>
+</Window>

+ 280 - 0
Demo/Examples/Compdfkit_Tools/Measure/MeasureSettingDialog.xaml.cs

@@ -0,0 +1,280 @@
+using ComPDFKit.Measure;
+using ComPDFKit.PDFAnnotation;
+using ComPDFKitViewer.AnnotEvent;
+using ComPDFKitViewer.PdfViewer;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace Compdfkit_Tools.Measure
+{
+    /// <summary>
+    /// MeasureSettingDialog.xaml 的交互逻辑
+    /// </summary>
+    public partial class MeasureSettingDialog : Window
+    {
+        public MeasureSettingDialog()
+        {
+            InitializeComponent();
+        }
+
+        public event EventHandler CancelEvent;
+        public event EventHandler DoneEvent;
+
+        public bool ReturnToInfoPanel { get; set; }
+
+        public List<AnnotHandlerEventArgs> UpdateArgsList { get; set; } = new List<AnnotHandlerEventArgs>();
+
+        private void ButtonCancel_Click(object sender, RoutedEventArgs e)
+        {
+            if (UpdateArgsList != null && UpdateArgsList.Count > 0)
+            {
+                ReturnToInfoPanel = false;
+            }
+            UpdateArgsList?.Clear();
+            CancelEvent?.Invoke(this, e);
+            ReturnToInfoPanel = false;
+        }
+
+        private void ButtonDone_Click(object sender, RoutedEventArgs e)
+        {
+            SaveMeasureSetting();
+            if (UpdateArgsList != null && UpdateArgsList.Count > 0)
+            {
+                List<AnnotArgsType> allowTypeList = new List<AnnotArgsType>()
+                {
+                    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;
+                                        measureInfo.Precision = MeasureSetting.GetMeasureSavePrecision();
+                                        measureInfo.RulerBase = (float)MeasureSetting.RulerBase;
+                                        measureInfo.RulerBaseUnit = MeasureSetting.RulerBaseUnit;
+                                        measureInfo.RulerTranslate = (float)MeasureSetting.RulerTranslate;
+                                        measureInfo.RulerTranslateUnit = MeasureSetting.RulerTranslateUnit;
+                                        lineMeasure.SetMeasureInfo(measureInfo);
+                                        lineMeasure.SetMeasureScale(
+                                            measureInfo.RulerBase,
+                                            measureInfo.RulerBaseUnit,
+                                            measureInfo.RulerTranslate,
+                                            measureInfo.RulerTranslateUnit);
+                                        lineMeasure.UpdateAnnotMeasure();
+                                        lineAnnot.UpdateAp();
+                                        args.Draw();
+                                    }
+                                }
+                                break;
+                            case C_ANNOTATION_TYPE.C_ANNOTATION_POLYLINE:
+                                {
+                                    CPDFPolylineAnnotation polylineAnnot = (CPDFPolylineAnnotation)pdfAnnot;
+                                    if (polylineAnnot.IsMersured())
+                                    {
+                                        CPDFPerimeterMeasure polylineMeasure = polylineAnnot.GetPerimeterMeasure();
+                                        CPDFMeasureInfo measureInfo = polylineMeasure.MeasureInfo;
+                                        measureInfo.Precision = MeasureSetting.GetMeasureSavePrecision();
+                                        measureInfo.RulerBase = (float)MeasureSetting.RulerBase;
+                                        measureInfo.RulerBaseUnit = MeasureSetting.RulerBaseUnit;
+                                        measureInfo.RulerTranslate = (float)MeasureSetting.RulerTranslate;
+                                        measureInfo.RulerTranslateUnit = MeasureSetting.RulerTranslateUnit;
+                                        polylineMeasure.SetMeasureInfo(measureInfo);
+                                        polylineMeasure.SetMeasureScale(
+                                            measureInfo.RulerBase,
+                                            measureInfo.RulerBaseUnit,
+                                            measureInfo.RulerTranslate,
+                                            measureInfo.RulerTranslateUnit);
+                                        polylineMeasure.UpdateAnnotMeasure();
+                                        polylineAnnot.UpdateAp();
+                                        args.Draw();
+                                    }
+                                }
+                                break;
+                            case C_ANNOTATION_TYPE.C_ANNOTATION_POLYGON:
+                                {
+                                    CPDFPolygonAnnotation areaAnnot = (CPDFPolygonAnnotation)pdfAnnot;
+                                    if (areaAnnot.IsMersured())
+                                    {
+                                        CPDFAreaMeasure areaMeasure = areaAnnot.GetAreaMeasure();
+                                        CPDFMeasureInfo measureInfo = areaMeasure.MeasureInfo;
+                                        measureInfo.Precision = MeasureSetting.GetMeasureSavePrecision();
+                                        measureInfo.RulerBase = (float)MeasureSetting.RulerBase;
+                                        measureInfo.RulerBaseUnit = MeasureSetting.RulerBaseUnit;
+                                        measureInfo.RulerTranslate = (float)MeasureSetting.RulerTranslate;
+                                        measureInfo.RulerTranslateUnit = MeasureSetting.RulerTranslateUnit;
+
+                                        measureInfo.CaptionType = CPDFCaptionType.CPDF_CAPTION_NONE;
+                                        if (MeasureSetting.IsShowArea)
+                                        {
+                                            measureInfo.CaptionType |= CPDFCaptionType.CPDF_CAPTION_AREA;
+                                        }
+                                        if (MeasureSetting.IsShowLength)
+                                        {
+                                            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();
+                                    }
+                                }
+                                break;
+                            default:
+                                break;
+                        }
+                    }
+                }
+                ReturnToInfoPanel = false;
+            }
+            UpdateArgsList?.Clear();
+            DoneEvent?.Invoke(this, e);
+            ReturnToInfoPanel = false;
+        }
+
+        private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
+        {
+            List<Key> allowKeys = new List<Key>()
+            {
+                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()
+        {
+            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;
+            }
+
+            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 < PrecisionBox.Items.Count; i++)
+            {
+                ComboBoxItem checkItem = PrecisionBox.Items[i] as ComboBoxItem;
+                if (checkItem != null && checkItem.Content.ToString() == ((decimal)MeasureSetting.Precision).ToString())
+                {
+                    PrecisionBox.SelectedIndex = i;
+                }
+            }
+        }
+
+        private void SaveMeasureSetting()
+        {
+            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 (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 (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;
+        }
+
+        public void ChangedCheckBoxIsChecked(bool Area, bool Lenght)
+        {
+            AreaCheckBox.IsChecked = Area;
+            LengthCheckBox.IsChecked = Lenght;
+        }
+    }
+}