Browse Source

新增CAD导入点位功能,支持自定义起始编号

本次提交主要实现了“CAD导入点位”功能:
- DxfView界面新增导入点位起始编号输入及确认/取消按钮,支持本地化;
- DxfView.xaml.cs 增加 StartIndex 属性,记录用户输入的起始编号;
- PlcPointParamsViewModel 新增 ImportCadPointCommand,实现弹窗导入、编号处理及异常提示;
- PlcPointParams.xaml 增加“CAD导入点位”按钮;
- 修正部分命名空间引用及Y+按钮图标方向错误。

该功能提升了点位批量导入的效率和灵活性。
孝锋 徐 8 months ago
parent
commit
92e2669bb6

+ 47 - 4
TeamAAS-VM/DxfModule/DxfView.xaml

@@ -1,17 +1,25 @@
 <UserControl x:Class="TeamAAS_VP.DxfModule.DxfView"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
-             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
              xmlns:local="clr-namespace:TeamAAS_VP.DxfModule"
-             mc:Ignorable="d" 
-             d:DesignHeight="450" d:DesignWidth="800">
+             xmlns:lex="http://wpflocalizeextension.codeplex.com"
+             lex:LocalizeDictionary.DesignCulture="zh-CN"
+             lex:ResxLocalizationProvider.DefaultAssembly="TeamAAS-VP"
+             lex:ResxLocalizationProvider.DefaultDictionary="Lang"
+             
+             mc:Ignorable="d"
+             d:DesignHeight="450"
+             d:DesignWidth="800">
     <Grid>
         <Grid.RowDefinitions>
             <RowDefinition Height="Auto" />
             <RowDefinition Height="*" />
             <RowDefinition Height="Auto" />
             <RowDefinition Height="200" />
+            <RowDefinition Height="Auto" />
         </Grid.RowDefinitions>
 
         <!-- Toolbar -->
@@ -125,5 +133,40 @@
                 </ScrollViewer>
             </GroupBox>
         </Grid>
+
+        <StackPanel Grid.Row="4"
+                    Orientation="Horizontal"
+                    HorizontalAlignment="Left"
+                    Margin="10,5">
+            <TextBlock VerticalAlignment="Center"
+                       Text="提取的图形将添加到当前项目中." />
+            <TextBlock VerticalAlignment="Center"
+                       Margin="10,0,0,0"
+                       Text="要导入的点位表开始索引:" />
+            <materialDesign:NumericUpDown x:Name="TxtStartIndex"
+                     Width="100"
+                     Margin="5,0,0,0" ValueStep="1" Minimum="1" Maximum="999" ValueChanged="TxtStartIndex_ValueChanged" />
+        </StackPanel>
+
+        <StackPanel Grid.Row="4"
+                    Orientation="Horizontal"
+                    HorizontalAlignment="Right"
+                    Margin="0,18,0,0">
+            <Button 
+                    Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}"
+                    CommandParameter="{Binding ElementName=createpro,Path=DataContext}"
+                    IsDefault="True"
+                    Content="{lex:Loc 确定}"
+                    Margin="0,0,12,0" />
+
+            <Button Margin="0"
+                    Command="{x:Static materialDesign:DialogHost.CloseDialogCommand}"
+                    IsCancel="True"
+                    Content="{lex:Loc 取消}">
+                <Button.CommandParameter>
+                    <x:Null />
+                </Button.CommandParameter>
+            </Button>
+        </StackPanel>
     </Grid>
 </UserControl>

+ 8 - 0
TeamAAS-VM/DxfModule/DxfView.xaml.cs

@@ -59,6 +59,9 @@ namespace TeamAAS_VP.DxfModule
         }
         #endregion
 
+        //需要导入的点位表开始点编号
+        public int StartIndex { get;private set; } = 1;
+
 
         private void InitializeInteractionController()
         {
@@ -344,5 +347,10 @@ namespace TeamAAS_VP.DxfModule
         {
             TxtZoom.Text = $"缩放: {CanvasScaleTransform.ScaleX * 100:F0}%";
         }
+
+        private void TxtStartIndex_ValueChanged(object sender, RoutedPropertyChangedEventArgs<int> e)
+        {
+            StartIndex= e.NewValue;
+        }
     }
 }

+ 77 - 1
TeamAAS-VM/ViewModels/Product/PlcPointParamsViewModel.cs

@@ -1,4 +1,5 @@
-using Prism.Commands;
+using MaterialDesignThemes.Wpf;
+using Prism.Commands;
 using Prism.Events;
 using Prism.Ioc;
 using Prism.Mvvm;
@@ -11,6 +12,7 @@ using System.Linq;
 using System.Windows;
 using TeamAAS_VP.Core;
 using TeamAAS_VP.Core.PLCs;
+using TeamAAS_VP.DxfModule;
 using TeamAAS_VP.Enums;
 using TeamAAS_VP.Events;
 using TeamAAS_VP.Interfaces;
@@ -18,6 +20,7 @@ using TeamAAS_VP.Models;
 using TeamAAS_VP.Models.PLC;
 using TeamAAS_VP.Models.Robot;
 using TeamAAS_VP.Resources.Languages;
+using TeamAAS_VP.Views.Product;
 
 namespace TeamAAS_VP.ViewModels.Product
 {
@@ -214,7 +217,11 @@ namespace TeamAAS_VP.ViewModels.Product
         private DelegateCommand _MovePointDownCommand;
         public DelegateCommand MovePointDownCommand => _MovePointDownCommand ?? (_MovePointDownCommand = new DelegateCommand(ExecuteMovePointDownCommand, CanMovePointDown));
 
+        private DelegateCommand _ImportCadPointCommand;
+        public DelegateCommand ImportCadPointCommand =>
+            _ImportCadPointCommand ?? (_ImportCadPointCommand = new DelegateCommand(ExecuteImportCadPointCommand));
 
+        
         #endregion
 
         #region 事件
@@ -620,6 +627,75 @@ namespace TeamAAS_VP.ViewModels.Product
             _MovePointUpCommand?.RaiseCanExecuteChanged();
             _MovePointDownCommand?.RaiseCanExecuteChanged();
         }
+
+        /// <summary>
+        /// CAD导入点位
+        /// </summary>
+        async void ExecuteImportCadPointCommand()
+        {
+            try
+            {
+                var view = new DxfView();
+
+                //show the dialog
+                var result = await DialogHost.Show(view, "RootDialog", null, null, null);
+                if (result != null)
+                {
+                    var cadPoints = view.Points;
+                    if (cadPoints != null && cadPoints.Count > 0)
+                    {
+                        //要导入的开始点编号
+                        int startNumber = view.StartIndex;
+
+                        //弹窗提示用户是否确认要导入从该编号开始的点位,点位数量为cadPoints.Count
+                        if (MessageBox.Show($"确认要从点位编号 {startNumber} 开始导入 {cadPoints.Count} 个点位吗?", "导入点位", MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
+                        {
+                            return;
+                        }
+                        //导入点位
+                        for (int i = 0; i < cadPoints.Count; i++)
+                        {
+                            //如果点位编号已存在,则更新该点位,否则新增点位,只更新XY坐标
+                            var point = cadPoints[i];
+                            var existingPoint = Points.FirstOrDefault(p => p.Number == startNumber + i);
+                            if (existingPoint != null)
+                            {
+                                existingPoint.X_Position = point.X;
+                                existingPoint.Y_Position = point.Y;
+
+                            }
+                            else
+                            {
+                                Points.Add(new PlcPoint()
+                                {
+                                    Number = startNumber + i,
+                                    X_Position = point.X,
+                                    Y_Position = point.Y,
+                                    Z_Position_Start = 0,
+                                    U_Position = 0,
+                                    R_Position = 0
+                                });
+                            }
+                        }
+
+                        //对所有的点位重新编号,确保编号连续
+                        var sortedPoints = Points.OrderBy(p => p.Number).ToList();
+                        Points.Clear();
+                        for (int i = 0; i < sortedPoints.Count; i++)
+                        {
+                            sortedPoints[i].Number = i + 1;
+                            Points.Add(sortedPoints[i]);
+                        }
+                        _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 0.4 });
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLogError("导入CAD点位时出错!", ex);
+                _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = ex.Message, Duration = 1 });
+            }
+        }
         #endregion
 
         #region 继承

+ 5 - 1
TeamAAS-VM/Views/Product/PlcPointParams.xaml

@@ -240,6 +240,10 @@
                                     Margin="5,2"
                                     MinWidth="80"
                                     Command="{Binding MovePointDownCommand}" />
+                            <Button Content="CAD导入点位"
+                                    Margin="5,2"
+                                    MinWidth="80"
+                                    Command="{Binding ImportCadPointCommand}" />
                         </StackPanel>
                         <DataGrid x:Name="dgPoints"
                                   AutoGenerateColumns="False"
@@ -808,7 +812,7 @@
                                         Command="{Binding DataContext.JogCommand,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
                                         CommandParameter="{Binding ElementName=txtDistance,Path=Value,Converter={StaticResource JogConverter}, ConverterParameter=Y+}">
                                     <StackPanel Orientation="Vertical">
-                                        <materialDesign:PackIcon Kind="ArrowBottomBold"
+                                        <materialDesign:PackIcon Kind="ArrowTopBold"
                                                                  Width="26"
                                                                  Height="26" />
                                         <TextBlock Text="+Y"