read_ifc代码如下:
Write_ifc代码分析如下:
(1)将数字转换为字符串的函数。
function ntoc,a return,string(a,format='(g0)') end
(2)程序的开始和结尾,分号;代表注释
pro 程序名
end
pro write_ifc
;......
end
FILE='D:1.3D';要读写的3D文件路径
格式:openr 变量1,'文件名'[,/delete][,/error=变量2][,/get_lun]
功能:按照变量指定的逻辑设备号,以只读方式打开已经存在的文件
说明:1.变量1,指定的逻辑设备设备号
2.文件名:要打开的文件的名字,可以包含盘符和路径
3.[,/delete]:在使用Close命令关闭文件时,同时删除该文件
4.Ereor=变量2:在打开文件出现错误时,将错误信息存入变量2
5./get_lun :申请一个100-128中当前还没有被使用的合法逻辑设备号 。
openr,fp,file,/get_lun;申请的逻辑设备号放在fp中,以只读方式打开文件file
result=lonarr(n):返回指定长度为n的有符号长整型数组
num=lonarr(3);返回长度为3的有符号长整型数组
格式:readf,设备号变量,变量1,...变量n[,/format='(格式描述)']
功能:按照格式描述的格式从设备号变量所对应的文本文件中读取多种类型的数据,并以此读取到变量1,,,,,,变量n中
说明:设备号变量是打开文件时候付给该文件的逻辑设备号。
readf,fp,num;从sp标示的文件中读取3个数字存入 num中
r=lonarr(4);返回长度为4的有符号长整型数组
r[0]=10,表示点数,r[1]=5,表示面数,r[2]=0,r[3]=64,表示组成面表的数字。
readf,fp,r
str=''
readf,fp,str;读一个字符串
nip=r[3]
ip=lonarr(nip)
readf,fp,ip ;面表
function ntoc,a return,string(a,format='(g0)') end pro write_ifc ;file='E:几个工区昆明20130402打通格式ifc1.3D' FILE='D:IDL-毛工作7.3-下午1.3D' openr,fp,file,/get_lun num=lonarr(3) readf,fp,num r=lonarr(4); readf,fp,r str='' readf,fp,str nip=r[3];nip=64 ip=lonarr(nip);64大小的数组 readf,fp,ip ;面表 np=r[0];np=10;np三维图形中点数 p=dblarr(3,np);双精度浮点型数组 readf,fp,p ;三维图形中10个点的坐标表 free_lun,fp ;;============ newFile='D:2.ifc' openw,fp,newFile,/get_lun printf,fp,'ISO-10303-21;' printf,fp,'HEADER;' printf,fp,"FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');" printf,fp,"FILE_NAME($,'2013-06-28T10:41:04',(''),(''),'Autodesk Revit 2013','20121003_2115(x64)','');" printf,fp,"FILE_SCHEMA(('IFC2X3'));" printf,fp,"ENDSEC;" printf,fp,"DATA;" printf,fp,"#1= IFCORGANIZATION($,'Autodesk Revit 2013',$,$,$);" printf,fp,"#2= IFCAPPLICATION(#1,'2013','Autodesk Revit 2013','Revit');" printf,fp,"#3= IFCCARTESIANPOINT((0.,0.,0.));" printf,fp,"#5= IFCCARTESIANPOINT((0.,0.));" printf,fp,"#7= IFCDIRECTION((1.,0.,0.));" printf,fp,"#9= IFCDIRECTION((-1.,0.,0.));" printf,fp,"#11= IFCDIRECTION((0.,1.,0.));" printf,fp,"#13= IFCDIRECTION((0.,-1.,0.));" printf,fp,"#15= IFCDIRECTION((0.,0.,1.));" printf,fp,"#17= IFCDIRECTION((0.,0.,-1.));" printf,fp,"#19= IFCDIRECTION((1.,0.));" printf,fp,"#21= IFCDIRECTION((-1.,0.));" printf,fp,"#23= IFCDIRECTION((0.,1.));" printf,fp,"#25= IFCDIRECTION((0.,-1.));" printf,fp,"#27= IFCSIUNIT(*,.LENGTHUNIT.,.MILLI.,.METRE.);" printf,fp,"#28= IFCSIUNIT(*,.AREAUNIT.,.MILLI.,.SQUARE_METRE.);" printf,fp,"#29= IFCSIUNIT(*,.VOLUMEUNIT.,.MILLI.,.CUBIC_METRE.);" printf,fp,"#30= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);" printf,fp,"#31= IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);" printf,fp,"#32= IFCMEASUREWITHUNIT(IFCRATIOMEASURE(0.0174532925199433),#30);" printf,fp,"#33= IFCCONVERSIONBASEDUNIT(#31,.PLANEANGLEUNIT.,'DEGREE',#32);" printf,fp,"#34= IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.);" printf,fp,"#35= IFCUNITASSIGNMENT((#27,#28,#29,#33,#34));" printf,fp,"#37= IFCAXIS2PLACEMENT3D(#3,$,$);" bh=37;逻辑编号#37,先存起来 bhs=lonarr(np);np点数 for k=0,np-1 do begin;k由np控制循环10次,np是点数,(x,y,z) bh=bh+2 printf,fp,'#'+ntoc(bh)+'= IFCCARTESIANPOINT(('+$ ntoc(p[0,k])+','+ntoc(p[1,k])+','+ntoc(p[2,k])+'));' bhs[k]=bh;bhs[0]=#... endfor nip=nip/4;几个面,nip=16 ip=reform(ip,4,nip) facebh=lonarr(nip) for i=0,nip-1 do begin ;ip[4,nip]即ip=[4,16] dh=ip[1:3,i] a=bhs[dh];bhs[0,1,2]当i=0时候。a[0]=bhs[0]=39,当i=1, bh=bh+2;bh=59 printf,fp,'#'+ntoc(bh)+'= IFCPOLYLOOP((#'+$ ntoc(a[0])+',#'+ntoc(a[1])+',#'+ntoc(a[2])+'));' bh=bh+2 printf,fp,'#'+ntoc(bh)+'= IFCFACEOUTERBOUND(#'+ntoc(bh-2)+',.T.);' bh=bh+1 printf,fp,'#'+ntoc(bh)+'= IFCFACE((#'+ntoc(bh-1)+'));' facebh[i]=bh endfor bh=bh+2 str='#'+ntoc(bh)+'= IFCCLOSEDSHELL((' str=str+strjoin('#'+ntoc(facebh),',') str=str+'));' printf,fp,str ;#2113= IFCPOLYLOOP((#447,#159,#161)); ;#2115= IFCFACEOUTERBOUND(#2113,.T.); ;#2116= IFCFACE((#2115)); ;#34623= IFCCLOSEDSHELL((#2116,#2121,#2126,#2131,#2136,#214 ;#34625= IFCFACETEDBREP(#34623); free_lun,fp end