4Misc_Start'4Platform@9VersionCheck xHH@Rg(HHdh xHH@Rg(HHdh x HH@Rg(HHdh ^Graph*WDashSettings#  !4 4 4 4 4 4 homeKKd(C:Users:ag:Desktop:Projects in Progress:STL:MRecentWindows3D Graphics.ihfAdvanced Topics.ihfAnalysis.ihfCurve Fitting.ihfData Folders.ihfDemoLoader.ipfDialog Help.ihfErrors.ihfGetting Started.ihfgizmo0 Infogizmo0:mesh_0,mesh_1gizmo0_1 Infogizmo0_1:mesh_0,mesh_1Igor Reference.ihfInteracting with the User.ihfProgramming.ihf 4Misc_End'tXOPState_Start@'SQL64MMI64TMMI64 # MMIstate-begin # MMIstate-end 4XOPState_End'\2•newgizmo •gizmo0() •boundingball mesh_0 !p0bU V V-meshT????xxwxxwwVC~JNVf5JN>6$f5>f56$` 6$` ` RR<ۏRTb<ۏv>-<ۏTb-v>-TbNggv>--&Ngg-Ngg?Ngg&-?Ngg?&v>-@Ngg?-?Tb@v>-@-?<ۏ@v>-@Tb@@<ۏ@Tb@R@<ۏ@@@R@@@R@@` A@@A@` A6$AA` Af5AA6$A>Af5A6$AJNAf5A>AVAJNA>AjfAJNAVAlAjfAVA~O}AjfAlA;A~O}AlAAJNAVAf5AJNA>A6$Af5A>AAf5A6$A` AA6$A@A` A@@` AR@@@@R@@<ۏ@R@@Tb@<ۏ@@v>-@<ۏ@Tb@-?v>-@Tb@Ngg?v>-@-?&Ngg?-?NggNgg?&-Ngg&v>-Ngg-Tbv>--<ۏv>-Tb<ۏTbR<ۏRR` ` 6$` f56$>f56$JNf5>VJN>jfJNVljfV~O}jfl;~O}l-<ۏ<ۏv>-<ۏv>-Nggv>-v>-Nggv>-NggNgg?NggNggNgg?NggNgg?v>-@Ngg?Ngg?v>-@Ngg?v>-@<ۏ@v>-@v>-@<ۏ@v>-@<ۏ@R@<ۏ@<ۏ@R@<ۏ@R@@R@R@@R@@A@@A@Af5AAAf5AAf5AJNAf5Af5AJNAf5AJNAjfAJNAJNAjfAJNAjfA~O}AjfAjfA~O}AjfA~O}A-@<ۏ@<ۏ@v>-@<ۏ@v>-@Ngg?v>-@v>-@Ngg?v>-@Ngg?NggNgg?Ngg?NggNgg?Nggv>-NggNggv>-Nggv>-<ۏv>-v>-<ۏv>-<ۏR<ۏ<ۏR<ۏRRRRf5f5f5JNf5f5JNf5JNjfJNJNjfJNjf~O}jfjf~O}jf~O}-<ۏ<ۏv>-<ۏv>-Nggv>-v>-Nggv>-NggNgg?NggNggNgg?NggNgg?v>-@Ngg?Ngg?v>-@Ngg?v>-@<ۏ@v>-@v>-@<ۏ@v>-@<ۏ@R@<ۏ@<ۏ@R@<ۏ@R@@R@R@@R@@A@@A@Af5AAAf5AAf5AJNAf5Af5AJNAf5AJNAjfAJNAJNAjfAJNAjfA~O}AjfAjfA~O}AjfA~O}A-@<ۏ@<ۏ@v>-@<ۏ@v>-@Ngg?v>-@v>-@Ngg?v>-@Ngg?NggNgg?Ngg?NggNgg?Nggv>-NggNggv>-Nggv>-<ۏv>-v>-<ۏv>-<ۏR<ۏ<ۏR<ۏRRRRf5f5f5JNf5f5JNf5JNjfJNJNjfJNjf~O}jfjf~O}jf~O}&V6$&>pS&6$` pS6$(upS` (u` (u+фTb+ф +фTb-㿝 TbU -&U-㿆U?U&-?U?& @U?-?Tb@ @-?+ф@ @Tb@@+ф@Tb@@+ф@@@@@(u@@@` A(u@@pSA(u@` A6$ApSA` A&ApSA6$A>A&A6$AVA&A>AA&AVA6$A&A>ApSA&A6$A` ApSA6$A(u@pSA` A@(u@` A@(u@@@@@+ф@@@Tb@+ф@@ @+ф@Tb@-? @Tb@U? @-?&U?-?UU?&-㿆U& U-Tb -+ф Tb+фTb+ф(u` (upS(u` 6$pS` &pS6$>&6$V&><&Vl<VQ<l;QleQ;Ge;mxeGImxGmxIAI3MAz3MAW3Mz /WzrW /ݰr /urݰuݰ%-u~<%-٣%-~<٣~<3v٣w3v3vw3v3v3v3v3v3v٣3v3v٣3v٣%-٣٣%-٣%-u%-%-u%-uruururWrrWrW3MWW3MW3M3M3M3MmxmxmxemxmxemxeQeeQeQ- <ۏU v>-NggUv>-U?UNggNgg?U?Nggv>-@U?Ngg? @U?v>-@<ۏ@ @v>-@+ф@ @<ۏ@R@+ф@<ۏ@@+ф@R@@@R@(u@@@A(u@@pSA(u@Af5ApSAA&ApSAf5AJNA&Af5A-@ @<ۏ@U? @v>-@Ngg?U?v>-@UU?Ngg?NggUNgg?v>-UNgg Uv>-<ۏ v>-+ф <ۏR+ф<ۏ+фRR(u(upS(uf5pS&pSf5JN&f5<&JNjf9A6$Z9A>VZ>YrZVlYrV!Yrl;!lx!;Gx;01xGI01G01IAIAzAz /z: /ݰ: /$e:ݰ$eݰЏ$e~<Џ״Џ~<״~<״w/w/w//w//ww״~<״Џ״~<Џ~<$eЏݰ$e:$eݰ /:ݰ: /z /zAzAIA01IG01Ix01G;xG!x;l!;Yr!lVYrlZYrV>ZV9AZ>6$9A>(9A6$` (6$v (` v ` ,v ,g4,Tbg4ۡfg4Tb-ۡfTb?ۡf-?-???-???ۡf@??-?Tb@ۡf@-?g4@ۡf@Tb@@g4@Tb@,@g4@@@,@@v A,@@` Av A@(Av A` A6$A(A` A9AA(A6$A>A9AA6$AZA9AA>AVAZA>AYrAZAVAlAYrAVA!AYrAlA;A!AlAxA!A;AGAxA;A01AxAGAIA01AGAA01AIAAAAIAAAAAzAAAAAAzA /AAzA:AA /AݰA:A /A$eA:AݰAA$eAݰAЏA$eAA~AZAVA9AAZA>A6$A9AA>A(A9AA6$A` A(A6$Av A(A` A@v A` A,@v A@@,@@g4@,@@Tb@g4@@ۡf@g4@Tb@-?ۡf@Tb@??ۡf@-?Q'??-?hZ??hZ'?hZ??hZ'hZ??hZ'??ۡf@????ۡf@??ۡf@g4@ۡf@ۡf@g4@ۡf@g4@,@g4@g4@,@g4@,@v A,@,@v A,@v A(Av Av A(Av A(A9AA(A(A9AA(A9AAZA9AA9AAZA9AAZAYrAZAZAYrAZAYrA!AYrAYrA!AYrA!AxA!A!AxA!AxA01AxAxA01AxA01AA01A01AA01AAAAAAAAAAAAAA:AAA:AA:A$eA:A:A$eA:A$eAЏA$eA$eAЏA$eAЏA״AЏAЏA״AЏA״AA״A״AA״AA/AAA/AA/A/A/A/A/A/A/AA/A/AA/AA״AAA״AA״AЏA״A״AЏA״AЏA$eAЏAЏA$eAЏA$eA:A$eA$eA:A$eA:AA:A:AA:AAAAAAAAAAAAAA01AAA01AA01AxA01A01AxA01AxA!AxAxA!AxA!AYrA!A!AYrA!AYrAZAYrAYrAZAYrAZA9AAZAZA9AAZA9AA(A9AA9AA(A9AA(Av A(A(Av A(Av A,@v Av A,@v A,@g4@,@,@g4@,@g4@ۡf@g4@g4@ۡf@g4@ۡf@??ۡf@ۡf@??ۡf@???????????ۡf??ۡf?ۡfg4ۡfۡfg4ۡfg4,g4g4,g4,v ,,v ,v (v v (v (9A((9A(9AZ9A9AZ9AZYrZZYrZYr!YrYr!Yr!x!!x!x01xx01x01010101:::$e::$e:$eЏ$e$eЏ$eЏ״ЏЏ״Џ״״״״////////////״״״Џ״״Џ״Џ$eЏЏ$eЏ$e:$e$e:$e::::010101x0101x01x!xx!x!Yr!!Yr!YrZYrYrZYrZ9AZZ9AZ9A(9A9A(9A(v ((v (v ,v v ,v ,g4,,g4,g4ۡfg4g4ۡfg4ۡf?ۡfۡf?ۡf?hZ????hZ'??hZ?hZ'hZ?hZ'?ۡf??ۡf?ۡfg4ۡfۡfg4ۡfg4,g4g4,g4,v ,,v ,v (v v (v (9A((9A(9AZ9A9AZ9AZYrZZYrZYr!YrYr!Yr!x!!x!x01xx01x01010101:::$e::$e:$eЏ$e$eЏ$eЏ״ЏЏ״Џ״״״״////////////״״״Џ״״Џ״Џ$eЏЏ$eЏ$e:$e$e:$e::::010101x0101x01x!xx!x!Yr!!Yr!YrZYrYrZYrZ9AZZ9AZ9A(9A9A(9A(v ((v (v ,v v ,v ,g4,,g4,g4ۡfg4g4ۡfg4ۡf?ۡfۡf?ۡf??????????ۡf@????ۡf@??ۡf@g4@ۡf@ۡf@g4@ۡf@g4@,@g4@g4@,@g4@,@v A,@,@v A,@v A(Av Av A(Av A(A9AA(A(A9AA(A9AAZA9AA9AAZA9AAZAYrAZAZAYrAZAYrA!AYrAYrA!AYrA!AxA!A!AxA!AxA01AxAxA01AxA01AA01A01AA01AAAAAAAAAAAAAA:AAA:AA:A$eA:A:A$eA:A$eAЏA$eA$eAЏA$eAЏA״AЏAЏA״AЏA״AA״A״AA״AA/AAA/AA/A/A/A/A/A/A/AA/A/AA/AA״AAA״AA״AЏA״A״AЏA״AЏA$eAЏAЏA$eAЏA$eA:A$eA$eA:A$eA:AA:A:AA:AAAAAAAAAAAAAA01AAA01AA01AxA01A01AxA01AxA!AxAxA!AxA!AYrA!A!AYrA!AYrAZAYrAYrAZAYrAZA9AAZAZA9AAZA9AA(A9AA9AA(A9AA(Av A(A(Av A(Av A,@v Av A,@v A,@g4@,@,@g4@,@g4@ۡf@g4@g4@ۡf@g4@ۡf@??ۡf@ۡf@??ۡf@??7-??Q'-?7-Q'7Tb@?-?U@?Tb@@U@Tb@@U@@@@@~D@@@` A~D@@"A~D@` A6$A"A` AIA"A6$A>AIA6$ARq1AIA>AVARq1A>AIrGARq1AVAlAIrGAVA(\AIrGAlA;A(\AlAppoA(\A;AGAppoA;AAppoAGAIAAGAAAIAAAAIAAAAAzAAAA /AAzAAA /AݰAA /As6AAݰAAs6AݰA-rAs6AA~ARq1AVAIARq1A>A6$AIA>A"AIA6$A` A"A6$A~D@"A` A@~D@` A@~D@@@@@U@@@Tb@U@@?U@Tb@-??Tb@?-?-?-տ-Tbտ-㿴UտTbUTbU~D` ~D"~D` 6$"` I"6$>I6$Rq1I>VRq1>IrGRq1VlIrGV(\IrGl;(\lppo(\;Gppo;ppoGIGIAIAzA /z /ݰ /s6ݰs6ݰ-rs6~<-r/-r~Rq1VIRq1>6$I>"I6$` "6$~D"` ~D` ~DUTbUտUTb-տTb7տ-7տտ7'տ7?7'7?7'?U@??U@?U@@U@U@@U@@~D@@@~D@@~D@"A~D@~D@"A~D@"AIA"A"AIA"AIARq1AIAIARq1AIARq1AIrGARq1ARq1AIrGARq1AIrGA(\AIrGAIrGA(\AIrGA(\AppoA(\A(\AppoA(\AppoAAppoAppoAAppoAAAAAAAAAAAAAAAAAAAAs6AAAs6AAs6A-rAs6As6A-rAs6A-rA/A-rA-rA/A-rA/A(ʤA/A/A(ʤA/A(ʤAݥA(ʤA(ʤAݥA(ʤAݥAݥAݥAݥAݥAݥAݥA(ʤAݥAݥA(ʤAݥA(ʤA/A(ʤA(ʤA/A(ʤA/A-rA/A/A-rA/A-rAs6A-rA-rAs6A-rAs6AAs6As6AAs6AAAAAAAAAAAAAAAAAAAAppoAAAppoAAppoA(\AppoAppoA(\AppoA(\AIrGA(\A(\AIrGA(\AIrGARq1AIrGAIrGARq1AIrGARq1AIARq1ARq1AIARq1AIA"AIAIA"AIA"A~D@"A"A~D@"A~D@@~D@~D@@~D@@U@@@U@@U@?U@U@?U@????տտտUտտUտUUUU~D~D~D"~D~D"~D"I""I"IRq1IIRq1IRq1IrGRq1Rq1IrGRq1IrG(\IrGIrG(\IrG(\ppo(\(\ppo(\ppoppoppoppos6s6s6-rs6s6-rs6-r/-r-r/-r/(ʤ//(ʤ/(ʤݥ(ʤ(ʤݥ(ʤݥݥݥݥݥݥݥ(ʤݥݥ(ʤݥ(ʤ/(ʤ(ʤ/(ʤ/-r//-r/-rs6-r-rs6-rs6s6s6s6ppoppoppo(\ppoppo(\ppo(\IrG(\(\IrG(\IrGRq1IrGIrGRq1IrGRq1IRq1Rq1IRq1I"II"I"~D""~D"~D~D~D~DUUUտUUտUտ7??7'?7տ7'7տ7'տUտտUտUUUU~D~D~D"~D~D"~D"I""I"IRq1IIRq1IRq1IrGRq1Rq1IrGRq1IrG(\IrGIrG(\IrG(\ppo(\(\ppo(\ppoppoppoppos6s6s6-rs6s6-rs6-r/-r-r/-r/(ʤ//(ʤ/(ʤݥ(ʤ(ʤݥ(ʤݥݥݥݥݥݥݥ(ʤݥݥ(ʤݥ(ʤ/(ʤ(ʤ/(ʤ/-r//-r/-rs6-r-rs6-rs6s6s6s6ppoppoppo(\ppoppo(\ppo(\IrG(\(\IrG(\IrGRq1IrGIrGRq1IrGRq1IRq1Rq1IRq1I"II"I"~D""~D"~D~D~D~DUUUտUUտUտտտտ???U@??U@?U@@U@U@@U@@~D@@@~D@@~D@"A~D@~D@"A~D@"AIA"A"AIA"AIARq1AIAIARq1AIARq1AIrGARq1ARq1AIrGARq1AIrGA(\AIrGAIrGA(\AIrGA(\AppoA(\A(\AppoA(\AppoAAppoAppoAAppoAAAAAAAAAAAAAAAAAAAAs6AAAs6AAs6A-rAs6As6A-rAs6A-rA/A-rA-rA/A-rA/A(ʤA/A/A(ʤA/A(ʤAݥA(ʤA(ʤAݥA(ʤAݥAݥAݥAݥAݥAݥAݥA(ʤAݥAݥA(ʤAݥA(ʤA/A(ʤA(ʤA/A(ʤA/A-rA/A/A-rA/A-rAs6A-rA-rAs6A-rAs6AAs6As6AAs6AAAAAAAAAAAAAAAAAAAAppoAAAppoAAppoA(\AppoAppoA(\AppoA(\AIrGA(\A(\AIrGA(\AIrGARq1AIrGAIrGARq1AIrGARq1AIARq1ARq1AIARq1AIA"AIAIA"AIA"A~D@"A"A~D@"A~D@@~D@~D@@~D@@U@@@U@@U@?U@U@?U@??7'7'?7'?U@??U@?U@@U@U@@U@@~D@@@~D@@~D@"A~D@~D@"A~D@"AIA"A"AIA"AIARq1AIAIARq1AIARq1AIrGARq1ARq1AIrGARq1AIrGA(\AIrGAIrGA(\AIrGA(\AppoA(\A(\AppoA(\AppoAAppoAppoAAppoAAAAAAAAAAAAAAAAAAAAs6AAAs6AAs6A-rAs6As6A-rAs6A-rA/A-rA-rA/A-rA/A(ʤA/A/A(ʤA/A(ʤAݥA(ʤA(ʤAݥA(ʤAݥAݥAݥAݥAݥAݥAݥA(ʤAݥAݥA(ʤAݥA(ʤA/A(ʤA(ʤA/A(ʤA/A-rA/A/A-rA/A-rAs6A-rA-rAs6A-rAs6AAs6As6AAs6AAAAAAAAAAAAAAAAAAAAppoAAAppoAAppoA(\AppoAppoA(\AppoA(\AIrGA(\A(\AIrGA(\AIrGARq1AIrGAIrGARq1AIrGARq1AIARq1ARq1AIARq1AIA"AIAIA"AIA"A~D@"A"A~D@"A~D@@~D@~D@@~D@@U@@@U@@U@?U@U@?U@????տտտUտտUտUUUU~D~D~D"~D~D"~D"I""I"IRq1IIRq1IRq1IrGRq1Rq1IrGRq1IrG(\IrGIrG(\IrG(\ppo(\(\ppo(\ppoppoppoppos6s6s6-rs6s6-rs6-r/-r-r/-r/(ʤ//(ʤ/(ʤݥ(ʤ(ʤݥ(ʤݥݥݥݥݥݥݥ(ʤݥݥ(ʤݥ(ʤ/(ʤ(ʤ/(ʤ/-r//-r/-rs6-r-rs6-rs6s6s6s6ppoppoppo(\ppoppo(\ppo(\IrG(\(\IrG(\IrGRq1IrGIrGRq1IrGRq1IRq1Rq1IRq1I"II"I"~D""~D"~D~D~D~DUUUտUUտUտ7'տտ7'տ7'7?տhZ?7??hZ7ۡfտ?翴Uտۡfg4UۡfUg4,g4~D,v ~D,"~Dv ("v I"(9AI(Rq1I9AZRq19AIrGRq1ZYrIrGZ(\IrGYr!(\Yrppo(\!xppo!01ppoxppo0101:s6:$es6:-rs6$eЏ-r$e/-rЏ״/Џ(ʤ/״(ʤ״ݥ(ʤ/ݥݥݥ//ݥ/ݥ/(ʤݥ״(ʤ/(ʤ״Џ/״-r/Џ$e-rЏs6-r$e:s6$es6::01ppo01xppo01!ppox(\ppo!Yr(\!IrG(\YrZIrGYrRq1IrGZ9ARq1ZIRq19A(I9A"I(v "(~D"v ,~Dv ~D,g4,Ug4ۡfUg4տUۡf?տۡfտ???????ۡf@???U@?ۡf@g4@U@ۡf@@U@g4@,@@g4@~D@@,@v A~D@,@"A~D@v A(A"Av AIA"A(A9AAIA(ARq1AIA9AAZARq1A9AAIrGARq1AZAYrAIrGAZA(\AIrGAYrA!A(\AYrAppoA(\A!AxAppoA!A01AppoAxAAppoA01AAA01AAAAAAAAAAAAAAAA:AAAs6AA:A$eAs6A:A-rAs6A$eAЏA-rA$eA/A-rAЏA״A/AЏA(ʤA/A״AA(ʤA״AݥA(ʤAA/AݥAAݥAݥA/A/AݥA/AAݥA/A(ʤAݥAA״A(ʤAA/A(ʤA״AЏA/A״A-rA/AЏA$eA-rAЏAs6A-rA$eA:As6A$eAAs6A:AAA:AAAAAAAAAAAAAAAA01AAAppoAA01AxAppoA01A!AppoAxA(\AppoA!AYrA(\A!AIrGA(\AYrAZAIrGAYrARq1AIrGAZA9AARq1AZAIARq1A9AA(AIA9AA"AIA(Av A"A(A~D@"Av A,@~D@v A@~D@,@g4@@,@U@@g4@ۡf@U@g4@?U@ۡf@???ۡf@7???BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBBUUUBBUUUBUUUBBUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUAUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUBUUUBUUAUUUBUUAUUAUUUB  twoSolidAscii_stl0!{#<V_CenterX?V_CenterY?V_CenterZ?V_Radius ?bUa姳a$normalData_0 ??????????0[RUa姳almesh_0$??????????????????????????????????????????????????????????RUa姳a$normalData_1 ??????????0ZRUa姳almesh_1$????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???????????????????????????????????? * // Platform=WindowsNT, IGORVersion=10.010, architecture=Intel, systemTextEncoding="Windows-1252", historyTextEncoding="UTF-8", procwinTextEncoding="UTF-8", recreationTextEncoding="UTF-8", build=29851 #pragma TextEncoding = "UTF-8" Silent 101 // use | as bitwise or -- not comment. SetDataFolder root:twoSolidAscii_stl0: DefaultFont "Arial" gizmo0() MoveWindow/P 12.75,41.75,891.75,523.25 MoveWindow/C 2.25,525.5,1398,676.25 gizmo0_1() KillStrings/Z root:gWMSetNextTextFilesTextEncoding Window gizmo0_1() : GizmoPlot PauseUpdate; Silent 1 // building window... // Building Gizmo 9 window... NewGizmo/W=(26.25,50,412.5,395) ModifyGizmo startRecMacro=1001 ModifyGizmo scalingOption=63 AppendToGizmo Surface=root:twoSolidAscii_stl0:mesh_0,name=surface0 ModifyGizmo ModifyObject=surface0,objectType=surface,property={ srcMode,1} ModifyGizmo ModifyObject=surface0,objectType=surface,property={ surfaceCTab,Rainbow} AppendToGizmo Surface=root:twoSolidAscii_stl0:mesh_1,name=surface1 ModifyGizmo ModifyObject=surface1,objectType=surface,property={ srcMode,1} ModifyGizmo ModifyObject=surface1,objectType=surface,property={ surfaceCTab,Rainbow} ModifyGizmo setDisplayList=0, object=surface0 ModifyGizmo setDisplayList=1, object=surface1 ModifyGizmo autoscaling=1 ModifyGizmo currentGroupObject="" ModifyGizmo showInfo ModifyGizmo infoWindow={555,11,1152,258} ModifyGizmo SETQUATERNION={0.538364,0.166815,0.224024,0.795076} ModifyGizmo endRecMacro EndMacro Window gizmo0() : GizmoPlot PauseUpdate; Silent 1 // building window... // Building Gizmo 9 window... NewGizmo/W=(26.25,50,412.5,395) ModifyGizmo startRecMacro=1001 ModifyGizmo scalingOption=63 AppendToGizmo Surface=root:twoSolidAscii_stl0:mesh_0,name=surface0 ModifyGizmo ModifyObject=surface0,objectType=surface,property={ srcMode,1} ModifyGizmo ModifyObject=surface0,objectType=surface,property={ surfaceCTab,Rainbow} AppendToGizmo Surface=root:twoSolidAscii_stl0:mesh_1,name=surface1 ModifyGizmo ModifyObject=surface1,objectType=surface,property={ srcMode,1} ModifyGizmo ModifyObject=surface1,objectType=surface,property={ surfaceCTab,Rainbow} ModifyGizmo setDisplayList=0, object=surface0 ModifyGizmo setDisplayList=1, object=surface1 ModifyGizmo autoscaling=1 ModifyGizmo currentGroupObject="" ModifyGizmo showInfo ModifyGizmo infoWindow={555,11,1151,257} ModifyGizmo SETQUATERNION={0.564632,0.117799,0.197205,0.792729} ModifyGizmo endRecMacro EndMacro 0#pragma TextEncoding = "UTF-8" #pragma rtGlobals=3 // Use modern global access method and strict wave access #pragma DefaultTab={3,20,4} // Set default tab width in Igor Pro 9 and later // #define kMakeNormalWaves // uncomment this if you also want to generate normal wave data. // This is not necessary for Gizmo plots as normals are generated // automatically. Structure stlStruct float nor[3] float coords[9] int16 attr // optional, will be ignored. EndStructure /////////////////////////////////////////////////////////////////////////////////////////////// // loadStl() is the main function call. It loads either binary or ascii type *.stl data. // In binary one expects only a single solid. In ascii there may be multiple solids and each // one is saved as a separate mesh_xx and optional normalData_xx. See kMakeNormalWaves define // above. // The function creates a new datafolder in the current data folder using the name of the // selected file. The STL data is saved in a triangle wave called "mesh" and optionally in // a triplet wave called normalData. // The STL object(s) can be displayed in Gizmo (see Gizmo0 example below) using a surface // object with Source Wave Type set to Triangles. /////////////////////////////////////////////////////////////////////////////////////////////// function loadStl() variable refNum Variable numTriangles String fileFilters = "Stl files (*.stl):.stl;" String oldDF=GetDataFolder(1) // "OPEN" has the worst operation syntax: need /Z=2 or else it does not work! // Do NOT use /D which does not really open the file. Open/R/Z=2 /P=$"" /F=fileFilters refNum as "" if(V_flag) Print "User cancelled." return 0 endif Print S_fileName // full path of the selected file. Pick up the filename and clean it up: variable items=ItemsInList(S_fileName,":") // the path looks like a string list with ":" separator. String uniqueDFName = cleanupName(UniqueName(StringFromList(items-1,S_fileName,":"),11, 0),0) NewDataFolder/O/S $uniqueDFName // first we need to find if this is an ascii or a binary file. An ascii file starts with the line "solid name" // where name is optional and arbitrary. FsetPos refNum,0 // need to read 6 characters for "solid " including the trailing space. // so I create a string with 6 characters String testStr="123456" FBinRead refNum,testStr if(cmpstr(teststr,"solid ")==0) // is it an ascii file readAsciiSTL(refNum) else // it must be a binary stl file. readBinarySTL(refNum) endif Close refNum SetDataFolder oldDF End /////////////////////////////////////////////////////////////////////////////////////////////// // According to Google, an ascii *.stl file may contain more than one solid. This is not // in the original documentation but it makes sense. // For our purposes, multiple solids are stored in the same wave but they are separated by // one row of NaNs in the output waves. /////////////////////////////////////////////////////////////////////////////////////////////// Function readAsciiSTL(Variable refNum) // run initial pass to find how many triangles are defined: Variable numTriangles=0,numLines=0,numSolids=0,normalCounter=0 String lineStr make/free/N=1 nTriangles=0 // the following reads the number of solids and for each one allocates one point // in nTriangles. On return, the number of non-zero rows in nTriangles tells us // how many solids we have. findNumTriangles(nTriangles,refNum) // we are done counting. if(dimsize(nTriangles,0)<1) print "No solids found." return 0 endif Variable row,rows=DimSize(nTriangles,0) // reset the position in the file: FsetPos refNum,0 for(row=0;row0) readSolid(row,nTriangles[row],refNum) endif endfor End /////////////////////////////////////////////////////////////////////////////////////////////// // Reads a single solid from an ascii file. // row is the index of the solid. // /////////////////////////////////////////////////////////////////////////////////////////////// static function readSolid(variable row,variable numTriangles,variable refNum) // create the output: string normalName="normalData_"+num2str(row) string meshName="mesh_"+num2str(row) #ifdef kMakeNormalWaves Make/O/N=(numTriangles,3) $normalName=nan Wave normalData=$normalName #endif Make/O/N=(3*numTriangles,3) $meshName=nan Wave mesh=$meshName String lineStr // read the triangle data: FReadLine refNum,lineStr // skip the first line that should be something like "solid ..." Variable triangle,line=0,meshCount=0,normalCounter=0 Variable n1,n2,n3 Variable x1,y1,z1,x2,y2,z2,x3,y3,z3,theDot String facetStr,normalStr,vertexStr make/free/n=3 nv // temp normal wave for(triangle=0;triangle-1) break endif while(1) else FReadLine refNum,lineStr endif line+=1 if(strlen(lineStr)<=0) break // No more lines so we stop here. endif if(strsearch(lineStr,"endsolid",0)>-1) print "Reached 'endsolid'" return 0 endif // lineStr should look like: "facet normal 0.0000000e+00 0.0000000e+00 -1.0000000e+00" if(strsearch(lineStr,"facet normal",0)<0) print "Error in triangle ",triangle," line=",line break endif sscanf lineStr,"%s %s %e %e %e",facetStr,normalStr,n1,n2,n3 #ifdef kMakeNormalWaves normalData[normalCounter][0]=n1 normalData[normalCounter][1]=n2 normalData[normalCounter][2]=n3 normalCounter+=1 #endif FReadLine refNum,lineStr // this line should say "outer loop" if(strsearch(lineStr,"outer loop",0)<0) print "Missing outer loop in triangle ",triangle," line=",line break endif FReadLine refNum,lineStr // this line should look like "vertex -2.5000000e+01 2.5000000e+01 -2.5000000e+01" sscanf lineStr,"%s %e %e %e",vertexStr,x1,y1,z1 FReadLine refNum,lineStr // this line should look like "vertex -2.5000000e+01 2.5000000e+01 -2.5000000e+01" sscanf lineStr,"%s %e %e %e",vertexStr,x2,y2,z2 FReadLine refNum,lineStr // this line should look like "vertex -2.5000000e+01 2.5000000e+01 -2.5000000e+01" sscanf lineStr,"%s %e %e %e",vertexStr,x3,y3,z3 getNormals(x1-x3,y1-y3,z1-z3,x1-x2,y1-y2,z1-z2,nv) // calc the dot product between the specified normal and the triangle's normal. If they are not the same // flip the order of the vertices so the normal changes (winding rule). theDot=nv[0]*n1+nv[1]*n2+nv[2]*n3 if(theDot>0) mesh[meshCount][0]=x1 mesh[meshCount][1]=y1 mesh[meshCount][2]=z1 meshCount+=1 mesh[meshCount][0]=x2 mesh[meshCount][1]=y2 mesh[meshCount][2]=z2 meshCount+=1 mesh[meshCount][0]=x3 mesh[meshCount][1]=y3 mesh[meshCount][2]=z3 else mesh[meshCount][0]=x3 mesh[meshCount][1]=y3 mesh[meshCount][2]=z3 meshCount+=1 mesh[meshCount][0]=x2 mesh[meshCount][1]=y2 mesh[meshCount][2]=z2 meshCount+=1 mesh[meshCount][0]=x1 mesh[meshCount][1]=y1 mesh[meshCount][2]=z1 endif meshCount+=1 FReadLine refNum,lineStr // this line should look like "endloop" if(strsearch(lineStr,"endloop",0)<0) print "Missing endloop in triangle ",triangle," line=",line break endif FReadLine refNum,lineStr // this line should look like "endfacet" if(strsearch(lineStr,"endfacet",0)<0) print "Missing endfacet in triangle ",triangle," line=",line break endif endfor End /////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// static function findNumTriangles(Wave nTriangles,variable refNum) FsetPos refNum,0 String lineStr Variable numTriangles=0,numSolids=0 do FReadLine refNum,lineStr if(strlen(lineStr)<=0) break // No more lines to be read endif if(strsearch(lineStr,"endfacet",0)>-1) numTriangles+=1 elseif(strsearch(lineStr,"endsolid",0)>-1) nTriangles[numSolids]=numTriangles numSolids+=1 // allow to have an extra point at the end that is set to zero. InsertPoints/v=0 (numSolids+1),1,nTriangles numTriangles=0 nTriangles[numSolids]=0 endif while(1) End /////////////////////////////////////////////////////////////////////////////////////////////// // Binary format can apparently hold only a single solid. /////////////////////////////////////////////////////////////////////////////////////////////// Function readBinarySTL(Variable refNum) Variable numTriangles struct stlStruct ss FsetPos refNum,80 // skip the binary header FBinRead/F=3 refNum,numTriangles if(numTriangles>0) #ifdef kMakeNormalWaves Make/O/N=(numTriangles,3) normalData=0 #endif Make/O/N=(3*numTriangles,3) mesh endif make/free/n=3 nv,nu,nw // temp normal wave Variable tri,meshCount=0,vert,theDot Variable x1,y1,z1,x2,y2,z2,x3,y3,z3 for(tri=0;tri0) // straight copy of the vertices: for(vert=0;vert<3;vert+=1) mesh[meshCount][]=ss.coords[q+3*vert] meshCount+=1 endfor else // flipping two vertices to get the correct normal: mesh[meshCount][0]=x3 mesh[meshCount][1]=y3 mesh[meshCount][2]=z3 meshCount+=1 mesh[meshCount][0]=x2 mesh[meshCount][1]=y2 mesh[meshCount][2]=z2 meshCount+=1 mesh[meshCount][0]=x1 mesh[meshCount][1]=y1 mesh[meshCount][2]=z1 meshCount+=1 endif endfor End /////////////////////////////////////////////////////////////////////////////////////////////// // Compute the normal for two vectors. Here x1 is a vector component, not a vertex! /////////////////////////////////////////////////////////////////////////////////////////////// function getNormals(Variable x1,Variable y1,Variable z1,Variable x2,Variable y2,Variable z2,Wave nv) // compute cross product: nv[0]=y1*z2-z1*y2 nv[1]=z1*x2-x1*z2 nv[2]=x1*y2-y1*x2 // now normalize the vector: variable d=sqrt((nv[0]*nv[0]+nv[1]*nv[1]+nv[2]*nv[2])); if(d<=0) // arbitrary normal definition in this case. nv[0]=0 nv[1]=0 nv[2]=1 return -1 endif nv[0]/=d nv[1]/=d nv[2]/=d return 0 End /////////////////////////////////////////////////////////////////////////////////////////////// Window gizmo0() : GizmoPlot PauseUpdate; Silent 1 // building window... // Building Gizmo 9 window... NewGizmo/W=(26.25,50,412.5,395) ModifyGizmo startRecMacro=1001 ModifyGizmo scalingOption=63 AppendToGizmo Surface=root:twoSolidAscii_stl0:mesh_0,name=surface0 ModifyGizmo ModifyObject=surface0,objectType=surface,property={ srcMode,1} ModifyGizmo ModifyObject=surface0,objectType=surface,property={ surfaceCTab,Rainbow} AppendToGizmo Surface=root:twoSolidAscii_stl0:mesh_1,name=surface1 ModifyGizmo ModifyObject=surface1,objectType=surface,property={ srcMode,1} ModifyGizmo ModifyObject=surface1,objectType=surface,property={ surfaceCTab,Rainbow} ModifyGizmo setDisplayList=0, object=surface0 ModifyGizmo setDisplayList=1, object=surface1 ModifyGizmo autoscaling=1 ModifyGizmo currentGroupObject="" ModifyGizmo showInfo ModifyGizmo infoWindow={555,11,1153,259} ModifyGizmo SETQUATERNION={0.564632,0.117799,0.197205,0.792729} ModifyGizmo endRecMacro EndMacro ///////////////////////////////////////////////////////////////////////////////////////////////