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