Kaynağa Gözat

Add Metal Animation; Modify several UI displays;

niuyx 2 ay önce
ebeveyn
işleme
872e30ee95

+ 25 - 2
CyberX8_MainPages/ViewModels/MetalCMHomePageViewModel.cs

@@ -12,7 +12,6 @@ using MECF.Framework.Common.WaferHolder;
 using Prism.Mvvm;
 using System;
 using System.Collections.Generic;
-using System.Collections.ObjectModel;
 using System.Windows.Input;
 using System.Windows.Threading;
 
@@ -68,6 +67,10 @@ namespace CyberX8_MainPages.ViewModels
         /// AutoMode页面功能启用
         /// </summary>
         private bool _isAutoEnabled;
+        /// <summary>
+        /// Linmot ID
+        /// </summary>
+        private string _linmotID;
         #endregion
 
         #region Wafer Holder
@@ -151,6 +154,10 @@ namespace CyberX8_MainPages.ViewModels
         /// IsErrorState
         /// </summary>
         private bool _isErrorState;
+        /// <summary>
+        /// IsRunLinmot
+        /// </summary>
+        private bool _isRunLinmot;
         #endregion
 
         #region PowerSupplier
@@ -375,6 +382,14 @@ namespace CyberX8_MainPages.ViewModels
             get { return _clampStatus; }
             set { SetProperty(ref _clampStatus, value); }
         }
+        /// <summary>
+        /// IsRunLinmot
+        /// </summary>
+        public bool IsRunLinmot
+        {
+            get { return _isRunLinmot; }
+            set { SetProperty(ref _isRunLinmot, value); }
+        }
         #endregion
 
         #region PowerSupplier
@@ -478,13 +493,19 @@ namespace CyberX8_MainPages.ViewModels
             _rtDataKeys.Add($"{Module}.CurrentRecipe");
             _rtDataKeys.Add($"{Module}.TotalTime");
             _rtDataKeys.Add($"{Module}.TimeRemain");
-
+            _rtDataKeys.Add($"{Module}.Linmot.ID");
             if (_timer == null)
             {
                 _timer = new DispatcherTimer();
                 _timer.Interval = TimeSpan.FromMilliseconds(200);
                 _timer.Tick += Timer_Tick;
             }
+            if (_rtDataKeys.Count != 0)
+            {
+                _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
+                if (_rtDataValueDic != null) _linmotID = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.Linmot.ID");
+                _rtDataKeys.Add($"{_linmotID}.StatusWord");
+            }
             _timer.Start();
         }
         /// <summary>
@@ -503,6 +524,8 @@ namespace CyberX8_MainPages.ViewModels
                     MetalPersistent = CommonFunction.GetValue<MetalPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
                     ClampStatus = true ? "Disconnect":(false ? "Clamped" : "Unclamped");
                     WaferHolderInfo = CommonFunction.GetValue<WaferHolderInfo>(_rtDataValueDic, $"{Module}.WaferHolder");
+                    short statusWord = CommonFunction.GetValue<short>(_rtDataValueDic, $"{_linmotID}.StatusWord");
+                    IsRunLinmot = (statusWord & 0b010000000000000) >> 13 == 1;
                     if (WaferHolderInfo != null)
                     {
                         IsWaferHolder = true;

+ 25 - 0
CyberX8_MainPages/ViewModels/MetalSHHomePageViewModel.cs

@@ -65,6 +65,10 @@ namespace CyberX8_MainPages.ViewModels
         /// AutoMode页面功能启用
         /// </summary>
         private bool _isAutoEnabled;
+        /// <summary>
+        /// Linmot ID
+        /// </summary>
+        private string _linmotID;
         #endregion
 
         #region Wafer Holder
@@ -165,6 +169,10 @@ namespace CyberX8_MainPages.ViewModels
         /// 所在reservoir的pump是否打开
         /// </summary>
         private bool _subordinateReservoirPumpOn;
+        /// <summary>
+        /// IsRunLinmot
+        /// </summary>
+        private bool _isRunLinmot;
         #endregion
 
         #region PowerSupplier
@@ -384,6 +392,14 @@ namespace CyberX8_MainPages.ViewModels
             get { return _isSingalPump; }
             set { SetProperty(ref _isSingalPump, value); }
         }
+        /// <summary>
+        /// IsRunLinmot
+        /// </summary>
+        public bool IsRunLinmot
+        {
+            get { return _isRunLinmot; }
+            set { SetProperty(ref _isRunLinmot, value); }
+        }
         #endregion
 
         #region PowerSupplier
@@ -455,12 +471,19 @@ namespace CyberX8_MainPages.ViewModels
             _rtDataKeys.Add($"{Module}.TimeRemain");
             _rtDataKeys.Add($"{Module}.IsSingalPump");
             _rtDataKeys.Add($"{_reservoirName}.SubordinateReservoirPump");
+            _rtDataKeys.Add($"{Module}.Linmot.ID");
             if (_timer == null)
             {
                 _timer = new DispatcherTimer();
                 _timer.Interval = TimeSpan.FromMilliseconds(200);
                 _timer.Tick += Timer_Tick;
             }
+            if (_rtDataKeys.Count != 0)
+            {
+                _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
+                if (_rtDataValueDic != null) _linmotID = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.Linmot.ID");
+                _rtDataKeys.Add($"{_linmotID}.StatusWord");
+            }
             _timer.Start();
         }
         /// <summary>
@@ -481,6 +504,8 @@ namespace CyberX8_MainPages.ViewModels
                     MetalData.CellPump ^= _subordinateReservoirPumpOn;
                     MetalPersistent = CommonFunction.GetValue<MetalPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");                   
                     WaferHolderInfo = CommonFunction.GetValue<WaferHolderInfo>(_rtDataValueDic, $"{Module}.WaferHolder");
+                    short statusWord = CommonFunction.GetValue<short>(_rtDataValueDic, $"{_linmotID}.StatusWord");
+                    IsRunLinmot = (statusWord & 0b010000000000000) >> 13 == 1;
                     if (WaferHolderInfo != null)
                     {
                         IsWaferHolder = true;

+ 1 - 1
CyberX8_MainPages/Views/MetalCMHomePageView.xaml

@@ -137,7 +137,7 @@
         </Grid>
         <!--MetalCMUI动画-->
         <Grid Grid.Row="2"  Grid.Column="1" Grid.ColumnSpan="2" Grid.RowSpan="2">
-            <UserControls:MetalCMUIControl HorizontalAlignment="Left"  VerticalAlignment="Bottom" Margin="-180,0,0,30" IsEnabled="{Binding IsEnabled}"
+            <UserControls:MetalCMUIControl HorizontalAlignment="Left"  VerticalAlignment="Bottom" Margin="-180,0,0,30" IsEnabled="{Binding IsEnabled}" IsRunLinmot="{Binding IsRunLinmot}"
                                            IsClampValveOn="{Binding MetalData.WHClamp}" IsUnclampValveOn="{Binding MetalData.WHUnclamp}" IsCirculationValveOn="{Binding MetalData.CellFlowValve}"
                                            ModuleName="{Binding Module}" IsError="{Binding IsErrorState}" IsWaferHolder="{Binding IsWaferHolder}"/>
         </Grid>

+ 1 - 1
CyberX8_MainPages/Views/MetalSHHomePageView.xaml

@@ -138,7 +138,7 @@
         <!--MetalCMUI动画-->
         <Grid Grid.Row="2"  Grid.Column="1" Grid.ColumnSpan="2" Grid.RowSpan="2">
             <UserControls:MetalSHUIControl HorizontalAlignment="Left"  VerticalAlignment="Bottom" Margin="-180,0,0,28"
-                                           ModuleName="{Binding Module}" IsError="{Binding IsErrorState}" IsEnabled="{Binding IsEnabled}"
+                                           ModuleName="{Binding Module}" IsError="{Binding IsErrorState}" IsEnabled="{Binding IsEnabled}" IsRunLinmot="{Binding IsRunLinmot}"
                                            IsClampValveOpen="{Binding MetalData.WaferHolderClamp}" IsCellCirculationValveOn="{Binding MetalData.Circulation}" 
                                            IsCellPumpOn="{Binding MetalData.CellPump}" MetalData="{Binding MetalData}" IsWaferHolder="{Binding IsWaferHolder}"
                                            IsSingalPump="{Binding IsSingalPump}"/>

+ 1 - 1
CyberX8_RT/Modules/Loader/LoaderLoadSideRoutine.cs

@@ -106,7 +106,7 @@ namespace CyberX8_RT.Modules.Loader
         /// <summary>
         /// is SideA
         /// </summary>
-        public bool IsSideA { get { return _side == "A" ? true : false; } }
+        public bool IsSideA { get { return _side == SIDE_A ? true : false; } }
         #endregion
 
         /// <summary>

+ 10 - 11
CyberX8_RT/Modules/Loader/LoaderLotTrackUtil.cs

@@ -111,19 +111,18 @@ namespace CyberX8_RT.Modules.Loader
                             sw.WriteLine(str);
                         }
                         //数据内容
-                        if (loaderDatas != null && loaderDatas.Count != 0)
+                        
+                        for (int i = 0; i < loaderDatas.Count; i++)
                         {
-                            for (int i = 0; i < loaderDatas.Count; i++)
-                            {
-                                LoaderLotTrackData data = loaderDatas[i];
-                                string tmp = $"{CVS_SPLIT_CHAR}{data.TimeStamp.ToString("HH:mm:ss")}{CVS_SPLIT_CHAR}{data.LoaderABernoulliBladderEnable}{CVS_SPLIT_CHAR}{data.LoaderABernoulliBladderPressure}{CVS_SPLIT_CHAR}" +
-                                $"{data.LoaderABernoulliN2Pressure}{CVS_SPLIT_CHAR}{data.LoaderACRSVacuum}{CVS_SPLIT_CHAR}{data.LoaderACRSVacuumAnlg}{CVS_SPLIT_CHAR}{data.LoaderAWHPressure}" +
-                                $"{CVS_SPLIT_CHAR}{data.LoaderBBernoulliBladderEnable}{CVS_SPLIT_CHAR}{data.LoaderBBernoulliBladderPressure}{CVS_SPLIT_CHAR}" +
-                                $"{data.LoaderBBernoulliN2Pressure}{CVS_SPLIT_CHAR}{data.LoaderBCRSVacuum}{CVS_SPLIT_CHAR}{data.LoaderBCRSVacuumAnlg}{CVS_SPLIT_CHAR}{data.LoaderBWHPressure}" +
-                                $"{CVS_SPLIT_CHAR}{data.LoaderWHClamped}{CVS_SPLIT_CHAR}";
-                                sw.WriteLine(tmp);
-                            }
+                            LoaderLotTrackData data = loaderDatas[i];
+                            string tmp = $"{CVS_SPLIT_CHAR}{data.TimeStamp.ToString("HH:mm:ss")}{CVS_SPLIT_CHAR}{data.LoaderABernoulliBladderEnable}{CVS_SPLIT_CHAR}{data.LoaderABernoulliBladderPressure}{CVS_SPLIT_CHAR}" +
+                            $"{data.LoaderABernoulliN2Pressure}{CVS_SPLIT_CHAR}{data.LoaderACRSVacuum}{CVS_SPLIT_CHAR}{data.LoaderACRSVacuumAnlg}{CVS_SPLIT_CHAR}{data.LoaderAWHPressure}" +
+                            $"{CVS_SPLIT_CHAR}{data.LoaderBBernoulliBladderEnable}{CVS_SPLIT_CHAR}{data.LoaderBBernoulliBladderPressure}{CVS_SPLIT_CHAR}" +
+                            $"{data.LoaderBBernoulliN2Pressure}{CVS_SPLIT_CHAR}{data.LoaderBCRSVacuum}{CVS_SPLIT_CHAR}{data.LoaderBCRSVacuumAnlg}{CVS_SPLIT_CHAR}{data.LoaderBWHPressure}" +
+                            $"{CVS_SPLIT_CHAR}{data.LoaderWHClamped}{CVS_SPLIT_CHAR}";
+                            sw.WriteLine(tmp);
                         }
+                        
                         if (timeList.Count >= 2)
                         {
                             sw.WriteLine("Finish" + (isLoad ? "Load" : "Unload") + $"WaferShuttle:{timeList[1].ToString()}");

+ 1 - 1
CyberX8_RT/Modules/Loader/LoaderUnloadSideRoutine.cs

@@ -75,7 +75,7 @@ namespace CyberX8_RT.Modules.Loader
         /// <summary>
         /// is SideA
         /// </summary>
-        public bool IsSideA { get { return _side == "A" ? true : false; } }
+        public bool IsSideA { get { return _side == SIDE_A ? true : false; } }
         #endregion
         /// <summary>
         /// 构造函数

+ 1 - 0
CyberX8_Themes/CyberX8_Themes.csproj

@@ -1244,6 +1244,7 @@
     <Resource Include="Themes\Images\parts\Pump.png" />
     <Resource Include="Themes\Images\parts\Pump1.png" />
     <Resource Include="Themes\Images\parts\Pump2.png" />
+    <Resource Include="Themes\Images\parts\MetalFence.png" />
     <Content Include="Themes\Images\parts\myControl.png" />
     <Resource Include="Themes\Images\parts\prewetMove.png" />
     <Resource Include="Themes\Images\parts\prewetTank.png" />

BIN
CyberX8_Themes/Themes/Images/parts/MetalFence.png


+ 55 - 32
CyberX8_Themes/UserControls/MetalCMUIControl.xaml

@@ -124,8 +124,8 @@
         <Rectangle  Opacity="0.5" Fill="White" Margin="543,340,221,41" RadiusX="1" RadiusY="1" Stroke="Black" StrokeThickness="1"/>
 
         <!--Circulation Valve-->
-        <userControls:FlowPipe Margin="105,372,582,70" Width="113" IsFlowing="{Binding ElementName=self,Path=IsCirculationValveOn}" IsReverse="True"/>
-        <userControls:FlowPipe Margin="225,372,475,70" IsFlowing="{Binding ElementName=self,Path=IsCirculationValveOn}" IsReverse="True"/>
+        <userControls:FlowPipe Margin="105,372,582,70" Width="113" IsFlowing="{Binding ElementName=self,Path=IsCirculationValveOn}" IsReverse="False"/>
+        <userControls:FlowPipe Margin="225,372,475,70" IsFlowing="{Binding ElementName=self,Path=IsCirculationValveOn}" IsReverse="False"/>
         <Canvas Width="30" Height="30" Margin="205,362,565,58">
             <customControls:CommonValveControl Height="16" Width="16" Canvas.Left="7" Canvas.Top="6" HorizontalAlignment="Center" VerticalAlignment="Top"
                                            Status="{Binding ElementName=self,Path=IsCirculationValveOn}" ValveOrientation="Horizontal"  
@@ -151,46 +151,69 @@
                 </Image>
             </Canvas>
         </Grid>
-        <Rectangle x:Name="GrowingRectangle" Fill="PaleGreen" Height="0" VerticalAlignment="Bottom" Margin="359,0,257,42">
-            <Rectangle.Style>
-                <Style TargetType="Rectangle">
-                    <Style.Triggers>
-                        <DataTrigger Binding="{Binding ElementName=self,Path=PumpData.PumpValve}" Value="True">
-                            <DataTrigger.EnterActions>
-                                <BeginStoryboard x:Name="GrowingStoryboard">
-                                    <Storyboard >
-                                        <DoubleAnimation Storyboard.TargetProperty="Height" To="50" Duration="0:0:30"/>
-                                    </Storyboard>
-                                </BeginStoryboard>
-                            </DataTrigger.EnterActions>
-                            <DataTrigger.ExitActions>
-                                <StopStoryboard BeginStoryboardName="GrowingStoryboard"/>
-                            </DataTrigger.ExitActions>
-                        </DataTrigger>
-                    </Style.Triggers>
-                </Style>
-            </Rectangle.Style>
-        </Rectangle>
-        <Rectangle x:Name="ErrorRectangle" Fill="Transparent" Height="234" VerticalAlignment="Bottom" Margin="370,0,266,50" Opacity="0.5" Panel.ZIndex="3"
+        <Grid  Panel.ZIndex="2" Margin="291,89,174,13">
+            <Canvas >
+                <Canvas.RenderTransform>
+                    <!-- 定义平移变换 -->
+                    <TranslateTransform x:Name="imageTranslate"/>
+                </Canvas.RenderTransform>
+                <Canvas.Style>
+                    <Style TargetType="Canvas">
+                        <!-- 设置数据触发器 -->
+                        <Style.Triggers>
+                            <DataTrigger Binding="{Binding IsRunLinmot}" Value="True">
+                                <DataTrigger.EnterActions>
+                                    <BeginStoryboard>
+                                        <Storyboard>
+                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.Y)" RepeatBehavior="Forever">
+                                                <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0"/>
+                                                <LinearDoubleKeyFrame Value="50" KeyTime="0:0:2"/>
+                                                <LinearDoubleKeyFrame Value="0" KeyTime="0:0:4"/>
+                                            </DoubleAnimationUsingKeyFrames>
+                                        </Storyboard>
+                                    </BeginStoryboard>
+                                </DataTrigger.EnterActions>
+                                <DataTrigger.ExitActions>
+                                    <BeginStoryboard>
+                                        <Storyboard>
+                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.Y)">
+                                                <LinearDoubleKeyFrame Value="25" KeyTime="0:0:0"/>
+                                                <LinearDoubleKeyFrame Value="0" KeyTime="0:0:2"/>
+                                            </DoubleAnimationUsingKeyFrames>
+                                        </Storyboard>
+                                    </BeginStoryboard>
+                                </DataTrigger.ExitActions>
+                            </DataTrigger>
+                        </Style.Triggers>
+                    </Style>
+                </Canvas.Style>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/MetalFence.png" x:Name="metalLinmot"
+HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="2" Canvas.Left="54" Width="215" Height="181" Canvas.Top="25">
+                </Image>
+            </Canvas>
+        </Grid>
+        <Rectangle x:Name="ErrorRectangle" Fill="Red" Height="234" VerticalAlignment="Bottom" Margin="370,0,266,50" Opacity="0.5" Panel.ZIndex="3"
                Visibility="{Binding ElementName=self,Path=IsError,Converter={StaticResource boolToVisibility2}}"/>
-        <!--Clamp Valve On-->
-        <userControls:FlowPipe Margin="105,100,595,342" IsFlowing="{Binding IsClampValveOn, ElementName=self}" IsReverse="False"/>
-        <userControls:FlowPipe Margin="207,100,493,342" IsFlowing="{Binding IsClampValveOn, ElementName=self}" IsReverse="False"/>
-        <Label  Height="25" FontSize="13"  FontWeight="Bold" Content="Clamp Valve On" Margin="156,70,525,355"  />
-        <Canvas Width="30" Height="30" Margin="190,89,580,331">
+        <!--Clamp Valve On-->        
+        <userControls:FlowPipe Margin="213,100,493,342" IsReverse="False"/>
+        <Rectangle  Fill="lime" Height="6" Margin="215,101,494,343" Opacity="0.5"
+Visibility="{Binding IsClampValveOn,ElementName=self,Converter={StaticResource boolToVisibility2}}"/>
+        <Label  Height="25" FontSize="13"  FontWeight="Bold" Content="Clamp Valve On" Margin="186,71,495,354"  />
+        <Canvas Width="30" Height="30" Margin="240,89,530,331">
             <customControls:CommonValveControl Height="16" Width="16" Canvas.Left="7" Canvas.Top="6" HorizontalAlignment="Center" VerticalAlignment="Top" 
                                                Status="{Binding ElementName=self,Path=IsClampValveOn}" ValveOrientation="Horizontal"
                                                IsCanEdit="True"  RenderTransformOrigin="-0.75,0.312"/>   
         </Canvas>
         <!--Clamp Valve Off-->
-        <userControls:FlowPipe Margin="207,126,493,316" IsFlowing="{Binding IsUnclampValveOn, ElementName=self}" IsReverse="False"/>
-        <userControls:FlowPipe Margin="105,126,595,316" IsFlowing="{Binding IsUnclampValveOn, ElementName=self}" IsReverse="False"/>
-        <Canvas Width="30" Height="30" Margin="190,116,580,304">
+        <userControls:FlowPipe Margin="213,126,493,316" IsReverse="False"/>
+        <Rectangle  Fill="lime" Height="6" Margin="215,127,494,317" Opacity="0.5"
+Visibility="{Binding IsUnclampValveOn,ElementName=self,Converter={StaticResource boolToVisibility2}}"/>
+        <Canvas Width="30" Height="30" Margin="240,116,530,304">
             <customControls:CommonValveControl Height="16" Width="16" Canvas.Left="7" Canvas.Top="6" HorizontalAlignment="Center" VerticalAlignment="Top" 
                                                Status="{Binding ElementName=self,Path=IsUnclampValveOn}" ValveOrientation="Horizontal" 
                                                IsCanEdit="True" />
         </Canvas>
-        <Label  Height="25" FontSize="13"  FontWeight="Bold" Content="Clamp Valve Off" Margin="156,139,525,286"  />
+        <Label  Height="25" FontSize="13"  FontWeight="Bold" Content="Clamp Valve Off" Margin="186,139,495,286"  />
 
 
     </Grid>

+ 16 - 13
CyberX8_Themes/UserControls/MetalCMUIControl.xaml.cs

@@ -1,19 +1,7 @@
 using MECF.Framework.Common.CommonData.Prewet;
 using MECF.Framework.Common.OperationCenter;
-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 CyberX8_Themes.UserControls
 {
@@ -179,7 +167,22 @@ namespace CyberX8_Themes.UserControls
                 this.SetValue(IsWaferHolderProerty, value);
             }
         }
-
+        public static readonly DependencyProperty IsRunLinmotProerty = DependencyProperty.Register(
+            "IsRunLinmot", typeof(bool), typeof(MetalCMUIControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Linmot是否Running
+        /// </summary>
+        public bool IsRunLinmot
+        {
+            get
+            {
+                return (bool)this.GetValue(IsRunLinmotProerty);
+            }
+            set
+            {
+                this.SetValue(IsRunLinmotProerty, value);
+            }
+        }
         /// <summary>
         /// Clamp Valve On
         /// </summary>

+ 51 - 9
CyberX8_Themes/UserControls/MetalSHUIControl.xaml

@@ -152,13 +152,55 @@
                 </Style>
             </Rectangle.Style>
         </Rectangle>
-        <Rectangle x:Name="ErrorRectangle" Fill="Transparent" Height="234" VerticalAlignment="Bottom" Margin="370,0,266,50" Opacity="0.5" Panel.ZIndex="3"
+        <Grid  Panel.ZIndex="2" Margin="291,89,174,13">
+            <Canvas >
+                <Canvas.RenderTransform>
+                    <!-- 定义平移变换 -->
+                    <TranslateTransform x:Name="imageTranslate"/>
+                </Canvas.RenderTransform>
+                <Canvas.Style>
+                    <Style TargetType="Canvas">
+                        <!-- 设置数据触发器 -->
+                        <Style.Triggers>
+                            <DataTrigger Binding="{Binding IsRunLinmot}" Value="True">
+                                <DataTrigger.EnterActions>
+                                    <BeginStoryboard>
+                                        <Storyboard>
+                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.Y)" RepeatBehavior="Forever">
+                                                <LinearDoubleKeyFrame Value="0" KeyTime="0:0:0"/>
+                                                <LinearDoubleKeyFrame Value="50" KeyTime="0:0:2"/>
+                                                <LinearDoubleKeyFrame Value="0" KeyTime="0:0:4"/>
+                                            </DoubleAnimationUsingKeyFrames>
+                                        </Storyboard>
+                                    </BeginStoryboard>
+                                </DataTrigger.EnterActions>
+                                <DataTrigger.ExitActions>
+                                    <BeginStoryboard>
+                                        <Storyboard>
+                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.Y)">
+                                                <LinearDoubleKeyFrame Value="25" KeyTime="0:0:0"/>
+                                                <LinearDoubleKeyFrame Value="0" KeyTime="0:0:2"/>
+                                            </DoubleAnimationUsingKeyFrames>
+                                        </Storyboard>
+                                    </BeginStoryboard>
+                                </DataTrigger.ExitActions>
+                            </DataTrigger>
+                        </Style.Triggers>
+                    </Style>
+                </Canvas.Style>
+                <Image Source="pack://application:,,,/CyberX8_Themes;component/Themes/Images/parts/MetalFence.png" x:Name="metalLinmot"
+HorizontalAlignment="Center" VerticalAlignment="Top" Panel.ZIndex="2" Canvas.Left="54" Width="215" Height="181" Canvas.Top="25">
+                </Image>
+            </Canvas>
+        </Grid>
+        <Rectangle x:Name="ErrorRectangle" Fill="Red" Height="234" VerticalAlignment="Bottom" Margin="370,0,266,73" Opacity="0.5" Panel.ZIndex="3"
            Visibility="{Binding ElementName=self,Path=IsError,Converter={StaticResource boolToVisibility2}}"/>
         <!--Clamp Valve On-->
-        <userControls:FlowPipe Margin="76,112,674,330" Width="50" IsFlowing="{Binding IsClampValveOpen, ElementName=self}" IsReverse="False"/>
-        <userControls:FlowPipe Margin="132,112,492,330" Width="175" IsFlowing="{Binding IsClampValveOpen, ElementName=self}" IsReverse="False"/>
-        <Label  Height="25" FontSize="13"  FontWeight="Bold" Content="Clamp Valve" Margin="80,82,600,343"  />
-        <Canvas Width="30" Height="30" Margin="116,101,654,319">
+        <userControls:FlowPipe Margin="212,112,492,330" Width="94" IsReverse="False"/>
+        <Rectangle  Fill="lime" Height="6" Margin="215,113,497,331" Opacity="0.5"
+Visibility="{Binding IsClampValveOpen,ElementName=self,Converter={StaticResource boolToVisibility2}}"/>
+        <Label  Height="25" FontSize="13"  FontWeight="Bold" Content="Clamp Valve" Margin="175,83,505,342"  />
+        <Canvas Width="30" Height="30" Margin="240,101,530,319">
             <customControls:CommonValveControl Height="16" Width="16" Canvas.Left="7" Canvas.Top="6" HorizontalAlignment="Center" VerticalAlignment="Top" 
                                            ValveOrientation="Horizontal" Status="{Binding IsClampValveOpen, ElementName=self}"
                                            IsCanEdit="True" ContextMenu="{StaticResource IsClampValveOpen}" RenderTransformOrigin="-0.75,0.312"/>
@@ -182,7 +224,7 @@
         <userControls:FlowPipe Margin="128,408,650,34"  Width="22" RotateTransformValue="90" IsFlowing="{Binding ElementName=self,Path=IsCellCirculationValveOn}" IsReverse="False"/>
         <userControls:Pipe2  RotateTransformValue="90" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="464,427,0,0" />
         <userControls:Pipe2  RotateTransformValue="180" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="134,440,0,0" />
-     
+
         <userControls:FlowPipe Margin="-110,385,690,57" Width="220" IsFlowing="{Binding ElementName=self,Path=IsCellPumpOn}" IsReverse="False"/>
         <userControls:FlowPipe Margin="-111,315,845,127" Width="66" IsFlowing="{Binding ElementName=self,Path=IsCellPumpOn}" RotateTransformValue="90" IsReverse="False"/>
         <userControls:FlowPipe Margin="-110,304,622,138" Width="288" IsFlowing="{Binding ElementName=self,Path=IsCellPumpOn}" IsReverse="True"/>
@@ -199,7 +241,7 @@
                         ModuleName="{Binding ElementName=self, Path=ModuleName}" Canvas.Left="-35" 
                         Visibility="{Binding ElementName=self,Path=IsSingalPump,Converter={StaticResource boolToVisibility2}}"/>
         </Canvas>
-        
+
         <Polygon Width="10" Points="0,10 20,0 20,20" Fill="Black" StrokeThickness="1" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-34,394,0,0" RenderTransformOrigin="0.5,0.5">
             <Polygon.RenderTransform>
                 <TransformGroup>
@@ -211,10 +253,10 @@
             </Polygon.RenderTransform>
         </Polygon>
         <Polygon Points="0,0 30,0 30,4 0,4" Fill="Black" StrokeThickness="1" Canvas.Left="10" Canvas.Top="8" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="-54,402,0,0"/>
-        
+
         <Label Content="Filter Purge Enable"  FontSize="13" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="-119,0,0,16"/>
         <Ellipse Grid.Column="0" Width="16" Height="16" Fill="{Binding ElementName=self,Path=IsCellPumpOn,Converter={StaticResource boolToColor}}" HorizontalAlignment="Right" Stroke="Silver" Margin="0,413,766,21"/>
-        
+
         <Label Content="Cell Flow"  FontSize="13" FontWeight="Bold" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="26,0,0,112"/>
         <Border Margin="10,340,690,86" Background="Black">
             <TextBlock  Text="{Binding ElementName=self,Path=MetalData.CellFlow,StringFormat=\{0:F1\} L/min,Mode=TwoWay}" Foreground="Lime" FontSize="13" FontWeight="Bold" VerticalAlignment="Center" HorizontalAlignment="Center"/>

+ 16 - 14
CyberX8_Themes/UserControls/MetalSHUIControl.xaml.cs

@@ -1,20 +1,7 @@
 using MECF.Framework.Common.CommonData.Metal;
-using MECF.Framework.Common.CommonData.Prewet;
 using MECF.Framework.Common.OperationCenter;
-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 CyberX8_Themes.UserControls
 {
@@ -215,7 +202,22 @@ namespace CyberX8_Themes.UserControls
                 this.SetValue(IsWaferHolderProerty, value);
             }
         }
-
+        public static readonly DependencyProperty IsRunLinmotProerty = DependencyProperty.Register(
+            "IsRunLinmot", typeof(bool), typeof(MetalSHUIControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
+        /// <summary>
+        /// Linmot是否Running
+        /// </summary>
+        public bool IsRunLinmot
+        {
+            get
+            {
+                return (bool)this.GetValue(IsRunLinmotProerty);
+            }
+            set
+            {
+                this.SetValue(IsRunLinmotProerty, value);
+            }
+        }
         /// <summary>
         /// Clamp Valve
         /// </summary>

+ 5 - 10
CyberX8_Themes/UserControls/RinseUIControl.xaml

@@ -88,12 +88,12 @@
         </Ellipse>
         <Rectangle x:Name="ErrorRectangle" Fill="Red" Height="212" VerticalAlignment="Bottom" Margin="387,0,264,198" Opacity="0.5" Panel.ZIndex="3"
            Visibility="{Binding ElementName=self,Path=IsError,Converter={StaticResource boolToVisibility2}}" />
-        <userControls:FlowPipe  Height="7" Width="90" Margin="276,36,434,406" Panel.ZIndex="0"/>
-        <userControls:FlowPipe   Height="7" Width="40"  Margin="229,36,531,406" />
-        <Rectangle  Fill="lime" Height="6" Margin="229,38,432,408" Opacity="0.5"
+        <userControls:FlowPipe  Height="7" Width="90" Margin="288,36,434,406" Panel.ZIndex="0"/>
+        <!--<userControls:FlowPipe   Height="7" Width="40"  Margin="229,36,531,406" />-->
+        <Rectangle  Fill="lime" Height="6" Margin="290,38,432,408" Opacity="0.5"
                 Visibility="{Binding RinseCommonData.WaferHolderClamp,Converter={StaticResource boolToVisibility2}}"/>
         <customControls:CommonValveControl Height="16" Width="16"  HorizontalAlignment="Left" VerticalAlignment="Top"
-                            ValveOrientation="Horizontal" Status="{Binding RinseCommonData.WaferHolderClamp}"  IsCanEdit="True" Margin="264,31,0,0" Panel.ZIndex="1" ContextMenu="{StaticResource IsClampValveOpen}">
+                            ValveOrientation="Horizontal" Status="{Binding RinseCommonData.WaferHolderClamp}"  IsCanEdit="True" Margin="313,32,0,0" Panel.ZIndex="1" ContextMenu="{StaticResource IsClampValveOpen}">
         </customControls:CommonValveControl>
 
         <userControls:FlowPipe  Height="7" Width="120" Margin="276,256,404,187" IsFlowing="False"  Panel.ZIndex="1"/>
@@ -176,8 +176,6 @@
                     <TranslateTransform/>
                 </TransformGroup>
             </Canvas.RenderTransform>
-            <Polygon Width="10" Points="0,10 20,0 20,20" Fill="Black" StrokeThickness="1" HorizontalAlignment="Left" VerticalAlignment="Center"></Polygon>
-            <Polygon Points="0,0 30,0 30,4 0,4" Fill="Black" StrokeThickness="1" Canvas.Left="10" Canvas.Top="8" HorizontalAlignment="Left" VerticalAlignment="Center"></Polygon>
         </Canvas>
         <Canvas Width="40" Height="20" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="257,319,0,0" RenderTransformOrigin="0.5,0.5" >
             <Canvas.RenderTransform>
@@ -188,8 +186,6 @@
                     <TranslateTransform/>
                 </TransformGroup>
             </Canvas.RenderTransform>
-            <Polygon Width="10" Points="0,10 20,0 20,20" Fill="Black" StrokeThickness="1" HorizontalAlignment="Left" VerticalAlignment="Center"/>
-            <Polygon Points="0,0 30,0 30,4 0,4" Fill="Black" StrokeThickness="1" Canvas.Left="10" Canvas.Top="8" HorizontalAlignment="Left" VerticalAlignment="Center"/>
         </Canvas>
         <Canvas Width="40" Height="20" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="443,316,0,0" RenderTransformOrigin="0.5,0.5" >
             <Canvas.RenderTransform>
@@ -200,8 +196,7 @@
                     <TranslateTransform/>
                 </TransformGroup>
             </Canvas.RenderTransform>
-            <Polygon Width="10" Points="0,10 20,0 20,20" Fill="Black" StrokeThickness="1" HorizontalAlignment="Left" VerticalAlignment="Center"/>
-            <Polygon Points="0,0 30,0 30,4 0,4" Fill="Black" StrokeThickness="1" Canvas.Left="10" Canvas.Top="8" HorizontalAlignment="Left" VerticalAlignment="Center"/>
+            
         </Canvas>
         <CheckBox Grid.Column="0" Margin="83,32,0,0"  VerticalAlignment="Top" HorizontalAlignment="Left" Content="Bypass Interlocks"  FontSize="10" FontWeight="Bold" 
                   Checked="CheckBox_Checked" Unchecked="CheckBox_UnChecked"/>