www.pudn.com > ReadXfile.rar > FrmMain.cs


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
 
using System.IO; 
using Microsoft.DirectX; 
using Microsoft.DirectX.Direct3D; 
 
namespace World_Earth 
{ 
    public partial class FrmMain : Form 
    { 
        //ShowPMesh SPmeshClass = new ShowPMesh();//渐进模型 
        ShowPMesh SPmeshClass = new ShowPMesh();//单独打开给定个数渐进模型 
        public FrmMain() 
        { 
            //this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true); 
            InitializeComponent(); 
        } 
       
       
        ///  
        /// 打开被选中的X模型 
        ///  
        ///  
        ///  
        private void 打开X模型MenuItem_Click(object sender, EventArgs e) 
        { 
            OpenFileDia = new OpenFileDialog(); 
            OpenFileDia.InitialDirectory = Application.StartupPath + "\\杭州项目模型\\"; 
            OpenFileDia.Filter = "x files (*.x)|*.x"; 
            OpenFileDia.Multiselect = true; 
            OpenFileDia.FilterIndex = 1; 
 
            if (OpenFileDia.ShowDialog() == DialogResult.OK) 
            { 
                //第一种打开方法 
               //string[] files = OpenFileDia.FileNames;]; 
                //SPmeshClass.OpenAllXModel(this, files); 
                //第二种打开方法 
                SPmeshClass.filenamepath = OpenFileDia.FileNames; 
                SPmeshClass.xfilenum = OpenFileDia.FileNames.Length;//选中文件个数 
                //SPmeshClass.meshMaterials = new Material[SPmeshClass.xfilenum, 100]; 
                //SPmeshClass.meshTextures = new Texture[SPmeshClass.xfilenum, 100]; 
                SPmeshClass.InitBinary(); 
                if (SPmeshClass.device == null) 
                { 
                    SPmeshClass.InitD3D(this); 
                } 
                SPmeshClass.mtrlNum = new int[SPmeshClass.xfilenum];//xhl 2007-3-28  数组没有重新定义 导致出错 
 
                ////////////进度条窗口///////////// 
                FrmPro frm = new FrmPro(); 
                frm.Show(); 
                frm.ProBar.Maximum = SPmeshClass.xfilenum; 
                int nProNum = SPmeshClass.xfilenum;//估计时间 
                TimeSpan start = new TimeSpan(DateTime.Now.Ticks); 
                ////////////////////////////////////////// 
                for (int nIndex = 0; nIndex < SPmeshClass.xfilenum; nIndex++) 
                { 
                    SPmeshClass.LoadMesh(SPmeshClass.filenamepath[nIndex], nIndex); 
 
                    if (SPmeshClass.device != null) 
                    { 
                        SPmeshClass.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Blue, 1.0f, 0); 
                        SPmeshClass.device.BeginScene(); 
                        //xfilenum = filenamepath.Length; 
                        for (int nInd= 0; nInd < SPmeshClass.xfilenum; nInd++) 
                        { 
                            SPmeshClass.SetCamera(nInd); 
                            SPmeshClass.DrawMesh(nInd); 
                            TimeSpan end = new TimeSpan(DateTime.Now.Ticks); 
                            TimeSpan ts = end.Subtract(start); 
                            double dtotals = ts.TotalSeconds * SPmeshClass.xfilenum / (nInd + 1); 
 
                            double shenyu = dtotals - ts.TotalSeconds; 
                            shenyu = System.Math.Round(shenyu); 
                            //string strTime = ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时"  
                            //                             + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒" + ts.Milliseconds.ToString () + "毫秒"; 
                            string strTime = shenyu.ToString() + "秒";//剩余时间 
                            ////进度条///////////////////////////////////////////// 
                            frm.ProBar.Value = nIndex; 
                            int nfi = SPmeshClass.filenamepath[nIndex].LastIndexOf("\\") + 1; 
                            string strname = SPmeshClass.filenamepath[nInd].Substring(nfi);//当前加载的模型名 
                            frm.labTip.Text = "Loading: " + strname; 
                            frm.labTime.Text = "剩余时间:" + strTime; 
                            frm.Update(); 
                        } 
                        //int vertices = new int(); 
                        //int faces = new int(); 
                        //for (int nIn = 0; nIndex < SPmeshClass.xfilenum; nIn++) 
                        //{ 
                        //    BaseMesh b = SPmeshClass.progressiveMesh[nIn]; 
                        //    vertices = vertices + b.NumberVertices; 
                        //    faces = faces + b.NumberFaces; 
                        //} 
                        //SPmeshClass.font.DrawText(null, string.Format("Number vertices in mesh: {0}", vertices), 
                        //                          new Rectangle(10, 26, 0, 0), 
                        //                          DrawTextFormat.NoClip, Color.BlanchedAlmond); 
 
                        //SPmeshClass.font.DrawText(null, string.Format("Number faces in mesh: {0}", faces), 
                        //                          new Rectangle(10, 42, 0, 0), 
                        //                          DrawTextFormat.NoClip, Color.BlanchedAlmond); 
                        SPmeshClass.device.EndScene(); 
                        SPmeshClass.device.Present(); 
                    } 
                     
                } 
 
                /////关闭滚动条窗口 
                frm.Hide(); 
                //SPmeshClass.ShowXModel(); 
                
            } 
           else 
           { 
                return; 
           } 
 
        } 
        ///  
        ///  
        ///  
        ///  
        ///  
        private void FrmMain_Paint(object sender, PaintEventArgs e) 
        { 
            if (SPmeshClass.progressiveMesh[0] != null) 
                if (this.WindowState != FormWindowState.Minimized) 
                { 
                    SPmeshClass.ShowXModel(); 
                } 
            
 
        } 
        ///  
        ///  
        ///  
        ///  
        ///  
        private void FrmMain_KeyPress(object sender, KeyPressEventArgs e) 
        { 
            if (e.KeyChar == 's') 
                { 
                    for (int i = 0; i < SPmeshClass.xfilenum; i++) 
                    { 
                        //cameraPos -= (MoveAmount * 2); 
                        SPmeshClass.pos[i].Z -= (SPmeshClass.MoveAmount * 2); 
                        SPmeshClass.progressiveMesh[i].NumberVertices = 
                            ((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberVertices + SPmeshClass.MoveAmount; 
 
                        SPmeshClass.progressiveMesh[i].NumberFaces = 
                            ((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberFaces + SPmeshClass.MoveAmount; 
                    } 
                } 
                if (e.KeyChar == 'w') 
                { 
                    for (int i = 0; i < SPmeshClass.xfilenum; i++) 
                    { 
                        //cameraPos += (MoveAmount * 2); 
                        SPmeshClass.pos[i].Z += (SPmeshClass.MoveAmount * 2); 
                        SPmeshClass.progressiveMesh[i].NumberVertices = 
                            ((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberVertices - SPmeshClass.MoveAmount; 
 
                        SPmeshClass.progressiveMesh[i].NumberFaces = 
                            ((BaseMesh)SPmeshClass.progressiveMesh[i]).NumberFaces - SPmeshClass.MoveAmount; 
                    } 
                } 
                if (e.KeyChar == 'a') 
                { 
                    //for (int i = 0; i < SPmeshClass.xfilenum; i++) 
                    //{ 
                    //    SPmeshClass.pos[i].X -= (SPmeshClass.MoveAmount * 2); 
                    //} 
                    SPmeshClass.offsetx = SPmeshClass.offsetx + 4f; 
                    SPmeshClass.device.Transform.World = Matrix.Translation(SPmeshClass.offsetx, 0, 0); 
                    
                } 
                if (e.KeyChar == 'd') 
                { 
                    //for (int i = 0; i < SPmeshClass.xfilenum; i++) 
                    //{ 
                    //    SPmeshClass.pos[i].X += (SPmeshClass.MoveAmount * 2); 
                    //} 
                    SPmeshClass.offsetx = SPmeshClass.offsetx - 4f; 
                    SPmeshClass.device.Transform.World = Matrix.Translation(SPmeshClass.offsetx, 0, 0); 
                     
                } 
 
                if (e.KeyChar == 'e')//线显示 
                { 
                    SPmeshClass.device.RenderState.FillMode = FillMode.WireFrame; 
                } 
 
                if (e.KeyChar == 'f')//面显示 
                { 
                    SPmeshClass.device.RenderState.FillMode = FillMode.Solid; 
                } 
                //this.Invalidate(); //不在paint事件中画便可以去除屏幕闪烁 
                SPmeshClass.ShowXModel(); 
        } 
        ///  
        /// 递归实现查找目录下的所有子目录和文件 
        ///  
        /// 为指定的文件夹路径 
        public void FindFile(string dir)                          
        { 
            //在指定目录及子目录下查找文件 
            DirectoryInfo Dir = new DirectoryInfo(dir); 
            try 
            { 
                foreach (DirectoryInfo d in Dir.GetDirectories())     //查找子目录      
                { 
                    FindFile(Dir + "\\" + d.ToString() + "\\"); 
                    //listBox1.Items.Add(Dir + "\\" + d.ToString() + "\\");       //listBox1中填加目录名    
                } 
 
                foreach (FileInfo f in Dir.GetFiles("*.x"))             //查找x文件    
                { 
                    //listBox1.Items.Add(Dir+f.ToString());     //listBox1中填加文件名  
                    SPmeshClass.filenamepath[SPmeshClass.xfilenum] = Dir + "\\" + f.ToString(); 
                    SPmeshClass.xfilenum++; 
                } 
            } 
            catch (Exception e) 
            { 
                MessageBox.Show(e.Message); 
            } 
 
        } 
        ///  
        /// 释放内存 
        ///  
        ///  
        ///  
        private void FrmMain_FormClosed(object sender, FormClosedEventArgs e) 
        { 
            if (SPmeshClass.device != null) 
                SPmeshClass.device.Dispose(); 
            SPmeshClass.device = null; 
            if (SPmeshClass.progressiveMesh != null) 
                { 
                    SPmeshClass.progressiveMesh = null; 
                } 
                
 
        } 
        ///  
        ///  
        ///  
        ///  
        ///  
        private void FrmMain_KeyDown(object sender, KeyEventArgs e) 
        { 
            //  前后左右旋转 
            if (e.KeyCode==Keys.Left) 
            { 
                SPmeshClass.angle = SPmeshClass.angle + 0.2f; 
                SPmeshClass.device.Transform.World = Matrix.RotationY(SPmeshClass.angle); 
            } 
            else if (e.KeyCode == Keys.Right) 
            { 
                SPmeshClass.angle = SPmeshClass.angle - 0.2f; 
                SPmeshClass.device.Transform.World = Matrix.RotationY(SPmeshClass.angle); 
            } 
            else if (e.KeyCode == Keys.Up) 
            { 
                SPmeshClass.angle = SPmeshClass.angle + 0.2f; 
                SPmeshClass.device.Transform.World = Matrix.RotationX(SPmeshClass.angle); 
                //device.Transform.World = Matrix.RotationX(Environment.TickCount / 100.0f); 
            } 
            else if (e.KeyCode == Keys.Down) 
            { 
                SPmeshClass.angle = SPmeshClass.angle - 0.2f; 
                SPmeshClass.device.Transform.World = Matrix.RotationX(SPmeshClass.angle); 
                //device.Transform.World = Matrix.RotationX(-Environment.TickCount / 100.0f); 
            } 
            //this.Invalidate();//不在paint事件中画便可以去除屏幕闪烁 
            SPmeshClass.ShowXModel(); 
 
        } 
        ///  
        /// 打开窗口FrmTest来导入普通模型 
        ///  
        ///  
        ///  
        private void showtestToolStripMenuItem_Click(object sender, EventArgs e) 
        { 
            FrmTest ff = new FrmTest(); 
            ff.Show(); 
        } 
 
        private void FrmMain_Resize(object sender, EventArgs e) 
        { 
            //if (this.WindowState != FormWindowState.Minimized) 
            //SPmeshClass.ShowXModel(); 
        } 
 
        private void 测试MenuItem_Click(object sender, EventArgs e) 
        { 
            OpenFileDia = new OpenFileDialog(); 
            OpenFileDia.InitialDirectory = Application.StartupPath + "\\模型\\"; 
            OpenFileDia.Filter = "x files (*.x)|*.x"; 
            //OpenFileDia.Multiselect = true; 
            OpenFileDia.FilterIndex = 1; 
 
            if (OpenFileDia.ShowDialog() == DialogResult.OK) 
            { 
                //第一种打开方法 
                //string[] files = OpenFileDia.FileNames;]; 
                //SPmeshClass.OpenAllXModel(this, files); 
                //第二种打开方法 
                string strfname = OpenFileDia.FileName; 
                SPmeshClass.xfilenum = 30; 
                //SPmeshClass.filenamepath = OpenFileDia.FileNames; 
                //SPmeshClass.xfilenum = OpenFileDia.FileNames.Length;//选中文件个数 
                //SPmeshClass.meshMaterials = new Material[SPmeshClass.xfilenum, 100]; 
                //SPmeshClass.meshTextures = new Texture[SPmeshClass.xfilenum, 100]; 
                SPmeshClass.InitBinary(); 
                if (SPmeshClass.device == null) 
                { 
                    SPmeshClass.InitD3D(this); 
                } 
                SPmeshClass.mtrlNum = new int[SPmeshClass.xfilenum];//xhl 2007-3-28  数组没有重新定义 导致出错 
 
                ////////////进度条窗口///////////// 
                FrmPro frm = new FrmPro(); 
                frm.Show(); 
                frm.ProBar.Maximum = SPmeshClass.xfilenum; 
                int nProNum = SPmeshClass.xfilenum;//估计时间 
                TimeSpan start = new TimeSpan(DateTime.Now.Ticks); 
                ////////////////////////////////////////// 
                for (int nIndex = 0; nIndex < SPmeshClass.xfilenum; nIndex++) 
                { 
                    //SPmeshClass.LoadMesh(SPmeshClass.filenamepath[nIndex], nIndex); 
                    SPmeshClass.LoadMesh(strfname, nIndex); 
                    TimeSpan end = new TimeSpan(DateTime.Now.Ticks); 
                    TimeSpan ts = end.Subtract(start); 
                    double dtotals = ts.TotalSeconds * SPmeshClass.xfilenum / (nIndex + 1); 
 
                    double shenyu = dtotals - ts.TotalSeconds; 
                    shenyu = System.Math.Round(shenyu); 
                    //string strTime = ts.Days.ToString() + "天" + ts.Hours.ToString() + "小时"  
                    //                             + ts.Minutes.ToString() + "分" + ts.Seconds.ToString() + "秒" + ts.Milliseconds.ToString () + "毫秒"; 
                    string strTime = shenyu.ToString() + "秒";//剩余时间 
                    ////进度条///////////////////////////////////////////// 
                    frm.ProBar.Value = nIndex; 
                    int nfi = strfname.LastIndexOf("\\") + 1; 
                    string strname = strfname.Substring(nfi);//当前加载的模型名 
                    //int nfi = SPmeshClass.filenamepath[nIndex].LastIndexOf("\\") + 1; 
                    //string strname = SPmeshClass.filenamepath[nIndex].Substring(nfi);//当前加载的模型名 
                    frm.labTip.Text = "Loading: " + strname + "-" + nIndex.ToString(); 
                    frm.labTime.Text = "剩余时间:" + strTime  ; 
                    frm.Update(); 
                } 
 
                /////关闭滚动条窗口 
                frm.Hide(); 
                SPmeshClass.ShowXModel(); 
 
            } 
            else 
            { 
                return; 
            } 
        } 
 
 
    } 
}