282 lines
12 KiB
VB.net
282 lines
12 KiB
VB.net
Imports EgtUILib
|
|
Imports System.Collections.ObjectModel
|
|
Imports EgtWPFLib5
|
|
|
|
Module SolidManagerM
|
|
|
|
Public m_PartSolidList As New ObservableCollection(Of PartSolidM) '' lista dei PartSolid
|
|
Public m_nVeinCtx As Integer = DirectCast(Map.refSceneHostV.DataContext, SceneHostVM).MainScene.GetCtx()
|
|
Public Function GetPartSolid(nId As Integer) As PartSolidM
|
|
' se la lista non esiste la creo
|
|
If m_PartSolidList.Count = 0 Then
|
|
CreatePartSolid()
|
|
End If
|
|
' se l'id è negativo allora sto applicando un disaccoppiamento e mi basta rendere l'id positivo
|
|
If nId < 0 Then nId *= -1
|
|
' cerco nella lista dei part quello con id uguale a nId, se non lo trovo allora nId era riferito ad un Part Solid
|
|
Dim PartSolidId As PartSolidM = m_PartSolidList.FirstOrDefault(Function(x) x.PartId = nId)
|
|
If IsNothing(PartSolidId) Then Return m_PartSolidList.FirstOrDefault(Function(x) x.PartSolidId = nId)
|
|
Return PartSolidId
|
|
End Function
|
|
|
|
Public Sub CreatePartSolid()
|
|
EgtSetCurrentContext(m_nVeinCtx)
|
|
'inizializzo la lista dei PartSolid
|
|
m_PartSolidList.Clear()
|
|
Dim nPart As Integer = EgtGetFirstPart()
|
|
While nPart <> GDB_ID.NULL
|
|
Dim sName As String = String.Empty
|
|
EgtGetName(nPart, sName)
|
|
If sName <> "SOLID" And sName <> "Terna" Then
|
|
' controllo che sia un Part di un pezzo e che quindi abbia un layer che si chiama "OutLoop"
|
|
If EgtGetFirstNameInGroup(nPart, "OutLoop") = GDB_ID.NULL Then
|
|
nPart = EgtGetNextPart(nPart)
|
|
Continue While
|
|
End If
|
|
Dim Part As New PartSolidM(nPart)
|
|
m_PartSolidList.Add(Part)
|
|
End If
|
|
nPart = EgtGetNextPart(nPart)
|
|
End While
|
|
'' Aggiorno la TreeView
|
|
'UpdateTreeViewPart()
|
|
End Sub
|
|
|
|
'Public Sub AddPartSolid(NewPartSolid As PartSolidM)
|
|
' m_PartSolidList.Add(NewPartSolid)
|
|
'End Sub
|
|
|
|
Public Sub UpdatePairInfoSingle(nId As Integer, sPaired As String, nGroup As Integer)
|
|
EgtLuaSetGlobIntVar("ASS.nPartId", nId)
|
|
AssLog("ASS.nPartId = " & nId.ToString)
|
|
EgtLuaSetGlobStringVar("ASS.sPairList", sPaired)
|
|
AssLog("ASS.sPairList = " & sPaired)
|
|
EgtLuaSetGlobIntVar("ASS.nGroup", nGroup)
|
|
AssLog("ASS.nGroup = " & nGroup.ToString)
|
|
If Not EgtLuaCallFunction("ASS.UpdatePairInfoSingle") Then
|
|
AssLog("fallita la chiamata a ASS.UpdatePairInfoSingle")
|
|
Dim sErr As String = ""
|
|
EgtLuaGetGlobStringVar("ASS.ERR", sErr)
|
|
EgtOutLog("Matching error: ASS.ERR=" & sErr)
|
|
Return
|
|
End If
|
|
AssLog("ASS.UpdatePairInfoSingle()")
|
|
End Sub
|
|
|
|
Public Function PairList(nId As Integer) As List(Of Integer)
|
|
Dim sPaired = ""
|
|
EgtGetInfo(nId, "Paired", sPaired)
|
|
Dim lPair As New List(Of Integer)
|
|
If sPaired <> String.Empty Then
|
|
Dim vPaired As Array = sPaired.Split(CChar(","))
|
|
For Each nPaired As Integer In vPaired
|
|
lPair.Add(nPaired)
|
|
Next
|
|
End If
|
|
Return lPair
|
|
End Function
|
|
|
|
Public Sub Unpair(nId As Integer)
|
|
If nId = -1 Then Return
|
|
If EgtLuaSetGlobIntVar("ASS.nPartId", nId) Then AssLog("ASS.nPartId = " & nId.ToString)
|
|
If Not EgtLuaCallFunction("ASS.Unpair") Then
|
|
AssLog("fallita la chiamata a ASS.Unpair")
|
|
Return
|
|
End If
|
|
AssLog("ASS.Unpair()")
|
|
Dim PartSolidSel As PartSolidM = GetPartSolid(nId)
|
|
If IsNothing(PartSolidSel) Then Return
|
|
SceneCmd.DeselectAll()
|
|
PartSolidSel.SelectPart()
|
|
Map.refSceneHostV.m_nIdPart = nId
|
|
'UpdateTreeViewPart()
|
|
EgtDraw()
|
|
End Sub
|
|
|
|
Public Sub Move(nId As Integer, vtMove As Vector3d, Optional bSaveHist As Boolean = True, Optional bTempTrf As Boolean = False)
|
|
If nId = GDB_ID.NULL Then Return
|
|
If EgtLuaSetGlobIntVar("ASS.nPartId", nId) Then AssLog("ASS.nPartId = " & nId.ToString)
|
|
If EgtLuaSetGlobVectorVar("ASS.vtMove", vtMove) Then AssLog("ASS.vtMove = {" & vtMove.ToString & "}")
|
|
If EgtLuaSetGlobBoolVar("ASS.bSaveHist", bSaveHist) Then AssLog("ASS.bSaveHist = " & bSaveHist.ToString)
|
|
If EgtLuaSetGlobBoolVar("ASS.bSaveTemp", bTempTrf) Then AssLog("ASS.bSaveTemp = " & bTempTrf.ToString)
|
|
If Not EgtLuaCallFunction("ASS.Move") Then
|
|
AssLog("fallita la chiamata a ASS.Move")
|
|
Dim sErr As String = ""
|
|
EgtLuaGetGlobStringVar("ASS.ERR", sErr)
|
|
EgtOutLog("Matching error: ASS.ERR=" & sErr)
|
|
Return
|
|
End If
|
|
AssLog("ASS.Move()")
|
|
End Sub
|
|
|
|
Public Sub MoveSingle(nId As Integer, vtMove As Vector3d, Optional bSaveHist As Boolean = True, Optional bTempTrf As Boolean = False)
|
|
EgtLuaSetGlobIntVar("ASS.nPartId", nId)
|
|
AssLog("ASS.nPartId = " & nId.ToString)
|
|
EgtLuaSetGlobVectorVar("ASS.vtMove", vtMove)
|
|
AssLog("ASS.vtMove = {" & vtMove.ToString & "}")
|
|
EgtLuaSetGlobBoolVar("ASS.bSaveHist", bSaveHist)
|
|
AssLog("ASS.bSaveHist = " & bSaveHist.ToString)
|
|
EgtLuaSetGlobBoolVar("ASS.bSaveTemp", bTempTrf)
|
|
AssLog("ASS.bSaveTemp = " & bTempTrf.ToString)
|
|
If Not EgtLuaCallFunction("ASS.MoveSingle") Then
|
|
AssLog("fallita la chiamata a ASS.MoveSingle")
|
|
Dim sErr As String = ""
|
|
EgtLuaGetGlobStringVar("ASS.ERR", sErr)
|
|
EgtOutLog("Matching error: ASS.ERR=" & sErr)
|
|
Return
|
|
End If
|
|
AssLog("ASS.MoveSingle()")
|
|
End Sub
|
|
|
|
Public Sub Rotate(nId As Integer, ptAx As Point3d, vtAx As Vector3d, dAng As Double, Optional bSaveHist As Boolean = True, Optional bTempTrf As Boolean = False)
|
|
If nId = GDB_ID.NULL Then Return
|
|
Dim PartSolidSel As PartSolidM = GetPartSolid(nId)
|
|
If IsNothing(PartSolidSel) Then Return
|
|
' ruoto il part e i suoi accoppiati
|
|
EgtLuaSetGlobIntVar("ASS.nPartId", nId)
|
|
AssLog("ASS.nPartId = " & nId.ToString)
|
|
EgtLuaSetGlobPointVar("ASS.ptAx", ptAx)
|
|
AssLog("ASS.ptAx = {" & ptAx.ToString & "}")
|
|
EgtLuaSetGlobVectorVar("ASS.vtAx", vtAx)
|
|
AssLog("ASS.vtAx = {" & vtAx.ToString & "}")
|
|
EgtLuaSetGlobNumVar("ASS.dAng", dAng)
|
|
AssLog("ASS.dAng = " & dAng.ToString)
|
|
EgtLuaSetGlobBoolVar("ASS.bSaveHist", bSaveHist)
|
|
AssLog("ASS.bSaveHist = " & bSaveHist.ToString)
|
|
EgtLuaSetGlobBoolVar("ASS.bSaveTemp", bTempTrf)
|
|
AssLog("ASS.bSaveTemp = " & bTempTrf.ToString)
|
|
If Not EgtLuaCallFunction("ASS.Rotate") Then
|
|
AssLog("fallita la chiamata a ASS.Rotate")
|
|
Dim sErr As String = ""
|
|
EgtLuaGetGlobStringVar("ASS.ERR", sErr)
|
|
EgtOutLog("Matching error: ASS.ERR=" & sErr)
|
|
Return
|
|
End If
|
|
AssLog("ASS.Rotate()")
|
|
End Sub
|
|
|
|
Public Sub RotateSingle(nId As Integer, ptAx As Point3d, vtAx As Vector3d, dAng As Double, Optional bSaveHist As Boolean = True, Optional bTempTrf As Boolean = False)
|
|
If nId = GDB_ID.NULL Then Return
|
|
Dim PartSolidSel As PartSolidM = GetPartSolid(nId)
|
|
EgtLuaSetGlobIntVar("ASS.nPartId", nId)
|
|
AssLog("ASS.nPartId = " & nId.ToString)
|
|
EgtLuaSetGlobPointVar("ASS.ptAx", ptAx)
|
|
AssLog("ASS.ptAx = {" & ptAx.ToString & "}")
|
|
EgtLuaSetGlobVectorVar("ASS.vtAx", vtAx)
|
|
AssLog("ASS.vtAx = {" & vtAx.ToString & "}")
|
|
EgtLuaSetGlobNumVar("ASS.dAng", dAng)
|
|
AssLog("ASS.dAng = " & dAng.ToString)
|
|
EgtLuaSetGlobBoolVar("ASS.bSaveHist", bSaveHist)
|
|
AssLog("ASS.bSaveHist = " & bSaveHist.ToString)
|
|
EgtLuaSetGlobBoolVar("ASS.bSaveTemp", bTempTrf)
|
|
AssLog("ASS.bSaveTemp = " & bTempTrf.ToString)
|
|
If Not EgtLuaCallFunction("ASS.RotateSingle") Then
|
|
AssLog("fallita la chiamata a ASS.RotateSingle")
|
|
Dim sErr As String = ""
|
|
EgtLuaGetGlobStringVar("ASS.ERR", sErr)
|
|
EgtOutLog("Matching error: ASS.ERR=" & sErr)
|
|
Return
|
|
End If
|
|
AssLog("ASS.RotateSingle()")
|
|
End Sub
|
|
|
|
Public Function CalcInters(nPartId As Integer, Optional bKeepInters As Boolean = False) As ObservableCollection(Of PartSolidM)
|
|
'restituisce una lista dei part con cui c'è un'intersezione
|
|
' di default la lista contiene sempre il part corrente
|
|
EgtSetCurrentContext(m_nVeinCtx)
|
|
Dim PartSolidCurr As PartSolidM = GetPartSolid(nPartId)
|
|
Dim vInters As New ObservableCollection(Of PartSolidM)
|
|
If IsNothing(PartSolidCurr) Then Return vInters
|
|
Dim nIdTempL = EgtGetFirstNameInGroup(PartSolidCurr.PartSolidId, "Temp")
|
|
vInters.Add(PartSolidCurr)
|
|
Dim nIdSolid As Integer = PartSolidCurr.SolidId
|
|
Dim lPair As List(Of Integer) = PairList(nPartId)
|
|
For Each PartSolidSel As PartSolidM In m_PartSolidList
|
|
' se sto guardando lo stesso solido vado oltre
|
|
If PartSolidSel.SolidId = nIdSolid Then Continue For
|
|
' calcolo le intersezioni solo con part con cui non sono già accoppiato
|
|
If lPair.FirstOrDefault(Function(x) x = PartSolidSel.PartId) <> 0 Then Continue For
|
|
' prima di fare le intersezioni tra mesh verifico che le bbox abbiano un'intersezione
|
|
If Not PartSolidCurr.bbSolid.Overlaps(PartSolidSel.bbSolid) Then Continue For
|
|
' ho intersezione tra le bbox quindi proseguo con i conti
|
|
Dim nIdSurfToCheck As Integer = PartSolidSel.SolidId
|
|
If nIdSurfToCheck = -1 Then Continue For
|
|
Dim nIdCopy As Integer = EgtCopy(nIdSolid, nIdTempL)
|
|
EgtSurfTmIntersect(nIdCopy, nIdSurfToCheck)
|
|
If EgtSurfTmFacetCount(nIdCopy) <> 0 Then
|
|
EgtSetColor(nIdCopy, New Color3d(255, 0, 0))
|
|
vInters.Add(PartSolidSel)
|
|
Else
|
|
EgtErase(nIdCopy)
|
|
End If
|
|
Next
|
|
|
|
If Not bKeepInters Then
|
|
Dim nIdInters As Integer = EgtGetFirstInGroup(nIdTempL)
|
|
While nIdInters <> GDB_ID.NULL
|
|
Dim nIdNext As Integer = EgtGetNext(nIdInters)
|
|
EgtErase(nIdInters)
|
|
nIdInters = nIdNext
|
|
End While
|
|
End If
|
|
|
|
Return vInters
|
|
End Function
|
|
|
|
Public Function CalcIntersAmong(ByRef vInters As ObservableCollection(Of PartSolidM)) As Integer
|
|
' calcolo le intersezioni tra il primo oggetto nel vettore e tutti i successivi
|
|
Dim nInters As Integer = 0
|
|
EgtSetCurrentContext(m_nVeinCtx)
|
|
Dim PartSolidMain As PartSolidM = vInters.Item(0)
|
|
If IsNothing(PartSolidMain) Then Return nInters
|
|
Dim nIdTempL = EgtGetFirstNameInGroup(PartSolidMain.PartSolidId, "Temp")
|
|
Dim nIdSolid As Integer = PartSolidMain.SolidId
|
|
For Each PartSolidSel As PartSolidM In vInters
|
|
' se sto guardando lo stesso solido vado oltre
|
|
If PartSolidSel.SolidId = nIdSolid Then Continue For
|
|
Dim nIdSurfToCheck As Integer = PartSolidSel.SolidId
|
|
If nIdSurfToCheck = -1 Then Continue For
|
|
Dim nIdCopy As Integer = EgtCopy(nIdSolid, nIdTempL)
|
|
EgtSurfTmIntersect(nIdCopy, nIdSurfToCheck)
|
|
If EgtSurfTmFacetCount(nIdCopy) <> 0 Then nInters += 1
|
|
EgtErase(nIdCopy)
|
|
Next
|
|
Return nInters
|
|
End Function
|
|
|
|
Public Function MaxApproach(PartSolidSel As PartSolidM, ByRef dCorr As Double, vInters As ObservableCollection(Of PartSolidM)) As Boolean
|
|
Return True
|
|
|
|
'Dim nItMax As Integer = 20
|
|
'Dim nItCount As Integer = 0
|
|
'' identifico a qualche delle ultime trasformazioni ho iniziato ad avere un'intersezione
|
|
'' scorro e annullo le ultime trasformazioni fino a che non ho più intersezioni e della trasformazione critica tengo solo la parte che mi manda in battuta
|
|
'UndoTempTrasf()
|
|
'Dim nRevert As Integer = 0
|
|
'Dim nTempTime = GetTempTime()
|
|
'While CalcIntersAmong(vInters) > 0 And nRevert < nTempTime
|
|
' nRevert += 1
|
|
' Dim trf As Transformation = GetTempTansfFromLast(nRevert)
|
|
' ApplyTransf(PartSolidSel.PartId, -trf, False)
|
|
'End While
|
|
'ApplyTransf(PartSolidSel.PartId, GetTempTansfFromLast(nRevert), False)
|
|
'Dim trfStep As Transformation = (1.0 / nItMax) * GetTempTansfFromLast(nRevert)
|
|
|
|
'While vInters.Count() > 1 And nItCount < nItMax
|
|
' ' torno indietro progressivamente
|
|
' ApplyTransf(PartSolidSel.PartId, -trfStep, False)
|
|
' ' ricalcolo le intersezioni
|
|
' vInters = CalcInters(PartSolidSel.PartSolidId)
|
|
' nItCount += 1
|
|
'End While
|
|
'If vInters.Count() = 1 Then
|
|
' dCorr = nItCount / nItMax
|
|
' Return True
|
|
'Else
|
|
' dCorr = 1
|
|
' Return False
|
|
'End If
|
|
End Function
|
|
|
|
End Module
|