745 lines
35 KiB
VB.net
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
|