diff --git a/CompoLib/ParametricCompoVM.vb b/CompoLib/ParametricCompoVM.vb index 57206b7..6eb347b 100644 --- a/CompoLib/ParametricCompoVM.vb +++ b/CompoLib/ParametricCompoVM.vb @@ -11,6 +11,16 @@ Public Class ParametricCompoVM Friend ReadOnly bFileExsist As Boolean = False Private m_nVeinCtx As Integer + Private m_nPartId As Integer = GDB_ID.NULL + Public Property nPartId As Integer + Get + Return m_nPartId + End Get + Set(value As Integer) + m_nPartId = value + End Set + End Property + #End Region ' Fields & Properties #Region "CONSTRUCTOR" @@ -88,6 +98,8 @@ Public Class ParametricCompoVM EgtLuaSetGlobNumVar("TOOL.nId", nPart) EgtLuaCallFunction("TOOL.RenameNewPart") EgtLuaCallFunction("TOOL.ClearVariables") + + nPartId = EgtGetLastPart() End Sub Public Overrides Sub Conferma() @@ -98,7 +110,8 @@ Public Class ParametricCompoVM End Sub Public Overrides Sub Annulla() - EgtErase(EgtGetLastPart()) + Dim PartSolidSel As PartSolidM = GetPartSolid(nPartId) + SolidManagerM.Delete(nPartId) EgtDraw() Close() End Sub @@ -111,6 +124,10 @@ Public Class ParametricCompoVM Private Sub Close() Map.refSceneButtonVM.RemoveUC(Map.refSceneButtonVM.m_ParametricCompoUC) + SolidManagerM.RefreshPartSolid(nPartId) + ' debug + EgtSaveFile("D:\\Temp\\marmo\\Vein3D\\template.nge", 2) + ' debug End Sub Private Function NameTypeValueFromLua(nInd As Integer, ByRef Param As GenericParam) As Boolean diff --git a/Constants/ConstEgtStone3D.vb b/Constants/ConstEgtStone3D.vb index 8651622..653cb99 100644 --- a/Constants/ConstEgtStone3D.vb +++ b/Constants/ConstEgtStone3D.vb @@ -11,6 +11,7 @@ Public Const EGT_SEL_TYPE As String = "SelType" Public Const EGT_IMPORT_LOOP As String = "ImportLoop" Public Const EGT_CREATE_SOLID_LOOP As String = "CreateSolidFromLoop" + Public Const EGT_CREATE_ALL_SOLIDS As String = "CreateAllSolids" Public Const EGT_MOVE As String = "Move" Public Const EGT_ADD_ALZ As String = "AddSplashTop" Public Const EGT_ADD_FRO As String = "AddWaterfall" diff --git a/SceneButton/SceneButtonVM.vb b/SceneButton/SceneButtonVM.vb index 9465bde..24ba526 100644 --- a/SceneButton/SceneButtonVM.vb +++ b/SceneButton/SceneButtonVM.vb @@ -483,6 +483,7 @@ Module SceneCmd Map.refSceneButtonVM.m_ParametricCompoUC.DataContext = LocalParametricCompo Map.refSceneButtonVM.LoadUC(Map.refSceneButtonVM.m_ParametricCompoUC) bNewParametricExsists = True + SolidManagerM.CreatePartSolid() End If End If Return bNewParametricExsists @@ -521,6 +522,8 @@ Module SceneCmd ImportLoop() Case EGT_CREATE_SOLID_LOOP SolidManagerM.CreateSolidFromLoops(Map.refSceneHostVM.m_nIdPart) + Case EGT_CREATE_ALL_SOLIDS + SolidManagerM.CreateAllSolids() Case EGT_ADD_PANEL If IsNothing(Map.refSceneButtonVM.m_NewPanelUC) Then Map.refSceneButtonVM.m_NewPanelUC = New SceneUserControlV Map.refSceneButtonVM.m_NewPanelUC.DataContext = New NewPanelVM() diff --git a/Utility/SolidManagerM.vb b/Utility/SolidManagerM.vb index 6ceabc4..e2ec2a2 100644 --- a/Utility/SolidManagerM.vb +++ b/Utility/SolidManagerM.vb @@ -13,6 +13,13 @@ Module SolidManagerM #Region "METHODS" + Public Function ExistsPartSolid(nId As Integer) As PartSolidM + ' cerco nella lista dei part quello con id uguale a nId, se non lo trovo allora nId era riferito ad un Part Solid + Dim PartSolid As PartSolidM = m_PartSolidList.FirstOrDefault(Function(x) x.PartId = nId) + If IsNothing(PartSolid) Then PartSolid = m_PartSolidList.FirstOrDefault(Function(x) x.PartSolidId = nId) + Return PartSolid + End Function + Public Function GetPartSolid(nId As Integer) As PartSolidM ' se la lista non esiste la creo If m_PartSolidList.Count = 0 Then @@ -20,9 +27,8 @@ Module SolidManagerM 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 PartSolid As PartSolidM = m_PartSolidList.FirstOrDefault(Function(x) x.PartId = nId) - If IsNothing(PartSolid) Then PartSolid = m_PartSolidList.FirstOrDefault(Function(x) x.PartSolidId = nId) + ' cerco se è già presente nella lista il corrispondete PartSolid + Dim PartSolid As PartSolidM = ExistsPartSolid(nId) ' se non l'ho trovato allora lo creo If IsNothing(PartSolid) Then AddPartSolid(nId, PartSolid) @@ -39,12 +45,15 @@ Module SolidManagerM End Function Public Sub RefreshPartSolid(nPartId As Integer) - Dim PartSolidSel As PartSolidM = GetPartSolid(nPartId) - ' rimuovo il part solid associato a questo part - PartSolidSel.DeselectPart() - m_PartSolidList.Remove(PartSolidSel) + Dim PartSolidSel As PartSolidM = ExistsPartSolid(nPartId) + If Not IsNothing(PartSolidSel) Then + ' rimuovo il part solid associato a questo part + PartSolidSel.DeselectPart() + m_PartSolidList.Remove(PartSolidSel) + End If ' lo ricreo - AddPartSolid(nPartId) + AddPartSolid(nPartId, PartSolidSel) + PartSolidSel.DeselectPart() End Sub Public Sub ClearPartSolidList() @@ -90,13 +99,18 @@ Module SolidManagerM nInLay = EgtGetNextName(nInLay, "InLoop") End While - ' creo la superficie piana - Dim nRegLay As Integer = EgtCreateGroup(nPart) - EgtSetName(nRegLay, "Region") - EgtCreateSurfFlatRegion(nRegLay, nLoops.ToArray()) + ' creo la superficie piana, se non è già presente + Dim nRegLay As Integer = EgtGetFirstNameInGroup(nPart, "Region") + If nRegLay = GDB_ID.NULL Then + nRegLay = EgtCreateGroup(nPart) + EgtSetName(nRegLay, "Region") + EgtCreateSurfFlatRegion(nRegLay, nLoops.ToArray()) + End If ' splitto le compo nei lati singoli For Each nLoopId In nLoops - EgtLuaExecLine("TOOL.ExplodeAndNameEdges(" & nLoopId.ToString & "," & "false" & ")") + If EgtGetType(nLoopId) = GDB_TY.CRV_COMPO Then + EgtLuaExecLine("TOOL.ExplodeAndNameEdges(" & nLoopId.ToString & "," & "false" & ")") + End If Next ' Assegno valori ai parametri per lua (appartengono alla tabella SLD) @@ -114,6 +128,31 @@ Module SolidManagerM End If End Sub + Public Sub CreateAllSolids() + ' controllo se tutti i Part nel .vme hanno un corrispettiveo nella lista dei PartSolid, sennò la aggiorno + EgtSetCurrentContext(m_nVeinCtx) + Dim nPart As Integer = EgtGetFirstPart() + + Dim dThick As Double = 20 + EgtSetCurrentContext(m_nVeinCtx) + Dim IdFP As Integer = EgtGetFirstPart() + While IdFP <> GDB_ID.NULL + Dim bImport As Boolean = False + EgtGetInfo(IdFP, "Import", bImport) + Dim sName As String = String.Empty + EgtGetName(IdFP, sName) + ' se il part non è un solido o una terna, creo il solido corrispondente, se non è già presente + If Not bImport And sName <> "SOLID" And sName <> "Terna" Then + CreateSolidFromLoops(IdFP) + End If + IdFP = EgtGetNextPart(IdFP) + End While + + ' aggiorno la lista dei part solid + CreatePartSolid() + EgtDraw() + End Sub + Public Sub UpdatePairInfo(nId1 As Integer, Optional nId2 As Integer = GDB_ID.NULL) If EgtLuaSetGlobIntVar("ASS.nPartId", nId1) Then AssLog("ASS.nPartId = " & nId1.ToString) If EgtLuaSetGlobIntVar("ASS.nPartToPair", nId2) Then AssLog("ASS.nPartToPair = " & nId2.ToString)