Files
egtstone3d/SceneHost/SceneHostV.xaml.vb
T

745 lines
35 KiB
VB.net

Imports EgtUILib
Imports EgtUILib.EgtInterface
Imports EgtWPFLib5
Public Class SceneHostV
#Region "FIELDS & PROPERTIES"
Private m_MySceneHostVM As MySceneHostVM
' variabili per la selezione in over
Public m_SelType As Integer = GDB_TY.CRV_LINE ' tipo di oggetti da evidenziare con il mouse over
Private m_nIdMouseOverSel As Integer = GDB_ID.NULL ' id dell'oggetto attualmente evidenziato dal mouse over
Public m_nIdMarked1 As Integer = GDB_ID.NULL ' oggetto da tenere evidenziato
Public m_nIdMarked2 As Integer = GDB_ID.NULL
Public m_nIdMarked3 As Integer = GDB_ID.NULL
Public m_nIdMarked4 As Integer = GDB_ID.NULL
Public m_nAlphaTransparent As Integer = 0 ' trasparenza originale dell'oggetto evidenziato
Public m_nAlphaTransparent1 As Integer = 0 ' trsparenza dell'oggetto Marked3
Public m_nAlphaTransparent2 As Integer = 0 ' trsparenza dell'oggetto Marked4
' variabili per la selezione degli elementi e il drag
Private m_bEnableEdit As Boolean = False
Public m_nIdPart As Integer = GDB_ID.NULL
Private m_nIdToSel As Integer = GDB_ID.NULL
Private m_nIdToDesel As Integer = GDB_ID.NULL
Private m_bDrag As Boolean = False
Private m_bRotate As Boolean = False
Private m_bDragToStart As Boolean = False
Private m_bDragging As Boolean = False
Private m_locPrev As System.Drawing.Point
Private m_ptPrev As Point3d
Private m_ptCen As Point3d
' Gestione rotazione pezzi in fase di Drag
Private m_bKeyCtrlPressed As Boolean = False
Private m_bKeyLeftShiftPressed As Boolean = False
Private m_dAngTotal As Double = 0
Private m_dStartAng As Double = 0
Private m_bStartRot As Boolean = False
Private m_bStartMove As Boolean = False
Private m_ptBeforeTrasf As New Point3d ' punto da salvare per poter condensare le operazioni di drag e rotate con terna in un'unica operazione
Private m_nRestRadius As Integer = GetMainPrivateProfileInt(S_NEST, K_RESTRADIUS, 3)
' variabili aggiuntive per spostamenti e rotazioni
Public m_dAngRot As Double = 0 ' ultimo angolo che è stato usato con il comando Rotate
Public m_bRotated As Boolean = False
Private m_dCorrection As Double = 0 ' correzione da applicare all'ultima operazione di drag/rotate per poter andare in battuta senza creare intersezioni
Private m_bPreview As Boolean = False ' boolean per indicare se è stata visualizzata la preview per il valore inserito nel comando move
Private m_ptPair As New Point3d ' punto scelto per l'accoppiamento
Public m_bFlippedParal As Boolean = False ' flag che indica se il pezzo che si sta cercando di accoppiare è stato flippato
Public m_bFlippedPerp As Boolean = False ' flag che indica se il pezzo che si sta cercando di accoppiare è stato flippato
Public m_nTransfNum As Integer = 0 ' numero di operazioni che è stato effettuato dall'inzio del pairing
' gestione del move con inserimento a mano
Public m_bPreviewShown As Boolean = False
' gestione del tempo
Public m_MaxTime As Integer = 50
Private m_nTime As Integer = -1
Public Property nTime As Integer
Get
Return m_nTime
End Get
Set(value As Integer)
If value < -1 Then Return
If value >= m_MaxTime Then Return
m_nTime = value
End Set
End Property
Public m_MaxTempTime As Integer = 100
Private m_nTempTime As Integer = -1
Public Property nTempTime As Integer
Get
Return m_nTempTime
End Get
Set(value As Integer)
m_nTempTime = value
End Set
End Property
#End Region ' Fields & Properties
#Region "CONSTRUCTOR"
Sub New()
' La chiamata è richiesta dalla finestra di progettazione.
InitializeComponent()
' Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a InitializeComponent().
Me.DataContext = New MySceneHostVM
m_MySceneHostVM = DirectCast(Me.DataContext, MySceneHostVM)
m_MySceneHostVM.SetMainScene(MainScene)
Map.SetRefSceneHostV(Me)
'debug
'EgtOpenFile("D:\\Temp\\marmo\\Vein3D\\piano_PREassemlbaggio.vme")
EgtOpenFile("D:\\Temp\\marmo\\Vein3D\\prima paretina.nge")
'debug
AddHandler MainScene.OnMouseMoveScene, AddressOf OnMouseMoveScene
AddHandler MainScene.OnMouseDownScene, AddressOf OnMouseDownScene
AddHandler MainScene.OnMouseUpScene, AddressOf OnMouseUpScene
AddHandler MainScene.KeyDown, AddressOf ShiftKey_Down
AddHandler MainScene.KeyUp, AddressOf ShiftKey_Up
End Sub
#End Region ' Constructor
#Region "EVENTS"
Private Sub OnMouseMoveScene(sender As Object, e As System.Windows.Forms.MouseEventArgs)
OnMouseOver(sender, e, m_SelType)
' Se drag non abilitato o già in esecuzione, esco
If Not m_bDrag Or m_bDragging Then Return
' Determino cosa muovere
'Dim nMoveId = If(m_nIdToSel <> GDB_ID.NULL, m_nIdToSel, GDB_ID.SEL)
Dim PartSolidSel As PartSolidM = GetPartSolid(m_nIdPart)
If IsNothing(PartSolidSel) Then Return
Dim nMoveId = PartSolidSel.SolidId
' Se primo movimento di drag, verifico di aver superato la soglia di movimento in pixel
If m_bDragToStart Then
If Math.Abs(e.Location.X - m_locPrev.X) < m_nRestRadius And
Math.Abs(e.Location.Y - m_locPrev.Y) < m_nRestRadius Then
Return
End If
'If m_bRotate Then
' 'If Not EgtGetPartPartClusterCenterGlob(nMoveId, m_ptCen) Then Return
'End If
m_bDragToStart = False
End If
' Inizio esecuzione di drag
m_bDragging = True
' Ricavo il punto corrente in coordinate mondo
Dim ptCurr As Point3d
EgtUnProjectPoint(e.Location, ptCurr)
' Se traslazione
If Not m_bRotate Then
' Ricavo il vettore di movimento
Dim vtMove As Vector3d = ptCurr - m_ptPrev
' Eseguo il movimento
If vtMove.SqLen() > EPS_SMALL * EPS_SMALL Then
Move(m_nIdPart, PartSolidSel.vtDrag * (PartSolidSel.vtDrag * vtMove), False, True)
'If TgBtn_Inters.IsChecked Then
' Dim vInters As ObservableCollection(Of PartSolidM) = CalcInters(PartSolidSel.PartSolidId)
' If vInters.Count() <> 1 Then
' m_bDrag = False
' Dim dCorr As Double = 0.0
' SolidManagerM.MaxApproach(PartSolidSel, dCorr, vInters)
' m_dCorrection = dCorr
' End If
'End If
'VeinMatching.SetProjectModified()
EgtDraw()
End If
' altrimenti rotazione
Else
' Ricavo l'angolo di movimento
m_ptCen = PartSolidSel.Center()
Dim vtPrev As Vector3d = m_ptPrev - m_ptCen
Dim vtCurr As Vector3d = ptCurr - m_ptCen
'MyMsgTxBl.Text = String.Format("{0:00.00}", vtCurr.z)
Dim dAngRotDeg As Double = Math.Atan2(Vector3d.CrossXY(vtPrev, vtCurr), Vector3d.ScalarXY(vtPrev, vtCurr)) * 180.0 / Math.PI
If Math.Abs(dAngRotDeg) > EPS_ANG_SMALL Then
Rotate(m_nIdPart, m_ptCen, PartSolidSel.vtDrag, dAngRotDeg, False)
' qui inserisco il controllo sull'intersezione ed eventulamente il passo indietro con MaxApproach
'If TgBtn_Inters.IsChecked Then
' Dim vInters As ObservableCollection(Of PartSolidM) = CalcInters(PartSolidSel.PartSolidId)
' If vInters.Count() <> 1 Then
' m_bDrag = False
' Dim dCorr As Double = 0.0
' MaxApproach(PartSolidSel, dCorr, vInters)
' m_dCorrection = dCorr
' End If
'End If
'VeinMatching.SetProjectModified()
EgtDraw()
End If
End If
' Aggiorno il punto precedente
m_ptPrev = ptCurr
' Terminata esecuzione di drag
m_bDragging = False
End Sub
Private Sub OnMouseOver(sender As Object, e As Windows.Forms.MouseEventArgs, Optional IdType As GDB_TY = GDB_TY.CRV_LINE)
' Eseguo selezione
EgtSetObjFilterForSelWin(True, True, True, True, True)
Dim nSel As Integer
EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel)
' Ricavo la prima enità selezionata
Dim nId As Integer = EgtGetFirstObjInSelWin()
While nId <> GDB_ID.NULL
' riconsco il tipo di entità
Dim bCanResetPreviousMark As Boolean = m_nIdMouseOverSel <> m_nIdMarked1 And m_nIdMouseOverSel <> m_nIdMarked2 And
m_nIdMouseOverSel <> m_nIdMarked3 And m_nIdMouseOverSel <> m_nIdMarked4
Dim sNameLay As String = String.Empty
EgtGetName(EgtGetParent(nId), sNameLay)
' se sono attivi i bottoni AddSplashTop o AddWaterfall, posso evidenziare solo i lati dell'OUTLOOP
Dim bParetinaApproved As Boolean = ((Map.refSceneButtonVM.IsTgBtnChecked("AddSplashTop") Or
Map.refSceneButtonVM.IsTgBtnChecked("AddWaterfall")) And (sNameLay = OUTLOOP Or sNameLay = INLOOP)) Or
(Not Map.refSceneButtonVM.IsTgBtnChecked("AddSplashTop") And
Not Map.refSceneButtonVM.IsTgBtnChecked("AddWaterfall"))
If EgtGetType(nId) = IdType Then
If nId <> m_nIdMouseOverSel And
nId <> m_nIdMarked1 And nId <> m_nIdMarked2 And nId <> m_nIdMarked3 And nId <> m_nIdMarked4 And
((m_nIdMouseOverSel <> GDB_ID.NULL And bCanResetPreviousMark) Or m_nIdMouseOverSel = GDB_ID.NULL) And
bParetinaApproved Then
EgtResetMark(m_nIdMouseOverSel)
EgtSetAlpha(m_nIdMouseOverSel, m_nAlphaTransparent)
' recupero info colore/trasparenza oggetto
Dim Color3D_ As Color3d
EgtGetColor(nId, Color3D_)
' se prima selezione, allora salvo il valore di trasparenza
If m_nIdMouseOverSel <> nId Then m_nAlphaTransparent = Color3D_.A
' Selezione oggetto
EgtSetAlpha(nId, 100)
EgtSetMark(nId)
m_nIdMouseOverSel = nId
End If
Exit While
End If
' Passo al successivo
nId = EgtGetNextObjInSelWin()
End While
If nId = GDB_ID.NULL And m_nIdMouseOverSel <> GDB_ID.NULL Then
If m_nIdMouseOverSel <> m_nIdMarked1 And m_nIdMouseOverSel <> m_nIdMarked2 And
m_nIdMouseOverSel <> m_nIdMarked3 And m_nIdMouseOverSel <> m_nIdMarked4 Then
EgtResetMark(m_nIdMouseOverSel)
EgtSetAlpha(m_nIdMouseOverSel, m_nAlphaTransparent)
End If
m_nIdMouseOverSel = GDB_ID.NULL
End If
EgtDraw()
End Sub
Private Sub OnMouseDownScene(sender As Object, e As Windows.Forms.MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Right Then
Map.refSceneButtonV.MenuSelType.IsOpen = Not Map.refSceneButtonV.MenuSelType.IsOpen
Return
End If
If e.Button = Windows.Forms.MouseButtons.Left Then
Map.refSceneButtonV.MenuSelType.IsOpen = False
End If
' Per default no drag
m_bDrag = False
m_bRotate = False
' Si può selezionare solo con il tasto sinistro e se non stato NULL
If e.Button <> Windows.Forms.MouseButtons.Left Or Not MainScene.IsStatusNull() Then Return
' Eseguo selezione
EgtSetObjFilterForSelWin(True, True, True, True, True)
Dim nSel As Integer
EgtSelect(e.Location, Scene.DIM_SEL, Scene.DIM_SEL, nSel)
' Ricavo nome dell'entità selezionata e identificativo
Dim nId As Integer = EgtGetFirstObjInSelWin()
While nId <> GDB_ID.NULL
' Cerco l'identificativo del pezzo cui appartiene
Dim nPartId As Integer = EgtGetParent(EgtGetParent(nId))
Dim sName As String = String.Empty
EgtGetName(nPartId, sName)
If sName = "Terna" Then
Dim sNameAx As String = String.Empty
EgtGetName(EgtGetParent(nId), sNameAx)
Dim PartSolidIdTempSel As PartSolidM = GetPartSolid(m_nIdPart)
If IsNothing(PartSolidIdTempSel) Then Return
'PartSolidIdTempSel.Unpair()
Select Case sNameAx
Case "X"
Dim vtDir As New Vector3d
Dim nLay As Integer = EgtGetFirstNameInGroup(PartSolidIdTempSel.TernaId, "AxisX")
EgtStartVector(EgtGetFirstInGroup(nLay), GDB_RT.GLOB, vtDir)
PartSolidIdTempSel.vtDrag = vtDir
m_bDrag = True
'wnd_RotationInputDataV.Testo.Text = "α°"
Case "Y"
Dim vtDir As New Vector3d
Dim nLay As Integer = EgtGetFirstNameInGroup(PartSolidIdTempSel.TernaId, "AxisY")
EgtStartVector(EgtGetFirstInGroup(nLay), GDB_RT.GLOB, vtDir)
PartSolidIdTempSel.vtDrag = vtDir
m_bDrag = True
'wnd_RotationInputDataV.Testo.Text = "𝛃°"
Case "Z"
Dim vtDir As New Vector3d
Dim nLay As Integer = EgtGetFirstNameInGroup(PartSolidIdTempSel.TernaId, "AxisZ")
EgtStartVector(EgtGetFirstInGroup(nLay), GDB_RT.GLOB, vtDir)
PartSolidIdTempSel.vtDrag = vtDir
m_bDrag = True
'wnd_RotationInputDataV.Testo.Text = "𝛄°"
Case "XY", "YX"
If (Keyboard.Modifiers And ModifierKeys.Shift) > 0 Then
PartSolidIdTempSel.vtDrag = Vector3d.Z_AX
m_bDrag = True
m_bRotate = True
'wnd_RotationInputDataV.Testo.Text = "𝛄°"
Else
' Passo al successivo
nId = EgtGetNextObjInSelWin()
Continue While
End If
Case "YZ", "ZY"
If (Keyboard.Modifiers And ModifierKeys.Shift) > 0 Then
PartSolidIdTempSel.vtDrag = Vector3d.X_AX
m_bDrag = True
m_bRotate = True
'wnd_RotationInputDataV.Testo.Text = "α°"
Else
' Passo al successivo
nId = EgtGetNextObjInSelWin()
Continue While
End If
Case "ZX", "XZ"
If (Keyboard.Modifiers And ModifierKeys.Shift) > 0 Then
PartSolidIdTempSel.vtDrag = Vector3d.Y_AX
m_bDrag = True
m_bRotate = True
'wnd_RotationInputDataV.Testo.Text = "𝛃°"
Else
' Passo al successivo
nId = EgtGetNextObjInSelWin()
Continue While
End If
' sennò procedo ad esseguire la rotazione attorno al segmento selezionato...
Case "AxisX"
'wnd_RotationInputDataV.Testo.Text = "α°"
GoTo Line1
Case "AxisY"
'wnd_RotationInputDataV.Testo.Text = "𝛃°"
GoTo Line1
Case "AxisZ"
'wnd_RotationInputDataV.Testo.Text = "𝛄°"
GoTo Line1
Case Else
End Select
m_bDragToStart = True
m_locPrev = e.Location
m_bDrag = m_bDrag AndAlso EgtUnProjectPoint(e.Location, m_ptPrev)
'salvo il punto di inizio del drag per poter salvare l'operazione di drag come un'unica operazione, al momento del mouseUp
If m_bDrag Then m_ptBeforeTrasf = m_ptPrev
Exit While
End If
If Not EgtIsPart(nPartId) Then
' Passo al successivo
nId = EgtGetNextObjInSelWin()
Continue While
End If
Line1:
' rotazione attiva
If Map.refSceneButtonVM.IsTgBtnChecked(EGT_ROTATE) Then
Dim RotateVM As RotateVM = DirectCast(Map.refSceneButtonV.m_RotateUC.DataContext, RotateVM)
If RotateVM.AtStage() = RotateStage.SelectAxis Then
' se non identificato un part da ruotare aggiorno l'id
If m_nIdPart = -1 Then
m_nIdPart = nPartId
' se avevo identificato un part da ruotare, ma ne ho identificato uno nuovo e non ho selezioni attive allora cambio id
ElseIf m_nIdPart <> -1 And m_nIdPart <> nPartId And Not IsAPartSelected() Then
Dim PartSolidIdSel As PartSolidM = GetPartSolid(m_nIdPart)
If IsNothing(PartSolidIdSel) Then Return
PartSolidIdSel.ResetData()
m_nIdPart = nPartId
End If
Dim PartSolidIdTempSel As PartSolidM = GetPartSolid(m_nIdPart)
If IsNothing(PartSolidIdTempSel) Then Return
If EgtGetType(nId) = GDB_TY.CRV_LINE And PartSolidIdTempSel.nIdLineAxisRotate = -1 Then
PartSolidIdTempSel.nIdLineAxisRotate = nId
EgtSetMark(nId)
m_nIdMarked1 = nId
' se trovo già un valore scritto nella casella di testo allora ruoto subito il part attorno all'asse indicato
RotateVM.bAxisSelected = True
RotateVM.AngText_Changed()
Return
ElseIf EgtGetType(nId) = GDB_TY.CRV_LINE And PartSolidIdTempSel.nIdLineAxisRotate <> -1 Then
EgtResetMark(PartSolidIdTempSel.nIdLineAxisRotate)
PartSolidIdTempSel.nIdLineAxisRotate = nId
EgtSetMark(nId)
m_nIdMarked1 = nId
' se trovo già un valore scritto nella casella di testo allora ruoto subito il part attorno all'asse indicato
RotateVM.bAxisSelected = True
RotateVM.AngText_Changed()
End If
' Passo al successivo
nId = EgtGetNextObjInSelWin()
Continue While
End If
End If
''misura
'If TgBtn_Measure.IsChecked Then
' If m_nIdPart = GDB_ID.NULL Then
' m_nIdPart = nPartId
' End If
' If EgtGetType(nId) = GDB_TY.CRV_LINE Then
' Dim PartSolidIdTempSel As PartSolid = GetPartSolid(m_nIdPart)
' If IsNothing(PartSolidIdTempSel) Then Return
' If PartSolidIdTempSel.nIdLineFirst <> -1 Then
' EgtResetMark(PartSolidIdTempSel.nIdLineFirst)
' End If
' EgtSetMark(nId)
' m_nIdMarked1 = nId
' PartSolidIdTempSel.nIdLineFirst = nId
' MyMsgTxBl.Text = MeasureOption.SelectedItem.ToString & ": " & PartSolidIdTempSel.GetLineInfo(MeasureOption.SelectedIndex)
' Return
' End If
' nId = EgtGetNextObjInSelWin()
' Continue While
'End If
' kiss kiss
If Map.refSceneButtonVM.IsTgBtnChecked(EGT_PAIR) Then
If m_nIdPart = -1 Then
m_nIdPart = nPartId
End If
Dim PartSolidIdTempSel As PartSolidM = GetPartSolid(m_nIdPart)
If IsNothing(PartSolidIdTempSel) Then Return
Dim PartSolidIdTempSel2 As PartSolidM = GetPartSolid(EgtGetParent(EgtGetParent(PartSolidIdTempSel.nIdLineSecond)))
Dim PartSolidIdTempSelNew As PartSolidM = GetPartSolid(nPartId)
Dim PairUC As PairVM = DirectCast(Map.refSceneButtonV.m_PairUC.DataContext, PairVM)
If EgtGetType(nId) = GDB_TY.CRV_LINE And PartSolidIdTempSel.nIdLineFirst = -1 Then
PartSolidIdTempSel.nIdLineFirst = nId
EgtSetMark(nId)
m_nIdMarked1 = nId
PairUC.AdvanceStage()
Return
' impongo anche che il secondo lato appartenga ad un solid diverso dal primo selezionato
ElseIf EgtGetType(nId) = GDB_TY.CRV_LINE And PartSolidIdTempSel.nIdLineSecond = -1 And
nPartId <> PartSolidIdTempSel.PartId And nPartId <> PartSolidIdTempSel.PartSolidId Then
PairUC.AdvanceStage()
PartSolidIdTempSel.nIdLineSecond = nId
EgtSetMark(nId)
m_nIdMarked2 = nId
PairUC.PairParts()
Return
' impongo anche che il secondo lato appartenga ad un solid diverso dal primo selezionato
ElseIf EgtGetType(nId) = GDB_TY.CRV_LINE And PartSolidIdTempSel.nIdLineSecond <> -1 And
nPartId <> PartSolidIdTempSel.PartId And nPartId <> PartSolidIdTempSel.PartSolidId Then
'MyMsgTxBl.Text = "Modifica le impostazioni di accoppiamento e conferma oppura annulla l'accoppiamento" & vbCrLf &
' "tenendo premuto SHIFT puoi anche selezionare per ogni Part una faccia adiacente ai due lati accoppiati, per farle coincidere"
EgtResetMark(PartSolidIdTempSel.nIdLineSecond)
EgtSetMark(nId)
m_nIdMarked2 = nId
PartSolidIdTempSel.nIdLineSecond = nId
PairUC.PairParts()
Return
' impongo che la prima faccia appartenga al primo solido selezionato
ElseIf (ModifierKeys.Shift And Keyboard.Modifiers) > 0 And EgtGetType(nId) = GDB_TY.SRF_FRGN And
PartSolidIdTempSelNew.PartSolidId = PartSolidIdTempSel.PartSolidId Then
PartSolidIdTempSel.nIdSurfFirst = nId
If m_nIdMarked3 <> GDB_ID.NULL Then
EgtResetMark(m_nIdMarked3)
EgtSetAlpha(m_nIdMarked3, m_nAlphaTransparent1)
End If
m_nIdMarked3 = nId
' salvo il valore di trasparenza
m_nAlphaTransparent1 = m_nAlphaTransparent
'EgtSurfFrNormVersor(nId, GDB_ID.ROOT, PartSolidIdTempSel.vtNormFirst)
EgtSetMark(nId)
Return
' impongo che la seconda faccia appartenga ad un solido diverso dal primo selezionato
ElseIf (ModifierKeys.Shift And Keyboard.Modifiers) > 0 And EgtGetType(nId) = GDB_TY.SRF_FRGN And
PartSolidIdTempSel.nIdLineSecond <> GDB_ID.NULL And PartSolidIdTempSel.nIdSurfFirst <> GDB_ID.NULL Then
If PartSolidIdTempSel2.PartSolidId = PartSolidIdTempSel.PartSolidId Then
'MyMsgTxBl.Text = "Devi selezionare una faccia appartente ad un altro pezzo"
Return
End If
If PartSolidIdTempSelNew.PartSolidId <> PartSolidIdTempSel2.PartSolidId Then
'MyMsgTxBl.Text = "Devi selezionare una faccia appartente al pezzo del secondo edge selezionato"
Return
End If
'EgtSurfFrNormVersor(nId, GDB_ID.ROOT, PartSolidIdTempSel.vtNormSecond)
EgtResetMark(PartSolidIdTempSel.nIdSurfSecond)
PartSolidIdTempSel.nIdSurfSecond = nId
If m_nIdMarked4 <> GDB_ID.NULL Then
EgtResetMark(m_nIdMarked4)
EgtSetAlpha(m_nIdMarked4, m_nAlphaTransparent2)
End If
m_nIdMarked4 = nId
' salvo il valore di trasparenza
m_nAlphaTransparent2 = m_nAlphaTransparent
EgtSetMark(nId)
FacePair(m_nIdPart, m_nTransfNum)
Return
End If
' Passo al successivo
nId = EgtGetNextObjInSelWin()
Continue While
End If
If Map.refSceneButtonVM.IsTgBtnChecked(EGT_ALZ) Then
If EgtGetType(nId) = GDB_TY.CRV_LINE Then
Dim sEdgeName As String = String.Empty
EgtGetName(nId, sEdgeName)
If sEdgeName.Length > 0 Then
If sEdgeName(0) = "A" Then
' setto l'indice del lato e il parent
If EgtLuaSetGlobIntVar("TOOL.nEdgeId", nId) Then AssLog("TOOL.nEdgeId = " & nId.ToString())
If EgtLuaSetGlobIntVar("TOOL.nParent", nPartId) Then AssLog("TOOL.nParent = " & nPartId.ToString())
' setto le variabili per l'alzatina
Dim dAngAlzatina As Double = 90
If EgtLuaSetGlobNumVar("TOOL.dPairAng", dAngAlzatina) Then AssLog("TOOL.dPairAng = " & dAngAlzatina.ToString())
Dim nJunctionTypeAlz = 1
If EgtLuaSetGlobIntVar("TOOL.nJunctionType", nJunctionTypeAlz) Then AssLog("TOOL.nJunctionType = " & nJunctionTypeAlz.ToString())
Dim bOnLoop As Boolean = False
If EgtLuaSetGlobBoolVar("TOOL.bOnLoop", bOnLoop) Then AssLog("TOOL.bOnLoop = false")
' setto le varibili generiche per il pezzo
Dim dTh As Double = 10
If EgtLuaSetGlobNumVar("TOOL.dTh", dTh) Then AssLog("TOOL.dTh = " & dTh.ToString())
Dim dH As Double = 100
If EgtLuaSetGlobNumVar("TOOL.dH", dH) Then AssLog("TOOL.dH = " & dH.ToString())
If EgtLuaSetGlobBoolVar("TOOL.bPrev", True) Then AssLog("TOOL.bPrev = true")
If EgtLuaSetGlobBoolVar("TOOL.bNext", True) Then AssLog("TOOL.bNext = true")
' chiamo la funzione per la creazione
If EgtLuaCallFunction("TOOL.CreateParetinaFull") Then AssLog("TOOL.CreateParetinaFull()")
Return
End If
End If
End If
nId = EgtGetNextObjInSelWin()
Continue While
End If
' selezione semplice
If EgtIsPart(nPartId) Then
Dim nStat As Integer = GDB_ST.ON_
EgtGetStatus(nPartId, nStat)
' Se già selezionato o posizione oggetto incompatibile con flag posizione selezionati
If nStat = GDB_ST.SEL Then
' Memorizzo Id da deselezionare
m_nIdToDesel = nPartId
Else
' Memorizzo Id da selezionare
m_nIdToSel = nPartId
'm_nIdPart = nPartId
End If
If m_bEnableEdit Then m_bDrag = True
EgtDraw()
Exit While
End If
' Passo al successivo
nId = EgtGetNextObjInSelWin()
End While
End Sub
Private Sub OnMouseUpScene(sender As Object, e As System.Windows.Forms.MouseEventArgs)
' Se abilitata modifica
If m_bEnableEdit Then
' Se eseguito drag
If Not m_bDragToStart Then
' Non serve fare alcunché
' Se selezione da eseguire
ElseIf m_nIdToSel <> GDB_ID.NULL Then
' Eseguo la selezione
Dim PartSolidIdToSel As PartSolidM = GetPartSolid(m_nIdToSel)
If IsNothing(PartSolidIdToSel) Then Return
PartSolidIdToSel.SelectPart()
' Se deselezione da eseguire
ElseIf m_nIdToDesel <> GDB_ID.NULL Then
Dim PartSolidIdToDesel As PartSolidM = GetPartSolid(m_nIdToDesel)
If IsNothing(PartSolidIdToDesel) Then Return
PartSolidIdToDesel.DeselectPart()
End If
' Altrimenti selezione/deselezione anche per nesting
Else
' Se selezione da eseguire
If m_nIdToSel <> GDB_ID.NULL Then
'' deseleziono tutto quello che c'era selezionato prima
'If Not TgBtn_MultiSel.IsChecked Then DeselectAll()
' Eseguo la selezione in Nesting
Dim PartSolidIdToSel As PartSolidM = GetPartSolid(m_nIdToSel)
If IsNothing(PartSolidIdToSel) Then
' il part selezionato non ha un PartSolid associato nella lista, quindi lo creo e lo aggiungo
Dim Part As New PartSolidM(m_nIdToSel)
m_PartSolidList.Add(Part)
PartSolidIdToSel = GetPartSolid(m_nIdToSel)
If IsNothing(PartSolidIdToSel) Then Return
End If
If m_nIdPart = GDB_ID.NULL Then
If Map.refSceneButtonVM.IsTgBtnChecked(EGT_MOVE) Then
' era attiva la modalità move ma non avevo selezionato un part
DirectCast(Map.refSceneButtonV.m_MoveUC.DataContext, MoveVM).AdvanceStage()
End If
If Map.refSceneButtonVM.IsTgBtnChecked(EGT_ROTATE) Then
' era attiva la modalità rotate ma non avevo selezionato un part
m_nIdPart = PartSolidIdToSel.PartId
PartSolidIdToSel.SelectPart()
DirectCast(Map.refSceneButtonV.m_RotateUC.DataContext, RotateVM).AdvanceStage()
End If
End If
m_nIdToSel = PartSolidIdToSel.PartId
m_nIdPart = PartSolidIdToSel.PartId
'' seleziono l'oggetto nel tree
'SelectInTree()
' attivo tutti i pulsanti che eseguono azioni sul pezzo
EnableActionButtons()
'' seleziono nel nesting
'Dim bSelected As Boolean = False
'Dim nOriId As Integer = GDB_ID.NULL
'EgtGetInfo(m_nIdToSel, KEY_ORI_ID, nOriId)
'If EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) AndAlso EgtExistsObj(nOriId) Then
' Dim nMachGrpId As Integer
' If (OmagOFFICEMap.refNestingTabVM.SelectPart(nOriId, False, nMachGrpId)) Then
' bSelected = True
' Else
' If nMachGrpId = GDB_ID.NULL Then
' ' "Attenzione" "Pezzo non selezionabile in questa condizione"
' MessageBox.Show(Me, EgtMsg(91606), EgtMsg(91122), MessageBoxButton.OK, MessageBoxImage.Exclamation)
' Else
' Dim sMachGrpName As String = String.Empty
' EgtGetMachGroupName(nMachGrpId, sMachGrpName)
' ' "Attenzione" "Pezzo non selezionabile perchè appartenente a gruppo di lavoro non corrente :" ...
' MessageBox.Show(Me, EgtMsg(91607) & " " & sMachGrpName, EgtMsg(91122), MessageBoxButton.OK, MessageBoxImage.Exclamation)
' End If
' End If
'End If
'EgtSetCurrentContext(VeinMatchingScene.GetCtx())
' Se selezione riuscita, la eseguo anche in VME
' WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
' WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
' WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
' WARNING WARNING WARNING WARNING WARNING WARNING ' questo controllo è stato tolto per poter selezionare gli oggetti importati nel vme e quindi non presenti nel nesting
'If bSelected Then
PartSolidIdToSel.SelectPart()
'End If
' Se deselezione da eseguire
ElseIf m_nIdToDesel <> GDB_ID.NULL Then
' disattivo i pulsanti che eseguono azioni sul pezzo
DisableActionButtons()
m_nIdPart = -1
'deseleziono
Dim PartSolidIdToDesel As PartSolidM = GetPartSolid(m_nIdToDesel)
If IsNothing(PartSolidIdToDesel) Then
' selezione di un Part che non ha un SOLID associato
EgtDeselectObj(m_nIdToDesel)
Return
End If
m_nIdToDesel = PartSolidIdToDesel.PartId
'' Eseguo la deselezione in Nesting
'Dim bDeselected As Boolean = False
'Dim nOriId As Integer = GDB_ID.NULL
'EgtGetInfo(m_nIdToDesel, KEY_ORI_ID, nOriId)
'If EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx()) AndAlso EgtExistsObj(nOriId) Then
' If (OmagOFFICEMap.refNestingTabVM.DeselectPart(nOriId, False)) Then
' bDeselected = True
' End If
'End If
'EgtSetCurrentContext(VeinMatchingScene.GetCtx())
'' Se deselezione riuscita, la eseguo anche in VME
'' WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
'' WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
'' WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
'' WARNING WARNING WARNING WARNING WARNING WARNING
'If bDeselected Then
PartSolidIdToDesel.DeselectPart()
'End If
End If
End If
' Reset e salvataggio
m_nIdToSel = GDB_ID.NULL
m_nIdToDesel = GDB_ID.NULL
' salvo la trasformazione
If m_bDrag Or m_bRotate Then
If m_nIdPart = GDB_ID.NULL Then Return
Dim ptCurr As Point3d
EgtUnProjectPoint(e.Location, ptCurr)
Dim PartSolidSel As PartSolidM = GetPartSolid(m_nIdPart)
If IsNothing(PartSolidSel) Then Return
If Not m_bRotate Then
Dim vtDir As Vector3d = ptCurr - m_ptBeforeTrasf
'If m_dCorrection > EPS_SMALL Then
' vtDir -= LastTempTransf().m_vtDir * m_dCorrection
'End If
' proietto il vettore di spostamento sul versore della terna che stavo usando
vtDir = PartSolidSel.vtDrag * (PartSolidSel.vtDrag * vtDir)
If EgtLuaSetGlobIntVar("ASS.nTypeTrf", 0) Then AssLog("ASS.nTypeTrf = 0 ")
If EgtLuaSetGlobIntVar("ASS.nPartId", m_nIdPart) Then AssLog("ASS.nPartId = " & m_nIdPart.ToString)
If EgtLuaSetGlobVectorVar("ASS.vtMove", vtDir) Then AssLog("ASS.vtMove = {" & vtDir.ToString & "}")
If EgtLuaCallFunction("ASS.AddEvent") Then AssLog("ASS.AddEvent()")
EgtLuaSetGlobIntVar("ASS.nTypeTrf", -1)
Else
m_ptCen = PartSolidSel.Center()
Dim vtPrev As Vector3d = m_ptBeforeTrasf - m_ptCen
Dim vtCurr As Vector3d = ptCurr - m_ptCen
Dim dAngRotDeg As Double = Math.Atan2(Vector3d.CrossXY(vtPrev, vtCurr), Vector3d.ScalarXY(vtPrev, vtCurr)) * 180.0 / Math.PI
'If m_dCorrection > EPS_SMALL Then
' dAngRotDeg -= LastTempTransf().m_dAngOrId * m_dCorrection
'End If
If EgtLuaSetGlobIntVar("ASS.nTypeTrf", 1) Then AssLog("ASS.nTypeTrf = 1 ")
If EgtLuaSetGlobIntVar("ASS.nPartId", m_nIdPart) Then AssLog("ASS.nPartId = " & m_nIdPart.ToString)
If EgtLuaSetGlobPointVar("ASS.ptAx", m_ptCen) Then AssLog("ASS.vtAx = {" & m_ptCen.ToString & "}")
If EgtLuaSetGlobVectorVar("ASS.vtAx", PartSolidSel.vtDrag) Then AssLog("ASS.vtAx = " & PartSolidSel.vtDrag.ToString)
If EgtLuaSetGlobNumVar("ASS.dAng", dAngRotDeg) Then AssLog("ASS.dAng = " & dAngRotDeg.ToString)
If Not EgtLuaCallFunction("ASS.AddEvent") Then
AssLog("fallita la chiamata a ASS.AddEvent")
Else
AssLog("ASS.AddEvent()")
End If
EgtLuaSetGlobIntVar("ASS.nTypeTrf", -1)
End If
' fattore di correzione dell'ultima operazione
m_dCorrection = 0
' aumento il contatore della storia
nTime += 1
SolidManagerM.ManageUndoRedo()
End If
m_bDrag = False
EgtDraw()
End Sub
Private Sub ShiftKey_Down(sender As Object, e As System.Windows.Forms.KeyEventArgs)
If e.Shift Then
Dim TgBtn As SceneBtn = Map.refSceneButtonVM.GetButton("Pair")
If TypeOf (TgBtn) Is _ToggleButton And DirectCast(TgBtn, _ToggleButton).IsChecked Then
m_SelType = GDB_TY.SRF_FRGN
End If
Return
End If
End Sub
Private Sub ShiftKey_Up(sender As Object, e As System.Windows.Forms.KeyEventArgs)
If Not e.Shift Then
Dim TgBtn As SceneBtn = Map.refSceneButtonVM.GetButton("Pair")
If TypeOf (TgBtn) Is _ToggleButton And DirectCast(TgBtn, _ToggleButton).IsChecked Then
m_SelType = GDB_TY.CRV_LINE
End If
Return
End If
End Sub
#End Region ' Events
End Class