From 0c709aebdc3558bd0b19cb9c10422085646b9124 Mon Sep 17 00:00:00 2001
From: Amanda Ghassaei <amandaghassaei@gmail.com>
Date: Tue, 18 Aug 2015 19:10:33 -0400
Subject: [PATCH] gik lattice reorientation, and axes

---
 assets/imgs/axes.png                       | Bin 0 -> 8947 bytes
 js/cam/assemblers/Assembler.js             |   8 ++--
 js/lattice/latticeSubclasses/GIKLattice.js |   4 +-
 js/main.js                                 |   1 +
 js/menus/Ribbon.js                         |   9 +++-
 js/menus/templates/Ribbon.html             |   1 +
 js/models/AppState.js                      |   9 ++++
 js/plists/CamPList.js                      |   6 +--
 js/three/Axes.js                           |  53 +++++++++++++++++++++
 9 files changed, 80 insertions(+), 11 deletions(-)
 create mode 100644 assets/imgs/axes.png
 create mode 100644 js/three/Axes.js

diff --git a/assets/imgs/axes.png b/assets/imgs/axes.png
new file mode 100644
index 0000000000000000000000000000000000000000..572060aac6865b27b61fd5e2ffa1c2c711b82bda
GIT binary patch
literal 8947
zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4mJh`2CF|eix?OfI14-?iy0U+1wfeb+zEC+
z1_lY~OlRkSfQ<Z-{NjxK0tHWJXN7{I{ItxRR0f8MTWc#*LqhYn|GibnWFfQb^##?t
zcX=<Zy|Qq&b2B4H#{va5r3D%*I#wi12uf1=BfuP@<HRB&%Ixa8Q@-c>-v8h0?e7@A
z`<&Qs`po!xOz~RVZ#R<Pvpal9Do9GwImIU+KL1d`X2az_fBd@WalVm9#i2oZOVi7f
zooRY{eIM-CoqycGz;Gv+%g?8$_5a;R9K7Dkm=*LG1cYY!^fNo?F(t@;adG2fP!wZW
zaw%9Sn1N$AW5eu+k6*JpSg<kN5#0ZXkKqB|Pf>nm2J^#*&oVU_a5^kwVK-J{h!AIN
znC8~+!MGrZp<~X+g@GR#?wBwvGPE_a5OFZzV7PYlsA>xn$2%5=ofGOWcmBwqrC4v;
z+^qcX*#0U;28K<kAw@|!1!{ld*YCJ-#op9~v0;+T<97@Udl)>}Y;T;BW%$83;nE2M
z>*M!-bRH2Y-hRKLJfv$bJ3|4p!guB1T-*BNpH~{rOJh*rX;^bi#bO5|11rPRe*Vb!
zJPdOfR*2Z%JoJ9L+N!ytFCYG${a8XOEt8eu4Z{k4<%4he?TswY{^g%HRWx(sKYn|w
z8~0clRxo4~8ZbYY&c4M+=h`t|1{H=2mpe7}<o0Lx9yz}5|6T51N^=t5ezX23HZAAr
zzvW?GOWNP+*Y?=9K79DiTUeN{f77<#PZ@)IQ*Qh_=qsEYD^ve8Nv<cv+@E0r(}6>W
zAKBJtCmmgQa2ntKw5F>KrYy|NhZI;IB{F6_;1Emr`P-}6po3lNf+Ay*BBO-KHhb%q
z=`GeRnTI42Cw+LKfBO+X{~`qup?{CQ)E~a9$bHYjrp58o{Hz@cc|Fn(`gR!RbxA*d
zwL@>+_w@XfjkO=wua1vXR^XXZr~GXH-Q|upe|{Y1?m3nG$KF!0-uU0;$)<Z4*j)Z3
zt}t7vw_@GDlmEkyyJ#;`y*Mqycgpdu4cs?)-x!&7lqSD*IQ(k^Uyj7<gSY-C*B#uy
z{7{2|2OE1wtAPhATZ`kL|JMUw#UIO`vdZBqlQ~CoMMq;q$FJyv+;I%di~c#Qie?Bf
zaSHGTKKQWxxc%g52d@_D-jOjs)LUq~;NhMf3K|b*?a<3>oBe=ohuFIB`Q;z?moH{{
zD8R$x(QM$+CQ-r3)8Wl|+Jli{gNMhN6c<;QWf#r}2`3-EcJa-lm#1E5yjqnN_2BVq
z_upSL>Pwhe7zFO!{(ng53d5Hd3@5hLCpzXc-dfCfV$T0VDYqDJTw!G6zYr{$x!*vB
zp@HGd0k%5|42u*vix#lFTENSez!jFjf9?U}J^_Z3juwjq2dkW>7>yR88@#_4a%C-)
z^E)JI!T<IG@AQXOJO?#;4kpiNiLBuD{vf$enZwB`LQv0zLC|@LpsS1QMb{od?IVJP
z&NUMiRG2#5gC_c(Fk8ZMvpGc3eWKeFnM<89Zfp~+PbjBwMLO6i+z;Scy5P<V4z1=@
z3wEuLeAQ63K>8ww3Fld-&liKX2(5MYU!40QwS+^~S^eVm7e;In+{d~*lf7o>r8Qb6
z*F{(yJFqR`Xas9m``n|uHb~#F%@K+|vhR`09PZ^0y>>9>byq(svEjVm^!~`|50fjT
z>qPgr`#<#l;m@S)IAejw1@#+(H5`I1B~FS9n+lpPc<peLP(CAMC*0{0w@4?jJ;VEp
zs+;iUPV3J0j<ZMV9?3r9DV*t|#5qC4(@iBk$Uw6-#KX$N%J-G>UDdOb!cOR<7;dt<
zIqQvkpZfEO+9#Hu*!yJn6U$HKYGrDfYPD+V%L119EHhe`>=Wy=eP-Isea6KGr;Vfy
zs}0<ZpBsf6%}?ET>`%*2Wp3_nmTtLjZEq28K5tcT?$f^0G^ec>@#|tb+O(;0l9%RE
zlYn2E{TlL-k&&qpzL9?;f+M^mr6bpGuuG0zSQI#QW!aU0S7BMETYIaf|C-j@={xIe
zk8Xo*_u8hnOt*8lxt6JwNtSVcOZcYy=IWcdZ}@Lax7=ZI#bS=-Ba5=4Igccs%y_O+
zc&Z?(u&wA>@wMW(hjSht+M%*jXUB_}+dKLSV;|3Ys#bKm=ysud@$`cE59J=lJ$m@$
z;**b$PCi)q?B&CmPmWfkR=ll9t~_0F{&U~wy2ru~jURJAzJ0KK+IzkG;&qC3!T${Y
zCH+hLXZSCl$%Ik6QKGS^v8-`<(~bpA3sxuWdXRW9yQ$mhjuV?x$-<<CpPhsct=Q1C
zVRpf`g1sL$eAv{nqNCSi(Fw<i+DhGv_AFYq=;ET^F4eB$M|K?PIlAb`x6ZGfdl!AY
za3*8p7Oz{Ow<hh_uw!k-svm(L1wXzQ+9Whjs8Z;xkiY6o)l${Ns^2~NJoG#}JuN+R
zCuL2VH6d-%wW)nm>=bI9e|7h)>Dhj!Y-ZWa%E-D%>zg_^)o!X6ttnC~@+>MX`u?=@
z)2>g3pW2_eiw3ajwtBQ?wchSpv1nV;lt+q3tzUDz{&MZ;`qk0j9Xc1KESs|I$`X^M
zXI8&iF=zRmb$`NKy^i`Xjd|L3%0E>1YQ)v#RsB~juD-eY>B_Dvb}O`3T)w*c>ig^s
zSrOSeS6^JHSif?G<g&_$&kMz-Pn&$LY%Swj`CC@Ec;0Tl#cdU2<!EJU#b2_sG`6Jt
z)x9gqFJ`{Zz54pv?^Wy9&R<j?_kV8VB*&hEn$4BYk%tWqC$|~93Ar6~bMIB_%{=CK
z%)Lk5_lR$k?<=2WzN)^?zWy`L%{)2Vb@p7d>g;t{=M3^q|0gZX-*|J;eWA@;HtKAX
z+4yM7r!A{CRi)`B$|l}T*_*OBb#m_IeD4jV8+5nVCa5R5Z_nNmz3KYK`#JSj8y`J*
z7x2{J?TQB{3f>es&3!ZXo0V;({$9Jf+TF$$w=Lh7*1b}CJ?Tl&$*C`1J&Jn!>yq!;
z+{w3j%k{oHd=Gv%-}a2{DI2-!Q<clA_$oG5=6=Zf^6OFV%e}{|FS#F0-+X?;`UUw@
z^4sN4o<IG*<^HDqQ~%ffzsVaV&1K$`KjrR>jfDmd1`1{i)F<c~SbT62P&{G%BIH8W
zhT?+Q4@DiZ9=<1p?l#pm{Ij}ZQWF2dX-43Uc^h^XEdF5o@Ux(sV70QClCP4slK5hs
zMXMIwbHD9&-L1Z}urISCvioaaZlCgT)}y7zijN&X67MVEd%|PK<P|d_W?0NzGJlJG
zX6M5L7883^@_pWUJoNMQk@TDDt?Mz@%h+$VU$p0Uul*AaP86JPIA`UAoyx^}r>$OB
zn9cJ&FLy&_pJw^xD`}h0x^GvAcG||1Gxg4_{iSBd)t;y573cZ9v#(rLS^dc__w&7L
zQ}rj!pKKqT5PTuTLpMdl?nd5*z1ukSyR@WkF5LL|LErqN3y*I13h~zR3M;=<e(%=O
zZL5o}M`c#L^q5(8^WohicR%hve%kkx|GS4bCT~qoTYvf9w%RSVM}OPB<-cPeu`n{Q
zy5Xn8tHzUF$4~V&2eFsS$E@vIBemLWecn33bvFY)KMi=XaCf^e|NOP0D|J`?EmL`Q
z;_zZK_uH>hUTMAR{F?byzrRv;cVW!;ipQJ>g;mw-OpciQ%qy|3+#0xi<Hso<R&G+;
zqPaEm;g`0{i_>+^m&^&Zs@^hl`_3h-Q9;phbGfa|>+U`LbAa_Oce=h;{F=<CS-N@7
zw~TI2yQO?v-MYs5UCFI-z7oljt#Lv7u3XT)7kl^c<=|_l@65ix``YxY+waW3vA@Fd
z(Wf&G4-P!mwhMn3U%J<-=<LH=XJ22tzW$EE?u+G@U!;9s@Gs%H?%n9O&bOR%4@Vtd
z`#<CFWvfNDm&&4_mmObmFXOuGVe7r+zVG7prB}ZHRlEDQbMous?|Q2H>}xhWJox1B
zh4#<=N%DK=d(8gv&*C}fL(h-F-<FG>Z<&A9c6$9io0YaVjZ-a6ZQk1bt!T6R{LA%I
z_tl$!rmxZ0es<)U)bp#)cZ;tPcZ>hIe^%|>AHRMlJ(TV<H_d-~FRmv2S6;=*^vrLz
zkN@6kpDWL5XI69RkI9BNoBq5hzVrNjd{;P2m|xx1zg3TCf8W0I{ma!$uAY+rWWTG<
z>QBukvF+QYNt^+-+j$r+d?;w(=Ve&4k0E9;!<j4b_ucl3w=pbWa9|4D&@ME?QDj2J
z5_wUF;0v5*_;xqle(;^M(1q_2L#FV}8J$PIOxZbkX<N{-TMo5{&YgRBU}tmog!blg
z=KGn9F$NJU+*{Ok1?RZhgd{m-?ftS~O;^myKiRIkOSgK>57h}NU)h_rA!}B)YWDRP
zUtasY`fKpOIK<?V@iwDE<E67zXFrdY*^sm8)#iQan-g}YoqxRH+{HsD>uaYJ&+=}3
zEw?@DyIOzQdB*jM?|0kv*UbNY_Q(1Bip_;~4?G`u1jH8<pGf?*?!uZ49}2E>G<&Sn
z$hz|U#dE{!$<mL@j;gEeP=BSuskYW=p6d7ISC)${X<dFhRU^$Pecvgmb9pyIc3ReZ
z|GKtB#w{-_?&G$_KW$mhZ#Nc|eCMIFPG9o=(U`0VvF*PLex8^o|NGk8@9Q<}E`(V|
z9t~O>DqN9q{Nd-V{r!(hy}rgB-zH~Y`N;3Em-5>w$(NU1etv#W{<VBf>+kQH{vW-a
zd+zObYu?>KdZuOeFH>J$e(`<R9Fu^8rGK)HZtZ&g)VwP%Px?+>_Vo+v9yZknx$Vi<
zzW>keR=xV~b>Hru|1Njuz07K<`+pQZEc~hbl5<(7dH;Kx%-X20IiEi-@I0;gGxOWa
z^~U<~J?HuM?XfA(+*iEt^VN^nmv(37Gu?~Y8yu4qA5~}napCvJ7yVgJPn<8iZ^fE|
zwKYF~J&FGReb?1L@`?7k*Hx}vV`$)LO5l<#;C<*MGx6?;;t*zCSNo*K8y4?6?NwET
zRvsw}l8BsOb1>wv%)ul-!=$eZ+%`SkApda3nVkpD9!@?v`{eaA|NR0YI~4Eeo>F?|
zYOT6YEmLi(_FeVOTFaH?*A{pbX53{@l@sL+jW(_S%F(NG)@SY6Tai{5cm1pC`{l;A
zs!hnv=2*((e6@U^<!6qa$&dUJ6}KU4!@4b+n|!x-Z~0!jq4Y}Wq}cP1d#vk=W|r-J
zeC_?cM};>wpU}Q(ec<@H@WcK`=D+w~cKFA!c@4h~JX+9_&@bR?)oLeuOEOGMPA*a6
zq~K4ZS3xC}J`ro`WTNl*)KohKF3O*jbV(~&<);Ui@>Qi?^<2HZ#>wev4%4#CX8lbF
z{`_o`Zeg@-u}<;V&tJAlKD{mWL*!Wg{kW2v<5M54oHT!Ti}%-4d&<<OzrR;p_5Q)W
z>7p+fA9}rQUKd(;Rn>Gkf3MuX8ka{ayzg%NbuRh6zlOQW+&wpbEcJZ<Wts8bvlo)e
z@^1gk7Ux`Rmh1Y~+{!aHZ2G5N)m3(1Pkz}Qe@@P#=IN!Y8?(8u@4s_|eP>=L|4JU|
zzmF{*m0K5?{PlZy_wV;t@67v4`}yr8>Mef1xSafk^Ly~i^j+s=)s>gMS}q=U;@q#j
zI&-W|>yr~-T|K4rwf9T(<nn*smhau|vubYb{`0Z>_Nk-!f9`XKh1V@xzm}1KPi6tb
zYen{7f<lY>mngi|=(1Yqe&KxtLm9XEk=q=*S{N5`7q(6D6;ryOaO<c~y5SOzz`9L-
z!R<GqZuS?46iq7<EfoJC@@d+Kw@=rLW(d6zcqRBw@TKTm;nz!Jh4QCnOtMi4Rhp}{
z+3{M4pOf4ZdF?IQ)7E?rTBNx*C@=J6U}?bP(Ah!xmprbTTui#OYk94QdQf<9x$FAy
z{Ra*loN&3|(28>ww_NU~T>Y{ua_3JsZq{!7Y2j;5t@)dql52P4+bz-C)s`LBd&+W(
zPes0eaptwn(@Rfgy-9n}x9k3=8;@T;cl|u;v)${-ud*Ms|Kj~MJ-6WgiQOLq9ZDY@
zQ<%75`N4K4vrDZng%?gujC&aKaJ#aX(%MA|uYyXVdZNxG<v7Q9>?!!u+_Jax_2d(t
z(<LKMN}cT1JRZz^>BptK<@x6gPDY%}IoWk;S*rc5E%}>|i#6(Qj<zoP_B8ETYyRyC
z@1q~YOKh{<x+1~d^<(FxZF8@e_f9=Gtyb&!w}Q7*Z!F&xzyHvqhT5gC9q+H2@Tz6j
z+V*d9cCpqaPh#hm)IQsIQFs$?v|r!+psZ8&e}AlrDh@oo`SUGtFFm{b%Nh6YeO%)G
zIH>S@$@;|j)c?;J`?c3zPgyU&d!<Q5uEsO@l@pI%lrBGiH(w^dvZC_Q%ixN2R#!hP
zDp>a;^mp{O@2;o+Xs=y;FFTuI|G$Zh3<6sj`_3~|$g&oEWzPs;nXry+K@szg4NMg;
z7_;KoPAqP2xH0GN?|%ubksI0yZt$rm3dAXgxbS{-*)+k~!~By(q^oOyunCK<i~qvy
z7yV}lq_w#w?cV5@Bb9z|>j#Az^?Qx`6$*rWI6k&4ZZT9czSuLv(Z)YU<>W*q58frL
zn~W@{-Z_5c(39gOvm_J0CEA^LO6^SF>3wmjOrq*$qlo!|Z&%LEDar|bv*yjtH}Mui
z7SAkS&N;u+X~(l2k9XLAe)1`(lK<n%53vuwKaUsF5DyXFqdrAXN6AKOQ|y%(o+Emf
zxsJ?LVNrRes_!|~+x>LJX|L0PPo_OxF8WR@F82D;633mcOC!JTiE6Lfe{8}t<F((d
zcIfrbTe5Fb<E(|NCN>$KZMiIBTATju#-8(w&TTrOb@0~lV|T)i`dyiKma#aZFs7(#
zYu&ZVTdAkMw%*SE-Y;jrXU3kNH7T`U|IGRGQhJm5JN^t#8O|zUr={5~zuIzn*Z1!b
zvlRZS+-4kR<EI#B>8KfK=h<{{_L(VvbW;_54en|x+i%u?{akJJ+3M|k&J~{8yT#Xd
z|K<yMzt8l&RefZAe%h>QzSE|^|9UgO<iNXxs;^rQJGrkY&G>u$vAonhGd(lid6n1q
z)Vw?HS~NSL-D`U4_Wb;i`dbI4t+u>we&1)esI`nqkkPHe?^kF1XzuOLlHXsm%xtE$
zt=Vde@GS=0Gd_R2QvI#}=IQ*fL;KJE^@xdPW-tq23-@T%deJP-!M&*Ohw@JkWuulo
z&N~BZO*nL&qA$2hv}q>pi(o9{tM1$UsI7u0uJ?cQf0Y%2PMoGKhDy>GC+=vjn0&;i
zNa?Mj?}Vi%c|I`+>j&#xE=}`%X7emkta_SWm(tQ{Q`<|`r+S=CX5JQ4*0Z;x`BY&;
zaMR|Qr>A81SogJ`2tJ;D%=&EjiS<Y9^(JVq(6Z3n5`H6$MO;$gu3DP!;tR))zE+u}
zx^}6{(y%4RQ*WjApOBrPAFdIq6T97grPt3Euhp-7x2C^}H>uq6W$R0;rMqma-t#Qs
zW$s<oD?htyR_iSD=$h@DHtB7Y+@yTtwMC1CnAO~f`kR%9Qcv=hKmQu=!Q|_wuYTV&
zKij@GfAqgjIlmz=p(3ENApgYefRhIEKWyrFJ<)!VY4V~Z{^NH&9fYq=ZjxAfa(d9S
z%Qr5S8Z{YtZ?f9--0XAi#@o9rpVz!wojd8LH1{eld9jagKj_-Ud`g-gl<9W!YtcVj
z&g%B>tHVOVgZSUASa#)&y-sxX<BSm7r#F5I*QtLzHf`Af<2UK+x1`Jo-)V6F)&;q%
zE3bTAxO=tv`ul|q?@yiCI!$^u+uL@QHg|WM{PTBC?ozL+PucTi;qR6+!cSg)`TRQA
z*En@^kL7pPh2dMfH|3w(YaA!_Q{czPyG7^3w@q!n@3Q~;KY>4y+qSVW)FiNV25@gr
z<PCH`G_m=F=@VtG#$5}4W?1j)=uEb|k(VQIydc?zJOB7}&Zrg>C;o{JC2C>9@e_GG
zc6)wK@&06}W)!S+Svbx8S)G{dG`%j%)EQT&e-$m|mgbM<-fjH5x{u2*`5fyy=R5Cg
z*4S*XDF0yjsrZvWhm3d%$4t&*&i!IL^{RZ<Ob}Ckr<ka=QcqP|S4~+(Tf=>Fc*up|
zk_hoNTReAqEp`9eY884oVDiG!u-|jnO^aLiFV@*|an0lD%lgvZigispzUFA|tG7?y
zM$78Xm9tXc6?7-c=Fi?4d#Y<L|1mXR!}5jwEf*)pRlemeHeIW_Hg?B$ocD?F^-4Um
zY{!x~kLM>6Qtq9<cE6;A`}DP*IXi9U=N@K#)*9<N%lejAPZ{5|U(@#L-QP4lIX<@a
zRO7kkW1+RCZSA+RINfFX->t8%^LbeDt20}@QtGgO>D*=WIBjp=Jyfjs@y`X<o!1_1
zGnZXA_w96--Q3mpzEysYmkZdl>Hn)+UtdUnXZOuF<^B9`vQ1HT$P2$GcQ1dB>-Frb
zwm(r_@#*5)&YQ<q``?`3X&XN0%B)NC&E^@_CR%0x399!?kIQv@IQ2;OtJkeZ&zZl>
z-+E7PpY^^czvum|{oeke|Bbx0U2a6%(_QDE&0oGhCsr`-<)2qSOJCkT_kPoT_AutK
z@VYmDSAHrk&@IX3Rj`b4mStcN=(1#Zc=OgRcS(jzat-oNv$OBNzILtd3Uh)#!>{D}
zxw{z{1a2~Bz52iWbN_#)%w30A_LRAmFfcGEBzpw;GBD)MU|=ZjV_^7ohJm5w7Xw3O
zBLl-<VFm_+Tm}XqO<p-QKL!S_AWs*^kcwMxW>@!Ixhi^m|M#!eXWyN%OOM}?ka%&b
z&JP7K7sC)Q*0q{ZTB<8H{!5NZj{o-1zRfIbcGT@zU2Ay_BRZCK2EJM?+L|>{N=}Po
zTI;EIhm782r=_RO{CW0$W&ZygtU5t))|)f#81I~EpH_7K@15dzme1$i=Lz(B_*q3{
zzOf{`92EXD;bw1WmwP26oZ6$gBuMGf?bT0TR^E7Zb@l7E#^1k>-q<0`%EspM_kzHE
z|Cg0p44x+k=e8;u?%vgtA5&NP?&0Uq2OlT4PKgmz<Z5N=Eiakjoqk@f%7-I$K7R%u
z!^94qol1%-LY&FB9v;5+<y%>{n~vB%;kM_TH%d=RtWbLK?%I0hhQGhhN~fQ*`Q#@s
z;WP7{+pDL>35IXke0c^p!%msq8+YEURp1evC;s4=TRu;N>N5ZH|2J+Aj~4B(&Q|j&
z;7D%J`J36qC2^>!PR3%UPHog8kxQEneRa~<T3w!U`PSA_#-$D`nZ>8_xLsyY)4j>@
z;9FwCu`3Y_i&tqW1UczOUyHY_+!Va)h9iTLW=p=p<t_ZNpRYeSu%tGb|IP0f4c4gO
z$JxQlZWP3Z<veF~aIoR^+L4hT+y2CLcA%c6&2=UvWxc!CrpYrWu-;BHdwxn@>XFh^
zp@P_`lFOGI4$S_gSQh_LX3|u4f#OvQz1ceYS=UDBNC+pKQ<QABDsa$$F7x5<qg^J&
zIy^c*g_DZQl$?Vv*l@c{^mlt1x?1Ykf=f(I4Ljz!$M`l2Iq}JFQ<@u@DZL`omZ$pM
z?|?>z)JID$7c*3RKHIg?t2xW!eYb~%*y1Ij4N3}Sl5@PbKboZ~z0jMt(aKjYuI^&=
zjmf#k5^pxFF<Ic~bU}c{l|L=fO81XX+v|p=DT`UAiOf43us=cj2DA1A-l&EKW)%z5
z536qOZ+`Q}x&LAh@0ZgRXXm#6b><CdanM+wvCe%Z7Z>X@F|H}x2i;h8oSBklci8`k
zX4!7ryeUSvLz&^#{C$^BRf+k?cYKc1Szjr)eZut*d24uAv+e6^nZdyux3OWWK#-bH
zRi)Cx{;YMII$XZKujk7CskWn%Tgzs1$NB#GY)t|(tdfk12i~0Ei>dq(`lsmC<QL{@
z4wL;1U%f22Z+BWwMkck#h-=37G}TYt@vZY$G8R1hs%c-Tp|D|Ur<Z#3>_epy()T)<
zdL3Hcz37|65;J{L=H*XG*VZV1*t5AfQ>sX04bPrb|K@YIx(tF#ulZWmt>TZ(dX$te
z{!V@m|Lpa9xI15YA8;0bBEy{!JH6uP)2!V)Z|cTx$q@KyWBWM6r&d;H*75Go;S1&%
z$ef(bU|+rd@$%nI{w7n{J$3H<;V9dFuVJon9-Csr$~T+C(j<iDc)zS{c~Zo)&G$UV
zwB3R{X760Di|Q-#i>Kzj*>dpZoJK~4B}^(GE^d3heuek@<KI?Q-dOPLU;v*<*|YE{
zMHQL$TPK%vyt^T2S(~|%V?}J+oin~2F@L$(zQ}zzAn~{MN6(zDfFHA3e>Gbd{{6Q7
z;`{f<53}!Yo#*uR=BqE#QZ-ttmab7j0gBD<gIE02U--XmYsNP{25yrR#arG)GRuqh
zOA1uUeK*<Pus&{!@cp0Hw|{gi5cLsidUWNfk|Ni(vo^PvDb0NHVbA2~h+i^d=^XpM
zYh0SXmvwUhXUi9vuxOSCivw+BT>{SrS1f!gXA@hjKkrR+Q$S$GlmF2ThOOuPjHmm2
z+VrjL_2i|hfdPGdcRw9`_g_@){11jx7a2qMcptO8f1X3cM)d)!$o84_2Oq!Lz2a%+
zlc}u%ff}qDu6BlYd2fZ;bGYkbnZ)hCX?!`l-r-i*M?Hzf8$WPzGP@t*&{Kb(TzZ#(
zgKCj(+?6~>20q`)|G~Z4vs#{CeA6d8u|lnQ&)Ov-0xT@O#ov_nJ<I#CQNqJ4Y*u#G
zMzx|Te9b!|9{lJ1{_QW1?;iHXyrw|bV+_aIcFRrC^6*^oURXxf(ZS&FI`fNPPQBfb
z)vl1stg!Uup$|!ZYK{}t*`hYz{#cvK`Y&!jkNnm%jT|xos)-Up)!!n@TwM={=}Ear
z2)vlr>b!RLhgSLZ2ldXjmwZjCE_~V0AD+R+!ddY8H-FOhLT$U8*p?<S*QrkxggEDB
z==A99%M@7WT)3oA+U!gn)3#u~qZVGes+ScwofRyXZQI|-eLuE8HvDea+t7HY_*-8*
z4ovW$?Gf|K>Rx6o-<it`PH(K76LCp5wB>-fTF)QFGq<)$&8g|I|Npz4b-S8Wto`Rs
zkE2Hp?s+)1v7tee&FIrFA13W%ZS2n{^th+qimWL8G;?V*SGHKp&Pmbd&%N<K_P1iW
zXw>hLmGAc**!zIF-D>WxE7m(7X)c>_X$spqiye;yyc(MNs+=n>Dw^^t91&t>j=xe>
zt#4{&z5aP~^JbCftlKwzioF%}`SUf;J%`W4TBJ@;RsV4%->dt}A->Iz^VU^dS*mAe
zWbdW9;#~8;gZwj+YL}VtKaJcs-@7hAu=GMun3o3QItvaCk-+0-&6;ebUDvL>_-wG$
zT~Rrz{=dz|>)%Zmug*3souid0u}!{zeX+XVp2O=`Rh`Y88I=&nF_$MPt&Yn`#WLuK
zz?Tf$J-61cdwp$pbg+`Csg&F8sx9+odQQxlHsRy<Q}?9LE$&iMQfAlwd#cRy$-J%w
zi)@A5z6H5ji-yFnzgAuB&{P*ZYyIiTCTu?}os0McgdWd4^XF6U?YwKdckg$K-5zDQ
zY)@NTX<h7H<2v87uf00fT)WM!q}uVmnMHBRqz@hJ^-FkU3okcl&(q*PEj(?@y%}l#
z&eKvarj{%`n459p<DDmEt82R^B(-_p-L}NT@BHRJP0qg-CcnNVb$8ae%{5D#oF?D?
z61MpIj}Y&LPa_w$)JG+_zTD8=x2IX4AxPkScX!UWsKvW~``KAk$bPl)H56l+I`#G4
zXV0$gJgxUz{o@|HX{UJ)|M*w1`Y})4m4yow6a^;<$bEbu$j`+!>r&OJ=1=pY)_;4;
z`Hm%oHFUy+Er;K%=w#i<E&IyncI39rQyb2l+IZ(G!-NaM*VVop*;;*e@BSS}_C4V*
zwErj4aBuSViWUZWsadPOeyzQ{dj0(cs*^=+rtWG>H`-jGW<33eT~kEPeCxtTj}vvi
zl?n9bE!!Dm&&i~r=#VR|!qaZPO5<z}t7n_}A$2>OM~zKh3tj4611`$*E{+aTYF+x*
zd*i0Ur~R+~R$WajNm(Yc?8zpZY8Q`*b7#+dz3>+cx3(9f(*jw$8uy&f&+ZGHUwvu!
z?r@oG78j-eAG5RNH$_Lqh3wkr%E_p~`f8U#B8O7y%lY;5Qj~2TDJn3o`kNK<Gqiup
z)7ujgB~2=Q4VH2)lkmx$cVX)jnJeFCYn$c8C{H@MQ-1fg6HeZz*YExH>$&4gv1xwF
z9Y+ro?@ToRFXHLp<e~IXSbmZRi;9DXQ-Eu~Yo6UDKONzfSBm}~X#Bn6wI7%AM4hjD
z8dw@j)O>GEn`i%D-7Q@`La+SJr1^ml860Gf3!Pk|$@^HoE;rX~#fpNj@A9TEzq~L$
ye7p1%raAp9cTe*=@gtt$SmSYI==IN<L1FiyowsumKQk~eFnGH9xvX<aXaWE)AyIPx

literal 0
HcmV?d00001

diff --git a/js/cam/assemblers/Assembler.js b/js/cam/assemblers/Assembler.js
index 4edf6fd8..c4fa5a07 100644
--- a/js/cam/assemblers/Assembler.js
+++ b/js/cam/assemblers/Assembler.js
@@ -72,7 +72,7 @@ define(['underscore', 'appState', 'lattice', 'stlLoader', 'threeModel', 'cam', '
             if (json.scale) geometry.applyMatrix(new THREE.Matrix4().makeScale(json.scale, json.scale, json.scale));
 
             geometry.applyMatrix(new THREE.Matrix4().makeTranslation(-21, -0.63, 0));//todo get rid of these
-            geometry.applyMatrix(new THREE.Matrix4().makeRotationZ(Math.PI/2));
+//            geometry.applyMatrix(new THREE.Matrix4().makeRotationZ(Math.PI/2));
             return geometry;
         }
 
@@ -339,10 +339,10 @@ define(['underscore', 'appState', 'lattice', 'stlLoader', 'threeModel', 'cam', '
             if (totalThreads > 0) return;
             callback();
         }
-        var startingPos = {x:this.components.yAxis.getPosition().x, y:this.components.xAxis.getPosition().y, z:this.components.zAxis.getPosition().z};
+        var startingPos = {x:this.components.xAxis.getPosition().x, y:this.components.yAxis.getPosition().y, z:this.components.zAxis.getPosition().z};
         speed = this._normalizeSpeed(startingPos, position, new THREE.Vector3(speed, speed, speed));
-        this.components.yAxis.moveTo(this._makeAxisVector(position, "x"), speed.x, sketchyCallback);
-        this.components.xAxis.moveTo(this._makeAxisVector(position, "y"), speed.y, sketchyCallback);
+        this.components.xAxis.moveTo(this._makeAxisVector(position, "x"), speed.x, sketchyCallback);
+        this.components.yAxis.moveTo(this._makeAxisVector(position, "y"), speed.y, sketchyCallback);
         this.components.zAxis.moveTo(this._makeAxisVector(position, "z"), speed.z, sketchyCallback);
     };
     
diff --git a/js/lattice/latticeSubclasses/GIKLattice.js b/js/lattice/latticeSubclasses/GIKLattice.js
index 1c0150a2..67f16a40 100644
--- a/js/lattice/latticeSubclasses/GIKLattice.js
+++ b/js/lattice/latticeSubclasses/GIKLattice.js
@@ -44,12 +44,12 @@ define(['underscore', 'backbone', 'appState', 'globals', 'plist', 'three', 'thre
         },
 
         _zIndexRotation: function(index){
-            if (index.z%2 == 0) return Math.PI/2;
+            if (index.z%2 != 0) return Math.PI/2;
             return 0;
         },
 
         _zIndexRotationSuperCell: function(index){
-            if (index.z%2 != 0) return -Math.PI/2;//this never changes
+            if (index.z%2 != 0) return Math.PI/2;//this goes neg if zIndexRotation rules are opp? need to clear this up eventually
             return 0;
         },
 
diff --git a/js/main.js b/js/main.js
index ee92b4e1..82f8cf4e 100644
--- a/js/main.js
+++ b/js/main.js
@@ -22,6 +22,7 @@ require.config({
         threeModel: 'three/ThreeModel',
         threeView: 'three/ThreeView',
         fillGeometry: 'three/FillGeometry',
+        axes: 'three/Axes',
 
         //plist
         plist: 'plists/PList',
diff --git a/js/menus/Ribbon.js b/js/menus/Ribbon.js
index cbfaf48f..9b30673d 100644
--- a/js/menus/Ribbon.js
+++ b/js/menus/Ribbon.js
@@ -12,7 +12,8 @@ define(['jquery', 'underscore', 'backbone', 'plist', 'lattice', 'appState', 'tex
             "click .ribbonCellMode":                                 "_updateCellMode",
             "click .ribbonDeleteMode":                               "_updateDeleteMode",
             "click .highlightMode":                                  "_updateHighlightMode",
-            "click .cellsVisible":                                   "_updateCellVisibility"
+            "click .cellsVisible":                                   "_updateCellVisibility",
+            "click #ribbonAxesToggle":                               "_setAxesVis"
         },
 
         initialize: function(){
@@ -25,6 +26,7 @@ define(['jquery', 'underscore', 'backbone', 'plist', 'lattice', 'appState', 'tex
             this.listenTo(this.model, "change:deleteMode", this.render);
             this.listenTo(this.model, "change:highlightMode", this.render);
             this.listenTo(this.model, "change:cellsVisible", this.render);
+            this.listenTo(this.model, "change:axesAreVisible", this.render);
             this.listenTo(lattice, "change:cellType change:connectionType", this.render);
             this.render();
         },
@@ -55,6 +57,11 @@ define(['jquery', 'underscore', 'backbone', 'plist', 'lattice', 'appState', 'tex
             else this.$el.hide();
         },
 
+        _setAxesVis: function(e){
+            e.preventDefault();
+            this.model.set("axesAreVisible", !this.model.get("axesAreVisible"));
+        },
+
         render: function(){
             this.$el.html(this.template(_.extend(lattice.toJSON(), this.model.toJSON(), plist)));
         },
diff --git a/js/menus/templates/Ribbon.html b/js/menus/templates/Ribbon.html
index 72ed5e43..1539dd93 100644
--- a/js/menus/templates/Ribbon.html
+++ b/js/menus/templates/Ribbon.html
@@ -10,6 +10,7 @@
         <% if (currentNav != "electronicNavSim" && currentNav != "mechanicalNavSim" && currentNav != "navAssemble" && currentNav != "navOptimize"){%>
             <a class="btn btn-primary btn-ribbon ribbonDeleteMode<% if (deleteMode){ %> ribbon-selected"<% } %>"><span class="fui-cross"></span></a>
         <% } %>
+        <a id="ribbonAxesToggle" class="btn btn-primary btn-ribbon <% if (axesAreVisible){ %> ribbon-selected"<% } %>">Axes</a>
     </div>
 </div>
 <!--//<a class="btn btn-primary btn-ribbon highlightMode<% if (highlightMode){ %> ribbon-selected<% } %>" href="#"><img data-type="part" src="assets/imgs/cursor-light.png"></a>-->
diff --git a/js/models/AppState.js b/js/models/AppState.js
index fde99e78..fc26021b 100644
--- a/js/models/AppState.js
+++ b/js/models/AppState.js
@@ -62,6 +62,7 @@ define(['underscore', 'backbone', 'threeModel', 'three', 'plist', 'globals'], fu
             this.listenTo(this, "change:materialType", this._materialTypeChanged);
             this.listenTo(this, "change:gikLength", this._gikLengthChanged);
             this.listenTo(this, "change:turnOffRendering", this._renderingOnOff);
+            this.listenTo(this, "change:axesAreVisible", this._showAxes);
 
             this.downKeys = {};//track keypresses to prevent repeat keystrokes on hold
             this.lastCellMode = this.get("cellMode");//store this to toggle on/off hide mode
@@ -149,6 +150,14 @@ define(['underscore', 'backbone', 'threeModel', 'three', 'plist', 'globals'], fu
             if (!this.get("turnOffRendering")) three.render();
         },
 
+        _showAxes: function(){
+            var visible = this.get("axesAreVisible");
+            require(['axes'], function(axes){
+                axes.setVisibility(visible);
+                three.render();
+            })
+        },
+
 
         ///////////////////////////////////////////////////////////////////////////////
         /////////////////////KEY BINDINGS//////////////////////////////////////////////
diff --git a/js/plists/CamPList.js b/js/plists/CamPList.js
index 06369459..fa1a63aa 100644
--- a/js/plists/CamPList.js
+++ b/js/plists/CamPList.js
@@ -111,8 +111,7 @@ define(['three'], function(THREE){
                         },
                         name: "Stock 1",
                         parent: "zAxis",
-                        position: {x:0,y:0,z:0},
-                        rotation: {x:0, y:0, z:Math.PI/2}
+                        position: {x:0,y:0,z:0}
                     },
                     stock2: {
                         description:{
@@ -121,8 +120,7 @@ define(['three'], function(THREE){
                         },
                         name: "Stock 2",
                         parent: "zAxis",
-                        position: {x:0.236,y:26,z:0},
-                        rotation: {x:0, y:0, z:Math.PI/2}
+                        position: {x:26,y:0.236,z:0}
                     }
                 },
                 lattice:{
diff --git a/js/three/Axes.js b/js/three/Axes.js
new file mode 100644
index 00000000..ffd7759b
--- /dev/null
+++ b/js/three/Axes.js
@@ -0,0 +1,53 @@
+/**
+ * Created by aghassaei on 8/18/15.
+ */
+
+
+define(['three', 'threeModel'], function(THREE, three){
+
+    var radius = 0.5;
+    var height = 20;
+
+    var arrowGeometry = new THREE.CylinderGeometry(0, 2 * radius, height / 5);
+    var axisGeometry = new THREE.CylinderGeometry(radius, radius, height);
+
+    var xAxisMaterial = new THREE.MeshBasicMaterial({color: 0xFF0000});
+    var xAxisMesh = new THREE.Mesh(axisGeometry, xAxisMaterial);
+    var xArrowMesh = new THREE.Mesh(arrowGeometry, xAxisMaterial);
+    xAxisMesh.add(xArrowMesh);
+    xArrowMesh.position.y += height / 2;
+    xAxisMesh.rotation.z  -= 90 * Math.PI / 180;
+    xAxisMesh.position.x  += height / 2;
+
+    var yAxisMaterial = new THREE.MeshBasicMaterial({color: 0x00FF00});
+    var yAxisMesh = new THREE.Mesh(axisGeometry, yAxisMaterial);
+    var yArrowMesh = new THREE.Mesh(arrowGeometry, yAxisMaterial);
+    yAxisMesh.add(yArrowMesh);
+    yArrowMesh.position.y += height / 2;
+    yAxisMesh.position.y  += height / 2;
+
+    var zAxisMaterial = new THREE.MeshBasicMaterial({color: 0x0000FF});
+    var zAxisMesh = new THREE.Mesh(axisGeometry, zAxisMaterial);
+    var zArrowMesh = new THREE.Mesh(arrowGeometry, zAxisMaterial);
+    zAxisMesh.add(zArrowMesh);
+    zAxisMesh.rotation.x  += 90 * Math.PI / 180;
+    zArrowMesh.position.y += height / 2;
+    zAxisMesh.position.z  += height / 2;
+
+    var axesMesh = new THREE.Object3D();
+    axesMesh.add(xAxisMesh);
+    axesMesh.add(yAxisMesh);
+    axesMesh.add(zAxisMesh);
+    three.sceneAdd(axesMesh);
+    setVisibility(false);
+
+
+    function setVisibility(visible){
+        axesMesh.visible = visible;
+    }
+
+    return {
+        setVisibility: setVisibility
+    }
+
+});
\ No newline at end of file
-- 
GitLab