73
73
< div itemprop ="articleBody ">
74
74
75
75
< h1 > Source code for crystal_toolkit.components.structure</ h1 > < div class ="highlight "> < pre >
76
- < span > </ span > < span class ="kn "> import</ span > < span class ="nn "> json</ span >
76
+ < span > </ span > < span class ="kn "> from</ span > < span class ="nn "> base64</ span > < span class ="kn "> import</ span > < span class ="n "> b64encode</ span >
77
+
78
+ < span class ="kn "> import</ span > < span class ="nn "> json</ span >
77
79
< span class ="kn "> import</ span > < span class ="nn "> os</ span >
78
80
< span class ="kn "> import</ span > < span class ="nn "> re</ span >
79
81
< span class ="kn "> import</ span > < span class ="nn "> sys</ span >
@@ -509,6 +511,37 @@ <h1>Source code for crystal_toolkit.components.structure</h1><div class="highlig
509
511
< span class ="s2 "> "type"</ span > < span class ="p "> :</ span > < span class ="s2 "> "image/png"</ span > < span class ="p "> ,</ span >
510
512
< span class ="p "> }</ span >
511
513
514
+ < span class ="nd "> @app</ span > < span class ="o "> .</ span > < span class ="n "> callback</ span > < span class ="p "> (</ span >
515
+ < span class ="n "> Output</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "download-structure"</ span > < span class ="p "> ),</ span > < span class ="s2 "> "data"</ span > < span class ="p "> ),</ span >
516
+ < span class ="n "> Input</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "download-button"</ span > < span class ="p "> ),</ span > < span class ="s2 "> "n_clicks"</ span > < span class ="p "> ),</ span >
517
+ < span class ="p "> [</ span >
518
+ < span class ="n "> State</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> get_kwarg_id</ span > < span class ="p "> (</ span > < span class ="s2 "> "download_fmt"</ span > < span class ="p "> ),</ span > < span class ="s2 "> "value"</ span > < span class ="p "> ),</ span >
519
+ < span class ="n "> State</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (),</ span > < span class ="s2 "> "data"</ span > < span class ="p "> ),</ span >
520
+ < span class ="p "> ],</ span >
521
+ < span class ="p "> )</ span >
522
+ < span class ="k "> def</ span > < span class ="nf "> download_image</ span > < span class ="p "> (</ span > < span class ="n "> n_clicks</ span > < span class ="p "> ,</ span > < span class ="n "> fmt</ span > < span class ="p "> ,</ span > < span class ="n "> data</ span > < span class ="p "> ):</ span >
523
+
524
+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> n_clicks</ span > < span class ="p "> :</ span >
525
+ < span class ="k "> raise</ span > < span class ="n "> PreventUpdate</ span >
526
+
527
+ < span class ="n "> structure</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> from_data</ span > < span class ="p "> (</ span > < span class ="n "> data</ span > < span class ="p "> )</ span >
528
+ < span class ="n "> fmt</ span > < span class ="o "> =</ span > < span class ="n "> fmt</ span > < span class ="p "> [</ span > < span class ="mi "> 0</ span > < span class ="p "> ]</ span >
529
+
530
+ < span class ="k "> try</ span > < span class ="p "> :</ span >
531
+ < span class ="n "> contents</ span > < span class ="o "> =</ span > < span class ="n "> structure</ span > < span class ="o "> .</ span > < span class ="n "> to</ span > < span class ="p "> (</ span > < span class ="n "> fmt</ span > < span class ="o "> =</ span > < span class ="n "> fmt</ span > < span class ="p "> )</ span >
532
+ < span class ="k "> except</ span > < span class ="ne "> Exception</ span > < span class ="k "> as</ span > < span class ="n "> exc</ span > < span class ="p "> :</ span >
533
+ < span class ="c1 "> # don't fail silently, tell user what went wrong</ span >
534
+ < span class ="n "> contents</ span > < span class ="o "> =</ span > < span class ="n "> exc</ span >
535
+
536
+ < span class ="n "> base64</ span > < span class ="o "> =</ span > < span class ="n "> b64encode</ span > < span class ="p "> (</ span > < span class ="n "> contents</ span > < span class ="o "> .</ span > < span class ="n "> encode</ span > < span class ="p "> (</ span > < span class ="s2 "> "utf-8"</ span > < span class ="p "> ))</ span > < span class ="o "> .</ span > < span class ="n "> decode</ span > < span class ="p "> (</ span > < span class ="s2 "> "ascii"</ span > < span class ="p "> )</ span >
537
+
538
+ < span class ="k "> return</ span > < span class ="p "> {</ span >
539
+ < span class ="s2 "> "content"</ span > < span class ="p "> :</ span > < span class ="n "> base64</ span > < span class ="p "> ,</ span >
540
+ < span class ="s2 "> "base64"</ span > < span class ="p "> :</ span > < span class ="kc "> True</ span > < span class ="p "> ,</ span >
541
+ < span class ="s2 "> "type"</ span > < span class ="p "> :</ span > < span class ="s2 "> "text/plain"</ span > < span class ="p "> ,</ span >
542
+ < span class ="s2 "> "filename"</ span > < span class ="p "> :</ span > < span class ="sa "> f</ span > < span class ="s2 "> "</ span > < span class ="si "> {</ span > < span class ="n "> structure</ span > < span class ="o "> .</ span > < span class ="n "> composition</ span > < span class ="o "> .</ span > < span class ="n "> reduced_formula</ span > < span class ="si "> }</ span > < span class ="s2 "> .</ span > < span class ="si "> {</ span > < span class ="n "> fmt</ span > < span class ="si "> }</ span > < span class ="s2 "> "</ span > < span class ="p "> ,</ span >
543
+ < span class ="p "> }</ span >
544
+
512
545
< span class ="nd "> @app</ span > < span class ="o "> .</ span > < span class ="n "> callback</ span > < span class ="p "> (</ span >
513
546
< span class ="n "> Output</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "title_container"</ span > < span class ="p "> ),</ span > < span class ="s2 "> "children"</ span > < span class ="p "> ),</ span >
514
547
< span class ="p "> [</ span > < span class ="n "> Input</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "legend_data"</ span > < span class ="p "> ),</ span > < span class ="s2 "> "data"</ span > < span class ="p "> )],</ span >
@@ -675,7 +708,6 @@ <h1>Source code for crystal_toolkit.components.structure</h1><div class="highlig
675
708
< span class ="n "> sceneSize</ span > < span class ="o "> =</ span > < span class ="s2 "> "100%"</ span > < span class ="p "> ,</ span >
676
709
< span class ="o "> **</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> scene_kwargs</ span > < span class ="p "> ,</ span >
677
710
< span class ="p "> ),</ span >
678
- < span class ="n "> dcc</ span > < span class ="o "> .</ span > < span class ="n "> Download</ span > < span class ="p "> (</ span > < span class ="nb "> id</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "download"</ span > < span class ="p "> )),</ span >
679
711
< span class ="p "> ],</ span >
680
712
< span class ="n "> style</ span > < span class ="o "> =</ span > < span class ="p "> {</ span >
681
713
< span class ="s2 "> "width"</ span > < span class ="p "> :</ span > < span class ="s2 "> "100%"</ span > < span class ="p "> ,</ span >
@@ -692,6 +724,7 @@ <h1>Source code for crystal_toolkit.components.structure</h1><div class="highlig
692
724
< span class ="n "> kind</ span > < span class ="o "> =</ span > < span class ="s2 "> "primary"</ span > < span class ="p "> ,</ span >
693
725
< span class ="nb "> id</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "screenshot_button"</ span > < span class ="p "> ),</ span >
694
726
< span class ="p "> ),</ span >
727
+ < span class ="n "> dcc</ span > < span class ="o "> .</ span > < span class ="n "> Download</ span > < span class ="p "> (</ span > < span class ="nb "> id</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "download"</ span > < span class ="p "> )),</ span >
695
728
< span class ="p "> ],</ span >
696
729
< span class ="c1 "> # TODO: change to "bottom" when dropdown included</ span >
697
730
< span class ="n "> style</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s2 "> "verticalAlign"</ span > < span class ="p "> :</ span > < span class ="s2 "> "top"</ span > < span class ="p "> ,</ span > < span class ="s2 "> "display"</ span > < span class ="p "> :</ span > < span class ="s2 "> "inline-block"</ span > < span class ="p "> },</ span >
@@ -874,12 +907,50 @@ <h1>Source code for crystal_toolkit.components.structure</h1><div class="highlig
874
907
< span class ="p "> ]</ span >
875
908
< span class ="p "> )</ span >
876
909
910
+ < span class ="c1 "> # human-readable label to file extension</ span >
911
+ < span class ="n "> struct_options</ span > < span class ="o "> =</ span > < span class ="p "> {</ span >
912
+ < span class ="s2 "> "CIF"</ span > < span class ="p "> :</ span > < span class ="s2 "> "cif"</ span > < span class ="p "> ,</ span >
913
+ < span class ="s2 "> "POSCAR"</ span > < span class ="p "> :</ span > < span class ="s2 "> "poscar"</ span > < span class ="p "> ,</ span >
914
+ < span class ="s2 "> "JSON"</ span > < span class ="p "> :</ span > < span class ="s2 "> "json"</ span > < span class ="p "> ,</ span >
915
+ < span class ="s2 "> "Prismatic"</ span > < span class ="p "> :</ span > < span class ="s2 "> "prismatic"</ span > < span class ="p "> ,</ span >
916
+ < span class ="p "> }</ span >
917
+
918
+ < span class ="n "> state</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s2 "> "fmt"</ span > < span class ="p "> :</ span > < span class ="s2 "> "cif"</ span > < span class ="p "> }</ span >
919
+
920
+ < span class ="n "> download_options</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> get_choice_input</ span > < span class ="p "> (</ span >
921
+ < span class ="n "> kwarg_label</ span > < span class ="o "> =</ span > < span class ="s2 "> "download_fmt"</ span > < span class ="p "> ,</ span >
922
+ < span class ="n "> state</ span > < span class ="o "> =</ span > < span class ="n "> state</ span > < span class ="p "> ,</ span >
923
+ < span class ="n "> options</ span > < span class ="o "> =</ span > < span class ="p "> [{</ span > < span class ="s2 "> "label"</ span > < span class ="p "> :</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="s2 "> "value"</ span > < span class ="p "> :</ span > < span class ="n "> v</ span > < span class ="p "> }</ span > < span class ="k "> for</ span > < span class ="n "> k</ span > < span class ="p "> ,</ span > < span class ="n "> v</ span > < span class ="ow "> in</ span > < span class ="n "> struct_options</ span > < span class ="o "> .</ span > < span class ="n "> items</ span > < span class ="p "> ()],</ span >
924
+ < span class ="n "> style</ span > < span class ="o "> =</ span > < span class ="p "> {</ span >
925
+ < span class ="s2 "> "border-radius"</ span > < span class ="p "> :</ span > < span class ="s2 "> "4px 0px 0px 4px"</ span > < span class ="p "> ,</ span >
926
+ < span class ="s2 "> "width"</ span > < span class ="p "> :</ span > < span class ="s2 "> "10rem"</ span > < span class ="p "> ,</ span >
927
+ < span class ="s2 "> "height"</ span > < span class ="p "> :</ span > < span class ="s2 "> "1.5rem"</ span > < span class ="p "> ,</ span >
928
+ < span class ="p "> },</ span >
929
+ < span class ="p "> )</ span >
930
+
931
+ < span class ="n "> download_button</ span > < span class ="o "> =</ span > < span class ="n "> Button</ span > < span class ="p "> (</ span >
932
+ < span class ="p "> [</ span > < span class ="n "> Icon</ span > < span class ="p "> (</ span > < span class ="n "> kind</ span > < span class ="o "> =</ span > < span class ="s2 "> "download"</ span > < span class ="p "> ),</ span > < span class ="n "> html</ span > < span class ="o "> .</ span > < span class ="n "> Span</ span > < span class ="p "> (),</ span > < span class ="s2 "> "Download"</ span > < span class ="p "> ],</ span >
933
+ < span class ="n "> kind</ span > < span class ="o "> =</ span > < span class ="s2 "> "primary"</ span > < span class ="p "> ,</ span >
934
+ < span class ="nb "> id</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "download-button"</ span > < span class ="p "> ),</ span >
935
+ < span class ="n "> style</ span > < span class ="o "> =</ span > < span class ="p "> {</ span > < span class ="s2 "> "height"</ span > < span class ="p "> :</ span > < span class ="s2 "> "2.25rem"</ span > < span class ="p "> },</ span >
936
+ < span class ="p "> )</ span >
937
+
938
+ < span class ="n "> download_layout</ span > < span class ="o "> =</ span > < span class ="n "> html</ span > < span class ="o "> .</ span > < span class ="n "> Div</ span > < span class ="p "> (</ span >
939
+ < span class ="p "> [</ span >
940
+ < span class ="n "> html</ span > < span class ="o "> .</ span > < span class ="n "> Div</ span > < span class ="p "> ([</ span > < span class ="n "> download_options</ span > < span class ="p "> ],</ span > < span class ="n "> className</ span > < span class ="o "> =</ span > < span class ="s2 "> "control"</ span > < span class ="p "> ),</ span >
941
+ < span class ="n "> html</ span > < span class ="o "> .</ span > < span class ="n "> Div</ span > < span class ="p "> ([</ span > < span class ="n "> download_button</ span > < span class ="p "> ],</ span > < span class ="n "> className</ span > < span class ="o "> =</ span > < span class ="s2 "> "control"</ span > < span class ="p "> ),</ span >
942
+ < span class ="n "> dcc</ span > < span class ="o "> .</ span > < span class ="n "> Download</ span > < span class ="p "> (</ span > < span class ="nb "> id</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> id</ span > < span class ="p "> (</ span > < span class ="s2 "> "download-structure"</ span > < span class ="p "> )),</ span >
943
+ < span class ="p "> ],</ span >
944
+ < span class ="n "> className</ span > < span class ="o "> =</ span > < span class ="s2 "> "field has-addons"</ span > < span class ="p "> ,</ span >
945
+ < span class ="p "> )</ span >
946
+
877
947
< span class ="k "> return</ span > < span class ="p "> {</ span >
878
948
< span class ="s2 "> "struct"</ span > < span class ="p "> :</ span > < span class ="n "> struct_layout</ span > < span class ="p "> ,</ span >
879
949
< span class ="s2 "> "screenshot"</ span > < span class ="p "> :</ span > < span class ="n "> screenshot_layout</ span > < span class ="p "> ,</ span >
880
950
< span class ="s2 "> "options"</ span > < span class ="p "> :</ span > < span class ="n "> options_layout</ span > < span class ="p "> ,</ span >
881
951
< span class ="s2 "> "title"</ span > < span class ="p "> :</ span > < span class ="n "> title_layout</ span > < span class ="p "> ,</ span >
882
952
< span class ="s2 "> "legend"</ span > < span class ="p "> :</ span > < span class ="n "> legend_layout</ span > < span class ="p "> ,</ span >
953
+ < span class ="s2 "> "download"</ span > < span class ="p "> :</ span > < span class ="n "> download_layout</ span > < span class ="p "> ,</ span >
883
954
< span class ="p "> }</ span >
884
955
885
956
< div class ="viewcode-block " id ="StructureMoleculeComponent.layout "> < a class ="viewcode-back " href ="../../../source/crystal_toolkit.components.structure.html#crystal_toolkit.components.structure.StructureMoleculeComponent.layout "> [docs]</ a > < span class ="k "> def</ span > < span class ="nf "> layout</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ,</ span > < span class ="n "> size</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> =</ span > < span class ="s2 "> "500px"</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="n "> html</ span > < span class ="o "> .</ span > < span class ="n "> Div</ span > < span class ="p "> :</ span >
@@ -1083,7 +1154,13 @@ <h1>Source code for crystal_toolkit.components.structure</h1><div class="highlig
1083
1154
< span class ="sd "> """</ span >
1084
1155
< span class ="sd "> :return: A layout including a legend for the structure/molecule.</ span >
1085
1156
< span class ="sd "> """</ span >
1086
- < span class ="k "> return</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _sub_layouts</ span > < span class ="p "> [</ span > < span class ="s2 "> "legend"</ span > < span class ="p "> ]</ span > </ div > </ div >
1157
+ < span class ="k "> return</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _sub_layouts</ span > < span class ="p "> [</ span > < span class ="s2 "> "legend"</ span > < span class ="p "> ]</ span > </ div >
1158
+
1159
+ < div class ="viewcode-block " id ="StructureMoleculeComponent.download_layout "> < a class ="viewcode-back " href ="../../../source/crystal_toolkit.components.structure.html#crystal_toolkit.components.structure.StructureMoleculeComponent.download_layout "> [docs]</ a > < span class ="k "> def</ span > < span class ="nf "> download_layout</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> ):</ span >
1160
+ < span class ="sd "> """</ span >
1161
+ < span class ="sd "> :return: A layout including a download button to download the structure/molecule.</ span >
1162
+ < span class ="sd "> """</ span >
1163
+ < span class ="k "> return</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> _sub_layouts</ span > < span class ="p "> [</ span > < span class ="s2 "> "download"</ span > < span class ="p "> ]</ span > </ div > </ div >
1087
1164
</ pre > </ div >
1088
1165
1089
1166
</ div >
0 commit comments