一般情况下,我们自己搭建模型的功力还不够,大多都是在3Dmax中做好模型,导出成模型文件,然后再导入Eyeshot视图中。导入的代码包括:
OpenFileDialog openFileDialog1 = new OpenFileDialog(); string theFilter = "Points|*.asc|" + "Stereolithography|*.stl|" + "WaveFront OBJ|*.obj"; theFilter += "|IGES|*.igs; *.iges|" + "STEP|*.stp; *.step"; openFileDialog1.Filter = theFilter; openFileDialog1.Multiselect = false; openFileDialog1.AddExtension = true; openFileDialog1.CheckFileExists = true; openFileDialog1.CheckPathExists = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { viewportLayout1.Entities.Clear(); ReadFileAsynch rfa = null; switch (openFileDialog1.FilterIndex) { case 1: rfa = new ReadASC(openFileDialog1.FileName); break; case 2: rfa = new ReadSTL(openFileDialog1.FileName); break; case 3: rfa = new ReadOBJ(openFileDialog1.FileName); break; case 4: rfa = new ReadIGES(openFileDialog1.FileName); break; case 5: rfa = new ReadSTEP(openFileDialog1.FileName); break; } viewportLayout1.StartWork(rfa); }
这里还没有完,因为导入模型这个过程是异步导入,所以还有另外一个函数:
private void viewportLayout1_WorkCompleted(object sender, WorkCompletedEventArgs e) { if (e.WorkUnit is ReadFileAsynch)//导入文件
{ ReadFileAsynch rfa = (ReadFileAsynch)e.WorkUnit; Entity[] entList = rfa.Entities; entityListClone = (Entity[])entList.Clone(); rfa.AddToScene(viewportLayout1); viewportLayout1.SetView(viewType.Top); viewportLayout1.ZoomFit(); } }
这段代码表示如果执行的work是导入文件,那么将导入的模型呈现在视图中,并且设置视图角度以及模型的相对大小。
如果该模型包含mtl材料文件和图片格式的纹理文件,那么导入就需要用到另外一种方式,这里仍然拿OBJ格式的模型为例子:
用函数ReadOBJ(Stream objStream, Stream materialStream, Dictionary<string, Stream> texturesStream, meshEdgeStyleType edgeStyle)
FileStream fs1 = new FileStream(@"..\..\Models\demo.obj", FileMode.Open); //obj FileStream fs2 = new FileStream(@"..\..\Models\demo.mtl", FileMode.Open); //mtl FileStream fs3 = new FileStream(@"..\..\Models\demo.jpg", FileMode.Open); //texture Dictionary<string, Stream> texturesDic = new Dictionary<string, Stream>(); texturesDic.Add("demo.jpg", fs3); ReadOBJ ro = new ReadOBJ(fs1, fs2, texturesDic, meshEdgeStyleType.Sharp); viewportLayout1.StartWork(ro);
viewportLayout1_WorkCompleted函数中的部分不用改变。
导出模型的文件只有一个,比如导入模型时有一个.mtl文件和一个.obj文件,导出模型后就只有.obj文件了。
导出模型的代码如下:
SaveFileDialog sfd = new SaveFileDialog(); string theFilter = "OBJ|*.OBJ"; theFilter += "|IGES|*.igs; *.iges|" + "STEP|*.stp; *.step"; sfd.Filter = theFilter; string savePath = fileName; if (sfd.ShowDialog() == DialogResult.OK) { if (!string.IsNullOrEmpty(sfd.FileName)) { savePath = sfd.FileName; } string extention = savePath.Substring(savePath.LastIndexOf('.') + 1).ToLower(); switch (extention) { case "obj": viewportLayout1.WriteOBJ(savePath, false); break; case "igs": viewportLayout1.WriteIGES(savePath, false); break; case "iges": viewportLayout1.WriteIGES(savePath, false); break; case "stp": viewportLayout1.WriteSTEP(savePath, false); break; case "step": viewportLayout1.WriteSTEP(savePath, false); break; } }
导出主要的函数为WriteOBJ(),WriteIGES()之类的一系列函数。当然导出的模型也可以继续导入。