zoukankan      html  css  js  c++  java
  • Eyeshot Ultimate 学习笔记(2)

    导入模型

    一般情况下,我们自己搭建模型的功力还不够,大多都是在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(@"....Modelsdemo.obj", FileMode.Open); //obj
    FileStream fs2 = new FileStream(@"....Modelsdemo.mtl", FileMode.Open); //mtl
    FileStream fs3 = new FileStream(@"....Modelsdemo.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()之类的一系列函数。当然导出的模型也可以继续导入。

  • 相关阅读:
    Undergound Heaven [only_for_information]
    Essential Booklist of .Net Framework
    Thinkpad T4x 风扇转速档位控制
    Hot scene AGAIN!
    JavaScript使用技巧精萃
    今天项目中遇到的一个问题:判断新闻Id是否存在
    C++编译过程中"没有找到MFC80UD.DLL,因此这个程序未能启动.重新安装应用程序可能会修复此问题"? 的彻底解决
    SQL操作全集
    关于UrlReferrer传值的几点注意
    在ASP.Net2.0中使用UrlRewritingNet实现链接重写(转)
  • 原文地址:https://www.cnblogs.com/theblueberry/p/4228085.html
Copyright © 2011-2022 走看看