Files
egtstone3d/Utility/SolidManagerM.vb
T
2025-01-02 16:46:03 +01:00

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