Files
EgtCAM5/ProjectPage/OptionPanel/MachiningOptionPanel/OperationExpander/DispositionParameterExpander/DispositionParameterExpanderViewModel.vb
T
Emmanuele Sassi ae5a2467da EgtCAM5 :
- Modificata behaviour che apre e chiude gli expander automaticamente.
- Modificato calcolo dell'altezza massima dei parametri operazione di lavorazione.
- Migliorie varie.
2016-11-11 15:51:30 +00:00

1055 lines
50 KiB
VB.net

Imports EgtUILib
Namespace EgtCAM5
Public Class DispositionParameterExpanderViewModel
Inherits ViewModelBase
Public Enum ObjectType As Integer
RAWPART = 1
PART = 2
FIXTURE = 3
End Enum
Private m_ActiveObject As ObjectType
Public Property ActiveObject As ObjectType
Get
Return m_ActiveObject
End Get
Set(value As ObjectType)
If value <> m_ActiveObject Then
Select Case value
Case ObjectType.RAWPART
RawPartIsExpanded = True
Case ObjectType.PART
PartIsExpanded = True
Case ObjectType.FIXTURE
FixtureIsExpanded = True
End Select
m_ActiveObject = value
End If
m_ActiveObject = value
End Set
End Property
Friend m_Id As Integer
Public ReadOnly Property Id As Integer
Get
Return m_Id
End Get
End Property
Private m_Name As String
Public Property Name As String
Get
Return m_Name
End Get
Set(value As String)
m_Name = value
End Set
End Property
Private m_RawPartIsExpanded As Boolean
Public Property RawPartIsExpanded As Boolean
Get
Return m_RawPartIsExpanded
End Get
Set(value As Boolean)
If value <> m_RawPartIsExpanded Then
If value Then
' Chiudo Part e Fixture
PartIsExpanded = False
FixtureIsExpanded = False
' verifico se è attiva l'opzione muovi con ventose
If m_MoveWithFixture Then
' Abilito la selezione dei RawPart con ventose
Application.Msn.NotifyColleagues(Application.SETSCENESELTYPE, SceneSelTypeOpt.RAWPARTWITHFIXTURE)
Else
' Abilito la selezione dei RawPart
Application.Msn.NotifyColleagues(Application.SETSCENESELTYPE, SceneSelTypeOpt.RAWPART)
End If
If m_MoveIsChecked Then
m_RawRefGroupVisibility = Visibility.Visible
OnPropertyChanged("RawRefGroupVisibility")
End If
Else
' Nascondo i bottoni per impostare la posizione di riferimento del grezzo
m_RawRefGroupVisibility = Visibility.Collapsed
OnPropertyChanged("RawRefGroupVisibility")
' smarco la prima entità selezionata
EgtResetMark(EgtGetFirstSelectedObj)
EgtDeselectAll()
EgtDraw()
End If
m_RawPartIsExpanded = value
ActiveObject = ObjectType.RAWPART
OnPropertyChanged("RawPartIsExpanded")
End If
End Set
End Property
Private m_PartIsExpanded As Boolean
Public Property PartIsExpanded As Boolean
Get
Return m_PartIsExpanded
End Get
Set(value As Boolean)
If value <> m_PartIsExpanded Then
If value Then
' Chiudo RawPart e Fixture
RawPartIsExpanded = False
FixtureIsExpanded = False
Else
' smarco la prima entità selezionata
EgtResetMark(EgtGetFirstSelectedObj)
EgtDeselectAll()
EgtDraw()
End If
m_PartIsExpanded = value
ActiveObject = ObjectType.PART
OnPropertyChanged("PartIsExpanded")
End If
End Set
End Property
Private m_FixtureIsExpanded As Boolean
Public Property FixtureIsExpanded As Boolean
Get
Return m_FixtureIsExpanded
End Get
Set(value As Boolean)
If value <> m_FixtureIsExpanded Then
If value Then
' Chiudo RawPart e Part
RawPartIsExpanded = False
PartIsExpanded = False
' Abilito la selezione delle Fixture
Application.Msn.NotifyColleagues(Application.SETSCENESELTYPE, SceneSelTypeOpt.FIXTURE)
Else
' smarco la prima entità selezionata
EgtResetMark(EgtGetFirstSelectedObj)
' deseleziono tutto ed aggiorno la visualizzazione
EgtDeselectAll()
EgtDraw()
End If
m_FixtureIsExpanded = value
ActiveObject = ObjectType.FIXTURE
OnPropertyChanged("FixtureIsExpanded")
End If
End Set
End Property
Private m_MoveIsChecked As Boolean
Public Property MoveIsChecked As Boolean
Get
Return m_MoveIsChecked
End Get
Set(value As Boolean)
If value <> m_MoveIsChecked Then
Application.Msn.NotifyColleagues(Application.SETMOVEINDISPOSITION, value)
InputValue = String.Empty
OnPropertyChanged("InputValue")
If value Then
If m_RawPartIsExpanded Then
m_RawRefGroupVisibility = Visibility.Visible
OnPropertyChanged("RawRefGroupVisibility")
Else
m_RawRefGroupVisibility = Visibility.Collapsed
OnPropertyChanged("RawRefGroupVisibility")
End If
m_InputMsg = "Move to:"
Else
m_RawRefGroupVisibility = Visibility.Collapsed
OnPropertyChanged("RawRefGroupVisibility")
m_InputMsg = "Rotate of:"
End If
OnPropertyChanged("InputMsg")
m_MoveIsChecked = value
End If
End Set
End Property
Private m_MoveWithFixture As Boolean = False
Public Property MoveWithFixture As Boolean
Get
Return m_MoveWithFixture
End Get
Set(value As Boolean)
If value <> m_MoveWithFixture Then
If value Then
' Abilito la selezione di RawPart con autoselezione delle sue ventose
Application.Msn.NotifyColleagues(Application.SETSCENESELTYPE, SceneSelTypeOpt.RAWPARTWITHFIXTURE)
' Seleziono le ventose associate ad uno dei grezzi selezionati
' ciclo sui grezzi selezionati
Dim nSelRawPartId As Integer = EgtGetFirstSelectedObj()
While nSelRawPartId <> GDB_ID.NULL
' seleziono i sottopezzi del grezzo
SelectRawPartFixture(nSelRawPartId)
nSelRawPartId = EgtGetNextSelectedObj()
End While
Else
' Abilito la selezione di RawPart
Application.Msn.NotifyColleagues(Application.SETSCENESELTYPE, SceneSelTypeOpt.RAWPART)
' ciclo sui grezzi selezionati
Dim nSelRawPartId As Integer = EgtGetFirstSelectedObj()
While nSelRawPartId <> GDB_ID.NULL
' deseleziono i sottopezzi del grezzo
DeselectRawPartFixture(nSelRawPartId)
nSelRawPartId = EgtGetNextSelectedObj()
End While
End If
EgtDraw()
m_MoveWithFixture = value
OnPropertyChanged("MoveWithFixture")
End If
End Set
End Property
Private m_InputValue As String
Public Property InputValue As String
Get
Return m_InputValue
End Get
Set(value As String)
If Not String.IsNullOrEmpty(m_InputErrorMsg) Then
m_InputErrorMsg = String.Empty
OnPropertyChanged("InputErrorMsg")
End If
m_InputValue = value
End Set
End Property
Private m_BLIsChecked As Boolean = True
Public ReadOnly Property BLIsChecked As Boolean
Get
Return m_BLIsChecked
End Get
End Property
Private m_RawRefPosition As MCH_CR = MCH_CR.BL
Private m_RawRefGroupVisibility As Visibility
Public ReadOnly Property RawRefGroupVisibility As Visibility
Get
Return m_RawRefGroupVisibility
End Get
End Property
#Region "Messages"
Private m_InputMsg As String
Public ReadOnly Property InputMsg As String
Get
Return m_InputMsg
End Get
End Property
Private m_InputErrorMsg As String
Public ReadOnly Property InputErrorMsg As String
Get
Return m_InputErrorMsg
End Get
End Property
Public ReadOnly Property OkMsg As String
Get
Return ""
End Get
End Property
#End Region ' Messages
' Definizione comandi
Private m_cmdDone As ICommand
Private m_cmdCheckedRawRef As ICommand
#Region "CONSTRUCTOR"
Sub New(ByRef OpenDispositionFunction As Action(Of Boolean))
OpenDispositionFunction = AddressOf OpenDispositionParameters
MoveIsChecked = True
m_BLIsChecked = True
OnPropertyChanged("BLIsChecked")
m_RawRefPosition = MCH_CR.BL
End Sub
#End Region
#Region "METHODS"
Public Sub OpenDispositionParameters(bFirst As Boolean)
If bFirst Then
ActiveObject = ObjectType.RAWPART
Else
ActiveObject = ObjectType.FIXTURE
End If
Select Case m_ActiveObject
Case ObjectType.RAWPART
' Abilito la selezione delle Fixture
Application.Msn.NotifyColleagues(Application.SETSCENESELTYPE, SceneSelTypeOpt.RAWPART)
Case ObjectType.FIXTURE
' Abilito la selezione delle Fixture
Application.Msn.NotifyColleagues(Application.SETSCENESELTYPE, SceneSelTypeOpt.FIXTURE)
End Select
m_MoveWithFixture = False
OnPropertyChanged("MoveWithFixture")
End Sub
#End Region ' METHODS
#Region "COMMANDS"
#Region "DoneCommand"
''' <summary>
''' Returns a command that do Done.
''' </summary>
Public ReadOnly Property DoneCommand As ICommand
Get
If m_cmdDone Is Nothing Then
m_cmdDone = New RelayCommand(AddressOf Done)
End If
Return m_cmdDone
End Get
End Property
''' <summary>
''' Execute the Point. This method is invoked by the DoneCommand.
''' </summary>
Public Sub Done(ByVal param As Object)
' Verifico la validità del punto in Input
If Not String.IsNullOrEmpty(m_InputValue) Then
' se movimento di traslazione
If m_MoveIsChecked Then
Dim InputPoint As New Point3d(0, 0, 0)
Dim Values() As String = m_InputValue.Split(","c)
If Values.Count = 2 Then
StringToLen(Values(0), InputPoint.x)
StringToLen(Values(1), InputPoint.y)
Else
m_InputErrorMsg = "Il valore non è una cordinata XY"
OnPropertyChanged("InputErrorMsg")
Return
End If
' Vettore di movimento
Dim vtMove As Vector3d
' lo imposto a seconda del tipo del primo elemento selezionato
Dim nFirstSelectedId As Integer = EgtGetFirstSelectedObj()
' se è un grezzo
If EgtVerifyRawPartCurrPhase(nFirstSelectedId) Then
' imposto il riferimento della tavola
Dim ptTableRef As Point3d
EgtGetTableRef(1, ptTableRef)
' calcolo il punto del grezzo da posizionar nelle coordinate di input
Dim ptRawRefPoint As Point3d = GetRawPartRefPoint(nFirstSelectedId, m_RawRefPosition)
' creo un punto con le coordinate di input espresse rispetto alla tavola
Dim TableRefInputPoint As New Point3d(InputPoint)
TableRefInputPoint.LocToLoc(EgtGetGridFrame(), New Frame3d(ptTableRef))
' calcolo il vettore di spostamento del grezzo
vtMove = TableRefInputPoint - ptRawRefPoint
' se è una ventosa
ElseIf EgtVerifyFixture(nFirstSelectedId) Then
Dim SelObjFrame3d As New Frame3d(Frame3d.GLOB)
EgtGetGroupGlobFrame(nFirstSelectedId, SelObjFrame3d)
SelObjFrame3d.ToLoc(EgtGetGridFrame())
Dim FixturePoint As New Point3d(SelObjFrame3d.Orig)
' Ricavo il vettore di movimento (tengo solo XY)
vtMove = InputPoint - FixturePoint
vtMove.z = 0
End If
' Muovo tutti gli oggetti selezionati
MoveRawPartPartAndFixture(GDB_ID.SEL, vtMove)
' se è un grezzo
If EgtVerifyRawPartCurrPhase(nFirstSelectedId) Then
Dim ptRawRefPoint As Point3d = GetRawPartRefPoint(nFirstSelectedId, m_RawRefPosition)
' verifico se lo spostamento effettuato differisce da quello richiesto
Dim vtRemainingMove As Vector3d = InputPoint - ptRawRefPoint
' se differisce
If Not vtRemainingMove.IsSmall() Then
' eseguo lo spostamento rimanente sull'asse x
MoveRawPartPartAndFixture(GDB_ID.SEL, New Vector3d(vtRemainingMove.x, 0, 0))
' eseguo lo spostamento rimanente sull'asse y
MoveRawPartPartAndFixture(GDB_ID.SEL, New Vector3d(0, vtRemainingMove.y, 0))
End If
End If
'' flag che indica se è il primo oggetto selezionato
'Dim bFirstRawId As Boolean = True
'Dim bFirstFixtId As Boolean = True
'' Vettore di movimento
'Dim vtRawPartMove As Vector3d
'Dim vtFixtureMove As Vector3d
'Dim nSelId As Integer = EgtGetFirstSelectedObj()
'While nSelId <> GDB_ID.NULL
' Select Case m_ActiveObject
' Case ObjectType.RAWPART
' If bFirstRawId Then
' Dim bboxRawPart As New BBox3d
' EgtGetBBox(nSelId, GDB_BB.STANDARD, bboxRawPart)
' Dim ptRawRefPoint As Point3d
' Select Case m_RawRefPosition
' Case MCH_CR.TL
' ptRawRefPoint.x = bboxRawPart.Min.x
' ptRawRefPoint.y = bboxRawPart.Max.y
' Case MCH_CR.TR
' ptRawRefPoint.x = bboxRawPart.Max.x
' ptRawRefPoint.y = bboxRawPart.Max.y
' Case MCH_CR.BL
' ptRawRefPoint.x = bboxRawPart.Min.x
' ptRawRefPoint.y = bboxRawPart.Min.y
' Case MCH_CR.BR
' ptRawRefPoint.x = bboxRawPart.Max.x
' ptRawRefPoint.y = bboxRawPart.Min.y
' End Select
' ptRawRefPoint.z = bboxRawPart.Min.z
' Dim TableRefInputPoint As New Point3d(InputPoint)
' Dim ptTableRef As Point3d
' EgtGetTableRef(1, ptTableRef)
' TableRefInputPoint.LocToLoc(EgtGetGridFrame(), New Frame3d(ptTableRef))
' vtRawPartMove = TableRefInputPoint - ptRawRefPoint
' bFirstRawId = False
' End If
' Dim bboxCurrRawPart As New BBox3d
' EgtGetBBox(nSelId, GDB_BB.STANDARD, bboxCurrRawPart)
' Dim ptCurrRawRefPoint As Point3d
' Select Case m_RawRefPosition
' Case MCH_CR.TL
' ptCurrRawRefPoint.x = bboxCurrRawPart.Min.x
' ptCurrRawRefPoint.y = bboxCurrRawPart.Max.y
' Case MCH_CR.TR
' ptCurrRawRefPoint.x = bboxCurrRawPart.Max.x
' ptCurrRawRefPoint.y = bboxCurrRawPart.Max.y
' Case MCH_CR.BL
' ptCurrRawRefPoint.x = bboxCurrRawPart.Min.x
' ptCurrRawRefPoint.y = bboxCurrRawPart.Min.y
' Case MCH_CR.BR
' ptCurrRawRefPoint.x = bboxCurrRawPart.Max.x
' ptCurrRawRefPoint.y = bboxCurrRawPart.Min.y
' End Select
' ptCurrRawRefPoint.z = bboxCurrRawPart.Min.z
' Dim bErrorMoving As Boolean = False
' If Not EgtMoveToCornerRawPart(nSelId, ptCurrRawRefPoint + vtRawPartMove, m_RawRefPosition) Then
' bErrorMoving = True
' ElseIf Not DispositionParameterExpanderViewModel.VerifyRawPartFixturePos(nSelId) Then
' EgtMoveToCornerRawPart(nSelId, ptCurrRawRefPoint, m_RawRefPosition)
' bErrorMoving = True
' End If
' If bErrorMoving Then
' m_InputErrorMsg = "Impossibile muovere il grezzo fuori dalla tavola"
' OnPropertyChanged("InputErrorMsg")
' End If
' Case ObjectType.PART
' 'EgtMove...
' Case ObjectType.FIXTURE
' If bFirstFixtId Then
' Dim SelObjFrame3d As New Frame3d(Frame3d.GLOB)
' EgtGetGroupGlobFrame(nSelId, SelObjFrame3d)
' SelObjFrame3d.ToLoc(EgtGetGridFrame())
' Dim FixturePoint As New Point3d(SelObjFrame3d.Orig)
' ' Ricavo il vettore di movimento (tengo solo XY)
' vtFixtureMove = InputPoint - FixturePoint
' vtFixtureMove.z = 0
' bFirstFixtId = False
' End If
' Dim nErrorMoving As Integer = 0
' If Not EgtMoveFixture(nSelId, vtFixtureMove) Then
' nSelId = EgtGetPrevSelectedObj()
' nErrorMoving = 1
' ElseIf Not DispositionParameterExpanderViewModel.VerifyRawPartFixturePos(nSelId) Then
' nErrorMoving = 2
' End If
' If nErrorMoving <> 0 Then
' If nErrorMoving = 1 Then
' m_InputErrorMsg = "Impossibile muovere una ventosa fuori dalla tavola"
' ElseIf nErrorMoving = 2 Then
' m_InputErrorMsg = "Posizione già occupata da un'altra ventosa"
' End If
' OnPropertyChanged("InputErrorMsg")
' While nSelId <> GDB_ID.NULL
' If EgtVerifyFixture(nSelId) Then
' EgtMoveFixture(nSelId, -vtFixtureMove)
' ElseIf EgtVerifyRawPartCurrPhase(nSelId) Then
' EgtMoveRawPart(nSelId, -vtFixtureMove)
' End If
' nSelId = EgtGetPrevSelectedObj()
' End While
' End If
' End Select
'nSelId = EgtGetNextSelectedObj()
'End While
' se rotazione
Else
Dim InputAngle As Double = 0
If Not StringToDouble(m_InputValue, InputAngle) Then
m_InputErrorMsg = "Il valore non è un angolo valido"
OnPropertyChanged("InputErrorMsg")
Return
End If
Dim nSelId As Integer = EgtGetFirstSelectedObj()
While nSelId <> GDB_ID.NULL
Select Case m_ActiveObject
Case ObjectType.RAWPART
If Not EgtRotateRawPart(nSelId, Vector3d.Z_AX, InputAngle) Then
m_InputErrorMsg = "Impossibile ruotare il grezzo."
OnPropertyChanged("InputErrorMsg")
End If
Case ObjectType.PART
'EgtMove...
Case ObjectType.FIXTURE
If Not EgtRotateFixture(nSelId, InputAngle) Then
m_InputErrorMsg = "Impossibile ruotare la ventosa"
OnPropertyChanged("InputErrorMsg")
End If
End Select
nSelId = EgtGetNextSelectedObj()
End While
End If
EgtDraw()
End If
End Sub
Private Shared Function GetRawPartRefPoint(nRawPartId As Integer, RawRefPosition As MCH_CR) As Point3d
Dim bboxRawPart As New BBox3d
' recupero il solido del grezzo dal primo elemento selezionato
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne calcolo il BBox
EgtGetBBoxGlob(nRawSolidId, GDB_BB.STANDARD, bboxRawPart)
' imposto il riferimento della tavola
Dim ptTableRef As Point3d
EgtGetTableRef(1, ptTableRef)
' calcolo i punti min e max del bbox riferiti alla tavola
Dim ptBBoxRawPartMin As New Point3d(bboxRawPart.Min)
Dim ptBBoxRawPartMax As New Point3d(bboxRawPart.Max)
ptBBoxRawPartMin.ToLoc(New Frame3d(ptTableRef))
ptBBoxRawPartMax.ToLoc(New Frame3d(ptTableRef))
' dal box e dal tipo di punto di riferimento selezionato ricavo le coordinate del punto di riferimento
Dim ptRawRefPoint As Point3d
Select Case RawRefPosition
Case MCH_CR.TL
ptRawRefPoint.x = ptBBoxRawPartMin.x
ptRawRefPoint.y = ptBBoxRawPartMax.y
Case MCH_CR.TR
ptRawRefPoint.x = ptBBoxRawPartMax.x
ptRawRefPoint.y = ptBBoxRawPartMax.y
Case MCH_CR.BL
ptRawRefPoint.x = ptBBoxRawPartMin.x
ptRawRefPoint.y = ptBBoxRawPartMin.y
Case MCH_CR.BR
ptRawRefPoint.x = ptBBoxRawPartMax.x
ptRawRefPoint.y = ptBBoxRawPartMin.y
End Select
ptRawRefPoint.z = ptBBoxRawPartMin.z
Return ptRawRefPoint
End Function
Public Shared Function MoveRawPartPartAndFixture(nMoveId As Integer, vtMove As Vector3d, Optional nCount As Integer = 1) As Boolean
Dim bErrorMoving As Boolean = False
' Muovo gli oggetti selezionati se consentito
If nMoveId = GDB_ID.SEL Then
Dim nSelObjId As Integer = EgtGetFirstSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
If Not EgtMoveFixture(nSelObjId, vtMove) Then
bErrorMoving = True
nSelObjId = EgtGetPrevSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
EgtMoveFixture(nSelObjId, -vtMove)
Else
EgtMoveRawPart(nSelObjId, -vtMove)
End If
nSelObjId = EgtGetPrevSelectedObj()
End While
Exit While
End If
nSelObjId = EgtGetNextSelectedObj()
Else
If Not EgtMoveRawPart(nSelObjId, vtMove) Then
bErrorMoving = True
nSelObjId = EgtGetPrevSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
EgtMoveFixture(nSelObjId, -vtMove)
Else
EgtMoveRawPart(nSelObjId, -vtMove)
End If
nSelObjId = EgtGetPrevSelectedObj()
End While
Exit While
End If
nSelObjId = EgtGetNextSelectedObj()
End If
End While
Else
If EgtVerifyFixture(nMoveId) Then
If Not EgtMoveFixture(nMoveId, vtMove) Then
bErrorMoving = True
End If
Else
If Not EgtMoveRawPart(nMoveId, vtMove) Then
bErrorMoving = True
End If
End If
End If
' Variabile che contiene l'eventuale spostamento correttivo per interferenza con riferimenti
Dim vtRefMove As New Vector3d(Vector3d.NULL)
' Se non ci sono stati errori nel movimento
Dim bErrorVerify As Boolean = False
If Not bErrorMoving Then
' Verifico che gli spostamenti effettuati siano validi
If nMoveId = GDB_ID.SEL Then
Dim nSelObjId As Integer = EgtGetFirstSelectedObj()
While nSelObjId <> GDB_ID.NULL
If Not DispositionParameterExpanderViewModel.VerifyRawPartFixturePos(nSelObjId, vtMove, vtRefMove) Then
bErrorVerify = True
Exit While
End If
nSelObjId = EgtGetNextSelectedObj()
End While
Else
If Not DispositionParameterExpanderViewModel.VerifyRawPartFixturePos(nMoveId, vtMove, vtRefMove) Then
bErrorVerify = True
End If
'Dim sOut As String = "VerifyRaw : Count=" & nCount & " Err=" & If(bErrorVerify, "1", "0") &
' " Move=" & LenToString(vtMove.x, 3) & "," & LenToString(vtMove.y, 3) &
' " RefMove=" & LenToString(vtRefMove.x, 3) & "," & LenToString(vtRefMove.y, 3)
'EgtOutLog(sOut)
End If
End If
' Se non c'è errore ma necessaria correzione riferimento
If Not bErrorVerify AndAlso Not vtRefMove.IsSmall() Then
' provo a correggere (max 1 prova)
If nCount < 2 Then
bErrorVerify = Not MoveRawPartPartAndFixture(nMoveId, vtRefMove, nCount + 1)
End If
End If
' Se c'è almeno uno spostamento non valido
If bErrorVerify Then
' ripristino la situazione iniziale annullando tutti i movimenti
If nMoveId = GDB_ID.SEL Then
Dim nSelObjId As Integer = EgtGetFirstSelectedObj()
While nSelObjId <> GDB_ID.NULL
If EgtVerifyFixture(nSelObjId) Then
EgtMoveFixture(nSelObjId, -vtMove)
Else
EgtMoveRawPart(nSelObjId, -vtMove)
End If
nSelObjId = EgtGetNextSelectedObj()
End While
Else
If EgtVerifyFixture(nMoveId) Then
EgtMoveFixture(nMoveId, -vtMove)
Else
EgtMoveRawPart(nMoveId, -vtMove)
End If
End If
' ritorno falso
Return False
End If
Return True
End Function
Public Shared Function VerifyRawPartFixturePos(nMovedObjId As Integer, ByRef vtOrigMove As Vector3d, ByRef vtRefMove As Vector3d) As Boolean
' Verifico quale sia il tipo dell'oggetto mosso
If EgtVerifyFixture(nMovedObjId) Then
Return VerifyFixturePosition(nMovedObjId, vtRefMove)
ElseIf EgtVerifyRawPartCurrPhase(nMovedObjId) Then
Return VerifyRawPosition(nMovedObjId, vtOrigMove, vtRefMove)
Else
Return False
End If
End Function
Private Shared Function VerifyFixturePosition(nMovedFixtureId As Integer, ByRef vtRefMove As Vector3d) As Boolean
' Definisco il box della ventosa mossa
Dim bboxMovedFixture As New BBox3d
EgtGetBBoxGlob(nMovedFixtureId, GDB_BB.STANDARD, bboxMovedFixture)
Dim bboxFixture As New BBox3d
' Ciclo sui sottopezzi correnti per verificare le collisioni con il sottopezzo spostato
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
If EgtVerifyFixture(nFixtureId) AndAlso nFixtureId <> nMovedFixtureId Then
' ne calcolo il BBox
EgtGetBBoxGlob(nFixtureId, GDB_BB.STANDARD, bboxFixture)
' verifico se c'è sovrapposizione
If bboxMovedFixture.OverlapsXY(bboxFixture) Then
' se c'è restituisco falso perchè i sottopezzi non si possono sovrapporre
Return False
End If
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
Return VerifyFixtureWithRaw(nMovedFixtureId, vtRefMove)
End Function
Private Shared Function VerifyFixtureWithRaw(nFixtureId As Integer, ByRef vtRefMove As Vector3d) As Boolean
' Tengo da parte il riferimento della tavola
Dim ptTableRef As Point3d
EgtGetTableRef(1, ptTableRef)
Dim TableFrame As New Frame3d(ptTableRef)
' Definisco il box del sottopezzo mosso
Dim bboxFixture As New BBox3d
EgtGetBBoxGlob(nFixtureId, GDB_BB.STANDARD, bboxFixture)
Dim bboxRawPart As New BBox3d
' Ciclo sui grezzi della fase corrente per verificare le collisioni con il sottopezzo mosso
Dim nRawPartId As Integer = EgtGetFirstRawPart()
While nRawPartId <> GDB_ID.NULL
If EgtVerifyRawPartCurrPhase(nRawPartId) Then
' recupero il solido del grezzo
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne calcolo il BBox
EgtGetBBoxGlob(nRawSolidId, GDB_BB.STANDARD, bboxRawPart)
' verifico il tipo di sottopezzo
Select Case FixtureType(nFixtureId)
' se il sottopezzo è una ventosa
Case FIX_TYPE.VACUUM
' verifico se c'è sovrapposizione
If bboxFixture.OverlapsXY(bboxRawPart) Then
' se c'è devo verificare che l'altezza del grezzo sia uguale a quella della ventosa
' recupero altezza ventosa
Dim dFixtureHeight As Double = 0
EgtGetInfo(nFixtureId, "H", dFixtureHeight)
' recupero altezza grezzo riferita alla tavola
Dim dRawPartMin As Point3d = bboxRawPart.Min
dRawPartMin.ToLoc(TableFrame)
' se l'altezza grezzo è minore di quella della ventosa, lo sposto alla stessa altezza
If dRawPartMin.z < dFixtureHeight - EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawPartId, vtMove)
' ricalcolo il BBox del solido del grezzo per averlo aggiornato con la nuova Z
EgtGetBBoxGlob(nRawSolidId, GDB_BB.STANDARD, bboxRawPart)
End If
' se non c'è sovrapposizione devo verificare il grezzo con tutti gli altri sottopezzi per sapere se ho tolto l'ultimo e quindi devo abbassarlo
Else
' variabile che contiene la massima altezza delle ventose sottostanti
Dim dMaxFixtureHeight As Double = 0
' Variabile che dice se c'è almeno una ventosa sotto il grezzo
Dim bIsFixtureUnderRawPart As Boolean = False
Dim nOtherFixtureId As Integer = EgtGetFirstFixture()
While nOtherFixtureId <> GDB_ID.NULL
' evito di rifare la verifica sul sottopezzo mosso
If nOtherFixtureId <> nFixtureId Then
' calcolo il BBox del sottopezzo
Dim bboxOtherFixture As New BBox3d
EgtGetBBoxGlob(nOtherFixtureId, GDB_BB.STANDARD, bboxOtherFixture)
If bboxRawPart.OverlapsXY(bboxOtherFixture) Then
bIsFixtureUnderRawPart = True
' recupero altezza ventosa
Dim dOtherFixtureHeight As Double = 0
EgtGetInfo(nFixtureId, "H", dOtherFixtureHeight)
' la confronto con quella massima
If dOtherFixtureHeight > dMaxFixtureHeight Then
dMaxFixtureHeight = dOtherFixtureHeight
End If
End If
End If
nOtherFixtureId = EgtGetNextFixture(nOtherFixtureId)
End While
' recupero altezza grezzo riferita alla tavola
Dim dRawPartMin As Point3d = bboxRawPart.Min
dRawPartMin.ToLoc(TableFrame)
' se non ci sono ventose sotto il grezzo
If Not bIsFixtureUnderRawPart Then
' verifico che il grezzo sia ad altezza tavola
If dRawPartMin.z <> 0 Then
Dim vtMove As New Vector3d(0, 0, -dRawPartMin.z)
EgtMoveRawPart(nRawPartId, vtMove)
End If
Else
' se ci sono verifico che l'altezza del grezzo sia quella della ventosa più alta
If Math.Abs(dRawPartMin.z - dMaxFixtureHeight) > EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dMaxFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawPartId, vtMove)
End If
End If
End If
' se il sottopezzo è un riferimento
Case FIX_TYPE.REFERENCE
' verifico se c'è sovrapposizione
If bboxFixture.OverlapsXY(bboxRawPart) Then
' recupero arco del riferimento
Dim arcRefId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_ARC)
' recupero contorno del grezzo
Dim ccompoRawPartOutlineId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWOUTLINE)
'recupero il raggio dell'arco di riferimento
Dim dArcRadius As Double
EgtArcRadius(arcRefId, dArcRadius)
' faccio copia e offset del contorno grezzo
Dim ccompoRawPartOutlineOffsetId As Integer = EgtCopyGlob(ccompoRawPartOutlineId, ccompoRawPartOutlineId, GDB_POS.AFTER)
EgtOffsetCurve(ccompoRawPartOutlineOffsetId, dArcRadius, OFF_TYPE.FILLET)
' recupero centro dell'arco di riferimento
Dim ptArcCenter As Point3d
EgtCenterPoint(arcRefId, ccompoRawPartOutlineOffsetId, ptArcCenter)
' verifico quale è il punto dell'offset vicino al centro dell'arco di riferimento
Dim dDist As Double
Dim ptMin As Point3d
Dim nSide As Integer
EgtGetMinDistPntSidePointCurve(ptArcCenter, ccompoRawPartOutlineOffsetId, Vector3d.Z_AX, dDist, ptMin, nSide)
' cancello offset
EgtErase(ccompoRawPartOutlineOffsetId)
' calcolo il vettore di spostamento necessario ad allinearli
Dim vtDelta As Vector3d = ptArcCenter - ptMin
vtDelta.z = 0
' se i punti coincidono, esco
If vtDelta.IsSmall() Then
' il grezzo è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_CONTACTCOLDISK)
EgtSetColor(nContactColDisk, ReferenceContactColGreen)
Else
' altrimenti riporto il vettore di correzione
vtRefMove = -vtDelta.Glob(ccompoRawPartOutlineId)
End If
Else
' il grezzo non è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_CONTACTCOLDISK)
EgtSetColor(nContactColDisk, ReferenceContactColRed)
End If
End Select
End If
nRawPartId = EgtGetNextRawPart(nRawPartId)
End While
Return True
End Function
Private Shared Function VerifyRawPosition(nMovedRawId As Integer, ByRef vtOrigMove As Vector3d, ByRef vtRefMove As Vector3d) As Boolean
' Recupero il solido del grezzo
Dim nMovedRawSolidId As Integer = EgtGetFirstNameInGroup(nMovedRawId, RAWSOLID)
' definisco il box del solido del grezzo
Dim bboxMovedRawPart As New BBox3d
EgtGetBBoxGlob(nMovedRawSolidId, GDB_BB.STANDARD, bboxMovedRawPart)
Dim bboxRawPart As New BBox3d
' Ciclo sui grezzi della fase corrente per verificare le collisioni con il grezzo spostato
Dim nRawPartId As Integer = EgtGetFirstRawPart()
While nRawPartId <> GDB_ID.NULL
If EgtVerifyRawPartCurrPhase(nRawPartId) AndAlso nRawPartId <> nMovedRawId Then
' recupero il solido del grezzo
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne calcolo il BBox
EgtGetBBoxGlob(nRawSolidId, GDB_BB.STANDARD, bboxRawPart)
' verifico se c'è sovrapposizione
If bboxMovedRawPart.OverlapsXY(bboxRawPart) Then
' se c'è restituisco falso perchè i grezzi non si possono sovrapporre
Return False
End If
End If
nRawPartId = EgtGetNextRawPart(nRawPartId)
End While
' verifico le interferenze tra il grezzo spostato e le ventose
Return VerifyRawWithFixture(nMovedRawId, vtOrigMove, vtRefMove)
End Function
Private Shared Function VerifyRawWithFixture(nRawId As Integer, ByRef vtOrigMove As Vector3d, ByRef vtRefMove As Vector3d) As Boolean
' Tengo da parte il riferimento della tavola
Dim ptTableRef As Point3d
EgtGetTableRef(1, ptTableRef)
Dim TableFrame As New Frame3d(ptTableRef)
' Recupero il solido del grezzo
Dim nMovedRawSolidId As Integer = EgtGetFirstNameInGroup(nRawId, RAWSOLID)
' definisco il box del solido del grezzo
Dim bboxRawPartId As New BBox3d
EgtGetBBoxGlob(nMovedRawSolidId, GDB_BB.STANDARD, bboxRawPartId)
' Variabile che dice se c'è almeno una ventosa sotto il grezzo
Dim bIsFixtureUnderRawPart As Boolean = False
Dim bboxFixture As New BBox3d
' variabile che contiene la massima altezza delle ventose sottostanti
Dim dMaxFixtureHeight As Double = 0
' recupero altezza grezzo riferita alla tavola
Dim dRawPartMin As Point3d = bboxRawPartId.Min
dRawPartMin.ToLoc(TableFrame)
' Ciclo sui sottopezzi presenti per verificare le collisioni con il grezzo
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
' calcolo il BBox del sottopezzo
EgtGetBBoxGlob(nFixtureId, GDB_BB.STANDARD, bboxFixture)
' verifico se c'è sovrapposizione
If bboxRawPartId.OverlapsXY(bboxFixture) Then
Select Case FixtureType(nFixtureId)
' se il sottopezzo è una ventosa
Case FIX_TYPE.VACUUM
' recupero altezza ventosa
Dim dFixtureHeight As Double = 0
EgtGetInfo(nFixtureId, "H", dFixtureHeight)
' la confronto con quella massima
If dFixtureHeight > dMaxFixtureHeight Then
dMaxFixtureHeight = dFixtureHeight
End If
' se l'altezza grezzo è diversa da quella della ventosa, lo sposto alla stessa altezza
If dRawPartMin.z < dFixtureHeight - EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawId, vtMove)
' recupero il solido del grezzo
Dim nRawSolidId As Integer = EgtGetFirstNameInGroup(nRawId, RAWSOLID)
' ricalcolo il BBox del solido del grezzo per averlo aggiornato con la nuova Z
EgtGetBBoxGlob(nRawSolidId, GDB_BB.STANDARD, bboxRawPartId)
End If
bIsFixtureUnderRawPart = True
' se il sottopezzo è un riferimento
Case FIX_TYPE.REFERENCE
' recupero arco del riferimento
Dim arcRefId As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_ARC)
' recupero contorno del grezzo
Dim ccompoRawPartOutlineId As Integer = EgtGetFirstNameInGroup(nRawId, RAWOUTLINE)
'recupero il raggio dell'arco di riferimento
Dim dArcRadius As Double
EgtArcRadius(arcRefId, dArcRadius)
' faccio copia e offset del contorno grezzo
Dim ccompoRawPartOutlineOffsetId As Integer = EgtCopyGlob(ccompoRawPartOutlineId, ccompoRawPartOutlineId, GDB_POS.AFTER)
EgtOffsetCurve(ccompoRawPartOutlineOffsetId, dArcRadius, OFF_TYPE.FILLET)
' recupero centro dell'arco di riferimento
Dim ptArcCenter As Point3d
EgtCenterPoint(arcRefId, ccompoRawPartOutlineId, ptArcCenter)
' Creo un segmento avente origine nel centro dell'arco e direzione opposta a quella del movimento
Dim nDistLine As Integer = EgtCreateLinePVL(EgtGetParent(ccompoRawPartOutlineId), ptArcCenter, vtOrigMove.Loc(ccompoRawPartOutlineId), 10000)
' cerco punto di intersezione tra il segmento e l'offset
Dim ptDist As Point3d
If EgtIntersectionPoint(nDistLine, ccompoRawPartOutlineOffsetId, ptArcCenter, ptDist) Then
' calcolo il vettore di spostamento necessario ad allinearli
Dim vtDelta As Vector3d = -(ptDist - ptArcCenter)
vtDelta.z = 0
' se il vettore non è nullo
If vtDelta.IsSmall() Then
' il grezzo è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_CONTACTCOLDISK)
EgtSetColor(nContactColDisk, ReferenceContactColGreen)
Else
vtDelta = vtDelta.Glob(ccompoRawPartOutlineId)
' il vettore da restituire è nullo, quindi lo inizializzo
If vtRefMove.IsSmall() Then
vtRefMove = vtDelta
' altrimenti lo confronto
Else
' per ogni coordinata devo prendere il massimo in direzione opposta allo spostamento originale
' calcolo il versore nella direzione del movimento
Dim vtMoveVers As New Vector3d(vtOrigMove)
vtMoveVers.Normalize()
If (vtDelta * vtMoveVers) < (vtRefMove * vtMoveVers) Then
vtRefMove = vtDelta
End If
End If
End If
End If
' cancello segmento e offset
EgtErase(nDistLine)
EgtErase(ccompoRawPartOutlineOffsetId)
End Select
' se non c'è sovrapposizione
ElseIf FixtureType(nFixtureId) = FIX_TYPE.REFERENCE Then
' il grezzo non è in battuta sul riferimento
Dim nContactColDisk As Integer = EgtGetFirstNameInGroup(EgtGetFirstNameInGroup(nFixtureId, SOLID), REF_CONTACTCOLDISK)
EgtSetColor(nContactColDisk, ReferenceContactColRed)
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
' se non ci sono ventose sotto il grezzo
If Not bIsFixtureUnderRawPart Then
' verifico che il grezzo sia ad altezza tavola
If dRawPartMin.z <> 0 Then
Dim vtMove As New Vector3d(0, 0, -dRawPartMin.z)
EgtMoveRawPart(nRawId, vtMove)
End If
Else
' se ci sono verifico che l'altezza del grezzo sia quella della ventosa più alta
If Math.Abs(dRawPartMin.z - dMaxFixtureHeight) > EPS_SMALL Then
Dim vtMove As New Vector3d(0, 0, dMaxFixtureHeight - dRawPartMin.z)
EgtMoveRawPart(nRawId, vtMove)
End If
End If
Return True
End Function
' Funzione che restituisce il tipo di sottopezzo passatogli
Friend Shared Function FixtureType(nFixtureId As Integer) As FIX_TYPE
Dim sFitureType As String = String.Empty
EgtGetInfo(nFixtureId, EgtUILib.FIX_TYPE, sFitureType)
Select Case sFitureType
Case FIX_VAC
Return FIX_TYPE.VACUUM
Case FIX_REF
Return FIX_TYPE.REFERENCE
End Select
Return FIX_TYPE.NULL
End Function
Friend Enum FIX_TYPE As Integer
NULL = 0
VACUUM = 1
REFERENCE = 2
End Enum
' Funzione che seleziona i sottopezzi del grezzo passatogli
Friend Shared Sub SelectRawPartFixture(nRawPartId As Integer)
Dim bboxRawPart As New BBox3d
Dim bboxFixture As New BBox3d
' ricavo solido del grezzo
Dim nRawPartSolid As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne ricavo il bbox
EgtGetBBoxGlob(nRawPartSolid, GDB_BB.STANDARD, bboxRawPart)
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
' ricavo il bbox del sottopezzo
EgtGetBBoxGlob(nFixtureId, GDB_BB.STANDARD, bboxFixture)
' verifico se si sovrappongono
If bboxRawPart.OverlapsXY(bboxFixture) Then
' seleziono il sottopezzo
EgtSelectObj(nFixtureId)
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
End Sub
' Funzione che deseleziona i sottopezzi del grezzo passatogli
Friend Shared Sub DeselectRawPartFixture(nRawPartId As Integer)
Dim bboxRawPart As New BBox3d
Dim bboxFixture As New BBox3d
' ricavo solido del grezzo
Dim nRawPartSolid As Integer = EgtGetFirstNameInGroup(nRawPartId, RAWSOLID)
' ne ricavo il bbox
EgtGetBBoxGlob(nRawPartSolid, GDB_BB.STANDARD, bboxRawPart)
Dim nFixtureId As Integer = EgtGetFirstFixture()
While nFixtureId <> GDB_ID.NULL
' ricavo il bbox del sottopezzo
EgtGetBBoxGlob(nFixtureId, GDB_BB.STANDARD, bboxFixture)
' verifico se si sovrappongono
If bboxRawPart.OverlapsXY(bboxFixture) Then
' deseleziono il pezzo
EgtDeselectObj(nFixtureId)
End If
nFixtureId = EgtGetNextFixture(nFixtureId)
End While
End Sub
#End Region ' DoneCommand
#Region "CheckedRawRefCommand"
''' <summary>
''' Returns a command that do Done.
''' </summary>
Public ReadOnly Property CheckedRawRefCommand As ICommand
Get
If m_cmdCheckedRawRef Is Nothing Then
m_cmdCheckedRawRef = New RelayCommand(AddressOf CheckedRawRef)
End If
Return m_cmdCheckedRawRef
End Get
End Property
''' <summary>
''' Execute the Point. This method is invoked by the DoneCommand.
''' </summary>
Public Sub CheckedRawRef(ByVal param As Object)
Dim nRawRef As MCH_CR = DirectCast(param, MCH_CR)
m_RawRefPosition = nRawRef
End Sub
#End Region ' CheckedRawRefCommand
#End Region
End Class
End Namespace