Imports System.Runtime.InteropServices Imports System.Text Imports System.Math Imports System.IO Imports TestEIn.EgtInterface Imports TestEIn.GenInterface Public Class Form1 Private m_sIniFile As String = String.Empty Private m_sCurrFile As String = String.Empty Private m_nMarkObj As Integer = GDB_ID_NULL '-------------------------------- Form ------------------------------------------------------------ Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 'Title Me.Text = "EgalTech TestEIn" 'Impostazione path Ini file m_sIniFile = Application.StartupPath & "\TestEIn.ini" 'Inizializzazione generale di EgtInterface EgtInit(0, Application.StartupPath & "\TestEngine.log") 'imposto chiave di protezione Dim sKey As String = String.Empty GetPrivateProfileString("General", "Key", "", sKey, m_sIniFile) EgtSetKey(sKey) 'imposto dir font Nfe e font default Dim sNfeDir As String = String.Empty GetPrivateProfileString("GeomDB", "NfeFontDir", "", sNfeDir, m_sIniFile) Dim sDefFont As String = String.Empty GetPrivateProfileString("GeomDB", "DefaultFont", "", sDefFont, m_sIniFile) EgtSetFont(sNfeDir, sDefFont) ' imposto colori sfondo Dim nTopRed As Integer = 192 Dim nTopGreen As Integer = 192 Dim nTopBlue As Integer = 192 GetPrivateProfileColor("Scene", "BackTop", nTopRed, nTopGreen, nTopBlue, m_sIniFile) Dim nBotRed As Integer = 192 Dim nBotGreen As Integer = 192 Dim nBotBlue As Integer = 192 GetPrivateProfileColor("Scene", "BackBottom", nBotRed, nBotGreen, nBotBlue, m_sIniFile) Scene1.SetViewBackground(nTopRed, nTopGreen, nTopBlue, nBotRed, nBotGreen, nBotBlue) ' inizializzo scena Scene1.Init() rbtShading.Checked = True m_nOldIdTree = GDB_ID_NULL ' aggiungo voce per about box nel menù di sistema Dim hSysMenu As IntPtr = GetSystemMenu(Handle, False) If hSysMenu <> IntPtr.Zero Then AppendMenu(hSysMenu, MF_SEPARATOR, 0, "") AppendMenu(hSysMenu, MF_STRING, IDM_ABOUTBOX, "About TestEIn...") End If 'Posizione e dimensioni del Form If ModifierKeys <> Keys.Shift Then Dim nFlag As Integer Dim nLeft As Integer Dim nTop As Integer Dim nWidth As Integer Dim nHeight As Integer GetPrivateProfileWinPos("General", "WinPlace", nFlag, nLeft, nTop, nWidth, nHeight, m_sIniFile) Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual Me.Location = New Point(nLeft, nTop) Me.Size = New Size(nWidth, nHeight) WindowState = IIf(nFlag = 1, FormWindowState.Maximized, FormWindowState.Normal) End If End Sub Private Sub Form1_FormClosing(sender As System.Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 'Salvo posizione Form Dim nFlag As Integer = IIf(Me.WindowState = FormWindowState.Maximized, 1, 0) WritePrivateProfileWinPos("General", "WinPlace", nFlag, Me.Left, Me.Top, Me.Width, Me.Height, m_sIniFile) 'Terminazione generale di EgtInterface EgtExit() End Sub Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) MyBase.WndProc(m) If m.Msg = WM_SYSCOMMAND Then If m.WParam.ToInt32 = IDM_ABOUTBOX Then AboutBox1.ShowDialog() End If End If End Sub '-------------------------------- Events management ---------------------------------------------- Private Sub OnCursorPos(ByVal sender As Object, ByVal sCursorPos As String) Handles Scene1.OnCursorPos ToolStripStatusCursorPos.Text = sCursorPos End Sub Private Sub OnMouseSelected(ByVal sender As Object, ByVal nId As Integer) Handles Scene1.OnMouseSelected If EgtIsSelectedObj(Scene1.GetCtx(), nId) Then EgtDeselectObj(Scene1.GetCtx(), nId) Else EgtSelectObj(Scene1.GetCtx(), nId) End If EgtDraw(Scene1.GetCtx()) End Sub Private Sub OnMouseAnalyzed(ByVal sender As Object, ByVal nId As Integer) Handles Scene1.OnMouseAnalyzed SelectIdInObjTree(nId) End Sub Private Sub OnShowDistance(ByVal sender As Object, ByVal sDistance As String) Handles Scene1.OnShowDistance ToolStripStatusOutput.Text = sDistance End Sub Private Sub OnNewProject(ByVal sender As Object) Handles Scene1.OnNewProject m_sCurrFile = String.Empty Me.Text = "EgalTech TestEIn" ClearObjTree() End Sub Private Sub OnOpeningProject(ByVal sender As Object) Handles Scene1.OnOpeningProject ClearObjTree() End Sub Private Sub OnOpenProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnOpenProject m_sCurrFile = sFile Me.Text = Path.GetFileName(m_sCurrFile) & " - EgalTech TestEIn" LoadObjTree() End Sub Private Sub OnSavingProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnSavingProject m_sCurrFile = sFile Me.Text = Path.GetFileName(m_sCurrFile) & " - EgalTech TestEIn" ' ripristino stato eventuale oggetto marcato m_nMarkObj = RevertOldIdInObjTree() End Sub Private Sub OnSavedProject(ByVal sender As Object) Handles Scene1.OnSavedProject ' rimarco eventuale oggetto smarcato SelectIdInObjTree(m_nMarkObj) End Sub Private Sub OnImportingProject(ByVal sender As Object) Handles Scene1.OnImportingProject ClearObjTree() End Sub Private Sub OnImportedProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnImportedProject m_sCurrFile = Path.ChangeExtension(sFile, "nge") Me.Text = Path.GetFileName(m_sCurrFile) & " - EgalTech TestEIn" LoadObjTree() End Sub Private Sub OnExportingProject(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnExportingProject ' ripristino stato eventuale oggetto marcato m_nMarkObj = RevertOldIdInObjTree() End Sub Private Sub OnExportedProject(ByVal sender As Object) Handles Scene1.OnExportedProject ' rimarco eventuale oggetto smarcato SelectIdInObjTree(m_nMarkObj) End Sub Private Sub OnExecutingScript(ByVal sender As Object, ByVal sFile As String) Handles Scene1.OnExecutingScript ClearObjTree() End Sub Private Sub OnExecutedScript(ByVal sender As Object) Handles Scene1.OnExecutedScript LoadObjTree() End Sub '-------------------------------- Buttons -------------------------------------------------------- Private Sub btnNew_Click(sender As System.Object, e As System.EventArgs) Handles btnNew.Click Scene1.NewProject() End Sub Private Sub btnOpen_Click(sender As System.Object, e As System.EventArgs) Handles btnOpen.Click Scene1.OpenProject() End Sub Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click Scene1.SaveProject(m_sCurrFile) End Sub Private Sub btnImport_Click(sender As System.Object, e As System.EventArgs) Handles btnImport.Click Scene1.ImportProject() End Sub Private Sub btnExport_Click(sender As System.Object, e As System.EventArgs) Handles btnExport.Click Scene1.ExportProject(Path.ChangeExtension(m_sCurrFile, "dxf")) End Sub Private Sub btnExec_Click(sender As System.Object, e As System.EventArgs) Handles btnExec.Click Scene1.Exec() End Sub Private Sub rbtWireFrame_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbtWireFrame.CheckedChanged EgtSetShowMode(Scene1.GetCtx(), SM_WIREFRAME) End Sub Private Sub rbtHiddenLine_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbtHiddenLine.CheckedChanged EgtSetShowMode(Scene1.GetCtx(), SM_HIDDENLINE) End Sub Private Sub rbtShading_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles rbtShading.CheckedChanged EgtSetShowMode(Scene1.GetCtx(), SM_SHADING) End Sub Private Sub chkCurveDir_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkCurveDir.CheckedChanged EgtSetShowCurveDirection(Scene1.GetCtx(), chkCurveDir.Checked) End Sub Private Sub chkAnalyze_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkAnalyze.CheckedChanged If chkAnalyze.Checked Then chkGetDist.Checked = False Scene1.SetStatusAnalyze() Else Scene1.ResetStatusAnalyze() SelectIdInObjTree(GDB_ID_NULL) End If End Sub Private Sub chkGetDist_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkGetDist.CheckedChanged If chkGetDist.Checked Then chkAnalyze.Checked = False Scene1.SetStatusGetDistance() ToolStripStatusOutput.Text = " " Else Scene1.ResetStatusGetDistance() EgtResetGeoLine(Scene1.GetCtx()) ToolStripStatusOutput.Text = " " End If End Sub Private Sub btnZoomAll_Click(sender As System.Object, e As System.EventArgs) Handles btnZoomAll.Click EgtZoom(Scene1.GetCtx, ZM_ALL) End Sub Private Sub btnZoomIn_Click(sender As System.Object, e As System.EventArgs) Handles btnZoomIn.Click EgtZoom(Scene1.GetCtx, ZM_IN) End Sub Private Sub btnZoomOut_Click(sender As System.Object, e As System.EventArgs) Handles btnZoomOut.Click EgtZoom(Scene1.GetCtx, ZM_OUT) End Sub Private Sub btnTop_Click(sender As System.Object, e As System.EventArgs) Handles btnTop.Click EgtSetView(Scene1.GetCtx, CT_TOP) End Sub Private Sub btnFront_Click(sender As System.Object, e As System.EventArgs) Handles btnFront.Click EgtSetView(Scene1.GetCtx, CT_FRONT) End Sub Private Sub btnLeft_Click(sender As System.Object, e As System.EventArgs) Handles btnLeft.Click EgtSetView(Scene1.GetCtx, CT_LEFT) End Sub Private Sub btnBack_Click(sender As System.Object, e As System.EventArgs) Handles btnBack.Click EgtSetView(Scene1.GetCtx, CT_BACK) End Sub Private Sub btnRight_Click(sender As System.Object, e As System.EventArgs) Handles btnRight.Click EgtSetView(Scene1.GetCtx, CT_RIGHT) End Sub Private Sub btnIso_Click(sender As System.Object, e As System.EventArgs) Handles btnIso.Click EgtSetView(Scene1.GetCtx, CT_ISO_SW) End Sub Private Sub btnRotP90_Click(sender As System.Object, e As System.EventArgs) Handles btnRotP90.Click Rotate(Scene1.GetCtx(), 90) ' aggiorno visualizzazione EgtZoom(Scene1.GetCtx(), ZM_ALL) UpdateObjInObjTree(m_nOldIdTree) End Sub Private Sub btnRotM90_Click(sender As System.Object, e As System.EventArgs) Handles btnRotM90.Click Rotate(Scene1.GetCtx(), -90) ' aggiorno visualizzazione EgtZoom(Scene1.GetCtx(), ZM_ALL) UpdateObjInObjTree(m_nOldIdTree) End Sub Private Sub Rotate(ByVal nCtx As Integer, ByVal dAngRotDeg As Double) ' indice del primo gruppo sotto la radice Dim nId As Integer = EgtGetFirstInGroup(nCtx, GDB_ID_ROOT) ' recupero il box del gruppo in globale Dim PtMinPre As New Point3d Dim PtMaxPre As New Point3d EgtGetBBoxGlob(nCtx, nId, BBF_IGNORE_TEXT, PtMinPre, PtMaxPre) ' ruoto attorno al punto minimo EgtRotateGlob(nCtx, nId, PtMinPre, Vector3d.Z_AX, dAngRotDeg) ' calcolo nuovo box in globale Dim PtMinPost As New Point3d Dim PtMaxPost As New Point3d EgtGetBBoxGlob(nCtx, nId, BBF_IGNORE_TEXT, PtMinPost, PtMaxPost) ' eseguo traslazione per riavere lo stesso punto minimo Dim VtMove As Vector3d = Vector3d.FromPointDiff(PtMinPre, PtMinPost) EgtMoveGlob(nCtx, nId, VtMove) End Sub Private Sub btnMirror_Click(sender As System.Object, e As System.EventArgs) Handles btnMirror.Click ' indice del primo gruppo sotto la radice Dim nId As Integer = EgtGetFirstInGroup(Scene1.GetCtx(), GDB_ID_ROOT) ' recupero il box del gruppo in globale Dim PtMin As New Point3d Dim PtMax As New Point3d EgtGetBBoxGlob(Scene1.GetCtx(), nId, BBF_IGNORE_TEXT, PtMin, PtMax) Dim PtCen As Point3d = Point3d.Media(PtMin, PtMax) ' mirror rispetto a Y centrato nel box EgtMirrorGlob(Scene1.GetCtx(), nId, PtCen, Vector3d.X_AX) ' sistemo gli eventuali testi UnMirrorTexts(Scene1.GetCtx(), nId) ' aggiorno visualizzazione EgtZoom(Scene1.GetCtx(), ZM_ALL) UpdateObjInObjTree(m_nOldIdTree) End Sub Private Sub UnMirrorTexts(ByVal nCtx As Integer, ByVal nGroupId As Integer) Dim nId As Integer = EgtGetFirstInGroup(nCtx, nGroupId) While nId <> GDB_ID_NULL 'recupero il tipo di oggetto Dim nType As Integer = EgtGetType(nCtx, nId) 'se gruppo If nType = TY_GROUP Then UnMirrorTexts(nCtx, nId) ' se testo ElseIf nType = TY_EXT_TEXT Then EgtMirrorText(nCtx, nId, True) End If ' passo al successivo nId = EgtGetNext(nCtx, nId) End While End Sub '-------------------------------- Command Box ---------------------------------------------------- Private Sub tboxCmd_KeyDown(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles tboxCmd.KeyDown If (e.KeyCode = Keys.Enter) Then Dim nLine As Integer = tboxCmd.GetLineFromCharIndex(tboxCmd.GetFirstCharIndexOfCurrentLine) Dim sCmd As String = tboxCmd.Lines(nLine).ToString If Not String.IsNullOrEmpty(sCmd) Then ' ripristino stato oggetto marcato Dim nIdOld As Integer = RevertOldIdInObjTree() ' eseguo comando If EgtTscExecLine(Scene1.GetCtx, sCmd) Then Scene1.Invalidate() ToolStripStatusOnR.Text = " " Else ToolStripStatusOnR.Text = "Error executing command" End If ' ricarico albero degli oggetti LoadObjTree() SelectIdInObjTree(nIdOld) End If End If End Sub '-------------------------------- Tree View ------------------------------------------------------ Private m_nOldIdTree As Integer Private Sub LoadObjTree() ClearObjTree() TreeView1.BeginUpdate() TreeView1.Nodes.Add(GDB_ID_NULL.ToString, "No Selection", 0, 0) AddGroupInObjTree(GDB_ID_ROOT, TreeView1.Nodes) TreeView1.EndUpdate() End Sub Private Sub ClearObjTree() RevertOldIdInObjTree() TreeView1.Nodes.Clear() End Sub Private Sub AddGroupInObjTree(ByVal nGroupId As Integer, ByRef PrevNodColl As TreeNodeCollection) Dim CurrNodColl As TreeNodeCollection If nGroupId = GDB_ID_ROOT Then CurrNodColl = PrevNodColl Else Dim sName As String = String.Empty Dim sText As String = String.Empty If EgtGetName(Scene1.GetCtx, nGroupId, sName) Then sText = sName + " (Group " + nGroupId.ToString + ")" Else sText = "Group " + nGroupId.ToString End If Dim nImage As Integer = TypeToImageInObjTree(TY_GROUP) CurrNodColl = PrevNodColl.Add(nGroupId.ToString, sText, nImage, nImage).Nodes End If Dim nObjs As Integer = EgtGetGroupObjs(Scene1.GetCtx(), nGroupId) If (nObjs > 20000) Then CurrNodColl.Add("-1", "Too many entities") Return End If Dim nId As Integer = EgtGetFirstInGroup(Scene1.GetCtx, nGroupId) While nId <> GDB_ID_NULL 'recupero il tipo di nodo Dim nType As Integer = EgtGetType(Scene1.GetCtx, nId) 'se gruppo If nType = TY_GROUP Then AddGroupInObjTree(nId, CurrNodColl) 'se oggetto geometrico ElseIf nType >= TY_GEO_VECTOR Then Dim sTitle As String = String.Empty EgtGetTitle(Scene1.GetCtx, nId, sTitle) Dim sName As String = String.Empty Dim sText As String = String.Empty If EgtGetName(Scene1.GetCtx, nId, sName) Then sText = sName + " (" + sTitle + " " + nId.ToString + ")" Else sText = sTitle + " " + nId.ToString End If Dim nImage As Integer = TypeToImageInObjTree(nType) CurrNodColl.Add(nId.ToString, sText, nImage, nImage) End If 'passo al successivo nId = EgtGetNext(Scene1.GetCtx, nId) End While End Sub Private Function TypeToImageInObjTree(ByVal nType As Integer) As Integer Select Case nType Case TY_GROUP Return 2 Case TY_GEO_VECTOR Return 3 Case TY_GEO_POINT Return 4 Case TY_GEO_FRAME Return 5 Case TY_CRV_LINE Return 6 Case TY_CRV_ARC Return 7 Case TY_CRV_BEZ Return 8 Case TY_CRV_COMPO Return 9 Case TY_SRF_MESH Return 10 Case TY_EXT_TEXT Return 11 End Select Return 1 End Function Private Sub ObjTree_AfterSelect(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterSelect ' recupero l'Id del nuovo oggetto selezionato Dim nId As Integer If Not Int32.TryParse(e.Node.Name, nId) Then Return End If UpdateObjInObjTree(nId) End Sub Private Sub UpdateObjInObjTree(ByVal nId As Integer) ' ripristino eventuale vecchio oggetto selezionato RevertOldIdInObjTree() ' recupero il tipo del nuovo oggetto Dim nType As Integer = EgtGetType(Scene1.GetCtx, nId) ' stampa dei dati del nuovo oggetto Dim sDump As String = String.Empty If nType = TY_NONE Then tBoxInfo.Text = String.Empty ElseIf nType = TY_GROUP Then If EgtGroupDump(Scene1.GetCtx, nId, sDump) Then tBoxInfo.Text = sDump Else tBoxInfo.Text = String.Empty End If Else If EgtGeoObjDump(Scene1.GetCtx, nId, sDump) Then tBoxInfo.Text = sDump Else tBoxInfo.Text = String.Empty End If End If ' permetto in ogni caso la visualizzazione dell'oggetto e lo evidenzio Dim nOldMode As Integer = GDB_MD_STD EgtGetMode(Scene1.GetCtx, nId, nOldMode) Dim nMode As Integer = IIf((nOldMode = GDB_MD_HIDDEN), GDB_MD_STD, nOldMode) EgtSetMode(Scene1.GetCtx, nId, nMode) Dim nOldStatus As Integer = GDB_ST_ON EgtGetStatus(Scene1.GetCtx, nId, nOldStatus) Dim nStat As Integer = IIf((nOldStatus = GDB_ST_OFF), GDB_ST_ON, nOldStatus) EgtSetStatus(Scene1.GetCtx, nId, nStat) EgtSetMark(Scene1.GetCtx, nId) m_nOldIdTree = nId ' imposto il ridisegno della scena Scene1.Invalidate() End Sub Private Function RevertOldIdInObjTree() As Integer ' salvo il vecchio Id Dim nOldId As Integer = m_nOldIdTree ' se non nullo... If EgtExistsObj(Scene1.GetCtx, m_nOldIdTree) Then ' ripristino il modo e lo stato precedente dell'oggetto e lo smarco EgtRevertMode(Scene1.GetCtx, m_nOldIdTree) EgtRevertStatus(Scene1.GetCtx, m_nOldIdTree) EgtResetMark(Scene1.GetCtx, m_nOldIdTree) ' annullo oggetto da ripristinare m_nOldIdTree = GDB_ID_NULL End If Return nOldId End Function Private Function SelectIdInObjTree(ByVal nId As Integer) As Boolean Dim tNode() As TreeNode = TreeView1.Nodes.Find(nId.ToString, True) If tNode.Length > 0 Then TreeView1.SelectedNode = tNode(0) Return True Else Return False End If End Function End Class