105040 Add 扫码器插件
This commit is contained in:
parent
6818840420
commit
4ffa6d478a
|
@ -0,0 +1,176 @@
|
||||||
|
<Window
|
||||||
|
x:Class="Sinvo.EplanHpD.Plugin.WPFUI.View.ScannerWindow"
|
||||||
|
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:hc="https://handyorg.github.io/handycontrol"
|
||||||
|
xmlns:local="clr-namespace:Sinvo.EplanHpD.Plugin.WPFUI.View"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:viewmodel="clr-namespace:Sinvo.EplanHpD.Plugin.WPFUI.ViewModel"
|
||||||
|
Title="扫描"
|
||||||
|
Width="340"
|
||||||
|
Height="450"
|
||||||
|
MinWidth="340"
|
||||||
|
d:DataContext="{d:DesignInstance Type=viewmodel:ScannerViewModel}"
|
||||||
|
Left="1580"
|
||||||
|
Loaded="Window_Loaded"
|
||||||
|
Top="590"
|
||||||
|
WindowStartupLocation="Manual"
|
||||||
|
mc:Ignorable="d">
|
||||||
|
<Window.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/Sinvo.EplanHpD.Plugin.WPFUI;component/Themes/Theme.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</Window.Resources>
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="220" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<WrapPanel
|
||||||
|
Grid.Row="0"
|
||||||
|
MaxWidth="320"
|
||||||
|
HorizontalAlignment="Left">
|
||||||
|
<hc:TextBox
|
||||||
|
x:Name="ScanCodeTextBox"
|
||||||
|
Width="300"
|
||||||
|
Height="80"
|
||||||
|
Margin="10"
|
||||||
|
VerticalContentAlignment="Center"
|
||||||
|
hc:InfoElement.Placeholder="请扫描条码,例: w_00012"
|
||||||
|
hc:TitleElement.Title="扫描条码:"
|
||||||
|
FontSize="16">
|
||||||
|
<hc:TextBox.Text>
|
||||||
|
<Binding
|
||||||
|
Path="InputCode"
|
||||||
|
UpdateSourceTrigger="PropertyChanged"
|
||||||
|
ValidatesOnNotifyDataErrors="True" />
|
||||||
|
</hc:TextBox.Text>
|
||||||
|
</hc:TextBox>
|
||||||
|
<WrapPanel Margin="10">
|
||||||
|
<CheckBox
|
||||||
|
x:Name="HideOthersWire"
|
||||||
|
Margin="3"
|
||||||
|
Content="自动隐藏其他线"
|
||||||
|
FontSize="16"
|
||||||
|
IsChecked="{Binding OthersWireShow}" />
|
||||||
|
<CheckBox
|
||||||
|
x:Name="ContinueScan"
|
||||||
|
Margin="3"
|
||||||
|
Content="连续扫描"
|
||||||
|
FontSize="16"
|
||||||
|
IsChecked="{Binding ContinueScan}" />
|
||||||
|
<!--<CheckBox Content="窗口透明" FontSize="16" />-->
|
||||||
|
<CheckBox
|
||||||
|
x:Name="TopMostWindow"
|
||||||
|
Margin="3"
|
||||||
|
Checked="TopMostWindow_Checked"
|
||||||
|
Content="窗口置顶"
|
||||||
|
FontSize="16"
|
||||||
|
IsChecked="True"
|
||||||
|
Unchecked="TopMostWindow_Unchecked" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
Margin="3"
|
||||||
|
Content="扫描即装配"
|
||||||
|
FontSize="16"
|
||||||
|
IsChecked="{Binding ScanAndAssembled}" />
|
||||||
|
<CheckBox
|
||||||
|
Margin="3"
|
||||||
|
Content="隐藏或显示时同时包括注释"
|
||||||
|
FontSize="16"
|
||||||
|
IsChecked="{Binding IsIncludeAnnotation}" />
|
||||||
|
<Button
|
||||||
|
x:Name="ShowAllWire"
|
||||||
|
Margin="3"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Click="ShowAllWire_Click"
|
||||||
|
Content="显示所有线" />
|
||||||
|
<Button
|
||||||
|
x:Name="GetDoc"
|
||||||
|
Margin="3"
|
||||||
|
HorizontalAlignment="Left"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Click="GetDoc_Click"
|
||||||
|
Content="刷新打开的项目" />
|
||||||
|
</WrapPanel>
|
||||||
|
</WrapPanel>
|
||||||
|
<TabControl Grid.Row="1">
|
||||||
|
<TabItem Header="线材列表">
|
||||||
|
<Grid>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
<RowDefinition Height="30" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<DataGrid
|
||||||
|
x:Name="CableList"
|
||||||
|
AutoGenerateColumns="False"
|
||||||
|
ColumnHeaderHeight="20"
|
||||||
|
EnableColumnVirtualization="False"
|
||||||
|
EnableRowVirtualization="False"
|
||||||
|
HeadersVisibility="Column"
|
||||||
|
IsReadOnly="True"
|
||||||
|
ItemsSource="{Binding ScanCableModels}"
|
||||||
|
SelectedIndex="{Binding ScanedIndex}"
|
||||||
|
VirtualizingPanel.IsVirtualizing="False">
|
||||||
|
<DataGrid.Resources>
|
||||||
|
<Style BasedOn="{StaticResource DataGridCellStyle}" TargetType="DataGridCell">
|
||||||
|
<Setter Property="Height" Value="Auto" />
|
||||||
|
<Setter Property="MaxHeight" Value="9999" />
|
||||||
|
<Setter Property="Margin" Value="0" />
|
||||||
|
<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">
|
||||||
|
<Setter Property="Foreground" Value="White" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<DataTrigger Binding="{Binding IsChecked}" Value="false">
|
||||||
|
<Setter Property="Background" Value="#dc4d41" />
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger Binding="{Binding IsChecked}" Value="true">
|
||||||
|
<Setter Property="Background" Value="#18a05d" />
|
||||||
|
</DataTrigger>
|
||||||
|
<Trigger Property="IsSelected" Value="True">
|
||||||
|
<Setter Property="Foreground" Value="White" />
|
||||||
|
<Setter Property="Background" Value="#33326cf3" />
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
</DataGrid.RowStyle>
|
||||||
|
<DataGrid.Columns>
|
||||||
|
<DataGridTextColumn
|
||||||
|
Width="50"
|
||||||
|
Binding="{Binding Index}"
|
||||||
|
Header="序号" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Width="80"
|
||||||
|
Binding="{Binding Code}"
|
||||||
|
Header="线材编号" />
|
||||||
|
<DataGridTextColumn
|
||||||
|
Width="120"
|
||||||
|
hc:Poptip.Content="{Binding Name}"
|
||||||
|
hc:Poptip.HitMode="Hover"
|
||||||
|
Binding="{Binding Name}"
|
||||||
|
Header="线材名称" />
|
||||||
|
<DataGridTextColumn Binding="{Binding Imprint}" Header="印记" />
|
||||||
|
<!--<DataGridTextColumn Binding="{Binding IsChecked}" Header="线材名称" />-->
|
||||||
|
</DataGrid.Columns>
|
||||||
|
</DataGrid>
|
||||||
|
<Button
|
||||||
|
Grid.Row="1"
|
||||||
|
Click="ExportScanedListBtn_Click"
|
||||||
|
Content="导出线材列表" />
|
||||||
|
</Grid>
|
||||||
|
</TabItem>
|
||||||
|
</TabControl>
|
||||||
|
</Grid>
|
||||||
|
</Window>
|
|
@ -0,0 +1,110 @@
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
using EPLAN.Harness.API;
|
||||||
|
using EPLAN.Harness.Common.Extensions;
|
||||||
|
using EPLAN.Harness.Core;
|
||||||
|
using EPLAN.Harness.Core.Controls;
|
||||||
|
using EPLAN.Harness.Core.Settings;
|
||||||
|
using EPLAN.Harness.IO;
|
||||||
|
using EPLAN.Harness.PlatformCore.P8Objects;
|
||||||
|
using EPLAN.Harness.ProjectCore;
|
||||||
|
using EPLAN.Harness.ProjectCore.Occurrences;
|
||||||
|
using EPLAN.Harness.ProjectCore.Occurrences.Designer;
|
||||||
|
using EPLAN.Harness.ProjectCore.Occurrences.Nailboard;
|
||||||
|
using HandyControl.Controls;
|
||||||
|
using Microsoft.Win32;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.Common;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.Models;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.Utils;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.ViewModel;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security.Cryptography;
|
||||||
|
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;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
|
||||||
|
namespace Sinvo.EplanHpD.Plugin.WPFUI.View
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// ScannerWindow.xaml 的交互逻辑
|
||||||
|
/// </summary>
|
||||||
|
public partial class ScannerWindow : System.Windows.Window
|
||||||
|
{
|
||||||
|
private ScannerViewModel _viewModel;
|
||||||
|
|
||||||
|
public ScannerWindow()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
_viewModel = new ScannerViewModel();
|
||||||
|
this.DataContext = _viewModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TopMostWindow_Checked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
this.Topmost = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TopMostWindow_Unchecked(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
this.Topmost = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShowAllWire_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
_viewModel.OthersOccShow(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GetDoc_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
_viewModel.GetCurrentDoc();
|
||||||
|
_viewModel.GetAllCables();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void ExportScanedListBtn_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
SaveFileDialog saveFileDialog = new()
|
||||||
|
{
|
||||||
|
Filter = "MS Excel (*.xlsx)|*.xlsx",//Singleton<LRS>.Instance["Report_ExpFilter", "Report_ExpFilter"],
|
||||||
|
FilterIndex = 1,
|
||||||
|
//FileName = $"{单芯线下单}{DateTime.Now:yyyy_MM_dd}.xlsx",
|
||||||
|
FileName = $"线材扫描记录_{DateTime.Now:yyyy-MM-dd_hF}.xlsx",
|
||||||
|
AddExtension = true,
|
||||||
|
InitialDirectory = StudioSettings.Instance.ReportExport_Path,
|
||||||
|
CheckPathExists = true
|
||||||
|
};
|
||||||
|
if (saveFileDialog.ShowDialog() == true)
|
||||||
|
{
|
||||||
|
_viewModel.ExportWires(System.IO.Path.Combine(FlexIOBase.GetParentPath(saveFileDialog.FileName), saveFileDialog.FileName));
|
||||||
|
//ExcelHelper.SaveByTemplate(ViewModel.ExportData, Path.Combine(FlexIOBase.GetParentPath(saveFileDialog.FileName), saveFileDialog.FileName));
|
||||||
|
FlexMessageBox.Info($"导出完成!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Window_Loaded(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
_viewModel.GetCurrentDoc();
|
||||||
|
_viewModel.GetAllCables();
|
||||||
|
WeakReferenceMessenger.Default.Register<CommonMessage, string>(sender, "ScanedIndexChanged", (r, m) =>
|
||||||
|
{
|
||||||
|
Dispatcher.BeginInvoke(new Action(() =>
|
||||||
|
{
|
||||||
|
CableList.ScrollIntoView(CableList.SelectedItem);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,330 @@
|
||||||
|
using CommunityToolkit.Mvvm.Messaging;
|
||||||
|
using EPLAN.Harness.API;
|
||||||
|
using EPLAN.Harness.AppCore.StudioCommon.TreeView;
|
||||||
|
using EPLAN.Harness.Core.Controls;
|
||||||
|
using EPLAN.Harness.Primitives.Treeviews;
|
||||||
|
using EPLAN.Harness.ProjectCore;
|
||||||
|
using EPLAN.Harness.ProjectCore.Occurrences.Designer;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.Common;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Security;
|
||||||
|
using System.Security.Permissions;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
|
||||||
|
namespace Sinvo.EplanHpD.Plugin.WPFUI.ViewModel
|
||||||
|
{
|
||||||
|
public class ScannerViewModel : INotifyPropertyChanged, INotifyDataErrorInfo
|
||||||
|
{
|
||||||
|
private FlexDesigner _currentFlexDesigner;
|
||||||
|
private bool _othersWireShow = true;
|
||||||
|
private bool _continueScan = true;
|
||||||
|
private bool _enableEvent = true;
|
||||||
|
private bool _isIncludeAnnotation = true;
|
||||||
|
private bool _scanAndAssembled = true;
|
||||||
|
private int _scanedIndex = 1;
|
||||||
|
|
||||||
|
public int ScanedIndex
|
||||||
|
{
|
||||||
|
get => _scanedIndex;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_scanedIndex = value;
|
||||||
|
OnPropertyChanged(nameof(ScanedIndex));
|
||||||
|
WeakReferenceMessenger.Default.Send(new CommonMessage(value), "ScanedIndexChanged");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private string _inputCode;
|
||||||
|
public string InputCode
|
||||||
|
{
|
||||||
|
get => _inputCode;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_inputCode != value)
|
||||||
|
{
|
||||||
|
_inputCode = value;
|
||||||
|
OnPropertyChanged(nameof(InputCode));
|
||||||
|
if (_enableEvent)
|
||||||
|
{
|
||||||
|
if (_debounceTimer == null)
|
||||||
|
{
|
||||||
|
_debounceTimer = new DispatcherTimer();
|
||||||
|
_debounceTimer.Interval = TimeSpan.FromMilliseconds(1000);
|
||||||
|
_debounceTimer.Tick += DebounceTimer_Tick;
|
||||||
|
}
|
||||||
|
_debounceTimer.Stop();
|
||||||
|
_debounceTimer.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObservableCollection<ScanCableModel> ScanCableModels { get; set; } = [];
|
||||||
|
|
||||||
|
private DispatcherTimer _debounceTimer;
|
||||||
|
|
||||||
|
public ScannerViewModel()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void GetAllCables()
|
||||||
|
{
|
||||||
|
ScanCableModels.Clear();
|
||||||
|
_currentFlexDesigner.GetOrganizerOccurrences().ToList().ForEach(occ =>
|
||||||
|
{
|
||||||
|
if (occ is OccWire wire)
|
||||||
|
{
|
||||||
|
if (wire.Name.StartsWith("w_", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
ScanCableModels.Add(new ScanCableModel()
|
||||||
|
{
|
||||||
|
Index = ScanCableModels.Count + 1,
|
||||||
|
Name = wire.LibraryName,
|
||||||
|
Code = wire.Name,
|
||||||
|
Imprint = wire.Imprint
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetCurrentDoc()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HpdApi api = HpdApi.GetInstance();
|
||||||
|
var currentDocId = api.CurrentProject.GetActiveDocument()?.ID;
|
||||||
|
var designer = SelfControler<FlexBaseOrganizer>.FindInstance(currentDocId) as FlexDesigner;
|
||||||
|
if (designer != null)
|
||||||
|
{
|
||||||
|
_currentFlexDesigner = designer;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FlexMessageBox.Warning("未找到当前打开的工作区,请先打开工作区");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
FlexMessageBox.Error(ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DebounceTimer_Tick(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
_debounceTimer.Stop();
|
||||||
|
string searchText = InputCode;
|
||||||
|
PerformSearch(searchText);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PerformSearch(string searchText)
|
||||||
|
{
|
||||||
|
// 清除错误信息
|
||||||
|
ClearErrors(nameof(InputCode));
|
||||||
|
var cable = ScanCableModels.FirstOrDefault(c => c.Code.Equals(searchText, StringComparison.OrdinalIgnoreCase));
|
||||||
|
if (cable != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
OthersOccShow(!OthersWireShow);
|
||||||
|
if (_continueScan)
|
||||||
|
{
|
||||||
|
_enableEvent = false;
|
||||||
|
InputCode = string.Empty;
|
||||||
|
_enableEvent = true;
|
||||||
|
}
|
||||||
|
if (ScanAndAssembled)
|
||||||
|
{
|
||||||
|
cable.IsChecked = true;
|
||||||
|
}
|
||||||
|
ScanedIndex = Math.Max(cable.Index - 1, 0);
|
||||||
|
ToSourceByName(searchText);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 添加错误信息
|
||||||
|
AddError(nameof(InputCode), "该条码不存在于列表中");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToSourceByName(string wireName)
|
||||||
|
{
|
||||||
|
var occWire = _currentFlexDesigner.GetOccurrenceByName(wireName, typeof(OccWire));
|
||||||
|
if (occWire != null)
|
||||||
|
{
|
||||||
|
occWire.SetVisibility(true, null);
|
||||||
|
_currentFlexDesigner.SelectSet.Clear();
|
||||||
|
_currentFlexDesigner.SelectSet.Add(occWire);
|
||||||
|
_currentFlexDesigner.FitToSelectSet();
|
||||||
|
_currentFlexDesigner.SelectSet.OnSelectionChanged();
|
||||||
|
|
||||||
|
//_currentFlexDesigner.Camera.GraphicControl._HighlightNode()
|
||||||
|
/*
|
||||||
|
List<DatTreeNodeEx<BaseOccurrence>> nodeByEntity = this._occTreeView.GetNodeByEntity(baseOccurrence);
|
||||||
|
if (nodeByEntity != null)
|
||||||
|
{
|
||||||
|
foreach (DatTreeNodeEx<BaseOccurrence> datTreeNodeEx in nodeByEntity)
|
||||||
|
{
|
||||||
|
if (!this._occTreeView.SelectedNodes.Contains(datTreeNodeEx))
|
||||||
|
{
|
||||||
|
this._occTreeView.SelectedNodes.Add(datTreeNodeEx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OthersOccShow(bool show = false)
|
||||||
|
{
|
||||||
|
_currentFlexDesigner.GetOrganizerOccurrences().ToList().ForEach(occ =>
|
||||||
|
{
|
||||||
|
if (occ is OccWire wire)
|
||||||
|
{
|
||||||
|
wire.SetVisibility(show, null);
|
||||||
|
}
|
||||||
|
if (occ is OccCableForked cable)
|
||||||
|
{
|
||||||
|
cable.SetVisibility(show, null);
|
||||||
|
}
|
||||||
|
if (_isIncludeAnnotation)
|
||||||
|
{
|
||||||
|
if (occ is OccAnnotation annotation)
|
||||||
|
{
|
||||||
|
Debug.WriteLine($"BaseOccurrence -> {annotation.Name} Type: {annotation.GetType().Name}");
|
||||||
|
annotation.SetVisibility(show, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (show)
|
||||||
|
{
|
||||||
|
_currentFlexDesigner.FitToSelectSet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加属性以绑定界面上的控件,例如复选框等
|
||||||
|
public bool OthersWireShow
|
||||||
|
{
|
||||||
|
get => _othersWireShow;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_othersWireShow != value)
|
||||||
|
{
|
||||||
|
_othersWireShow = value;
|
||||||
|
OnPropertyChanged(nameof(OthersWireShow));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ContinueScan
|
||||||
|
{
|
||||||
|
get => _continueScan;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_continueScan != value)
|
||||||
|
{
|
||||||
|
_continueScan = value;
|
||||||
|
OnPropertyChanged(nameof(ContinueScan));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsIncludeAnnotation
|
||||||
|
{
|
||||||
|
get => _isIncludeAnnotation;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_isIncludeAnnotation != value)
|
||||||
|
{
|
||||||
|
_isIncludeAnnotation = value;
|
||||||
|
OnPropertyChanged(nameof(IsIncludeAnnotation));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool ScanAndAssembled
|
||||||
|
{
|
||||||
|
get => _scanAndAssembled;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (_scanAndAssembled != value)
|
||||||
|
{
|
||||||
|
_scanAndAssembled = value;
|
||||||
|
OnPropertyChanged(nameof(ScanAndAssembled));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExportWires(string path)
|
||||||
|
{
|
||||||
|
MiniExcelLibs.MiniExcel.SaveAs(path, ScanCableModels.Select(it => new
|
||||||
|
{
|
||||||
|
序号 = it.Index,
|
||||||
|
导线名称 = it.Code,
|
||||||
|
导线型号 = it.Name,
|
||||||
|
导线是否已扫描 = it.IsChecked ? "是" : "否"
|
||||||
|
}));
|
||||||
|
|
||||||
|
}
|
||||||
|
#region Notify
|
||||||
|
// 实现 INotifyPropertyChanged 接口
|
||||||
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
protected void OnPropertyChanged(string propertyName)
|
||||||
|
{
|
||||||
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||||
|
}
|
||||||
|
// 实现 INotifyDataErrorInfo 接口
|
||||||
|
private readonly Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
|
||||||
|
|
||||||
|
public bool HasErrors => _errors.Any();
|
||||||
|
|
||||||
|
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
|
||||||
|
|
||||||
|
public IEnumerable GetErrors(string propertyName)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(propertyName))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
_errors.TryGetValue(propertyName, out var errorsForName);
|
||||||
|
return errorsForName;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void OnErrorsChanged(string propertyName)
|
||||||
|
{
|
||||||
|
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddError(string propertyName, string error)
|
||||||
|
{
|
||||||
|
if (!_errors.ContainsKey(propertyName))
|
||||||
|
{
|
||||||
|
_errors[propertyName] = new List<string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_errors[propertyName].Contains(error))
|
||||||
|
{
|
||||||
|
_errors[propertyName].Add(error);
|
||||||
|
OnErrorsChanged(propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ClearErrors(string propertyName)
|
||||||
|
{
|
||||||
|
if (_errors.ContainsKey(propertyName))
|
||||||
|
{
|
||||||
|
_errors.Remove(propertyName);
|
||||||
|
OnErrorsChanged(propertyName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
using EPLAN.Harness.API;
|
||||||
|
using EPLAN.Harness.API.Plugins.Core;
|
||||||
|
using EPLAN.Harness.AppCore;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.Utils;
|
||||||
|
using Sinvo.EplanHpD.Plugin.WPFUI.View;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms.Integration;
|
||||||
|
|
||||||
|
namespace Sinvo.EplanHpD.Plugin
|
||||||
|
{
|
||||||
|
public class ScanPluginEntry : EPLAN.Harness.API.Plugins.IHpDPlugin
|
||||||
|
{
|
||||||
|
public string Name => "兴禾ProD插件-3D-扫描";
|
||||||
|
|
||||||
|
public string Author => "Sinvo";
|
||||||
|
|
||||||
|
public string Description => "兴禾EPLAN Harness proD 2.9 Studio插件,提供扫描定位功能";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取DLL版本
|
||||||
|
/// </summary>
|
||||||
|
public Version Version => Assembly.GetAssembly(this.GetType()).GetName().Version;
|
||||||
|
|
||||||
|
public System.Drawing.Image ToolbarIcon
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var imageBytes = Resource.Sinvo;
|
||||||
|
if (imageBytes != null)
|
||||||
|
{
|
||||||
|
using (var ms = new MemoryStream(imageBytes))
|
||||||
|
{
|
||||||
|
return Image.FromStream(ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ToolbarText => "扫描器";
|
||||||
|
|
||||||
|
public HpDModule Module => HpDModule.WorkSpace;
|
||||||
|
|
||||||
|
public string ToolbarTooltip => "扫描器";
|
||||||
|
|
||||||
|
public void Execute(HpdApi api)
|
||||||
|
{
|
||||||
|
//var doc = api.CurrentProject.GetActiveDocument();
|
||||||
|
var window = new ScannerWindow();
|
||||||
|
ElementHost.EnableModelessKeyboardInterop(window);
|
||||||
|
var mainApp = BaseApp.ActiveApplication;
|
||||||
|
var helper = new System.Windows.Interop.WindowInteropHelper(window);
|
||||||
|
helper.Owner = mainApp.Handle;
|
||||||
|
window.Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialize()
|
||||||
|
{
|
||||||
|
AppDomainDllLoader.SetLaoder();
|
||||||
|
ApplicationExt.InitApplication();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Terminate()
|
||||||
|
{
|
||||||
|
//throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -120,6 +120,7 @@
|
||||||
<DesignTime>True</DesignTime>
|
<DesignTime>True</DesignTime>
|
||||||
<DependentUpon>Resource.resx</DependentUpon>
|
<DependentUpon>Resource.resx</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="ScanPluginEntry.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="Resource.resx">
|
<EmbeddedResource Include="Resource.resx">
|
||||||
|
|
Loading…
Reference in New Issue