Files
omagoffice/CompoWindow/CompoWindowVM.vb
T
Emmanuele Sassi 4c679fbd48 OmagOFFICE :
- Migliorato AboutBox.
- Miglioramenti per compatibilità con nuova versione WPFLib5.
2017-11-25 16:55:39 +00:00

372 lines
15 KiB
VB.net

Imports EgtUILib
Imports EgtWPFLib5
Public Class CompoWindowVM
Inherits VMBase
#Region "FIELDS & PROPERTIES"
Enum CompoPageOpt As Integer
LIST
PARAM
End Enum
Friend Const NUM_VAR As Integer = 10
Private Const LUA_CMP_VARS As String = "CMP"
Private Const LUA_CMP_DRAW As String = "CMP_Draw"
Private Const INFO_VAR As String = "Var"
Friend Const INFO_CMP As String = "CMP"
Private Const INFO_ID As String = "ID"
Friend Const LUA_CMP_INDEX As String = LUA_CMP_VARS & ".Ind"
Friend Const LUA_CMP_INTERNAL As String = LUA_CMP_VARS & ".Int"
Friend Const LUA_REMOVEHOLE As String = "RemoveHole"
Friend Const LUA_CMP_WITHINT As String = LUA_CMP_VARS & ".WithInt"
Friend Event m_CloseWindow(bDialogResult As Boolean)
Friend m_SelCompoFamily As CompoItem = Nothing
Friend m_SelCompo As CompoItem = Nothing
Friend m_SelInternalCompo As CompoItem = Nothing
Private m_sCompoDir As String = String.Empty
Friend m_bDrawOk As Boolean = False
Private m_CompoPage As CompoPageOpt
Public Property CompoPage As CompoPageOpt
Get
Return m_CompoPage
End Get
Set(value As CompoPageOpt)
m_CompoPage = value
If value = CompoPageOpt.LIST Then
CompoWindowMap.refCompoListPageVM.InitCompoListPage()
Else
CompoWindowMap.refCompoParamPageVM.InitCompoParamPage()
End If
NotifyPropertyChanged("CompoPageControl")
End Set
End Property
Private m_CompoListPageV As CompoListPageV
Private m_CompoParamPageV As CompoParamPageV
Public ReadOnly Property CompoPageControl As ContentControl
Get
If m_CompoPage = CompoPageOpt.LIST Then
Return m_CompoListPageV
Else
Return m_CompoParamPageV
End If
End Get
End Property
Private m_CompoManagerV As CompoManagerV
Public ReadOnly Property CompoManagerV As CompoManagerV
Get
Return m_CompoManagerV
End Get
End Property
#Region "Messages"
Public ReadOnly Property TitleMsg As String
Get
Return EgtMsg(MSG_DRAWPAGEUC + 5) ' Disegno Parametrico
End Get
End Property
#End Region ' Messages
#End Region ' FIELDS & PROPERTIES
#Region "CONSTRUCTOR"
Sub New()
' Avvio l'inizializzazione della mappa passandogli il riferimento al CompoWindowVM
CompoWindowMap.BeginInit(Me)
' Creo pagina CompoList
m_CompoListPageV = New CompoListPageV
m_CompoListPageV.DataContext = New CompoListPageVM
' Creo pagina CompoParam
m_CompoParamPageV = New CompoParamPageV
m_CompoParamPageV.DataContext = New CompoParamPageVM
' creo pagina CompoManager
m_CompoManagerV = New CompoManagerV
m_CompoManagerV.DataContext = New CompoManagerVM
' Inizializzo e visualizzo per default la CompoListPage
CompoWindowMap.refCompoListPageVM.InitCompoListPage()
CompoPage = CompoPageOpt.LIST
' Recupero path cartella che contiene i componenti
GetMainPrivateProfileString("Compo", "CompoDir", "", m_sCompoDir)
End Sub
#End Region ' CONSTRUCTOR
#Region "METHODS"
Friend Function MakePreview(ByRef sMsg As String) As Boolean
If Not EgtLuaExecLine(LUA_CMP_DRAW & "(true)") Then
sMsg = "Error in component execution"
m_bDrawOk = False
Else
EgtLuaGetGlobStringVar(LUA_CMP_VARS & ".MSG", sMsg)
Dim nErr As Integer = 0
EgtLuaGetGlobIntVar(LUA_CMP_VARS & ".ERR", nErr)
m_bDrawOk = (nErr = 0)
End If
Return m_bDrawOk
End Function
Friend Function ExecCompoFile() As Boolean
Dim sPath As String = String.Empty
' Verifico se componente interno o normale e costruisco path completa del componente
If IsNothing(m_SelInternalCompo) Then
sPath = m_sCompoDir & "\" & m_SelCompo.LuaPath
Else
sPath = m_sCompoDir & "\" & m_SelInternalCompo.LuaPath
End If
' Carico il file
Return EgtLuaExecFile(sPath)
End Function
Friend Sub UpdateView()
' verifico ci sia un componente corrente
If IsNothing(m_SelCompo) Then
Return
End If
' aggiorno le variabili dalla griglia
CompoWindowMap.refCompoParamPageVM.UpdateVariables()
' ricalcolo il disegno
Dim sMsg As String = String.Empty
MakePreview(sMsg)
CompoWindowMap.refCompoParamPageVM.SetOutputMessage(sMsg, If(m_bDrawOk, MSG_TYPE.INFO, MSG_TYPE.ERROR_))
' aggiorno visualizzazione
EgtSetView(VT.TOP, False)
EgtZoom(ZM.ALL)
End Sub
Friend Function MakeInsert(nNbr As Integer, sName As String) As Boolean
' ricarico componente corrente
ExecCompoFile()
' aggiorno variabili
CompoWindowMap.refCompoParamPageVM.UpdateVariables()
' Recupero flag per inserimento diretto in grezzo (altrimenti in parcheggio)
Dim bDirect As Boolean = (GetMainPrivateProfileInt(S_NEST, K_DIRECT, 0) <> 0)
' elimino eventuali precedenti pezzi vuoti
EgtEraseEmptyParts()
' eseguo inserimento
For i As Integer = 1 To nNbr
' Inserisco il componente
If Not EgtLuaExecLine(LUA_CMP_DRAW & "(false)") Then
Dim sErr As String = String.Empty
EgtLuaGetLastError(sErr)
EgtOutLog(sErr)
Exit For
End If
' Ne recupero l'Id
Dim nId2 As Integer = EgtGetLastPart()
' Ne recupero il layer OutLoop
Dim nOutLoopLayer As Integer = EgtGetFirstNameInGroup(nId2, NAME_OUTLOOP)
' Calcolo dimensione ingombro OutLoop
Dim ptMin, ptMax As Point3d
EgtGetBBoxGlob(nOutLoopLayer, GDB_BB.STANDARD, ptMin, ptMax)
Dim dBBoxRad As Double = 0.5 * Point3d.DistXY(ptMin, ptMax)
' Ricavo nome layer con testi inclinazioni
Dim TextLayer As Integer = EgtGetFirstNameInGroup(nId2, SIDE_ANGLE_LAYER)
' Se presente lo svuoto
If TextLayer <> GDB_ID.NULL Then
EgtEmptyGroup(TextLayer)
' altrimenti lo creo
Else
TextLayer = EgtCreateGroup(nId2)
EgtSetName(TextLayer, SIDE_ANGLE_LAYER)
EgtSetColor(TextLayer, New Color3d(0, 0, 0))
End If
' Modifico inclinazione lati
If Not IsNothing(CompoWindowMap.refCompoParamPageVM.m_SideAngleEntityList) Then
For Each Entity In CompoWindowMap.refCompoParamPageVM.m_SideAngleEntityList
Dim CurrSideAngleEntity As SideAngleEntity = DirectCast(Entity, SideAngleEntity)
Dim nCurrEntityName As Integer = EgtGetFirstNameInGroup(nOutLoopLayer, Entity.sEntityName)
If Math.Abs(CurrSideAngleEntity.dSideAngle) > EPS_ANG_SMALL Then
' Scrivo nuovo angolo nelle info
EgtSetInfo(nCurrEntityName, INFO_SIDE_ANGLE, CurrSideAngleEntity.dSideAngle)
' Creo testo con angolo di inclinazione per nesting
Dim sText As String = DoubleToString(CurrSideAngleEntity.dSideAngle, 1) & "°"
SideEntityControlVM.AddTextToLine(sText, TextLayer, nCurrEntityName, 20, dBBoxRad, False)
Else
' Cancello inclinazione nell'apposito campo info
EgtRemoveInfo(nCurrEntityName, INFO_SIDE_ANGLE)
End If
Next
End If
'' Sistemo gocciolatoi
'm_SideAngle.CreateDripGeom(nId2)
' Muovo la regione in Z per evitare problemi in visualizzazione
Dim nRegId = EgtGetFirstNameInGroup(nId2, NAME_REGION)
EgtMove(nRegId, New Vector3d(0, 0, DELTAZ_REG), GDB_RT.GLOB)
' Se definito nome lo inserisco nel testo
If Not String.IsNullOrWhiteSpace(sName) Then
Dim nTextId = EgtGetFirstInGroup(nRegId)
While nTextId <> GDB_ID.NULL
If EgtGetType(nTextId) = GDB_TY.EXT_TEXT Then
Dim sText As String = String.Empty
EgtTextGetContent(nTextId, sText)
Dim sNewText = sName & " " & sText
EgtModifyText(nTextId, sNewText)
Exit While
End If
nTextId = EgtGetNext(nTextId)
End While
End If
' Eventuale testo per indicare il sopra (solo nel caso di rettangolo)
If CompoWindowMap.refCompoManagerVM.TopIsChecked Then
Dim dDimX As Double = ptMax.x - ptMin.x
Dim dDimY As Double = ptMax.y - ptMin.y
Dim dH As Double = Math.Min(0.1 * dDimY, 30)
Dim nText As Integer = EgtCreateTextAdv(nRegId, New Point3d(dDimX / 2, dDimY - 0.6 * dH, 0), 0, "*TOP*", "", 500, False, dH, 1, 0, INS_POS.MC)
EgtSetColor(nText, New Color3d())
End If
' Aggiusto per lavorazioni
AdjustFlatPart(nId2)
' Inserisco in parcheggio
EstCalc.StoreOnePart(nId2, True)
' Aggiungo riferimento e lo inserisco in VeinMatching
VeinMatching.SetRefOnPart(nId2)
VeinMatching.AddPart(nId2, True)
' Se richiesto posizionamento diretto, lo eseguo
If bDirect Then
If EstCalc.InsertOnePart(nId2, CurrentMachine.bAligned, CurrentMachine.bReducedCut) Then
' Eventuale notifica al VeinMatching
VeinMatching.OnInsertPartInRaw(nId2)
End If
End If
Next
Return True
End Function
Friend Function MakeCompoInsert(ByVal nNbr As Integer, sName As String) As Boolean
' Passo al contesto corrente
EgtSetCurrentContext(CompoWindowMap.refCompoSceneHostV.CompoScene.GetCtx())
' Cancello layer regioni per selezione buchi
Dim Pz As Integer = EgtGetFirstGroupInGroup(GDB_ID.ROOT)
Dim SelectRegion As Integer = EgtGetFirstNameInGroup(Pz, "SelectRegion")
EgtErase(SelectRegion)
' Cancello layer etichette, quotatura,ausiliario e box
EgtErase(EgtGetFirstNameInGroup(Pz, "LayAux"))
EgtErase(EgtGetFirstNameInGroup(Pz, "Etichette"))
EgtErase(EgtGetFirstNameInGroup(Pz, "Quotature"))
EgtErase(EgtGetFirstNameInGroup(Pz, "Box"))
' Cancello layer etichette dei componenti interni (buchi)
Dim nHLId As Integer = EgtGetFirstNameInGroup(Pz, "HoleLabels")
While nHLId <> GDB_ID.NULL
EgtErase(nHLId)
nHLId = EgtGetFirstNameInGroup(Pz, "HoleLabels")
End While
' Attivo visualizzazione misura
Dim nRegLayId As Integer = EgtGetFirstNameInGroup(Pz, NAME_REGION)
Dim nId As Integer = EgtGetFirstInGroup(nRegLayId)
While nId <> GDB_ID.NULL
If EgtGetType(nId) = GDB_TY.EXT_TEXT Then
EgtSetStatus(nId, GDB_ST.ON_)
End If
nId = EgtGetNext(nId)
End While
' Layer OutLoop
Dim nOutLoopLayer = EgtGetFirstNameInGroup(Pz, NAME_OUTLOOP)
' Calcolo dimensione ingombro OutLoop
Dim ptMin, ptMax As Point3d
EgtGetBBoxGlob(nOutLoopLayer, GDB_BB.STANDARD, ptMin, ptMax)
Dim dBBoxRad As Double = 0.5 * Point3d.DistXY(ptMin, ptMax)
' Ricavo nome layer con testi inclinazioni
Dim TextLayer As Integer = EgtGetFirstNameInGroup(Pz, SIDE_ANGLE_LAYER)
' Se presente lo svuoto
If TextLayer <> GDB_ID.NULL Then
EgtEmptyGroup(TextLayer)
' altrimenti lo creo
Else
TextLayer = EgtCreateGroup(Pz)
EgtSetName(TextLayer, SIDE_ANGLE_LAYER)
EgtSetColor(TextLayer, New Color3d(0, 0, 0))
End If
' Modifico inclinazione lati
If Not IsNothing(CompoWindowMap.refCompoParamPageVM.m_SideAngleEntityList) Then
For Each Entity In CompoWindowMap.refCompoParamPageVM.m_SideAngleEntityList
Dim CurrSideAngleEntity As SideAngleEntity = DirectCast(Entity, SideAngleEntity)
Dim nCurrEntityName As Integer = EgtGetFirstNameInGroup(nOutLoopLayer, Entity.sEntityName)
If Math.Abs(CurrSideAngleEntity.dSideAngle) > EPS_ANG_SMALL Then
' Scrivo nuovo angolo nelle info
EgtSetInfo(nCurrEntityName, INFO_SIDE_ANGLE, CurrSideAngleEntity.dSideAngle)
' Creo testo con angolo di inclinazione per nesting
Dim sText As String = DoubleToString(CurrSideAngleEntity.dSideAngle, 1) & "°"
SideEntityControlVM.AddTextToLine(sText, TextLayer, nCurrEntityName, 20, dBBoxRad, False)
Else
' Cancello inclinazione nell'apposito campo info
EgtRemoveInfo(nCurrEntityName, INFO_SIDE_ANGLE)
End If
Next
End If
' Esporto il pezzo in un file temporaneo
Dim sTmpFile As String = OmagOFFICEMap.refMainWindowVM.MainWindowM.sTempDir & "\FlatPartCompo.Nge"
If Not EgtSaveObjToFile(1, sTmpFile, NGE.BIN) Then
Return False
End If
' Passo al contesto principale
EgtSetCurrentContext(OmagOFFICEMap.refSceneHostVM.MainScene.GetCtx())
' Recupero flag per inserimento diretto in grezzo (altrimenti in parcheggio)
Dim bDirect As Boolean = (GetMainPrivateProfileInt(S_NEST, K_DIRECT, 0) <> 0)
' Elimino eventuali precedenti pezzi vuoti
EgtEraseEmptyParts()
If My.Computer.FileSystem.FileExists(sTmpFile) Then
' eseguo inserimento
For i As Integer = 1 To nNbr
' Inserisco il pezzo
EgtInsertFile(sTmpFile)
' Ne recupero l'Id
Dim nId2 As Integer = EgtGetLastPart()
' Muovo la regione in Z per evitare problemi in visualizzazione
Dim nRegId = EgtGetFirstNameInGroup(nId2, NAME_REGION)
EgtMove(nRegId, New Vector3d(0, 0, DELTAZ_REG), GDB_RT.GLOB)
' Se definito nome lo inserisco nel testo
If Not String.IsNullOrWhiteSpace(sName) Then
Dim nTextId = EgtGetFirstInGroup(nRegId)
While nTextId <> GDB_ID.NULL
If EgtGetType(nTextId) = GDB_TY.EXT_TEXT Then
Dim sText As String = String.Empty
EgtTextGetContent(nTextId, sText)
Dim sNewText = sName & " " & sText
EgtModifyText(nTextId, sNewText)
Exit While
End If
nTextId = EgtGetNext(nTextId)
End While
End If
' Aggiusto per lavorazioni
AdjustFlatPart(nId2)
' Inserisco in parcheggio
EstCalc.StoreOnePart(nId2, True)
' Aggiungo riferimento e lo inserisco in VeinMatching
VeinMatching.SetRefOnPart(nId2)
VeinMatching.AddPart(nId2, True)
' Se richiesto posizionamento diretto, lo eseguo
If bDirect Then
If EstCalc.InsertOnePart(nId2, CurrentMachine.bAligned, CurrentMachine.bReducedCut) Then
' Eventuale notifica al VeinMatching
VeinMatching.OnInsertPartInRaw(nId2)
End If
End If
Next
' Cancello il file
My.Computer.FileSystem.DeleteFile(sTmpFile)
End If
' Aggiorno ambiente principale
EgtZoom(ZM.ALL)
Return True
End Function
Friend Sub Close(bDialogResult As Boolean)
RaiseEvent m_CloseWindow(bDialogResult)
End Sub
#End Region ' METHODS
End Class