Browse Source

commit SeTMViewModel, SeTMView for Venus SE's Transfer in UI

intern02 1 year ago
parent
commit
5e0dcdadc1

+ 8 - 0
Venus/Venus_MainPages/Venus_MainPages.csproj

@@ -190,6 +190,7 @@
     <Compile Include="ViewModels\RoleViewModel.cs" />
     <Compile Include="ViewModels\SequenceViewModel.cs" />
     <Compile Include="ViewModels\SETMOperationViewModel.cs" />
+    <Compile Include="ViewModels\SeTMViewModel.cs" />
     <Compile Include="ViewModels\SystemConfigViewModel.cs" />
     <Compile Include="ViewModels\TMOperationViewModel.cs" />
     <Compile Include="ViewModels\TMViewModel.cs" />
@@ -271,6 +272,9 @@
     <Compile Include="Views\SETMOperationView.xaml.cs">
       <DependentUpon>SETMOperationView.xaml</DependentUpon>
     </Compile>
+    <Compile Include="Views\SeTMView.xaml.cs">
+      <DependentUpon>SeTMView.xaml</DependentUpon>
+    </Compile>
     <Compile Include="Views\SystemConfigView.xaml.cs">
       <DependentUpon>SystemConfigView.xaml</DependentUpon>
     </Compile>
@@ -424,6 +428,10 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
+    <Page Include="Views\SeTMView.xaml">
+      <Generator>MSBuild:Compile</Generator>
+      <SubType>Designer</SubType>
+    </Page>
     <Page Include="Views\SystemConfigView.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>

+ 442 - 0
Venus/Venus_MainPages/ViewModels/SeTMViewModel.cs

@@ -0,0 +1,442 @@
+using Aitex.Sorter.Common;
+using MECF.Framework.Common.DataCenter;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.OperationCenter;
+using MECF.Framework.Common.Schedulers;
+using OpenSEMI.ClientBase;
+using Prism.Commands;
+using Prism.Mvvm;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Threading;
+using Venus_Core;
+using Venus_MainPages.Unity;
+using Venus_Themes.CustomControls;
+
+namespace Venus_MainPages.ViewModels
+{
+    public enum SeTMModule
+    {
+        PMA, PMB, PMC, VCE1, Aligner
+    }
+    public enum SeTMBlade
+    {
+        Blade1, Blade2
+    }
+    internal class SeTMViewModel : BindableBase
+    {
+        #region 私有字段
+        private ModuleInfo m_VCE1ModuleInfo;
+        private ModuleInfo m_AlignerModuleInfo;
+        private ModuleInfo m_TMModuleInfo;
+
+        //Wafer
+        private WaferInfo m_PMAWafer;
+        private WaferInfo m_PMBWafer;
+        //Door
+        private bool m_PMADoorIsOpen;
+        private bool m_PMBDoorIsOpen;
+        //Pick、Place、Extend、Retract行下拉框内容
+        private SeTMModule m_PickSelectedModule;
+        private SeTMModule m_PlaceSelectedModule;
+        private SeTMModule m_ExtendSelectedModule;
+        private SeTMModule m_RetractSelectedModule;
+        private SeTMBlade m_PickSelectedBlade;
+        private SeTMBlade m_PlaceSelectedBlade;
+        private SeTMBlade m_ExtendSelectedBlade;
+        private SeTMBlade m_RetractSelectedBlade;
+
+        //Pick、Place、Extend、Retract行下拉框关联
+        private ObservableCollection<int> m_PickSoltItemsSource = new ObservableCollection<int>();
+        private ObservableCollection<int> m_PlaceSoltItemsSource = new ObservableCollection<int>();
+        private ObservableCollection<int> m_ExtendSoltItemsSource = new ObservableCollection<int>();
+        private ObservableCollection<int> m_RetractSoltItemsSource = new ObservableCollection<int>();
+        private int m_PickSoltSelectedIndex;
+        private int m_PlaceSoltSelectedIndex;
+        private int m_ExtendSoltSelectedIndex;
+        private int m_RetractSoltSelectedIndex;
+
+
+        //下拉框内容
+        private List<SeTMModule> m_TMModules = new List<SeTMModule>();
+
+
+        private bool m_PMAIsInstalled;
+        private bool m_PMBIsInstalled;
+        private bool m_PMCIsInstalled;
+        private bool m_VCE1IsInstalled;
+        private bool m_AlignerIsInstalled;
+        #endregion
+
+        #region 属性
+        public WaferInfo PMAWafer
+        {
+            get { return m_PMAWafer; }
+            set { SetProperty(ref m_PMAWafer, value); }
+        }
+        public WaferInfo PMBWafer
+        {
+            get { return m_PMBWafer; }
+            set { SetProperty(ref m_PMBWafer, value); }
+        }
+        public bool PMADoorIsOpen
+        {
+            get { return m_PMADoorIsOpen; }
+            set { SetProperty(ref m_PMADoorIsOpen, value); }
+        }
+        public bool PMBDoorIsOpen
+        {
+            get { return m_PMBDoorIsOpen; }
+            set { SetProperty(ref m_PMBDoorIsOpen, value); }
+        }
+        public ModuleInfo VCE1ModuleInfo
+        {
+            get { return m_VCE1ModuleInfo; }
+            set
+            {
+                SetProperty(ref m_VCE1ModuleInfo, value);
+            }
+        }
+        public ModuleInfo AlignerModuleInfo
+        {
+            get { return m_AlignerModuleInfo; }
+            set
+            {
+                SetProperty(ref m_AlignerModuleInfo, value);
+            }
+        }
+
+        public bool PMAIsInstalled
+        {
+            get { return m_PMAIsInstalled; }
+            set { SetProperty(ref m_PMAIsInstalled, value); }
+        }
+        public bool PMBIsInstalled
+        {
+            get { return m_PMBIsInstalled; }
+            set { SetProperty(ref m_PMBIsInstalled, value); }
+        }
+        public bool PMCIsInstalled
+        {
+            get { return m_PMCIsInstalled; }
+            set { SetProperty(ref m_PMCIsInstalled, value); }
+        }
+        public bool VCE1IsInstalled
+        {
+            get { return m_VCE1IsInstalled; }
+            set { SetProperty(ref m_VCE1IsInstalled, value); }
+        }
+        public bool AlignerIsInstalled
+        {
+            get { return m_AlignerIsInstalled; }
+            set { SetProperty(ref m_AlignerIsInstalled, value); }
+        }
+
+        public List<SeTMModule> TMModules
+        {
+            get { return m_TMModules; }
+            set { SetProperty(ref m_TMModules, value); }
+        }
+
+        //Module属性
+        public SeTMModule PickSelectedModule
+        {
+            get { return m_PickSelectedModule; }
+            set { SetProperty(ref m_PickSelectedModule, value); }
+        }
+        public SeTMModule PlaceSelectedModule
+        {
+            get { return m_PlaceSelectedModule; }
+            set { SetProperty(ref m_PlaceSelectedModule, value); }
+        }
+        public SeTMModule ExtendSelectedModule
+        {
+            get { return m_ExtendSelectedModule; }
+            set { SetProperty(ref m_ExtendSelectedModule, value); }
+        }
+        public SeTMModule RetractSelectedModule
+        {
+            get { return m_RetractSelectedModule; }
+            set { SetProperty(ref m_RetractSelectedModule, value); }
+        }
+        public ModuleInfo TMModuleInfo
+        {
+            get { return m_TMModuleInfo; }
+            set
+            {
+                SetProperty(ref m_TMModuleInfo, value);
+            }
+        }
+        //Blade属性
+        public SeTMBlade PickSelectedBlade
+        {
+            get { return m_PickSelectedBlade; }
+            set { SetProperty(ref m_PickSelectedBlade, value); }
+        }
+        public SeTMBlade PlaceSelectedBlade
+        {
+            get { return m_PlaceSelectedBlade; }
+            set { SetProperty(ref m_PlaceSelectedBlade, value); }
+        }
+        public SeTMBlade ExtendSelectedBlade
+        {
+            get { return m_ExtendSelectedBlade; }
+            set { SetProperty(ref m_ExtendSelectedBlade, value); }
+        }
+        public SeTMBlade RetractSelectedBlade
+        {
+            get { return m_RetractSelectedBlade; }
+            set { SetProperty(ref m_RetractSelectedBlade, value); }
+        }
+        public ObservableCollection<int> PickSoltItemsSource
+        {
+            get { return m_PickSoltItemsSource; }
+            set { SetProperty(ref m_PickSoltItemsSource, value); }
+        }
+        public ObservableCollection<int> PlaceSoltItemsSource
+        {
+            get { return m_PlaceSoltItemsSource; }
+            set { SetProperty(ref m_PlaceSoltItemsSource, value); }
+        }
+        public ObservableCollection<int> ExtendSoltItemsSource
+        {
+            get { return m_ExtendSoltItemsSource; }
+            set { SetProperty(ref m_ExtendSoltItemsSource, value); }
+        }
+        public ObservableCollection<int> RetractSoltItemsSource
+        {
+            get { return m_RetractSoltItemsSource; }
+            set { SetProperty(ref m_RetractSoltItemsSource, value); }
+        }
+        public int PickSoltSelectedIndex
+        {
+            get { return m_PickSoltSelectedIndex; }
+            set { SetProperty(ref m_PickSoltSelectedIndex, value); }
+        }
+        public int PlaceSoltSelectedIndex
+        {
+            get { return m_PlaceSoltSelectedIndex; }
+            set { SetProperty(ref m_PlaceSoltSelectedIndex, value); }
+        }
+        public int ExtendSoltSelectedIndex
+        {
+            get { return m_ExtendSoltSelectedIndex; }
+            set { SetProperty(ref m_ExtendSoltSelectedIndex, value); }
+        }
+        public int RetractSoltSelectedIndex
+        {
+            get { return m_RetractSoltSelectedIndex; }
+            set { SetProperty(ref m_RetractSoltSelectedIndex, value); }
+        }
+
+        #endregion
+
+        #region 命令
+        //模块下拉框选择命令
+        private DelegateCommand<object> _ModuleChangeCommand;
+        public DelegateCommand<object> ModuleChangeCommand =>
+            _ModuleChangeCommand ?? (_ModuleChangeCommand = new DelegateCommand<object>(OnModuleChange));
+        //Pick按钮命令
+        private DelegateCommand _PickCommand;
+        public DelegateCommand PickCommand =>
+            _PickCommand ?? (_PickCommand = new DelegateCommand(OnPick));
+        //Place按钮命令
+        private DelegateCommand _PlaceCommand;
+        public DelegateCommand PlaceCommand =>
+            _PlaceCommand ?? (_PlaceCommand = new DelegateCommand(OnPlace));
+        //Extend按钮命令
+        private DelegateCommand _ExtendCommand;
+        public DelegateCommand ExtendCommand =>
+            _ExtendCommand ?? (_ExtendCommand = new DelegateCommand(OnExtend));
+        //Retract按钮命令
+        private DelegateCommand _RetractCommand;
+        public DelegateCommand RetractCommand =>
+            _RetractCommand ?? (_RetractCommand = new DelegateCommand(OnRetract));
+        //RobotHome按钮命令
+        public DelegateCommand _RobotHomeCommand;
+        public DelegateCommand RobotHomeCommand =>
+            _RobotHomeCommand ?? (_RobotHomeCommand = new DelegateCommand(OnRobotHome));
+        #endregion
+
+        #region 构造函数
+        public SeTMViewModel()
+        {
+            string allModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString();
+            PMAIsInstalled = allModules.Contains("PMA");
+            PMBIsInstalled = allModules.Contains("PMB");
+            PMCIsInstalled = allModules.Contains("PMC");
+            VCE1IsInstalled = allModules.Contains("VCE1");
+            AlignerIsInstalled = allModules.Contains("VPA");
+            if (PMAIsInstalled == true)
+            {
+                TMModules.Add(SeTMModule.PMA);
+            }
+            if (PMBIsInstalled == true)
+            {
+                TMModules.Add(SeTMModule.PMB);
+            }
+            if (PMCIsInstalled == true)
+            {
+                TMModules.Add(SeTMModule.PMC);
+            }
+            if (VCE1IsInstalled == true)
+            {
+                TMModules.Add(SeTMModule.VCE1);
+            }
+            if (AlignerIsInstalled == true)
+            {
+                TMModules.Add(SeTMModule.Aligner);
+            }
+
+            PickSoltItemsSource.Add(1);
+            PlaceSoltItemsSource.Add(1);
+            ExtendSoltItemsSource.Add(1);
+            RetractSoltItemsSource.Add(1);
+            DispatcherTimer timer = new DispatcherTimer();
+            timer.Interval = TimeSpan.FromSeconds(0.1);
+            timer.Tick += Timer_Tick;
+            timer.Start();
+
+        }
+        #endregion
+
+        #region 命令方法
+        //模块选择根据obj选择下拉框内容
+        private void OnModuleChange(object obj)
+        {
+            var value = obj.ToString();
+            switch (value)
+            {
+                case "Pick":
+                    PickSoltItemsSource.Clear();
+                    if ((int)PickSelectedModule == 3)
+                    {
+                        for (int i = 1; i <= 25; i++)
+                        {
+                            PickSoltItemsSource.Add(i);
+                        }
+                    }
+                    else
+                    {
+                        PickSoltItemsSource.Add(1);
+
+                    }
+                    PickSoltSelectedIndex = 0;
+                    break;
+                case "Place":
+                    PlaceSoltItemsSource.Clear();
+                    if ((int)PlaceSelectedModule == 3)
+                    {
+                        for (int i = 1; i <= 25; i++)
+                        {
+                            PlaceSoltItemsSource.Add(i);
+                        }
+                    }
+                    else
+                    {
+                        PlaceSoltItemsSource.Add(1);
+
+                    }
+                    PlaceSoltSelectedIndex = 0;
+                    break;
+                case "Extend":
+                    ExtendSoltItemsSource.Clear();
+                    if ((int)ExtendSelectedModule == 3)
+                    {
+                        for (int i = 1; i <= 25; i++)
+                        {
+                            ExtendSoltItemsSource.Add(i);
+                        }
+                    }
+                    else
+                    {
+                        ExtendSoltItemsSource.Add(1);
+
+                    }
+                    ExtendSoltSelectedIndex = 0;
+                    break;
+                case "Retract":
+                    RetractSoltItemsSource.Clear();
+                    if ((int)RetractSelectedModule == 3)
+                    {
+                        for (int i = 1; i <= 25; i++)
+                        {
+                            RetractSoltItemsSource.Add(i);
+                        }
+                    }
+                    else
+                    {
+                        RetractSoltItemsSource.Add(1);
+
+                    }
+                    RetractSoltSelectedIndex = 0;
+                    break;
+
+            }
+
+        }
+        private void OnPick()
+        {
+            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PickSelectedModule.ToString(), true);
+            var selectedHand = (Hand)Enum.Parse(typeof(Hand), PickSelectedBlade.ToString(), true);
+            if ((int)PickSelectedModule < TMModules.Count - 2)
+            {
+                InvokeClient.Instance.Service.DoOperation($"SETM.PMPick", moduleName, PickSoltItemsSource[PickSoltSelectedIndex] - 1, selectedHand);
+            }
+            else
+            {
+                InvokeClient.Instance.Service.DoOperation($"SETM.Pick", moduleName, PickSoltItemsSource[PickSoltSelectedIndex] - 1, selectedHand);
+            }
+
+        }
+        private void OnPlace()
+        {
+            //Queue<MoveItem> moveItems = new Queue<MoveItem>();
+            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), PlaceSelectedModule.ToString(), true);
+            var selectedHand = (Hand)Enum.Parse(typeof(Hand), PlaceSelectedBlade.ToString(), true);
+            //MoveItem moveItem = new MoveItem(moduleName, PlaceSoltItemsSource[PickSoltSelectedIndex] - 1, 0, 0, selectedHand);
+            //moveItems.Enqueue(moveItem);
+            if ((int)PickSelectedModule < TMModules.Count - 2)
+            {
+                InvokeClient.Instance.Service.DoOperation($"SETM.PMPlace", moduleName, PlaceSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand);
+            }
+            else
+            {
+                InvokeClient.Instance.Service.DoOperation($"SETM.Pick", moduleName, PlaceSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand);
+            }
+        }
+        private void OnExtend()
+        {
+            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), ExtendSelectedModule.ToString(), true);
+            var selectedHand = (Hand)Enum.Parse(typeof(Hand), ExtendSelectedBlade.ToString(), true);
+            InvokeClient.Instance.Service.DoOperation($"SETM.Extend", moduleName, ExtendSoltItemsSource[ExtendSoltSelectedIndex] - 1, selectedHand);
+        }
+        private void OnRetract()
+        {
+            //Queue<MoveItem> moveItems = new Queue<MoveItem>();
+            var moduleName = (ModuleName)Enum.Parse(typeof(ModuleName), RetractSelectedModule.ToString(), true);
+            var selectedHand = (Hand)Enum.Parse(typeof(Hand), RetractSelectedBlade.ToString(), true);
+            //MoveItem moveItem = new MoveItem(moduleName, RetractSoltItemsSource[PickSoltSelectedIndex] - 1, 0, 0, selectedHand);
+            //moveItems.Enqueue(moveItem);
+            InvokeClient.Instance.Service.DoOperation($"SETM.Retract", moduleName, RetractSoltItemsSource[PlaceSoltSelectedIndex] - 1, selectedHand);
+        }
+        //令选择的模块下发Home指令
+        private void OnRobotHome()
+        {
+            InvokeClient.Instance.Service.DoOperation($"SETM.RobotHome");
+        }
+        #endregion
+
+        #region 私有方法
+        private void Timer_Tick(object sender, EventArgs e)
+        {
+            TMModuleInfo = ModuleManager.ModuleInfos["TMRobot"];
+        }
+        #endregion
+    }
+
+}

+ 136 - 0
Venus/Venus_MainPages/Views/SeTMView.xaml

@@ -0,0 +1,136 @@
+<UserControl x:Class="Venus_MainPages.Views.SeTMView"
+             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:local="clr-namespace:Venus_MainPages.Views"
+             xmlns:userControls="clr-namespace:Venus_Themes.UserControls;assembly=Venus_Themes"
+             xmlns:customControls="clr-namespace:Venus_Themes.CustomControls;assembly=Venus_Themes"
+             xmlns:converters="clr-namespace:Venus_Themes.Converters;assembly=Venus_Themes"
+             xmlns:unity="clr-namespace:Venus_MainPages.Unity"
+             xmlns:prism="http://prismlibrary.com/"
+             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
+             prism:ViewModelLocator.AutoWireViewModel="True"
+
+             mc:Ignorable="d"
+             d:DesignHeight="450" d:DesignWidth="1500">
+	<Canvas>
+		<Grid Canvas.Top="20" Canvas.Right="40" Width="550">
+			<Grid.RowDefinitions>
+				<RowDefinition Height="30"/>
+				<RowDefinition Height="Auto"/>
+			</Grid.RowDefinitions>
+			<Border  BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_FirstTitle}" Padding="5,1">
+				<StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
+					<Path Data="M0,0 L5,0 5,5 z" Fill="White" HorizontalAlignment="Left" Grid.Row="1" RenderTransformOrigin="0.5,0.5" Stretch="Fill" Width="5" Height="5">
+						<Path.RenderTransform>
+							<TransformGroup>
+								<ScaleTransform/>
+								<SkewTransform/>
+								<RotateTransform Angle="45"/>
+								<TranslateTransform/>
+							</TransformGroup>
+						</Path.RenderTransform>
+					</Path>
+					<TextBlock  Margin="5,0,0,0" Text="SeTM Robot Operation" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_White}" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+				</StackPanel>
+			</Border>
+			<Grid unity:GridOptions.ShowBorder="True" unity:GridOptions.LineBrush="Black" Grid.Row="1" Background="{DynamicResource Table_BG_Content}">
+				<!--行数列数设置-->
+				<Grid.RowDefinitions>
+					<RowDefinition Height="25"/>
+					<RowDefinition/>
+					<RowDefinition/>
+					<RowDefinition/>
+					<RowDefinition/>
+					<RowDefinition/>
+					<RowDefinition/>
+				</Grid.RowDefinitions>
+				<Grid.ColumnDefinitions>
+					<ColumnDefinition/>
+					<ColumnDefinition/>
+					<ColumnDefinition/>
+					<ColumnDefinition/>
+				</Grid.ColumnDefinitions>
+				<TextBlock Text="Module"                    HorizontalAlignment="Center" VerticalAlignment="Center"   FontSize="14" />
+				<TextBlock Text="Slot" Grid.Column="1"      HorizontalAlignment="Center" VerticalAlignment="Center"   FontSize="14"/>
+				<TextBlock Text="Blada" Grid.Column="2"       HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14"/>
+				<TextBlock Text="Operation" Grid.Column="3" HorizontalAlignment="Center" VerticalAlignment="Center"   FontSize="14"/>
+				<!--第1行-->
+				<ComboBox Grid.Row="1" Margin="5" SelectedItem="{Binding PickSelectedModule}" ItemsSource="{Binding TMModules}">
+					<i:Interaction.Triggers>
+						<i:EventTrigger EventName="SelectionChanged">
+							<i:InvokeCommandAction Command="{Binding ModuleChangeCommand}" CommandParameter="Pick"/>
+						</i:EventTrigger>
+					</i:Interaction.Triggers>
+				</ComboBox>
+				<ComboBox Grid.Row="1" Grid.Column="1"   Margin="5" ItemsSource="{Binding PickSoltItemsSource}" SelectedIndex="{Binding PickSoltSelectedIndex}"/>
+				<ComboBox Grid.Row="1" Grid.Column="2"   Margin="5"  SelectedItem="{Binding PickSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
+				<Button   Grid.Row="1" Grid.Column="3"   Margin="5"  Content="Pick" Height="25" Command="{Binding PickCommand}"/>
+				<!--第2行-->
+				<ComboBox Grid.Row="2"                 Margin="5" SelectedItem="{Binding PlaceSelectedModule}" ItemsSource="{Binding TMModules}">
+					<i:Interaction.Triggers>
+						<i:EventTrigger EventName="SelectionChanged">
+							<i:InvokeCommandAction Command="{Binding ModuleChangeCommand}" CommandParameter="Place" />
+						</i:EventTrigger>
+					</i:Interaction.Triggers>
+				</ComboBox>
+				<ComboBox Grid.Row="2" Grid.Column="1" Margin="5" ItemsSource="{Binding PlaceSoltItemsSource}" SelectedIndex="{Binding PlaceSoltSelectedIndex}"/>
+				<ComboBox Grid.Row="2" Grid.Column="2" Margin="5" SelectedItem="{Binding PlaceSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
+				<Button   Grid.Row="2" Grid.Column="3" Margin="5" Content="Place" Height="25" Command="{Binding PlaceCommand}"/>
+				<!--第3行-->
+				<ComboBox Grid.Row="3"                 Margin="5" SelectedItem="{Binding ExtendSelectedModule}" ItemsSource="{Binding TMModules}">
+					<i:Interaction.Triggers>
+						<i:EventTrigger EventName="SelectionChanged">
+							<i:InvokeCommandAction Command="{Binding ModuleChangeCommand}" CommandParameter="Extend" />
+						</i:EventTrigger>
+					</i:Interaction.Triggers>
+				</ComboBox>
+				<ComboBox Grid.Row="3" Grid.Column="1" Margin="5" ItemsSource="{Binding ExtendSoltItemsSource}" SelectedIndex="{Binding ExtendSoltSelectedIndex}"/>
+				<ComboBox Grid.Row="3" Grid.Column="2" Margin="5" SelectedItem="{Binding ExtendSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
+				<Button   Grid.Row="3" Grid.Column="3" Margin="5" Content="Extend" Height="25" Command="{Binding ExtendCommand}"/>
+				<!--第4行-->
+				<ComboBox Grid.Row="4"                 Margin="5" SelectedItem="{Binding RetractSelectedModule}" ItemsSource="{Binding TMModules}">
+					<i:Interaction.Triggers>
+						<i:EventTrigger EventName="SelectionChanged">
+							<i:InvokeCommandAction Command="{Binding ModuleChangeCommand}" CommandParameter="Retract" />
+						</i:EventTrigger>
+					</i:Interaction.Triggers>
+				</ComboBox>
+				<ComboBox Grid.Row="4" Grid.Column="1" Margin="5" ItemsSource="{Binding RetractSoltItemsSource}" SelectedIndex="{Binding RetractSoltSelectedIndex}"/>
+				<ComboBox Grid.Row="4" Grid.Column="2" Margin="5" SelectedItem="{Binding RetractSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
+				<Button   Grid.Row="4" Grid.Column="3" Margin="5" Content="Retract" Height="25" Command="{Binding RetractCommand}"/>
+				<!--第5行-->
+				<ComboBox   Grid.Row="5" Grid.Column="0"  Margin="5"  SelectedItem="{Binding WaferRobotTAction}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
+				<ComboBox   Grid.Row="5" Grid.Column="2"  Margin="5"   SelectedItem="{Binding GoToSelectedBlade}" unity:ItemsControlHelper.EnumValuesToItemsSource="True"/>
+				<Button     Grid.Row="5" Grid.Column="3"  Margin="5" Height="25"  Content="Goto" IsEnabled="{Binding Path=IsManualMode}" Command="{Binding GotoCommand}"/>
+				<Button Grid.Row="6" Grid.Column="3"  Margin="5" Height="25" Content="Robot Home" Command="{Binding RobotHomeCommand}" />
+			</Grid>
+		</Grid>
+
+		<!--Vce PM Aligner-->
+		<Canvas Canvas.Top="100" Canvas.Left="20">
+			<Viewbox Width="420" Height="720" Stretch="Fill" >
+				<Canvas Canvas.Top="100" Width="450" Height="800">
+
+					<userControls:VenusSETM Width="140" Height="140" Canvas.Top="140" Canvas.Left="372" ></userControls:VenusSETM>
+					<userControls:TMChamber ModuleName="PMA" x:Name="PMA" Canvas.Top="295"  Canvas.Left="233" Width="140" Height="140" RotateTransformValue="-90"  DoorIsOpen="{Binding RtDataValues[PMA.IsSlitDoorClosed],Converter={StaticResource BoolToBool}}" RobotWafer="{Binding PMAWafer}" PMVisibility="{Binding PMAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" HorizontalAlignment="Center" VerticalAlignment="Top"/>
+					<userControls:TMChamber ModuleName="PMB" x:Name="PMB" Canvas.Top="0"   Canvas.Left="387" Width="140" Height="140"  DoorIsOpen="{Binding RtDataValues[PMB.IsSlitDoorClosed],Converter={StaticResource BoolToBool}}" RobotWafer="{Binding PMBWafer}" PMVisibility="{Binding PMBIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" HorizontalAlignment="Center" VerticalAlignment="Top"/>
+					<!--<userControls:TMChamber ModuleName="PMC" x:Name="PMC" Canvas.Top="155"  Canvas.Left="680" Width="140" Height="140" RotateTransformValue="90"  DoorIsOpen="{Binding RtDataValues[PMC.IsSlitDoorClosed],Converter={StaticResource BoolToBool}}" RobotWafer="{Binding PMCWafer}" PMVisibility="{Binding PMCIsInstalled,Converter={StaticResource bool2VisibilityConverter}}" HorizontalAlignment="Center" VerticalAlignment="Top"/>-->
+					<TextBlock Text="Aligner" FontSize="25" Canvas.Top="185" Canvas.Left="635">
+						<TextBlock.RenderTransform>
+							<RotateTransform Angle="90" />
+						</TextBlock.RenderTransform>
+					</TextBlock>
+					<TextBlock Canvas.Top="495" Canvas.Left="435" Text="Vce" FontSize="25" FontWeight="Normal"></TextBlock>
+					<userControls:Vce Canvas.Top="340" Canvas.Left="355" Width="200" Height="180"></userControls:Vce>
+                    <userControls:EFEMFrontView UnitData="{Binding TMModuleInfo}" Title="SeTM Robot"      Canvas.Top="180" Canvas.Left="20"/>
+
+				</Canvas>
+			</Viewbox>
+		</Canvas>
+	</Canvas>
+
+
+
+</UserControl>

+ 28 - 0
Venus/Venus_MainPages/Views/SeTMView.xaml.cs

@@ -0,0 +1,28 @@
+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.Navigation;
+using System.Windows.Shapes;
+
+namespace Venus_MainPages.Views
+{
+    /// <summary>
+    /// SeTMView.xaml 的交互逻辑
+    /// </summary>
+    public partial class SeTMView : UserControl
+    {
+        public SeTMView()
+        {
+            InitializeComponent();
+        }
+    }
+}