版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用CsGL解析3DS模型。首先下载csgl.dll和csgl.native.dll两个dll。对csgl.dll添加引用。csgl.native.dll放在相同目录下。调用方式。H3DModel.FromFile("3DS文件名").DrawModel();usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.IO;usingSystem.Diagnostics;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingCsGL.OpenGL;namespaceModel3D{internalclassFileHead{//基本块publicstaticUInt32PRIMARY{get{return0x4D4D;}set{}}//主块publicstaticUInt32OBJECTINFO{get{return0x3D3D;}set{}} //网格对象的版本号publicstaticUInt32VERSION{get{return0x0002;}set{}} //.3ds文件的版本publicstaticUInt32EDITKEYFRAME{get{return0xB000;}set{}} //所有关键帧信息的头部//对象的次级定义(包括对象的材质和对象)publicstaticUInt32MATERIAL{get{return0xAFFF;}set{}} //保存纹理信息publicstaticUInt32OBJECT{get{return0x4000;}set{}} //保存对象的面、顶点等信息//材质的次级定义publicstaticUInt32MATNAME{get{return0xA000;}set{}} //保存材质名称publicstaticUInt32MATDIFFUSE{get{return0xA020;}set{}} //对象/材质的颜色publicstaticUInt32MATMAP{get{return0xA200;}set{}} //新材质的头部publicstaticUInt32MATMAPFILE{get{return0xA300;}set{}} //保存纹理的文件名publicstaticUInt32OBJECT_MESH{get{return0x4100;}set{}} //新的网格对象//OBJECT_MESH的次级定义publicstaticUInt32OBJECT_VERTICES{get{return0x4110;}set{}} //对象顶点publicstaticUInt32OBJECT_FACES{get{return0x4120;}set{}} //对象的面publicstaticUInt32OBJECT_MATERIAL{get{return0x4130;}set{}} //对象的材质publicstaticUInt32OBJECT_UV{get{return0x4140;}set{}} //对象的UV纹理坐标//转换字符publicstaticintbyte2int(byte[]buffer){returnBitConverter.ToInt32(buffer,0);}publicstaticfloatbyte2float(byte[]buffer){returnBitConverter.ToSingle(buffer,0);}}//定义3D点的类,用于保存模型中的顶点publicclassCVector3{publicfloatx,y,z;}//定义2D点类,用于保存模型的UV纹理坐标publicclassCVector2{publicfloatx,y;}//面的结构定义publicclasstFace{publicint[]vertIndex=newint[3];//顶点坐标publicint[]coordIndex=newint[3];//纹理坐标索引}//材质信息结构体publicclasstMaterialInfo{publicStringstrName="";//纹理名称publicStringstrFile="";//如果存在纹理映射,则表示纹理文件名称publicint[]color=newint[3];//对象的RGB颜色publicinttexureId;//纹理IDpublicfloatuTile;//u重复publicfloatvTile;//v重复publicfloatuOffset;//u纹理偏移publicfloatvOffset;//v纹理偏移}//对象信息结构体publicclasst3DObject{publicintnumOfVerts;//模型中顶点的数目publicintnumOfFaces;//模型中面的数目publicintnumTexVertex;//模型中纹理坐标的数目publicintmaterialID;//纹理IDpublicboolbHasTexture;//是否具有纹理映射publicStringstrName;//对象的名称publicCVector3[]pVerts;//对象的顶点publicCVector3[]pNormals;//对象的法向量publicCVector2[]pTexVerts;//纹理UV坐标publictFace[]pFaces;//对象的面信息}//模型信息结构体publicclasst3DMdoel{publicintnumOfObjects;//模型中对象的数目publicintnumOfMaterials;//模型中材质的数目publicList<tMaterialInfo>pMaterials=newList<tMaterialInfo>();//材质链表信息publicList<t3DObject>pObject=newList<t3DObject>();//模型中对象链表信息}publicclasstIndices{publicUInt16a,b,c,bVisible;}//保存块信息的结构publicclasstChunk{publicUInt32ID;//块的IDpublicUInt32length;//块的长度publicUInt32bytesRead;//需要读的块数据的字节数}publicclassCLoad3DS{privatetChunkm_CurrentChunk=newtChunk();privatetChunkm_TempChunk=newtChunk();privateFileStreamm_FilePointer;publicboolImport3DS(t3DMdoelpModel,StringstrFileName)//装入3ds文件到模型结构中{if(pModel==null)returnfalse;pModel.numOfMaterials=0;pModel.numOfObjects=0;try{this.m_FilePointer=newFileStream(strFileName,FileMode.Open);}catch(Exceptionex){Debug.WriteLine(ex.ToString());returnfalse;}//当文件打开之后,首先应该将文件最开始的数据块读出以判断是否是一个3ds文件//如果是3ds文件的话,第一个块ID应该是PRIMARY//将文件的第一块读出并判断是否是3ds文件ReadChunk(this.m_CurrentChunk);//读出块的id和块的size//确保是3ds文件if(m_CurrentChunk.ID!=FileHead.PRIMARY){Debug.WriteLine("UnabletoloadPRIMARYchuckfromfile:"+strFileName);returnfalse;}//现在开始读入数据,ProcessNextChunk()是一个递归函数//通过调用下面的递归函数,将对象读出ProcessNextChunk(pModel,m_CurrentChunk);//在读完整个3ds文件之后,计算顶点的法线ComputeNormals(pModel);m_FilePointer.Close();returntrue;}//读出3ds文件的主要部分voidProcessNextChunk(t3DMdoelpModel,tChunkpPreviousChunk){t3DObjectnewObject=newt3DObject();intversion=0;m_CurrentChunk=newtChunk();//下面每读一个新块,都要判断一下块的ID,如果该块是需要的读入的,则继续进行//如果是不需要读入的块,则略过//继续读入子块,直到达到预定的长度while(pPreviousChunk.bytesRead<pPreviousChunk.length){//读入下一个块ReadChunk(m_CurrentChunk);//判断ID号if(m_CurrentChunk.ID==FileHead.VERSION){m_CurrentChunk.bytesRead+=fread(refversion,m_CurrentChunk.length-m_CurrentChunk.bytesRead,m_FilePointer);//如果文件版本号大于3,给出一个警告信息if(version>3)Debug.WriteLine("Warning:This3DSfileisoverversion3soitmayloadincorrectly");}elseif(m_CurrentChunk.ID==FileHead.OBJECTINFO){//读入下一个块ReadChunk(m_TempChunk);//获得网络的版本号m_TempChunk.bytesRead+=fread(refversion,m_TempChunk.length-m_TempChunk.bytesRead,m_FilePointer);//增加读入的字节数m_CurrentChunk.bytesRead+=m_TempChunk.bytesRead;//进入下一个块ProcessNextChunk(pModel,m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.MATERIAL)//材质信息{//材质的数目递增pModel.numOfMaterials++;//在纹理链表中添加一个空白纹理结构pModel.pMaterials.Add(newtMaterialInfo());//进入材质装入函数ProcessNextMaterialChunk(pModel,m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.OBJECT)//对象的名称{//对象数目递增pModel.numOfObjects++;//添加一个新的tObject节点到对象的链表中pModel.pObject.Add(newt3DObject());//获得并保存对象的名称,然后增加读入的字节数m_CurrentChunk.bytesRead+=getStr(refpModel.pObject[pModel.numOfObjects-1].strName);//进入其余对象信息的读入ProcessNextObjectChunk(pModel,pModel.pObject[pModel.numOfObjects-1],m_CurrentChunk);}else{//跳过关键帧块的读入,增加需要读入的字节数EDITKEYFRAME//跳过所有忽略的块的内容的读入,增加需要读入的字节数while(m_CurrentChunk.bytesRead!=m_CurrentChunk.length){int[]b=newint[1];m_CurrentChunk.bytesRead+=fread(refb,1,m_FilePointer);}}//添加从最后块中读入的字节数pPreviousChunk.bytesRead+=m_CurrentChunk.bytesRead;}//当前快设置为前面的块m_CurrentChunk=pPreviousChunk;}//处理所有的文件中的对象信息voidProcessNextObjectChunk(t3DMdoelpModel,t3DObjectpObject,tChunkpPreviousChunk){m_CurrentChunk=newtChunk();//继续读入块的内容直至本子块结束while(pPreviousChunk.bytesRead<pPreviousChunk.length){ReadChunk(m_CurrentChunk);if(m_CurrentChunk.ID==FileHead.OBJECT_MESH)//正读入的是一个新块{//使用递归函数调用,处理该新块ProcessNextObjectChunk(pModel,pObject,m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.OBJECT_VERTICES)//读入的是对象顶点{ReadVertices(pObject,m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.OBJECT_FACES)//读入的是对象的面{ReadVertexIndices(pObject,m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.OBJECT_MATERIAL)//读入的是对象的材质名称{//该块保存了对象材质的名称,可能是一个颜色,也可能是一个纹理映射。//同时在该块中也保存了纹理对象所赋予的面//下面读入对象的材质名称ReadObjectMaterial(pModel,pObject,m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.OBJECT_UV)//读入对象的UV纹理坐标{ReadUVCoordinates(pObject,m_CurrentChunk);}else{//掠过不需要读入的块while(m_CurrentChunk.bytesRead!=m_CurrentChunk.length){int[]b=newint[1];m_CurrentChunk.bytesRead+=fread(refb,1,m_FilePointer);}}//添加从最后块中读入的字节数pPreviousChunk.bytesRead+=m_CurrentChunk.bytesRead;}//当前快设置为前面的块m_CurrentChunk=pPreviousChunk;}//处理所有的材质信息voidProcessNextMaterialChunk(t3DMdoelpModel,tChunkpPreviousChunk){//给当前块分配存储空间m_CurrentChunk=newtChunk();//继续读入这些块,直到该子块结束while(pPreviousChunk.bytesRead<pPreviousChunk.length){//读入下一块ReadChunk(m_CurrentChunk);//判断读入的是什么块if(m_CurrentChunk.ID==FileHead.MATNAME)//材质的名称{//读入材质的名称m_CurrentChunk.bytesRead+=fread(refpModel.pMaterials[pModel.numOfMaterials-1].strName,m_CurrentChunk.length-m_CurrentChunk.bytesRead,m_FilePointer);}elseif(m_CurrentChunk.ID==FileHead.MATDIFFUSE)//对象的RGB颜色{ReadColorChunk(pModel.pMaterials[pModel.numOfMaterials-1],m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.MATMAP)//纹理信息头部{//进入下一个材质块信息ProcessNextMaterialChunk(pModel,m_CurrentChunk);}elseif(m_CurrentChunk.ID==FileHead.MATMAPFILE){//读入材质文件名称m_CurrentChunk.bytesRead+=fread(refpModel.pMaterials[pModel.numOfMaterials-1].strName,m_CurrentChunk.length-m_CurrentChunk.bytesRead,m_FilePointer);}else{//掠过不需要读入的块while(m_CurrentChunk.bytesRead!=m_CurrentChunk.length){int[]b=newint[1];m_CurrentChunk.bytesRead+=fread(refb,1,m_FilePointer);}}//添加从最后块中读入的字节数pPreviousChunk.bytesRead+=m_CurrentChunk.bytesRead;}//当前快设置为前面的块m_CurrentChunk=pPreviousChunk;}//读下一个块privatevoidReadChunk(tChunkpChunk){//pChunk.bytesRead=fread(refpChunk.ID,2,this.m_FilePointer);Byte[]id=newByte[2];Byte[]length=newByte[4];pChunk.bytesRead=(UInt32)this.m_FilePointer.Read(id,0,2);pChunk.bytesRead+=(UInt32)this.m_FilePointer.Read(length,0,4);pChunk.ID=(UInt32)(id[1]*256+id[0]);pChunk.length=(UInt32)(((length[3]*256+length[2])*256+length[1])*256+length[0]);}//读入RGB颜色voidReadColorChunk(tMaterialInfopMaterial,tChunkpChunk){//读入颜色块信息ReadChunk(m_TempChunk);//读入RGB颜色m_TempChunk.bytesRead+=fread(refpMaterial.color,m_TempChunk.length-m_TempChunk.bytesRead,m_FilePointer);//增加读入的字节数pChunk.bytesRead+=m_TempChunk.bytesRead;}//读入顶点索引voidReadVertexIndices(t3DObjectpObject,tChunkpPreviousChunk){intindex=0;//读入该对象中面的数目pPreviousChunk.bytesRead+=fread(refpObject.numOfFaces,2,m_FilePointer);//分配所有的储存空间,并初始化结构pObject.pFaces=newtFace[pObject.numOfFaces];//遍历对象中所有的面for(inti=0;i<pObject.numOfFaces;i++){pObject.pFaces[i]=newtFace();for(intj=0;j<4;j++){//读入当前对象的第一个点pPreviousChunk.bytesRead+=fread(refindex,2,m_FilePointer);if(j<3){pObject.pFaces[i].vertIndex[j]=index;}}}}//读入对象的UV坐标voidReadUVCoordinates(t3DObjectpObject,tChunkpPreviousChunk){//为了读入对象的UV坐标,首先需要读入数量,再读入具体的数据//读入UV坐标的数量pPreviousChunk.bytesRead+=fread(refpObject.numTexVertex,2,m_FilePointer);//初始化保存UV坐标的数组pObject.pTexVerts=newCVector2[pObject.numTexVertex];//读入纹理坐标pPreviousChunk.bytesRead+=fread(refpObject.pTexVerts,pPreviousChunk.length-pPreviousChunk.bytesRead,m_FilePointer);}//读入对象的顶点voidReadVertices(t3DObjectpObject,tChunkpPreviousChunk){//在读入实际的顶点之前,首先必须确定需要读入多少个顶点。//读入顶点的数目pPreviousChunk.bytesRead+=fread(refpObject.numOfVerts,2,m_FilePointer);//分配顶点的储存空间,然后初始化结构体pObject.pVerts=newCVector3[pObject.numOfVerts];//读入顶点序列pPreviousChunk.bytesRead+=fread(refpObject.pVerts,pPreviousChunk.length-pPreviousChunk.bytesRead,m_FilePointer);//因为3DMax的模型Z轴是指向上的,将y轴和z轴翻转——y轴和z轴交换,再把z轴反向//遍历所有的顶点for(inti=0;i<pObject.numOfVerts;i++){floatfTempY=pObject.pVerts[i].y;pObject.pVerts[i].y=pObject.pVerts[i].z;pObject.pVerts[i].z=-1*fTempY;}}//读入对象的材质名称voidReadObjectMaterial(t3DMdoelpModel,t3DObjectpObject,tChunkpPreviousChunk){StringstrMaterial="";//用来保存对象的材质名称int[]buffer=newint[50000];//用来读入不需要的数据//读入赋予当前对象的材质名称pPreviousChunk.bytesRead+=getStr(refstrMaterial);//遍历所有的纹理for(inti=0;i<pModel.numOfMaterials;i++){//如果读入的纹理与当前纹理名称匹配if(strMaterial.Equals(pModel.pMaterials[i].strName)){//设置材质IDpObject.materialID=i;//判断是否是纹理映射,如果strFile是一个长度大于1的字符串,则是纹理if(pModel.pMaterials[i].strFile.Length>0){//设置对象的纹理映射标志pObject.bHasTexture=true;}break;}else{//如果该对象没有材质,则设置ID为-1pObject.materialID=-1;}}pPreviousChunk.bytesRead+=fread(refbuffer,pPreviousChunk.length-pPreviousChunk.bytesRead,m_FilePointer);}//下面的这些函数主要用来计算顶点的法向量,顶点的法向量主要用来计算光照//计算对象的法向量privatevoidComputeNormals(t3DMdoelpModel){CVector3vVector1,vVector2,vNormal;CVector3[]vPoly;vPoly=newCVector3[3];//如果模型中没有对象,则返回if(pModel.numOfObjects<=0)return;//遍历模型中所有的对象for(intindex=0;index<pModel.numOfObjects;index++){//获得当前对象t3DObjectpObject=pModel.pObject[index];//分配需要的空间CVector3[]pNormals=newCVector3[pObject.numOfFaces];CVector3[]pTempNormals=newCVector3[pObject.numOfFaces];pObject.pNormals=newCVector3[pObject.numOfVerts];//遍历对象所有面for(inti=0;i<pObject.numOfFaces;i++){vPoly[0]=pObject.pVerts[pObject.pFaces[i].vertIndex[0]];vPoly[1]=pObject.pVerts[pObject.pFaces[i].vertIndex[1]];vPoly[2]=pObject.pVerts[pObject.pFaces[i].vertIndex[2]];//计算面的法向量vVector1=Vector(vPoly[0],vPoly[2]);vVector2=Vector(vPoly[2],vPoly[1]);vNormal=Cross(vVector1,vVector2);pTempNormals[i]=vNormal;vNormal=Normalize(vNormal);pNormals[i]=vNormal;}//下面求顶点的法向量CVector3vSum=newCVector3();vSum.x=0;vSum.y=0;vSum.z=0;intshared=0;//遍历所有的顶点for(inti=0;i<pObject.numOfVerts;i++){for(intj=0;j<pObject.numOfFaces;j++){if(pObject.pFaces[j].vertIndex[0]==i||pObject.pFaces[j].vertIndex[1]==i||pObject.pFaces[j].vertIndex[2]==i){vSum=AddVector(vSum,pTempNormals[j]);shared++;}}pObject.pNormals[i]=DivideVectorByScaler(vSum,(float)(-1*shared));//规范化最后的顶点法向量pObject.pNormals[i]=Normalize(pObject.pNormals[i]);vSum.x=0;vSum.y=0;vSum.z=0;shared=0;}}}//求两点决定的矢量CVector3Vector(CVector3p1,CVector3p2){CVector3v=newCVector3();v.x=p1.x-p2.x;v.y=p1.y-p2.y;v.z=p1.z-p2.z;returnv;}//返回两个矢量的和CVector3AddVector(CVector3p1,CVector3p2){CVector3v=newCVector3();v.x=p1.x+p2.x;v.y=p1.y+p2.y;v.z=p1.z+p2.z;returnv;}//返回矢量的缩放CVector3DivideVectorByScaler(CVector3v,floatScaler){CVector3vr=newCVector3();vr.x=v.x/Scaler;vr.y=v.y/Scaler;vr.z=v.z/Scaler;returnvr;}//返回两个矢量的叉积CVector3Cross(CVector3p1,CVector3p2){CVector3c=newCVector3();c.x=((p1.y*p2.z)-(p1.z*p2.y));c.y=((p1.z*p2.x)-(p1.x*p2.z));c.z=((p1.x*p2.y)-(p1.y*p2.x));returnc;}//规范化矢量CVector3Normalize(CVector3v){CVector3n=newCVector3();doublemag=Mag(v);n.x=v.x/(float)mag;n.y=v.y/(float)mag;n.z=v.z/(float)mag;returnn;}//矢量的模doubleMag(CVector3v){returnMath.Sqrt(v.x*v.x+v.y*v.y+v.z*v.z);}//读出一个字符串uintgetStr(refStringstr){str="";charc=(char)m_FilePointer.ReadByte();while(c!=0){str+=c;c=(char)m_FilePointer.ReadByte();}return(uint)(str.Length+1);}//读出byte数组publicstaticuintfread(refint[]buffer,uintlength,FileStreamf){for(uinti=0;i<length;i++){try{buffer[i]=f.ReadByte();}catch(Exceptionex){Debug.WriteLine(f.Name+"读取出错");Debug.WriteLine(ex.ToString());returni;}}returnlength;}//读出2个字节或4个字节的intpublicstaticuintfread(refintbuffer,uintlength,FileStreamf){if(length==2){Byte[]buf=newByte[2];uintlen=(UInt32)f.Read(buf,0,2);buffer=(buf[1]*256+buf[0]);returnlen;}elseif(length==4){Byte[]buf=newByte[4];uintlen=(UInt32)f.Read(buf,0,4);buffer=(((buf[3]*256+buf[2])*256+buf[1])*256+buf[0]);returnlen;}return0;}//读出CVector3数组publicstaticuintfread(refCVector3[]buffer,uintlength,FileStreamf){uintl=0;try{for(uinti=0;i<length/12;i++){buffer[i]=newCVector3();Byte[]bts=newByte[4];l+=(uint)f.Read(bts,0,4);buffer[i].x=FileHead.byte2float(bts);l+=(uint)f.Read(bts,0,4);buffer[i].y=FileHead.byte2float(bts);l+=(uint)f.Read(bts,0,4);buffer[i].z=FileHead.byte2float(bts);}returnl;}catch(Exceptionex){Debug.WriteLine(f.Name+"读取出错");Debug.WriteLine(ex.ToString());returnl;}}//读出CVector数组publicstaticuintfread(refCVector2[]buffer,uintlength,FileStreamf){uintl=0;try{for(uinti=0;i<length/8;i++){buffer[i]=newCVector2();Byte[]bts=newByte[4];l+=(uint)f.Read(bts,0,4);buffer[i].x=FileHead.byte2float(bts);l+=(uint)f.Read(bts,0,4);buffer[i].y=FileHead.byte2float(bts);}returnl;}catch(Exceptionex){Debug.WriteLine(f.Name+"读取出错");Debug.WriteLine(ex.ToString());returnl;}}//读出字符串publicstaticuintfread(refStringbuffer,uintlength,FileStreamf){uintl=0;buffer="";try{for(inti=0;i<length;i++){Byte[]b=newByte[1];l+=(uint)f.Read(b,0,1);if(i!=length-1)buffer+=(char)(b[0]);}returnl;}catch(Exceptionex){Debug.WriteLine(f.Name+"读取出错");Debug.WriteLine(ex.ToString());returnl;}}}publicclassH3DModel{publicconstintCHANGE=1;publicconstintIGNORE=2;publicconstintADD=3;t3DMdoelmodel=null;uint[]g_Texture;CVector3boxMin,boxMax;publicH3DModel(){this.model=newt3DMdoel();}publicstaticH3DModelFromFile(stringfileName)//从文件中加载3D模型{H3DModelh3d=newH3DModel();CLoad3DSload=newCLoad3DS();load.Import3DS(h3d.model,fileName);if(!h3d.LoadTextrue())returnnull;h3d.LoadBox();returnh3d;}publict3DMdoelgetModelData()//得到3D模型数据{returnthis.model;}protectedboolLoadTextrue(){this.g_Texture=newuint[100];for(inti=0;i<model.numOfMaterials;i++){if(model.pMaterials[i].strFile.Length>0)if(!CreateTexture(refthis.g_Texture,model.pMaterials[i].strFile,i))returnfalse;model.pMaterials[i].texureId=i;}returntrue;}protectedvoidLoadBox(){boxMax=newCVector3();boxMin=newCVector3();boxMax.x=float.MinValue;boxMax.y=float.MinValue;boxMax.z=float.MinValue;boxMin.x=float.MaxValue;boxMin.y=float.MaxValue;boxMin.z=float.MaxValue;for(inti=0;i<model.numOfObjects;i++){t3DObjectpObject=model.pObject[i];for(intj=0;j<pObject.numOfVerts;j++){floatx=pObject.pVerts[j].x;floaty=pObject.pVerts[j].y;floatz=pObject.pVerts[j].z;if(boxMin.x>x)boxMin.x=x;if(boxMin.y>y)boxMin.y=y;if(boxMin.z>z)boxMin.z=z;if(boxMax.x<x)boxMax.x=x;if(boxMax.y<y)boxMax.y=y;if(boxMax.z<z)boxMax.z=z;}}}protectedboolCreateTexture(refuint[]textureArray,StringstrFileName,inttextureID){Bitmapimage=null;try{image=newBitmap(strFileName);}catch(ArgumentException){Debug.WriteLine("Couldnotload"+strFileName+".");returnfalse;}if(image!=null){image.RotateFlip(RotateFlipType.RotateNoneFlipY);BitmapDatabitmapdata;Rectanglerect=newRectangle(0,0,image.Width,image.Height);bitmapdata=image.LockBits(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024木地板安装合同
- 二零二五年度厂房土地转让附带产业规划及园区配套设施合同2篇
- 企业物联网技术开发与应用服务合同
- 2024年车牌租赁维修服务合同
- 2025年海南建筑安全员《A证》考试题库
- 二零二五年度高端餐厅经营管理权转让及品牌推广合同3篇
- 2024年甲乙双方关于五金制品采购的合同包含了产品的交付和验收
- 荔枝课程设计
- 2024版安能物流运输合同范本
- 农业现代化智能农业装备开发方案
- 40篇英语短文搞定高考3500个单词(全部)
- 《社会工作的理论》课件
- 2021电力建设项目工程总承包管理规范
- 2024年茂名市高三第一次综合测试(一模)化学试卷(含答案)
- (常州卷)江苏省常州市2023-2024学年五年级上学期期末考试质量调研数学试卷一(苏教版)
- 教练式沟通培训课件
- 医养结合养老院(养老中心)项目可行性报告
- 初三语文总复习全程计划表
- 电子技术基础与技能-机工教案第九章教案555集成定时器介绍
- 污水处理运行质量保证措施
- 食材供货及质量保障措施方案
评论
0/150
提交评论