105040 从3D中抓取多芯线数据

This commit is contained in:
lihanbo 2024-11-13 13:39:06 +08:00
parent 5bc1533d9b
commit 1d394780a7
20 changed files with 1340 additions and 326 deletions

View File

@ -234,12 +234,14 @@ namespace Sinvo.EplanHpD.Plugin.Test
var stuffedData = new StuffedDataModel var stuffedData = new StuffedDataModel
{ {
Imprint = "D-PE1231231", Imprint = "D-PE1231231",
WireModel = "黄绿色RV0.5-CE定制", WireModel = "黄绿色RV1.0-CE定制",
FrontTerminalModel = "C45-1.5-CE定制", FrontTerminalModel = "RNB1.25-4-CE定制",
FrontTerminalMaterialCode = "42020100000792",
RearTerminalModel = "RNB2-5-CE定制", RearTerminalModel = "RNB2-5-CE定制",
RearTerminalMaterialCode = "42013500000756"
}; };
vm.CheckTerminals(stuffedData); vm.CheckTerminals(stuffedData);
Assert.IsFalse(!stuffedData.IsError); Assert.IsFalse(stuffedData.IsError);
} }

View File

@ -8,11 +8,13 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:util="clr-namespace:Sinvo.EplanHpD.Plugin.WPFUI.Utils" xmlns:util="clr-namespace:Sinvo.EplanHpD.Plugin.WPFUI.Utils"
xmlns:viewmodel="clr-namespace:Sinvo.EplanHpD.Plugin.WPFUI.ViewModel" xmlns:viewmodel="clr-namespace:Sinvo.EplanHpD.Plugin.WPFUI.ViewModel"
Title="LectotypeWindow" Title="多芯线数据抓取"
Width="800" Width="1600"
Height="450" Height="800"
d:DataContext="{d:DesignInstance Type=viewmodel:LectotypeViewModel}" d:DataContext="{d:DesignInstance Type=viewmodel:LectotypeViewModel}"
Closed="Window_Closed"
Loaded="Window_Loaded" Loaded="Window_Loaded"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d"> mc:Ignorable="d">
<Window.Resources> <Window.Resources>
<ResourceDictionary> <ResourceDictionary>
@ -20,7 +22,7 @@
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml" /> <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml" />
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml" /> <ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml" />
</ResourceDictionary.MergedDictionaries> </ResourceDictionary.MergedDictionaries>
<CollectionViewSource x:Key="LettotypeData" Source="{Binding Wires}"> <CollectionViewSource x:Key="LettotypeData" Source="{Binding Wires, IsAsync=True}">
<CollectionViewSource.GroupDescriptions> <CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="AxisNo" /> <PropertyGroupDescription PropertyName="AxisNo" />
</CollectionViewSource.GroupDescriptions> </CollectionViewSource.GroupDescriptions>
@ -84,36 +86,85 @@
</DataTemplate> </DataTemplate>
</util:LectotypeLengthDataTemplateSelector.ComplexLineTemplate> </util:LectotypeLengthDataTemplateSelector.ComplexLineTemplate>
</util:LectotypeLengthDataTemplateSelector> </util:LectotypeLengthDataTemplateSelector>
<DataTemplate x:Key="LoadingMask">
<Grid Background="#66424242">
<StackPanel
HorizontalAlignment="Center"
VerticalAlignment="Center"
Orientation="Vertical">
<TextBlock
HorizontalAlignment="Center"
FontSize="16"
Text="加载中..." />
<ProgressBar
Width="200"
Height="10"
IsIndeterminate="True" />
</StackPanel>
</Grid>
</DataTemplate>
</ResourceDictionary> </ResourceDictionary>
</Window.Resources> </Window.Resources>
<Grid> <Grid>
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="50" /> <RowDefinition Height="80" />
<RowDefinition Height="*" /> <RowDefinition Height="*" />
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Button <ContentPresenter
x:Name="LoadingMask"
Grid.Row="0" Grid.Row="0"
Height="100" Grid.RowSpan="2"
Click="Button_Click" Panel.ZIndex="99"
Content="Reload" /> Content="{Binding}"
<hc:TabControl Grid.Row="1"> ContentTemplate="{StaticResource LoadingMask}" />
<hc:TabItem Header="整理后的数据"> <hc:Card Grid.Row="0">
<ListView <hc:SimpleStackPanel Orientation="Horizontal">
<Button
Margin="5"
Click="Button_Click"
Content="刷新数据"
Style="{StaticResource ButtonPrimary}" />
<Button
Margin="5"
Click="Button_Click"
Content="导出下单表"
Style="{StaticResource ButtonPrimary}" />
</hc:SimpleStackPanel>
</hc:Card>
<TabControl Grid.Row="1">
<TabItem Header="整理后的数据">
<DataGrid
x:Name="LettotypeListView" x:Name="LettotypeListView"
hc:DataGridAttach.ShowRowNumber="True" AutoGenerateColumns="False"
ItemsSource="{Binding Source={StaticResource LettotypeData}}" ItemsSource="{Binding Source={StaticResource LettotypeData}, IsAsync=True}"
ScrollViewer.CanContentScroll="True" RowDetailsVisibilityChanged="LettotypeListView_RowDetailsVisibilityChanged"
RowDetailsVisibilityMode="{Binding DetailsShowMode}"
ScrollViewer.CanContentScroll="False"
SelectedItem="{Binding SelectedItem}"
SelectionMode="Single" SelectionMode="Single"
VirtualizingPanel.IsContainerVirtualizable="True" VirtualizingPanel.IsContainerVirtualizable="True"
VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.ScrollUnit="Pixel"
VirtualizingPanel.VirtualizationMode="Recycling"> VirtualizingPanel.VirtualizationMode="Recycling">
<ListView.ContextMenu> <DataGrid.Resources>
<Style BasedOn="{StaticResource DataGridCellStyle}" TargetType="DataGridCell">
<Setter Property="Height" Value="Auto" />
<Setter Property="MaxHeight" Value="9999" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Click="ToSourceMenuItem_Click" Header="在3D中查看转至源" /> <MenuItem Click="ToSourceMenuItem_Click" Header="在3D中查看转至源" />
</ContextMenu> </ContextMenu>
</ListView.ContextMenu> </DataGrid.ContextMenu>
<ListView.ItemContainerStyle> <DataGrid.RowStyle>
<Style BasedOn="{StaticResource ListViewItemBaseStyle}" TargetType="ListViewItem"> <Style BasedOn="{StaticResource DataGridRowStyle}" TargetType="DataGridRow">
<Style.Triggers> <Style.Triggers>
<DataTrigger Binding="{Binding IsError}" Value="True"> <DataTrigger Binding="{Binding IsError}" Value="True">
<Setter Property="Background" Value="#dc4d41" /> <Setter Property="Background" Value="#dc4d41" />
@ -123,11 +174,53 @@
<Setter Property="Foreground" Value="White" /> <Setter Property="Foreground" Value="White" />
<Setter Property="Background" Value="#326cf3" /> <Setter Property="Background" Value="#326cf3" />
</Trigger> </Trigger>
<DataTrigger Binding="{Binding CurrentLine}" Value="1">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridRow">
<SelectiveScrollingGrid>
<SelectiveScrollingGrid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</SelectiveScrollingGrid.ColumnDefinitions>
<SelectiveScrollingGrid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</SelectiveScrollingGrid.RowDefinitions>
<Border
x:Name="DGR_Border"
Grid.ColumnSpan="2"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="0,0,4,4"
SnapsToDevicePixels="True" />
<DataGridCellsPresenter
Grid.Row="0"
Grid.Column="1"
MinHeight="{TemplateBinding MinHeight}"
VerticalContentAlignment="Center"
ItemsPanel="{TemplateBinding ItemsPanel}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<DataGridDetailsPresenter
Grid.Row="1"
Grid.Column="1"
SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}"
Visibility="{TemplateBinding DetailsVisibility}" />
<DataGridRowHeader
Grid.Row="0"
Grid.Column="0"
SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical"
Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
</SelectiveScrollingGrid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
</ListView.ItemContainerStyle> </DataGrid.RowStyle>
<ListView.GroupStyle> <DataGrid.GroupStyle>
<!-- Style for groups at top level. -->
<GroupStyle> <GroupStyle>
<GroupStyle.ContainerStyle> <GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}"> <Style TargetType="{x:Type GroupItem}">
@ -141,27 +234,24 @@
BorderThickness="1,1,1,5" BorderThickness="1,1,1,5"
Foreground="#FFEEEEEE" Foreground="#FFEEEEEE"
IsExpanded="True"> IsExpanded="True">
<Expander.Resources>
<Style BasedOn="{StaticResource {x:Type Expander}}" TargetType="Expander">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Name}" Value="{x:Null}">
<Setter Property="Background" Value="#dc4d41" />
</DataTrigger>
</Style.Triggers>
</Style>
</Expander.Resources>
<Expander.Header> <Expander.Header>
<DockPanel> <DockPanel>
<TextBlock <TextBlock
Width="100" Width="100"
Margin="5,0,0,0" Margin="5,0,0,0"
FontWeight="Bold" FontWeight="Bold"
Text="{Binding Path=Name}" /> Text="{Binding Path=Name, StringFormat=轴号:{0}}" />
<TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}" /> <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount, StringFormat=线总数量:{0}}" />
</DockPanel> </DockPanel>
</Expander.Header> </Expander.Header>
<ItemsPresenter /> <Grid>
<Border
Padding="5,0,0,0"
BorderBrush="Gray"
BorderThickness="2,0,0,0">
<ItemsPresenter />
</Border>
</Grid>
</Expander> </Expander>
</ControlTemplate> </ControlTemplate>
</Setter.Value> </Setter.Value>
@ -169,32 +259,182 @@
</Style> </Style>
</GroupStyle.ContainerStyle> </GroupStyle.ContainerStyle>
</GroupStyle> </GroupStyle>
</ListView.GroupStyle> </DataGrid.GroupStyle>
<ListView.View> <DataGrid.Columns>
<GridView> <DataGridTemplateColumn MaxWidth="230" Header="名称">
<GridViewColumn DisplayMemberBinding="{Binding Name}" Header="名称" /> <DataGridTemplateColumn.CellTemplate>
<GridViewColumn DisplayMemberBinding="{Binding CableName}" Header="线材名称" /> <DataTemplate>
<GridViewColumn DisplayMemberBinding="{Binding AxisNo}" Header="轴号" /> <TextBlock Text="{Binding Name}" TextWrapping="Wrap" />
<GridViewColumn DisplayMemberBinding="{Binding DrawingNo}" Header="图号" /> </DataTemplate>
<GridViewColumn DisplayMemberBinding="{Binding CurrentLine}" Header="当前段号" /> </DataGridTemplateColumn.CellTemplate>
<GridViewColumn DisplayMemberBinding="{Binding LineCount}" Header="总段数" /> </DataGridTemplateColumn>
<GridViewColumn CellTemplateSelector="{StaticResource LectotypeLengthDataTemplateSelector}" Header="长度" /> <DataGridTextColumn Binding="{Binding CableName}" Header="线材名称" />
<GridViewColumn Header="是否高柔"> <DataGridTextColumn Binding="{Binding AxisNo}" Header="轴号" />
<GridViewColumn.CellTemplate> <DataGridTextColumn Binding="{Binding Motor.MotorModelStr}" Header="电机型号" />
<DataTemplate> <!--<DataGridComboBoxColumn MinWidth="200" Header="驱动器">
<CheckBox IsChecked="{Binding IsFlexibility}" IsEnabled="False" /> <DataGridComboBoxColumn.EditingElementStyle>
</DataTemplate> <Style BasedOn="{StaticResource {x:Type ComboBox}}" TargetType="ComboBox">
</GridViewColumn.CellTemplate> <Setter Property="ItemsSource" Value="{Binding Path=DataContext.Drivers}" />
</GridViewColumn> <Setter Property="DisplayMemberPath" Value="." />
<GridViewColumn DisplayMemberBinding="{Binding CableType}" Header="线材类型" /> <Setter Property="SelectedValuePath" Value="." />
<GridViewColumn DisplayMemberBinding="{Binding CableConnectionClass}" Header="线材连接方式" /> <Setter Property="MinWidth" Value="200" />
<GridViewColumn DisplayMemberBinding="{Binding CheckedMsg}" Header="异常信息" /> </Style>
</GridView> </DataGridComboBoxColumn.EditingElementStyle>
</ListView.View> </DataGridComboBoxColumn>-->
</ListView> <DataGridTextColumn Binding="{Binding CableModelNo}" Header="图号" />
<DataGridTextColumn
MinWidth="200"
Binding="{Binding DrawingNo}"
Header="线材型号" />
<DataGridTextColumn Binding="{Binding CurrentLine}" Header="当前段号" />
<DataGridTextColumn Binding="{Binding LineCount}" Header="总段数" />
<DataGridTemplateColumn CellTemplateSelector="{StaticResource LectotypeLengthDataTemplateSelector}" Header="长度" />
<DataGridTemplateColumn Header="是否高柔">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox
HorizontalAlignment="Center"
VerticalAlignment="Center"
Checked="CheckBox_Checked"
Click="CheckBox_Click"
IsChecked="{Binding IsFlexibility, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="True"
Unchecked="CheckBox_Unchecked" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding CableType}" Header="线材类型" />
<DataGridTextColumn Binding="{Binding CableConnectionClass}" Header="线材连接方式" />
<DataGridTextColumn Binding="{Binding CheckedMsg}" Header="异常信息" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button
Margin="10"
Content="查看图纸"
Style="{StaticResource ButtonPrimary}"
Tag="{Binding DrawingNo}" />
<Button
Margin="10"
Content="查看BOM"
Style="{StaticResource ButtonPrimary}"
Tag="{Binding DrawingNo}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid
Width="Auto"
Height="Auto"
MinHeight="100"
Margin="40,0,0,0"
AutoGenerateColumns="False"
BorderBrush="Gray"
BorderThickness="2,0,0,0"
HeadersVisibility="Column"
IsReadOnly="True"
ScrollViewer.VerticalScrollBarVisibility="Auto"
SelectionChanged="SubDetailsDataGrid_SelectionChanged"
SelectionUnit="FullRow">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Click="SubToSourceMenuItem_Click" Header="在3D中查看转至源" />
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Resources>
<Style
x:Key="DataGridCheckBoxCellStyle"
BasedOn="{StaticResource {x:Type DataGridCell}}"
TargetType="DataGridCell">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="Foreground" Value="Black" />
</Style>
</DataGrid.Resources>
<DataGrid.RowStyle>
<Style BasedOn="{StaticResource DataGridRowStyle}" TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#aa326cf3" />
<Setter Property="Foreground" Value="Black" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.ColumnHeaderStyle>
<Style BasedOn="{StaticResource DataGridColumnHeaderStyle}" TargetType="DataGridColumnHeader">
<Setter Property="MinHeight" Value="35" />
<Setter Property="Margin" Value="0" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" Header="名称" />
<DataGridTextColumn Binding="{Binding CableName}" Header="线材名称" />
<DataGridTextColumn Binding="{Binding AxisNo}" Header="轴号" />
<DataGridTextColumn Binding="{Binding Length}" Header="长度" />
<DataGridTextColumn Binding="{Binding CableType}" Header="线材类型" />
<DataGridTextColumn Binding="{Binding CableConnectionClass}" Header="线材连接方式" />
</hc:TabItem> </DataGrid.Columns>
</hc:TabControl> </DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</TabItem>
<TabItem Header="电机数据">
<DataGrid
x:Name="MotorDataGrid"
AutoGenerateColumns="False"
IsReadOnly="False"
ItemsSource="{Binding Motors}">
<DataGrid.Resources>
<Style BasedOn="{StaticResource DataGridCellStyle}" TargetType="DataGridCell">
<Setter Property="Height" Value="Auto" />
<Setter Property="MaxHeight" Value="9999" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.RowStyle>
<Style BasedOn="{StaticResource DataGridRowStyle}" TargetType="DataGridRow">
<Style.Triggers>
<DataTrigger Binding="{Binding IsError}" Value="True">
<Setter Property="Background" Value="#dc4d41" />
<Setter Property="Foreground" Value="White" />
</DataTrigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="White" />
<Setter Property="Background" Value="#326cf3" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn
Width="160"
Binding="{Binding MotorModelStr}"
Header="电机型号" />
<DataGridTextColumn
Width="160"
Binding="{Binding MotorPower}"
Header="电机功率" />
<DataGridTextColumn
Width="160"
Binding="{Binding AxisNo}"
Header="轴号" />
<DataGridTextColumn Binding="{Binding CheckedMsg}" Header="异常信息" />
</DataGrid.Columns>
</DataGrid>
</TabItem>
</TabControl>
</Grid> </Grid>
</Window> </Window>

View File

@ -1,6 +1,10 @@
using Sinvo.EplanHpD.Plugin.WPFUI.Models; using EPLAN.Harness.Core.Controls;
using Sinvo.EplanHpD.Plugin.WPFUI.Models;
using Sinvo.EplanHpD.Plugin.WPFUI.Utils;
using Sinvo.EplanHpD.Plugin.WPFUI.ViewModel; using Sinvo.EplanHpD.Plugin.WPFUI.ViewModel;
using System.Linq;
using System.Windows; using System.Windows;
using System.Windows.Controls;
namespace Sinvo.EplanHpD.Plugin.WPFUI namespace Sinvo.EplanHpD.Plugin.WPFUI
{ {
@ -19,23 +23,131 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI
private void Window_Loaded(object sender, RoutedEventArgs e) private void Window_Loaded(object sender, RoutedEventArgs e)
{ {
ViewModel.LoadData(); try
{
MotorExcelHelper.Instance.ReadDataToStream();
LoadData();
}
catch (System.Exception ex)
{
FlexMessageBox.Error(ex.Message);
}
} }
private void Button_Click(object sender, RoutedEventArgs e) private void Button_Click(object sender, RoutedEventArgs e)
{ {
ViewModel.LoadData(); try
{
LoadData();
}
catch (System.Exception ex)
{
FlexMessageBox.Error(ex.Message);
}
} }
private void LoadData()
{
LoadingMask.Visibility = Visibility.Visible;
ViewModel.GetMotors().ContinueWith(x =>
{
ViewModel.LoadData()
.ContinueWith(x =>
{
this.Dispatcher.BeginInvoke(delegate ()
{
LoadingMask.Visibility = Visibility.Collapsed;
});
});
});
}
private void ToSourceMenuItem_Click(object sender, RoutedEventArgs e) private void ToSourceMenuItem_Click(object sender, RoutedEventArgs e)
{ {
var selectItem = LettotypeListView.SelectedItem;
if (selectItem is LectotypeModel model)
{
ViewModel.ToSource(model.CableName); var selectItem = LettotypeListView.SelectedItem;
if (selectItem is LectotypeLineModel model)
{
var cableName = model.CableName;
//if (model.IsComplexLine)
//{
// FlexMessageBox.ShowText(FlexMessageBox.Type.INFO, "组合线请选择子项进行跳转");
//}
//else
//{
if (model.IsComplexLine)
{
if (ViewModel.SelectedSubItem != null)
{
cableName = ViewModel.SelectedSubItem.FirstOrDefault()?.CableName;
}
}
if (string.IsNullOrEmpty(cableName))
{
FlexMessageBox.ShowText(FlexMessageBox.Type.INFO, "未获取到线材名称");
}
else
{
ViewModel.ToSource(cableName);
}
//}
} }
} }
private void LettotypeListView_RowDetailsVisibilityChanged(object sender, System.Windows.Controls.DataGridRowDetailsEventArgs e)
{
var datagrid = sender as DataGrid;
if (datagrid != null)
{
var DetailsDataGrid = e.DetailsElement as DataGrid;
if (DetailsDataGrid != null)
{
DetailsDataGrid.ItemsSource = ViewModel.SelectedSubItem;
}
}
}
private void SubToSourceMenuItem_Click(object sender, RoutedEventArgs e)
{
if (SubDetailsDataGridSelectedItem != null)
{
if (SubDetailsDataGridSelectedItem is LectotypeLineModel model)
{
ViewModel.ToSource(model.CableName);
}
}
}
private object SubDetailsDataGridSelectedItem;
private void SubDetailsDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid dataGrid = sender as DataGrid;
if (dataGrid != null && dataGrid.SelectedItem != null)
{
SubDetailsDataGridSelectedItem = dataGrid.SelectedItem;
}
}
private void Window_Closed(object sender, System.EventArgs e)
{
MotorExcelHelper.Instance.CloseStream();
}
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
}
private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
}
} }
} }

View File

@ -193,7 +193,22 @@
<DataGrid.ContextMenu> <DataGrid.ContextMenu>
<ContextMenu> <ContextMenu>
<MenuItem Click="IgnoreSelectedError_Click" Header="忽略选中项的异常" /> <MenuItem Click="IgnoreSelectedError_Click" Header="忽略选中项的异常" />
<MenuItem Click="GoToSource_Click" Header="转至源" /> <MenuItem Click="GoToSource_Click">
<MenuItem.Header>
<StackPanel VerticalAlignment="Center" Orientation="Horizontal">
<TextBlock VerticalAlignment="Center" Text="转至源" />
<Border
Margin="10,0,0,0"
BorderBrush="Gray"
BorderThickness="0,0,0,1">
<StackPanel Orientation="Horizontal">
<CheckBox VerticalAlignment="Center" IsChecked="{Binding ToSourceAndMinSelf}" />
<TextBlock VerticalAlignment="Center" Text="最小化窗口" />
</StackPanel>
</Border>
</StackPanel>
</MenuItem.Header>
</MenuItem>
<MenuItem Click="UnIgnoreSelectedError_Click" Header="取消忽略选中项的异常" /> <MenuItem Click="UnIgnoreSelectedError_Click" Header="取消忽略选中项的异常" />
<MenuItem <MenuItem
Click="Copy_Click" Click="Copy_Click"

View File

@ -464,6 +464,10 @@ public partial class MainWindow : Window
try try
{ {
GoToSource(); GoToSource();
if (ViewModel.ToSourceAndMinSelf)
{
this.WindowState = WindowState.Minimized;
}
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@ -0,0 +1,10 @@
namespace Sinvo.EplanHpD.Plugin.WPFUI.Models
{
public class ConfigItemModel
{
public string ItemName { get; set; }
public string ItemValue { get; set; }
public string ItemFlag { get; set; }
}
}

View File

@ -23,8 +23,6 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.Models
[ExcelColumn(Name = "印记前缀")] [ExcelColumn(Name = "印记前缀")]
public string Prefix { get; set; } public string Prefix { get; set; }
///
/// <summary> /// <summary>
/// 线材型号规格 /// 线材型号规格
/// </summary> /// </summary>

View File

@ -0,0 +1,365 @@
using Sinvo.EplanHpD.Plugin.WPFUI.Utils;
using System.Linq;
namespace Sinvo.EplanHpD.Plugin.WPFUI.Models
{
public class LectotypeLineModel : CheckedModel
{
public int SeqNo;
public bool IsComplexLine;
private string _name;
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
private string _cableName;
/// <summary>
/// 线材名称 -> eg:ca_000120
/// </summary>
public string CableName
{
get => _cableName;
set
{
_cableName = value;
OnPropertyChanged(nameof(CableName));
}
}
private string _motorModel;
/// <summary>
/// 电机型号
/// </summary>
public string MotorModel
{
get => _motorModel;
set
{
_motorModel = value;
OnPropertyChanged(nameof(MotorModel));
}
}
private string _axisNo;
/// <summary>
/// 轴号
/// </summary>
public string AxisNo
{
get => _axisNo;
set
{
_axisNo = value;
OnPropertyChanged(nameof(AxisNo));
OnPropertyChanged(nameof(CableModelNo));
}
}
private string _drawingNo;
/// <summary>
/// 图号
/// </summary>
public string DrawingNo
{
get => _drawingNo;
set
{
_drawingNo = value;
OnPropertyChanged(nameof(DrawingNo));
}
}
private int _currentLine;
/// <summary>
/// 当前段号
/// </summary>
public int CurrentLine
{
get => _currentLine;
set
{
_currentLine = value;
OnPropertyChanged(nameof(CurrentLine));
}
}
private int _lineCount;
/// <summary>
/// 总段数
/// </summary>
public int LineCount
{
get => _lineCount;
set
{
_lineCount = value;
OnPropertyChanged(nameof(LineCount));
}
}
private double _length;
/// <summary>
/// 长度
/// </summary>
public double Length
{
get
{
if (IsPowerLine)
{
return PowerLineLength;
}
else
{
return EncoderLineLength;
}
}
set
{
_length = value;
OnPropertyChanged(nameof(Length));
}
}
private bool _isFlexibility;
/// <summary>
/// 是否高柔
/// </summary>
public bool IsFlexibility
{
get => _isFlexibility;
set
{
_isFlexibility = value;
OnPropertyChanged(nameof(IsFlexibility));
OnPropertyChanged(nameof(CableModelNo));
}
}
private double _powerLineLength;
/// <summary>
/// 动力线长度
/// </summary>
public double PowerLineLength
{
get { return _powerLineLength; }
set
{
_powerLineLength = value;
OnPropertyChanged(nameof(PowerLineLength));
OnPropertyChanged(nameof(CableModelNo));
}
}
private double _encoderLineLength;
/// <summary>
/// 编码器线长度
/// </summary>
public double EncoderLineLength
{
get { return _encoderLineLength; }
set
{
_encoderLineLength = value;
OnPropertyChanged(nameof(EncoderLineLength));
OnPropertyChanged(nameof(CableModelNo));
}
}
private string _cableFlag;
/// <summary>
/// 线材标识
/// </summary>
public string CableFlag
{
get
{
return _cableFlag;
}
set
{
_cableFlag = value;
OnPropertyChanged(nameof(CableFlag));
}
}
private string _cableType;
/// <summary>
/// 线材类型
/// </summary>
public string CableType
{
get { return _cableType; }
set
{
_cableType = value;
OnPropertyChanged(nameof(CableType));
}
}
/// <summary>
/// 线材连接方式
/// </summary>
private string _cableConnectionClass;
/// <summary>
/// <inheritdoc cref="_cableConnectionClass"/>
/// </summary>
public string CableConnectionClass
{
get { return _cableConnectionClass; }
set
{
_cableConnectionClass = value;
OnPropertyChanged(nameof(CableConnectionClass));
}
}
private bool _isEncoderLine;
/// <summary>
/// 是否编码器线
/// </summary>
public bool IsEncoderLine
{
get => _isEncoderLine;
set
{
_isEncoderLine = value;
OnPropertyChanged();
}
}
private bool _isPowerLine;
/// <summary>
/// 是否动力线
/// </summary>
public bool IsPowerLine
{
get => _isPowerLine;
set
{
_isPowerLine = value;
OnPropertyChanged();
}
}
private string _cableModelNo;
public string CableModelNo
{
get
{
if (Motor == null) return "";
string drawNo = "MR-";
var cableFlag = GetCableModelFlag(Motor?.MotorPower, CableType, CableConnectionClass, IsFlexibility);
if (string.IsNullOrWhiteSpace(cableFlag))
{
DrawingNo = "";
return "";
}
else
{
drawNo += cableFlag + "-";
}
//编码器线+动力线 编码器线+动力刹车线
if (CableType is "编码器线+动力线" or "编码器线+动力刹车线") // 组合线
drawNo += "A1-";
if (IsFlexibility)
{
drawNo += "H-";
}
else
{
drawNo += "L-";
}
if (IsComplexLine)
{
drawNo += $"{EncoderLineLength}-{PowerLineLength}";
}
else if (IsEncoderLine)
{
drawNo += $"{EncoderLineLength}";
}
else if (IsPowerLine)
{
drawNo += $"{PowerLineLength}";
}
if (!string.IsNullOrEmpty(AxisNo))
{
drawNo += "(";
drawNo += $"{AxisNo}";
if (CableConnectionClass != "直通")
//if (!(CableType is "编码器线+动力线" or "编码器线+动力刹车线"))
drawNo += $"-{CurrentLine} / {LineCount}";
drawNo += ")";
}
//if (isUpdateDrawNo)
{
DrawingNo = GetCableDrawNo();
}
return drawNo;
}
set
{
//_cableModelNo = value;
OnPropertyChanged(nameof(CableModelNo));
}
}
/// <summary>
/// 获取线对应图纸编号
/// </summary>
/// <returns></returns>
private string GetCableDrawNo()
{
var data = MotorExcelHelper.Instance.GetCableDatas();
//var data = Core.CoreService.GetService<LectotypeService>().GetCableDatas();
var cableData = data.FirstOrDefault(it =>
it.MotorPower == Motor.MotorPower
&& it.LineType == CableType
&& it.Type == CableConnectionClass.Replace("全段", "前段")
&& it.IsHighFlexibility == (IsFlexibility ? "是" : "否")
);
if (cableData != null)
{
return cableData.DrawingNo;
}
else
{
return "";
}
}
private string GetCableModelFlag(string motorPower, string cableType, string cableConnectionType, bool isFlexibility)
{
var data = MotorExcelHelper.Instance.GetCableDatas();
//var data = Core.CoreService.GetService<LectotypeService>().GetCableDatas();
var cableData = data?.FirstOrDefault(it =>
it.MotorPower == motorPower
&& it.LineType == cableType
&& it.Type == cableConnectionType.Replace("全段", "前段")
&& it.IsHighFlexibility == (isFlexibility ? "是" : "否"));
if (cableData != null)
{
CableFlag = cableData.LineModelIdentifier;
return CableFlag;
}
else
{
return "";
}
}
private MotorModel _motor;
public MotorModel Motor
{
get => _motor;
set
{
_motor = value;
OnPropertyChanged(nameof(Motor));
}
}
}
}

View File

@ -1,225 +1,27 @@
namespace Sinvo.EplanHpD.Plugin.WPFUI.Models using MiniExcelLibs.Attributes;
namespace Sinvo.EplanHpD.Plugin.WPFUI.Models
{ {
public class LectotypeModel : CheckedModel public class LectotypeModel
{ {
private string _name; /*
public string Name 线 线 线
{ */
get => _name; [ExcelColumnName("电机功率")]
set public string MotorPower { get; set; }
{ [ExcelColumnName("电机型号")]
_name = value; public string MotorModel { get; set; }
OnPropertyChanged(nameof(Name)); [ExcelColumnName("线材类型")]
} public string LineType { get; set; }
} [ExcelColumnName("类型")]
private string _cableName; public string Type { get; set; }
/// <summary> [ExcelColumnName("是否高柔")]
/// 线材名称 -> eg:ca_000120 public string IsHighFlexibility { get; set; }
/// </summary> [ExcelColumnName("线材型号标识")]
public string CableName public string LineModelIdentifier { get; set; }
{ [ExcelColumnName("线材型号")]
get => _cableName; public string LineModel { get; set; }
set [ExcelColumnName("图纸编号")]
{ public string DrawingNo { get; set; }
_cableName = value;
OnPropertyChanged(nameof(CableName));
}
}
private string _axisNo;
/// <summary>
/// 轴号
/// </summary>
public string AxisNo
{
get => _axisNo;
set
{
_axisNo = value;
OnPropertyChanged(nameof(AxisNo));
}
}
private string _drawingNo;
/// <summary>
/// 图号
/// </summary>
public string DrawingNo
{
get => _drawingNo;
set
{
_drawingNo = value;
OnPropertyChanged(nameof(DrawingNo));
}
}
private int _currentLine;
/// <summary>
/// 当前段号
/// </summary>
public int CurrentLine
{
get => _currentLine;
set
{
_currentLine = value;
OnPropertyChanged(nameof(CurrentLine));
}
}
private int _lineCount;
/// <summary>
/// 总段数
/// </summary>
public int LineCount
{
get => _lineCount;
set
{
_lineCount = value;
OnPropertyChanged(nameof(LineCount));
}
}
private double _length;
/// <summary>
/// 长度
/// </summary>
public double Length
{
get
{
if (IsPowerLine)
{
return PowerLineLength;
}
else
{
return EncoderLineLength;
}
}
set
{
_length = value;
OnPropertyChanged(nameof(Length));
}
}
private bool _isFlexibility;
/// <summary>
/// 是否高柔
/// </summary>
public bool IsFlexibility
{
get => _isFlexibility;
set
{
_isFlexibility = value;
OnPropertyChanged(nameof(IsFlexibility));
}
}
private double _powerLineLength;
/// <summary>
/// 动力线长度
/// </summary>
public double PowerLineLength
{
get { return _powerLineLength; }
set
{
_powerLineLength = value;
OnPropertyChanged(nameof(PowerLineLength));
}
}
private double _encoderLineLength;
/// <summary>
/// 编码器线长度
/// </summary>
public double EncoderLineLength
{
get { return _encoderLineLength; }
set
{
_encoderLineLength = value;
OnPropertyChanged(nameof(EncoderLineLength));
}
}
private string _cableFlag;
/// <summary>
/// 线材标识
/// </summary>
public string CableFlag
{
get
{
return _cableFlag;
}
set
{
_cableFlag = value;
OnPropertyChanged(nameof(CableFlag));
}
}
private string _cableType;
/// <summary>
/// 线材类型
/// </summary>
public string CableType
{
get { return _cableType; }
set
{
_cableType = value;
OnPropertyChanged(nameof(CableType));
}
}
/// <summary>
/// 线材连接方式
/// </summary>
private string _cableConnectionClass;
/// <summary>
/// <inheritdoc cref="_cableConnectionClass"/>
/// </summary>
public string CableConnectionClass
{
get { return _cableConnectionClass; }
set
{
_cableConnectionClass = value;
OnPropertyChanged(nameof(CableConnectionClass));
}
}
private bool _isEncoderLine;
/// <summary>
/// 是否编码器线
/// </summary>
public bool IsEncoderLine
{
get => _isEncoderLine;
set
{
_isEncoderLine = value;
OnPropertyChanged();
}
}
private bool _isPowerLine;
/// <summary>
/// 是否动力线
/// </summary>
public bool IsPowerLine
{
get => _isPowerLine;
set
{
_isPowerLine = value;
OnPropertyChanged();
}
}
} }
} }

View File

@ -0,0 +1,85 @@
namespace Sinvo.EplanHpD.Plugin.WPFUI.Models
{
public class MotorModel : CheckedModel
{
/// <summary>
/// 电机功率
/// </summary>
private string _motorPower;
/// <summary>
/// <inheritdoc cref="_motorPower"/>
/// </summary>
public string MotorPower
{
get { return _motorPower; }
set
{
_motorPower = value;
OnPropertyChanged(nameof(MotorPower));
}
}
/// <summary>
/// 品牌
/// </summary>
private string _brand;
/// <summary>
/// <inheritdoc cref="_brand"/>
/// </summary>
public string Brand
{
get { return _brand; }
set
{
_brand = value;
OnPropertyChanged(nameof(Brand));
}
}
/// <summary>
/// 电机系列
/// </summary>
private string _motorSerie;
/// <summary>
/// <inheritdoc cref="_motorSerie"/>
/// </summary>
public string MotorSerie
{
get { return _motorSerie; }
set
{
_motorSerie = value;
OnPropertyChanged(nameof(MotorSerie));
}
}
/// <summary>
/// 电机系列
/// </summary>
private string _motorModel;
/// <summary>
/// <inheritdoc cref="_motorModel"/>
/// </summary>
public string MotorModelStr
{
get { return _motorModel; }
set
{
_motorModel = value;
OnPropertyChanged(nameof(MotorModelStr));
}
}
private string _axisNo;
/// <summary>
/// 轴号
/// </summary>
public string AxisNo
{
get => _axisNo;
set
{
_axisNo = value;
OnPropertyChanged(nameof(AxisNo));
}
}
}
}

View File

@ -46,6 +46,6 @@ using System.Windows;
// 生成号 // 生成号
// 修订号 // 修订号
// //
[assembly: AssemblyVersion("1.0.0.16")] [assembly: AssemblyVersion("1.0.0.17")]
[assembly: AssemblyFileVersion("1.0.0.16")] [assembly: AssemblyFileVersion("1.0.0.17")]
[assembly: AssemblyInformationalVersion("1.0.0.16")] [assembly: AssemblyInformationalVersion("1.0.0.17")]

View File

@ -120,22 +120,29 @@
<DependentUpon>LectotypeWindow.xaml</DependentUpon> <DependentUpon>LectotypeWindow.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Models\CheckedModel.cs" /> <Compile Include="Models\CheckedModel.cs" />
<Compile Include="Models\ConfigItemModel.cs" />
<Compile Include="Models\ExcelModel.cs" /> <Compile Include="Models\ExcelModel.cs" />
<Compile Include="Models\ExportModel.cs" /> <Compile Include="Models\ExportModel.cs" />
<Compile Include="Models\InsulationModel.cs" /> <Compile Include="Models\InsulationModel.cs" />
<Compile Include="Models\LectotypeLineModel.cs" />
<Compile Include="Models\LectotypeModel.cs" /> <Compile Include="Models\LectotypeModel.cs" />
<Compile Include="Models\LineSegmentModel.cs" /> <Compile Include="Models\LineSegmentModel.cs" />
<Compile Include="Models\MotorModel.cs" />
<Compile Include="Models\ReportModel.cs" /> <Compile Include="Models\ReportModel.cs" />
<Compile Include="Models\StuffedDataModel.cs" /> <Compile Include="Models\StuffedDataModel.cs" />
<Compile Include="Models\TerminalModel.cs" /> <Compile Include="Models\TerminalModel.cs" />
<Compile Include="TestWindow.xaml.cs"> <Compile Include="TestWindow.xaml.cs">
<DependentUpon>TestWindow.xaml</DependentUpon> <DependentUpon>TestWindow.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Utils\CheckedModelExt.cs" />
<Compile Include="Utils\Consts.cs" /> <Compile Include="Utils\Consts.cs" />
<Compile Include="Utils\DataGridType.cs" /> <Compile Include="Utils\DataGridType.cs" />
<Compile Include="Utils\ExcelHelper.cs" /> <Compile Include="Utils\ExcelHelper.cs" />
<Compile Include="Utils\FlagEnumConverter.cs" /> <Compile Include="Utils\FlagEnumConverter.cs" />
<Compile Include="Utils\LambdaComparer.cs" />
<Compile Include="Utils\LectotypeLengthDataTemplateSelector.cs" /> <Compile Include="Utils\LectotypeLengthDataTemplateSelector.cs" />
<Compile Include="Utils\MotorExcelHelper.cs" />
<Compile Include="Utils\PropertyListExt.cs" />
<Compile Include="Utils\WireFlagType.cs" /> <Compile Include="Utils\WireFlagType.cs" />
<Compile Include="ViewModel\LectotypeViewModel.cs" /> <Compile Include="ViewModel\LectotypeViewModel.cs" />
<Compile Include="ViewModel\MainViewModel.Check.cs" /> <Compile Include="ViewModel\MainViewModel.Check.cs" />

View File

@ -0,0 +1,19 @@
using Sinvo.EplanHpD.Plugin.WPFUI.Models;
namespace Sinvo.EplanHpD.Plugin.WPFUI.Utils
{
public static class CheckedModelExt
{
public static void SetError(this CheckedModel model, string errorMsg)
{
model.IsError = true;
model.ErrorCount += 1;
if (!string.IsNullOrEmpty(model.CheckedMsg))
{
model.CheckedMsg += "\r\n";
}
model.CheckedMsg += errorMsg;
}
}
}

View File

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
namespace Sinvo.EplanHpD.Plugin.WPFUI.Utils
{
public class LambdaComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> _lambdaComparer;
private readonly Func<T, int> _lambdaHash;
public LambdaComparer(Func<T, T, bool> lambdaComparer)
: this(lambdaComparer, EqualityComparer<T>.Default.GetHashCode)
{
}
public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
{
if (lambdaComparer == null)
throw new ArgumentNullException("lambdaComparer");
if (lambdaHash == null)
throw new ArgumentNullException("lambdaHash");
_lambdaComparer = lambdaComparer;
_lambdaHash = lambdaHash;
}
public bool Equals(T x, T y)
{
return _lambdaComparer(x, y);
}
public int GetHashCode(T obj)
{
return _lambdaHash(obj);
}
}
}

View File

@ -20,8 +20,12 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.Utils
} }
public override DataTemplate SelectTemplate(object item, DependencyObject container) public override DataTemplate SelectTemplate(object item, DependencyObject container)
{ {
Type t = item.GetType(); Type t = item?.GetType();
string cableType = null; string cableType = null;
if (t == null)
{
return DefaultTemplate;
}
PropertyInfo[] properties = t.GetProperties(); PropertyInfo[] properties = t.GetProperties();
foreach (PropertyInfo pi in properties) foreach (PropertyInfo pi in properties)
{ {
@ -37,11 +41,10 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.Utils
return PowerLineTemplate; return PowerLineTemplate;
case "编码器线": case "编码器线":
return EncoderLineTemplate; return EncoderLineTemplate;
case "动力线+编码器线": case "编码器线+动力线":
return ComplexLineTemplate; return ComplexLineTemplate;
default: default:
return DefaultTemplate; return DefaultTemplate;
} }
} }
} }

View File

@ -0,0 +1,86 @@
using MiniExcelLibs;
using Sinvo.EplanHpD.Plugin.WPFUI.Models;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Sinvo.EplanHpD.Plugin.WPFUI.Utils
{
public class MotorExcelHelper
{
public static MotorExcelHelper Instance = new();
private Stream dataFileStream;
public const string DATA_FILE_PATH = @"D:\Desktop\EPlan\线材选型";//@"\\192.168.1.160\plm系统文档\线材选型";
private const string DATA_FILE_NAME = "线材选型数据表.xlsx";
private const string DATA_FILE_NAME_BOM = "BOM表.xlsx";
private const string TEMPLATE_FILE_NAME = "下单定制线模板.xlsx";
public void ReadDataToStream()
{
var file = Path.Combine(DATA_FILE_PATH, DATA_FILE_NAME);
if (File.Exists(file))
{
var bytes = File.ReadAllBytes(file);
dataFileStream = new MemoryStream(bytes);
}
}
public List<LectotypeModel> GetCableDatas()
{
if (dataFileStream == null) return null;
//var filePath = "D:\\Desktop\\Data\\三菱伺服HK-KT线材选型BOM表_按程序格式整理后.xlsx";
var data = MiniExcel.Query<LectotypeModel>(dataFileStream, "HK-KT").ToList();
//MiniExcel.Query()
return data;
}
/// <summary>
/// 1. 100W,
/// 2. 100W带刹车,
/// 3. 200W,
/// 4. 200W带刹车,
/// 5. 400W低惯量,
/// 6. 400W低惯量带刹车,
/// 7. 750W低惯量,
/// 8. 750W低惯量带刹车,
/// 9. 1000W220V,
/// 10.1000W带刹车220V,
/// 11.1500W220V,
/// 12.1500带刹车220V,
/// </summary>
public List<ConfigItemModel> GetMotorPowers()
{
//return new List<ConfigItemModel>
//{
// new(){ ItemName = "100W", ItemValue = "100W"},
// new(){ ItemName = "100W带刹车", ItemValue = "100W带刹车"},
// new(){ ItemName = "200W", ItemValue = "200W"},
// new(){ ItemName = "200W带刹车", ItemValue = "200W带刹车"},
// new(){ ItemName = "400W低惯量", ItemValue = "400W低惯量"},
// new(){ ItemName = "400W低惯量带刹车", ItemValue = "400W低惯量带刹车"},
// new(){ ItemName = "750W低惯量", ItemValue = "750W低惯量"},
// new(){ ItemName = "750W低惯量带刹车", ItemValue = "750W低惯量带刹车"},
// new(){ ItemName = "1000W220V", ItemValue = "1000W220V"},
// new(){ ItemName = "1000W带刹车220V", ItemValue = "1000W带刹车220V"},
// new(){ ItemName = "1500W220V", ItemValue = "1500W220V"},
// new(){ ItemName = "1500带刹车220V", ItemValue = "1500带刹车220V"},
//};
var data = MiniExcel.Query(dataFileStream, sheetName: "电机驱动器", startCell: "A2", useHeaderRow: true).OrderBy(it => it.).Select(it => new ConfigItemModel
{
ItemName = it.,
ItemValue = it.,
ItemFlag = it.
}).ToList();
return data.Distinct(new LambdaComparer<ConfigItemModel>(
(a, b) => a.ItemName == b.ItemName && a.ItemValue == b.ItemValue && b.ItemFlag == a.ItemFlag,
obj => obj.ToString().GetHashCode()
)).ToList();
}
public void CloseStream()
{
dataFileStream.Close();
}
}
}

View File

@ -0,0 +1,20 @@
using EPLAN.Harness.Core.Props.Collections;
using System.Linq;
namespace Sinvo.EplanHpD.Plugin.WPFUI.Utils
{
public static class PropertyListExt
{
public static bool IsContarins(this PropertyList list, string value)
{
return list.Any(item =>
{
if (item.ValueHolder.IsStrValEmpty())
{
return false;
}
return item.PropertyName?.Equals(value) ?? false;
});
}
}
}

View File

@ -1,21 +1,27 @@
using EPLAN.Harness.Common.Extensions; using EPLAN.Harness.Common.Extensions;
using EPLAN.Harness.Core.Controls;
using EPLAN.Harness.Core.Utils;
using EPLAN.Harness.ProjectCore; using EPLAN.Harness.ProjectCore;
using EPLAN.Harness.ProjectCore.Occurrences; using EPLAN.Harness.ProjectCore.Occurrences;
using EPLAN.Harness.ProjectCore.Occurrences.Designer; using EPLAN.Harness.ProjectCore.Occurrences.Designer;
using Sinvo.EplanHpD.Plugin.WPFUI.Models; using Sinvo.EplanHpD.Plugin.WPFUI.Models;
using Sinvo.EplanHpD.Plugin.WPFUI.Utils;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
{ {
public class LectotypeViewModel(string docId) : INotifyPropertyChanged public class LectotypeViewModel(string docId) : INotifyPropertyChanged
{ {
private List<LectotypeModel> _wires; private List<LectotypeLineModel> _wires;
public List<LectotypeModel> Wires public List<LectotypeLineModel> Wires
{ {
get => _wires; get => _wires;
set set
@ -24,8 +30,64 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
OnPropertyChanged(); OnPropertyChanged();
} }
} }
private List<LectotypeModel> _stuffedWires;
public List<LectotypeModel> StuffedWires private List<LectotypeLineModel> _oriWires = [];
public List<LectotypeLineModel> OriWires
{
get => _oriWires;
set
{
_oriWires = value;
OnPropertyChanged();
}
}
private LectotypeLineModel _selectedItem;
public LectotypeLineModel SelectedItem
{
get => _selectedItem;
set
{
_selectedItem = value;
OnPropertyChanged();
OnSelectedItemChange();
}
}
private ObservableCollection<LectotypeLineModel> _selectedSubItem = [];
public ObservableCollection<LectotypeLineModel> SelectedSubItem
{
get => _selectedSubItem;
set
{
_selectedSubItem = value;
OnPropertyChanged();
}
}
private DataGridRowDetailsVisibilityMode _detailsShowMode = DataGridRowDetailsVisibilityMode.Collapsed;
public DataGridRowDetailsVisibilityMode DetailsShowMode
{
get => _detailsShowMode;
set
{
_detailsShowMode = value;
OnPropertyChanged();
}
}
private List<MotorModel> _motors = [];
public List<MotorModel> Motors
{
get => _motors;
set
{
_motors = value;
OnPropertyChanged();
}
}
private List<LectotypeLineModel> _stuffedWires;
public List<LectotypeLineModel> StuffedWires
{ {
get => _stuffedWires; get => _stuffedWires;
set set
@ -34,11 +96,19 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
OnPropertyChanged(); OnPropertyChanged();
} }
} }
public void LoadData()
public List<string> Drivers { get; set; } = [
"脉冲型驱动器",
"总线型驱动器CCLINK IE TSN)",
"总线型驱动器(SSCNET III/H)",
"总线型驱动器(EtherCAT)"
];
public Task LoadData()
{ {
if (string.IsNullOrEmpty(docId)) if (string.IsNullOrEmpty(docId))
{ {
return; return Task.CompletedTask;
} }
var doc = FlexProject.CurrentProject.GetDesigners().FirstOrDefault(designer => designer.ID == docId); var doc = FlexProject.CurrentProject.GetDesigners().FirstOrDefault(designer => designer.ID == docId);
// 获取所有存在的 // 获取所有存在的
@ -47,12 +117,12 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
// 所有的线材 // 所有的线材
// OccCableForked 多芯线? 对应设计器中Cables(电缆)下的内容 // OccCableForked 多芯线? 对应设计器中Cables(电缆)下的内容
// OccWire 导线 对应设计器中Wires(导线)下的内容 // OccWire 导线 对应设计器中Wires(导线)下的内容
List<LectotypeModel> cables = [.. wires List<LectotypeLineModel> cables = [.. wires
.Where(it => .Where(it =>
it.GetType() == typeof(OccCableForked) it.GetType() == typeof(OccCableForked)
//|| it.GetType() == typeof(OccWire) //|| it.GetType() == typeof(OccWire)
) )
//.Where(it => !string.IsNullOrEmpty(GetAxisNo((it.Children.First() as OccCablesInsulatorGraph).Imprint)) ) .Where(it => !string.IsNullOrEmpty(GetAxisNo((it.Children.First() as OccCablesInsulatorGraph).Imprint)) )
//.Where(it =>it.PartStatus == EPLAN.Harness.Core.LibEntities.Enums.PartStatus.Released) //.Where(it =>it.PartStatus == EPLAN.Harness.Core.LibEntities.Enums.PartStatus.Released)
.Select(it => .Select(it =>
{ {
@ -72,9 +142,9 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
} }
} }
return new LectotypeModel return new LectotypeLineModel
{ {
Name= occCable.LibraryName, Name= GetLectotypeName(occCable.LibraryName),
CableName = occCable.Name, CableName = occCable.Name,
AxisNo = GetAxisNo(insulatorGraph.Imprint), AxisNo = GetAxisNo(insulatorGraph.Imprint),
CurrentLine = GetCableLine(insulatorGraph.Imprint), CurrentLine = GetCableLine(insulatorGraph.Imprint),
@ -90,12 +160,24 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
.OrderBy(it => it?.CableName ?? "")]; .OrderBy(it => it?.CableName ?? "")];
Wires = StuffData(cables); Wires = StuffData(cables);
return Task.CompletedTask;
}
public string GetLectotypeName(string libraryName)
{
if (libraryName.Contains("&"))
{
return libraryName.Split('&')[1];
}
else
{
return libraryName;
}
} }
public List<LectotypeLineModel> StuffData(List<LectotypeLineModel> cables)
public List<LectotypeModel> StuffData(List<LectotypeModel> cables)
{ {
List<LectotypeModel> datas = []; List<LectotypeLineModel> datas = [];
OriWires.Clear();
//1 整理数据 //1 整理数据
cables.ForEach(it => cables.ForEach(it =>
{ {
@ -109,6 +191,7 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
it.LineCount = lineCount; it.LineCount = lineCount;
if (it.CurrentLine == 1) if (it.CurrentLine == 1)
{ {
it.CableConnectionClass = "前段"; it.CableConnectionClass = "前段";
} }
else if (it.CurrentLine > 1 && it.CurrentLine < lineCount) else if (it.CurrentLine > 1 && it.CurrentLine < lineCount)
@ -118,6 +201,7 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
} }
else if (it.CurrentLine == lineCount) else if (it.CurrentLine == lineCount)
{ {
it.CableConnectionClass = "尾段"; it.CableConnectionClass = "尾段";
} }
if (string.IsNullOrEmpty(axisNo)) if (string.IsNullOrEmpty(axisNo))
@ -127,11 +211,37 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
it.ErrorCount += 1; it.ErrorCount += 1;
it.CheckedMsg += "轴号不能为空!\r\n"; it.CheckedMsg += "轴号不能为空!\r\n";
} }
if (datas.Any(i => i.AxisNo == it.AxisNo && it.CableType == i.CableType && it.CurrentLine == i.CurrentLine))
{
it.IsError = true;
it.CheckedMsg = "线段重复!";
}
if (Motors != null && Motors.Any())
{
var motor = Motors.FirstOrDefault(motor => motor.AxisNo == it.AxisNo);
if (motor != null)
{
it.Motor = motor;
}
else
{
it.IsError = true;
it.ErrorCount = 1;
it.CheckedMsg = "未匹配到电机";
}
}
if (it.Name.StartsWith("T"))
{
it.IsFlexibility = true;
}
// 先把非第一行的数据添加到数据集合中 // 先把非第一行的数据添加到数据集合中
if (it.CurrentLine != 1) if (it.CurrentLine != 1)
{ {
datas.Add(it); datas.Add(it);
} }
OriWires.Add(it.MemoryClone());
}); });
//2 合并同轴号的第一条数据 //2 合并同轴号的第一条数据
cables.Where(it => it.CurrentLine == 1).ForEach(it => cables.Where(it => it.CurrentLine == 1).ForEach(it =>
@ -144,15 +254,19 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
{ {
if (existLine.IsPowerLine) if (existLine.IsPowerLine)
{ {
existLine.SeqNo = 3;
existLine.EncoderLineLength = it.EncoderLineLength; existLine.EncoderLineLength = it.EncoderLineLength;
} }
else if (existLine.IsEncoderLine) else if (existLine.IsEncoderLine)
{ {
existLine.SeqNo = 2;
existLine.PowerLineLength = it.PowerLineLength; existLine.PowerLineLength = it.PowerLineLength;
} }
} }
existLine.CableType = "动力线+编码器线"; existLine.IsComplexLine = true;
existLine.CableType = "编码器线+动力线";
if (datas.Any(i => i.AxisNo == it.AxisNo && i.CurrentLine != 1)) if (datas.Any(i => i.AxisNo == it.AxisNo && i.CurrentLine != 1))
{ {
@ -161,16 +275,34 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
else else
{ {
existLine.CableConnectionClass = "直通"; existLine.CableConnectionClass = "直通";
}
// 多端线时,第一条线取最大段数
var lineCount = datas.Where(data => data.AxisNo == existLine.AxisNo).Max(data => data.LineCount);
existLine.LineCount = lineCount;
if (existLine.IsComplexLine)
{
existLine.SeqNo = 1;
existLine.Name = "";
existLine.CableName = OriWires
.Where(data => data.AxisNo == existLine.AxisNo && data.CurrentLine == 1)
.Select(data => data.CableName)
.Aggregate("/");
}
if ((it.IsFlexibility || existLine.IsFlexibility) && it.IsFlexibility != existLine.IsFlexibility)
{
existLine.SetError("请检查是否使用正确的高柔线");
} }
} }
else else
{ {
it.IsComplexLine = true;
datas.Add(it); datas.Add(it);
} }
}); });
return datas.OrderBy(it => it.CurrentLine).ToList(); return [.. datas.OrderByDescending(it => it.SeqNo)];
} }
/// <summary> /// <summary>
/// L -> 动力线 N -> 编码器线 /// L -> 动力线 N -> 编码器线
@ -252,17 +384,86 @@ namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
public void ToSource(string cableName) public void ToSource(string cableName)
{ {
var doc = FlexProject.CurrentProject.GetDesigners().FirstOrDefault(designer => designer.ID == docId); try
var cable = doc.GetOccurrenceByName(cableName, typeof(OccCableForked));
if (cable != null)
{ {
doc.SelectSet.Clear(); var doc = FlexProject.CurrentProject.GetDesigners().FirstOrDefault(designer => designer.ID == docId);
var oriOcc = SelfControler<BaseOccurrence>.FindInstance(cable.ID); var cable = doc.GetOccurrenceByName(cableName, typeof(OccCableForked));
oriOcc.SetVisibility(true, null); if (cable != null)
{
doc.SelectSet.Clear();
var oriOcc = SelfControler<BaseOccurrence>.FindInstance(cable.ID);
oriOcc.SetVisibility(true, null);
doc.SelectSet.Add(oriOcc.Children.First());
doc.FitToSelectSet();
doc.SelectSet.OnSelectionChanged();
}
}
catch (Exception ex)
{
FlexMessageBox.Error(ex.Message);
}
}
public Task GetMotors()
{
var motorsData = new List<MotorModel>();
var doc = FlexProject.CurrentProject.GetDesigners().FirstOrDefault(designer => designer.ID == docId);
var parts = doc.GetOrganizerOccurrences(docId)
.Where(occ => occ.Type == OCC_TYPE.wPART)
.Where(occ => occ.Name?.StartsWith("HK-KT") ?? false)
//.Where(occ => occ.Properties?.IsContarins("轴号") ?? false)
.ToList();
var motorPowerDatas = MotorExcelHelper.Instance.GetMotorPowers();
parts.ForEach(part =>
{
var motorPowerData = motorPowerDatas.FirstOrDefault(it => it.ItemFlag == part.Name);
var axisNo = part.Properties.IsContarins("轴号") ? part.Properties.FirstOrDefault(it => it.PropertyName == "轴号").GetDisplayValue() : "";
doc.SelectSet.Add(oriOcc.Children.First()); var motor = new MotorModel
doc.FitToSelectSet(); {
doc.SelectSet.OnSelectionChanged(); MotorModelStr = part.Name,
AxisNo = axisNo,
IsError = string.IsNullOrEmpty(axisNo)
};
if (motorPowerData != null)
{
motor.MotorPower = motorPowerData.ItemValue;
}
else
{
motor.SetError("电机型号不存在于资料表中");
}
if (string.IsNullOrEmpty(axisNo))
{
motor.SetError("未填写轴号信息!");
}
motorsData?.Add(motor);
});
Motors = motorsData;
return Task.CompletedTask;
}
private void OnSelectedItemChange()
{
if (this.SelectedItem != null)
{
SelectedSubItem.Clear();
DetailsShowMode = DataGridRowDetailsVisibilityMode.Collapsed;
var subItems = OriWires.Where(it => it.AxisNo == SelectedItem.AxisNo && it.CurrentLine == SelectedItem.CurrentLine && it.CurrentLine == 1).ToList();
if (subItems.Count > 1)
{
subItems.ForEach(SelectedSubItem.Add);
DetailsShowMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
}
else
{
SelectedSubItem.Clear();
DetailsShowMode = DataGridRowDetailsVisibilityMode.Collapsed;
}
}
else
{
SelectedSubItem.Clear();
DetailsShowMode = DataGridRowDetailsVisibilityMode.Collapsed;
} }
} }
} }

View File

@ -164,6 +164,17 @@ public partial class MainViewModel : INotifyPropertyChanged
FormUISettings.Instance.SaveSingleton(); FormUISettings.Instance.SaveSingleton();
} }
} }
private bool _toSourceAndMinSelf;
public bool ToSourceAndMinSelf
{
get => _toSourceAndMinSelf;
set
{
_toSourceAndMinSelf = value;
OnPropertyChanged(nameof(ToSourceAndMinSelf));
}
}
#endregion #endregion
public Task<List<DataGridTextColumn>> GetColumns(List<ReportColumn> columns) public Task<List<DataGridTextColumn>> GetColumns(List<ReportColumn> columns)

View File

@ -8,7 +8,7 @@ using System.Reflection;
namespace Sinvo.EplanHpD.Plugin namespace Sinvo.EplanHpD.Plugin
{ {
public class DesignPluginEntry //: IHpDPlugin public class DesignPluginEntry : EPLAN.Harness.API.Plugins.IHpDPlugin
{ {
public string Name => "兴禾ProD插件-3D"; public string Name => "兴禾ProD插件-3D";
@ -57,7 +57,7 @@ namespace Sinvo.EplanHpD.Plugin
public void Terminate() public void Terminate()
{ {
//throw new NotImplementedException();
} }
} }
} }