diff --git a/EgtBEAMWALL.Core/BTLModel/BTLFeatureM.vb b/EgtBEAMWALL.Core/BTLModel/BTLFeatureM.vb
index 4db731de..da9998bd 100644
--- a/EgtBEAMWALL.Core/BTLModel/BTLFeatureM.vb
+++ b/EgtBEAMWALL.Core/BTLModel/BTLFeatureM.vb
@@ -174,7 +174,7 @@ Public Class BTLFeatureM
Protected m_sCALC_MSG As String
Public Property sCALC_MSG As String
Get
- Return m_sCALC_MSG
+ Return MessageFromLuaMsg(m_sCALC_MSG)
End Get
Set(value As String)
m_sCALC_MSG = value
diff --git a/EgtBEAMWALL.Core/BTLModel/BTLPartM.vb b/EgtBEAMWALL.Core/BTLModel/BTLPartM.vb
index 4e1257d7..a82014f3 100644
--- a/EgtBEAMWALL.Core/BTLModel/BTLPartM.vb
+++ b/EgtBEAMWALL.Core/BTLModel/BTLPartM.vb
@@ -1001,16 +1001,6 @@ Public Class BTLPartM
Return TempList
End Function
- Private Function MessageFromLuaMsg(LuaMsg As String) As String
- Dim sSplit() As String = LuaMsg.Split("$$")
- Dim nMsg As Integer = -1
- If sSplit.Count > 1 AndAlso Integer.TryParse(sSplit(0), nMsg) Then
- Return EgtMsg(65000 + nMsg)
- Else
- Return LuaMsg
- End If
- End Function
-
'Sub New(ParentStructure As BTLStructureVM, nPartId As Integer)
' MyBase.New(ParentStructure, nPartId)
' ' leggo info pezzo
diff --git a/EgtBEAMWALL.Core/EgtBEAMWALL.Core.vbproj b/EgtBEAMWALL.Core/EgtBEAMWALL.Core.vbproj
index 16585f29..2bea0360 100644
--- a/EgtBEAMWALL.Core/EgtBEAMWALL.Core.vbproj
+++ b/EgtBEAMWALL.Core/EgtBEAMWALL.Core.vbproj
@@ -120,6 +120,7 @@
+
diff --git a/EgtBEAMWALL.Core/MachGroupModel/MyMachGroupM.vb b/EgtBEAMWALL.Core/MachGroupModel/MyMachGroupM.vb
index e666c112..2e4f257d 100644
--- a/EgtBEAMWALL.Core/MachGroupModel/MyMachGroupM.vb
+++ b/EgtBEAMWALL.Core/MachGroupModel/MyMachGroupM.vb
@@ -176,7 +176,7 @@ Public Class MyMachGroupM
Private m_sCALC_MSG As String
Public Property sCALC_MSG As String
Get
- Return m_sCALC_MSG
+ Return MessageFromLuaMsg(m_sCALC_MSG)
End Get
Set(value As String)
m_sCALC_MSG = value
diff --git a/EgtBEAMWALL.Core/MachGroupModel/PartM.vb b/EgtBEAMWALL.Core/MachGroupModel/PartM.vb
index 718af75e..b989a976 100644
--- a/EgtBEAMWALL.Core/MachGroupModel/PartM.vb
+++ b/EgtBEAMWALL.Core/MachGroupModel/PartM.vb
@@ -139,21 +139,28 @@ Public Class PartM
Public Property dPOSX As Double
Get
If nType = BWType.WALL Then
- ' recupero box pezzo
- Dim b3Part As New BBox3d
- EgtGetBBoxGlob(nPartId, GDB_BB.ONLY_VISIBLE + GDB_BB.IGNORE_TEXT + GDB_BB.IGNORE_DIM, b3Part)
- ' recupero layer del box
- Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nPartId, "Box")
- ' recupero box del layer box
- Dim b3Box As New BBox3d
- EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box)
- ' recupero origine grezzo
- Dim nrawPartId As Integer = EgtGetRawPartFromPart(nPartId)
- Dim b3Raw As New BBox3d
- EgtGetRawPartBBox(nrawPartId, b3Raw)
- ' calcolo distanza tra origine pezzo e tavolo
- Dim vtPartRef As New Vector3d(b3Box.Min() - b3Raw.Min())
- Return vtPartRef.x
+ ' verifico che sia attivo MachGroup di questo pezzo
+ If EgtGetCurrMachGroup() = ParentMachGroup.Id Then
+ ' recupero box pezzo
+ Dim b3Part As New BBox3d
+ EgtGetBBoxGlob(nPartId, GDB_BB.ONLY_VISIBLE + GDB_BB.IGNORE_TEXT + GDB_BB.IGNORE_DIM, b3Part)
+ ' recupero layer del box
+ Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nPartId, "Box")
+ ' recupero box del layer box
+ Dim b3Box As New BBox3d
+ EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box)
+ ' recupero origine grezzo
+ Dim nrawPartId As Integer = EgtGetRawPartFromPart(nPartId)
+ Dim b3Raw As New BBox3d
+ EgtGetRawPartBBox(nrawPartId, b3Raw)
+ ' calcolo distanza tra origine pezzo e tavolo
+ Dim vtPartRef As New Vector3d(b3Box.Min() - b3Raw.Min())
+ m_dPOSX = vtPartRef.x
+ Return vtPartRef.x
+ ' altrimenti restituisco valore salvato (per quando viene clickato un BTLPart)
+ Else
+ Return m_dPOSX
+ End If
Else ' nType = BWType.BEAM
Return m_dPOSX
End If
@@ -270,21 +277,28 @@ Public Class PartM
Protected m_dPOSY As Double
Public Property dPOSY As Double
Get
- ' recupero box pezzo
- Dim b3Part As New BBox3d
- EgtGetBBoxGlob(nPartId, GDB_BB.ONLY_VISIBLE + GDB_BB.IGNORE_TEXT + GDB_BB.IGNORE_DIM, b3Part)
- ' recupero layer del box
- Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nPartId, "Box")
- ' recupero box del layer box
- Dim b3Box As New BBox3d
- EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box)
- ' recupero origine grezzo
- Dim nrawPartId As Integer = EgtGetRawPartFromPart(nPartId)
- Dim b3Raw As New BBox3d
- EgtGetRawPartBBox(nrawPartId, b3Raw)
- ' calcolo distanza tra origine pezzo e tavolo
- Dim vtPartRef As New Vector3d(b3Box.Min() - b3Raw.Min())
- Return vtPartRef.y
+ ' verifico che sia attivo MachGroup di questo pezzo
+ If EgtGetCurrMachGroup() = ParentMachGroup.Id Then
+ ' recupero box pezzo
+ Dim b3Part As New BBox3d
+ EgtGetBBoxGlob(nPartId, GDB_BB.ONLY_VISIBLE + GDB_BB.IGNORE_TEXT + GDB_BB.IGNORE_DIM, b3Part)
+ ' recupero layer del box
+ Dim nBoxLayerId As Integer = EgtGetFirstNameInGroup(nPartId, "Box")
+ ' recupero box del layer box
+ Dim b3Box As New BBox3d
+ EgtGetBBoxGlob(nBoxLayerId, GDB_BB.STANDARD, b3Box)
+ ' recupero origine grezzo
+ Dim nrawPartId As Integer = EgtGetRawPartFromPart(nPartId)
+ Dim b3Raw As New BBox3d
+ EgtGetRawPartBBox(nrawPartId, b3Raw)
+ ' calcolo distanza tra origine pezzo e tavolo
+ Dim vtPartRef As New Vector3d(b3Box.Min() - b3Raw.Min())
+ m_dPOSY = vtPartRef.y
+ Return vtPartRef.y
+ ' altrimenti restituisco valore salvato (per quando viene clickato un BTLPart)
+ Else
+ Return m_dPOSY
+ End If
'Return m_dPOSY
End Get
Set(value As Double)
@@ -369,7 +383,7 @@ Public Class PartM
Protected m_sCALC_MSG As String = String.Empty
Public Property sCALC_MSG As String
Get
- Return m_sCALC_MSG
+ Return MessageFromLuaMsg(m_sCALC_MSG)
End Get
Set(value As String)
m_sCALC_MSG = value
diff --git a/EgtBEAMWALL.Core/Utility/LuaMsgManager.vb b/EgtBEAMWALL.Core/Utility/LuaMsgManager.vb
new file mode 100644
index 00000000..073c3523
--- /dev/null
+++ b/EgtBEAMWALL.Core/Utility/LuaMsgManager.vb
@@ -0,0 +1,30 @@
+Imports EgtUILib
+
+Public Module LuaMsgManager
+
+ Public Function MessageFromLuaMsg(LuaMsg As String) As String
+ ' verifico se inizia con $$
+ If LuaMsg.Substring(0, 2) = "$$" Then
+ Dim sMsgArgs() As String = LuaMsg.Substring(2).Split(",")
+ Dim nMsg As Integer = -1
+ If sMsgArgs.Count > 1 AndAlso Integer.TryParse(sMsgArgs(0), nMsg) AndAlso nMsg > 0 Then
+ If sMsgArgs.Count > 1 Then
+ Dim sArgs() As String = sMsgArgs.Skip(1).ToArray()
+ Dim sMsg As String = String.Format(EgtMsg(65000 + nMsg), sArgs)
+ If Not String.IsNullOrWhiteSpace(sMsg) Then
+ Return sMsg
+ Else
+ EgtMsg(65000 + nMsg)
+ End If
+ Else
+ Return EgtMsg(65000 + nMsg)
+ End If
+ Else
+ Return LuaMsg
+ End If
+ Else
+ Return LuaMsg
+ End If
+ End Function
+
+End Module
diff --git a/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLFeatureVM.vb b/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLFeatureVM.vb
index 1b100bd4..8b483fb5 100644
--- a/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLFeatureVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLFeatureVM.vb
@@ -282,6 +282,7 @@ Public Class BTLFeatureVM
End Select
NotifyPropertyChanged(NameOf(Calc_Background))
NotifyPropertyChanged(NameOf(CALC_ROT_Visibility))
+ NotifyPropertyChanged(NameOf(sCALC_MSG))
NotifyPropertyChanged(NameOf(CALC_ERR_Letter))
NotifyPropertyChanged(NameOf(CALC_ERR_Foreground))
End Sub
@@ -296,6 +297,7 @@ Public Class BTLFeatureVM
m_BTLFeatureM.sCALC_MSG = ""
NotifyPropertyChanged(NameOf(Calc_Background))
NotifyPropertyChanged(NameOf(CALC_ROT_Visibility))
+ NotifyPropertyChanged(NameOf(sCALC_MSG))
NotifyPropertyChanged(NameOf(CALC_ERR_Letter))
NotifyPropertyChanged(NameOf(CALC_ERR_Foreground))
End Sub
diff --git a/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLStructureVM.vb b/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLStructureVM.vb
index cfcf3f24..e09e0b16 100644
--- a/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLStructureVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/BTLViewModel/BTLStructureVM.vb
@@ -72,6 +72,26 @@ Public Class BTLStructureVM
ElseIf Map.refMainMenuVM.SelPage = Pages.MACHINING Then
' resetto gruppo di lavorazione corrente
EgtResetCurrMachGroup()
+ ' trovo ed evidenzio MachGroup e Duplo di questo pezzo
+ If Not IsNothing(Map.refProjectVM.MachGroupPanelVM) Then
+ Dim MachGroupList As New List(Of MyMachGroupVM)
+ For Each Machgroup As MyMachGroupVM In Map.refProjectVM.MachGroupPanelVM.MachGroupVMList
+ Dim bFound As Boolean = False
+ For Each Part As PartVM In Machgroup.PartVMList
+ If EgtDuploGetOriginal(Part.nPartId) = m_SelBTLPart.nPartId Then
+ Part.SetSearchFound()
+ bFound = True
+ Else
+ Part.ResetSearchFound()
+ End If
+ Next
+ If bFound Then
+ Machgroup.SetSearchFound()
+ Else
+ Machgroup.ResetSearchFound()
+ End If
+ Next
+ End If
' seleziono pezzo nella scena
SceneSelPartSelection()
Core.ViewPanelVM.BWSetView(If(Core.ViewPanelVM.Type = BWType.BEAM, VT.ISO_SW, VT.TOP), False)
diff --git a/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndV.xaml b/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndV.xaml
index 7700519c..93e7e55a 100644
--- a/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndV.xaml
+++ b/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndV.xaml
@@ -1,105 +1,78 @@
-
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+ xmlns:EgtWPFLib5="clr-namespace:EgtWPFLib5;assembly=EgtWPFLib5"
+ xmlns:EgtBEAMWALL="clr-namespace:EgtBEAMWALL.ViewerOptimizer"
+ Style="{DynamicResource {x:Type EgtWPFLib5:EgtCustomWindow}}"
+ WindowStyle="None" ResizeMode="NoResize"
+ SizeToContent="Height"
+ Width="300"
+ WindowStartupLocation="CenterOwner"
+ IsClosable="False"
+ IsMinimizable="False"
+ IsResizable="False"
+ Title="ChangeParameterWnd">
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
+
diff --git a/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndVM.vb b/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndVM.vb
index 777f150a..501e27e2 100644
--- a/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/ChangeParameterWnd/ChangeParameterWndVM.vb
@@ -42,6 +42,9 @@ Public Class ChangeParameterWndVM
'End While
' aggiungo bDO come parametro
m_ParamList.Add(New Parameters(NewBTLParam, True))
+ ' seleziono parametro vuoto per dargli un valore iniziale ed evitare che visualizzi sia text che check
+ m_SelParam = New Parameters(BTLParamM.CreateNewBTLParam())
+ NotifyPropertyChanged(NameOf(SelParam))
End If
End Set
End Property
@@ -78,11 +81,15 @@ Public Class ChangeParameterWndVM
GetBeamPrivateProfileProcessList(GRPType.T, TempPRCList)
m_PRCList.Clear()
For Each PRC In TempPRCList
- m_PRCList.Add(New PRC(GRPType.T, PRC, GetBeamPrivateProfileName(GRPType.T, PRC)))
+ If Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refProjectVM.BTLStructureVM.BTLPartVMList.Any(Function(x) x.BTLFeatureVMList.Any(Function(y) y.nPRC = PRC AndAlso CalcBeamPrivateProfileGRP(y.nSelGRP) = 1)) Then
+ m_PRCList.Add(New PRC(GRPType.T, PRC, GetBeamPrivateProfileName(GRPType.T, PRC)))
+ End If
Next
GetBeamPrivateProfileProcessList(GRPType.L, TempPRCList)
For Each PRC In TempPRCList
- m_PRCList.Add(New PRC(GRPType.L, PRC, GetBeamPrivateProfileName(GRPType.L, PRC)))
+ If Not IsNothing(Map.refProjectVM.BTLStructureVM) AndAlso Map.refProjectVM.BTLStructureVM.BTLPartVMList.Any(Function(x) x.BTLFeatureVMList.Any(Function(y) y.nPRC = PRC AndAlso CalcBeamPrivateProfileGRP(y.nSelGRP) = 0)) Then
+ m_PRCList.Add(New PRC(GRPType.L, PRC, GetBeamPrivateProfileName(GRPType.L, PRC)))
+ End If
Next
End Sub
diff --git a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListV.xaml b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListV.xaml
index 7539210a..0412720e 100644
--- a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListV.xaml
+++ b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListV.xaml
@@ -26,6 +26,12 @@
+
+
+
diff --git a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListVM.vb b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListVM.vb
index 3d28ffc4..8509aff8 100644
--- a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/PartInRawPartListVM.vb
@@ -122,7 +122,7 @@ Public Class PartInRawPartListVM
' aggiungo riferimento a map
Map.SetRefPartInRawPartListVM(Me)
' carico le colonne della datagrid
- GetPrivateProfileColumns(S_PARTINRAWPARTLIST_BEAM, PartInRawPartColumns)
+ 'GetPrivateProfileColumns(S_PARTINRAWPARTLIST_BEAM, PartInRawPartColumns)
End Sub
#End Region ' CONSTRUCTOR
diff --git a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListV.xaml b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListV.xaml
index 7b383be5..e736b194 100644
--- a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListV.xaml
+++ b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListV.xaml
@@ -26,6 +26,12 @@
+
+
+
diff --git a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListVM.vb b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListVM.vb
index b848534b..5d5b9b9b 100644
--- a/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/ItemParamList/RawPartListVM.vb
@@ -97,7 +97,7 @@ Public Class RawPartListVM
' Aggiungo riferimento a Map
Map.SetRefRawPartListVM(Me)
' carico le colonne della datagrid
- GetPrivateProfileColumns(S_RAWPARTLIST_BEAM, RawPartColumns)
+ 'GetPrivateProfileColumns(S_RAWPARTLIST_BEAM, RawPartColumns)
End Sub
#End Region ' CONSTRUCTOR
diff --git a/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/MyMachGroupVM.vb b/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/MyMachGroupVM.vb
index 04161bc2..3263a89d 100644
--- a/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/MyMachGroupVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/MyMachGroupVM.vb
@@ -217,6 +217,27 @@ Public Class MyMachGroupVM
End Set
End Property
+ Private m_bSearchFound As Boolean
+ Public ReadOnly Property bSearchFound As Boolean
+ Get
+ Return m_bSearchFound
+ End Get
+ End Property
+ Friend Sub SetSearchFound()
+ m_bSearchFound = True
+ NotifyPropertyChanged(NameOf(Search_Background))
+ End Sub
+ Friend Sub ResetSearchFound()
+ m_bSearchFound = False
+ NotifyPropertyChanged(NameOf(Search_Background))
+ End Sub
+
+ Public ReadOnly Property Search_Background As SolidColorBrush
+ Get
+ Return If(m_bSearchFound, Brushes.Gold, Brushes.Transparent)
+ End Get
+ End Property
+
#End Region ' General
#Region "Beam"
diff --git a/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/PartVM.vb b/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/PartVM.vb
index c7b29e81..72cf451e 100644
--- a/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/PartVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/MachGroupPanel/PartVM.vb
@@ -23,6 +23,27 @@ Public Class PartVM
End Get
End Property
+ Private m_bSearchFound As Boolean
+ Public ReadOnly Property bSearchFound As Boolean
+ Get
+ Return m_bSearchFound
+ End Get
+ End Property
+ Friend Sub SetSearchFound()
+ m_bSearchFound = True
+ NotifyPropertyChanged(NameOf(Search_Background))
+ End Sub
+ Friend Sub ResetSearchFound()
+ m_bSearchFound = False
+ NotifyPropertyChanged(NameOf(Search_Background))
+ End Sub
+
+ Public ReadOnly Property Search_Background As SolidColorBrush
+ Get
+ Return If(m_bSearchFound, Brushes.Gold, Brushes.Transparent)
+ End Get
+ End Property
+
#End Region ' General
#Region "Beam"
diff --git a/EgtBEAMWALL.ViewerOptimizer/OpenProjectFileDialog/OpenProjectFileDialogVM.vb b/EgtBEAMWALL.ViewerOptimizer/OpenProjectFileDialog/OpenProjectFileDialogVM.vb
index 62c7e376..8d45d0c8 100644
--- a/EgtBEAMWALL.ViewerOptimizer/OpenProjectFileDialog/OpenProjectFileDialogVM.vb
+++ b/EgtBEAMWALL.ViewerOptimizer/OpenProjectFileDialog/OpenProjectFileDialogVM.vb
@@ -21,13 +21,13 @@ Public Class OpenProjectFileDialogVM
' leggo da db
If ProjectType = ProjectType.PROJ Then
Dim DbProjectList As New List(Of ProjFileM)
- DbProjectList = DbControllers.m_ProjController.GetLastDesc(50)
+ DbProjectList = DbControllers.m_ProjController.GetLastDesc(5000)
For Each Project In DbProjectList
m_ProjectList.Add(New ProjFileVM(Project))
Next
ElseIf ProjectType = ProjectType.PROD Then
Dim DbProjectList As New List(Of ProdFileM)
- DbProjectList = DbControllers.m_ProdController.GetLastDesc(50)
+ DbProjectList = DbControllers.m_ProdController.GetLastDesc(5000)
If GoToProd Then
For Each Project In DbProjectList
If Project.sMachine = Map.refProjManagerVM.CurrProj.sMachine AndAlso
diff --git a/EgtBEAMWALL.ViewerOptimizer/TopPanel/TopPanelV.xaml b/EgtBEAMWALL.ViewerOptimizer/TopPanel/TopPanelV.xaml
index c0aa3c8a..af5d8247 100644
--- a/EgtBEAMWALL.ViewerOptimizer/TopPanel/TopPanelV.xaml
+++ b/EgtBEAMWALL.ViewerOptimizer/TopPanel/TopPanelV.xaml
@@ -35,13 +35,15 @@