bist-0.5.2/0000755000175000017500000000000011740261237011042 5ustar cagecagebist-0.5.2/Makefile.am0000644000175000017500000001253211733641566013112 0ustar cagecageACLOCAL_AMFLAGS = -I m4 EXTRA_DIST = config.rpath m4/ChangeLog SUBDIRS = po . src pluginsrc/TREcalc pluginsrc/fetch_nist_database nobase_dist_pkgdata_DATA = rings/steroids/sigmasterole.bist rings/protective/dansyl.bist rings/protective/edans.bist rings/protective/fmoc.bist rings/protective/dabcyl.bist rings/protective/dabsyl.bist rings/protective/boc.bist rings/aromatic/sulfonic_acid.bist rings/aromatic/biphenyl.bist rings/aromatic/benzene.bist rings/aromatic/benzene_nok.bist rings/aromatic/condensed/anthracene.bist rings/alifatic/4_terms/cyclobutane.bist rings/alifatic/8_terms/cyclooctane.bist rings/alifatic/5_terms/pentane.bist rings/alifatic/7_terms/cycloeptane.bist rings/alifatic/6_terms/cicloesane_chair.bist rings/alifatic/6_terms/cicloesane_boat.bist rings/IR_prediction/1carbonyl.bist rings/IR_prediction/0ketone.bist rings/insatures/cyclopentadiene.bist rings/insatures/cyclopentadiene_sp.bist rings/RNA/uracil.bist rings/aminoacids/tryptophane.bist rings/aminoacids/leucine.bist rings/aminoacids/proline.bist rings/aminoacids/cysteine.bist rings/aminoacids/serine.bist rings/aminoacids/glutamic_acid.bist rings/aminoacids/alanine.bist rings/aminoacids/threonine.bist rings/aminoacids/aspartic_acid.bist rings/aminoacids/asparaginic_acid.bist rings/aminoacids/glycine.bist rings/aminoacids/tyrosine.bist rings/aminoacids/valine.bist rings/aminoacids/arginine.bist rings/aminoacids/isoleucine.bist rings/aminoacids/glutamine.bist rings/aminoacids/phenilalanine.bist rings/aminoacids/histidine.bist rings/aminoacids/methionine.bist rings/aminoacids/lisine.bist rings/aminoacids/asparagine.bist rings/glucids/d-fructose.bist rings/glucids/d-glucose.bist rings/residual/COOH.bist rings/residual/SO3H.bist rings/porphirine/porphirine.bist dist_doc_DATA= doc/about.html doc/bistlogo.png doc/index.html doc/internals/grammar.bist doc/tutorial/bist_tutorial.html doc/tutorial/hotkeys.html doc/tutorial/atom_properties.png doc/tutorial/bond_properties.png doc/tutorial/example1_step1.png doc/tutorial/example1_step3.png dist_man_MANS = man/bist.1 pkglib_LTLIBRARIES = align_elements.la enumerate_atoms.la global_charge.la insert_template.la IR_prediction.la flip_around_bond.la wrap_in_bracket.la attach_ring.la align_elements_la_SOURCES = pluginsrc/align_elements.cpp pluginsrc/align_elements_dialog.cpp pluginclude/align_elements.hpp pluginclude/align_elements_dialog.hpp align_elements_la_LDFLAGS = -module -avoid-version -export-dynamic align_elements_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) enumerate_atoms_la_SOURCES = pluginsrc/enumerate_atoms.cpp pluginclude/enumerate_atoms.hpp enumerate_atoms_la_LDFLAGS = -module -avoid-version -export-dynamic enumerate_atoms_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) global_charge_la_SOURCES = pluginsrc/global_charge.cpp pluginclude/global_charge.hpp global_charge_la_LDFLAGS = -module -avoid-version -export-dynamic global_charge_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) insert_template_la_SOURCES = pluginsrc/insert_template.cpp pluginclude/insert_template.hpp pluginsrc/insert_template_dialog.cpp pluginclude/insert_template_dialog.hpp insert_template_la_LDFLAGS = -module -avoid-version -export-dynamic insert_template_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) IR_prediction_la_SOURCES = pluginsrc/IR_prediction.cpp pluginclude/IR_prediction.hpp IR_prediction_la_LDFLAGS = -module -avoid-version -export-dynamic IR_prediction_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) flip_around_bond_la_SOURCES = pluginsrc/flip_around_bond.cpp pluginclude/flip_around_bond.hpp flip_around_bond_la_LDFLAGS = -module -avoid-version -export-dynamic flip_around_bond_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) wrap_in_bracket_la_SOURCES = pluginsrc/wrap_bracket_dialog.cxx pluginsrc/wrap_in_bracket.cpp pluginclude/wrap_bracket_dialog.hpp pluginclude/wrap_in_bracket.hpp wrap_in_bracket_la_LDFLAGS = -module -avoid-version -export-dynamic wrap_in_bracket_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) attach_ring_la_SOURCES = pluginsrc/attach_ring.cpp pluginclude/attach_ring.hpp attach_ring_la_LDFLAGS = -module -avoid-version -export-dynamic attach_ring_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) BUILT_SOURCES= include/config_path.h CONF_PATH_FILE = include/config_path.h $(CONF_PATH_FILE): echo "#define LIB_PATH_HOME \"/.bist/rings/\"" > $(CONF_PATH_FILE) echo "#define LIB_PATH_SHARE \""$(pkgdatadir)"/rings/\"" >> $(CONF_PATH_FILE) echo "#define CONFIG_DIR \".bist/\"" >> $(CONF_PATH_FILE) echo "#define CONFIG_FILE \"bistrc\"" >> $(CONF_PATH_FILE) echo "#define TUTORIAL_HTML \""$(docdir)"/bist_tutorial.html\"" >> $(CONF_PATH_FILE) echo "#define ABOUT_HTML \""$(docdir)"/about.html\"" >> $(CONF_PATH_FILE) echo "#define TEXT_DOMAIN \""$(PACKAGE)"\"" >> $(CONF_PATH_FILE) echo "#define CATALOG_DIR \""$(localedir)"/\"" >> $(CONF_PATH_FILE) echo "#define ELF \""$(PACKAGE)"\"" >> $(CONF_PATH_FILE) echo "#define VERSION \""$(PACKAGE_VERSION)"\"" >> $(CONF_PATH_FILE) echo "#define PLUGIN_PATH_HOME \"/.bist/plugin/\"" >> $(CONF_PATH_FILE) echo "#define PLUGIN_PATH_SHARED \""$(pkglibdir)"/\"" >> $(CONF_PATH_FILE) echo "#define ELF_ABS_PATH \""$(bindir)"/"$(PACKAGE)"\"" >> $(CONF_PATH_FILE) bist-0.5.2/NEWS0000644000175000017500000000012211657505745011550 0ustar cagecagePlease visit : http://www.autistici.org/interzona/bist.html for news about bist. bist-0.5.2/bist.spec0000644000175000017500000000521111025523004012643 0ustar cagecageName: bist Version: 0.4.7 Release: 1%{?dist} Summary: Chemical drawing tool Group: Applications/Editors License: GPLv3 URL: http://www.autistici.org/interzona/index.php Source0: http://www.autistici.org/ftrack.php?url=sections/06_Download/%{name}-%{version}.tar.bz2 Patch0: bist-config.patch Patch1: bist-makefile.patch Patch2: bist-po-update.patch Patch3: bist-wrapbracket.patch Source1: bist.png Source2: bist.desktop BuildRequires: fltk-devel openbabel-devel qt-devel plotutils-devel expat-devel BuildRequires: libXpm-devel libcurl-devel glibc-headers gsl-devel BuildRequires: libjpeg-devel libpng-devel shared-mime-info BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) %description Bist stands for bidimensional structures and is a chemical drawing tool. It is focused on organic chemistry but it may be useful for chemists or teachers as well %package plugins Summary: Plugins for bist Group: Applications/Editors Requires: %{name} = %{version}-%{release} %description plugins Plugins for bist %prep %setup -q -n %{name}-%{version} sed -i -e 's!@libdir@!%{_libdir}!' %{PATCH0} sed -i -e 's!@lib@!%{_lib}!' %{PATCH1} %patch0 -p1 -b .original %patch1 -p1 -b .original sed -i -e 's!%{_libdir}!@libdir@!' %{PATCH0} sed -i -e 's!%{_lib}!@lib@!' %{PATCH1} %patch2 -p1 -b .original %patch3 -p1 -b .original cp %{SOURCE1} . %build %configure --disable-static make %install rm -rf $RPM_BUILD_ROOT make install DESTDIR=$RPM_BUILD_ROOT %find_lang %{name} mkdir -p $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/48x48/apps/%{name} install -m0644 %{SOURCE1} $RPM_BUILD_ROOT%{_datadir}/icons/hicolor/48x48/apps/%{name}.png mkdir -p $RPM_BUILD_ROOT%{_datadir}/applications cp %{SOURCE2} $RPM_BUILD_ROOT%{_datadir}/applications desktop-file-install --vendor fedora \ --dir %{buildroot}%{_datadir}/applications \ --add-category X-Fedora \ --delete-original \ %{buildroot}%{_datadir}/applications/bist.desktop rm -f $RPM_BUILD_ROOT%{_datadir}/locale/bist/*.original %post update-desktop-database &> /dev/null || : %postun update-desktop-database &> /dev/null || : %clean rm -rf $RPM_BUILD_ROOT %files -f %{name}.lang %defattr(-,root,root,-) %doc BUGS README TODO doc/about.html doc/bistlogo.png doc/index.html doc/scr0.3.jpg %{_bindir}/bist %{_datadir}/bist %{_datadir}/locale/bist %{_mandir}/man1/bist.1.gz %{_datadir}/icons/hicolor/48x48/apps/%{name}.png %{_datadir}/applications/fedora-bist.desktop %exclude %{_datadir}/doc/%{name} %files plugins %{_libdir}/bist %changelog * Tue Apr 22 2008 Paul F. Johnson 0.4.7-1 - Initial import bist-0.5.2/bist.png0000644000175000017500000001546111213242071012506 0ustar cagecagePNG  IHDR #ꦷgAMA abKGD pHYs."."ݒ vpAg IDAThޕWtUֶ-wZ" (HGQ Q&]P@#@ W${g׵wq?{y1/g̫ ;aZMVѣ"5<V+,oQOSb\skv]޸׋'5r<~?WK26נWr'ֆ.tJ)/odVU m~(aمJ\ݫ!}(O[Z+箥 =X"C.]%,Z(!+߫J?: ӉZQ7=g3uªm%0- )wP1f,4Im%E1[GN@N-K@֬һ%7oc[qi qktvm>옻oNAW]Kc#;B=z#|@UUUU!VIu $kO6K:yaTdNrUz]s Xg~l>.>s2ς12tbMd;$ x u%m|>s 9U ޓ\P݀,gYFr-$7n>C"OfET=dP#Ȳ>E%\kT?ݘ5:JVwqQXoڟZ W+ u5qXu7ΰcM;7n3(7[aiH%(j!^U9,eCi.Yу3E^ko DTﯸ!MU:n6K`[aqM_n_=d?_E- X #Ύ+MJ*{y o]tSV/==[oOkumkKsyUkOOݱ}Ձ v4w$,ٔ3\ۊ^ ~oPFZPK>h< ˚RBIjE*_;ʷg J[`xrt7 y*r;YP+YаQx:,Mȫ: W۔ueei>Yڳ'o>YX[@LF<ؽs ,7_X\͢b5+no/L;Z B_4=r̝!Bo_0.{e| ,a&Aw׃._;ŧyPh  PS-eyн#7A0G8u(x?/B^ A -MBOg5G5}Ŵ>}6Ȧ# u .t;YX+j WZx;ʳ}pFk%'to?y^IDfnZ^mq,(Us[0L'%()w-Wh5[: /z{=`jK꫗ATQȣt6%((J&Ln:d5 ~-[-xR7فGY9'k?xBiY[FLسz{Zn՜2 W^4 }lt|^p 4U+6@op*PM|rxvH:Peoi@G* ЬR#vBg:.3q;={P>{_ۓTj+$tT|)ZdxCcCApPςigDjb`mڣ 5f™BYzpm-2x2Ig gw+CPQ$PWvЃlXe40U]4 V낔N9:ð!vxM2Zl9& !jXRWb7|ߵڀ5fRUgܗ ϔR=^,bR$@1}e0ex/B7W^|b^5;YeNmB8a=#P+ZAFi@7@e11z1+ߢ/7XhO[5CN4B& ,!:gм0w Կ ]Pz8P\k)wG wmi4@SOAJ[HFT15^(~r#3&`OP6 F,si+ ͚XR샔w5+s,:5o2h``\ԁkRnF5DLX Y2W{5J'-"жJlz TCqG]k",4%ͺXׯ<_7h@ ߺSC^e%sG -Aa'[@ۗo;`| Mpwu0PePԻX=z@JDp^,tmZ)&! 4uَ-pM4~M5TQ"_BmOX\::$tZIn}aU\ՕO|IrG  VY:g%e!C}n#z7!fq& X>i EjQ苺Da-N=Fe[ Oj7׃V3ڹ dpB[ U|=4padt2/7H ̽L oE_9#4 G"0 ]?FlF3+5ћ^tQZ/U UrNOX÷&Bڦ"w]Sm6$6AvAr]kG v>ztkexulcuѐzYXMPοU n[OeS.mU` 0503\5~-P YYK4V9Kg iP ! g$0v0P5~0(`OZ~uwڕP}We=Y_A|IN0ug}ZzLlZZx'U >qOסPTW@mRȆy6(֐3;(4ρP,T5W88NCx)'00 qx)}p@,6LodMpd#O`ЩMrd𭑫fZAsgH +M3ض5h,>HKU)-< VqIg:IK}s|gxzI2W0P{I~Ew[}.ܭWAgSS >}\]2H^/q>HK"Wu,;4Ӵ23w~.OYnGwCpEv!?;@n_v{@j ^]a\1sy 8ڮ Ri^x J9uhfd~4ͺ9F:e/-xMrb]6~ǭ:giςQ+ÃE~>T\u4~9dˠG~(,%ābXNj-ڶm֝ŋzh7=bR%($9g[ O^`g̟wm@p3x֩Ac,8;a;mwH(PBn3BQ]xR)ai I.*׺ʼn/ ޿}+[tì&}**Z:ږX:CzL`&w!h(j=p!fͶN .usiwp3~pM 1[`$84r۳M P0};OG;nIGd`VǘZhƊ73!u\Ɨ#푢K_*ޤM쿼s͹,U^W[yןio ֆTq +ߠFJs.|Xc_xٚ\ A}bk/ru`N5ȩRa x%Y.aдQ[0nWX *E0̸"X*c=nN*4WӑBk]퇄n'${軞iUhu4ǎ_8V{áG?ޡo?~ت̟M:WK}ֻckcܾ~ ZIrC )]wO}l"Rú£䊇R,ED̏:d uzY{2ndT]>WPw P͟{恏vlo흗vǷ3.1,lPr5nKf}׬ʆ/K{l[?eMhǕ:!GM"Rχ޳o\~M_qR_d;(i@v?3s~6TAnb$Hm[Ƌ_n嫮/?/:D%iԷ/6^9Oh=OmAQwbmE_ˀWcѿѿ ?Czs֏۾J$4m.)P\q^}[ͭ=;:J][[ڬ%nq @L. */ #define PARAGRAPH_TEXT_ALIGN_CENTER_TEXT_LAYOUT 1 #define PARAGRAPH_TEXT_ALIGN_LEFT_TEXT_LAYOUT 2 #define PARAGRAPH_TEXT_ALIGN_RIGHT_TEXT_LAYOUT 3 #define PARAGRAPH_TEXT_ALIGN_SINGLE_LINE_TEXT_LAYOUT 4 /** a paragraph of text */ class paragraph_text : public etichetta{ public: /** *Costruttore di default, riempie i valori con immondizia. */ paragraph_text(); paragraph_text(const paragraph_text& other); paragraph_text(const paragraph_text* other); paragraph_text& operator=(const paragraph_text& other); virtual ~paragraph_text(); virtual int cr(); virtual int cg(); virtual int cb(); virtual void cr(int nw); virtual void cb(int nw); virtual void cg(int nw); /** *\return una copia delle stringhe che compongono questa etichetta */ virtual std::vector < pair > vec_str(); /** *Aggiunge un elemento al vettore * *\param nw la nuova etichetta *\param tipo il tipo si stringa: puo' assumere i valori: * *
    *
  • ET_STR *
  • ET_APICE *
  • ET_PEDICE *
*/ virtual void aggiungi(std::string nw, int tipo); /** *add a new line to the tail of _lines_of_text *\param new_line the new line */ virtual void add_line(multifont_label new_line); virtual void add_line(multifont_label* new_line); /** *add a new line in position after pos *\param new_line the new line */ virtual void add_line(multifont_label new_line, int pos); virtual void add_line(multifont_label* new_line, int pos); /** *insert the string "nw" of type "type" in position "pos". If pos > *_vec_str.size() then the sring is appended. * */ virtual void insert(std::string nw, int type, int pos); /** *insert a new line to _lines_of_text in position pos *\param new_line the new line *\param pos the position where to insert */ virtual void insert_line(multifont_label new_line, int pos); virtual void insert_line(multifont_label* new_line, int pos); /** *delete line from _lines_of_text in position pos * *\param pos the position where to delete * *\param reset_pointer_currline reset _pointer_to_currline to fit *into the _lines_of_text bonduaries */ virtual void delete_line(int pos, bool reset_pointer_currline); /** *substitute line from _lines_of_text in position pos with nw *\param nw the new etichetta *\param pos the position where to make substituition */ virtual void subst_line(multifont_label* nw, int pos); /** *Elimina la stringa in una certa posizione. * *\param where l'elemento da eliminare. */ virtual void elimina(int where) throw (out_of_range){}; /** *sostituisci la stringa in una certa posizione. * *\param cosa la nuova stringa *\param tipo il tipo si strinag (apice pedice o normale) *\param where l'elemento da eliminare. */ virtual void sostituisci(std::string cosa, int tipo,int where) throw (out_of_range){}; /** *Elimina tutti gli apici. */ virtual void elimina_apici(){}; /** *Elimina tutti i pedici */ virtual void elimina_pedici(){}; /** *Elimina tutta l'etichetta */ virtual void elimina(bool reset_cur=true); /** *\return il tipo di font (vedi le fltk per il significato da *attribuire a questo intero ld, std::pair ru); virtual bool some_highlighted(); virtual bool invert_highlight_child_and_shift_cursor(bool fwd=true); /** * *\return true if whished_ptr_line and whished_ptr_line_child do not *trepasses theirs bonduaries false otherwise */ virtual bool set_ptrline_to_modify_children(int* whished_ptr_line, int* whished_ptr_line_child, int* saved_ptr_line, int* saved_ptr_line_child, int* act_ptr_line, int* act_ptr_line_child); /** *\return L'ascissa dell'etichetta (corrispondente all'angolo in alto *a sinistra dalla prima lettera della stringa). */ virtual float x(); /** *\return L'ascissa dell'etichetta zoomata (corrispondente all'angolo in alto *a sinistra dalla prima lettera della stringa) */ virtual float visual_x(); virtual float phys_x(); /** *\return L'ordinata dell'etichetta (corrispondente all'angolo in alto *a sinistra dalla prima lettera della stringa). */ virtual float y(); /** *\return L'ordinata dell'etichetta zoomata (corrispondente all'angolo in alto *a sinistra dalla prima lettera della stringa). */ virtual float visual_y(); virtual float phys_y(); /*setta i valori*/ /** *Imposta il valore del font dell'etichetta. *\param Il nuovo font. */ virtual void font(int nw); /** *Imposta l'ascissa dell'etichetta (corrispondente all'angolo in alto *a sinistra dalla prima lettera della stringa). *\param La nuova ascissa. */ virtual void x(float nw); /** *Imposta l'ordinata dell'etichetta (corrispondente all'angolo in alto *a sinistra dalla prima lettera della stringa). *\param La nuova ordinata. */ virtual void y(float nw); /** *Misura l'altezza e la larghezza di questa etichetta *\param altris l'altezza dell'etichetta *\param larris la larghezza dell'etichetta */ virtual void misura(float& altris,float& larris ); /** *Misura l'altezza e la larghezza di questa etichetta tenendo conto dello zoom *\param altris l'altezza dell'etichetta *\param larris la larghezza dell'etichetta */ virtual void visual_misura(float& altris,float& larris ); virtual void phys_misura(float& altris,float& larris ); virtual void phys_misura_as_a_whole(float& altris,float& larris ); /** *\return l'altezza di questa etichetta */ virtual float h(); /** *\return l'altezza di questa etichetta tenuto conto del fattore di zoom */ virtual float visual_h(); virtual float phys_h(); /** *\return la larghezza di questa etichetta */ virtual float w(); /** *\return la larghezza di questa etichetta tenuto conto del fattore di zoom */ virtual float visual_w(); virtual float phys_w(); /** *Ritorna la lunghezza del vettore contenente le stringhe */ virtual int size_str(){return 0;}; virtual unsigned int size_lines_of_text(); virtual void disegna(); /** *Scala l'oggetto * *\param sc il fattore di scala */ virtual void scale(float sc); /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in radianti in senso orario *\param xpivot ascissa relativa all'asse di rotazione *\param ypivot ordinata relativa all'asse di rotazione * */ virtual void ruota(float xpiv, float ypiv,float angl); /** *Trasla l'oggetto. * *\param dx entita' dello spostamento lungo l'ascissa *\param dy entita' dello spostamento lungo l'ordinata */ virtual void trasla(float dx, float dy); virtual void phys_translate(float dx, float dy); virtual bool dentro_bb(float x_bb, float y_bb, float w_bb , float h_bb); /** * *\param posx_m ascissa del puntatore *\param ordinata del puntatore *\return l'id di questo oggetto se il mouse si trova all'interno della *sua bounding box, -1 altrimenti. */ // virtual int sotto_mouse(int posx_m, int posy_m); /** *etichetta -> string raw conversion */ virtual std::string to_raw_string(){return "";}; /** *set cursor pos */ virtual void set_cursor_position( int pos_in_vec, string::size_type pos_in_string){}; virtual void set_cursor_position(std::pair pos){}; virtual int set_cursor_position(int limit); virtual void go_to_end_of_label(); virtual void go_to_end_of_line(); virtual void go_to_start_of_label(); virtual void go_to_start_of_line(); virtual int get_cursor_position(std::pair* pos); virtual void insert_string_in_curr_pos(std::string str,int type); virtual void draw_cursor(bool draw); /** *\return true if the address passed as parameter contain valid coordinates */ virtual bool cursor_to_coordinate(int& x, int& y){ return true;}; virtual void reset_cursor_if_outside_limits(); virtual void reset_pointer_to_currline(); virtual bool cursor_one_step_fwd(int &curr_type); virtual bool cursor_one_step_back(int &curr_type); virtual bool cursor_one_step_up(int &curr_type); virtual bool cursor_one_step_down(int &curr_type); virtual void delete_char_curr_pos(bool before); float interline_space(); float phys_interline_space(); float visual_interline_space(); int interline_space(int nw); virtual void pointer_to_currline(int nw); virtual int pointer_to_currline(); virtual int pointer_to_currline_transl(int delta); virtual std::vector get_lines_text(); virtual int layout_lines(); virtual void layout_lines(int nw); virtual void increase_highlighted(); virtual void decrease_highlighted(); virtual void de_highlight(); virtual void update_highligted_text(); virtual bool break_and_split_normal_str(etichetta** left , etichetta** right); virtual etichetta get_label_copy_from_coordinate(int ptrline, int ptrline_child) throw (out_of_range); virtual int calculate_no_chars_before_abs_cur_pos(int line, int line_child, std::pair cpos_c); virtual bool check_if_abs_pos_legal(int ptrline, int ptrline_child, int cpos_f,int cpos_s); virtual void calculate_curpos_until_limit(unsigned int ptrline, unsigned int& line, std::pair& cpos, int limit); bool dump_label(); /** *\return true if has more */ protected: virtual bool ptr_line_less_lines_text(); virtual bool ptr_line_is_last_line(); /** *Costruisce una stringa da passare alle plotlib */ virtual std::string costruct_plot_string(){return "";}; virtual void format_paragraph(); virtual void format_lines_align_right(); virtual void format_lines_align_center(); void update_vec_str(); void update_lines_of_text(); float calculate_last_line_y(bool add_interline=true); vector _lines_of_text; int _pointer_to_currline; int _interline_space; int _layout_lines; const static int _default_interline_space; }; bist-0.5.2/include/bond_prop.hpp0000644000175000017500000000347111025523004015152 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 /** *Crea la finetra e ritorna un vettore che contiene nell'ordine: * componente r g b del colore el legame e tipo di legame; * *\param quale il tipo di legame a cui si vogliono cambiare le prpriet. */ vector bond_win(int quale); int trasl_rev_tipo_leg(int quale); void legame_prop_color_cb(Fl_Widget* w, void* d); void legame_prop_ok_cb(Fl_Widget* w, void* d); void legame_prop_cancel_cb(Fl_Widget* w, void* d); void legame_prop_scale_cb(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cabiare le propriet dei *legami */ class legame_prop : public Fl_Window{ friend vector bond_win(int quale); friend void legame_prop_color_cb(Fl_Widget* w, void* d); friend void legame_prop_ok_cb(Fl_Widget* w, void* d); friend void legame_prop_cancel_cb(Fl_Widget* w, void* d); friend void legame_prop_scale_cb(Fl_Widget* w, void* d); public: legame_prop(int x,int y,int w, int h, char* tit,int quale); protected: int _r, _g, _b; int _radioval; float _scale; }; bist-0.5.2/include/procedura.hpp0000644000175000017500000006316711405121660015170 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* PROCEDURA := 'ARC' APRI ID_PROC SEP POSX SEP POSY SEP WIDTH SEP HEIGHT SEP STRANGL SEP ENDANGL SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH CHIUDI | 'ARROW' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE CHIUDI | 'BEZIER' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE CHIUDI */ #define PROC_BEZIER_OFFSETT_TANGENT_FOR_ARROW 0.08 /** *Questa classe rappresenta una procedura generica ovvero un disegno che *non e' una molecola. */ class procedura: public disegnabile, public genitore, public selezionabile, public identificabile, public write_native{ public: procedura(int tipo) :_tipo(tipo) { } procedura(const procedura& altra); procedura(const procedura* other); procedura() :_tipo(0) { } /** *distruttore */ virtual ~procedura(); /** *\return true se altro ha lo stesso id di quest'istanza **/ bool operator==(procedura* altro); virtual void init()=0; virtual int id()=0; virtual int id_gruppo(); virtual float w()=0; virtual float visual_w()=0; virtual float phys_w()=0; virtual float h()=0; virtual float visual_h()=0; virtual float phys_h()=0; virtual float posx()=0; virtual float visual_posx()=0; virtual float phys_posx()=0; virtual float posy()=0; virtual float visual_posy()=0; virtual float phys_posy()=0; virtual void trasla(float dx, float dy)=0; virtual void phys_translate(float dx, float dy)=0; virtual float xpivot()=0; virtual float ypivot()=0; virtual float angolorot()=0; virtual int cr()=0; virtual int cb()=0; virtual int cg()=0; /** * *\param x ascissa dell'angolo in alto a sinistra della bounding box *\param y ordinata dell'angolo in alto a sinistra della bounding box *\param w larghezza della bounding box *\param h altezza della bounding box *\return true se l'oggetto e' dentro la bounding box specificata *false altrimenti. */ virtual bool dentro_bb(float x, float y, float w , float h){ if(posx()>x && posx()y && posy()& x, std::vector& y)=0; /* +---------------> | ld | +-----+ | | | | +-----+ ru \ / V */ virtual void get_bounding_box(std::pair& ld, std::pair& ru)=0; virtual void get_phys_bounding_box(std::pair& ld, std::pair& ru)=0; virtual void get_visual_bounding_box(std::pair& ld, std::pair& ru)=0; /** * *\param posx_m ascissa del puntatore *\param posy_m ordinata del puntatore *\return l'id di questo oggetto se il mouse si trova all'interno della *sua bounding box, -1 altrimenti. */ virtual int sotto_mouse(int posx_m, int posy_m)=0; /** *check if a control point of this procedura has been hitted by mouse *\return the id of the procedura hitted -1 if no one has been hitted */ virtual int control_point_under_mouse(int posx_m, int posy_m)=0; virtual void unset_edit_control_point()=0; virtual void control_point_transl(float dx, float dy)=0; virtual void id(int nw)=0; virtual void w(float nw)=0; virtual void h(float nw)=0; virtual void posx(float nw)=0; virtual void posy(float nw)=0; virtual void xpivot(float nw)=0; virtual void ypivot(float nw)=0; virtual void angolorot(float nw)=0; virtual void cr(int nw)=0; virtual void cb(int nw)=0; virtual void cg(int nw)=0; virtual int tipo(){ return _tipo; } protected: int _tipo; //vector < pair > _vertici; static const float _tolerance_hit_control_point; }; /** *Questa classe rappresenta un cerchio o ellisse */ class proc_arc : public procedura{ public: proc_arc(); /** *Costruttore di copia dal puntatore */ proc_arc(const proc_arc* altro); proc_arc(int id,float xst, float yst, float xen, float yen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt); virtual ~proc_arc(); virtual int sotto_mouse(int posx_m, int posy_m); virtual int control_point_under_mouse(int posx_m, int posy_m); virtual void unset_edit_control_point(); virtual void control_point_transl(float dx, float dy); /** *Inizializza l'oggetto, costruendo i vertici, il metodo disegna() la *richiama automaticamente. */ virtual void init(); /*ritorna i valori*/ virtual int id(); virtual float posx(); virtual float visual_posx(); virtual float phys_posx(); virtual float posy(); virtual float visual_posy(); virtual float phys_posy(); virtual float w(); virtual float visual_w(); virtual float phys_w(); virtual float h(); virtual float visual_h(); virtual float phys_h(); virtual float xstart(); virtual float visual_xstart(); virtual float phys_xstart(); virtual float ystart(); virtual float visual_ystart(); virtual float phys_ystart(); virtual float xend(); virtual float visual_xend(); virtual float phys_xend(); virtual float yend(); virtual float visual_yend(); virtual float phys_yend(); virtual float x1(); virtual float y1(); virtual float visual_x1(); virtual float visual_y1(); virtual float phys_x1(); virtual float phys_y1(); virtual float x2(); virtual float y2(); virtual float visual_x2(); virtual float visual_y2(); virtual float phys_x2(); virtual float phys_y2(); virtual float x3(); virtual float y3(); virtual float visual_x3(); virtual float visual_y3(); virtual float phys_x3(); virtual float phys_y3(); virtual float x4(); virtual float y4(); virtual float visual_x4(); virtual float visual_y4(); virtual float phys_x4(); virtual float phys_y4(); virtual int cr(); virtual int cb(); virtual int cg(); virtual float xpivot(); virtual float ypivot(); virtual float angolorot(); virtual int spessore(); virtual int dash(); /*setta i valori*/ virtual void id(int nw); virtual void posx(float nw); virtual void posy(float nw); virtual void w(float nw); virtual void h(float nw); virtual void xstart(float nw); virtual void ystart(float nw); virtual void xend(float nw); virtual void yend(float nw); virtual void x1(float nw); virtual void y1(float nw); virtual void x2(float nw); virtual void y2(float nw); virtual void x3(float nw); virtual void y3(float nw); virtual void x4(float nw); virtual void y4(float nw); virtual void cr(int nw); virtual void cb(int nw); virtual void cg(int nw); virtual void xpivot(float nw); virtual void ypivot(float nw); virtual void angolorot(float nw); virtual void spessore(int nw); virtual void dash(int nw); /** *Disegna l'oggetto PARAMETRI DA DEFINIRE!!!!!! */ virtual void disegna(); virtual void trasla(float dx, float dy); virtual void phys_translate(float dx, float dy); /** *Scala l'oggetto * *\param sc il fattore di scala */ virtual void scale(float sc); /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in gradi in senso antiorario */ virtual void ruota(float xpiv, float ypiv, float angl); virtual bool dentro_bb(float x, float y, float w , float h); virtual void arrows_points(std::vector& x, std::vector& y){} virtual void get_bounding_box(std::pair& ld, std::pair& ru); virtual void get_phys_bounding_box(std::pair& ld, std::pair& ru); virtual void get_visual_bounding_box(std::pair& ld, std::pair& ru); virtual void write_native_format(std::ostream& stream, std::string indent); protected: float minima_x(); float minima_y(); int _id; float _xstart; float _ystart; float _xend; float _yend; float _x1; float _y1; float _x2; float _y2; float _x3; float _y3; float _x4; float _y4; int _cr; int _cb; int _cg; float _xpivot; float _ypivot; float _angolorot; int _spessore; int _dash; enum control_point_edit{none, start, end, ru, lu, lb, rb}; control_point_edit _edited_cp; /** *La bounding box viene scalata di questa quantita' */ static const float scala_bb; }; /** *Questa classe rappresenta una freccia */ class proc_arrow : public procedura{ public: /** * Costruttore di default riempie i membri con spazzatura */ proc_arrow(); /** *Costruttore di copia dal puntatore */ proc_arrow(const proc_arrow* altro); /** * *Costruisce loggetto freccia. *\param id id della procedura la identifica univocamente *\param posx ascissa dell arco *\param posy ordinata dell arco * *\param eposx ascissa della punta della freccia *\param eposy ordinata della punta della freccia *\param cr componente rossa del colore della procedura *\param cg componente verde del colore della procedura *\param cb componente blu del colore della procedura *\param xpiv ascissa dell'asse di rotazione. *\param ypiv ordinata dell'asse di rotazione *\param anglrot l'angolo di rotazione dell'oggetto in radianti ed in *senso orario *\param spess spessore in px della "penna" *\param tratt lunghezza del tratteggio (nota: 0 nessun tratteggio). *\param punte numero di punte delle freccie, puo' assumere i valori: * *
    * *
  • ARR_NO_PUNT nessuna punta * *
  • ARR_OMOL_PUNT scissione omolitica * *
  • ARR_ETEROL_PUNT scissione eterolitica * *
* */ proc_arrow(int id,float posx, float posy, float eposx,float eposy, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt, int punte, float arr_w, float arr_h, float arr_gap); /** *Costruttore */ virtual ~proc_arrow(); virtual int sotto_mouse(int posx_m, int posy_m); virtual int control_point_under_mouse(int posx_m, int posy_m); virtual void unset_edit_control_point(); virtual void control_point_transl(float dx, float dy); virtual void init(); /*ritorna i valori*/ virtual int id(); virtual float posx(); virtual float visual_posx(); virtual float phys_posx(); virtual float posy(); virtual float visual_posy(); virtual float phys_posy(); virtual float eposx(); virtual float visual_eposx(); virtual float phys_eposx(); virtual float eposy(); virtual float visual_eposy(); virtual float phys_eposy(); virtual float w(); virtual float visual_w(); virtual float phys_w(); virtual float h(); virtual float visual_h(); virtual float phys_h(); virtual int cr(); virtual int cb(); virtual int cg(); virtual float xpivot(); virtual float ypivot(); virtual float angolorot(); virtual int spessore(); virtual int dash(); virtual int punte(); float arr_w(); float arr_h(); float arr_gap(); /*setta i valori*/ virtual void id(int nw); virtual void posx(float nw); virtual void posy(float nw); virtual void eposx(float nw); virtual void eposy(float nw); virtual void w(float nw); virtual void h(float nw); virtual void cr(int nw); virtual void cb(int nw); virtual void cg(int nw); virtual void xpivot(float nw); virtual void ypivot(float nw); virtual void angolorot(float nw); virtual void spessore(int nw); virtual void dash(int nw); virtual void punte(int nw); void arr_w(float nw); void arr_h(float nw); void arr_gap(float nw); virtual bool dentro_bb(float x, float y, float w , float h); /** *Disegna l'oggetto PARAMETRI DA DEFINIRE!!!!!! */ virtual void disegna(); virtual void trasla(float dx, float dy); virtual void phys_translate(float dx, float dy); /** *Scala l'oggetto * *\param sc il fattore di scala */ virtual void scale(float sc); /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in gradi in senso antiorario */ virtual void ruota(float xpiv, float ypiv, float angl); virtual void arrows_points(std::vector& x, std::vector& y); virtual void get_bounding_box(std::pair& ld, std::pair& ru); virtual void get_phys_bounding_box(std::pair& ld, std::pair& ru); virtual void get_visual_bounding_box(std::pair& ld, std::pair& ru); virtual void write_native_format(std::ostream& stream, std::string indent); protected: void calculate_equilibrium_arrows(vector& x, vector& y); /** *Disegna la seconda freccia di un equibrio. */ void disegna_equilibrio(); int _id; float _posx; float _posy; float _eposx; float _eposy; int _cr; int _cb; int _cg; float _xpivot; float _ypivot; float _angolorot; int _spessore; int _dash; int _punte; float _arr_w; float _arr_h; float _arr_gap; enum control_point_edit{none, beg, end}; control_point_edit _edited_cp; }; /* 'BEZIER' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE CHIUDI */ /** *Questa classe rappresenta una curva di bezier */ class proc_bezier : public procedura { public: /** * Costruttore di default riempie i membri con spazzatura */ proc_bezier(); /** *Costruttore di copia da puntatore */ proc_bezier(const proc_bezier* altro); /** * *Costruisce l'oggetto freccia. *\param id id della procedura, la identifica univocamente *\param ix ascissa del punto di partenza della curva *\param iy ordinata del punto di partenza della curva * *\param tan1x ascissa della prima tangente. *\param tan1y ordinata della prima tangente. * *\param tan2x ascissa della seconda tangente. *\param tan2y ordinata della seconda tangente. * *\param ex ascissa del punto di arrivo della curva *\param ex ordinata del punto di arrivo della curva * *\param cr componente rossa del colore della procedura *\param cg componente verde del colore della procedura *\param cb componente blu del colore della procedura *\param xpiv ascissa dell'asse di rotazione. *\param ypiv ordinata dell'asse di rotazione *\param anglrot l'angolo di rotazione in radianti ed in senso orario *\param spess spessore in px della "penna" *\param tratt lunghezza del tratteggio (nota: 0 nessun tratteggio). *\param punte numero di punte delle freccie, puo' assumere i valori: * *
    * *
  • ARR_NO_PUNT nessuna punta * *
  • ARR_OMOL_PUNT scissione omolitica * *
  • ARR_ETEROL_PUNT scissione eterolitica * *
* */ proc_bezier(int id,float ix, float iy, float tang1x, float tang1y, float tang2x, float tang2y, float ex, float ey, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt, int punte, float arr_w, float arr_h, float arr_gap); /** *Costruttore */ virtual ~proc_bezier(); virtual int sotto_mouse(int posx_m, int posy_m); virtual int control_point_under_mouse(int posx_m, int posy_m); virtual void unset_edit_control_point(); virtual void control_point_transl(float dx, float dy); virtual bool dentro_bb(float x, float y, float w , float h); virtual void arrows_points(std::vector& x, std::vector& y); virtual void get_bounding_box(std::pair& ld, std::pair& ru); virtual void get_phys_bounding_box(std::pair& ld, std::pair& ru); virtual void get_visual_bounding_box(std::pair& ld, std::pair& ru); virtual void init(); /*ritorna i valori*/ virtual float posx(); virtual float visual_posx(); virtual float phys_posx(); virtual float posy(); virtual float visual_posy(); virtual float phys_posy(); virtual int id(); virtual float ix(); virtual float visual_ix(); virtual float phys_ix(); virtual float iy(); virtual float visual_iy(); virtual float phys_iy(); virtual float tan1x(); virtual float visual_tan1x(); virtual float phys_tan1x(); virtual float tan1y(); virtual float visual_tan1y(); virtual float phys_tan1y(); virtual float tan2x(); virtual float visual_tan2x(); virtual float phys_tan2x(); virtual float tan2y(); virtual float visual_tan2y(); virtual float phys_tan2y(); virtual float ex(); virtual float visual_ex(); virtual float phys_ex(); virtual float ey(); virtual float visual_ey(); virtual float phys_ey(); virtual float w(); virtual float visual_w(); virtual float phys_w(); virtual float h(); virtual float visual_h(); virtual float phys_h(); virtual int cr(); virtual int cb(); virtual int cg(); virtual float xpivot(); virtual float ypivot(); virtual float angolorot(); virtual int spessore(); virtual int dash(); virtual int punte(); float arr_w(); float arr_h(); float arr_gap(); /*setta i valori*/ virtual void id(int nw); virtual void ix(float nw); virtual void iy(float nw); virtual void tan1x(float nw); virtual void tan1y(float nw); virtual void tan2x(float nw); virtual void tan2y(float nw); virtual void ex(float nw); virtual void ey(float nw); virtual void posx(float nw){} //da fare virtual void posy(float nw){} //da fare virtual void w(float){} //da fare virtual void h(float){} //da fare virtual void cr(int nw); virtual void cb(int nw); virtual void cg(int nw); virtual void xpivot(float nw); virtual void ypivot(float nw); virtual void angolorot(float nw); virtual void spessore(int nw); virtual void dash(int nw); virtual void punte(int nw); void arr_w(float nw); void arr_h(float nw); void arr_gap(float nw); /** *Disegna l'oggetto PARAMETRI DA DEFINIRE!!!!!! */ virtual void disegna(); virtual void trasla(float dx, float dy); virtual void phys_translate(float dx, float dy); /** *Scala l'oggetto * *\param sc il fattore di scala */ virtual void scale(float sc); /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in gradi in senso antiorario */ virtual void ruota(float xpiv, float ypiv, float angl); virtual void write_native_format(std::ostream& stream, std::string indent); protected: /** *correct arrow for bezier *\param true if arrow is at the end of th e cureve false otherwise */ std::pair correct_arrow_ps(bool end_curve); /** *La bounding box viene scalata di questa quantita' */ static const float scala_bb; int _id; float _ix; float _iy; float _tan1x; float _tan1y; float _tan2x; float _tan2y; float _ex; float _ey; int _cr; int _cb; int _cg; float _xpivot; float _ypivot; float _angolorot; int _spessore; int _dash; int _punte; float _arr_w; float _arr_h; float _arr_gap; enum control_point_edit{none, beg, tan1, tan2, end}; control_point_edit _edited_cp; }; /** *box proc type */ enum box_type { //values matches the ones defined in grammar file NORMAL=0, SHADOWED=1 }; class BoxProc: public procedura{ public: BoxProc(); /** *Costruttore di copia da puntatore */ BoxProc(const BoxProc* altro); /** * *\param id box id *\param cr red component for pen color *\param cg green component for pen color *\param cb blue component for pen color *\param xpiv unused *\param ypiv unused *\param anglrot unused *\param thick pen thickness *\param dash *
   *
   *  (ld_x,ld_y)                     
   *            +-------------------+           
   *            |                   |           
   *            |                   |           
   *            |                   |           
   *            |                   |           
   *            |                   |           
   *            |                   |           
   *            |                   |           
   *            +-------------------+           
   *                      (ru_x,ru_y)  
   *
* */ BoxProc(int id,float ld_x, float ld_y, float ru_x, float ru_y, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int thick, int dash, box_type type); /** *destructor */ virtual ~BoxProc(); virtual void init(); virtual int id(); virtual float w(); virtual float visual_w(); virtual float phys_w(); virtual float h(); virtual float visual_h(); virtual float phys_h(); virtual float posx(); virtual float visual_posx(); virtual float phys_posx(); virtual float posy(); virtual float visual_posy(); virtual float phys_posy(); virtual int spessore(); virtual int dash(); virtual float ld_x(); virtual float ld_y(); virtual float ru_x(); virtual float ru_y(); virtual float phys_ld_x(); virtual float phys_ld_y(); virtual float phys_ru_x(); virtual float phys_ru_y(); virtual float visual_ld_x(); virtual float visual_ld_y(); virtual float visual_ru_x(); virtual float visual_ru_y(); virtual float xpivot(); virtual float ypivot(); virtual float angolorot(); virtual int cr(); virtual int cb(); virtual int cg(); box_type b_type(); virtual bool dentro_bb(float x, float y, float w , float h); virtual void arrows_points(std::vector& x, std::vector& y){}; /* +---------------> | ld | +-----+ | | | | +-----+ ru \ / V */ virtual void get_bounding_box(std::pair& ld, std::pair& ru); virtual void get_phys_bounding_box(std::pair& ld, std::pair& ru); virtual void get_visual_bounding_box(std::pair& ld, std::pair& ru); /** * *\param posx_m ascissa del puntatore *\param posy_m ordinata del puntatore *\return l'id di questo oggetto se il mouse si trova all'interno della *sua bounding box, -1 altrimenti. */ virtual int sotto_mouse(int posx_m, int posy_m); /** *check if a control point of this BoxProc has been hitted by mouse *\return the id of the BoxProc hitted -1 if no one has been hitted */ virtual int control_point_under_mouse(int posx_m, int posy_m); virtual void unset_edit_control_point(); virtual void control_point_transl(float dx, float dy); virtual void id(int nw); virtual void w(float nw); virtual void h(float nw); virtual void posx(float nw); virtual void posy(float nw); virtual void ld_x(float nw); virtual void ld_y(float nw); virtual void ru_x(float nw); virtual void ru_y(float nw); virtual void xpivot(float nw); virtual void ypivot(float nw); virtual void angolorot(float nw); virtual void spessore(int nw); virtual void dash(int nw); virtual void cr(int nw); virtual void cb(int nw); virtual void cg(int nw); void b_type(box_type type); virtual void disegna(); virtual void scale(float sc); virtual void ruota(float xpiv, float ypiv,float angl); virtual void trasla(float dx, float dy); virtual void phys_translate(float dx, float dy); virtual void write_native_format(std::ostream& stream, std::string indent=""); const static int shadow_thickness_factor; protected: /* (_ld.first,_ld.second) +-------------------+ | | | | | | | | | | | | | | +-------------------+ (_ru.first,_ru.second) */ int _id; std::pair _ld; std::pair _ru; int _cr; int _cg; int _cb; float _xpivot; float _ypivot; float _angolorot; int _thickness; int _dash; box_type _box_type; enum control_point_edit{none, ld, ru}; control_point_edit _edited_cp; }; bist-0.5.2/include/matr.hpp0000644000175000017500000005420611025523004014135 0ustar cagecage/* Matrix.h: C++ matrix template class include file (Ver.1.0) Copyright (C) 1997-1998 Somnath Kundu somnath@kagi.com Copyright (C) 2004 Valerio Benfante cage@katamail.com This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /********************************************************************\ Purpose: This matrix template class defines majority of the matrix operations as overloaded operators or methods. Users of this class have been assumed to be familiar with matrix algebra. I have not defined any specialization of this template here, so all the instances of matrix will be created implicitly by the compiler. The data types tested with this class are float, double, long double, complex, complex, complex. I think there should not be any problem with very large precision floating point classes. Operator/Method Description --------------- ----------- operator () : This function operator can be used as a two-dimensional subscript operator to get/set individual matrix elements. operator ! : This operator has been used to calculate inversion of matrix. operator ~ : This operator has been used to return transpose of a matrix. operator ^ : It is used calculate power (by a scalar) of a matrix. When using this operator in a matrix equation, care must be taken by parenthesizing it because it has lower precedence than addition, subtraction, multiplication and division operators. operator >> : It is used to read matrix from input stream as per standard C++ stream operators. operator << : It is used to write matrix to output stream as per standard C++ stream operators. \********************************************************************/ #include #include #include #include using namespace std; class matrix_error : public logic_error { public: matrix_error (const string& what_arg) : logic_error( what_arg) {} }; template class matrix { private: T **Val; size_t Row, Col, RowSiz, ColSiz; void realloc (size_t row, size_t col); int pivot (size_t row); public: matrix (const matrix & m); matrix (size_t row = 6, size_t col = 6); ~matrix (); size_t RowNo () { return Row; } size_t ColNO () { return Col; } size_t Rows () { return RowNo(); } size_t Cols () { return ColNO(); } T& operator () (size_t row, size_t col) throw (matrix_error) ; matrix operator + () { return *this; } matrix operator - () ; matrix & operator = (const matrix & m) ; matrix & operator += (const matrix & m) throw (matrix_error) ; matrix & operator -= (const matrix & m) throw (matrix_error) ; matrix & operator *= (const matrix & m) throw (matrix_error) ; matrix & operator *= (const T& c) ; matrix & operator /= (const T& c) ; matrix & operator ^= (const size_t& pow) throw (matrix_error) ; template friend bool operator == (const matrix & m1, const matrix & m2) ; template friend bool operator != (const matrix & m1, const matrix & m2) ; template friend matrix operator + (const matrix & m1, const matrix & m2) throw (matrix_error) ; template friend matrix operator - (const matrix & m1, const matrix & m2) throw (matrix_error) ; template friend matrix operator * (const matrix & m1, const matrix & m2) throw (matrix_error) ; template friend matrix operator * (const matrix & m, const Ti& no) ; template friend matrix operator * (const Ti& no, const matrix & m) { return (m*no); } template friend matrix operator / (const matrix & m1, const matrix & m2) throw (matrix_error) { return (m1 * !m2); } template friend matrix operator / (const matrix & m, const Ti& no) { return (m*(1/no)); } template friend matrix operator / (const Ti& no, const matrix & m) throw (matrix_error) { return (!m * no); } template friend matrix operator ~ (const matrix & m) ; template friend matrix operator ! (matrix m) throw (matrix_error) ; template friend matrix operator ^ (const matrix & m, const size_t& pow) throw (matrix_error) ; void Null (const size_t& row, const size_t& col) ; void Null () ; void Unit (const size_t& row) ; void Unit () ; void SetSize (size_t row, size_t col) ; matrix Solve (const matrix & v) const throw (matrix_error) ; matrix Adj () throw (matrix_error) ; matrix ElimCol(unsigned int index) throw (matrix_error); matrix ElimRow(unsigned int index) throw (matrix_error); T Det () throw (matrix_error) ; T Norm () ; T Cofact (size_t row, size_t col) throw (matrix_error) ; T Cond () ; T Trace(); bool IsSquare () { return (Row == Col); } bool IsSingular () ; bool IsDiagonal () ; bool IsScalar () ; bool IsUnit () ; bool IsNull () ; bool IsSymmetric () ; bool IsSkewSymmetric () ; bool IsUpperTiangular () ; bool IsLowerTiangular () ; template friend istream& operator >> (istream& i, matrix & m); template friend ostream& operator << (ostream& o, matrix & m); }; template inline matrix ::matrix (size_t row, size_t col) { RowSiz = Row = row; ColSiz = Col = col; Val = new T* [row]; for (size_t i=0; i < row; i++) Val[i] = new T [col]; } template inline matrix ::matrix (const matrix & m) { RowSiz = Row = m.Row; ColSiz = Col = m.Col; Val = new T* [Row]; size_t colsize = Col * sizeof(T); for (size_t i=0; i < Row; i++) { Val[i] = new T [Col]; memcpy( Val[i], m.Val[i], colsize); } } template inline matrix ::~matrix (void) { for (size_t i=0; i < RowSiz; i++) delete [] Val[i]; delete [] Val; } template inline void matrix ::realloc (size_t row, size_t col) { if (row == RowSiz && col == ColSiz) { Row = RowSiz; Col = ColSiz; return; } size_t i; T** Val1 = new T* [row]; for (i=0; i < row; i++) Val1[i] = new T [col]; size_t colSize = ((( Col ) < ( col )) ? ( Col ) : ( col )) * sizeof(T); size_t minRow = ((( Row ) < ( row )) ? ( Row ) : ( row )) ; for (i=0; i < minRow; i++) memcpy( Val1[i], Val[i], colSize); for (i=0; i < RowSiz; i++) delete [] Val[i]; delete [] Val; RowSiz = Row = row; ColSiz = Col = col; Val = Val1; return; } template inline void matrix ::SetSize (size_t row, size_t col) { size_t i,j; size_t oldRow = Row; size_t oldCol = Col; if (row != RowSiz || col != ColSiz) realloc( row, col); if (row > oldRow) for (i=oldRow; i < row; i++) for (j=0; j < oldCol; j++) Val[i][j] = T(0); if (col > oldCol) for (i=0; i < col; i++) for (j=oldCol; j < col; j++) Val[i][j] = T(0); return; } template inline T& matrix ::operator () (size_t row, size_t col) throw (matrix_error) { if (row >= Row || col >= Col) throw matrix_error( "matrixT::operator(): Index out of range!" ); ; return Val[row][col]; } template inline istream& operator >> (istream& istrm, matrix & m) { for (size_t i=0; i < m.Row; i++) for (size_t j=0; j < m.Col; j++) istrm >> m.Val[i][j]; return istrm; } template inline ostream& operator << (ostream &ostrm, matrix & m) { for (size_t i=0; i < m.Row; i++) { for (size_t j=0; j < m.Col; j++) ostrm << m.Val[i][j] << '\t'; ostrm << endl; } return ostrm; } template inline matrix & matrix ::operator = (const matrix & m) { if (Row != m.Row || Col != m.Col) realloc( m.Row,m.Col); size_t colbyte = m.Col * sizeof(T); for (size_t i=0; i < m.Row; i++) memcpy( Val[i], m.Val[i], colbyte); return *this; } template inline bool operator == (const matrix & m1, const matrix & m2) { bool retVal = false; if (m1.Row != m2.Row || m1.Col != m2.Col) return retVal; for (size_t i=0; i < m1.Row; i++) for (size_t j=0; j < m1.Col; i++) if (m1.Val[i][j] != m2.Val[i][j]) return retVal; return true; } template inline bool operator != (const matrix & m1, const matrix & m2) { return (m1 == m2) ? false : true; } template inline matrix & matrix ::operator += (const matrix & m) throw (matrix_error) { if (Row != m.Row || Col != m.Col) throw matrix_error( "matrixT::operator+= : Inconsistent matrix size in addition!" ); ; for (size_t i=0; i < m.Row; i++) for (size_t j=0; j < m.Col; j++) Val[i][j] += m.Val[i][j]; return *this; } template inline matrix & matrix ::operator -= (const matrix & m) throw (matrix_error) { if (Row != m.Row || Col != m.Col) throw matrix_error( "matrixT::operator-= : Inconsistent matrix size in subtraction!" ); ; for (size_t i=0; i < m.Row; i++) for (size_t j=0; j < m.Col; j++) Val[i][j] -= m.Val[i][j]; return *this; } template inline matrix & matrix ::operator *= (const T& c) { for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) Val[i][j] *= c; return *this; } template inline matrix & matrix ::operator *= (const matrix & m) throw (matrix_error) { if (Col != m.Row) throw matrix_error( "matrixT::operator*= : Inconsistance matrix size in multiplication!" ); ; *this = *this * m; return *this; } template inline matrix & matrix ::operator /= (const T& c) { for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) Val[i][j] /= c; return *this; } template inline matrix & matrix ::operator ^= (const size_t& pow) throw (matrix_error) { for (size_t i=2; i <= pow; i++) *this = *this * *this; return *this; } template inline matrix matrix ::operator - () { matrix temp(Row,Col); for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) temp.Val[i][j] = - Val[i][j]; return temp; } template inline matrix operator + (const matrix & m1, const matrix & m2) throw (matrix_error) { if (m1.Row != m2.Row || m1.Col != m2.Col) throw matrix_error( "matrixT::operator+: Inconsistent matrix size in addition!" ); ; matrix temp(m1.Row,m1.Col); for (size_t i=0; i < m1.Row; i++) for (size_t j=0; j < m1.Col; j++) temp.Val[i][j] = m1.Val[i][j] + m2.Val[i][j]; return temp; } template inline matrix operator - (const matrix & m1, const matrix & m2) throw (matrix_error) { if (m1.Row != m2.Row || m1.Col != m2.Col) throw matrix_error( "matrixT::operator-: Inconsistent matrix size in subtraction!" ); ; matrix temp(m1.Row,m1.Col); for (size_t i=0; i < m1.Row; i++) for (size_t j=0; j < m1.Col; j++) temp.Val[i][j] = m1.Val[i][j] - m2.Val[i][j]; return temp; } template inline matrix operator * (const matrix & m, const T& no) { matrix temp(m.Row,m.Col); for (size_t i=0; i < m.Row; i++) for (size_t j=0; j < m.Col; j++) temp.Val[i][j] = no * m.Val[i][j]; return temp; } template inline matrix operator * (const matrix & m1, const matrix & m2) throw (matrix_error) { if (m1.Col != m2.Row) throw matrix_error( "matrixT::operator*: Inconsistent matrix size in multiplication!" ); ; matrix temp(m1.Row,m2.Col); for (size_t i=0; i < m1.Row; i++) for (size_t j=0; j < m2.Col; j++) { temp.Val[i][j] = T(0); for (size_t k=0; k < m1.Col; k++) temp.Val[i][j] += m1.Val[i][k] * m2.Val[k][j]; } return temp; } template inline matrix operator ^ (const matrix & m, const size_t& pow) throw (matrix_error) { matrix temp(m); for (size_t i=2; i <= pow; i++) temp = temp * temp; return temp; } template inline matrix operator ~ (const matrix & m) { matrix temp(m.Col,m.Row); for (size_t i=0; i < m.Row; i++) for (size_t j=0; j < m.Col; j++) temp.Val[j][i] = m.Val[i][j]; return temp; } template inline matrix operator ! (matrix m) throw (matrix_error) { size_t i,j,k; T a1,a2,*rowptr; if (m.Row != m.Col) throw matrix_error( "matrixT::operator!: Inversion of a non-square matrix" ); ; matrix temp(m.Row,m.Col); temp.Unit(); for (k=0; k < m.Row; k++) { int indx = m.pivot(k); if (indx == -1) throw matrix_error( "matrixT::operator!: Inversion of a singular matrix" ); ; if (indx != 0) { rowptr = temp.Val[k]; temp.Val[k] = temp.Val[indx]; temp.Val[indx] = rowptr; } a1 = m.Val[k][k]; for (j=0; j < m.Row; j++) { m.Val[k][j] /= a1; temp.Val[k][j] /= a1; } for (i=0; i < m.Row; i++) if (i != k) { a2 = m.Val[i][k]; for (j=0; j < m.Row; j++) { m.Val[i][j] -= a2 * m.Val[k][j]; temp.Val[i][j] -= a2 * temp.Val[k][j]; } } } return temp; } template inline matrix matrix ::Solve (const matrix & v) const throw (matrix_error) { size_t i,j,k; T a1; if (!(Row == Col && Col == v.Row)) throw matrix_error( "matrixT::Solve():Inconsistent matrices!" ); ; matrix temp(Row,Col+v.Col); for (i=0; i < Row; i++) { for (j=0; j < Col; j++) temp.Val[i][j] = Val[i][j]; for (k=0; k < v.Col; k++) temp.Val[i][Col+k] = v.Val[i][k]; } for (k=0; k < Row; k++) { int indx = temp.pivot(k); if (indx == -1) throw matrix_error( "matrixT::Solve(): Singular matrix!" ); ; a1 = temp.Val[k][k]; for (j=k; j < temp.Col; j++) temp.Val[k][j] /= a1; for (i=k+1; i < Row; i++) { a1 = temp.Val[i][k]; for (j=k; j < temp.Col; j++) temp.Val[i][j] -= a1 * temp.Val[k][j]; } } matrix s(v.Row,v.Col); for (k=0; k < v.Col; k++) for (int m=int(Row)-1; m >= 0; m--) { s.Val[m][k] = temp.Val[m][Col+k]; for (j=m+1; j < Col; j++) s.Val[m][k] -= temp.Val[m][j] * s.Val[j][k]; } return s; } template inline void matrix ::Null (const size_t& row, const size_t& col) { if (row != Row || col != Col) realloc( row,col); for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) Val[i][j] = T(0); return; } template inline void matrix ::Null() { for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) Val[i][j] = T(0); return; } template inline void matrix ::Unit (const size_t& row) { if (row != Row || row != Col) realloc( row, row); for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) Val[i][j] = i == j ? T(1) : T(0); return; } template inline void matrix ::Unit () { size_t row = ((( Row ) < ( Col )) ? ( Row ) : ( Col )) ; Row = Col = row; for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) Val[i][j] = i == j ? T(1) : T(0); return; } template inline int matrix ::pivot (size_t row) { int k = int(row); double amax,temp; amax = -1; for (size_t i=row; i < Row; i++) if ( (temp = abs( Val[i][row])) > amax && temp != 0.0) { amax = temp; k = i; } if (Val[k][row] == T(0)) return -1; if (k != int(row)) { T* rowptr = Val[k]; Val[k] = Val[row]; Val[row] = rowptr; return k; } return 0; } template inline T matrix ::Det () throw (matrix_error) { size_t i,j,k; T piv,detVal = T(1); if (Row != Col) throw matrix_error( "matrixT::Det(): Determinant a non-square matrix!" ); ; matrix temp(*this); for (k=0; k < Row; k++) { int indx = temp.pivot(k); if (indx == -1) return 0; if (indx != 0) detVal = - detVal; detVal = detVal * temp.Val[k][k]; for (i=k+1; i < Row; i++) { piv = temp.Val[i][k] / temp.Val[k][k]; for (j=k+1; j < Row; j++) temp.Val[i][j] -= piv * temp.Val[k][j]; } } return detVal; } template inline T matrix ::Norm () { T retVal = T(0); for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) retVal += Val[i][j] * Val[i][j]; retVal = sqrt( retVal); return retVal; } template inline T matrix ::Cond () { matrix inv(Row,Col); inv = ! (*this); T retVal = Norm() * inv.Norm(); return retVal; } template inline T matrix ::Trace(){ T result(0); if(IsSquare()){ for(unsigned int i=0;i inline matrix matrix ::ElimCol(unsigned int index) throw (matrix_error) { matrix res(Rows(),Cols()-1); if(index > res.Cols()){ throw matrix_error( "matrixT::ElimCol(): index > res.Cols()" ); }else{ for(unsigned int theCol=0;theCol inline matrix matrix ::ElimRow(unsigned int index) throw (matrix_error) { matrix res(Rows()-1,Cols()); if(index > res.Rows()){ throw matrix_error( "matrixT::ElimRows(): index > res.Rows()" ); }else{ for(unsigned int row=0;row inline T matrix ::Cofact (size_t row, size_t col) throw (matrix_error) { size_t i,i1,j,j1; if (Row != Col) throw matrix_error( "matrixT::Cofact(): Cofactor of a non-square matrix!" ); ; if (row > Row || col > Col) throw matrix_error( "matrixT::Cofact(): Index out of range!" ); ; matrix temp (Row-1,Col-1); for (i=i1=0; i < Row; i++) { if (i == row) continue; for (j=j1=0; j < Col; j++) { if (j == col) continue; temp.Val[i1][j1] = Val[i][j]; j1++; } i1++; } T cof = temp.Det(); if ((row+col)%2 == 1) cof = -cof; return cof; } template inline matrix matrix ::Adj () throw (matrix_error) { if (Row != Col) throw matrix_error( "matrixT::Adj(): Adjoin of a non-square matrix." ); ; matrix temp(Row,Col); for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) temp.Val[i][j] = Cofact(i,j); temp = ~temp; return temp; } template inline bool matrix ::IsSingular () { if (Row != Col) return false; return (Det() == T(0)); } template inline bool matrix ::IsDiagonal () { if (Row != Col) return false; for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) if (i != j && Val[i][j] != T(0)) return false; return true; } template inline bool matrix ::IsScalar () { if (!IsDiagonal()) return false; T v = Val[0][0]; for (size_t i=1; i < Row; i++) if (Val[i][i] != v) return false; return true; } template inline bool matrix ::IsUnit () { if (IsScalar() && Val[0][0] == T(1)) return true; return false; } template inline bool matrix ::IsNull () { for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) if (Val[i][j] != T(0)) return false; return true; } template inline bool matrix ::IsSymmetric () { if (Row != Col) return false; for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) if (Val[i][j] != Val[j][i]) return false; return true; } template inline bool matrix ::IsSkewSymmetric () { if (Row != Col) return false; for (size_t i=0; i < Row; i++) for (size_t j=0; j < Col; j++) if (Val[i][j] != -Val[j][i]) return false; return true; } template inline bool matrix ::IsUpperTiangular () { if (Row != Col) return false; for (size_t i=1; i < Row; i++) for (size_t j=0; j < i-1; j++) if (Val[i][j] != T(0)) return false; return true; } template inline bool matrix ::IsLowerTiangular () { if (Row != Col) return false; for (size_t j=1; j < Col; j++) for (size_t i=0; i < j-1; i++) if (Val[i][j] != T(0)) return false; return true; } bist-0.5.2/include/finestra_pr.hpp0000644000175000017500000000164411025523004015504 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ class finestra_pr { public: virtual Fl_Scroll* ritorna_scroll()=0; virtual immagine* ritorna_immagine()=0; virtual mol_canvas* ritorna_mol_canvas()=0; virtual ~finestra_pr(){ }; }; bist-0.5.2/include/gruppo.hpp0000644000175000017500000003657511657505745014546 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ int dummy_pf(atomo* da , atomo* fino, void* data, void* data2 ,void* data3); /** *Questa classe rappresenta un gruppo Un gruppo rappresenta un insieme *eventuale di procedure e' una eventuale molecola
Attenzione: * Il programma assume che un gruppo contenga una sola molecola *ovvero una sola componente connessa. */ class gruppo : public disegnabile, public genitore{ public: /** *Costruttore per copia. */ gruppo(const gruppo& altro); /** *Costruttore senza parametri */ gruppo(); /** *Distruttore */ virtual ~gruppo(); /** *\return true se altro ha lo stesso id di quest'istanza **/ bool operator==(gruppo altro); /** *operatire fi assegnamento overloaded */ gruppo& operator=(const gruppo& altro); /** *setta il valore di visitato per tutti gli atomoi appartenenti a *questo gruppo pari a false **/ void cancel_visitato_all(); /** *Ritorna un puntatore all'atomo di questo gruppo identificato dal suo *id. * *\param id l'id dell'atomo da cercare *\return un puntatore all'atomo trovato, se esiste, 0 altrimenti */ atomo* find_atomo_id(int id); /** *Ritorna un puntatore alla procedura di questo gruppo identificata dal suo *id. * *\param id l'id della procedura da cercare *\return un puntatore alla procedura trovata, se esiste, 0 altrimenti */ procedura* find_proc_id(int id); /** *Setta il valore dell 'id del gruppo * \param nx nuovo id */ void id_gruppo(int nw); void id(int nw); /** *Setta il valore dell 'id del gruppo * \param nx nuovo tipo */ void tipo_gruppo(int nw); void xpivot(float nw); void ypivot(float nw); void angolorot(float nw); float xpivot(); float ypivot(); float angolorot(); float posx(); float posy(); float phys_posx(); float phys_posy(); float visual_posx(); float visual_posy(); /** *Allinea l'etichetta rispetto al legame */ void allinea_etichetta(etichetta& sy,atomo& start); void visual_allinea_etichetta(etichetta& sy,atomo& start); /** *Ritorna l'id del gruppo */ int id_gruppo(); /** *Ritorna l'id del gruppo */ virtual int id(); /** *Ritorna il tipo di gruppo */ int tipo_gruppo(); /** *Ritorna un iteratore corrispondente all'inizio del vettore contenente *gli id degli atomi. */ vector::iterator iniz_atom(){ return _atomi.begin(); } /** *Ritorna un iteratore corrispondente alla fine del vettore contenente *gli id degli atomi. */ vector::iterator fin_atom(){ return _atomi.end(); } bool has_atoms(); /** *Ritorna un iteratore corrispondente all'inizio del vettore contenente *le procedure. */ vector::iterator iniz_procedure(){ return _procedure.begin(); } /** *Ritorna un iteratore corrispondente alla fine del vettore contenente *le procedure. */ vector::iterator fin_procedure(){ return _procedure.end(); } /** *Aggiunge una procedura. * *\param proc la procedura da aggiungere *\return the new proc id */ int aggiungi_procedura(procedura* proc); /** * Elimina una procedura *\param id id della procedura */ void elimina_proc(int id){ vector::iterator iniz=_procedure.begin(); vector::iterator fin=_procedure.end(); procedura* cancellare=0; while(iniz!=fin){ if((*iniz)->id()==id){ cancellare=(*iniz); _procedure.erase(iniz); break; } iniz++; } delete cancellare; } /** *Elimina l'atomo. *\param id l'id dell'atomo da eliminare * *\return un iteratore al successivo elemento del vettore */ vector::iterator elimina_atomo(int id); /** *Elimina l'atomo e i legami che lo referenziano negli altri atomi *appartenenti al gruppo. *\param id l'id dell'atomo da eliminare *\return true se l'atomo e' stato eliminato, false altrimenti. */ bool purge_atom(int id); /** *Aggiunge un atomo al gruppo e eventualmente li ordina secondo *l'operatore "minore di". * *\param nw nuovo atomo *\param sorted ordina o meno gli elementi */ void add_atomo(atomo nw, bool sorted=true); /** *Aggiunge un atomo al gruppo setta un id unico e ordina secondo l'operatore "minore di" *gli atomi. * *\param nw nuovo atomo *\return l'id assegnato */ int add_atomo_id(atomo nw); float w(); float h(); float phys_w(); float phys_h(); float visual_w(); float visual_h(); virtual void disegna(); virtual bool is_shown(); /** * *Ruota il fruppo in senso orario. * *\param angl l'angolo di rotazione in radianti in senso orario *\param xpivot ascissa relativa all'asse di rotazione *\param ypivot ordinata relativa all'asse di rotazione * */ virtual void ruota(float angl,float x_pivot,float y_pivot); virtual void scale(float sc); void scale_from_origin(float sc); virtual void trasla(float dx,float dy); void phys_translate(float dx,float dy); void ruota(); void generic_depth_search(atomo* da, void* data, void* data2 ,void* data3,void* data4, int (*map_atom)(atomo* da , atomo* fino, void* data, void* data2, void* data3), bool(*ignore)(atomo* atm, void* data4)); /** *Scandisce il grafo degli atomi con una ricerca depth first; ai nodi *collegati a quello visitato viene applicata la funzione pf; * */ void generic_depth_search(atomo* da, void* data, void* data2 ,void* data3, int (*pf)(atomo* da , atomo* fino, void* data, void* data2, void* data3)); /** *Scandisce il grafo degli atomi con una ricerca depth first; al nodo *visitato viene applicato la funzione pf; * */ void generic_depth_search_appl_popped(atomo* da, void* data, void* data2 ,void* data3, int (*pf)(atomo* da, void* data, void* data2, void* data3) ); void generic_depth_search_appl_popped(atomo* da, void* data, void* data2 , void* data3, void* data4, int (*pf)(atomo* da ,void* data, void* data2, void* data3) , bool(*ignore)(atomo* atm, void* data4)); /** *Crea un "seme" per questo gruppo ovvero due atomi di carbonio legati *tra di loro in una certa posizione e legati con un legame standard. */ void genera_seme(float x1, float y1, float x2, float y2, int tipo= LEGAME_SINGOLO ) throw (range_error); /** *Calcola il numero di componenti connesse per questo gruppo * *\param no il numero di componenti connesse */ void no_componenti_connesse(int& no); void rimappa_da(int nwid); int rimappa_da(int nwid, int id_vec); void ordina(); bool substructure_match(gruppo substructure); virtual void get_bounding_box(std::pair& ld, std::pair& ru); virtual void get_phys_bounding_box(std::pair& ld, std::pair& ru); virtual void get_visual_bounding_box(std::pair& ld, std::pair& ru); virtual void arrows_points(std::vector& x, std::vector& y); /** *fa il clipping di un segmento * */ int clip_leg(float xrect, float yrect, float w, float h, atomo& da , atomo& fino,float& xrisul, float& yrisul); protected: /** *Check if atom is bonded to another by bond_type bond *\return the first occurence of the bonded atom, 0 therwise */ atomo* check_atom_son_by_bond_type(atomo* parent, int bond_type); /** *Check if atom is bonded to another by bond_type bond AND visitato()== visited_value *\return the first occurence of the bonded atom, 0 therwise */ atomo* check_atom_son_by_bond_type(atomo* parent, int bond_type, bool visited_value); atomo* check_atom_son_by_bond_type(gruppo* group, atomo* parent, int bond_type, bool visited_value); void clip_lato_cuneo(float* risul, float xlegstart, float ylegstart, float xlegend,float ylegend, float xcunstart, float ycunstart, float xcunend, float ycunend); /** *Una depth first utile per trovare un ciclo * *\param visitati un vettore che mantiene il conto dei nodi *completamente visitati (black) * *\param grigi un vettore che mantiene il conto dei nodi visitati ma *non completamente * *\param genitori un vettore che mantiene il conto dei nodi dei *genitori (genitori[v]=q q e' genitore di v). * *\param ultimo atomo che chiude il ciclo * *\param da primo atomo del legame doppio * *\param fino secondo atomo del legame doppio * * *\param risult vale true se si e' trovato un ciclo false altrimenti * *\param st atomo dal quale partire */ void depth_first_ciclo(atomo* st,atomo* da,atomo* fino, vector& grigi, vector& visitati, vector& genitori, bool& risult,atomo** ultimo, bool& primo_e_adiacente); /** *Ritorna la posizione nell'array _atomi dell'atomo indentificato da *id * *\param id l'id dell'atomo da ricercare * *\return la posizione dell'atomo nell'array -1 in caso di ricerca *infruttuosa */ int get_position_inarr(int id); /** *Renderizza gli elettroni spaiati. * *\param atm l'atomo da renderizzare *\param x l'ascissa della stringa *\param y l'ordinata della stringa *\param w la larghezza della stringa *\param h l'altezza del font *\param dopp true se si vole disegnare un doppietto */ void render_el_spaiati(atomo& atm,float x, float y, float w, float h, bool dopp=false); std::vector calculate_electron_pos_relative(atomo& atm); /** *Renderizza le cariche se esistono. * *\param atm l'atomo da renderizzare *\param x l'ascissa della stringa *\param y l'ordinata della stringa *\param w la larghezza della stringa *\param fon il tipo di font *\param dim le dimensioni del font *\return la posizione occupata dalla carica secondo il seguente schema: *
   *                     3 
   *	    +-------------------------+
   *	    |                         |
   *	  2 |                         | 0
   *	    |                         |
   *	    +-------------------------+
   *                     1
   *
* * >3 indica nessun lato libero * *La box viene scandita in senso orario a partire dal lato verticale *destro. */ int render_carica(atomo& atm,float x, float y, float w,int fon, int dim); /** *Renderizza un legame che si allontana da noi * *\param x1 ascissa del punto di partenza del legame *\param y1 ordinata del punto di partenza del legame *\param x2 ascissa del punto di arrivo del legame *\param y2 ordinata del punto di arrivo del legame */ void render_stereo_down(float x1, float y1, float x2, float y2, int cr, int cg, int cb); /** *Renderizza un doppio legame * *\param da atomo da cui parte il legame *\param fino atomo a cui il legame arriva * *\param x1 ascissa del punto di partenza del legame *\param y1 ordinata del punto di partenza del legame *\param x2 ascissa del punto di arrivo del legame *\param y2 ordinata del punto di arrivo del legame *\param tratt true se si vuole che uno dei legami sia *tratteggiato */ void render_doppio(atomo& da, atomo& fino, float x1, float y1, float x2, float y2, int cr, int cg,int cb, bool tratt); void render_double_forced(atomo& da, atomo& fino, float x1, float y1, float x2, float y2, int cr, int cg, int cb, bool tratt,bool side); /** *Renderizza un legame * *\param da atomo da cui parte il legame *\param fino atomo a cui il legame arriva *\param il_legame il legame da renderizzare * */ void render(atomo& da, atomo& fino, legame& il_legame); /** *disegna un cuneo pieno da stretto a largo *param da atomo di partenza *\param fino atomo di arrivo *\param strettox ascissa del punto di partenza del legame *\param strettoy ordinata del punto di partenza del legame *\param largox ascissa del punto di arrivo del legame *\param largoy ordinata del punto di arrivo del legame */ void renderizza_stereo_up(atomo &da, atomo& fino,float strettox, float strettoy, float largox, float largoy, int cr, int cg, int cb); /** *disegna un legame ispessito da (x1,y1) a (x2,y2) *\param x1 ascissa del punto di partenza del legame *\param y1 ordinata del punto di partenza del legame *\param x2 ascissa del punto di arrivo del legame *\param y2 ordinata del punto di arrivo del legame */ void renderizza_ispessito(float x1, float y1, float x2, float y2, int cr, int cg, int cb); /** *Renderizza un legame a strereochimica sconosciuta * *\param x1 ascissa del punto di partenza del legame *\param y1 ordinata del punto di partenza del legame *\param x2 ascissa del punto di arrivo del legame *\param y2 ordinata del punto di arrivo del legame * */ void renderizza_stereo_scon(float x1,float y1,float x2,float y2, int cr, int cg, int cb); /** *Scandisce il grafo degli atomi con una ricerca depth first e lo disegna. * *\param start l'atomo da cui partire. **/ void depth_search(atomo& start); /** *Ritorna true se l'atomo da e fino fanno parte di un ciclo, false *altrimenti. * *\param ultimo dopo aver fatto andare la funzione ultimo porta *l'atomo legato a da che chiude il ciclo * *\return true se da e fino fanno parte di un ciclo false altrimenti. */ bool trova_ciclo(atomo& da, atomo& fino, atomo** ultimo); int _id_gruppo; int _tipo_gruppo; vector _procedure; vector _atomi; float _angolorot; float _xpivot; float _ypivot; }; /** *Ordina secondo l'id in ordine cresente. */ bool ordina_gruppo_id(gruppo uno, gruppo altro); class GruppoLink{ public: int _first; int _second; int _bondtype; }; /** *links two groups whithout id conflict checking */ gruppo link_groups(gruppo* fst, gruppo* snd, std::vector links); etichetta scaled_charge_etichetta(atomo& atm,float f_size); bist-0.5.2/include/immagine.hpp0000644000175000017500000005530011653002572014765 0ustar cagecage /* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #define IMMAGINE_LEGAMI_SELECTED_SZ 3 /** * atomo* root=reinterpret_cast(data); * float dx=*(reinterpret_cast(data2)); * float dy=*(reinterpret_cast(data3)); */ void trasl_subgroup_as_subtree(gruppo* the_group, atomo* root, atomo* start, float dx, float dy); int appartiene_legame(atomo* da , atomo* fino, void* data, void* data2 ,void* data3); int quale_gruppo(atomo* da , atomo* fino, void* data, void* data2 ,void* data3); int appartiene_legame_bb(atomo* da , atomo* fino, void* data, void* data2 ,void* data3); int appartiene_legame_prop(atomo* da , atomo* fino, void* data, void* data2 ,void* data3); /** *ordina in senso decrescente secondo l'id dell'elemento */ bool ordina_id_decr_elem_selected(pair < int, pair > uno , pair < int, pair > altro); /** *Parsa l'input costruendo una rappresentazione della molecola in *memoria utile ad essere disegnata o modificata. */ class immagine: public disegnabile{ friend class bist_plugin; public: /** *Costruttore di default */ immagine(bool preview=false); /** *Costruttore di copia */ immagine(const immagine& altra); immagine(const immagine* altra); immagine& operator=(const immagine& altra); immagine& operator=(const immagine* altra); /** *Costruisce, l'oggetto parsando il file passato come argomento. */ immagine(string path); virtual ~immagine(); /** *\return _has_error **/ bool has_error(); /** *\return l'ennesimo gruppo del vettore */ gruppo& ritorna_gruppo(int i); /** *\return l'ultimo gruppo del vettore */ gruppo& ritorna_ultimo_gruppo(); /** *trova e ritorna un puntatore al gruppo identificato da id *\param id l'id del gruppo da cercare *\return l'ultimo gruppo del vettore */ gruppo* find_group_id(int id); std::vector::iterator first_gruppo(); std::vector::iterator end_gruppo(); /** *incolla la selezione traslandola * *\param xt entita' della traslazione lungo l'asse x *\param yt entita' della traslazione lungo l'asse y * */ void paste(int xt,int yt); /** *\return l'ennesima etichetta del vettore */ etichetta* ritorna_etich(int i); /** *\return un puntatore all'ennesima etichetta del vettore */ etichetta* ritorna_etich_pointer(int i); /** *Controlla se un atomo si trova sotto al puntatore * *L'atomo viene aggiunto al _elem_selected e ris e' un puntatore allo *stesso. * *\return l'id dell'atomo sotto al mouse oppure -1 se non si e' *cliccato su nessun atomo. * */ int prova_click_atomo(atomo** ris,int x, int y); /** *Controlla quali elementi sono sotto al puntatore * *Gli elementi cliccati vengono aggiunti a _elem_selected. *I legami cliccati vengono aggiunti a _legami_selected. * \return true if something has been hitted fale otherwise *\param exists true if hitted element (atom or procedure) already exists */ bool prova_click(int x, int y, bool& exists, bool erase_previous=true); /** *check which labels are under mouse pointer *if any they will be added to _elem_selected * \return true if something has been hitted false otherwise *\param exists true if hitted label already exists */ bool check_click_etichetta(int x, int y , bool& exists, bool erase_previous); /** *check which bond is under mouse pointer *if any it will be added to _elem_selected * \return true if something has been hitted false otherwise *\param exists true if hitted label already exists */ bool check_click_bond(int x, int y , bool& exists, bool erase_previous); /** *check if there is an element under mouse pointer and if is in *current _elem_selected vector. *\return if element exists in current vector */ bool check_exists_in_elem_selected(int x_m,int y_m,bool& exists); bool check_selected_group_atom_coincidence(atomo** selected, atomo** hook); bool check_selected_group_bond_coincidence(atomo** selected_1, atomo** selected_2, atomo** hook_1 , atomo** hook_2); /** *check ifthere is a control point of a procedura under the mouse *pointer, if so set the procedura for edit control point mode. *\return true if control poin of any procedura has been hitted */ bool check_control_point_procedura_under_mouse(int x_m,int y_m); void translate_control_points(float dx, float dy); void unset_selected_control_points(); /** *Controlla quale gruppo e sotto il puntatore * *Gli elementi cliccati vengono aggiunti a _elem_selected. *I legami cliccati vengono aggiunti a _legami_selected. *\return true if something has been added */ bool click_gruppo(int x, int y, bool erase_previous=false); void remove_gruppo_id(int gid); /** *Controlla quali elementi sono ddentro la bounding box. */ void aggiungi_se_dentro_bb(float x, float y, float w , float h); virtual void disegna(); virtual void ruota(); virtual void ruota(float xpiv, float ypiv,float angl); virtual void trasla(float dx, float dy); virtual void phys_translate_selected(int xn, int yn); virtual void scale(float sc); float w(); float visual_w(); float phys_w(); float h(); float visual_h(); float phys_h(); /** *Disegna quattro quadratini ai vertici delle bounding_box degli *elementi selezionati. */ void highlight_selected(); /** *Trasla gli elementi selezionati * *\param xn nuova ascissa *\param yn nuova_ordinata */ void trasla_selected(int xn, int yn); /** *Ruota gli elementi selezionati * *\param xpivot ascissa dell'asse di rotazione (perp. allo schermo) *\param ypivot ordinata " " " *\param angl angolo di rotazione (radianti?) */ void ruota_selected(float angl,int xpivot,int ypivot); /** *Ruota in 3d e proietta nel piano *Gli assi sono orientati secondo la regola della mano sinisra (come nelle opengl) * *\param axis true=asse x , false= asse y *\param angle entit della rotazione */ void rotate_selected_3d(bool axis, float angle); /** *Scala gli elementi selezionati *\param fatt il fattore di scala. */ void scala_selected(float fat); /** *Scale only labels of selected atoms *\param fatt il fattore di scala. */ void scale_label_of_atom_selected(float fat); /** *shift type of selected bond * */ void shift_type_bond_selected(); /** *flip della molecola * *\param x ascissa del puntatore del mouse *\param y ordinata del puntatore del mouse *\param hor true se il flipping deve essere orizzontale false se verticale */ void flip(int x,int y, bool hor=true); void flip_group (int group_id, bool hor=true); void copy_flip(int x,int y, bool hor=true); void copy_flip_group(int id_group , bool hor=true); /** *Cancella tutta l'immagine ma senza deallocarla, non e' un distuttore. */ void reset_all(); /** *Aggiunge un template * *\param templ_file il file di template */ void aggiungi_template(string templ_file); /** *carica in memoria il file di input */ virtual void filebist(string path); /** *Avvia il parsing */ virtual void start(); /** *Stampa su console gli errori. */ void print_errors(); /** *Stampa su console i warning. */ void print_warn(); /** *elimina gli errori */ void elimina_err(); /** *elimina i warning */ void elimina_warn(); /** *elimina i gruppi selezionati */ void elimina_elem_selected(); /** *Aggiunge un elemento selezionato *\return false if element already exists */ bool aggiungi_elem_selected(int tipo, int grp,int id); /** *elimina i legami selezionati */ void elimina_legami_selected(); /** *Aggiunge un legame selezionato */ void aggiungi_legami_selected(int gruppo, int id_atomo_app, int id_legame); /** *Cambia colore agli elementi selezionati */ void cambia_colore_sel(int r, int g, int b); /** *Cambia colore all'etichetta degli atomi selezionati */ void cambia_colore_sel_etich(int r, int g, int b); /** *Elimina dalla molecola gli elementi (e i legami) selezionati. */ void cancella_elementi_selected(); /** *Erase and free the memori associated with _stringhe[i] * */ void delete_etichetta_at(unsigned int i); /** *Erase and free the memori associated with _stringhe *\param i the iterator of the string to delete */ void delete_etichetta_at(vector::iterator instr); /** *Apre una finestra di dialogo e cambia le proprieta del legame a cui *appertengono le coordinate date come argomento. */ void cambia_prop_legami(int x, int y); /** *Apre una finestra di dialogo e cambia le proprieta della freccia a cui *appertengono le coordinate date come argomento. */ bool cambia_prop_frecce(int x , int y); /** *Apre una finestra di dialogo e cambia le proprieta della curva a cui *appertengono le coordinate date come argomento. * *\return true se il mouse e' sopra una curva di bezier false altrimenti */ bool cambia_prop_bezier(int x , int y); /** *Apre una finestra di dialogo e cambia le proprieta dell'ellisse a *cui appertengono le coordinate date come argomento. * *\return true se il mouse e' sopra una curva di bezier false altrimenti */ bool cambia_prop_arc(int x , int y); bool change_prop_box(int x , int y); /** *Apre una finestra di dialogo e cambia le proprieta dell'atomo a cui *appertengono le coordinate date come argomento. * *\return true se si e' cliccato su un atomo false altrimenti */ bool cambia_prop_atomo(int x, int y); /** *Apre una finestra di dialogo e cambia le proprieta dell'etichetta a cui *appertengono le coordinate date come argomento. * *\return true se si e' cliccato su un etichetta false altrimenti */ bool cambia_prop_etichetta(int x, int y); /** *Crea ed aggiunge un nuovo gruppo vuoto e losffiunge al vettore * *\return id del nuovo gruppo creato */ int create_empty_group(); /** *Crea ed aggiunge a _gruppi un nuovo gruppo con un legame standard con gli *atomi nelle posizioni specificate * */ atomo* crea_legame_nuovo(float x1,float y1,float x2, float y2, int tipo= LEGAME_SINGOLO ); /** * Crea un nuovo gruppo contenente la freccia specificata * *\param dax ascissa del punto di inizio della freccia *\param day ordinata del punto di inizio della freccia *\param ax ascissa del punto di arrivo della freccia *\param ay ordinata del punto di arrivo della freccia * */ void crea_freccia_nuova(int dax, int day, int ax, int ay); /** *Crea un nuovo gruppo contenente una curva di bezier * *\param punti un vettore di coppie ascisse ordinate, ovvero i punti *di controllo della curva */ void crea_bezier_nuova(vector< pair > punti); /** *Crea una nuova ellisse partendo dall'angolo in alto a sinistra e altezza */ void crea_ellisse_nuova(int xc,int yc, int w, int h); /** *create a new box */ void create_new_box(int ld_x, int ld_y, int ru_x, int ru_y); /** *Aggiunge al gruppo cui appartiene gen un nuovo atomo legato a gen *con un legame specificato da tipo e di colore standard. * *\param gen puntatore all atomo a cui aggiungere il nuovo atomo *\param x ascissa del nuovo atomo *\param y ordinata del nuovo atomo *\param tipo il tipo di legame * *\return il puntatore all'atomo creato dal legame. * */ atomo* crea_legame_nuovo(atomo* gen, float x, float y, int tipo); /** *Aggiunge un legame tra l'atomo st e arr che devono appartenere al medesimo gruppo. */ void crea_legame_nuovo(atomo* st, atomo* arr, int tipo); /** *dato un identificativo di gruppo e di atomo valido ritorna un *puntatore all'atomo identificato * */ atomo* ritorna_atomo_ident(int gr_id, int atm_id); /** *Salva l'immagine nel formato nativo * *\param path il file da salvare */ void w_immagine(string path); /** *Salva un gruppo nel formato nativo */ void w_gruppo(int pos,std::ofstream& out); /** *Salva un'etichetta nel formato nativo */ void w_etichetta(etichetta& sy,ofstream& out); /** *Salva un'etichetta nel formato nativo */ void w_etichetta(etichetta* sy,ofstream& out); void w_multiline_label(multiline_label* sy,ofstream& out); void w_multifont_label(multifont_label* sy,ofstream& out); void w_paragraph_text(paragraph_text* sy,ofstream& out); /** *Salva un atomo nel formato nativo */ void w_atomo(atomo& atm,ofstream& out); /** *Ritorna un puntatore all'etichetta sel vettore _stringhe in *posizione at. */ etichetta* ritorna_punt_etich(int at); /** *Aggiunge una nova etichetta in coda al vettore _stringhe */ void aggiungi_etich(etichetta nuova); void aggiungi_etich(etichetta* n); /** *Add a pointer to an etichetta in _stringhe */ void add_etich(etichetta* n); /** *Add an etichetta to _stringhe */ void add_etich(etichetta n); /** *Ritorna il numero di etichette nel vettore stringa */ int numero_etichetta(); /** *size of _string vector */ int size_etich_vector(); /** *size of _gruppi vector */ int size_gruppi_vector(); /** *Semplicemente aggiunge in coda a _grupp il gruppo added */ void aggiungi_gruppo(gruppo& added); /** *\return the size of _elem_selected */ unsigned int elem_selected_size(); void PROVA_ISOMORPH(){ std::cerr << "isomorph!!" << std::endl; _gruppi[0].substructure_match(_gruppi[1]); } void aabb_elem_selected(pair& ld, pair& ru); /** *Aggiunge il gruppo added co n tutti i suoi legami e procedure agli *elementi selezionati */ void aggiungi_tutto_selected(gruppo added); protected: /** *Spezza un gruppo composto compostao da piu' componenti connesse in *piu' gruppi contenenti una singola componenete connessa. Le *procedure vengono attribuite al primo gruppo quindi attenzione! */ void spezza_gruppo(); /** *Cerca una procedura con lo stesso id. * *\param proc la procedura da controllare *\return true se trovata false altrimenti */ bool find_proc(procedura* proc); public: /** *Fa il dump su standard output di tmp_atom, utile per il debug. */ void dump_tmp_atom(); protected: /** *Parsa i legami della lista di adiacenza che rappresenta i legami */ void p_legami(); /** *Parsa la lista di adiacenza che rappresenta i legami */ void p_lista(); /** *Parsa un atomo. */ void p_atomo(); /** *Parsa un gruppo. */ void p_gruppo(); /** *Parsa le procedure */ void p_procedure(); /** *Parsa una stringa (ovvero una frase che non e' appartenente a nessun *atomo). */ void p_stringhe(); /** *Parsa un'etichetta *\return l'etichetta parsata ( attenzione *controllare il valore di immagine::_has_error, se si e' verificato *un errore la funzione ritorna un etichetta contenente spazzatura. */ etichetta p_etichetta(); paragraph_text p_paragraph_text(); multifont_label p_multifont_label(); multiline_label p_multiline_label(); /** *Parsa l'elemento dell'atomo */ void p_elemento(); /** *parsa la rotazione del gruppo */ void p_grot(gruppo& grp); /** *Parsa un intero.Se il parsing non va a buon fine setta true la *variabile _has_error. * *\param num la stringa che rappresenta il *numero. */ int p_int(string num); /** *Parsa il valore di un etichetta *\param etic l'etichetta nella quale consevare i valori */ void p_valore(etichetta& etic); /** *Trova un intero delimitato * *

controllare sempre la variabile _has_error dopo aver usato * questa funzione

* *\param conc il delimitatore * *\return l'intero parsato */ int trova_campo_etic_int(const char* conc); /** *Trova un float delimitato * *

controllare sempre la variabile _has_error dopo aver usato * questa funzione

* *\param conc il delimitatore * *\return l'intero parsato */ float trova_campo_etic_float(const char* conc); /** *Controlla la effettiva chiusura di un blocco: genera un errore e *setta _has_error=true se il blocco non e' chiuso. ( Attenzione *questo metodo fa avanzare il cursore nella stringa da parsare fino *ad escludere il delimitatore del blocco. */ void chk_chiusura_blocco(); /** *Genera un messaggio d'errore dovuto al prematura raggiungimento *della fine del file. */ string gen_err_eof(); /** *Genera un messaggio d'errore del tipo: * *
   *
   *brano del file incriminato "  In posizione: " _punt_mol " era atteso"
   *+ missing + " trovato: " + + _molecule.substr(start,length);
   *
   *
*/ string gen_err_miss_string(string missing,int start, int length); /** *Genera un messaggio d'errore del tipo: * *
   *
   *brano del file incriminato "  In posizione: " _punt_mol " era atteso
   *un numero" " trovato: " + _molecule.substr(start,length);
   *
   *
*/ string gen_err_miss_number(int start, int length); /** *Genera un messaggio di avvertimento se l'elemento parsato ha un *conflitto di id con un altro. * *\param elem l'elemento che confligge *\param id l'ide dell'elemento che confligge */ string gen_warn_id_conflict(string elem, int id); /** *In caso di errore setta a true _has_error e aggiunge una stringa di *errore in _error. * *\return la posizione eventuale della graffa aperta o *string::size_typenpos. */ string::size_type trova_apri(); /** *In caso di errore setta a true _has_error e aggiunge una stringa di *errore in _error. * *\return la posizione eventuale della graffa chiusa o *string::size_typenpos. */ string::size_type trova_chiudi(); /** *In caso di errore setta a true _has_error e aggiunge una stringa di *errore in _error. * *\return la posizione eventuale della virgola o *string::size_typenpos. */ string::size_type trova_sep(); /** *check the string to be parsed for escaped code and increment the pointer *to the former * *\return the escaped shar or "" if no escape code "\\" has been found */ string check_escape_char(); /** *add slash for esapable chars * *the char that need to be esacaped have bee defined in *include/global.hpp ad are the keyword of the bist file * *\param the string w/o escaped code *\return the escaped string */ string add_slash_to_escape(string to_escape); /** *clean molecule string from null chars as defined in include/global.hpp */ void clean_molecule_from_nullchars(); void create_progressw(); /** *temporaneamente gli atomi parsati vanno qui */ vector _tmp_atom; bool _trovato_apice; bool _trovato_pedice; bool _has_error; unsigned int _punt_mol; vector _error; vector _warning; string _filebist; string _molecule; vector _stringhe; //vector _atomi; vector _gruppi; /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ vector< pair < int, pair > > _elem_selected; /** *Contiene triplette: gruppo, atomo di appartenenza e id dei legami selezionati */ vector _legami_selected; /** *val true se l'immaggine e' una preview false altrimenti */ bool _is_preview; Fl_Window* _export_progressw; Fl_Progress* _export_progressw_bar; }; int glue_find_first_near(atomo* from , atomo* to, void* dist, void* atom_other, void* res); /** *\param res_sel_ std::vector< std::pair< std::pair, std::pair > > */ int glue_find_line_near_sel(atomo* from , atomo* to, void* res, void* d, void* d1); /** *\param res_sel_ std::vector< std::pair< std::pair, std::pair > > *\param res std::vector where res_sel[res[0]] are pointers to atom in selected group for bond * and res[1] , res[2] are id of atoms in the other group */ int glue_find_line_near_hook(atomo* from , atomo* to, void* res_sel, void* res, void* found); void export_image_to_vector_file(immagine imm,std::string output_file, bool graphics=true); void export_image_to_EPS_file_cairo(immagine imm,std::string output_file); void export_image_to_SVG_file_cairo(immagine imm,std::string output_file); void export_image_to_PNG_file_cairo(immagine imm,std::string output_file); /* Il parser parsa il file riempiendo: - un vector < atomo > descrivente il grafo molecolare, ogni elemento del vettore contiene le caratteristiche specificate dal file e un vector contenente l'id del legame l' id dell'atomo a cui e' legato e il tipo (sigolo, doppio, triplo, verso di noi , allontanantesi) -ogni volta che si incontra un gruppo il parser riempie il vettore del grafo con gli atomi che lo costituiscono e riempie un vector< gruppi> con gli elementi che contengono l'id del gruppo e un vector < int > contenenti gli id degli atomi che compongono i gruppi Ogni volta che si aggiunge un atomo si conserva questo (oltre che nel vettore principale del grafo) anche in un vettore temporaneo e si controlla questo per vedere se questo sottografo corrisponde a qualche gruppo particolare (fenile sistemi coniugati carichi e poi?) se si ha una corrispondenza si modifica il vettore dei gruppi aggiungendo quello nuovo e si azzera il vettore temporaneo. */ bist-0.5.2/include/cairo_t_singleton.hpp0000644000175000017500000000040111153036406016667 0ustar cagecageclass cairo_t_singleton { public: static cairo_t* get_context(cairo_surface_t* surf=NULL); static void free_context(); static void destroy(); static bool can_export(); protected: cairo_t_singleton(); static cairo_t* context; }; bist-0.5.2/include/box_prop.hpp0000644000175000017500000000313511371022374015025 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 void box_prop_color_cb(Fl_Widget* w, void* d); void box_prop_ok_cb(Fl_Widget* w, void* d); void box_prop_cancel_cb(Fl_Widget* w, void* d); void box_prop_width_cb(Fl_Widget* w, void* d); void box_prop_tick_cb(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cabiare le propriet degli *boxhi */ class box_prop : public Fl_Double_Window{ friend void box_prop_tick_cb(Fl_Widget* w, void* d); friend void box_prop_color_cb(Fl_Widget* w, void* d); friend void box_prop_ok_cb(Fl_Widget* w, void* d); friend void box_prop_cancel_cb(Fl_Widget* w, void* d); friend void box_prop_width_cb(Fl_Widget* w, void* d); friend void box_prop_type_cb(Fl_Widget* w, void* d); public: box_prop(BoxProc* arr); virtual ~box_prop(); protected: BoxProc* _box; }; void box_win(BoxProc* at); bist-0.5.2/include/command_line.hpp0000644000175000017500000000172511161162621015622 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** *stampa versione */ void print_version(); /* *stampa aiuto */ void print_help(char* nome); /** *converte in formato vettoriale dalla linea di comando */ void convert_to_vector_format(string in,string out, const char* format="ps"); bist-0.5.2/include/bist_plugin.hpp0000644000175000017500000001102511360326153015511 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** *Un plugin per bist; per scriverne uno basta ereditare da questa classe *ridefinendo i metodi virtuali puri. * *Il plugin viene crerato ed inizializzato da *editor::start_plugin_cb(Fl_Widget* w, void* d) il quale prima apre la *libreria e crea l'oggetto e richiama il metodo *bist_plugin::inizialize. Questo metodo puo' essere utile per richiamae *finestre di dialogo ad esempio. L'oggetto specifico (derivato da *bist_plugin non puo' essere inizializzato direttamente perche in fase *di compilazione il linker nulla sa diei tipi presenti nella libreria *dinamica dove e' definito il plugin. quindi bisogna definire anche *due funzioni: * *extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); *extern "C" void destroy_plugin(bist_plugin* j); * *che, rispettivamente, creano e distruggono l'oggetto plugin effettivio *derivato da bist_plugin * *Successivamente il metodo mol_canvas::handle richiama come prima istruzione *mol_canvas::plugin()->need_to_act() e se questo vale true allora viene richiamato *mol_canvas::plugin()->act() che fa agire il plugin ed esce da handle(). * *E' importante capire che mol_canvas::plugin()->need_to_act() serve a *far "capire" al plugin se e' il momento di agire in quanto il plugin *puo' valutare di "rivegliarsi" ed agire solo quando almeno un elemento *e' stato selezionato, ad esempio. * *e' conveniente dare un'occhiata ai sorgenti nella directory pluginsrc *(in particolare join_ring.cpp e insert_template.cpp) per capire come *funzioni il sistema di plugin e come scriverne uno. */ class bist_plugin { public: /** *Crea il plugin *\param imm l'immagine da modificare *\param libpath il path della libreria da inizializzare */ bist_plugin(immagine* imm,string libpath); virtual ~bist_plugin(); /** *Registra il plugin *Serve a scoprire quali informazioni elaborera' il plugin */ virtual void register_plugin()=0; /** *questo metodo viene richiamato come prima istruzione da *mol_canvas::handle, se ritorna true, allora viene successivamente *richiamato bist_plugin::act() */ virtual bool time_to_act()=0; /** *Il plugin agisce *\return true if no error happened */ virtual bool act(int event)=0; /** *Viene richiamato immediatamente dopo aver caricato il plugin ed *istanziata la classe */ virtual void inizialize()=0; /** * Ritorna true se il plugin necessita del vettore contenente gli * atomi le procedure e le etichette selezionate */ virtual bool need_atom()=0; /** * Ritorna true se il plugin necessita del vettore contenente i * legami selezionati */ virtual bool need_leg()=0; virtual std::string menu_path(); /** *inutilzzato */ virtual bool consume_push_evt(){ return false; } /** *inutilzzato */ virtual bool consume_keydown_evt(){ return false; } /** *inutilzzato */ virtual bool consume_drag_evt(){ return false;} /** *inutilzzato */ virtual bool consume_release_evt(){ return false; } virtual string libpath(); /** *Ritorna un puntatore a the_image::_stringhe; */ vector * r_etich(); /** *Ritorna un puntatore a the_image::_gruppi */ vector * r_groups(); /** *Ritorna un puntatore a the_image::_elem_selected */ vector< pair < int, pair > >* r_elem_selected(); /* *Ritorna un puntatore a the_image::_legami_selected */ vector* r_legami_selected(); /** *Setta l'immagine */ void image(immagine* imm); protected: std::vector get_all_etich_as_vector(); std::vector get_all_molecule_as_vector(); std::vector get_all_proc_as_vector(); string _lib; immagine* _the_image; }; bist-0.5.2/include/editor.hpp0000644000175000017500000002777511657505745014522 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008-2010 Valerio Benfante Copyright (C) 2010 Valov Vasily This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ void export_image(std::string format); void editor_window_cb(Fl_Widget* w , void* d); void editor_3D_rotation_cb(Fl_Widget* w, void* d); void start_plugin_cb(Fl_Widget* w, void* d); /* *vertical flip */ void editor_flip_v_cb(Fl_Widget* w, void* d); /* * horizontal flip */ void editor_flip_h_cb(Fl_Widget* w, void* d); /** * */ void editor_paste_cb(Fl_Widget* w, void* d); /** *Disegna la catena */ void editor_draw_chain(Fl_Widget* w, void* d); /** *functions to export workable area */ void editor_export(Fl_Widget* w, void* d); /** *export in png */ void editor_save_as_png_cb(Fl_Widget* w, void*); /** * */ void editor_save_as_ps_cb(Fl_Widget* w, void* d); /** *undo! */ void editor_undo_cb(Fl_Widget* w, void* d); /** *redo! */ void editor_redo_cb(Fl_Widget* w, void* d); /** * */ void editor_set_def_cb(Fl_Widget* w, void* d); /** * */ void config_cb(Fl_Widget* w, void* v); /** *Show "About" window */ void edit_about_cb(Fl_Widget* w, void* v); /* * Show window with tutorial */ void edit_tutorial_cb(Fl_Widget*,void* v); /** * */ void edit_nowar_cb(Fl_Widget* w, void* v); /** * * */ void add_lib_cb(Fl_Widget* w, void* v); /** * */ void copy_cb(Fl_Widget* w, void* v); /** * */ void kill_cb(Fl_Widget* w, void* v); /** * */ void choose_font_cb(Fl_Widget* w, void* v); /** * * */ void quit_cb(Fl_Widget* w, void* v); /** * */ void open_file_cb(Fl_Widget* w, void* v); /** * * */ void save_as_native_file_cb(Fl_Widget* w, void* v); /** * */ void editor_save_native(Fl_Widget* w, void* v); /** * */ void select_atom_cb(Fl_Widget* w, void* v); /** * */ void select_group_cb(Fl_Widget* w, void* v); /** * */ void select_color_cb(Fl_Widget* w, void* v); /** * */ void select_box_cb(Fl_Widget* w, void* v); /** * */ void delete_selected_cb(Fl_Widget* w, void* v); /** * */ void draw_single_bond_cb(Fl_Widget* w, void* v); /** * */ void draw_double_bond_cb(Fl_Widget* w, void* v); /** * */ void draw_triple_bond_cb(Fl_Widget* w, void* v); /** * */ void draw_arrow_cb(Fl_Widget* w, void* v); /** * */ void draw_bezier_cb(Fl_Widget* w, void* v); /** * */ void draw_arc_cb(Fl_Widget* w, void* v); /** *draw a box */ void draw_box_cb(Fl_Widget* w, void* v); /** * */ void draw_etich_cb(Fl_Widget* w, void* v); /** * */ void translate_selected_cb(Fl_Widget* w, void* v); /** * */ void rotate_selected_cb(Fl_Widget* w, void* v); /** * */ void editor_rotate_selected_fixed_cb(Fl_Widget* w, void* v); /** * */ void scale_selected_cb(Fl_Widget* w, void* v); /** * */ void draw_orb_cb(Fl_Widget* w, void* v); void editor_zoom_cb(Fl_Widget* w, void* d); void editor_unzoom_cb(Fl_Widget* w, void* d); void editor_unzoom_1o1_cb(Fl_Widget* w, void* d); /** * */ enum BondType { BOND_SINGLE = 1, BOND_DOUBLE = 2, BOND_TRIPLE = 3 }; class editor: public finestra_pr, public Fl_Double_Window { public: editor(int W,int H,const char * titolo); virtual ~editor(); void file_inp(string file); void showHelpDialog(); void showAboutDialog(); void showOpenFileDialog(const char* fname); void scaleSelected(); void selectAtom(finestra_pr*); void selectGroup(finestra_pr*); void selectBox(finestra_pr*); void selectColor(immagine* immPtr,unsigned int r, unsigned int g,unsigned int b); void zoom(); void unzoom(); void unzoom_1o1(); void undo(); void redo(); void rotate3d(); void flipV(); void flipH(); void paste(); void drawChain(); void drawBond(BondType); void drawArrow(); void drawBezier(); void drawBox(); void drawArc(); void drawOrb(); void drawEtich(); void deleteSelected(finestra_pr*); const std::map& getPluginPath() const; const void* getHandle()const; void setHandle(void* newHandle); const bist_plugin* getActualPlugin() const; void setActualPlugin(bist_plugin* newPlugin); const std::string& isFileOpened() const; void openFile(const string&); void rotateSelected(); void rotateSelectedFixed(); void addLib(finestra_pr*); void translateSelected(); void kill(finestra_pr*); bool isFileSaved() const; void saveFile(); /** * * */ void register_images_undo(immagine* imm); void reg_modified(); /** *\return the size of the deque useful to check if an immagine has been modified */ deque::size_type no_of_images_undo(); virtual Fl_Scroll* ritorna_scroll(); virtual immagine* ritorna_immagine(); virtual mol_canvas* ritorna_mol_canvas(); bist_plugin* actual_plugin(); /** * */ void canvas_resize(int nw_width,int nw_height); /** * *Give focus to canvas (main window) */ void canvas_give_focus(); void canvas_translate(int dx, int dy); /** *get button set as action defined in editor.hpp */ int get_button_value_as_action(); protected: editor() :Fl_Double_Window(10,10,""), _actual_plugin(0), _scroller(LARGH_BUTTON_BAR,ALT_MENU+ALT_TOOLBAR, w()-LARGH_BUTTON_BAR, h()-ALT_MENU-ALT_TOOLBAR), _mol_can(LARGH_BUTTON_BAR,ALT_MENU+ALT_TOOLBAR,10,10), _il_menu(0, 0,w() , ALT_MENU), //riga sotto il menu _sup_frame(FL_UP_FRAME, 0, ALT_MENU, LARGH_FIN, ALT_TOOLBAR,""), _new_b(PADD_BUTT,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _open_file_b(PADD_BUTT+LARG_BUTTON_TOP,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _save_file_b(PADD_BUTT+LARG_BUTTON_TOP*2,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _save_file_as_b(PADD_BUTT+LARG_BUTTON_TOP*3,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _exp_ps_b(PADD_BUTT+LARG_BUTTON_TOP*4,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _exp_png_b(PADD_BUTT+LARG_BUTTON_TOP*5,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _delete_selected(PADD_BUTT+LARG_BUTTON_TOP*6,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _undo_b(PADD_BUTT+LARG_BUTTON_TOP*8,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _redo_b(PADD_BUTT+LARG_BUTTON_TOP*9,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _b_paste(PADD_BUTT+LARG_BUTTON_TOP*10,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _zoom_b(PADD_BUTT+LARG_BUTTON_TOP*12,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _unzoom_1o1_b(PADD_BUTT+LARG_BUTTON_TOP*13,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _unzoom_b(PADD_BUTT+LARG_BUTTON_TOP*14,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), //barra di sinistra _select_atom(PADD_BUTT,ALT_MENU+PADD_BUTT+ALT_TOOLBAR,LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _select_group(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR, LARG_BUTTON_LEFT, ALT_BUTT_LEFT), _rotate_sel(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_fixed_rotation(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_rotate_3d(PADD_BUTT,ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*2, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _scale_sel(PADD_BUTT*2+LARG_BUTTON_LEFT,ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*2, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_flip_v(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*3, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_flip_h(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*3, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _kill(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*4, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _select_color(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*4, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), //SPACER from here _draw_single_bond(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*5, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_arrow(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*5, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_double_bond(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*6, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_bezier(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*6, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_triple_bond(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*7, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_arc(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*7, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_box(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*8, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_chain(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*8, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_etich(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*9, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_orb(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*9, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _add_lib(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*10, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), //INFORMATION BOX _inf_frame(FL_EMBOSSED_BOX,0,h()-ALT_BUTT_TOP,FIN_W,HEIGHT_INF_BAR,""), _file_saved(false) { } virtual void draw(); virtual int handle(int e); /** *Draw mouse coordinate in information_bar *\return width of the string; */ int draw_mouse_cordinate_inf_bar(int x=0, int font_size=14); /** *set button in gui and optionally action too */ void set_button(int which, bool set_action=true); void populate_plugin_menu(std::string startdir); bist_plugin* _actual_plugin; Fl_Scroll _scroller; mol_canvas _mol_can; Fl_Help_Dialog* _help_dialog; Fl_Menu_Bar _il_menu; Fl_Box _sup_frame; Fl_Button _new_b; Fl_Button _open_file_b; Fl_Button _save_file_b; Fl_Button _save_file_as_b; Fl_Button _exp_ps_b; Fl_Button _exp_png_b; Fl_Button _delete_selected; Fl_Button _undo_b; Fl_Button _redo_b; Fl_Button _b_paste; Fl_Button _zoom_b; Fl_Button _unzoom_1o1_b; Fl_Button _unzoom_b; Fl_Button _select_atom; Fl_Button _select_group; Fl_Button _rotate_sel; Fl_Button _b_fixed_rotation; Fl_Button _b_rotate_3d; Fl_Button _scale_sel; Fl_Button _b_flip_v; Fl_Button _b_flip_h; Fl_Button _kill; Fl_Button _select_color; Fl_Button _draw_single_bond; Fl_Button _draw_arrow; Fl_Button _draw_double_bond; Fl_Button _draw_bezier; Fl_Button _draw_triple_bond; Fl_Button _draw_arc; Fl_Button _draw_box; Fl_Button _draw_chain; Fl_Button _draw_etich; Fl_Button _draw_orb; Fl_Button _add_lib; string _file_opened; Fl_Box _inf_frame; /** *library name is the key while filesystem path is the value * */ std::map _dl_plugin_path; /* *l'indirizzo dei simboli della libreria */ void* _dl_handle; /** * front * +---------------+ * | | * | | * | | * | | * | | * | | * +---------------+ * back */ std::deque _immagini; std::deque _redo_immagini; bool _file_saved; }; bist-0.5.2/include/atom_prop.hpp0000644000175000017500000000513411257720365015206 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 void atom_prop_ok_cb(Fl_Widget*, void*); void atom_prop_cancel_cb(Fl_Widget*, void*); void atom_prop_select_atom_color_cb(Fl_Widget* w, void* d); void atom_prop_select_string_color_cb(Fl_Widget* w, void* d); void atom_prop_select_valign_atom_cb(Fl_Widget* w, void* d); void atom_prop_select_current_font_dimension(Fl_Widget* w, void* d); void atom_prop_select_current_font(Fl_Widget* w, void* d); void atom_prop_charge_cb(Fl_Widget* w, void* d); void atom_prop_charge_pos_cb(Fl_Widget* w, void* d); void atom_prop_charge_sing_el(Fl_Widget* w, void* d); void atom_win(atomo* at); /** *Questa classe rappresenta la finestra per cabiare le propriet degli *atomi */ class atom_prop : public Fl_Window{ friend void atom_prop_ok_cb(Fl_Widget*, void*); friend void atom_prop_cancel_cb(Fl_Widget*, void*); friend void atom_prop_select_atom_color_cb(Fl_Widget* w, void* d); friend void atom_prop_select_string_color_cb(Fl_Widget* w, void* d); friend void atom_prop_select_align_atom_cb(Fl_Widget* w, void* d); friend void atom_prop_select_valign_atom_cb(Fl_Widget* w, void* d); friend void atom_prop_select_current_font_dimension(Fl_Widget* w, void* d); friend void atom_prop_select_current_font(Fl_Widget* w, void* d); friend void atom_prop_charge_cb(Fl_Widget* w, void* d); friend void atom_prop_charge_pos_cb(Fl_Widget* w, void* d); friend void atom_prop_charge_sing_el(Fl_Widget* w, void* d); friend void atom_prop_charge_pair_el(Fl_Widget* w, void* d); public: atom_prop(atomo* at); virtual ~atom_prop(); virtual int handle(int e); bool check_if_type_etic(int typ); bool check_if_type_etic(int typ,int pos) throw (out_of_range); protected: string _apici; string _pedici; atomo* _atom; int _r; int _g; int _b; int _ra; int _ga; int _ba; int _align; int _valign; }; bist-0.5.2/include/config.h.in0000644000175000017500000000677311733641566014536 0ustar cagecage/* include/config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to 1 if you have the header file. */ #undef HAVE_CAIRO_CAIRO_H /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the `X11' library (-lX11). */ #undef HAVE_LIBX11 /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_NCURSES_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_X11_XPM_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The size of `int *', as computed by sizeof. */ #undef SIZEOF_INT_P /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Enable extensions on AIX 3, Interix. */ #ifndef _ALL_SOURCE # undef _ALL_SOURCE #endif /* Enable GNU extensions on systems that have them. */ #ifndef _GNU_SOURCE # undef _GNU_SOURCE #endif /* Enable threading extensions on Solaris. */ #ifndef _POSIX_PTHREAD_SEMANTICS # undef _POSIX_PTHREAD_SEMANTICS #endif /* Enable extensions on HP NonStop. */ #ifndef _TANDEM_SOURCE # undef _TANDEM_SOURCE #endif /* Enable general extensions on Solaris. */ #ifndef __EXTENSIONS__ # undef __EXTENSIONS__ #endif /* Version number of package */ #undef VERSION /* Define to 1 if on MINIX. */ #undef _MINIX /* Define to 2 if the system does not provide POSIX.1 features except with this defined. */ #undef _POSIX_1_SOURCE /* Define to 1 if you need to in order for `stat' and other things to work. */ #undef _POSIX_SOURCE bist-0.5.2/include/pref_dialog.hpp0000644000175000017500000000436611177300745015464 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 void pref_reset_to_default_cb(Fl_Widget* w, void* d); void pref_canc_cb(Fl_Widget* w, void* d); void pref_write_conf_cb(Fl_Widget* w, void* d); /** *This class draw the preferences window */ class pref_dialog : public Fl_Double_Window { friend void pref_write_conf_cb(Fl_Widget* w, void* d); public: pref_dialog(); protected: void add_font_names(Fl_Input_Choice& choice); Fl_Tabs ui_tab; Fl_Group g1; Fl_Float_Input grsp; Fl_Int_Input sens; Fl_Int_Input _page_w; Fl_Int_Input _page_h; Fl_Check_Button _show_splash; Fl_Check_Button o; Fl_Check_Button quantize_pos; Fl_Group g2; Fl_Float_Input bdl; Fl_Float_Input bda; Fl_Float_Input arw; Fl_Float_Input arh; Fl_Float_Input argap; Fl_Float_Input dbs; Fl_Int_Input bndd; Fl_Float_Input lmaxc; Fl_Float_Input mbg; Fl_Float_Input freq; Fl_Float_Input amp; Fl_Int_Input numb; Fl_Group g3; Fl_Input_Choice sans_font; Fl_Input_Choice mono_font; Fl_Input_Choice serif_font; Fl_Input_Choice sans_font_italic; Fl_Input_Choice mono_font_italic; Fl_Input_Choice serif_font_italic; Fl_Input_Choice sans_font_bold; Fl_Input_Choice mono_font_bold; Fl_Input_Choice serif_font_bold; Fl_Input_Choice sans_font_bold_italic; Fl_Input_Choice mono_font_bold_italic; Fl_Input_Choice serif_font_bold_italic; Fl_Input_Choice symbol_font; Fl_Input_Choice dingbats_font; Fl_Button def; Fl_Button canc; Fl_Return_Button ok; int font_count; }; bist-0.5.2/include/font_factory.hpp0000644000175000017500000000077111304467065015703 0ustar cagecageclass font_factory { public: font_factory(); virtual ~font_factory(); Fl_Font get_actual_font(Fl_Font alias); protected: void search_for_font(const char* desidered, Fl_Font destination, int num_fonts); void set_actual_font_from_prefs(); std::map _fonts; }; class font_map_singleton { public: static font_factory* get_context(); static void free_context(); static bool works(); protected: font_map_singleton(); static font_factory* factory; }; bist-0.5.2/include/multiline_label.hpp0000644000175000017500000002753511161162621016345 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define MULTILINE_LABEL_ALIGN_CENTER_TEXT_LAYOUT 1 #define MULTILINE_LABEL_ALIGN_LEFT_TEXT_LAYOUT 2 #define MULTILINE_LABEL_ALIGN_RIGHT_TEXT_LAYOUT 3 #define MULTILINE_LABEL_ALIGN_SINGLE_LINE_TEXT_LAYOUT 4 /** a paragraph of text */ class multiline_label : public etichetta{ public: /** *Costruttore di default, riempie i valori con immondizia. */ multiline_label(); multiline_label(const multiline_label& other); multiline_label(const multiline_label* other); multiline_label& operator=(const multiline_label& other); virtual ~multiline_label(); virtual int cr(); virtual int cg(); virtual int cb(); virtual void cr(int nw); virtual void cb(int nw); virtual void cg(int nw); /** *\return una copia delle stringhe che compongono questa etichetta */ virtual std::vector < pair > vec_str(); /** *Aggiunge un elemento al vettore * *\param nw la nuova etichetta *\param tipo il tipo si stringa: puo' assumere i valori: * *
    *
  • ET_STR *
  • ET_APICE *
  • ET_PEDICE *
*/ virtual void aggiungi(std::string nw, int tipo); /** *add a new line to the tail of _lines_of_text *\param new_line the new line */ virtual void add_line(etichetta new_line); virtual void add_line(etichetta* new_line); /** *add a new line in position after pos *\param new_line the new line */ virtual void add_line(etichetta new_line, int pos); virtual void add_line(etichetta* new_line, int pos); /** *insert the string "nw" of type "type" in positipn "pos". If pos > *_vec_str.size() then the sring is appended. * */ virtual void insert(std::string nw, int type, int pos); /** *insert a new line to _lines_of_text in posistion pos *\param new_line the new line *\param pos the position where to insert */ virtual void insert_line(etichetta new_line, int pos); virtual void insert_line(etichetta* new_line, int pos); /** *delete line from _lines_of_text in posistion pos * *\param pos the position where to delete * *\param reset_pointer_currline reset _pointer_to_currline to fit *into the _lines_of_text bonduaries */ virtual void delete_line(int pos, bool reset_pointer_currline); /** *substitute line from _lines_of_text in posistion pos with nw *\param nw the new etichetta *\param pos the position where to make substituition */ virtual void subst_line(etichetta* nw, int pos); virtual etichetta get_line_copy(int pos) throw (out_of_range); /** *Elimina la stringa in una certa posizione. * *\param where l'elemento da eliminare. */ virtual void elimina(int where) throw (out_of_range){ delete_line(where,true); }; /** *sostituisci la stringa in una certa posizione. * *\param cosa la nuova stringa *\param tipo il tipo si strinag (apice pedice o normale) *\param where l'elemento da eliminare. */ virtual void sostituisci(std::string cosa, int tipo,int where) throw (out_of_range){}; /** *Elimina la prima stringa uguale a ricercata. * *\param ricercata l'elemento da eliminare. *\return 0 se la stringa non e' stata trovata 1 altrimenti. */ virtual int elimina(std::string ricercata); /** *Elimina tutti gli apici. */ virtual void elimina_apici(){}; /** *Elimina tutti i pedici */ virtual void elimina_pedici(){}; /** *Elimina tutta l'etichetta */ virtual void elimina(); /** *\return il tipo di font (vedi le fltk per il significato da *attribuire a questo intero string raw conversion */ virtual std::string to_raw_string(){return "";}; /** *set cursor pos */ virtual void set_cursor_position( int pos_in_vec, string::size_type pos_in_string); virtual void set_cursor_position(std::pair pos); virtual void set_cursor_position_abs(int line, int pos_in_vec, string::size_type pos_in_string); virtual void set_cursor_position_abs(int line,std::pair pos); virtual int set_cursor_position(int limit); virtual void go_to_end_of_label(); virtual void go_to_end_of_line(); virtual void go_to_start_of_label(); virtual void go_to_start_of_line(); virtual int get_cursor_position(std::pair* pos); virtual void insert_string_in_curr_pos(std::string str,int type); virtual void draw_cursor(bool draw); /** *\return true if the address passed as parameter contain valid coordinates */ virtual bool cursor_to_coordinate(int& x, int& y){ return true;}; virtual void reset_cursor_if_outside_limits(); virtual void reset_pointer_to_currline(); virtual bool cursor_one_step_fwd(int &curr_type); virtual bool cursor_one_step_back(int &curr_type); virtual bool check_if_type_etic(int typ) throw (out_of_range); virtual bool check_if_type_etic(int typ,int pos) throw (out_of_range); virtual bool check_if_type_etic_next_chunk(int equal,bool &res_next_exist); virtual bool check_if_type_etic_previous_chunk(int equal,bool &res_prev_exist); virtual int type_etic_at_cur_pos(); virtual void delete_char_curr_pos(bool before); virtual bool treat_as_a_whole(); virtual bool treat_as_a_whole(bool nw); float interline_space(); float phys_interline_space(); float visual_interline_space(); int interline_space(int nw); virtual void pointer_to_currline(int nw); virtual int pointer_to_currline(); virtual int pointer_to_currline_transl(int delta); virtual void manage_sub_super(int check, int troublesome,std::string car); virtual bool manage_add_sub_super_next_normal_str(int type); virtual bool manage_add_sub_next_super(int type); virtual void insert_char_in_curr_pos(char add, int type); virtual void break_string_at_cur_pos(int breaking_type); virtual void break_sub_super(int me, int type_to_insert,bool is_after); virtual void break_sub_or_super(int me, int type_to_insert); virtual void break_normal_str(int type_to_insert); virtual bool break_and_split_normal_str(etichetta** left , etichetta** right); virtual std::vector get_lines_text(); virtual int layout_lines(); virtual void layout_lines(int nw); virtual void increase_highlighted(); virtual void decrease_highlighted(); virtual void de_highlight(); virtual void draw_negative(bool nw); virtual bool draw_negative(); bool dump_label(); virtual void merge_labels_amap(); protected: virtual void draw_label_export(); virtual bool ptr_line_less_lines_text(); virtual bool ptr_line_is_last_line(); /** *Costruisce una stringa da passare alle plotlib */ virtual std::string costruct_plot_string(){return "";}; virtual void format_paragraph(); virtual void format_lines_align_right(); virtual void format_lines_align_left(); virtual void format_lines_align_center(); void update_vec_str(); void update_lines_of_text(); float calculate_last_line_y(bool add_interline=true); vector _lines_of_text; bool _treat_as_a_whole; int _pointer_to_currline; int _interline_space; int _layout_lines; const static int _default_interline_space; }; bist-0.5.2/include/gauss.hpp0000644000175000017500000000570711252652005014324 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* aX1+bX2+..zXn=c*/ class gauss { public: /* sist -- array con il sistema; deve essere del tipo: int v[5]={a1,a2,noto, a3,a4,noto2 }; inc -- numero di incognite nell'esempio dato piu' sopra e' uguale a 2 */ gauss(double* sist, int inc) :incognite(inc) { mx=sist; risultati=new double[incognite]; //diagonalizza(); } /*lancia un eccezione "runtime_error" se il sistema non ammette un 'unica soluzione*/ bool diagonalizza(){ for(int el=1;elfabs(piv)){ max=sc; piv=mx[sc+(el-1)]; } } if(mx[max]==0){ string wht="Eccezione lanciata: Il sistema non ammette un'unica soluzione"; throw runtime_error(wht); return false; } for(int los=max;los<=max+incognite;los++){ double tmp=mx[los]; mx[los]=mx[los-max]; mx[los-max]=tmp; } for(int col=el*(incognite+1);col < incognite*incognite+incognite; col+=incognite+1){ for(int ri=incognite; ri>=0;ri--){ mx[col+ri]-=mx[el*(incognite+1)-(incognite+1)+ri]* (mx[col+el-1]/mx[(el-1)*(incognite+1)+(el-1)]); } } } return true; } /*risolve il sistema*/ void risolvi(){ int limri=1; for(int col=incognite*incognite+(incognite-1); col>=incognite; col-=incognite+1, limri++){ double tmp=0; int ri=1; for( ;ri un,pair due){ if(un.first. */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 extern finestra_pr* MainWindow; extern Fl_Pixmap image_lb_subs; extern Fl_Pixmap image_lb_supers; extern Fl_Pixmap image_lb_select_font_color; extern Fl_Pixmap image_lb_color_atom; extern Fl_Pixmap image_lb_normal_str_atom; void paragraph_text_prop_color_cb(Fl_Widget* w, void* d); void paragraph_text_prop_ok_cb(Fl_Widget* w, void* d); void paragraph_text_prop_canc_cb(Fl_Widget* w, void* d); void paragraph_text_threat_as_a_whole_cb(Fl_Widget* w, void* d); void paragraph_text_increase_interline(Fl_Widget* w, void* d); void paragraph_text_decrease_interline(Fl_Widget* w, void* d); void paragraph_text_set_l_layout(Fl_Widget* w, void* d); void paragraph_text_set_c_layout(Fl_Widget* w, void* d); void paragraph_text_set_r_layout(Fl_Widget* w, void* d); void paragraph_text_set_current_font_dimension(Fl_Widget* w, void* d); void paragraph_text_set_current_font(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cambiare le propriet delle *stringhe */ class paragraph_text_prop: public Fl_Double_Window { friend void paragraph_text_prop_ok_cb(Fl_Widget* w, void* d); friend void paragraph_text_prop_canc_cb(Fl_Widget* w, void* d); friend void paragraph_text_prop_color_cb(Fl_Widget* w, void* d); friend void paragraph_text_threat_as_a_whole_cb(Fl_Widget* w, void* d); friend void paragraph_text_increase_interline(Fl_Widget* w, void* d); friend void paragraph_text_decrease_interline(Fl_Widget* w, void* d); friend void paragraph_text_set_l_layout(Fl_Widget* w, void* d); friend void paragraph_text_set_c_layout(Fl_Widget* w, void* d); friend void paragraph_text_set_r_layout(Fl_Widget* w, void* d); friend void paragraph_text_set_current_font_dimension(Fl_Widget* w, void* d); friend void paragraph_text_set_current_font(Fl_Widget* w, void* d); public: paragraph_text_prop(paragraph_text* et); paragraph_text_prop(etichetta* et); virtual ~paragraph_text_prop(); virtual int handle(int e); protected: void update_widget_cursor(); void highlight_text(); void de_highlight_text(); void set_type_text_button(int which); void initialize_GUI(); paragraph_text* _str; const static int _button_mouse_highlight; const static Fl_Menu_Item _str_font_face[]; const static Fl_Menu_Item _font_dim_str[]; }; bist-0.5.2/include/string_prop.hpp0000644000175000017500000000336311406210753015545 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 extern finestra_pr* MainWindow; extern Fl_Pixmap image_lb_subs; extern Fl_Pixmap image_lb_supers; extern Fl_Pixmap image_lb_select_font_color; extern Fl_Pixmap image_lb_color_atom; extern Fl_Pixmap image_lb_normal_str_atom; void string_prop_color_cb(Fl_Widget* w, void* d); void string_prop_ok_cb(Fl_Widget* w, void* d); void string_prop_canc_cb(Fl_Widget* w, void* d); void string_prop_font_cb(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cambiare le propriet delle *stringhe */ class string_prop : public Fl_Double_Window { friend void string_prop_ok_cb(Fl_Widget* w, void* d); friend void string_prop_canc_cb(Fl_Widget* w, void* d); friend void string_prop_color_cb(Fl_Widget* w, void* d); friend void string_prop_font_cb(Fl_Widget* w, void* d); public: string_prop(etichetta* et); virtual ~string_prop(); virtual int handle(int e); protected: void set_type_text_button(int which); etichetta* _str; }; bist-0.5.2/include/flu_export.h0000644000175000017500000000741611172112012015016 0ustar cagecage// $Id: flu_export.h,v 1.1 2004-08-09 19:15:13 cage Exp $ /* **************************************************************** * FLU - FLTK Utility Widgets * Copyright (C) 2002 Jason Bryan, Ohio Supercomputer Center, Ohio State University * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * To contribute, advise, suggest, berate, recommend, criticise, * or otherwise communicate with me: jbryan@osc.edu * Ohio Supercomputer Center * 1224 Kinnear Rd * Columbus, Ohio 43212 *************************************************************** ----------------------------------------------------------------------- This library depends on the following GPL free libraries: FLTK This library also uses OpenGL, which is a registered trademark of Silicon Graphics, Inc. (SGI), and Doxygen, a free HTML page generator for documentation of C++ classes. This library is hereby distributed under the same LGPL license as FLTK. Have fun with it! ----------------------------------------------------------------------- FLTK License December 11, 2001 The FLTK library and included programs are provided under the terms of the GNU Library General Public License (LGPL) with the following exceptions: 1. Modifications to the FLTK configure script, config header file, and makefiles by themselves to support a specific platform do not constitute a modified or derivative work. The authors do request that such modifications be contributed to the FLTK project - send all contributions to "fltk-bugs@fltk.org". 2. Widgets that are subclassed from FLTK widgets do not constitute a derivative work. 3. Static linking of applications and widgets to the FLTK library does not constitute a derivative work and does not require the author to provide source code for the application or widget, use the shared FLTK libraries, or link their applications or widgets against a user-supplied version of FLTK. If you link the application or widget to a modified version of FLTK, then the changes to FLTK must be provided under the terms of the LGPL in sections 1, 2, and 4. 4. You do not have to provide a copy of the FLTK license with programs that are linked to the FLTK library, nor do you have to identify the FLTK license in your program or documentation as required by section 6 of the LGPL. However, programs must still identify their use of FLTK. The following example statement can be included in user documentation to satisfy this requirement: [program/widget] is based in part on the work of the FLTK project (http://www.fltk.org). */ #ifndef _FLU_EXPORT_H #define _FLU_EXPORT_H #ifdef FLU_DLL #ifdef FLU_LIBRARY #define FLU_EXPORT __declspec(dllexport) #else #define FLU_EXPORT __declspec(dllimport) #endif #else #define FLU_EXPORT #endif #endif bist-0.5.2/include/mol_canvas.hpp0000644000175000017500000001434711454255044015332 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define ACT_NOTHING -1 #define ACT_SEL_ATOM 0 #define ACT_SEL_GROUP 1 #define ACT_SEL_BOX 2 #define ACT_DELETE_SELECTED 3 #define ACT_KILL 4 #define ACT_DRAW_SINGLE_BOND 5 #define ACT_DRAW_DOUBLE_BOND 6 #define ACT_DRAW_TRIPLE_BOND 7 #define ACT_DRAW_ARROW 8 #define ACT_DRAW_BEZIER 9 #define ACT_DRAW_ARC 10 #define ACT_DRAW_ETICH 11 #define ACT_TRANSLATE_SELECTED 12 #define ACT_ROTATE_SELECTED 13 #define ACT_SCALE_SELECTED 14 #define ACT_DRAW_ORB 15 #define ACT_DRAW_LIBRARY 16 #define ACT_FIXED_ROTATION 17 #define ACT_DRAW_CHAIN 18 #define ACT_FLIP_HOR 19 #define ACT_FLIP_VER 20 #define ACT_COPY 21 #define ACT_PASTE 22 #define ACT_3D_ROT 23 #define ACT_ZOOM 24 #define ACT_UNZOOM 25 #define ACT_EDIT_CONTROL_POINT_CURVES 26 #define ACT_TRANSL_CANVAS 27 #define ACT_DRAW_BOX 28 #define GUI_KEY_ZOOM '+' #define GUI_KEY_UNZOOM '-' #define GUI_KEY_GLUE_MODE 'g' /** *Questa classe rappresenta il widget sul quale si disegnano le cose */ class mol_canvas: public Fl_Widget { public: mol_canvas(int X,int Y,int W,int H); virtual ~mol_canvas(); void add_immagine(immagine* imm); void action(int nw); int action(); /** *Stabilisce di quanto ruotare gli elementi (in radianti) */ void fixed_rotation_degree(float nw); void num_atom_chain(unsigned int nw); void orient_chain(float nw); bool glue_mode(); void glue_mode(bool nw); bool toggle_glue_mode(); /** *Cambia lo zoom globale e ridisegna la canvas *\param entity l'entita' dello zoom *\param traslx traslazione per le x *\param trasly traslazione per le y */ void zoom(float entity, int traslx, int trasly); void zoom_center_to_mousepointer(float entity); /** *check if bond is double-clicked *\return true if doubleclicked */ bool d_click_bond(); /** *check if atom is double-clicked *\return true if doubleclicked */ bool d_click_atom(); /** *translate canvas * */ void translate(int dx,int dy); /** *Registra all'editor che l'immagine e' stata modificata e che e' *necessario un backup in editor::_immagini per permettere operazioni *di undo.

Va chiamata ogni volta che l'immagine e' modificata *e si vuole che l'utente possa tornare indietro.

*/ void reg_modified(); void rotation_pivot_pos(int x, int y); enum test_glue_what { NONE, ATOMS, PARALLEL_BOND }; protected: void test_and_glue_objects(); void glue_vertices(atomo* sel, atomo* hook); void glue_bonds(atomo* sel_1,atomo* sel_2, atomo* hook_1,atomo* hook_2); /* *\return l'indirizzo del plugin attuale */ bist_plugin* plugin(); /** *Genera una catena di n atomi agganciandola eventualmente ad una *molecola preesistente * *\param n_carb numero di carboni aggiunti formanti la catena * *\param orient angolo di sviluppo della catena */ void genera_catena(unsigned int n_carb, float orient); /** *Disegna una preview per il legame * *\param tip il tipo di legame */ void draw_preview_bond(int tip); std::vector preview_bond_calc_w_springs(int x_c, int y_c); /** *Aggiunge il legame alla classe immagine col tipo specificato: questo *metodo va usato solo all'interno del metodo handle. */ int aggiungi_nuovo_legame(int tipo); virtual void draw(); virtual int handle(int e); void set_action_translate_selected_push_handle(); immagine* _la_molecola; int _x_mouse; int _y_mouse; int _x_pivot; int _y_pivot; /** *Cosa deve fare? */ int _action; vector< pair > _bezier_point; /** *Atomo di partenza del legame zero se il legame inizia da un atomo *nuovo */ atomo* _start_atom; /** *Atomo di arrivo del legame zero se il legame inizia da un atomo *nuovo */ atomo* _end_atom; /** *true se la freccia deve disegnare il punto di arrivo false altrimenti */ bool _b_arrow_added; /** *centro dell'ellisse (ascissa) */ int _x_arc_centr; /** *centro dell'ellisse (ordinata) */ int _y_arc_centr; /** *Raggio maggiore dell'ellisse */ int _arc_max_ax; /** *Raggio maggiore dell'ellisse */ int _arc_min_ax; /** *Tiene conto dei punti settati per costruire un ellisse. */ //vector< pair > _arc_point; /** *true se il legame e' stato aggiunto false altrimenti */ bool _b_bond_added; /** *x dell'atomo del nuovo legame */ int _x_added_atom; /** *y dell'atomo del nuovo legame */ int _y_added_atom; /** *true se si deve disegnare la box false altrimenti */ bool _b_construct_box; int _dx_added_atom; int _dy_added_atom; Fl_Pixmap _pivot_xpm; float _fixed_rotation_degree; /** *numero di atomi di una catena alchilica da aggiungere */ unsigned int _num_atom_chain; /** *Orientazione degli atomi da aggiungere */ float _orient_chain; bool _glue_mode; const static float rotation_incr; const static float zoom_incr; const static float scale_incr; }; bist-0.5.2/include/multiline_label_prop.hpp0000644000175000017500000000537211406210753017402 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 extern finestra_pr* MainWindow; extern Fl_Pixmap image_lb_subs; extern Fl_Pixmap image_lb_supers; extern Fl_Pixmap image_lb_select_font_color; extern Fl_Pixmap image_lb_color_atom; extern Fl_Pixmap image_lb_normal_str_atom; void multiline_label_prop_color_cb(Fl_Widget* w, void* d); void multiline_label_prop_ok_cb(Fl_Widget* w, void* d); void multiline_label_prop_canc_cb(Fl_Widget* w, void* d); void multiline_label_threat_as_a_whole_cb(Fl_Widget* w, void* d); void multiline_label_increase_interline(Fl_Widget* w, void* d); void multiline_label_decrease_interline(Fl_Widget* w, void* d); void multiline_label_set_l_layout(Fl_Widget* w, void* d); void multiline_label_set_c_layout(Fl_Widget* w, void* d); void multiline_label_set_r_layout(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cambiare le propriet delle *stringhe */ class multiline_label_prop: public Fl_Double_Window { friend void multiline_label_prop_ok_cb(Fl_Widget* w, void* d); friend void multiline_label_prop_canc_cb(Fl_Widget* w, void* d); friend void multiline_label_prop_color_cb(Fl_Widget* w, void* d); friend void multiline_label_threat_as_a_whole_cb(Fl_Widget* w, void* d); friend void multiline_label_increase_interline(Fl_Widget* w, void* d); friend void multiline_label_decrease_interline(Fl_Widget* w, void* d); friend void multiline_label_set_l_layout(Fl_Widget* w, void* d); friend void multiline_label_set_c_layout(Fl_Widget* w, void* d); friend void multiline_label_set_r_layout(Fl_Widget* w, void* d); public: multiline_label_prop(multiline_label* et); multiline_label_prop(etichetta* et); virtual ~multiline_label_prop(); virtual int handle(int e); protected: void highlight_text(); void de_highlight_text(); void set_type_text_button(int which); void initialize_GUI(); multiline_label* _str; const static int _button_mouse_highlight; const static Fl_Menu_Item _str_font_face[]; const static Fl_Menu_Item _font_dim_str[]; }; bist-0.5.2/include/legame.hpp0000644000175000017500000000263311025523004014421 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** *Questa classe rappresenta un singolo legame. */ class legame { public: legame (int nw_id_atomo, int nw_id_legame ,int nw_tipo_legame, int comp_r, int comp_g, int comp_b); ~legame(); /** *\return true se altro ha lo stesso id di quest'istanza **/ bool operator==(legame altro); /*recupera i valori*/ int id_atomo(); int id_legame(); int tipo_legame(); int cr(); int cg(); int cb(); /*setta i valori*/ void id_atomo(int nw); void id_legame(int nw); void tipo_legame(int nw); void cr(int nw); void cg(int nw); void cb(int nw); protected: legame(); int _id_atomo; int _id_legame; int _tipo_legame; int _cr; int _cg; int _cb; }; bist-0.5.2/include/atomo.hpp0000644000175000017500000002155011256432537014325 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** *Newer create an "hole"! * *Always keep LEGAME_STEREO_SCON latest! */ enum bond_type { LEGAME_SINGOLO = 0, LEGAME_DOPPIO = 1, LEGAME_DOPPIO_1 = 2, LEGAME_DOPPIO_2 = 3, LEGAME_TRIPLO = 4, LEGAME_INTERNO = 5, LEGAME_INTERNO_OPP = -5, LEGAME_ESTERNO = 6, LEGAME_ESTERNO_OPP = -6, LEGAME_ISPESSITO = 7, LEGAME_TRATTEGGIATO = 8, LEGAME_DOPPIO_TRATTEGGIATO = 9, LEGAME_DOPPIO_TRATTEGGIATO_1 = 10, LEGAME_DOPPIO_TRATTEGGIATO_2 = 11, LEGAME_STEREO_SCON = 12 // keep always latest!!!! }; #define LAST_BOND LEGAME_STEREO_SCON #define ATOM_MAX_POSITION_CHARGE 3 enum atomo_position_charge { R_TOP, R_BOTTOM, L_BOTTOM, L_TOP }; /** *Questa classe rappresenta un singolo atomo con i suoi legami. */ class atomo : public disegnabile, public genitore, public identificabile , public selezionabile{ public: atomo(); atomo(const atomo& altro); atomo& operator=(const atomo& altro); virtual ~atomo(); virtual bool dentro_bb(float x, float y, float w , float h); virtual int sotto_mouse(int posx_m, int posy_m); /** *\return true se altro ha lo stesso id di quest'istanza **/ bool operator==(atomo altro); /*setta i valori*/ void visitato(bool nw); void id(int); void tipo_atomo(int); void cariche(int); void position_charge(int nw_pos); void doppietti(int); void el_spaiati(int); void massa(int); void cr(int); void cg(int); void cb(int); void pos_x(float); void pos_y(float); void pos_z(float); void etich(etichetta nw); void aggiungi_genitore(genitore* gentr); /*recupera i valori*/ bool visitato(); virtual int id(); int tipo_atomo(); int cariche(); int position_charge(); int doppietti(); int el_spaiati(); int massa(); int cr(); int cg(); int cb(); float pos_x(); float visual_pos_x(); float phys_pos_x(); float pos_y(); float visual_pos_y(); float phys_pos_y(); float pos_z(); float visual_pos_z(); float phys_pos_z(); etichetta etich(); etichetta& etich_ref(); etichetta* etich_punt(); genitore* ritorna_genitore(); bool is_son(atomo atm); int id_gruppo(); /** *ritorna il primo lato libero dell'atomo secondo il seguente schema: *
   *                     3 
   *	    +-------------------------+
   *	    |                         |
   *	  2 |                         | 0
   *	    |                         |
   *	    +-------------------------+
   *                     1
   *
* * >3 indica nessun lato libero * *La box viene scandita in senso orario a partire dal lato verticale *destro. */ //int lato_libero(); /** *Libera tutti i lati. */ void libera_tutti(); virtual void disegna(); virtual void trasla(float dx, float dy); virtual void scale(float sc); virtual void phys_translate(float dx, float dy); virtual void ruota(float xpiv, float ypiv, float angl); /** * Aggiunge un nuovo legame a quest'atomo. *\param nw_leg_id_atomo id dell'atomo del nuovo legame *\param nw_leg_id_legame id del nuovo legame *\param nw_leg_tipo_legame tipo di legame * *\param nwcr componente rossa del colore del legame *\param nwcg componente verde del colore del legame *\param nwcb componente blu del colore del legame */ void aggiungi_legame(int nw_leg_id_atomo, int nw_leg_id_legame, int nw_leg_tipo_legame, int nwcr, int nwcg, int nwcb); /** * Aggiunge un nuovo legame a quest'atomo. * * L'id del legame e' quello dell'ultimo atomo del vettore _legami+1 * *\param nw_leg_id_atomo id dell'atomo del nuovo legame *\param nw_leg_id_legame id del nuovo legame * *\param nwcr componente rossa del colore del legame *\param nwcg componente verde del colore del legame *\param nwcb componente blu del colore del legame */ void aggiungi_legame(int nw_leg_id_atomo, int nw_leg_tipo_legame,int nwcr, int nwcg , int nwcb); /** *Modifica i parametri di un legame. * *\param id_target id dell'atomo a cui questo atomo e legato * *\param nw_leg_id_atomo id dell'atomo del nuovo legame *\param nw_leg_id_legame id del nuovo legame *\param nw_leg_tipo_legame tipo di legame *\param nwcr componente rossa del colore del legame *\param nwcg componente verde del colore del legame *\param nwcb componente blu del colore del legame * */ void modifica_legame(int id_target, int nw_leg_id_atomo, int nw_leg_id_legame, int nw_leg_tipo_legame, int nwcr, int nwcg, int nwcb); void modifica_legame(int id_target, int* nw_leg_id_atomo, int* nw_leg_id_legame, int* nw_leg_tipo_legame, int* nwcr, int* nwcg, int* nwcb); legame* find_leg(int id); /** *\return ritorna un iterator al primo elemento del vettore *contenente i legami. */ vector::iterator primo_leg(); vector::iterator iniz_leg(){ return primo_leg(); } /** *\return ritorna un iterator all'ultimo elemento del vettore *contenente i legami. */ vector::iterator ultimo_leg(); vector::iterator fin_leg(){ return ultimo_leg(); } std::vector get_all_children(); unsigned int bond_number(); unsigned int bond_number_not_visited(); /** *Elimina un legame. *\param id id dell'atomo del legame da eliminare * */ void elimina_legame(int id); /** *Elimina tutti i legami. */ void elimina_legami(); /** *Setta a false tutte le vistite. */ void reset_arrivati(); /** *Setta a true le vistite in posizione pos. */ void setta_arrivati(int pos); /** *ritorna le visite dell atomo id. */ bool ritorna_arrivati(int id); /** *Costruisce il vettore delle visite; */ void costruisci_arrivati(); /** *Ritorna true se l'atomo in posizione altro ha visitato quest'atomo, *false altrimenti. */ bool e_arrivato(int altro); bool* ritorna_lati_liberi(); bool can_attach(); void can_attach(bool nw); protected: // int _lato_libero; /* lati[3] +-----------------+ | | lati[2]| |lati[0] | | +-----------------+ lati[1] */ bool _lati_liberi[4]; bool _visitato; int _id; int _tipo_atomo; int _cr; int _cg; int _cb; int _massa; etichetta _etich; int _cariche; int _position_charge; int _doppietti; int _el_spaiati; float _pos_x; float _pos_y; float _pos_z; /** *Ogni elemento e' un vettore di tre elementi contenente, a sua volta, *tre interi corrispondenti: all'id dell'atomo al quale punta il nuovo *legame, all'id del legame e al tipo di legame. */ vector _legami; /** *L' elemento di questo vettore vale true se l'atomo nella stessa *posizione in legami ha visitato quest'atomo. */ vector _arrivati; /** *Vale true se quest'atomo puo' accettare un altro legame, false *altrimenti. * *Per esempio se si attacca un frammento ad un'altro gruppo e poi se *ne vuole attaccare un'altro in un punto preciso di quest'ultimo *allora si puo' settare a true questa variabile. * *esempio (i numeri indicano gli id): * * ----2 ci attacchiamo ---1--2--- * * il risultato sara' (tra parentesi gli id vecchi) * * ----2(2)---3(1)---4(2)-- * * *ora supponiamo che si voglia attaccare un'altro frammento nella *posizione che era di 1...il fatto e'che ora l'id 1 e' diventato 4 *mentre addirittura l'id 1 unon esiste piu'. Per ovviare a questo *problema si puo' marcare l'atomo che si intende agganciare settando *a true questo parametro. Ricordarsi poi di risettarlo a false! * * */ bool _can_attach; }; bool ordina_atomo_id(atomo uno, atomo altro); /** *Ordina i legami di un atomo per id atomico dgli atomi a cui e' legato. */ bool ordina_legame_id_atomo(legame uno, legame altro); bool ordina_legame_id_legame(legame uno, legame altro); bist-0.5.2/include/etichetta.hpp0000644000175000017500000002770011733641566015167 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define ET_TYPE_NOT_VALID -1 #define ET_STR 0 #define ET_APICE 1 #define ET_PEDICE 2 /** Questa classe rappresenta una stringa di testo dell'imagine */ class etichetta : public disegnabile, public genitore , public selezionabile{ public: /** *Costruttore di default, riempie i valori con immondizia. */ etichetta(); etichetta(const etichetta* other); etichetta(const etichetta& altro); etichetta& operator=(const etichetta& altro); virtual ~etichetta(); virtual void cr(int nw); virtual void cb(int nw); virtual void cg(int nw); void allineamento(int nw); void v_offset(int nw); virtual int cr(); virtual int cg(); virtual int cb(); int allineamento(); int v_offset(); /** *\return una copia delle stringhe che compongono questa etichetta */ virtual vector < pair > vec_str(); /** *Aggiunge un elemento al vettore * *\param nw la nuova etichetta *\param tipo il tipo si stringa: puo' assumere i valori: * *
    *
  • ET_STR *
  • ET_APICE *
  • ET_PEDICE *
*/ virtual void aggiungi(string nw, int tipo); /** *insert the string "nw" of type "type" in positipn "pos". If pos > *_vec_str.size() then the sring is appended. * */ virtual void insert(string nw, int type, int pos, bool reset_cur=true); /** *Elimina la stringa in una certa posizione. * *\param where l'elemento da eliminare. */ virtual void elimina(int where, bool reset_cur=true) throw (out_of_range); /** *sostituisci la stringa in una certa posizione. * *\param cosa la nuova stringa *\param tipo il tipo si strinag (apice pedice o normale) *\param where l'elemento da eliminare. */ virtual void sostituisci(string cosa, int tipo, int where, bool reset_cur=true) throw (out_of_range); /** *Elimina la prima stringa uguale a ricercata. * *\param ricercata l'elemento da eliminare. *\return 0 se la stringa non e' stata trovata 1 altrimenti. */ virtual int elimina(string ricercata, bool reset_cur=true); /** *Elimina tutti gli apici. */ virtual void elimina_apici(bool reset_cur=true); /** *Elimina tutti i pedici */ virtual void elimina_pedici(bool reset_cur=true); /** *Elimina tutta l'etichetta */ virtual void elimina(bool reset_cur=true); virtual void subst_vec_str(std::vector < std::pair > nw); /** *\return il tipo di font (vedi le fltk per il significato da *attribuire a questo intero string raw conversion */ virtual string to_raw_string(); /** *set cursor pos */ virtual void set_cursor_position(int pos_in_vec, string::size_type pos_in_string); virtual void set_cursor_position(std::pair pos); /** *set cursor position to the nth char (nth==limit); *\return the type of the label (i.e. super or subscript or normal string) */ virtual int set_cursor_position(int limit); virtual void go_to_end_of_label(); virtual void go_to_end_of_line(); virtual void go_to_start_of_label(); virtual void go_to_start_of_line(); virtual int get_cursor_position(std::pair* pos); virtual void draw_cursor(bool draw); virtual bool draw_cursor(); /** *\return true if the address passed as parameter contain valid coordinates */ virtual bool cursor_to_coordinate(int& x, int& y); virtual void reset_cursor_if_outside_limits(bool second_pos_not_end=false); virtual bool cursor_one_step_fwd(int &curr_type); virtual bool cursor_one_step_back(int &curr_type); virtual bool check_if_type_etic(int typ) throw (out_of_range); virtual bool check_if_type_etic(int typ,int pos) throw (out_of_range); virtual bool check_if_type_etic_next_chunk(int equal,bool &res_next_exist); virtual bool check_if_type_etic_previous_chunk(int equal,bool &res_prev_exist); virtual int type_etic_at_cur_pos(); virtual void delete_char_curr_pos(bool before); virtual void insert_string_in_curr_pos(std::string str,int type); virtual void manage_sub_super(int check, int troublesome,std::string car); virtual bool manage_add_sub_super_next_normal_str(int type); virtual bool manage_add_sub_next_super(int type); virtual void insert_char_in_curr_pos(char add, int type); virtual void break_string_at_cur_pos(int breaking_type); virtual void break_sub_super(int me, int type_to_insert,bool is_after); virtual void break_sub_or_super(int me, int type_to_insert); virtual void break_normal_str(int type_to_insert); virtual bool break_and_split_normal_str(etichetta** left , etichetta** right); virtual bool can_highlight(); virtual bool can_highlight(bool nw); virtual void draw_negative(bool nw); virtual bool draw_negative(); /** *Costruisce una stringa da passare alle plotlib */ virtual string costruct_plot_string(); virtual float get_pango_baseline(int type=ET_STR); virtual float get_fltk_baseline(); virtual float get_fltk_phys_baseline(); virtual float get_pango_logical_y(); virtual float get_pango_ink_y(); virtual void melt_similar(int start); protected: virtual void measure_as_pango_layout(std::vector < std::pair > vec, float &w, float &h, int until=-1); virtual float check_pango_max_between_sub_sup(std::vector < std::pair > vec, unsigned int pos); virtual void get_pango_logical_sizes(std::string st, int type, float& w_logical, float& h_logical, float& lbearing , float& ascent, float& descent); virtual void get_pango_ink_sizes(std::string st, int type, float& w_ink, float& h_ink, float& lbearing , float& ascent, float& descent); virtual void get_pango_logical_rectangle(std::string st, int type, PangoRectangle* rect); virtual void get_pango_ink_rectangle(std::string st, int type, PangoRectangle* rect); virtual float get_pango_logical_y(std::string st, int type); virtual float get_pango_ink_y(std::string st, int type); virtual void draw_pango_string(std::string st,int x, int y, int type); virtual void draw_pango_sub_superscript(std::string st, int hparent, int x ,int y, int type); virtual void draw_label_onscreen(); virtual void draw_label_export(); virtual bool merge_with_previous_if_equal(bool reset_cur=true) throw (out_of_range); virtual void merge_orphan_pedic_apic(int from, int type, bool& has_merged); virtual void delete_orphan_pedic_apic(int from,int type); virtual void clean_string_after_delete(); virtual int switch_APIC_PEDIC(int what); int _cr; int _cg; int _cb; int _allineamento; std::vector < std::pair > _vec_str; int _font; int _dim; float _x; float _y; /** *Offset verticale dell'etichetta */ int _v_offset; /** *Contiene la posizione nel vettore delle stringhe in _pos.first e *la posizione all'interno della stringa in _pos.second * * pos_first e' la posizione dne vettore dove si sta scrivendo e * pod.second quella all'interno del vettore dove si andra' a * scrivere */ std::pair _cursor_pos; bool _draw_cursor; bool _draw_negative; bool _can_highlight; }; bist-0.5.2/include/newton_integ.hpp0000644000175000017500000000220611256432537015703 0ustar cagecageclass newton_integ { public: newton_integ(); newton_integ(newton_integ &other); virtual ~newton_integ(); virtual std::vector force()=0; void dt(float nw); float dt(); void thrs_pos(float nw); float thrs_pos(); void m(float nw); float m(); void pos(std::vector nw); std::vector pos(); bool update(); protected: float _dt; float _thrs_pos; float _m; std::vector _accel; std::vector _velo; std::vector _pos; std::vector _savedpos; }; class bidimensional_vinculated_particle : public newton_integ { public: bidimensional_vinculated_particle(); bidimensional_vinculated_particle(bidimensional_vinculated_particle& other); void add_particle(std::pair particle); void add_center(std::pair center); void k_spring(float nw); float k_spring(); virtual ~bidimensional_vinculated_particle(); virtual std::vector force(); protected: std::vector< std::pair > _particles; std::pair _center; float _k_spring; }; bist-0.5.2/include/util.hpp0000644000175000017500000002636511653002572014165 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define DEFAULT_ARROW_GAP 0.25 #define UTILS_ARROW_PLOTTER_LINE_WIDTH .1 /** *generate a ring *\param side_lenght lenght of the side *\numside number of sides */ gruppo create_ring(float side_lenght, float numsides, bool aromatic=false) throw (out_of_range); /** * Remap font for export */ string remap_ps_font(int fltkfont); /** * Remap color component from 32 to 488 bit */ int remap_color_48(int trentadue); float remap_color_1(int byte); /** * Remap y-axis for export */ float remap_y_ps(float vx); void draw_pango_string(std::string st,int x, int y, std::string font,int dim, int cr, int cg, int cb); /** * Find a point belonging the line perpendicular to that defined by the particular points. * *\param dax *\param day Coordinates of starting point * *\param ax Ascissa delpunto sul quale disegnare la freccia *\param ay Ascissa delpunto sul quale disegnare la freccia *\param gap distance between point and the line *\param verso the side toward which to draw the arrow * * Parameters below used to store coordinate of the found point. *\param resx - store X-coordinate *\param resy - store Y-coordinate * * */ void is_perpendicular(float dax, float day, float ax, float ay, bool verso,float gap, float& resx, float& resy); /** * Deriving the equation of a line from two points belonging. * *Coordinates the first point: *\param x1 the abscissa *\param y1 the ordinata * *Coordinates the second point: *\param x2 the abscissa *\param y2 the ordinata * *\param m the angular coefficient *\param q * * return false in case points has the same coordinates, * otherwise function returns false and setting * m and y values to 0. */ bool rett_eqn(float x1, float y1, float x2, float y2, float& m, float& q); /** *calculate vertices of an arrowhead * *\param dax abscissa of initial point * * *\param day the initial point ordinata * * *\param ax Ascissa delpunto sul quale disegnare la freccia *\param ay Ascissa delpunto sul quale disegnare la freccia *\param thick arrows thickness *\param to the side toward to which draw an arrow */ void calculate_arrow_points(float dax, float day, float ax, float ay, float thick,float arr_w, float arr_h, float arr_gap, int cr, int cg, int cb, std::vector& results_x, std::vector& results_y, bool to=false); /** *disegna una punta della freccia. * *\param dax Ascissa corrispondente all'inizio del segmento sul quale *disegnare la freccia. * *\param day Ascissa corrispondente all'inizio del segmento sul quale *disegnare la freccia. * *\param ax Ascissa delpunto sul quale disegnare la freccia *\param ay Ascissa delpunto sul quale disegnare la freccia *\param spessore lo spessore della freccia *\param verso il lato verso cui disegnare la freccia. */ void draw_arrow(float dax, float day, float ax, float ay, float spessore,float arr_w, float arr_h, float arr_gap, int cr, int cg, int cb, bool verso=false); /** *Disegna una retta parallela a quella definita dai punti dati come *parametri. * *\param dax Ascissa corrispondente all'inizio del segmento sul quale *disegnare la freccia. * *\param day Ascissa corrispondente all'inizio del segmento sul quale *disegnare la freccia. * *\param ax Ascissa delpunto sul quale disegnare la freccia *\param ay Ascissa delpunto sul quale disegnare la freccia *\param gap la retta sara' piu' corta della principale di? *\param verso il lato verso cui disegnare la freccia. *\param tratt true se il legame e' tatteggiato, false se pieno * */ void draw_parallel(float dax, float day, float ax, float ay, int cr, int cg,int cb, bool verso=false, float gap=MULTIPLE_BOND_GAP, bool tratt=false, bool noaccorc=false); /** *\return true o false a seconda del semipiano di appartenenza: *true se y>=mx+q false se y& lu1, pair& rd1, pair& lu2, pair& rd2); /** *calcola la bounding box */ void calc_bb_gen(vector x, vectory, pair& ld, pair& ru); /** *de-scala pt rispetto a __pref.getZoom(); */ float descale(float scaled); /** *scala pt rispetto a __pref.getZoom(); */ float scale_z(float scaled); float scale_center_point(double point,double trasl, double zoom); vector correct_arrow(float xtan_st, float ytan_st, float xtan_end, float ytan_end, float entity=5/8); int ask_overwrite_file(string the_file); int ask_overwrite_file_console(string the_file); /** *bezier curve */ std::pair poly_bezier(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float t) throw (out_of_range); /** *return bool if value of v i inside interval (ref-offset;ref+offset) */ template bool similar_to(T v, T ref, T offset){ bool res=false; if( (v >= ref - offset) && (v <= ref + offset) ){ res=!res; } return res; } /** *rotate point (around pivot (0,0)) counterclockwise *\param angle angle in radiant */ std::pair rotate_point(float x, float y, float angle); /** *Print redfog wisdom to stdout */ void print_redfog_wisdom(); float rad2deg(float angle); float deg2rad(float angle); /** *Attract mouse to magnetic point as specified in preferences */ void attract_mouse_to_magnetic_point(int* x_m, int* y_m); std::string trim(std::string s,const std::string drop=" \t"); /** *\param desidered the string representing a font *\destination the font whre to copy destination *\the number of fonts in fonttable */ void search_for_font(const char* desidered, Fl_Font destination, int num_fonts); void set_actual_font_from_prefs(); bond_type shift_bond_type(bond_type curr); /** * *guess type of input file */ bool guess_is_mdl_file(std::string f); /** * *guess type of input file */ bool guess_is_cml_file(std::string f); /** *check if file is an ELF shared object *\param file path of the shared object *\return true if the file is a shared object false otherwise */ bool is_ELF_shared_object(std::string file); void s_regmatch(std::string regex,std::string st, std::vector& vec_res, bool case_ins); std::string s_replace(std::string regex, std::string where, std::string what, bool case_ins); proc_bezier* add_bezier_along_circle(gruppo* grp, float center_x, float center_y, float radius , float t1, float t2); void dialog_position(Fl_Window* win, int offset=100); bist-0.5.2/include/prefs.hpp0000644000175000017500000001773511224104617014325 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** *prefs.h -- static Preferences class */ #define PREFS_FIXED_ARROW "FIXED_ARROW" #define PREFS_FIXED_BOND "FIXED_BOND" #define PREFS_FIX_HYDROGENS "FIX_HYDROGENS" #define PREFS_SPLASH "SPLASH" #define PREFS_TRUE "TRUE" #define PREFS_FALSE "FALSE" #define PREFS_ARROW_LENGTH "ARROW_LENGTH" #define PREFS_ARROW_ANGLE "ARROW_ANGLE" #define PREFS_BOND_LENGTH "BOND_LENGTH" #define PREFS_BOND_ANGLE "BOND_ANGLE" #define PREFS_DBOND_OFFSET "DBOND_OFFSET" #define PREFS_ARR_W "ARR_W" #define PREFS_ARR_H "ARR_H" #define PREFS_ARR_GAP "ARR_GAP" #define PREFS_MULTIPLE_BOND_GAP "MULTIPLE_BOND_GAP" #define PREFS_SENSIB_LEG "SENSIB_LEG" #define PREFS_WIDTH_SINGLE_BOND "WIDTH_SINGLE_BOND" #define PREFS_LARG_MAX_CUNEO "LARG_MAX_CUNEO" #define PREFS_LARG_MIN_CUNEO "LARG_MIN_CUNEO" #define PREFS_AMPIEZZA_STEREO_SCON "AMPIEZZA_STEREO_SCON" #define PREFS_FREQUENZA_STEREO_SCON "FREQUENZA_STEREO_SCON" #define PREFS_TRATTEGGIO_LEGAME "TRATTEGGIO_LEGAME" #define PREFS_NUM_BARRETTE_STEREO_DOWN "NUM_BARRETTE_STEREO_DOWN" #define PREFS_MAGNETIC_POINT_GAP "MAGNETIC_POINT_GAP" #define PREFS_SANS_FONT "SANS_FONT " #define PREFS_MONO_FONT "MONO_FONT " #define PREFS_SERIF_FONT "SERIF_FONT " #define PREFS_SANS_FONT_ITALIC "SANS_FONT_ITALIC " #define PREFS_MONO_FONT_ITALIC "MONO_FONT_ITALIC " #define PREFS_SERIF_FONT_ITALIC "SERIF_FONT_ITALIC " #define PREFS_SANS_FONT_BOLD "SANS_FONT_BOLD " #define PREFS_MONO_FONT_BOLD "MONO_FONT_BOLD " #define PREFS_SERIF_FONT_BOLD "SERIF_FONT_BOLD " #define PREFS_SANS_FONT_BOLD_ITALIC "SANS_FONT_BOLD_ITALIC " #define PREFS_MONO_FONT_BOLD_ITALIC "MONO_FONT_BOLD_ITALIC " #define PREFS_SERIF_FONT_BOLD_ITALIC "SERIF_FONT_BOLD_ITALIC " #define PREFS_SYMBOL_FONT "SYMBOL_FONT " #define PREFS_DINGBATS_FONT "DINGBATS_FONT " #define PREFS_PAPER_SIZE "PAPER_SIZE" #define PREFS_PAPER_ORIENT "PAPER_ORIENT" #define PREFS_PAPER_WIDTH "PAPER_WIDTH" #define PREFS_PAPER_HEIGHT "PAPER_HEIGHT" #define PREFS_UNITS "UNITS" #define PREFS_DRAWGRID "DRAWGRID" #define PREFS_SNAPGRID "SNAPGRID" #define PREFS_DYKCOUNT "DYKCOUNT" #define PREFS_GRIDMODE "GRIDMODE" #define PREFS_GRIDSPACE "GRIDSPACE" #define PREFS_LAST_OPENED_FILES "LAST_OPENED_FILES" #define PREFS_TEXT_DELIM "\"" #define PREFS_RECENT_FILES_LABEL "Recent files" class Preferences { public: Preferences(); void Defaults(); void setFile(std::string fn, bool fb) ; void setSaveFile(std::string fn) ; bool LoadPrefs() ; bool SavePrefs() ; float get_arr_w(); void set_arr_w(float nw); float get_ampiezza_stereo_scon(); void set_ampiezza_stereo_scon(float nw); float get_frequenza_stereo_scon(); void set_frequenza_stereo_scon(float nw); float get_arr_h(); void set_arr_h(float nw); float get_arr_gap(); void set_arr_gap(float nw); float get_multiple_bond_gap(); void set_multiple_bond_gap(float nw); void set_sensib_leg(int nw); void set_tratteggio_legame(int nw); void set_num_barrette_stereo_down(int nw); float get_larg_max_cuneo(); void set_larg_max_cuneo(float nw); float get_larg_min_cuneo(); float get_width_single_bond(); void set_width_single_bond(float nw); void set_larg_min_cuneo(float nw); bool getArrow_fixed() ; bool getBond_fixed() ; bool getAntialiased() ; bool getFixHydrogens() ; void setPageSize(int n1) ; void setPageOrientation(int n1) ; void setFixHydrogens(bool n1) ; void setArrow_fixed(bool n1) ; void setArrow_fixedlength(double n1) ; void setArrow_fixedangle(double n1) ; void setBond_fixed(bool n1) ; void setBond_fixedlength(double n1) ; void setBond_fixedangle(double n1) ; void setAntialiased(bool n1) ; void setDoubleBondOffset(double n1) ; void setPageWidth(int n1) ; void setPageHeight(int n1) ; void setUnits(int n1) ; void setGridMode(int n1) ; void setDrawGrid(int n1) ; void setSnapGrid(int n1) ; void setGridSpacing(int n1) ; bool getSplash() ; void setSplash(bool n1) ; void setDYKCount(int n1) ; float getZoom() ; void setZoom(float z1) ; void setMagnetic_point_gap(int mag_gap) ; std::string get_mono_font(); std::string get_sans_font(); std::string get_serif_font(); std::string get_mono_font_bold(); std::string get_sans_font_bold(); std::string get_serif_font_bold(); std::string get_mono_font_italic(); std::string get_sans_font_italic(); std::string get_serif_font_italic(); std::string get_symbol_font(); std::string get_dingbats_font(); std::string get_mono_font_bold_italic(); std::string get_sans_font_bold_italic(); std::string get_serif_font_bold_italic(); void set_mono_font(std::string nw); void set_sans_font(std::string nw); void set_serif_font(std::string nw); void set_mono_font_bold(std::string nw); void set_sans_font_bold(std::string nw); void set_serif_font_bold(std::string nw); void set_mono_font_italic(std::string nw); void set_sans_font_italic(std::string nw); void set_serif_font_italic(std::string nw); void set_symbol_font(std::string nw); void set_dingbats_font(std::string nw); void set_mono_font_bold_italic(std::string nw); void set_sans_font_bold_italic(std::string nw); void set_serif_font_bold_italic(std::string nw); int get_sensib_leg(); int get_tratteggio_legame(); int get_num_barrette_stereo_down(); double getArrow_fixedlength() ; double getArrow_fixedangle() ; double getBond_fixedlength() ; double getBond_fixedangle() ; int getPageSize() ; int getPageOrientation() ; double getDoubleBondOffset() ; int getPageWidth() ; int getPageHeight() ; int getUnits() ; int getGridMode() ; int getDrawGrid() ; int getSnapGrid() ; int getGridSpacing() ; int getDYKCount() ; int getMagnetic_point_gap() ; std::vector get_last_opened_files(); void set_last_opened_files(std::string nw); static const unsigned int max_opened_files; private: bool fixed_arrow, fixed_bond, fix_hydrogens; bool antialiased; bool fallback; // true = file from library directory bool splash; // true = show splashpage int dykcount; // which Did You Know? tip to show std::string fileName; // prefs file name std::string saveFileName; // save file name //std::string customRingDir; // custom ring directory double arrow_fixedlength; double arrow_fixedangle; double bond_fixedlength; double bond_fixedangle; double dbond_offset; int paper_size, paper_orient, paper_dpi; int paper_width, paper_height; // ALWAYS in pixels - convert as needed. int units; // PIXELS, ENGLISH, METRIC - see defs.h int gridmode, gridspace, drawgrid, snapgrid; float zoom; // not saved. float arr_w; float arr_h; float arr_gap; float multiple_bond_gap; int sensib_leg; int tratteggio_legame; int num_barrette_stereo_down; float ampiezza_stereo_scon; float frequenza_stereo_scon; float larg_max_cuneo; float larg_min_cuneo; float width_single_bond; int magnetic_point_gap; std::string mono_font; std::string sans_font; std::string serif_font; std::string mono_font_bold; std::string sans_font_bold; std::string serif_font_bold; std::string mono_font_italic; std::string sans_font_italic; std::string serif_font_italic; std::string mono_font_bold_italic; std::string sans_font_bold_italic; std::string serif_font_bold_italic; std::string symbol_font; std::string dingbats_font; std::vector _last_opended_files; }; bist-0.5.2/include/string_tokenizer.hpp0000644000175000017500000000675211025523004016575 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* * $Log: string_tokenizer.hpp,v $ * Revision 1.2 2005-03-13 12:17:44 cage * Miglior supporto al cml (array di: id etichette posizioni) * * Revision 1.1 2004/11/09 13:07:07 cage * string tokenizer. * * Revision 1.2 2003/02/03 16:09:47 cage * * Adesso ogni livello ha la sua introduzione. * * Revision 1.1 2002/11/30 13:47:18 cage * Initial revision * */ /* * My string tokenizer in c++. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. * * Please report all bugs and problems to "cage@katamail.com". */ class string_tokenizer{ public: /* st = la stringa da splittare delim = il delimitatore di token. */ string_tokenizer(string &st , string &delim){ tokenifica(st,delim); beg=ar.begin(); fine=ar.end(); } ~string_tokenizer(){ } /* Ritorna false se nonn vi sono piu' token. */ bool operator!(){ return has_more_tokens(); } /* Ritorna un std::string corrispondente alla sottostringa delimitata da "delim" passato come argomento al costruttore. */ string next_token() throw (string) { if(has_more_tokens()){ string str=*beg; beg++; return str; }else{ throw string("Non vi sono piu' sottostringhe!"); } } /* Analogo a string_tokenizer::bool operator!() */ bool has_more_tokens(){ return beg!=fine; } /* ritorna il numero di token */ unsigned int count(){ return ar.size(); } protected: void tokenifica(string &st , string &delim){ for(string::size_type pos=0;pos ar; vector::iterator beg; vector::iterator fine; }; bist-0.5.2/include/multifont_label.hpp0000644000175000017500000000423111153036406016352 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** a multifont textline */ class multifont_label : public multiline_label{ public: /** *Costruttore di default, riempie i valori con immondizia. */ multifont_label(); multifont_label(int nfont, int ndim , int ncr, int ncg, int ncb); multifont_label(const multifont_label& other); multifont_label(const multifont_label* other); multifont_label& operator=(const multifont_label& other); virtual ~multifont_label(); virtual void disegna(); virtual void insert_string_in_curr_pos(std::string str,int type); virtual void insert_char_in_curr_pos(char add, int type); virtual void manage_sub_super(int check, int troublesome,std::string car); virtual bool manage_add_sub_super_next_normal_str(int type); virtual bool manage_add_sub_next_super(int type); virtual bool cursor_one_step_fwd(int &curr_type); virtual bool cursor_one_step_back(int &curr_type); virtual void delete_char_curr_pos(bool before); protected: virtual void format_paragraph(); virtual int break_lines_into_sublabel(); virtual int break_line_into_sublabel(etichetta* to_break, vector & new_lines_of_text); virtual int atomize_normal_string(etichetta* the_template, std::string the_string, vector & new_lines_of_text); virtual void fall_apart_line_and_add_normal_string(char add); }; bist-0.5.2/include/parse_residual.hpp0000644000175000017500000000565611025523004016201 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* grammatica catena := (frammento)* frammento := pivot (figlio)* figlio := atomo numero? | par_tonda_ap frammento par_tonda_c numero* pivot := 'C' | 'O' atomo := '=O' | 'H' par_tonda_ap := '(' par_tonda_c := ')' */ /** R(r_x,r_y) +--------------+ | | | | | | | | +--------------+S(s_x,s_y) */ struct res_aa_bb { float s_x; float s_y; float r_x; float r_y; }; class parse_residue { public: parse_residue(string res); ~parse_residue(); gruppo return_fragment(); bool has_error(); protected: void dump(); parse_residue(){ } void transl_branch(gruppo& group,atomo* start,atomo* parent, float dx, float dy); void clean(gruppo& group, atomo& start); bool aa_bb_intersects(gruppo& grp, atomo start); void clean_as_tree(gruppo& group, atomo& start, float distmax, int level, int xst); void create_aa_bb(gruppo grp, int st, int children, res_aa_bb& res); void create_starter(); void chain(); void frammento(); void pivot(); void figlio(); bool number(unsigned int& res); void add_atoms(gruppo* mol, string et,int tipo, bool new_sticky); string etich_sticky_atom(gruppo* mol); atomo* search_for_attach(gruppo* the_mol); string _res; int _pt_res; float _length_leg; stack _fragments; gruppo _the_mol; string _the_pivot; bool _stop; bool _pivot_unknown; bool _has_error; const static string par_a; const static string par_c; const static string carb; const static string sulf; const static string nytr; const static string oxyg; const static string db_o; const static string hidr; const static string clor; const static string bromine; const static string iodine; const static string fluorine; const static float _angle_exa; }; vector trova_pos_libere(gruppo& grp, atomo& atm, int numleg=2); bool check_if_inside_arc(float angle_ref, float angle_probe, float tolerance); void place_bonds(vector& result, atomo atm,float lenght_leg, float start_angle,int numleg=2, float step=.523598775598298873078); void no_of_leaf(gruppo& grp,atomo& start, int& res); bist-0.5.2/include/substructure_search.hpp0000644000175000017500000001422211127674704017304 0ustar cagecagenamespace substructure_search { enum action { NONE, DESCEND_NORMAL, DESCEND_TERMINAL, DESCEND_NORMAL_CYCLE, DESCEND_TERMINAL_CYCLE, DESCEND_SET_BLACK_PARENT_CYCLE, DESCEND_SET_BLACK_PARENT, DESCEND_FORCE_SET_BLACK_PARENT, DESCEND_FORCE_SET_BLACK_PARENT_CYCLE, SET_BLACK_CURR_CYCLE, SET_BLACK_CURR, FORCE_BLACK_CURRENT, FORCE_BLACK_PARENT, FORCE_SHIFT_CHILD, POP_CURRENT_ATOM, POP_CURRENT_ATOM_LEAVE_BLACK, DELETE_TERMINAL}; enum colornode {WHITE, GRAY, BLACK }; class node_status { public: node_status() :_currcolor(WHITE), _lastcolor(WHITE), _action(NONE) { } atomo* _node; atomo* _parent_node; colornode _currcolor; colornode _lastcolor; action _action; }; class residual_DFS { public: residual_DFS(); residual_DFS(gruppo& ref); virtual ~residual_DFS(); virtual bool DFS_shift_descendant(bool leave_it_black=false); virtual bool DFS_simulate_shift_descendant(atomo** res); virtual bool DFS_simulate_shift_descendant_w_gparent(atomo** res, atomo* gparent, atomo* parent, atomo* old_child); virtual bool DFS_simulate_shift_descendant_no_gparent(atomo** res, atomo* parent, atomo* old_child); virtual bool DFS_set_black_current(atomo* candidate); virtual void DFS_descend_force_set_black_parent_cycle(atomo* parent, atomo* child, bool keep_track); virtual void DFS_descend_force_set_black_parent(atomo* parent, atomo* child, bool keep_track); virtual bool DFS_find_descend_forced(atomo* parent, atomo* child); virtual void DFS_manage_node_no_white_nodes(bool had_children_not_black, bool is_cycle, atomo* parent, atomo* child, node_status& nw); virtual void DFS_find_and_descend(atomo* parent, node_status& nw); virtual void DFS_delete_terminal(atomo* at, node_status& nw,bool keep_in_hystory=true); virtual void DFS_step(int* start=NULL); virtual bool DFS_is_finished(); virtual void DFS_force_black_current(bool keep_track=true); virtual void DFS_force_black_parent(bool keep_track=true); virtual bool DFS_pop_current_atom(bool leave_it_black=false,bool keep_in_history=true); bool is_black(atomo* a=NULL); bool is_gray(atomo* a=NULL); colornode get_color(atomo* atm); /** *\return true if we can go back */ bool backstep(); std::vector dump_atoms_from_molecule(); void dump(); void dump_history(); void dump_any_history(std::queue tmp); void dump_blacks(); atomo* get_starting_point(); bool is_starting_point(atomo* chkd); action curr_action(); int bond_type(); int no_children(); atomo* curr_atom(); atomo* parent_atom(); void clean_to_start(); gruppo get_copy_gruppo(); gruppo* get_pointer_gruppo(); bool pop_back_history(node_status& popped); static std::string colornode2string(colornode c); static std::string action2string(action a); protected: gruppo _molecule; std::stack _stack_atoms; std::stack _parents; std::queue _history; std::map _grays; std::map _blacks; std::stack _bond_type; std::stack _no_children; std::stack _curr_action; }; class molecule_matching { public: molecule_matching(gruppo& mol, gruppo& sub); virtual ~molecule_matching(); bool match(); protected: bool main_descend(bool use_reds); bool find_normal_candidate(bool use_reds); bool find_set_black_parent_cycle_candidate(bool use_reds); bool find_set_black_parent_candidate(bool use_reds); bool find_generic_candidate(std::vector allowed, bool (molecule_matching::*cond)(residual_DFS*, atomo* , atomo*, residual_DFS* , atomo* , atomo* ), bool use_reds); bool find_alternative_path(); void debug_print_all(residual_DFS s); void debug_print_DFS(residual_DFS s); bool TEST_DFS(); bool TEST_DFS_forced(); bool TEST_BFS(); void clean(); bool good_starting_point(atomo* ref, atomo* start); bool check_normal_candidates_atom(residual_DFS* dfs_mol,atomo* mol, atomo* parmol, residual_DFS* dfs_ref, atomo* sub, atomo* parsub); bool check_black_parent_cycle_candidate(residual_DFS* dfs_mol, atomo* mol, atomo* parmol, residual_DFS* dfs_ref, atomo* sub, atomo* parsub); bool equal_bond_type(gruppo* molecule_mol, atomo* mol, atomo* parmol, gruppo* molecule_ref, atomo* ref, atomo* parref); bool equal_raw_string(atomo* mol, atomo* ref); bool equal_no_children(atomo* mol, atomo* ref); bool is_direct_children(gruppo* mol, atomo* child, atomo* parent, legame& res); bool go_back_to_parent(residual_DFS& molecule); /** *set atm red in _mol_reds, if atm is NULL set red _mol.curr_atom() *if stack is empty nothing is added to set and false is returned *\return true if is added false otherwise */ bool block_path(atomo* atm); residual_DFS _sub; residual_DFS _mol; std::set _mol_reds; }; } bist-0.5.2/include/interfacce.hpp0000644000175000017500000000625111655222635015311 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** *Questa classe rappresenta l'interfaccia che tutte le classi che *disegnano qualcosa devono implementare. * */ class disegnabile { public: /** *Disegna l'oggetto PARAMETRI DA DEFINIRE!!!!!! */ virtual ~disegnabile(){ }; virtual void disegna()=0; virtual bool is_shown(){ return true;}; /** *Scala l'oggetto * *\param sc il fattore di scala */ virtual void scale(float sc)=0; /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in radianti in senso orario *\param xpivot ascissa relativa all'asse di rotazione *\param ypivot ordinata relativa all'asse di rotazione * */ virtual void ruota(float xpiv, float ypiv,float angl)=0; /** *Trasla l'oggetto. * *\param dx entita' dello spostamento lungo l'ascissa *\param dy entita' dello spostamento lungo l'ordinata */ virtual void trasla(float dx, float dy)=0; }; /** *Rappresenta un'oggetto selezionabile * */ class selezionabile { public: virtual ~selezionabile(){ } /** * *\param x ascissa dell'angolo in alto a sinistra della bounding box *\param y ordinata dell'angolo in alto a sinistra della bounding box *\param w larghezza della bounding box *\param h altezza della bounding box *\return true se l'oggetto e' dentro la bounding box specificata *false altrimenti. */ virtual bool dentro_bb(float x, float y, float w , float h)=0; /** * *\param posx_m ascissa del puntatore *\param ordinata del puntatore *\return l'id di questo oggetto se il mouse si trova all'interno della *sua bounding box, -1 altrimenti. */ virtual int sotto_mouse(int posx_m, int posy_m)=0; }; /** *Rappresenta un'oggetto che e' identificabile univocamente */ class identificabile { public: virtual ~identificabile(){ } virtual int id()=0; }; /** *Rappresenta un'oggetto che possiede un genitore */ class genitore { public: genitore(); genitore(const genitore& altro); genitore(const genitore* altro); genitore& operator=(const genitore& altro); virtual ~genitore(){ } virtual void aggiungi_genitore(genitore* gtr); virtual genitore* ritorna_genitore(); protected: genitore* _il_genitore; }; class write_native { public: virtual void write_native_format(std::ostream& stream, std::string indent="")=0; }; class damaged_obj { public: damaged_obj(); virtual bool damaged(); virtual void damaged(bool damaged); protected: bool _damaged; }; bist-0.5.2/include/immagine_mol.hpp0000644000175000017500000000263411025523004015625 0ustar cagecage#define IMMAGINE_MOL_M_END "M END" #define IMMAGINE_MOL_M_CHG "M CHG" #define IMMAGINE_MOL_MOD_IDENTIFIER 'M' #define IMMAGINE_MOL_CHG_MAX_NUMBER 8 /** *Questa classe rappresenta un'immagine in memoria il cui input e' un *file cml1.0 */ class immagine_mol : public immagine { public: /** *Costruttore di default */ immagine_mol(); /** *Costruttore di copia */ immagine_mol(const immagine_mol& altra); /** *Costruisce, l'oggetto parsando il file passato come argomento. */ immagine_mol(string path); virtual ~immagine_mol(); /** *carica in memoria il file di input */ virtual void filebist(string path); /** *Avvia il parsing */ virtual void start(); void start_from_string(std::string mol); protected: /* bool _has_error; unsigned int _punt_mol; vector _error; vector _warning; */ void parse_file_mol(); void skip_header_lines(); void connection_table(gruppo& the_group); void atoms_number(); void atom_block(gruppo& the_group); float coordinate(); std::string periodic_table_entry(); void bond_block(gruppo& the_group); int node_entry(); void bond_order(); void m_charge(gruppo& the_group); void skip_junk_from_line(); int numeric_entry_int(); int numeric_entry_float(); /** *The total number of atoms in atom block */ int _atoms_number; }; bist-0.5.2/include/similar_to.hpp0000644000175000017500000000036111262665546015352 0ustar cagecage/** *return bool if value of v i inside interval (ref-offset;ref+offset) */ template bool similar_to(T v, T ref, T offset){ bool res=false; if( (v >= ref - offset) && (v <= ref + offset) ){ res=!res; } return res; } bist-0.5.2/include/arrow_prop.hpp0000644000175000017500000000423111025523004015355 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #if SIZEOF_INT_P == 8 #define ARR_PROP_SIZE_USER_DATA_MENU long int #else #define ARR_PROP_SIZE_USER_DATA_MENU unsigned int #endif void arrow_prop_type_cb(Fl_Widget* w, void* d); void arrow_prop_color_cb(Fl_Widget* w, void* d); void arrow_prop_ok_cb(Fl_Widget* w, void* d); void arrow_prop_cancel_cb(Fl_Widget* w, void* d); void arrow_prop_width_cb(Fl_Widget* w, void* d); void arrow_prop_tick_cb(Fl_Widget* w, void* d); void arrow_prop_width_arr_cb(Fl_Widget* w, void* d); void arrow_prop_height_arr_cb(Fl_Widget* w, void* d); void arrow_prop_gap_arr_cb(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cabiare le propriet delle *frecce */ class arrow_prop : public Fl_Double_Window{ friend void arrow_prop_tick_cb(Fl_Widget* w, void* d); friend void arrow_prop_type_cb(Fl_Widget* w, void* d); friend void arrow_prop_color_cb(Fl_Widget* w, void* d); friend void arrow_prop_ok_cb(Fl_Widget* w, void* d); friend void arrow_prop_cancel_cb(Fl_Widget* w, void* d); friend void arrow_prop_width_cb(Fl_Widget* w, void* d); friend void arrow_prop_width_arr_cb(Fl_Widget* w, void* d); friend void arrow_prop_height_arr_cb(Fl_Widget* w, void* d); friend void arrow_prop_gap_arr_cb(Fl_Widget* w, void* d); public: arrow_prop(proc_arrow* arr); virtual ~arrow_prop(); protected: proc_arrow* _arrow; int _tipo; }; void arrow_win(proc_arrow* at); bist-0.5.2/include/2D_vector.hpp0000644000175000017500000000256311256432537015040 0ustar cagecagenamespace bidimensional_vector { float angle(std::pair a, std::pair b); float dot_product(std::pair a, std::pair b); float cross_product(std::pair a, std::pair b); std::pair diff(std::pair a, std::pair b); float magn(std::pair a); std::pair normalize(std::pair a); std::pair rotate(std::pair v, float angle); std::pair translate(std::pair v, float dx, float dy); std::pair scale(std::pair v, float scale_factor); std::pair project_par(std::pair v, std::pair n); std::pair project_perp(std::pair v, std::pair n); void print(std::ostream& str, std::pair v); /** *return bool if value of v i inside interval (ref-offset;ref+offset) */ template bool similar_to(T v, T ref, T offset){ bool res=false; if( (v >= ref - offset) && (v <= ref + offset) ){ res=!res; } return res; } const static std::pair x_ax(1,0); const static std::pair y_ax(0,1); } bist-0.5.2/include/arc_prop.hpp0000644000175000017500000000256711441753111015010 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ void arc_prop_color_cb(Fl_Widget* w, void* d); void arc_prop_ok_cb(Fl_Widget* w, void* d); void arc_prop_cancel_cb(Fl_Widget* w, void* d); void arc_prop_width_cb(Fl_Widget* w, void* d); void arc_prop_thick_cb(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cabiare le propriet degli *archi * This class represents Main Window properties. */ class Arc_Prop : public Fl_Double_Window{ public: void setThick(int thick); void setColor(unsigned int r, unsigned int g, unsigned int b); void setWidth(int width); Arc_Prop(proc_arc* arr); virtual ~Arc_Prop(); protected: proc_arc* _arc; }; void arc_win(proc_arc* at); bist-0.5.2/include/global.hpp0000644000175000017500000001631311733641566014453 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define _(String) gettext (String) //useful macro #define DEBUG_TO_CERR(x) std::cerr << __FUNCTION__ << " line: "\ << __LINE__ << " check: " << #x << " = " << x << std::endl; //#include using namespace std; /** *larghezza della pagina in pixel */ #define PAPER_W_STD 800 /** *altezza della pagina in pixel */ #define PAPER_H_STD 600 /**numero di dimensioni possibili per i font*/ #define NUM_FONT_DIM 50 /** *Tipo di atomo di default per un nuovo legame */ #define DEFAULT_TYPE_ATOMO 12 /** *Tipo di gruppo di default per un nuovo gruppo */ #define DEFAULT_TYPE_GROUP 0 #define ATOMO 10 #define ETICHETTA 11 /***************tipi procedure***********/ #define PROC_ARC 1 #define PROC_ARROW 2 #define PROC_BEZIER 3 #define PROC_BOX 4 /***************************************/ #define ARR_NO_PUNT 1 #define ARR_OMOL_PUNT 2 #define ARR_ETEROL_PUNT 3 #define ARR_DOUBLE 4 #define ARR_BLOC 5 #define ARR_EQ 6 #define EQU_SPACING 6.0f #define TYPE_OF_ARROW_NUMBER 6 /** *Larghezza finestra */ #define FIN_W 800 /** *Altezza finestra */ #define FIN_H 624 /** *Il valore per gruppo non valido */ #define NO_VALID_GROUP -1 /* *Valori di default per l'interfaccia */ // units #define PIXELS 0 #define ENGLISH 1 #define METRIC 2 // page setup #define PAGE_LETTER 1 #define PAGE_LEGAL 2 #define PAGE_A4 3 #define PAGE_640 4 #define PAGE_800 5 #define PAGE_1024 6 #define PAGE_CUSTOM 7 #define PAGE_PORTRAIT 100 #define PAGE_LANDSCAPE 200 /** *Grid settings */ #define GRID_NONE 0 #define GRID_SQUARE 1 #define GRID_HEX 2 /** *Errore ammesso nella selezione del legame */ #define SENSIB_LEG 5 /** *Larghezza freccia in px */ #define ARR_W 12.0f /** *Altezza freccia in px */ #define ARR_H 4.0f /** *Arrow gap */ #define ARR_GAP .25 /** *Lunghezza legame in px */ #define LENGHT_BOND 25.0f /** *Angolo legame in radianti */ #define ANGL_BOND .52359877559829887307 /** *Spazio tra i legami in un legame multiplo in px */ #define SPACE_BOND 3.0f /** * specifica quanto,in un legame multiplo, i legami sopra e sotto il * principale sono piu' corti del principale. */ #define MULTIPLE_BOND_GAP 1.0f/8.0f /** *Width default of single bond */ #define LARG_SINGLE_BOND 1.0f /** *Larghezza massima del cuneo di un legame sereospecifico */ #define LARG_MAX_CUNEO 4.0f /** *Larghezza minima del cuneo di un legame sereospecifico */ #define LARG_MIN_CUNEO 2.0f /** *Tratteggio di un legame tratteggiato */ #define TRATTEGGIO_LEGAME 5 /** *Ampiezza dell'ansa del legame a streochimica sconosciuta * */ #define AMPIEZZA_STEREO_SCON 2.0f /** *frequenza dell'ansa del legame a streochimica sconosciuta * */ #define FREQUENZA_STEREO_SCON 1.0f /** *Numero di tick per il legame che si allontana da noi */ #define NUM_BARRETTE_STEREO_DOWN 8 /** *Di quanto deve essere piu' piccolo l'apice e il pedice? */ #define SCALE_APICI 2.0f #define SCALE_SUP_MINUS .72f #define MINUS "-" #define PLUS "+" /** *Tipo di font per le cariche */ #define FONT_STD_CARICHE 0 /** *Font standard per le etichette */ #define FONT_STD 0 /** *Dimensione font standard per le etichette */ #define FONT_STD_DIM 13 /** *Raggio degli elettroni * this is the value of border in png bounding box */ #define RAGGIO_EL 3 /** *Raggio dell'idrogeno verso di noi. */ #define RAGGIO_IDR_UP 6 #define DEFAULT_SIMILAR_THRESHOLD 0.1f /** *Symbol table */ #define ETIC_ALLINEA_DX 2 #define ETIC_ALLINEA_SX 0 #define ETIC_ALLINEA_CT 1 #define NO_ETIC "#" #define ETIC_IDR_UP "." #define NULL_CHAR "\t\n " #define APRI "{" #define CHIUDI "}" #define DP ":" #define SEP "," #define ETIC_ELEMENTO "elemento" #define ETIC_LISTA "lista" #define ETIC_LEGAME "legame" #define ETIC_ATOMO "atomo" #define ETIC_TIPO_ATOMO "tipo_atomo" #define ETIC_ETIC "etichetta" #define ETIC_MULTILINE_LABEL "multiline_label" #define ETIC_MULTIFONT_LABEL "multifont_label" #define ETIC_PARAGRAPH "paragraph" #define ETIC_GRUPPO "gruppo" #define ETIC_TIPO_GRUPPO "tipo_gruppo" #define ETIC_ROT "ROT" #define ETIC_ARC "ARC" #define ETIC_ARROW "ARROW" #define ETIC_BEZIER "BEZIER" #define ETIC_BOX "BOX" #define APICE "^" #define PEDICE "_" #define ESCAPE_CHAR "\\" #define NUM_CAMPI_ELEM 6 #define NUM_CAMPI_ETIC 5 #define CITE_ERROR_RG 10 #define COMP_R_EV 0xff #define COMP_G_EV 0x00 #define COMP_B_EV 0x00 //extern Fl_Double_Window* la_finestra; #define EXPORT_FORMAT_PS "ps" #define EXPORT_FORMAT_SVG "svg" #define EXPORT_FORMAT_PNG "png" /** *Default button width * */ #define LARG_BUTTON_DEFAULT 28 #define ALT_MENU 30 #define ALT_TOOLBAR 32 #define LARGH_BUTTON_BAR 62 #define ALT_FIN 200 #define LARGH_FIN 800 #define ALT_BUTT_LEFT 28 #define LARG_BUTTON_LEFT 28 #define LARG_BUTTON_LEFT_L (LARGH_BUTTON_BAR/2 - 2) #define LARG_BUTTON_TOP 28 #define ALT_BUTT_TOP 28 #define HEIGHT_INF_BAR ALT_BUTT_TOP #define PADD_BUTT 2 #define SPACER ALT_BUTT_LEFT /** *Contiene i simboli degli elementi ordinati per numero atomico. */ const string symbol_el[104]={ "" ,"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr"}; bist-0.5.2/include/bezier_prop.hpp0000644000175000017500000000412111025523004015501 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #if SIZEOF_INT_P == 8 #define BEZIER_PROP_SIZE_USER_DATA_MENU long int #else #define BEZIER_PROP_SIZE_USER_DATA_MENU unsigned int #endif void bezier_prop_type_cb(Fl_Widget* w, void* d); void bezier_prop_color_cb(Fl_Widget* w, void* d); void bezier_prop_ok_cb(Fl_Widget* w, void* d); void bezier_prop_cancel_cb(Fl_Widget* w, void* d); void bezier_prop_width_cb(Fl_Widget* w, void* d); void bezier_prop_tick_cb(Fl_Widget* w, void* d); void bezier_prop_width_arr_cb(Fl_Widget* w, void* d); void bezier_prop_height_arr_cb(Fl_Widget* w, void* d); void bezier_prop_gap_arr_cb(Fl_Widget* w, void* d); class bezier_prop : public Fl_Double_Window{ friend void bezier_prop_tick_cb(Fl_Widget* w, void* d); friend void bezier_prop_type_cb(Fl_Widget* w, void* d); friend void bezier_prop_color_cb(Fl_Widget* w, void* d); friend void bezier_prop_ok_cb(Fl_Widget* w, void* d); friend void bezier_prop_cancel_cb(Fl_Widget* w, void* d); friend void bezier_prop_width_cb(Fl_Widget* w, void* d); friend void bezier_prop_width_arr_cb(Fl_Widget* w, void* d); friend void bezier_prop_height_arr_cb(Fl_Widget* w, void* d); friend void bezier_prop_gap_arr_cb(Fl_Widget* w, void* d); public: bezier_prop(proc_bezier* arr); virtual ~bezier_prop(); protected: proc_bezier* _bezier; }; void bezier_win(proc_bezier* at); bist-0.5.2/include/plot_window.hpp0000644000175000017500000000402111304467065015543 0ustar cagecagenamespace spectra_plot{ enum signal_type { IR, CNMR_DECOUPLED, HNMR }; enum point_type { POINT, SPIKE, GAUSSIAN }; class plot_point{ public: enum point_type _type; float _x; float _y; float _sigma; }; void save_as_native_file_cb(Fl_Widget* w, void* v); class plot_window: public Fl_Double_Window, public finestra_pr { friend void spectra_plot::save_as_native_file_cb(Fl_Widget* w, void* v); public: plot_window(signal_type type_plot=IR); virtual ~plot_window(); virtual void draw(); void add_spike(float x, float y); void add_group(gruppo to_add, float x, float y); virtual Fl_Scroll* ritorna_scroll(); virtual immagine* ritorna_immagine(); virtual mol_canvas* ritorna_mol_canvas(); protected: void draw_axis(); void draw_scale_y(); void draw_scale_x(); void draw_points(); void draw_points_IR(); void draw_groups(); float remap_y(float old); float de_remap_y(float old); float remap_x(float old,signal_type t=CNMR_DECOUPLED); float de_remap_x(float old); float normalize_y(float old); float de_normalize_y(float old); float normalize_x(float old,signal_type t=CNMR_DECOUPLED); float de_normalize_x(float old); float actual_plot_w(); float actual_plot_h(); float actual_plot_x(); float actual_plot_y(); float _max_y; float _max_x; mol_canvas _canvas; immagine _plot; Fl_Scroll* _placeholder; std::vector _data; std::vector _groups; Fl_Button _save_file_b; signal_type _type_plot; const static int def_w; const static int def_h; const static float max_transmittance; const static float max_wave_no; /** *percentage */ const static float def_gap_w; /** *percentage */ const static float def_gap_h; const static char* title; const static float axys_div; const static float max_group_w; }; } bist-0.5.2/include/lib_dialog.hpp0000644000175000017500000000365211653002572015267 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define W_D 630 #define H_D 220 + LARG_BUTTON_DEFAULT #define W_TREE 288 #define H_TREE 186 #define GAP_ELE 2 #define GAP_BOX 18 void lib_dialog_tree_callback(Fl_Widget* w, void* ); void lib_dialog_ok_callback(Fl_Widget* w, void* ); void lib_dialog_cancel_callback(Fl_Widget* w, void* ); /** *Questa classe rappresenta la finestra per sfogliare la libreria di *template * */ class lib_dialog : public Fl_Double_Window , public finestra_pr { friend void lib_dialog_ok_callback(Fl_Widget* w, void* ); friend void lib_dialog_cancel_callback(Fl_Widget* w, void* ); friend void lib_dialog_tree_callback(Fl_Widget* w, void* ); public: /** *Costruttore di default */ lib_dialog(); void make_tree(string pt); /** *Distruttore */ virtual ~lib_dialog(); string get_template_file(); virtual Fl_Scroll* ritorna_scroll(); virtual immagine* ritorna_immagine(); virtual mol_canvas* ritorna_mol_canvas(); protected: Fl_Tree* _tree; mol_canvas _preview; immagine* _imm; Fl_Scroll* _grp; Fl_Return_Button* _ok; Fl_Return_Button* _cancel; string _template_file; const static string home_bra; const static string share_bra; const static string root_bra; }; bist-0.5.2/include/immagine_cml.hpp0000644000175000017500000000720511025523004015610 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define MOLECULE_CML "molecule" #define STRING_CML "string" #define ATOM_CML "atom" #define BOND_CML "bond" #define COORDINATE2_CML "coordinate2" #define INTEGER_CML "integer" #define FLOAT_CML "float" #define BOND_CML "bond" #define BUILTIN_CML "builtin" #define ID_CML "id" #define ELEMENT_TYPE_CML "elementType" #define XY2_CML "xy2" #define X2_CML "x2" #define Y2_CML "y2" #define FORMAL_CHARGE_CML "formalCharge" #define ORDER_CML "order" #define ATOMREFS_CML "atomRefs" #define ATOMREF_CML "atomRef" #define ORDER_CML "order" #define STRING_ARRAY "stringArray" #define INTEGER_ARRAY "integerArray" #define FLOAT_ARRAY "floatArray" #define ATOMARRAY_ID_CML "atomId" /** *Questa classe rappresenta un'immagine in memoria il cui input e' un *file cml1.0 */ class immagine_cml : public immagine { public: /** *Costruttore di default */ immagine_cml(); /** *Costruttore di copia */ immagine_cml(const immagine_cml& altra); /** *Costruisce, l'oggetto parsando il file passato come argomento. */ immagine_cml(string path); virtual ~immagine_cml(); /** *carica in memoria il file di input */ virtual void filebist(string path); /** *Avvia il parsing */ virtual void start(); /** *Converte l'ordine di legame cml nel tipo di legame corrispondente *nel formato bist nativo. */ static int conv_order_cml(string order_cml); protected: static void start_tags(void *userData, const XML_Char *name, const XML_Char **atts); static void end_tags(void *userData, const XML_Char *name); static void text_hand(void *userData, const XML_Char *s, int len); /** *\return una mappa contenente come chiavi il nome dell'attributo e *come valore il valore dell'attribbuto. */ static map costruct_map_attrb(const XML_Char **atts); /** *I gruppi parsati vengono temporaneamente messi qui, alla fine del *parsing verrabbo copiati in _gruppi */ static vector _gruppi_static; /** *contiene i tag aperti pair.first= nome del tag pair.second= mappa *contenente come chiavi il nome dell'attributo e come valore il *valore dell'attribbuto. */ static stack< pair< string, map > > _tag_static; static string _genitore_cml_static; static map _genitore_attrb_cml_static; static pair _atomref_static; static int _bnd_order_static; static string _atomref_array_1_static; static string _atomref_array_2_static; /** *Conta gli id dei legami nel caso in cui l'elemento bond non contenga *un attributo id valido */ static int _id_leg_fallback; }; bist-0.5.2/include/set_conf.hpp0000644000175000017500000000144711025523004014771 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /** *genera o carica il file di configurazione */ void setup_conf(); bist-0.5.2/include/chain_prop.hpp0000644000175000017500000000225011025523004015304 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 void chain_prop_cancel_cb(Fl_Widget* w, void* d); void chain_prop_ok_cb(Fl_Widget* w, void* d); /** *Questa classe rappresenta la finestra per cabiare le propriet delle *catene */ class chain_prop : public Fl_Double_Window { friend void chain_prop_ok_cb(Fl_Widget* w, void* d); public: chain_prop(); virtual ~chain_prop(); unsigned int _no_c; float _angl; }; bist-0.5.2/LICENSE0000644000175000017500000000133311025523004012034 0ustar cagecage Bist: a chemical drawing software Copyright (C) 2007 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see .bist-0.5.2/config.rpath0000755000175000017500000004364711166204327013367 0ustar cagecage#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2007 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | cygwin* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux* | k*bsd*-gnu) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | k*bsd*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix4* | aix5*) library_names_spec='$libname$shrext' ;; amigaos*) library_names_spec='$libname.a' ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd1*) ;; freebsd* | dragonfly*) case "$host_os" in freebsd[123]*) library_names_spec='$libname$shrext$versuffix' ;; *) library_names_spec='$libname$shrext' ;; esac ;; gnu*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; nto-qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < calc_angle(atomo* slot, gruppo ring); float calc_bisect(std::vector x_n, std::vector y_n, float min_pos, float max_neg); void sort_ang_idx(std::vector< std::pair >& vc, bool asc); bool _has_to_act; bool _has_acted; int _vertices; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/align_elements_dialog.hpp0000644000175000017500000000116711252652005020373 0ustar cagecage// generated by Fast Light User Interface Designer (fluid) version 1.0107 #ifndef align_dialog_h #define align_dialog_h #include #include #include enum align_elements_type_align { ALIGN_HOR, ALIGN_VERT, ALIGN_CIRC }; void align_elements_dialog_button_cb(Fl_Widget* w , void* d); class align_elements_dialog : public Fl_Double_Window { public: align_elements_dialog(); virtual ~align_elements_dialog(); align_elements_type_align get_alignment(); protected: Fl_Button _horiz_button; Fl_Button _verti_button; Fl_Button _circu_button; }; #endif bist-0.5.2/pluginclude/change_layer.hpp0000644000175000017500000000252711411114540016502 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2010 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ class ChangeLayer: public bist_plugin{ public: ChangeLayer(immagine* image, string libpath); virtual ~ChangeLayer(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); void inizialize(); virtual std::string menu_path(); void push_down(bool go_background=false); void push_up(bool go_foreground=false); protected: bool _has_to_act; bool _has_acted; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/enumerate_atoms.hpp0000644000175000017500000000161311215470303017250 0ustar cagecageclass enumerate_atoms_etich_entry{ public: etichetta* _et; int _x; int _y; int _w; int _h; /* 3 +----------+ 0 | | | | | | 2 +----------+ 1 */ int _last_pos; static const int max_pos; }; class enumerate_atoms: public bist_plugin{ public: enumerate_atoms(immagine* image, string libpath); virtual ~enumerate_atoms(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); void inizialize(); protected: void enumerate(); void update_pos(etichetta* et); int _curr_num; bool _has_to_act; bool _has_acted; std::vector _added; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/wrap_bracket_dialog.hpp0000644000175000017500000000121711206260417020046 0ustar cagecage// generated by Fast Light User Interface Designer (fluid) version 1.0107 #ifndef wrap_bracket_dialog_h #define wrap_bracket_dialog_h #define WRAP_BRACKET_PARENTHESES 0 #define WRAP_BRACKET_BOX 1 #define WRAP_BRACKET_CURLY 2 #if SIZEOF_INT_P == 8 #define WRAP_BRACKET_SIZE_USER_DATA_MENU long int #else #define WRAP_BRACKET_SIZE_USER_DATA_MENU unsigned int #endif #include #include #include #include #include void wrap_molecule_dialog_cb(Fl_Widget* w, void* d); int make_wrap_molecule_dialog(bool& merge, bool& free_wrap); #endif bist-0.5.2/pluginclude/change_layer_dialog.hpp0000644000175000017500000000271611411114540020021 0ustar cagecage// generated by Fast Light User Interface Designer (fluid) version 1.0107 /* Bist: a chemical drawing tool Copyright (C) 2010 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include void change_layer_dialog_up_cb(Fl_Widget* w , void* d); void change_layer_dialog_up_cb(Fl_Widget* w , void* d); void change_layer_dialog_foreground_cb(Fl_Widget* w , void* d); void change_layer_dialog_background_cb(Fl_Widget* w , void* d); class ChangeLayerDialog : public Fl_Double_Window { public: ChangeLayerDialog(ChangeLayer* plugin); virtual ~ChangeLayerDialog(); void push_down(bool go_background=false); void push_up(bool go_foreground=false); protected: Fl_Button _up; Fl_Button _down; Fl_Button _back; Fl_Button _foreg; ChangeLayer* _plugin; }; bist-0.5.2/pluginclude/wrap_in_bracket.hpp0000644000175000017500000000204411206260417017214 0ustar cagecageclass wrap_in_bracket: public bist_plugin{ public: wrap_in_bracket(immagine* image, string libpath); virtual ~wrap_in_bracket(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); void inizialize(); protected: /** *\param the_group if NULL a new group will be created **/ void insert_parent_bra(gruppo* the_group,float px,float py,float w,float h); /** *\param the_group if NULL a new group will be created **/ void insert_box_bra(gruppo* the_group, float px, float py, float w, float h); /** *\param the_group if NULL a new group will be created **/ void insert_curly_bra(gruppo* the_group,float px,float py,float w,float h); bool _has_to_act; bool _has_acted; bool _merge; bool _free_wrap; int _type; std::vector< std::pair > _box; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/global_charge.hpp0000644000175000017500000000103111143616560016632 0ustar cagecageclass global_charge: public bist_plugin{ public: global_charge(immagine* image, string libpath); virtual ~global_charge(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); void inizialize(); protected: bool _has_to_act; bool _has_acted; std::string _charges; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/flip_around_bond.hpp0000644000175000017500000000210511203577514017372 0ustar cagecageclass flip_around_bond: public bist_plugin{ public: flip_around_bond(immagine* image, string libpath); virtual ~flip_around_bond(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual void inizialize(); protected: void find_atoms(atomo** atm_parent, atomo** atm_child); bool _has_to_act; bool _has_acted; }; std::pair vec_flipped(atomo a, atomo b); float angle(std::pair a, std::pair b); float dot_product_vec(std::pair a, std::pair b); float cross_product_vec(std::pair a, std::pair b); float magn_vec(std::pair a); std::pair normalize_vec(std::pair a); int trasl_depth_search_pf(atomo* da , void* data, void* data2, void* data3); bool ignore_plug(atomo* atm, void* data4); extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/align_elements.hpp0000644000175000017500000000216611360326153017056 0ustar cagecageclass align_elements: public bist_plugin{ public: align_elements(immagine* image, string libpath); virtual ~align_elements(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); void inizialize(); virtual std::string menu_path(); protected: void patch_w_arrows(float center_x, float center_y, float nw_rad); float get_new_radius(float center_x, vector< pair < int, pair > >::iterator eliniz); void align_circ(bool clockwise, bool add_arrow); void align_hor_vert(bool horiz_align); bool bb_intersect(); void scale_circle(float center_x, float center_y ,float radius); void scale_circle_proc(procedura* proc , float center_x, float center_y); void scale_circle_etichetta(etichetta* labl , float center_x, float center_y); bool _has_to_act; bool _has_acted; }; int scale_circle_atom(atomo* from , void* data, void* data2, void* data3); extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/IR_prediction.hpp0000644000175000017500000000203011360326153016610 0ustar cagecageclass IR_prediction: public bist_plugin{ public: IR_prediction(immagine* image, string libpath); virtual ~IR_prediction(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); void inizialize(); void get_paths(string start); gruppo get_residual(std::string file, bool& has_error); immagine get_residual_immagine(std::string file, bool& has_error); bool generate_plot(gruppo mol); bool add_peak(std::string file); bool match(gruppo mol, gruppo r); virtual std::string menu_path(); const static std::string IR_dir; const static std::string skip_label; protected: spectra_plot::plot_window _spectrum; bool _has_to_act; std::vector _resid_paths; std::vector _resid_excluded; std::map _peak_height; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginclude/insert_template.hpp0000644000175000017500000000115711360326153017266 0ustar cagecageclass insert_template: public bist_plugin{ public: insert_template(immagine* image, string libpath); virtual ~insert_template(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); void inizialize(); bool search(string start,bool& found); virtual std::string menu_path(); protected: bool _has_to_act; bool _has_acted; string _name_template; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/man/0000755000175000017500000000000011740261237011615 5ustar cagecagebist-0.5.2/man/bist.10000644000175000017500000000360211304467065012644 0ustar cagecage.TH bist 1 "12/03/2003" .SH NAME bist \- a chemical drawing tool. .SH SYNOPSIS bist .B [-c --convert-to | -f --input-file | -h --help | -v --version] .SH DESCRIPTION Bist stands for \fBbi\fPdimensional \fBst\fPructures (in italian it sounds like "beast" in english) and is a chemical drawing tool. It is focused on organic chemistry but may it may be useful also for chemists or teacher as well. Bist support many of the formalism used to describe molecoles structures like single bond, double bond, stereospecific bond, charges, resonance arrows, lone pairs etc... It can export both PostScript and PNG formats. Currently portability is not my goal so only GNU/Linux platform is supported. However any effort in this direction is appreciated so feel free to ask me about any porting question. Please remember that bist is actually in a beta stage of development so i strongly suggest you to not using it except for testing or hacking purpose. Bist is free software released under GNU GPL .SH OPTIONS .TP .B \-c \-\-convert-to "format" Convert to "format" (currently PostScript, SVG, PNG); .TP .B \-f \-\-input-file "file" File to convert (wildcard allowed but please escape it); .TP .B \-h \-\-help Print usage information; .TP .B \-v \-\-version Print information and exit. .SH BUGS Please send bug reporting to: .I cage@katamail.com .SH SEE ALSO .SH AUTHORS Bist is written by Valerio Benfante. The logo has been designed by Luisa Russo. .B We always need help (traslation, code improvement etc...) .B please write to cage@katamail.com to contribute to this .B project. .SH COPYING Copyright (C) 2005 Valerio Benfante. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The logo is copyright 2005 Luisa Russo and is released under GNU GPL bist-0.5.2/BUGS0000644000175000017500000000005411367264754011540 0ustar cagecagePlease send bug report to cage@katamail.com bist-0.5.2/INSTALL0000644000175000017500000000010411740260661012066 0ustar cagecage$ autoreconf -fiv && ./configure && make && (got root) make install bist-0.5.2/rmcvs.py0000755000175000017500000000204611025523004012540 0ustar cagecage#!/usr/bin/python # # rmcvs delete svn files # Copyright (C) 2008 Valerio Benfante # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os from stat import * import shutil def rm_cvs(start): for f in os.listdir(start): path=start + "/" + f; attrb=os.stat(path)[ST_MODE]; if S_ISDIR(attrb): if(f in ".svn"): print "removing %s" % (path) shutil.rmtree(path); else: rm_cvs(path); rm_cvs("."); bist-0.5.2/genmo0000755000175000017500000000033411025523004012062 0ustar cagecage#!/bin/bash DIR="./po/LINGUAS" LIST=`head -n1 ./po/LINGUAS` for a in `echo $LIST` do echo -n "creating $a i18n catalog file..." msgfmt ./po/$a/LC_MESSAGES/$a.po -o ./po/$a/LC_MESSAGES/$1.mo echo "Done." done bist-0.5.2/rings/0000755000175000017500000000000011740261236012163 5ustar cagecagebist-0.5.2/rings/alifatic/0000755000175000017500000000000011740261236013737 5ustar cagecagebist-0.5.2/rings/alifatic/4_terms/0000755000175000017500000000000011740261236015314 5ustar cagecagebist-0.5.2/rings/alifatic/4_terms/cyclobutane.bist0000644000175000017500000000142511025523004020477 0ustar cagecagegruppo 102224559 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,16,13 } lista { legame{24784,25038,0,0,0,0} legame{24785,25039,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,16,38 } lista { legame{24783,25038,0,0,0,0} legame{24786,25041,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,41,13 } lista { legame{24783,25039,0,0,0,0} legame{24786,25040,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,41,38 } lista { legame{24785,25040,0,0,0,0} legame{24784,25041,0,0,0,0} } } } bist-0.5.2/rings/alifatic/5_terms/0000755000175000017500000000000011740261236015315 5ustar cagecagebist-0.5.2/rings/alifatic/5_terms/pentane.bist0000644000175000017500000000271711025523004017627 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 4 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 5 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 6 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 7 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 8 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 9 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 10 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 11 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 12 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 13 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 14 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 15 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,18,52 } lista { legame{1,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,43,52 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,50,28 } lista { legame{1,0,0,0,0,0} legame{4,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,11,28 } lista { legame{0,0,0,0,0,0} legame{4,1,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,31,12 } lista { legame{2,0,0,0,0,0} legame{3,1,0,0,0,0} } } } bist-0.5.2/rings/alifatic/6_terms/0000755000175000017500000000000011740261236015316 5ustar cagecagebist-0.5.2/rings/alifatic/6_terms/cicloesane_chair.bist0000644000175000017500000000240011440136471021447 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 4 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 5 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 6 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 7 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,32,27 } lista { legame{1,0,0,0,0,0} legame{5,1,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,57,27 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,79,15 } lista { legame{1,0,0,0,0,0} legame{3,1,6,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66,37 } lista { legame{2,0,6,0,0,0} legame{4,1,7,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,41,37 } lista { legame{3,0,7,0,0,0} legame{5,1,-6,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,19,49 } lista { legame{0,0,0,0,0,0} legame{4,1,-6,0,0,0} } } } bist-0.5.2/rings/alifatic/6_terms/cicloesane_boat.bist0000644000175000017500000000253611440136471021320 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 4 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 5 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 6 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 7 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 8 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,41,41.9167 } lista { legame{1,0,0,0,0,0} legame{5,1,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,71.4167,41.9167 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,86.8333,26.9167 } lista { legame{1,0,0,0,0,0} legame{3,1,6,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,71.8333,56.9167 } lista { legame{2,0,-6,0,0,0} legame{4,1,7,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,40.5833,56.9167 } lista { legame{3,0,7,0,0,0} legame{5,1,-6,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,24.6667,26.25 } lista { legame{0,0,0,0,0,0} legame{4,1,6,0,0,0} } } } bist-0.5.2/rings/alifatic/8_terms/0000755000175000017500000000000011740261236015320 5ustar cagecagebist-0.5.2/rings/alifatic/8_terms/cyclooctane.bist0000644000175000017500000000305211025523004020474 0ustar cagecagegruppo 102224559 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76.664,44 } lista { legame{24784,25038,0,0,0,0} legame{24786,25040,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67.097,67.097 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44,76.664 } lista { legame{24784,25039,0,0,0,0} legame{24790,25045,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67.097,20.903 } lista { legame{24783,25040,0,0,0,0} legame{24787,25041,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44,11.336 } lista { legame{24786,25041,0,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,20.903,20.903 } lista { legame{24787,25042,0,0,0,0} legame{24789,25043,0,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,11.3359,44 } lista { legame{24788,25043,0,0,0,0} legame{24790,25044,0,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,20.903,67.097 } lista { legame{24789,25044,0,0,0,0} legame{24785,25045,0,0,0,0} } } } bist-0.5.2/rings/alifatic/7_terms/0000755000175000017500000000000011740261236015317 5ustar cagecagebist-0.5.2/rings/alifatic/7_terms/cycloeptane.bist0000644000175000017500000000260511025523004020501 0ustar cagecagegruppo 102224559 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,114.939,147.975 } lista { legame{24784,25038,0,0,0,0} legame{24786,25044,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,99.4888,167.629 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,74.4894,167.804 } lista { legame{24784,25039,0,0,0,0} legame{24789,25043,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,109.206,123.641 } lista { legame{24787,25040,0,0,0,0} legame{24783,25044,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,86.6066,112.952 } lista { legame{24786,25040,0,0,0,0} legame{24788,25041,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,64.1587,123.956 } lista { legame{24787,25041,0,0,0,0} legame{24789,25042,0,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,58.766,148.367 } lista { legame{24788,25042,0,0,0,0} legame{24785,25043,0,0,0,0} } } } bist-0.5.2/rings/residual/0000755000175000017500000000000011740261236013773 5ustar cagecagebist-0.5.2/rings/residual/COOH.bist0000644000175000017500000000136611025523004015402 0ustar cagecagegruppo 85728428 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 85728429 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 85728430 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,17,38 } lista { legame{1,0,1,0,0,0} legame{2,1,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,17,13 } lista { legame{0,0,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,39,51 } lista { legame{0,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,61,38 } lista { legame{2,0,0,0,0,0} } } } bist-0.5.2/rings/residual/SO3H.bist0000644000175000017500000000130711025523004015361 0ustar cagecagegruppo 85728428 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 85728429 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {S,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,24,40 } lista { legame{1,0,1,0,0,0} legame{2,1,1,0,0,0} legame{3,2,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,24,15 } lista { legame{0,0,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,24,65 } lista { legame{0,0,1,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,49,40 } lista { legame{0,0,0,0,0,0} } } } bist-0.5.2/rings/steroids/0000755000175000017500000000000011740261236014017 5ustar cagecagebist-0.5.2/rings/steroids/sigmasterole.bist0000644000175000017500000001276511025523004017401 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,188,227 } lista { legame{1,0,0,0,0,0} legame{2,1,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,188,252 } lista { legame{0,0,0,0,0,0} legame{5,1,0,0,0,0} legame{7,2,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,210,214 } lista { legame{0,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,232,227 } lista { legame{2,0,0,0,0,0} legame{4,1,0,0,0,0} legame{9,2,0,0,0,0} legame{13,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,232,252 } lista { legame{3,0,0,0,0,0} legame{5,1,0,0,0,0} legame{12,2,1,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,210,264 } lista { legame{4,0,0,0,0,0} legame{1,1,0,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,166,264 } lista { legame{8,1,0,0,0,0} legame{1,2,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,144.659,250.979 } lista { legame{7,0,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,254,214 } lista { legame{3,0,0,0,0,0} legame{10,1,0,0,0,0} legame{14,2,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,276,227 } lista { legame{9,0,0,0,0,0} legame{11,1,0,0,0,0} legame{17,2,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,276,252 } lista { legame{10,0,0,0,0,0} legame{12,1,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,254,264 } lista { legame{11,0,0,0,0,0} legame{4,1,1,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,232,202 } lista { legame{3,0,0,0,0,0} } } atomo 14 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,254,189 } lista { legame{9,0,0,0,0,0} legame{15,1,0,0,0,0} } } atomo 15 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,276,176 } lista { legame{14,0,0,0,0,0} legame{16,1,0,0,0,0} } } atomo 16 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,298,189 } lista { legame{15,0,0,0,0,0} legame{17,1,0,0,0,0} legame{18,2,0,0,0,0} legame{19,3,0,0,0,0} } } atomo 17 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,298,214 } lista { legame{16,0,0,0,0,0} legame{10,1,0,0,0,0} legame{20,2,0,0,0,0} } } atomo 18 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,298,164 } lista { legame{16,0,0,0,0,0} } } atomo 19 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,322,181 } lista { legame{16,0,0,0,0,0} legame{21,1,0,0,0,0} legame{22,2,0,0,0,0} } } atomo 20 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,322,222 } lista { legame{17,0,0,0,0,0} legame{21,1,0,0,0,0} } } atomo 21 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,337,202 } lista { legame{20,0,0,0,0,0} legame{19,1,0,0,0,0} } } atomo 22 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,322,156 } lista { legame{19,0,0,0,0,0} legame{23,1,0,0,0,0} legame{24,2,0,0,0,0} } } atomo 23 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,300,143 } lista { legame{22,0,0,0,0,0} } } atomo 24 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,344,144 } lista { legame{22,0,0,0,0,0} legame{25,1,1,0,0,0} } } atomo 25 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,366,156 } lista { legame{24,0,1,0,0,0} legame{26,1,0,0,0,0} } } atomo 26 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,388,144 } lista { legame{25,0,0,0,0,0} legame{28,1,0,0,0,0} legame{32,2,0,0,0,0} } } atomo 28 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,388,119 } lista { legame{29,1,0,0,0,0} legame{26,2,0,0,0,0} } } atomo 29 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,409.651,106.5 } lista { legame{28,0,0,0,0,0} legame{30,1,0,0,0,0} } } atomo 30 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,409.651,81.5 } lista { legame{29,0,0,0,0,0} } } atomo 32 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,410,156 } lista { legame{33,1,0,0,0,0} legame{26,3,0,0,0,0} legame{34,4,0,0,0,0} } } atomo 33 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,431.341,142.979 } lista { legame{32,0,0,0,0,0} } } atomo 34 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,410,181 } lista { legame{32,0,0,0,0,0} } } } bist-0.5.2/rings/porphirine/0000755000175000017500000000000011740261236014342 5ustar cagecagebist-0.5.2/rings/porphirine/porphirine.bist0000644000175000017500000001172411025523004017377 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 4 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 5 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 6 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 7 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 8 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 9 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 10 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 11 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 12 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 13 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 14 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 16 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 17 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 18 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 19 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 20 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 21 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,46,16 } lista { legame{1,0,0,0,0,0} legame{2,1,1,0,0,0} legame{23,2,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {NH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,46,41 } lista { legame{0,0,0,0,0,0} legame{15,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,68,4 } lista { legame{0,0,1,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,16 } lista { legame{2,0,0,0,0,0} legame{4,1,1,0,0,0} legame{17,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,41 } lista { legame{3,0,1,0,0,0} legame{5,1,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,53 } lista { legame{4,0,0,0,0,0} legame{6,1,1,0,0,0} legame{16,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,124,75 } lista { legame{5,0,1,0,0,0} legame{7,1,0,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,111,97 } lista { legame{6,0,0,0,0,0} legame{8,1,0,0,0,0} legame{25,2,1,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {HN,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,89,110 } lista { legame{7,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,89,135 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} legame{24,2,1,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67,148 } lista { legame{9,0,0,0,0,0} legame{11,1,1,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,45,135 } lista { legame{10,0,1,0,0,0} legame{12,1,0,0,0,0} legame{21,2,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,45,110 } lista { legame{11,0,0,0,0,0} legame{13,1,1,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,23,97 } lista { legame{12,0,1,0,0,0} legame{14,1,0,0,0,0} legame{20,2,0,0,0,0} } } atomo 14 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,10,75 } lista { legame{13,0,0,0,0,0} legame{15,1,1,0,0,0} } } atomo 15 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,22,53 } lista { legame{14,0,1,0,0,0} legame{1,1,0,0,0,0} legame{22,2,0,0,0,0} } } atomo 16 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,126,32 } lista { legame{5,0,0,0,0,0} legame{17,1,1,0,0,0} } } atomo 17 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,114,10 } lista { legame{3,0,0,0,0,0} legame{16,1,1,0,0,0} } } atomo 20 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,7,116 } lista { legame{13,0,0,0,0,0} legame{21,1,1,0,0,0} } } atomo 21 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,20,139 } lista { legame{11,0,0,0,0,0} legame{20,1,1,0,0,0} } } atomo 22 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,8,33 } lista { legame{15,0,0,0,0,0} legame{23,1,1,0,0,0} } } atomo 23 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,22,10 } lista { legame{0,0,0,0,0,0} legame{22,1,1,0,0,0} } } atomo 24 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,113,143 } lista { legame{9,0,1,0,0,0} legame{25,1,0,0,0,0} } } atomo 25 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,125,117 } lista { legame{7,0,1,0,0,0} legame{24,1,0,0,0,0} } } } bist-0.5.2/rings/aromatic/0000755000175000017500000000000011740261236013762 5ustar cagecagebist-0.5.2/rings/aromatic/sulfonic_acid.bist0000644000175000017500000000434711025523004017445 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,28,53 } lista { legame{1,0,0,0,0,0} legame{2,1,1,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,28,78 } lista { legame{0,0,0,0,0,0} legame{5,1,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,50,41 } lista { legame{0,0,1,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,72,53 } lista { legame{2,0,0,0,0,0} legame{4,1,1,0,0,0} legame{6,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,72,78 } lista { legame{3,0,1,0,0,0} legame{5,1,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,50,91 } lista { legame{4,0,0,0,0,0} legame{1,1,1,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {S,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,94,40 } lista { legame{3,0,0,0,0,0} legame{7,1,1,0,0,0} legame{10,3,0,0,0,0} legame{13,4,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,81,18 } lista { legame{6,0,1,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,116,27 } lista { legame{11,1,0,0,0,0} legame{6,2,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,137.776,39.2805 } lista { legame{10,0,0,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,106,62 } lista { legame{6,1,1,0,0,0} } } } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,1.07969e+09,-1.07375e+09 } lista { legame{1,0,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,1.07969e+09,-1.07375e+09 } lista { legame{0,0,0,0,0,0} } } } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } bist-0.5.2/rings/aromatic/benzene.bist0000644000175000017500000000200711025523004016260 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,26,35 } lista { legame{1,0,0,0,0,0} legame{2,1,1,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,26,60 } lista { legame{0,0,0,0,0,0} legame{5,1,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48,23 } lista { legame{0,0,1,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70,35 } lista { legame{2,0,0,0,0,0} legame{4,1,1,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70,60 } lista { legame{3,0,1,0,0,0} legame{5,1,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48,73 } lista { legame{4,0,0,0,0,0} legame{1,1,1,0,0,0} } } } bist-0.5.2/rings/aromatic/biphenyl.bist0000644000175000017500000000463311161162621016460 0ustar cagecagegruppo 80821237 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,61.399,38.921 } lista { legame{24784,25038,0,0,0,0} legame{24788,25043,1,0,0,0} legame{24789,25044,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,51.3993,56.241 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,1,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,31.3993,56.241 } lista { legame{24784,25039,1,0,0,0} legame{24786,25040,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,21.3992,38.921 } lista { legame{24785,25040,0,0,0,0} legame{24787,25041,1,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,31.3993,21.601 } lista { legame{24786,25041,1,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,51.3993,21.601 } lista { legame{24787,25042,0,0,0,0} legame{24783,25043,1,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,81.399,38.921 } lista { legame{24783,25044,0,0,0,0} legame{24790,25045,1,0,0,0} legame{24792,25047,0,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91.399,21.601 } lista { legame{24789,25045,1,0,0,0} legame{24791,25046,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,111.399,21.601 } lista { legame{24790,25046,0,0,0,0} legame{6319968,6384993,1,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91.399,56.242 } lista { legame{24789,25047,0,0,0,0} legame{6319969,6384995,1,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,121.399,38.922 } lista { legame{24791,6384993,1,0,0,0} legame{6319969,6384994,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,111.399,56.242 } lista { legame{6319968,6384994,0,0,0,0} legame{24792,6384995,1,0,0,0} } } } bist-0.5.2/rings/aromatic/benzene_nok.bist0000644000175000017500000000244511025523004017135 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,10,48 } lista { legame{1,0,0,0,0,0} legame{5,1,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,10,23 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,32,10 } lista { legame{1,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54,23 } lista { legame{2,0,0,0,0,0} legame{4,1,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54,48 } lista { legame{3,0,0,0,0,0} legame{5,1,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,32,60 } lista { legame{4,0,0,0,0,0} legame{0,1,0,0,0,0} } } } gruppo 4 : tipo_gruppo 0{ ROT {0,0,0} ARC {0,18.1961,34.8922,46.1961,34.8922,18.1961,17.8922,46.1961,17.8922,18.1961,52.8922,46.1961,52.8922,0,0,0,0,0,0,1,0} } bist-0.5.2/rings/aromatic/condensed/0000755000175000017500000000000011740261236015724 5ustar cagecagebist-0.5.2/rings/aromatic/condensed/anthracene.bist0000644000175000017500000000546511025523004020717 0ustar cagecagegruppo 112736109 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,57.3209,40 } lista { legame{24784,25038,0,0,0,0} legame{24788,25043,1,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,74.641,50 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,1,0,0,0} legame{24789,25044,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,74.641,70 } lista { legame{24784,25039,1,0,0,0} legame{24786,25040,0,0,0,0} legame{24792,6384993,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,57.3209,80 } lista { legame{24785,25040,0,0,0,0} legame{24787,25041,1,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,40,70 } lista { legame{24786,25041,1,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,40,50 } lista { legame{24787,25042,0,0,0,0} legame{24783,25043,1,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91.9612,40 } lista { legame{24784,25044,0,0,0,0} legame{24790,25045,1,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,109.282,50 } lista { legame{24789,25045,1,0,0,0} legame{24791,25046,0,0,0,0} legame{6319968,6384994,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,109.282,70 } lista { legame{24790,25046,0,0,0,0} legame{24792,25047,1,0,0,0} legame{6319971,6384998,0,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91.9612,80 } lista { legame{24791,25047,1,0,0,0} legame{24785,6384993,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,126.602,40 } lista { legame{24790,6384994,0,0,0,0} legame{6319969,6384995,1,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,143.923,50 } lista { legame{6319968,6384995,1,0,0,0} legame{6319970,6384996,0,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,143.923,70 } lista { legame{6319969,6384996,0,0,0,0} legame{6319971,6384997,1,0,0,0} } } atomo 6319971 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,126.602,80 } lista { legame{6319970,6384997,1,0,0,0} legame{24791,6384998,0,0,0,0} } } } bist-0.5.2/rings/insatures/0000755000175000017500000000000011740261236014200 5ustar cagecagebist-0.5.2/rings/insatures/cyclopentadiene_sp.bist0000644000175000017500000000177711025523004020735 0ustar cagecagegruppo 89624364 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,29.0001,78.0001 } lista { legame{24784,25038,1,0,0,0} legame{24786,25040,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54.0001,78.0001 } lista { legame{24783,25038,1,0,0,0} legame{24785,25039,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,61.7255,54.2237 } lista { legame{24784,25039,0,0,0,0} legame{24787,25042,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,21.2747,54.2237 } lista { legame{24783,25040,0,0,0,0} legame{24787,25041,1,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,41.5001,39.5291 } lista { legame{24786,25041,1,0,0,0} legame{24785,25042,0,0,0,0} } } } bist-0.5.2/rings/insatures/cyclopentadiene.bist0000644000175000017500000000175211025523004020224 0ustar cagecagegruppo 104488422 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,63,102 } lista { legame{24784,25038,0,0,0,0} legame{24786,25040,1,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,88,102 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,1,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,95.7254,78.2236 } lista { legame{24784,25039,1,0,0,0} legame{24787,25042,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,55.2746,78.2236 } lista { legame{24783,25040,1,0,0,0} legame{24787,25041,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,75.5,63.529 } lista { legame{24786,25041,0,0,0,0} legame{24785,25042,0,0,0,0} } } } bist-0.5.2/rings/glucids/0000755000175000017500000000000011740261236013615 5ustar cagecagebist-0.5.2/rings/glucids/d-glucose.bist0000644000175000017500000000623311025523004016354 0ustar cagecagegruppo 85728428 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.0955,72.3443 } lista { legame{24784,25038,0,0,0,0} legame{24786,25040,0,0,0,0} legame{24790,25045,0,0,0,0} legame{6319972,6384997,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76.7438,72.3443 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,0,0,0,0} legame{24789,25044,0,0,0,0} legame{6319973,6384998,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,97.0016,52.0869 } lista { legame{24784,25039,0,0,0,0} legame{24788,25042,0,0,0,0} legame{6319968,6384993,0,0,0,0} legame{6319969,6384994,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,27.8377,52.0869 } lista { legame{24783,25040,0,0,0,0} legame{24787,25041,0,0,0,0} legame{24791,25046,0,0,0,0} legame{24792,25047,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.0955,31.8296 } lista { legame{24786,25041,0,0,0,0} legame{24788,25043,0,0,0,0} legame{6319970,6384995,0,0,0,0} legame{6319971,6384996,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76.7438,31.8296 } lista { legame{24785,25042,0,0,0,0} legame{24787,25043,0,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76.7438,89.5333 } lista { legame{24784,25044,0,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.0955,89.5333 } lista { legame{24783,25045,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,27.8377,69.2755 } lista { legame{24786,25046,0,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,27.8377,34.8979 } lista { legame{24786,25047,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,97.0016,34.8979 } lista { legame{24785,6384993,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,97.0016,69.2755 } lista { legame{24785,6384994,0,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {CH_{2}OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.0955,14.6406 } lista { legame{24787,6384995,0,0,0,0} } } atomo 6319971 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.0955,45.5808 } lista { legame{24787,6384996,0,0,0,0} } } atomo 6319972 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.0955,58.5931 } lista { legame{24783,6384997,0,0,0,0} } } atomo 6319973 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76.7438,58.5931 } lista { legame{24784,6384998,0,0,0,0} } } } bist-0.5.2/rings/glucids/d-fructose.bist0000644000175000017500000000507511025523004016550 0ustar cagecagegruppo 79141338 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70.2978,86.8965 } lista { legame{24784,25038,0,0,0,0} legame{24786,25040,0,0,0,0} legame{24790,25045,0,0,0,0} legame{24791,25046,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,114.464,86.8965 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,0,0,0,0} legame{24788,25043,0,0,0,0} legame{24789,25044,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,136.546,48.6479 } lista { legame{24784,25039,0,0,0,0} legame{24787,25042,0,0,0,0} legame{6319969,6384994,0,0,0,0} legame{6319970,6384995,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.2149,48.6479 } lista { legame{24783,25040,0,0,0,0} legame{24787,25041,0,0,0,0} legame{24792,25047,0,0,0,0} legame{6319968,6384993,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91.7634,26.565 } lista { legame{24786,25041,0,0,0,0} legame{24785,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,114.464,60.397 } lista { legame{24784,25043,0,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,114.464,113.396 } lista { legame{24784,25044,0,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70.2978,60.397 } lista { legame{24783,25045,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70.2978,113.396 } lista { legame{24783,25046,0,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48.2149,75.1473 } lista { legame{24786,25047,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {HOH_{2}C,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,48.2149,22.1484 } lista { legame{24786,6384993,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {CH_{2}OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,136.546,22.1484 } lista { legame{24785,6384994,0,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,136.546,75.1473 } lista { legame{24785,6384995,0,0,0,0} } } } bist-0.5.2/rings/glucids/sucrose.bist0000644000175000017500000000667311256432537016205 0ustar cagecagegruppo 1 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,174,70 } lista { legame{1,0,0,0,0,0} legame{2,1,0,0,0,0} legame{11,2,5,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,174,95 } lista { legame{0,0,0,0,0,0} legame{5,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,196,58 } lista { legame{0,0,0,0,0,0} legame{3,1,0,0,0,0} legame{7,2,-5,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,218,70 } lista { legame{2,0,0,0,0,0} legame{4,1,0,0,0,0} legame{6,2,6,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,218,95 } lista { legame{3,0,0,0,0,0} legame{5,1,0,0,0,0} legame{8,2,-5,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,196,108 } lista { legame{4,0,0,0,0,0} legame{1,1,0,0,0,0} legame{9,2,6,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,240,58 } lista { legame{3,0,6,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,196,33 } lista { legame{2,0,-5,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,240,107 } lista { legame{4,0,-5,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,196,133 } lista { legame{5,0,6,0,0,0} legame{10,1,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,218,145 } lista { legame{9,0,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,152,57 } lista { legame{0,0,-5,0,0,0} legame{12,1,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,130.735,70.513 } lista { legame{11,0,0,0,0,0} legame{13,1,0,0,0,0} legame{16,2,0,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,122.761,94.207 } lista { legame{14,1,0,0,0,0} legame{12,2,0,0,0,0} } } atomo 14 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,97.763,93.946 } lista { legame{13,0,0,0,0,0} legame{15,1,0,0,0,0} legame{21,2,-5,0,0,0} } } atomo 15 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90.286,70.09 } lista { legame{14,0,0,0,0,0} legame{16,1,0,0,0,0} legame{19,2,6,0,0,0} } } atomo 16 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,110.664,55.607 } lista { legame{15,0,0,0,0,0} legame{12,1,0,0,0,0} } } atomo 19 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67.997,57.455 } lista { legame{15,0,-6,0,0,0} legame{20,1,0,0,0,0} } } atomo 20 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,46.261,70.892 } lista { legame{19,0,0,0,0,0} } } atomo 21 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,85.174,116.123 } lista { legame{14,0,5,0,0,0} } } } bist-0.5.2/rings/glucids/poly/0000755000175000017500000000000011740261236014600 5ustar cagecagebist-0.5.2/rings/glucids/poly/chitin.bist0000644000175000017500000001673011256432537016756 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,169,238 } lista { legame{1,0,0,0,0,0} legame{5,1,0,0,0,0} legame{32,2,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,194,238 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,206,216 } lista { legame{1,0,0,0,0,0} legame{3,1,6,0,0,0} legame{6,2,0,0,0,0} legame{15,3,0,0,0,0} legame{16,4,0,0,0,0} legame{17,5,0,0,0,0} legame{18,6,0,0,0,0} legame{19,7,0,0,0,0} legame{20,8,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,193,194 } lista { legame{2,0,-6,0,0,0} legame{4,1,7,0,0,0} legame{21,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,168,194 } lista { legame{3,0,7,0,0,0} legame{5,1,-6,0,0,0} legame{27,2,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,155,216 } lista { legame{4,0,6,0,0,0} legame{0,1,0,0,0,0} legame{25,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,228,229 } lista { legame{2,0,0,0,0,0} legame{7,1,0,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,250,216 } lista { legame{6,0,0,0,0,0} legame{8,1,0,0,0,0} legame{12,2,6,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,262,194 } lista { legame{7,0,0,0,0,0} legame{9,1,0,0,0,0} legame{34,2,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,287,194 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,299,216 } lista { legame{9,0,0,0,0,0} legame{11,1,6,0,0,0} legame{13,2,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,286,238 } lista { legame{10,0,-6,0,0,0} legame{12,1,7,0,0,0} legame{28,2,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,261,238 } lista { legame{11,0,7,0,0,0} legame{7,1,-6,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,321,203 } lista { legame{10,0,0,0,0,0} legame{14,1,8,0,0,0} } } atomo 14 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,346,203 } lista { legame{13,0,8,0,0,0} } } atomo 15 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,193,194 } lista { legame{2,0,0,0,0,0} } } atomo 16 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,193,194 } lista { legame{2,0,0,0,0,0} } } atomo 17 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,193,194 } lista { legame{2,0,0,0,0,0} } } atomo 18 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,193,194 } lista { legame{2,0,0,0,0,0} } } atomo 19 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,193,194 } lista { legame{2,0,0,0,0,0} } } atomo 20 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,193,194 } lista { legame{2,0,0,0,0,0} } } atomo 21 : tipo_atomo 12{ elemento { etichetta {HN,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,193,169 } lista { legame{3,0,0,0,0,0} legame{22,1,0,0,0,0} } } atomo 22 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,215,156 } lista { legame{21,0,0,0,0,0} legame{23,1,1,0,0,0} legame{24,2,0,0,0,0} } } atomo 23 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,215,131 } lista { legame{22,0,1,0,0,0} } } atomo 24 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,237,169 } lista { legame{22,0,0,0,0,0} } } atomo 25 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,133,204 } lista { legame{5,0,0,0,0,0} legame{26,1,8,0,0,0} } } atomo 26 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,108,204 } lista { legame{25,0,8,0,0,0} } } atomo 27 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,146,182 } lista { legame{4,0,0,0,0,0} } } atomo 28 : tipo_atomo 12{ elemento { etichetta {NH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,286,263 } lista { legame{11,0,0,0,0,0} legame{29,1,0,0,0,0} } } atomo 29 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,264,275 } lista { legame{28,0,0,0,0,0} legame{30,1,1,0,0,0} legame{31,2,0,0,0,0} } } atomo 30 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,264,300 } lista { legame{29,0,1,0,0,0} } } atomo 31 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,242,263 } lista { legame{29,0,0,0,0,0} } } atomo 32 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,169,263 } lista { legame{0,0,0,0,0,0} legame{33,1,0,0,0,0} } } atomo 33 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,147,275 } lista { legame{32,0,0,0,0,0} } } atomo 34 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,262,169 } lista { legame{8,0,0,0,0,0} legame{35,1,0,0,0,0} } } atomo 35 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,284,156 } lista { legame{34,0,0,0,0,0} } } } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} ARROW {0,309.233,112.667,334.333,112.667,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {1,333.333,112.667,333.333,311.333,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {2,309.233,311.333,334.333,311.333,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {3,118.667,112.667,143.767,112.667,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {4,119.667,112.667,119.667,311.333,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {5,118.667,311.333,143.767,311.333,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {6,309.233,111.667,335.333,111.667,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {7,334.333,111.667,334.333,312.333,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {8,309.233,312.333,335.333,312.333,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {9,117.667,111.667,143.767,111.667,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {10,118.667,111.667,118.667,312.333,0,0,0,0,0,0,2,0,1,12,4,0.25} ARROW {11,117.667,312.333,143.767,312.333,0,0,0,0,0,0,2,0,1,12,4,0.25} } paragraph{ 206,208,0,2, multifont_label{ 206,208,5, etichetta {1,0,8,206,208,0,0,0,0,0} } } paragraph{ 246,208,0,2, multifont_label{ 246,208,5, etichetta {1,0,8,246,208,0,0,0,0,0} } } paragraph{ 149.5,216,0,2, multifont_label{ 149.5,216,5, etichetta {4,0,8,149.5,216,0,0,0,0,0} } } paragraph{ 299,216,0,2, multifont_label{ 299,216,5, etichetta {4,0,8,299,216,0,0,0,0,0} } } paragraph{ 342,308,5,2, multifont_label{ 342,308,5, etichetta {n,0,16,342,308,0,0,0,0,0} } } bist-0.5.2/rings/RNA/0000755000175000017500000000000011740261236012603 5ustar cagecagebist-0.5.2/rings/RNA/uracil.bist0000644000175000017500000000311111025523004014727 0ustar cagecagegruppo 119535679 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,53.8389,38.4545 } lista { legame{24784,25038,0,0,0,0} legame{24788,25043,0,0,0,0} legame{24789,25044,1,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,73.8377,50.001 } lista { legame{24783,25038,0,0,0,0} legame{24785,25039,1,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,73.8377,73.0937 } lista { legame{24784,25039,1,0,0,0} legame{24786,25040,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,-3},0,0,0,0,14,0,0,0,53.8389,84.6401 } lista { legame{24785,25040,0,0,0,0} legame{24787,25041,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,33.8397,73.0937 } lista { legame{24786,25041,0,0,0,0} legame{24788,25042,0,0,0,0} legame{24790,25045,1,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {HN,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,33.8397,50.001 } lista { legame{24787,25042,0,0,0,0} legame{24783,25043,0,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,53.8389,15.3616 } lista { legame{24783,25044,1,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,13.8408,84.6401 } lista { legame{24787,25045,1,0,0,0} } } } bist-0.5.2/rings/aminoacids/0000755000175000017500000000000011740261236014272 5ustar cagecagebist-0.5.2/rings/aminoacids/histidine.bist0000644000175000017500000000442211025523004017125 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 4 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 5 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 6 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 7 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 8 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 9 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 10 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 11 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,24,86 } lista { legame{1,0,1,0,0,0} legame{3,1,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,12,64 } lista { legame{0,0,1,0,0,0} legame{2,1,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {NH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,24,42 } lista { legame{1,0,0,0,0,0} legame{4,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,46,74 } lista { legame{0,0,0,0,0,0} legame{4,1,1,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,46,55 } lista { legame{2,0,0,0,0,0} legame{3,1,1,0,0,0} legame{5,2,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,68,43 } lista { legame{4,0,0,0,0,0} legame{6,1,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,55 } lista { legame{5,0,0,0,0,0} legame{7,1,4,0,0,0} legame{8,2,0,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,80 } lista { legame{6,0,-4,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,43 } lista { legame{6,0,0,0,0,0} legame{9,1,1,0,0,0} legame{10,2,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,18 } lista { legame{8,0,1,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,55 } lista { legame{8,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/methionine.bist0000644000175000017500000000305311025523004017303 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,102,50 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,102,75 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,124,38 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,124,13 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,146,50 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,80,38 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,58,50 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {S,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,36,38 } lista { legame{9,0,0,0,0,0} legame{11,1,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,14,50 } lista { legame{10,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/aspartic_acid.bist0000644000175000017500000000306311025523004017733 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,90,152 } lista { legame{1,0,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,164 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} legame{8,2,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,152 } lista { legame{1,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,164 } lista { legame{2,0,0,0,0,0} legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,189 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,152 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,127 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,200,164 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,189 } lista { legame{1,0,1,0,0,0} } } } bist-0.5.2/rings/aminoacids/threonine.bist0000644000175000017500000000260111025523004017135 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,63,52 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,63,77 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,85,40 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,85,15 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,107,52 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,41,40 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} legame{10,2,3,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,19,52 } lista { legame{8,0,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,41,15 } lista { legame{8,0,-3,0,0,0} } } } bist-0.5.2/rings/aminoacids/glycine.bist0000644000175000017500000000167711025523004016610 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,164 } lista { legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,152 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,127 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,200,164 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {H_{2}N,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,134,151 } lista { legame{3,0,0,0,0,0} } } } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} } bist-0.5.2/rings/aminoacids/glutamine.bist0000644000175000017500000000333011025523004017127 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,114,58 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,114,83 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,136,46 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,136,21 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,158,58 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,92,46 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70,58 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48,46 } lista { legame{9,0,0,0,0,0} legame{11,1,0,0,0,0} legame{12,2,1,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {H_{2}N,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,26,58 } lista { legame{10,0,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48,21 } lista { legame{10,0,1,0,0,0} } } } bist-0.5.2/rings/aminoacids/valine.bist0000644000175000017500000000257611025523004016433 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54,49 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54,74 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76,37 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76,12 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,98,49 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,32,37 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} legame{10,2,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,32,12 } lista { legame{8,0,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,10,49 } lista { legame{8,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/tyrosine.bist0000644000175000017500000000437411025523004017027 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,132,50 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,132,75 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,154,38 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,154,13 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,176,50 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,110,38 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,88,50 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} legame{14,2,1,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66,38 } lista { legame{9,0,0,0,0,0} legame{11,1,1,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44,50 } lista { legame{10,0,1,0,0,0} legame{12,1,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44,75 } lista { legame{11,0,0,0,0,0} legame{13,1,1,0,0,0} legame{15,2,0,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66,88 } lista { legame{12,0,1,0,0,0} legame{14,1,0,0,0,0} } } atomo 14 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,88,75 } lista { legame{13,0,0,0,0,0} legame{9,1,1,0,0,0} } } atomo 15 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,22,87 } lista { legame{12,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/proline.bist0000644000175000017500000000271611025523004016621 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70,36 } lista { legame{1,0,0,0,0,0} legame{2,1,1,0,0,0} legame{3,2,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,92,49 } lista { legame{0,0,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,70,11 } lista { legame{0,0,1,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,48,48 } lista { legame{0,0,0,0,0,0} legame{4,1,4,0,0,0} legame{7,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44,73 } lista { legame{3,0,-4,0,0,0} legame{5,1,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,19,77 } lista { legame{4,0,0,0,0,0} legame{6,1,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,9,54 } lista { legame{5,0,0,0,0,0} legame{7,1,0,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,28,33 } lista { legame{3,0,0,0,0,0} legame{6,1,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/asparaginic_acid.bist0000644000175000017500000000304511025523004020406 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,24,40 } lista { legame{1,0,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,46,52 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} legame{8,2,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,68,40 } lista { legame{1,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,52 } lista { legame{2,0,0,0,0,0} legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,77 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,40 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,15 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,52 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,46,77 } lista { legame{1,0,1,0,0,0} } } } bist-0.5.2/rings/aminoacids/alanine.bist0000644000175000017500000000175211025523004016557 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,95,109 } lista { legame{1,0,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,117,121 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} legame{5,2,4,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,139,109 } lista { legame{1,0,0,0,0,0} legame{3,1,1,0,0,0} legame{4,2,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,139,84 } lista { legame{2,0,1,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,161,121 } lista { legame{2,0,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,117,146 } lista { legame{1,0,-4,0,0,0} } } } bist-0.5.2/rings/aminoacids/cysteine.bist0000644000175000017500000000234611025523004016773 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,152 } lista { legame{3,1,0,0,0,0} legame{8,2,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,164 } lista { legame{2,0,0,0,0,0} legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,189 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,152 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,127 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,200,164 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {HS,0,13,0,0,0,0,0,1,0},0,0,0,0,14,0,0,0,112,165 } lista { legame{2,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/lisine.bist0000644000175000017500000000333111025523004016426 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,135,51 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,135,76 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,157,39 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,157,14 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,179,51 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,113,39 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91,51 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,69,39 } lista { legame{9,0,0,0,0,0} legame{11,1,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,47,51 } lista { legame{10,0,0,0,0,0} legame{12,1,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {H_{2}N,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,25,39 } lista { legame{11,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/leucine.bist0000644000175000017500000000305011025523004016565 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,78,51 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,78,76 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,100,39 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,100,14 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,122,51 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,56,39 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,34,51 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} legame{11,2,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,12,39 } lista { legame{9,0,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,34,76 } lista { legame{9,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/phenilalanine.bist0000644000175000017500000000412011025523004017747 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,98,52 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,98,77 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,120,40 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,120,15 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,142,52 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76,40 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54,52 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} legame{14,2,1,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,32,40 } lista { legame{9,0,0,0,0,0} legame{11,1,1,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,10,52 } lista { legame{10,0,1,0,0,0} legame{12,1,0,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,10,77 } lista { legame{11,0,0,0,0,0} legame{13,1,1,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,32,90 } lista { legame{12,0,1,0,0,0} legame{14,1,0,0,0,0} } } atomo 14 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54,77 } lista { legame{13,0,0,0,0,0} legame{9,1,1,0,0,0} } } } bist-0.5.2/rings/aminoacids/tryptophane.bist0000644000175000017500000000523311025523004017523 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 3 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,100,51 } lista { legame{1,0,0,0,0,0} legame{3,2,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,122,64 } lista { legame{0,0,0,0,0,0} legame{12,1,4,0,0,0} legame{13,2,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,78,63 } lista { legame{0,0,0,0,0,0} legame{4,1,1,0,0,0} legame{6,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,74,88 } lista { legame{3,0,1,0,0,0} legame{5,1,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {NH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,49,92 } lista { legame{4,0,0,0,0,0} legame{7,1,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,55,53 } lista { legame{3,0,0,0,0,0} legame{7,1,1,0,0,0} legame{9,2,0,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,35,68 } lista { legame{6,0,1,0,0,0} legame{5,1,0,0,0,0} legame{8,2,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,13,55 } lista { legame{7,0,0,0,0,0} legame{11,1,1,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,55,28 } lista { legame{6,0,0,0,0,0} legame{10,1,1,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,33,15 } lista { legame{9,0,1,0,0,0} legame{11,1,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,11,28 } lista { legame{10,0,0,0,0,0} legame{8,1,1,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,122,89 } lista { legame{1,0,-4,0,0,0} } } atomo 13 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,144,52 } lista { legame{1,0,0,0,0,0} legame{14,1,0,0,0,0} legame{15,2,1,0,0,0} } } atomo 14 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,166,64 } lista { legame{13,0,0,0,0,0} } } atomo 15 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,144,27 } lista { legame{13,0,1,0,0,0} } } } bist-0.5.2/rings/aminoacids/arginine.bist0000644000175000017500000000377111025523004016747 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {H_{2}N,0,13,0,0,0,0,0,1,0},0,0,0,0,14,0,0,0,15,51 } lista { legame{1,0,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,37,39 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} legame{11,2,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {NH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,59,51 } lista { legame{1,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,81,39 } lista { legame{2,0,0,0,0,0} legame{4,1,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,103,51 } lista { legame{3,0,0,0,0,0} legame{5,1,0,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,125,39 } lista { legame{4,0,0,0,0,0} legame{6,1,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,147,51 } lista { legame{5,0,0,0,0,0} legame{7,1,4,0,0,0} legame{8,2,0,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,147,76 } lista { legame{6,0,-4,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,169,39 } lista { legame{6,0,0,0,0,0} legame{9,1,1,0,0,0} legame{10,2,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,169,14 } lista { legame{8,0,1,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,191,51 } lista { legame{8,0,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {NH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,37,14 } lista { legame{1,0,1,0,0,0} } } } bist-0.5.2/rings/aminoacids/serine.bist0000644000175000017500000000233311025523004016431 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,98,52 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,98,77 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,120,40 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,120,15 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,142,52 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76,40 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,54,52 } lista { legame{8,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/isoleucine.bist0000644000175000017500000000305211025523004017302 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,80,53 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,80,78 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,102,41 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,102,16 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,124,53 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,58,41 } lista { legame{3,0,0,0,0,0} legame{9,1,4,0,0,0} legame{10,2,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,58,16 } lista { legame{8,0,-4,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,36,53 } lista { legame{8,0,0,0,0,0} legame{11,1,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,14,41 } lista { legame{10,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/glutamic_acid.bist0000644000175000017500000000334011025523004017730 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,164 } lista { legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} legame{8,3,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,189 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,152 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,127 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,200,164 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,151 } lista { legame{3,0,0,0,0,0} legame{9,1,0,0,0,0} } } atomo 9 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,164 } lista { legame{8,0,0,0,0,0} legame{10,1,0,0,0,0} } } atomo 10 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,151 } lista { legame{9,0,0,0,0,0} legame{11,1,1,0,0,0} legame{12,2,0,0,0,0} } } atomo 11 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,90,126 } lista { legame{10,0,1,0,0,0} } } atomo 12 : tipo_atomo 12{ elemento { etichetta {HO,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,68,164 } lista { legame{10,0,0,0,0,0} } } } bist-0.5.2/rings/aminoacids/asparagine.bist0000644000175000017500000000306711025523004017263 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 1 : tipo_gruppo 0{ ROT {0,0,0} } gruppo 2 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {H_{2}N,0,13,0,0,0,0,0,2,0},0,0,0,0,14,0,0,0,90,152 } lista { legame{1,0,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,164 } lista { legame{0,0,0,0,0,0} legame{2,1,0,0,0,0} legame{8,2,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,152 } lista { legame{1,0,0,0,0,0} legame{3,1,0,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,164 } lista { legame{2,0,0,0,0,0} legame{4,1,4,0,0,0} legame{5,2,0,0,0,0} } } atomo 4 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,189 } lista { legame{3,0,-4,0,0,0} } } atomo 5 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,152 } lista { legame{3,0,0,0,0,0} legame{6,1,1,0,0,0} legame{7,2,0,0,0,0} } } atomo 6 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178,127 } lista { legame{5,0,1,0,0,0} } } atomo 7 : tipo_atomo 12{ elemento { etichetta {OH,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,200,164 } lista { legame{5,0,0,0,0,0} } } atomo 8 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,189 } lista { legame{1,0,1,0,0,0} } } } bist-0.5.2/rings/IR_prediction/0000755000175000017500000000000011740261236014715 5ustar cagecagebist-0.5.2/rings/IR_prediction/0ketone.bist0000644000175000017500000000144411134345701017145 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} atomo 0 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,112,130 } lista { legame{1,0,0,0,0,0} } } atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,117 } lista { legame{0,0,0,0,0,0} legame{2,1,1,0,0,0} legame{3,2,0,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,92 } lista { legame{1,0,1,0,0,0} } } atomo 3 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156,130 } lista { legame{1,0,0,0,0,0} } } } etichetta {1700\ cm^{-1},0,13,111,145,0,0,0,0,0} etichetta {strong,0,13,112,172,0,0,0,0,0} etichetta {skip\ carbonyl,0,13,115,202,0,0,0,0,0} bist-0.5.2/rings/IR_prediction/1carbonyl.bist0000644000175000017500000000064411134345701017473 0ustar cagecagegruppo 0 : tipo_gruppo 0{ ROT {0,0,0} atomo 1 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,117 } lista { legame{2,1,1,0,0,0} } } atomo 2 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,134,92 } lista { legame{1,0,1,0,0,0} } } } etichetta {1700\ cm^{-1},0,13,110,147,0,0,0,0,0} etichetta {strong,0,13,119,178,0,0,0,0,0} bist-0.5.2/rings/protective/0000755000175000017500000000000011740261236014347 5ustar cagecagebist-0.5.2/rings/protective/edans.bist0000644000175000017500000000571011025523004016315 0ustar cagecagegruppo 129704673 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44.6511,49 } lista { legame{24784,0,0,0,0,0} legame{24788,25043,1,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66.3012,61.5 } lista { legame{24783,0,0,0,0,0} legame{24785,25039,1,0,0,0} legame{24789,25044,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66.3012,86.5 } lista { legame{24784,25039,1,0,0,0} legame{24786,25040,0,0,0,0} legame{24792,25048,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44.6511,99 } lista { legame{24785,25040,0,0,0,0} legame{24787,25041,1,0,0,0} legame{6319968,6384994,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,23,86.5 } lista { legame{24786,25041,1,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,23,61.5 } lista { legame{24787,25042,0,0,0,0} legame{24783,25043,1,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,87.9515,49 } lista { legame{24784,25044,0,0,0,0} legame{24790,25045,1,0,0,0} legame{6319969,6384995,0,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,109.602,61.5 } lista { legame{24789,25045,1,0,0,0} legame{24791,25046,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,109.602,86.5 } lista { legame{24790,25046,0,0,0,0} legame{24792,25047,1,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,87.9515,99 } lista { legame{24791,25047,1,0,0,0} legame{24785,25048,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {SO_{3}H,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,44.6511,124 } lista { legame{24786,6384994,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {HN,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,87.9515,24 } lista { legame{24789,6384995,0,0,0,0} legame{6319970,6384996,0,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,109.602,11.5 } lista { legame{6319969,6384996,0,0,0,0} legame{6319971,6384997,0,0,0,0} } } atomo 6319971 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,131.253,24 } lista { legame{6319970,6384997,0,0,0,0} legame{6319972,6384998,0,0,0,0} } } atomo 6319972 : tipo_atomo 12{ elemento { etichetta {NH_{2},0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,156.253,24 } lista { legame{6319971,6384998,0,0,0,0} } } } bist-0.5.2/rings/protective/dabcyl.bist0000644000175000017500000000753611025523004016471 0ustar cagecagegruppo 124476917 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,104.5,52 } lista { legame{24784,0,0,0,0,0} legame{24788,25043,1,0,0,0} legame{24789,25044,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,92,73.65 } lista { legame{24783,0,0,0,0,0} legame{24785,25039,1,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67,73.65 } lista { legame{24784,25039,1,0,0,0} legame{24786,25040,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,54.5,52 } lista { legame{24785,25040,0,0,0,0} legame{24787,25041,1,0,0,0} legame{6319972,6384998,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67,30.349 } lista { legame{24786,25041,1,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,92,30.349 } lista { legame{24787,25042,0,0,0,0} legame{24783,25043,1,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,129.5,52 } lista { legame{24783,25044,0,0,0,0} legame{24790,25045,1,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,154.5,52 } lista { legame{24789,25045,1,0,0,0} legame{24791,25046,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,179.5,52 } lista { legame{24790,25046,0,0,0,0} legame{24792,6384996,0,0,0,0} legame{6319971,6384997,1,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,192,30.35 } lista { legame{6319968,25047,1,0,0,0} legame{24791,6384996,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,217,30.35 } lista { legame{24792,25047,1,0,0,0} legame{6319969,25048,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,229.5,52 } lista { legame{6319968,25048,0,0,0,0} legame{6319970,6384994,1,0,0,0} legame{6319975,6384995,0,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,217,73.651 } lista { legame{6319969,6384994,1,0,0,0} legame{6319971,6384995,0,0,0,0} } } atomo 6319971 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,192,73.651 } lista { legame{6319970,6384995,0,0,0,0} legame{24791,6384997,1,0,0,0} } } atomo 6319972 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,29.5,52 } lista { legame{24786,6384998,0,0,0,0} legame{6319973,6384999,0,0,0,0} legame{6319974,6385000,0,0,0,0} } } atomo 6319973 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,17,30.349 } lista { legame{6319972,6384999,0,0,0,0} } } atomo 6319974 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,17,73.651 } lista { legame{6319972,6385000,0,0,0,0} } } atomo 6319975 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,251,39 } lista { legame{6319969,0,0,0,0,0} legame{6319976,1,0,0,0,0} legame{6319977,2,1,0,0,0} } } atomo 6319976 : tipo_atomo 12{ elemento { etichetta {Cl,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,273,52 } lista { legame{6319975,0,0,0,0,0} } } atomo 6319977 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,251,14 } lista { legame{6319975,0,1,0,0,0} } } } bist-0.5.2/rings/protective/dansyl.bist0000644000175000017500000000650311025523004016516 0ustar cagecagegruppo 90129982 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,105,37.651 } lista { legame{24784,0,0,0,0,0} legame{24788,25043,1,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,92.5,59.301 } lista { legame{24783,0,0,0,0,0} legame{24785,25039,1,0,0,0} legame{24789,25044,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67.5,59.301 } lista { legame{24784,25039,1,0,0,0} legame{24786,25040,0,0,0,0} legame{24792,25048,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,55,37.651 } lista { legame{24785,25040,0,0,0,0} legame{24787,25041,1,0,0,0} legame{6319968,6384994,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67.5,16 } lista { legame{24786,25041,1,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,92.5,16 } lista { legame{24787,25042,0,0,0,0} legame{24783,25043,1,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,105,80.951 } lista { legame{24784,25044,0,0,0,0} legame{24790,25045,1,0,0,0} legame{6319971,6384997,0,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,92.5,102.602 } lista { legame{24789,25045,1,0,0,0} legame{24791,25046,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,67.5,102.602 } lista { legame{24790,25046,0,0,0,0} legame{24792,25047,1,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,55,80.951 } lista { legame{24791,25047,1,0,0,0} legame{24785,25048,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,30,37.651 } lista { legame{24786,6384994,0,0,0,0} legame{6319969,6384995,0,0,0,0} legame{6319970,6384996,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,17.5,16 } lista { legame{6319968,6384995,0,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,17.5,59.302 } lista { legame{6319968,6384996,0,0,0,0} } } atomo 6319971 : tipo_atomo 12{ elemento { etichetta {S,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,130,80.951 } lista { legame{24789,6384997,0,0,0,0} legame{6319972,6384998,1,0,0,0} legame{6319973,6384999,1,0,0,0} legame{6319974,6385000,0,0,0,0} } } atomo 6319972 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,130,105.951 } lista { legame{6319971,6384998,1,0,0,0} } } atomo 6319973 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,130,55.951 } lista { legame{6319971,6384999,1,0,0,0} } } atomo 6319974 : tipo_atomo 12{ elemento { etichetta {Cl,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,155,80.951 } lista { legame{6319971,6385000,0,0,0,0} } } } bist-0.5.2/rings/protective/boc.bist0000644000175000017500000000266311025523004015772 0ustar cagecagegruppo 93429243 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,31,14 } lista { legame{24784,0,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,31,29 } lista { legame{24783,0,0,0,0,0} legame{24785,25039,0,0,0,0} legame{24786,25040,0,0,0,0} legame{24787,25041,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,16,29 } lista { legame{24784,25039,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,31,44 } lista { legame{24784,25040,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,46,29 } lista { legame{24784,25041,0,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,61,29 } lista { legame{24787,25042,0,0,0,0} legame{24789,25043,1,0,0,0} legame{24790,25044,0,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,61,14 } lista { legame{24788,25043,1,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {Cl,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,76,29 } lista { legame{24788,25044,0,0,0,0} } } } bist-0.5.2/rings/protective/fmoc.bist0000644000175000017500000000722111025523004016146 0ustar cagecagegruppo 98253361 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,18.82,43.516 } lista { legame{24784,0,0,0,0,0} legame{24785,25039,1,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,37.361,60.286 } lista { legame{24783,0,0,0,0,0} legame{24786,25040,1,0,0,0} legame{24787,25041,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,24.072,19.074 } lista { legame{24783,25039,1,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,61.154,52.614 } lista { legame{24784,25040,1,0,0,0} legame{24789,25043,0,0,0,0} legame{24790,25044,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,37.305,85.286 } lista { legame{24784,25041,0,0,0,0} legame{24791,25045,0,0,0,0} legame{24792,25046,1,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,47.866,11.4018 } lista { legame{24785,25042,0,0,0,0} legame{24789,25047,1,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66.407,28.172 } lista { legame{24786,25043,0,0,0,0} legame{24788,25047,1,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,75.804,72.872 } lista { legame{24786,25044,0,0,0,0} legame{24792,25048,0,0,0,0} legame{6319968,6384994,0,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,18.689,101.972 } lista { legame{24787,25045,0,0,0,0} legame{6319969,6384995,1,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,61.064,93.064 } lista { legame{24787,25046,1,0,0,0} legame{24790,25048,0,0,0,0} legame{6319970,6384996,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,100.804,72.928 } lista { legame{24790,6384994,0,0,0,0} legame{6319972,6384999,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,23.832,126.438 } lista { legame{24791,6384995,1,0,0,0} legame{6319971,6384997,0,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66.207,117.53 } lista { legame{24792,6384996,0,0,0,0} legame{6319971,6384998,1,0,0,0} } } atomo 6319971 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,47.591,134.216 } lista { legame{6319969,6384997,0,0,0,0} legame{6319970,6384998,1,0,0,0} } } atomo 6319972 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,122.455,85.428 } lista { legame{6319968,6384999,0,0,0,0} legame{6319973,6385000,0,0,0,0} } } atomo 6319973 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,144.105,72.928 } lista { legame{6319972,6385000,0,0,0,0} legame{6319974,6385001,0,0,0,0} legame{6319975,6385002,1,0,0,0} } } atomo 6319974 : tipo_atomo 12{ elemento { etichetta {Cl,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,165.756,85.428 } lista { legame{6319973,6385001,0,0,0,0} } } atomo 6319975 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,144.105,47.928 } lista { legame{6319973,6385002,1,0,0,0} } } } bist-0.5.2/rings/protective/dabsyl.bist0000644000175000017500000001027211025523004016500 0ustar cagecagegruppo 106625356 : tipo_gruppo 0{ ROT {0,0,0} atomo 24783 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,191.499,23.002 } lista { legame{24784,0,1,0,0,0} legame{24788,25042,0,0,0,0} } } atomo 24784 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,216.499,23.002 } lista { legame{24783,0,1,0,0,0} legame{24785,25039,0,0,0,0} } } atomo 24785 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,228.999,44.652 } lista { legame{24784,25039,0,0,0,0} legame{24786,25040,1,0,0,0} legame{6319975,6385001,0,0,0,0} } } atomo 24786 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,216.499,66.303 } lista { legame{24785,25040,1,0,0,0} legame{24787,25041,0,0,0,0} } } atomo 24787 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,191.499,66.303 } lista { legame{24786,25041,0,0,0,0} legame{24788,6384997,1,0,0,0} } } atomo 24788 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,178.999,44.652 } lista { legame{24783,25042,0,0,0,0} legame{6319971,6384996,0,0,0,0} legame{24787,6384997,1,0,0,0} } } atomo 24789 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,103.999,44.652 } lista { legame{24790,25043,0,0,0,0} legame{6319969,25048,1,0,0,0} legame{6319970,6384994,0,0,0,0} } } atomo 24790 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91.499,66.302 } lista { legame{24789,25043,0,0,0,0} legame{24791,25044,1,0,0,0} } } atomo 24791 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66.4991,66.302 } lista { legame{24790,25044,1,0,0,0} legame{24792,25045,0,0,0,0} } } atomo 24792 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,53.9991,44.652 } lista { legame{24791,25045,0,0,0,0} legame{6319968,25046,1,0,0,0} legame{6319972,6384998,0,0,0,0} } } atomo 6319968 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,66.4991,23.001 } lista { legame{24792,25046,1,0,0,0} legame{6319969,25047,0,0,0,0} } } atomo 6319969 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,91.499,23.001 } lista { legame{6319968,25047,0,0,0,0} legame{24789,25048,1,0,0,0} } } atomo 6319970 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,128.999,44.652 } lista { legame{24789,6384994,0,0,0,0} legame{6319971,6384995,1,0,0,0} } } atomo 6319971 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,153.999,44.652 } lista { legame{6319970,6384995,1,0,0,0} legame{24788,6384996,0,0,0,0} } } atomo 6319972 : tipo_atomo 12{ elemento { etichetta {N,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,28.9991,44.652 } lista { legame{24792,6384998,0,0,0,0} legame{6319973,6384999,0,0,0,0} legame{6319974,6385000,0,0,0,0} } } atomo 6319973 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,16.4991,23.001 } lista { legame{6319972,6384999,0,0,0,0} } } atomo 6319974 : tipo_atomo 12{ elemento { etichetta {#,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,16.4991,66.303 } lista { legame{6319972,6385000,0,0,0,0} } } atomo 6319975 : tipo_atomo 12{ elemento { etichetta {S,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,253.999,44.652 } lista { legame{24785,6385001,0,0,0,0} legame{6319976,6385002,1,0,0,0} legame{6319977,6385003,1,0,0,0} legame{6320223,6385249,0,0,0,0} } } atomo 6319976 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,253.999,19.652 } lista { legame{6319975,6385002,1,0,0,0} } } atomo 6319977 : tipo_atomo 12{ elemento { etichetta {O,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,253.999,69.652 } lista { legame{6319975,6385003,1,0,0,0} } } atomo 6320223 : tipo_atomo 12{ elemento { etichetta {Cl,0,13,0,0,0,0,0,0,0},0,0,0,0,14,0,0,0,278.999,44.652 } lista { legame{6319975,6385249,0,0,0,0} } } } bist-0.5.2/po/0000755000175000017500000000000011740261237011460 5ustar cagecagebist-0.5.2/po/POTFILES.in0000644000175000017500000000151511740257050013235 0ustar cagecage# List of source files which contain translatable strings. src/arc_prop.cpp src/arrow_prop.cpp src/atomo.cpp src/atom_prop.cpp src/bezier_prop.cpp src/bist_plugin.cpp src/bond_prop.cpp src/cairo_t_singleton.cpp src/chain_prop.cpp src/command_line.cpp src/editor.cpp src/etichetta.cpp src/FluSimpleString.cpp src/Flu_Tree_Browser.cpp src/gruppo.cpp src/immagine_cml.cpp src/immagine.cpp src/immagine_mol.cpp src/interfacce.cpp src/legame.cpp src/lib_dialog.cpp src/main.cpp src/mol_canvas.cpp src/multifont_label.cpp src/multiline_label.cpp src/multiline_label_prop.cpp src/paragraph_text.cpp src/paragraph_text_prop.cpp src/parse_residual.cpp src/plot_window.cpp src/pref_dialog.cpp src/prefs.cpp src/procedura.cpp src/set_conf.cpp src/string_prop.cpp src/substructure_search.cpp src/util.cpp src/box_prop.cppbist-0.5.2/po/boldquot.sed0000644000175000017500000000033111166204327014002 0ustar cagecages/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g bist-0.5.2/po/fr.po0000644000175000017500000004173111437771637012452 0ustar cagecage# Italian translations for bist package. # Copyright (C) 2004 Valerio Benfante # This file is distributed under the same license as the bist package. # cage , 2004. # msgid "" msgstr "" "Project-Id-Version: bist pre-alfa.0.1\n" "Report-Msgid-Bugs-To: cage@katamail.com\n" "POT-Creation-Date: 2010-05-02 12:32+0200\n" "PO-Revision-Date: 2009-05-07 20:12+0200\n" "Last-Translator: Nicolas ELIE \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/arc_prop.cpp:78 src/arrow_prop.cpp:86 src/atom_prop.cpp:386 #: src/atom_prop.cpp:403 src/bezier_prop.cpp:89 src/bond_prop.cpp:117 #: src/editor.cpp:673 src/multiline_label_prop.cpp:108 #: src/paragraph_text_prop.cpp:98 src/string_prop.cpp:66 src/box_prop.cpp:88 msgid "pick a color..." msgstr "choisir une couleur..." #: src/arc_prop.cpp:126 msgid "Arc properties" msgstr "Propriétés de l'arc" #: src/arc_prop.cpp:132 src/arrow_prop.cpp:178 src/bezier_prop.cpp:240 #: src/box_prop.cpp:153 msgid "Thickness:" msgstr "Épaisseur :" #: src/arc_prop.cpp:143 msgid "Width:" msgstr "Largeur" #: src/arc_prop.cpp:155 src/arrow_prop.cpp:246 src/bezier_prop.cpp:305 #: src/bond_prop.cpp:236 src/box_prop.cpp:165 msgid "Color" msgstr "Couleur" #: src/arc_prop.cpp:160 src/arrow_prop.cpp:250 src/bezier_prop.cpp:309 #: src/bond_prop.cpp:248 src/chain_prop.cpp:117 src/pref_dialog.cpp:256 #: src/string_prop.cpp:177 msgid "OK" msgstr "OK" #: src/arc_prop.cpp:165 src/bond_prop.cpp:243 src/chain_prop.cpp:120 #: src/pref_dialog.cpp:255 msgid "Cancel" msgstr "Annuler" #: src/arrow_prop.cpp:161 msgid "Arrow properties" msgstr "Propriétés de la croix" #: src/arrow_prop.cpp:167 src/bezier_prop.cpp:229 msgid "Dash step:" msgstr "Espace entre les pointillés :" #: src/arrow_prop.cpp:189 src/bezier_prop.cpp:251 src/pref_dialog.cpp:224 msgid "Arrow width:" msgstr "Largeur de la croix :" #: src/arrow_prop.cpp:199 src/bezier_prop.cpp:261 src/pref_dialog.cpp:225 msgid "Arrow height:" msgstr "Hauteur de la croix :" #: src/arrow_prop.cpp:208 src/bezier_prop.cpp:270 src/bond_prop.cpp:225 #: src/pref_dialog.cpp:226 msgid "Arrow gap:" msgstr "Écart de flèches :" #: src/arrow_prop.cpp:230 src/bezier_prop.cpp:291 msgid "none" msgstr "rien" #: src/arrow_prop.cpp:231 src/bezier_prop.cpp:292 msgid "homolitic" msgstr "homolitique" #: src/arrow_prop.cpp:232 src/bezier_prop.cpp:293 msgid "heterolitic" msgstr "hétérolitique" #: src/arrow_prop.cpp:233 src/bezier_prop.cpp:294 msgid "double" msgstr "double" #: src/arrow_prop.cpp:234 msgid "blocked" msgstr "bloqué" #: src/arrow_prop.cpp:235 msgid "equilibrium" msgstr "équilibre" #: src/arrow_prop.cpp:239 src/bezier_prop.cpp:298 src/box_prop.cpp:177 msgid "Type" msgstr "Type" #: src/atom_prop.cpp:483 msgid "error where < _vec_str.size() in class etichetta." msgstr "erreur où < _vec_str.size() dans la classe etichetta" #: src/atom_prop.cpp:616 msgid "Atom Properties" msgstr "Propriétés de l'atome" #: src/atom_prop.cpp:627 msgid "String" msgstr "Chaîne de caractères" #: src/atom_prop.cpp:638 msgid "Face:" msgstr "Face:" #: src/atom_prop.cpp:644 src/multiline_label_prop.cpp:206 #: src/paragraph_text_prop.cpp:216 src/string_prop.cpp:149 msgid "Dimension:" msgstr "Dimension:" #: src/atom_prop.cpp:678 msgid "Parse string" msgstr "Interpréter la chaîne de caractères" #: src/atom_prop.cpp:685 msgid "Vertical align" msgstr "Alignement vertical" #: src/atom_prop.cpp:694 msgid "Electrons and other" msgstr "Électrons et autres" #: src/atom_prop.cpp:710 msgid "Charge" msgstr "Charge" #: src/atom_prop.cpp:758 msgid "Charge position" msgstr "Position de la charge" #: src/atom_prop.cpp:809 msgid "Lone pair:" msgstr "Paire unique :" #: src/atom_prop.cpp:818 msgid "Lone unpair:" msgstr "Non paire unique :" #: src/atom_prop.cpp:828 src/string_prop.cpp:180 src/box_prop.cpp:184 msgid "Close" msgstr "Fermer" #: src/atom_prop.cpp:835 src/multiline_label_prop.cpp:290 #: src/paragraph_text_prop.cpp:302 msgid "Apply" msgstr "Appliquer" #: src/bezier_prop.cpp:223 msgid "Bezier properties" msgstr "Propriétés de la courbe" #: src/bond_prop.cpp:154 msgid "Bond type" msgstr "Type de liaison" #: src/bond_prop.cpp:159 msgid "Single bond" msgstr "Liaison simple" #: src/bond_prop.cpp:163 msgid "Double bond" msgstr "Liaison double" #: src/bond_prop.cpp:167 msgid "Triple bond" msgstr "Liaison triple" #: src/bond_prop.cpp:171 msgid "Double dashed bond" msgstr "Liaison double en pointillé" #: src/bond_prop.cpp:175 msgid "Stereospecific \"up\" bond" msgstr "Liaison stéréospecifique \"vers le haut\"" #: src/bond_prop.cpp:179 msgid "Stereospecific \"up\" reverse bond" msgstr "Liaison stéréospecifique \"vers le haut\" inversée" #: src/bond_prop.cpp:183 msgid "Stereospecific \"down\" bond" msgstr "Liaison stéréospecifique \"vers le bas\"" #: src/bond_prop.cpp:187 msgid "Stereospecific \"down\" reverse bond" msgstr "Liaison stéréospecifique \"vers le haut\" inversée" #: src/bond_prop.cpp:191 msgid "Dashed bond" msgstr "Liaison en pointillé" #: src/bond_prop.cpp:195 msgid "Bold bond" msgstr "Liaison épaisse" #: src/bond_prop.cpp:199 msgid "Unknown stereochemistry bond" msgstr "Liaison de stéréochimie inconnue" #: src/bond_prop.cpp:216 msgid "Scale" msgstr "Échelle" #: src/bond_prop.cpp:308 msgid "Bond properties" msgstr "Propriétés de la liaison" #: src/chain_prop.cpp:103 msgid "Draw chain..." msgstr "Dessiner une chaîne..." #: src/chain_prop.cpp:111 msgid "Number of carbon:" msgstr "Nombre de carbones :" #: src/chain_prop.cpp:114 msgid "Angle:" msgstr "Angle:" #: src/command_line.cpp:98 msgid "Usage" msgstr "Utilisation" #: src/command_line.cpp:99 msgid "Print this message and exit" msgstr "Imprime ce message et quitte" #: src/command_line.cpp:100 msgid "Print version and package name and exit" msgstr "Imprime la version et le nom de paquetage et quitte" #: src/command_line.cpp:101 msgid "Format of the converted file" msgstr "Format du fichier converti" #: src/command_line.cpp:102 msgid "Input file(s) to convert" msgstr "Fichier(s) à convertir" #: src/editor.cpp:198 msgid "Image modified, exit without saving?" msgstr "Image modifiée, quitter sans sauvegarder?" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "Yes" msgstr "Oui" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "No" msgstr "Non" #: src/editor.cpp:243 msgid "No such plugin " msgstr "" #: src/editor.cpp:321 msgid "Export..." msgstr "Exporter..." #: src/editor.cpp:417 msgid "Please insert rotation entity in degrees." msgstr "Veuillez insérer la valeur de la rotation en degrés." #: src/editor.cpp:520 msgid "I can not create a new window" msgstr "Impossible de créer une nouvelle fenêtre" #: src/editor.cpp:525 msgid "Really quit?" msgstr "Voulez vous vraiment quitter ?" #: src/editor.cpp:562 msgid "Pick a file..." msgstr "Choisir un fichier..." #: src/editor.cpp:613 msgid "Save As..." msgstr "Enregistrer sous..." #: src/editor.cpp:834 src/main.cpp:201 msgid "&File" msgstr "&Fichier" #: src/editor.cpp:868 msgid "Create a new window" msgstr "Créer une nouvelle fenêtre" #: src/editor.cpp:873 msgid "Open a file" msgstr "Ouvrir" #: src/editor.cpp:878 msgid "Save" msgstr "Enregistrer" #: src/editor.cpp:883 src/plot_window.cpp:144 msgid "Save as" msgstr "Enregistrer sous" #: src/editor.cpp:888 msgid "Export as PostScript" msgstr "Exporter en PostScript" #: src/editor.cpp:894 msgid "Export as PNG" msgstr "Exporter en PNG" #: src/editor.cpp:899 msgid "Undo!" msgstr "Annuler" #: src/editor.cpp:924 msgid "Rotate selected element" msgstr "Faire tourner l'élément sélectionné" #: src/editor.cpp:931 msgid "Scale selected element" msgstr "Redimensionner l'élément sélectionné" #: src/editor.cpp:939 msgid "Select Element" msgstr "Sélectionner l'élément" #: src/editor.cpp:947 msgid "Select a molecule" msgstr "Sélectionner une molécule" #: src/editor.cpp:961 msgid "Kill" msgstr "Éliminer" #: src/editor.cpp:967 msgid "Draw single bond" msgstr "Dessiner une liaison simple" #: src/editor.cpp:973 msgid "Draw double bond" msgstr "Dessiner une liaison double" #: src/editor.cpp:980 msgid "Draw triple bond" msgstr "Dessiner une liaison triple" #: src/editor.cpp:986 msgid "Draw arrow" msgstr "Dessiner une croix" #: src/editor.cpp:992 msgid "Draw bezier curve" msgstr "Dessiner une courbe de Bézier" #: src/editor.cpp:998 msgid "Draw circle/ellipse" msgstr "Dessiner un cercle/ellipse" #: src/editor.cpp:1005 #, fuzzy msgid "Draw box" msgstr "Dessiner une croix" #: src/editor.cpp:1012 msgid "Draw string" msgstr "Dessiner un texte" #: src/editor.cpp:1019 msgid "Draw p orbital" msgstr "Dessiner une orbitale p" #: src/editor.cpp:1025 msgid "Insert template" msgstr "Insérer un modèle" #: src/editor.cpp:1037 msgid "Draw chain" msgstr "Dessiner une chaîne" #: src/editor.cpp:1043 msgid "Fixed angle rotation" msgstr "Rotation à angle fixé" #: src/editor.cpp:1049 src/main.cpp:212 msgid "Paste" msgstr "Coller" #: src/editor.cpp:1055 msgid "Vertical flip" msgstr "Retournement vertical" #: src/editor.cpp:1061 msgid "Orizontal flip" msgstr "Retournement horizontal" #: src/editor.cpp:1068 msgid "3D rotation" msgstr "Rotation 3D" #: src/editor.cpp:1074 msgid "Select color" msgstr "Sélectionner une couleur" #: src/editor.cpp:1079 msgid "Delete selected" msgstr "Supprimer la sélection" #: src/editor.cpp:1085 msgid "Zoom" msgstr "Zoomer" #: src/editor.cpp:1091 src/editor.cpp:1097 msgid "Unzoom" msgstr "Dézoomer" #: src/immagine_cml.cpp:121 msgid "Couldn't allocate memory for parser" msgstr "Impossible d'allouer de la mémoire pour le parseur xml" #: src/immagine_cml.cpp:136 msgid "Read error" msgstr "Erreur de lecture" #: src/immagine.cpp:2873 msgid "***Position: " msgstr "***Position :" #: src/immagine.cpp:2873 msgid " expected " msgstr " espéré" #: src/immagine.cpp:2874 msgid " found " msgstr " trouvé" #: src/immagine.cpp:2883 msgid "Unexpected end of file." msgstr "Fin de fichier inattendue." #: src/immagine.cpp:6253 msgid "Exporting..." msgstr "Exportation..." #: src/lib_dialog.cpp:131 msgid "Insert object" msgstr "Insérer un objet" #: src/lib_dialog.cpp:156 msgid "Library" msgstr "Bibliothèque" #: src/lib_dialog.cpp:178 #, c-format msgid "Can not open library directory %s" msgstr "Impossible d'ouvrir le dossier de bibliothèque %s" #: src/lib_dialog.cpp:234 msgid "home" msgstr "" #: src/lib_dialog.cpp:235 msgid "shared" msgstr "partagé" #: src/main.cpp:137 msgid "Option requires an argument -- f" msgstr "L'option --f nécessite un argument" #: src/main.cpp:149 msgid "Option requires an argument -- c" msgstr "L'option --f nécessite un argument" #: src/main.cpp:156 msgid "format" msgstr "Format" #: src/main.cpp:158 msgid "not supported, switching to ps" msgstr "non supporté, changement pour ps" #: src/main.cpp:195 msgid "Error in path:" msgstr "Erreur dans le chemin :" #: src/main.cpp:202 msgid "&New" msgstr "&Nouveau" #: src/main.cpp:203 msgid "&Open" msgstr "&Ouvrir" #: src/main.cpp:204 msgid "&Save" msgstr "&Enregistrer" #: src/main.cpp:205 msgid "Save &as..." msgstr "Enregistrer &sous..." #: src/main.cpp:206 msgid "&Export" msgstr "&Exporter" #: src/main.cpp:209 msgid "&Quit" msgstr "&Quitter" #: src/main.cpp:211 msgid "Edit" msgstr "Edition" #: src/main.cpp:213 msgid "Undo" msgstr "Annuler" #: src/main.cpp:214 msgid "Erase" msgstr "Effacer" #: src/main.cpp:216 msgid "&Configuration" msgstr "&Configuration" #: src/main.cpp:217 msgid "Set values" msgstr "Fixer les valeurs" #: src/main.cpp:218 msgid "Reset to default" msgstr "Revenir aux valeurs par défaut" #: src/main.cpp:220 msgid "&Plug-in" msgstr "&Plug-in" #: src/main.cpp:222 msgid "&Help" msgstr "Aid&e" #: src/main.cpp:223 msgid "About..." msgstr "À propos" #: src/main.cpp:224 msgid "No Warranty" msgstr "Sans garantie" #: src/multiline_label_prop.cpp:164 src/multiline_label_prop.cpp:180 #: src/paragraph_text_prop.cpp:171 src/paragraph_text_prop.cpp:180 #: src/string_prop.cpp:135 msgid "Text properties" msgstr "Propriétés du texte" #: src/multiline_label_prop.cpp:198 src/paragraph_text_prop.cpp:207 #: src/string_prop.cpp:144 msgid "Font:" msgstr "Police :" #: src/multiline_label_prop.cpp:295 src/paragraph_text_prop.cpp:307 msgid "Done" msgstr "Fait" #: src/plot_window.cpp:99 msgid "Save Spectra As..." msgstr "Enregistrer le spectre sous..." #: src/plot_window.cpp:525 msgid "Spectra prediction" msgstr "Prédiction de spectres" #: src/pref_dialog.cpp:211 msgid "Set Preferences..." msgstr "Préférences..." #: src/pref_dialog.cpp:213 msgid "UI" msgstr "UI" #: src/pref_dialog.cpp:214 msgid "Grid space:" msgstr "Espace de la grille :" #: src/pref_dialog.cpp:215 msgid "Click zone:" msgstr "Zone cliquable :" #: src/pref_dialog.cpp:216 msgid "Page width:" msgstr "Largeur de la page :" #: src/pref_dialog.cpp:217 msgid "Page height:" msgstr "Hauteur de la page :" #: src/pref_dialog.cpp:218 msgid "Show splashpage" msgstr "Afficher la fenêtre d'accueil" #: src/pref_dialog.cpp:219 msgid "Show grid" msgstr "Afficher la grille" #: src/pref_dialog.cpp:220 msgid "\"Magnetic\" grid" msgstr "Grille \"magnétique\"" #: src/pref_dialog.cpp:221 msgid "Bond" msgstr "Liaison" #: src/pref_dialog.cpp:222 msgid "Bond length:" msgstr "Longueur de laison:" #: src/pref_dialog.cpp:223 msgid "Bond angle:" msgstr "Angle de liaison:" #: src/pref_dialog.cpp:227 msgid "Double bond space:" msgstr "Espacement des doubles liaisons :" #: src/pref_dialog.cpp:228 msgid "Bond dash:" msgstr "Pointillé de liaison:" #: src/pref_dialog.cpp:229 msgid "Width of wedge:" msgstr "Largeur du marqueur :" #: src/pref_dialog.cpp:230 msgid "Multiple Bond Gap" msgstr "Écart de liaisons multiples" #: src/pref_dialog.cpp:231 msgid "Unknown stereochemistry bond freq.:" msgstr "Fréquence d'une liaison de stéréochimie inconnue :" #: src/pref_dialog.cpp:232 msgid "Unknown stereochemistry bond amplitude:" msgstr "Amplitude d'une liaison de stéréochimie inconnue :" #: src/pref_dialog.cpp:233 msgid "No. of bars in stereochemistry down bond:" msgstr "No. de barres dans une liaison \"vers l'arrière\"" #: src/pref_dialog.cpp:234 msgid "Fonts" msgstr "Police :" #: src/pref_dialog.cpp:235 msgid "Sans font:" msgstr "Police Sans :" #: src/pref_dialog.cpp:236 msgid "Mono font:" msgstr "Police Mono :" #: src/pref_dialog.cpp:237 msgid "Serif font:" msgstr "Police Serif :" #: src/pref_dialog.cpp:238 msgid "Sans font italic:" msgstr "Police Sans italique :" #: src/pref_dialog.cpp:239 msgid "Mono font italic:" msgstr "Police Mono italique :" #: src/pref_dialog.cpp:241 msgid "Serif font italic:" msgstr "Police Serif italique :" #: src/pref_dialog.cpp:242 msgid "Sans font bold:" msgstr "Police Sans gras :" #: src/pref_dialog.cpp:244 msgid "Mono font bold:" msgstr "Police Mono gras :" #: src/pref_dialog.cpp:245 msgid "Serif font bold:" msgstr "Police Serif gras :" #: src/pref_dialog.cpp:246 msgid "Sans font bold italic:" msgstr "Police Sans gras italique :" #: src/pref_dialog.cpp:247 msgid "Mono font bold italic:" msgstr "Police Mono gras italique :" #: src/pref_dialog.cpp:248 msgid "Serif font bold italic:" msgstr "Police Serif gras italique :" #: src/pref_dialog.cpp:249 msgid "Symbol font:" msgstr "Police Symbol :" #: src/pref_dialog.cpp:250 msgid "Dingbats font:" msgstr "Police Dingbats :" #: src/pref_dialog.cpp:254 msgid "Default" msgstr "Par défaut" #: src/prefs.cpp:126 msgid "file " msgstr "fichier" #: src/prefs.cpp:126 msgid "do not exists" msgstr "n'existe pas" #: src/set_conf.cpp:59 src/set_conf.cpp:81 #, c-format msgid "I could not create directory: \"%s\"" msgstr "Impossible de créer le dossier : \"%s\"" #: src/util.cpp:1446 msgid "Sorry, not yet implemented" msgstr "Désolé, pas encore implémenté" #: src/util.cpp:1794 src/util.cpp:1802 msgid "File with name" msgstr "Fichier avec nom" #: src/util.cpp:1796 msgid "" "already exist.\n" "Do you want to overwrite it?" msgstr "" "existe déjà\n" "Voulez-vous l'écraser ?" #: src/util.cpp:1804 msgid "" "already exist.\n" "Do you want to overwrite it?[y/N] " msgstr "" "existe déjà\n" "Voulez-vous l'écraser ? [y/N]" #: src/util.cpp:1810 msgid "y" msgstr "y" #: src/box_prop.cpp:136 #, fuzzy msgid "Box properties" msgstr "Propriétés de la liaison" #: src/box_prop.cpp:142 #, fuzzy msgid "Dash:" msgstr "Espace entre les pointillés :" #: src/box_prop.cpp:171 #, fuzzy msgid "normal" msgstr "Format" #: src/box_prop.cpp:172 #, fuzzy msgid "shadowed" msgstr "partagé" #, fuzzy #~ msgid "&Plug-in/" #~ msgstr "&Plug-in" #~ msgid " " #~ msgstr " " #, fuzzy #~ msgid "Couldn't delete Plotter\n" #~ msgstr "Impossible de supprimer le Plotter.\n" #~ msgid "yes" #~ msgstr "Oui" #~ msgid "no" #~ msgstr "Non" #~ msgid "export as postcript..." #~ msgstr "Exporter en PostScript..." #~ msgid "export as png..." #~ msgstr "Exporter en png..." #~ msgid "Traslate selected element" #~ msgstr "r" #~ msgid "Box selection" #~ msgstr "dd" #~ msgid "" #~ "File with name \"%s\" already exist.\n" #~ " Do you want to overwrite it?" #~ msgstr "ddd" #~ msgid "No. of bars in Unkown stereochemistry bond:" #~ msgstr "d" bist-0.5.2/po/remove-potcdate.sin0000644000175000017500000000066011166204327015272 0ustar cagecage# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } bist-0.5.2/po/quot.sed0000644000175000017500000000023111166204327013140 0ustar cagecages/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g bist-0.5.2/po/ru.po0000644000175000017500000004330011367630253012451 0ustar cagecage# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Valerio Benfante # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: bist 0.5.1\n" "Report-Msgid-Bugs-To: cage@katamail.com\n" "POT-Creation-Date: 2010-05-02 12:32+0200\n" "PO-Revision-Date: 2010-05-02 08:13-0500\n" "Last-Translator: Vasily \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/arc_prop.cpp:78 #: src/arrow_prop.cpp:86 #: src/atom_prop.cpp:386 #: src/atom_prop.cpp:403 #: src/bezier_prop.cpp:89 #: src/bond_prop.cpp:117 #: src/editor.cpp:673 #: src/multiline_label_prop.cpp:108 #: src/paragraph_text_prop.cpp:98 #: src/string_prop.cpp:66 #: src/box_prop.cpp:88 msgid "pick a color..." msgstr "Выбрать цвет..." #: src/arc_prop.cpp:126 msgid "Arc properties" msgstr "Свойства дуги" #: src/arc_prop.cpp:132 #: src/arrow_prop.cpp:178 #: src/bezier_prop.cpp:240 #: src/box_prop.cpp:153 msgid "Thickness:" msgstr "Толщина:" #: src/arc_prop.cpp:143 msgid "Width:" msgstr "Ширина:" #: src/arc_prop.cpp:155 #: src/arrow_prop.cpp:246 #: src/bezier_prop.cpp:305 #: src/bond_prop.cpp:236 #: src/box_prop.cpp:165 msgid "Color" msgstr "Цвет" #: src/arc_prop.cpp:160 #: src/arrow_prop.cpp:250 #: src/bezier_prop.cpp:309 #: src/bond_prop.cpp:248 #: src/chain_prop.cpp:117 #: src/pref_dialog.cpp:256 #: src/string_prop.cpp:177 msgid "OK" msgstr "ОК" #: src/arc_prop.cpp:165 #: src/bond_prop.cpp:243 #: src/chain_prop.cpp:120 #: src/pref_dialog.cpp:255 msgid "Cancel" msgstr "Отмена" #: src/arrow_prop.cpp:161 msgid "Arrow properties" msgstr "Свойства стрелки" #: src/arrow_prop.cpp:167 #: src/bezier_prop.cpp:229 msgid "Dash step:" msgstr "Шаг штриха:" #: src/arrow_prop.cpp:189 #: src/bezier_prop.cpp:251 #: src/pref_dialog.cpp:224 msgid "Arrow width:" msgstr "Ширина стрелки" #: src/arrow_prop.cpp:199 #: src/bezier_prop.cpp:261 #: src/pref_dialog.cpp:225 msgid "Arrow height:" msgstr "Высота стрелки" #: src/arrow_prop.cpp:208 #: src/bezier_prop.cpp:270 #: src/bond_prop.cpp:225 #: src/pref_dialog.cpp:226 msgid "Arrow gap:" msgstr "Arrow gap:" #: src/arrow_prop.cpp:230 #: src/bezier_prop.cpp:291 msgid "none" msgstr "Не выбрано" #: src/arrow_prop.cpp:231 #: src/bezier_prop.cpp:292 msgid "homolitic" msgstr "гомолитический" #: src/arrow_prop.cpp:232 #: src/bezier_prop.cpp:293 msgid "heterolitic" msgstr "гетеролитический" #: src/arrow_prop.cpp:233 #: src/bezier_prop.cpp:294 msgid "double" msgstr "двойной" #: src/arrow_prop.cpp:234 msgid "blocked" msgstr "заблокированный" #: src/arrow_prop.cpp:235 msgid "equilibrium" msgstr "равновесная" #: src/arrow_prop.cpp:239 #: src/bezier_prop.cpp:298 #: src/box_prop.cpp:177 msgid "Type" msgstr "Тип" #: src/atom_prop.cpp:483 msgid "error where < _vec_str.size() in class etichetta." msgstr "error where < _vec_str.size() in class etichetta." #: src/atom_prop.cpp:616 msgid "Atom Properties" msgstr "Cвойства атома" #: src/atom_prop.cpp:627 msgid "String" msgstr "Строка" #: src/atom_prop.cpp:638 msgid "Face:" msgstr "Поверхность:" #: src/atom_prop.cpp:644 #: src/multiline_label_prop.cpp:206 #: src/paragraph_text_prop.cpp:216 #: src/string_prop.cpp:149 msgid "Dimension:" msgstr "Измерения:" #: src/atom_prop.cpp:678 msgid "Parse string" msgstr "Анализ строки" #: src/atom_prop.cpp:685 msgid "Vertical align" msgstr "Выровнять по вертикали" #: src/atom_prop.cpp:694 msgid "Electrons and other" msgstr "Электроны и др" #: src/atom_prop.cpp:710 msgid "Charge" msgstr "Заряд" #: src/atom_prop.cpp:758 msgid "Charge position" msgstr "Позиция заряда" #: src/atom_prop.cpp:809 msgid "Lone pair:" msgstr "Lone pair:" #: src/atom_prop.cpp:818 msgid "Lone unpair:" msgstr "Lone unpair:" #: src/atom_prop.cpp:828 #: src/string_prop.cpp:180 #: src/box_prop.cpp:184 msgid "Close" msgstr "Закрыть" #: src/atom_prop.cpp:835 #: src/multiline_label_prop.cpp:290 #: src/paragraph_text_prop.cpp:302 msgid "Apply" msgstr "Принять" #: src/bezier_prop.cpp:223 msgid "Bezier properties" msgstr "Свойства кривой Безье" #: src/bond_prop.cpp:154 msgid "Bond type" msgstr "Тип связи" #: src/bond_prop.cpp:159 msgid "Single bond" msgstr "Одиночная связь" #: src/bond_prop.cpp:163 msgid "Double bond" msgstr "Двойная связь" #: src/bond_prop.cpp:167 msgid "Triple bond" msgstr "Тройная связь" #: src/bond_prop.cpp:171 msgid "Double dashed bond" msgstr "Двойная связь (штрих)" #: src/bond_prop.cpp:175 msgid "Stereospecific \"up\" bond" msgstr "Stereospecific \"up\" bond" #: src/bond_prop.cpp:179 msgid "Stereospecific \"up\" reverse bond" msgstr "Stereospecifi \"up\" reverse bond" #: src/bond_prop.cpp:183 msgid "Stereospecific \"down\" bond" msgstr "Stereospecifi \"down\" bond" #: src/bond_prop.cpp:187 msgid "Stereospecific \"down\" reverse bond" msgstr "Stereospecifi \"down\" reverse bond" #: src/bond_prop.cpp:191 msgid "Dashed bond" msgstr "Связь (штрих)" #: src/bond_prop.cpp:195 msgid "Bold bond" msgstr "Связь (жирная)" #: src/bond_prop.cpp:199 msgid "Unknown stereochemistry bond" msgstr "Неизвестная стереохимическая связь " #: src/bond_prop.cpp:216 msgid "Scale" msgstr "Масштабировать" #: src/bond_prop.cpp:308 msgid "Bond properties" msgstr "Свойства связи" #: src/chain_prop.cpp:103 msgid "Draw chain..." msgstr "Нарисовать цепь..." #: src/chain_prop.cpp:111 msgid "Number of carbon:" msgstr "Количество углеродов:" #: src/chain_prop.cpp:114 msgid "Angle:" msgstr "Угол:" #: src/command_line.cpp:98 msgid "Usage" msgstr "Использование" #: src/command_line.cpp:99 msgid "Print this message and exit" msgstr "Напечатать сообщение и выйти" #: src/command_line.cpp:100 msgid "Print version and package name and exit" msgstr "Напечатать версию и имя программы и выйти" #: src/command_line.cpp:101 msgid "Format of the converted file" msgstr "Формат преобразованных файлов" #: src/command_line.cpp:102 msgid "Input file(s) to convert" msgstr "Файл(ы) для преобразования" #: src/editor.cpp:198 msgid "Image modified, exit without saving?" msgstr "Рисунок изменён. Выйти без сохранени ?" #: src/editor.cpp:198 #: src/editor.cpp:525 #: src/util.cpp:1797 msgid "Yes" msgstr "Да" #: src/editor.cpp:198 #: src/editor.cpp:525 #: src/util.cpp:1797 msgid "No" msgstr "Нет" #: src/editor.cpp:243 msgid "No such plugin " msgstr "Плагин отсутствует" #: src/editor.cpp:321 msgid "Export..." msgstr "Экспорт..." #: src/editor.cpp:417 msgid "Please insert rotation entity in degrees." msgstr "Пожалуйста, укажите угол поворота в градусах" #: src/editor.cpp:520 msgid "I can not create a new window" msgstr "Невозможно создать новое окно" #: src/editor.cpp:525 msgid "Really quit?" msgstr "Выйти ?" #: src/editor.cpp:562 msgid "Pick a file..." msgstr "Выбрать файл..." #: src/editor.cpp:613 msgid "Save As..." msgstr "Сохранить как..." #: src/editor.cpp:834 #: src/main.cpp:201 msgid "&File" msgstr "&Файл" #: src/editor.cpp:868 msgid "Create a new window" msgstr "Создать новое окно" #: src/editor.cpp:873 msgid "Open a file" msgstr "Открыть файл" #: src/editor.cpp:878 msgid "Save" msgstr "Сохранить" #: src/editor.cpp:883 #: src/plot_window.cpp:144 msgid "Save as" msgstr "Сохранить как" #: src/editor.cpp:888 msgid "Export as PostScript" msgstr "Экспорт в PostScript" #: src/editor.cpp:894 msgid "Export as PNG" msgstr "Экспорт в PNG" #: src/editor.cpp:899 msgid "Undo!" msgstr "Отмена" #: src/editor.cpp:924 msgid "Rotate selected element" msgstr "Перевернуть выделенный элемент" #: src/editor.cpp:931 msgid "Scale selected element" msgstr "Масштабировать выбранный элемент" #: src/editor.cpp:939 msgid "Select Element" msgstr "Выбрать элемент" #: src/editor.cpp:947 msgid "Select a molecule" msgstr "Выбрать молекулу" #: src/editor.cpp:961 msgid "Kill" msgstr "Kill" #: src/editor.cpp:967 msgid "Draw single bond" msgstr "Нарисовать одиночную связь" #: src/editor.cpp:973 msgid "Draw double bond" msgstr "Нарисовать двойную связь" #: src/editor.cpp:980 msgid "Draw triple bond" msgstr "Нарисовать тройную связь" #: src/editor.cpp:986 msgid "Draw arrow" msgstr "Нарисовать стрелку" #: src/editor.cpp:992 msgid "Draw bezier curve" msgstr "Нарисовать кривую Безье" #: src/editor.cpp:998 msgid "Draw circle/ellipse" msgstr "Нарисовать окружность/эллипс" #: src/editor.cpp:1005 msgid "Draw box" msgstr "Нарисовать квадрат" #: src/editor.cpp:1012 msgid "Draw string" msgstr "Нарисовать текст" #: src/editor.cpp:1019 msgid "Draw p orbital" msgstr "Нарисовть р орбиту" #: src/editor.cpp:1025 msgid "Insert template" msgstr "Вставить шаблон" #: src/editor.cpp:1037 msgid "Draw chain" msgstr "Нарисовать цепь" #: src/editor.cpp:1043 msgid "Fixed angle rotation" msgstr "Зафиксировать угол вращения" #: src/editor.cpp:1049 #: src/main.cpp:212 msgid "Paste" msgstr "Вставить" #: src/editor.cpp:1055 msgid "Vertical flip" msgstr "Отобразить по вертикали" #: src/editor.cpp:1061 msgid "Orizontal flip" msgstr "Отобразить по горизонтали" #: src/editor.cpp:1068 msgid "3D rotation" msgstr "3D вращение" #: src/editor.cpp:1074 msgid "Select color" msgstr "Выбрать цвет" #: src/editor.cpp:1079 msgid "Delete selected" msgstr "Удалить выбранное" #: src/editor.cpp:1085 msgid "Zoom" msgstr "Увеличить" #: src/editor.cpp:1091 #: src/editor.cpp:1097 msgid "Unzoom" msgstr "Уменьшить" #: src/immagine_cml.cpp:121 msgid "Couldn't allocate memory for parser" msgstr "Не могу выделить память для анализатора" #: src/immagine_cml.cpp:136 msgid "Read error" msgstr "Ошибка чтения" #: src/immagine.cpp:2873 msgid "***Position: " msgstr "***Позиция:" #: src/immagine.cpp:2873 msgid " expected " msgstr " ожидалось " #: src/immagine.cpp:2874 msgid " found " msgstr " обнаружено " #: src/immagine.cpp:2883 msgid "Unexpected end of file." msgstr "Не ожиданный конец файла" #: src/immagine.cpp:6253 msgid "Exporting..." msgstr "Экпортирование..." #: src/lib_dialog.cpp:131 msgid "Insert object" msgstr "Вставить объект" #: src/lib_dialog.cpp:156 msgid "Library" msgstr "Библиотека" #: src/lib_dialog.cpp:178 #, c-format msgid "Can not open library directory %s" msgstr "Не могу открыть директорию с библиотеками %s" #: src/lib_dialog.cpp:234 msgid "home" msgstr "home" #: src/lib_dialog.cpp:235 msgid "shared" msgstr "shared" #: src/main.cpp:137 msgid "Option requires an argument -- f" msgstr "Опция требует аргумента -- f" #: src/main.cpp:149 msgid "Option requires an argument -- c" msgstr "Опция требует аргумента -- c" #: src/main.cpp:156 msgid "format" msgstr "формат" #: src/main.cpp:158 msgid "not supported, switching to ps" msgstr "не поддерживается. Используется ps" #: src/main.cpp:195 msgid "Error in path:" msgstr "Ошибка пути:" #: src/main.cpp:202 msgid "&New" msgstr "&Новый" #: src/main.cpp:203 msgid "&Open" msgstr "&Открыть" #: src/main.cpp:204 msgid "&Save" msgstr "&Сохранить" #: src/main.cpp:205 msgid "Save &as..." msgstr "Сохранить &как..." #: src/main.cpp:206 msgid "&Export" msgstr "&Экспорт" #: src/main.cpp:209 msgid "&Quit" msgstr "&Выйти" #: src/main.cpp:211 msgid "Edit" msgstr "&Редактировать" #: src/main.cpp:213 msgid "Undo" msgstr "Отменить" #: src/main.cpp:214 msgid "Erase" msgstr "Удалить" #: src/main.cpp:216 msgid "&Configuration" msgstr "&Настройка" #: src/main.cpp:217 msgid "Set values" msgstr "Установить значения" #: src/main.cpp:218 msgid "Reset to default" msgstr "Вернуться к настройкам по умолчанию" #: src/main.cpp:220 msgid "&Plug-in" msgstr "&Дополнения" #: src/main.cpp:222 msgid "&Help" msgstr "&Помощь" #: src/main.cpp:223 msgid "About..." msgstr "О программе..." #: src/main.cpp:224 msgid "No Warranty" msgstr "No Warranty" #: src/multiline_label_prop.cpp:164 #: src/multiline_label_prop.cpp:180 #: src/paragraph_text_prop.cpp:171 #: src/paragraph_text_prop.cpp:180 #: src/string_prop.cpp:135 msgid "Text properties" msgstr "Свойства текста" #: src/multiline_label_prop.cpp:198 #: src/paragraph_text_prop.cpp:207 #: src/string_prop.cpp:144 msgid "Font:" msgstr "Шрифт:" #: src/multiline_label_prop.cpp:295 #: src/paragraph_text_prop.cpp:307 msgid "Done" msgstr "Закончено" #: src/plot_window.cpp:99 msgid "Save Spectra As..." msgstr "Сохранить спектр как..." #: src/plot_window.cpp:525 msgid "Spectra prediction" msgstr "Spectra prediction" #: src/pref_dialog.cpp:211 msgid "Set Preferences..." msgstr "Установить настройки..." #: src/pref_dialog.cpp:213 msgid "UI" msgstr "UI" #: src/pref_dialog.cpp:214 msgid "Grid space:" msgstr "Сетка:" #: src/pref_dialog.cpp:215 msgid "Click zone:" msgstr "Click zone" #: src/pref_dialog.cpp:216 msgid "Page width:" msgstr "Ширина страницы:" #: src/pref_dialog.cpp:217 msgid "Page height:" msgstr "Высота страницы:" #: src/pref_dialog.cpp:218 msgid "Show splashpage" msgstr "Показать стартовую страницу" #: src/pref_dialog.cpp:219 msgid "Show grid" msgstr "Показать сетку" #: src/pref_dialog.cpp:220 msgid "\"Magnetic\" grid" msgstr "\"Магнитная\" сетка" #: src/pref_dialog.cpp:221 msgid "Bond" msgstr "Связь" #: src/pref_dialog.cpp:222 msgid "Bond length:" msgstr "Длина связи" #: src/pref_dialog.cpp:223 msgid "Bond angle:" msgstr "Угол связи:" #: src/pref_dialog.cpp:227 msgid "Double bond space:" msgstr "" #: src/pref_dialog.cpp:228 msgid "Bond dash:" msgstr "Связь (штрих):" #: src/pref_dialog.cpp:229 msgid "Width of wedge:" msgstr "Ширина клина:" #: src/pref_dialog.cpp:230 msgid "Multiple Bond Gap" msgstr "Multiple Bond Gap" #: src/pref_dialog.cpp:231 msgid "Unknown stereochemistry bond freq.:" msgstr "Неизвестная частота связи:" #: src/pref_dialog.cpp:232 msgid "Unknown stereochemistry bond amplitude:" msgstr "Неизвестная амплитуда связи:" #: src/pref_dialog.cpp:233 msgid "No. of bars in stereochemistry down bond:" msgstr "No. of bars in stereochemistry down bond:" #: src/pref_dialog.cpp:234 msgid "Fonts" msgstr "Шрифты:" #: src/pref_dialog.cpp:235 msgid "Sans font:" msgstr "Sans" #: src/pref_dialog.cpp:236 msgid "Mono font:" msgstr "Mono" #: src/pref_dialog.cpp:237 msgid "Serif font:" msgstr "Serif" #: src/pref_dialog.cpp:238 msgid "Sans font italic:" msgstr "Sans italic" #: src/pref_dialog.cpp:239 msgid "Mono font italic:" msgstr "Mono italic" #: src/pref_dialog.cpp:241 msgid "Serif font italic:" msgstr "Serif italic" #: src/pref_dialog.cpp:242 msgid "Sans font bold:" msgstr "Sans bold" #: src/pref_dialog.cpp:244 msgid "Mono font bold:" msgstr "Mono bold" #: src/pref_dialog.cpp:245 msgid "Serif font bold:" msgstr "Serif bold" #: src/pref_dialog.cpp:246 msgid "Sans font bold italic:" msgstr "Sans bold italic" #: src/pref_dialog.cpp:247 msgid "Mono font bold italic:" msgstr "Mono bold italic" #: src/pref_dialog.cpp:248 msgid "Serif font bold italic:" msgstr "Serif bold italic" #: src/pref_dialog.cpp:249 msgid "Symbol font:" msgstr "Symbol" #: src/pref_dialog.cpp:250 msgid "Dingbats font:" msgstr "Dingbats" #: src/pref_dialog.cpp:254 msgid "Default" msgstr "По умолчанию" #: src/prefs.cpp:126 msgid "file " msgstr "файл" #: src/prefs.cpp:126 msgid "do not exists" msgstr "не существует" #: src/set_conf.cpp:59 #: src/set_conf.cpp:81 #, c-format msgid "I could not create directory: \"%s\"" msgstr "Не могу создать директорию: \"%s\"" #: src/util.cpp:1446 msgid "Sorry, not yet implemented" msgstr "Извините, но пока данная функциональность не реализована" #: src/util.cpp:1794 #: src/util.cpp:1802 msgid "File with name" msgstr "Файл" #: src/util.cpp:1796 msgid "" "already exist.\n" "Do you want to overwrite it?" msgstr "уже существует.\n Хотите его перезаписать?" #: src/util.cpp:1804 msgid "" "already exist.\n" "Do you want to overwrite it?[y/N] " msgstr "уже существует.\n Хотите его перезаписать ?" #: src/util.cpp:1810 msgid "y" msgstr "у" #: src/box_prop.cpp:136 msgid "Box properties" msgstr "Свойства квадрата" #: src/box_prop.cpp:142 msgid "Dash:" msgstr "Штрих:" #: src/box_prop.cpp:171 msgid "normal" msgstr "обычный" #: src/box_prop.cpp:172 msgid "shadowed" msgstr "затененный" bist-0.5.2/po/en@quot.header0000644000175000017500000000226311166204327014247 0ustar cagecage# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # bist-0.5.2/po/Makevars0000644000175000017500000000342111166204327013153 0ustar cagecage# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Valerio Benfante # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS =cage@katamail.com # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = bist-0.5.2/po/bist.pot0000644000175000017500000003121711367264754013165 0ustar cagecage# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Valerio Benfante # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: bist 0.5.1\n" "Report-Msgid-Bugs-To: cage@katamail.com\n" "POT-Creation-Date: 2010-05-02 12:32+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/arc_prop.cpp:78 src/arrow_prop.cpp:86 src/atom_prop.cpp:386 #: src/atom_prop.cpp:403 src/bezier_prop.cpp:89 src/bond_prop.cpp:117 #: src/editor.cpp:673 src/multiline_label_prop.cpp:108 #: src/paragraph_text_prop.cpp:98 src/string_prop.cpp:66 src/box_prop.cpp:88 msgid "pick a color..." msgstr "" #: src/arc_prop.cpp:126 msgid "Arc properties" msgstr "" #: src/arc_prop.cpp:132 src/arrow_prop.cpp:178 src/bezier_prop.cpp:240 #: src/box_prop.cpp:153 msgid "Thickness:" msgstr "" #: src/arc_prop.cpp:143 msgid "Width:" msgstr "" #: src/arc_prop.cpp:155 src/arrow_prop.cpp:246 src/bezier_prop.cpp:305 #: src/bond_prop.cpp:236 src/box_prop.cpp:165 msgid "Color" msgstr "" #: src/arc_prop.cpp:160 src/arrow_prop.cpp:250 src/bezier_prop.cpp:309 #: src/bond_prop.cpp:248 src/chain_prop.cpp:117 src/pref_dialog.cpp:256 #: src/string_prop.cpp:177 msgid "OK" msgstr "" #: src/arc_prop.cpp:165 src/bond_prop.cpp:243 src/chain_prop.cpp:120 #: src/pref_dialog.cpp:255 msgid "Cancel" msgstr "" #: src/arrow_prop.cpp:161 msgid "Arrow properties" msgstr "" #: src/arrow_prop.cpp:167 src/bezier_prop.cpp:229 msgid "Dash step:" msgstr "" #: src/arrow_prop.cpp:189 src/bezier_prop.cpp:251 src/pref_dialog.cpp:224 msgid "Arrow width:" msgstr "" #: src/arrow_prop.cpp:199 src/bezier_prop.cpp:261 src/pref_dialog.cpp:225 msgid "Arrow height:" msgstr "" #: src/arrow_prop.cpp:208 src/bezier_prop.cpp:270 src/bond_prop.cpp:225 #: src/pref_dialog.cpp:226 msgid "Arrow gap:" msgstr "" #: src/arrow_prop.cpp:230 src/bezier_prop.cpp:291 msgid "none" msgstr "" #: src/arrow_prop.cpp:231 src/bezier_prop.cpp:292 msgid "homolitic" msgstr "" #: src/arrow_prop.cpp:232 src/bezier_prop.cpp:293 msgid "heterolitic" msgstr "" #: src/arrow_prop.cpp:233 src/bezier_prop.cpp:294 msgid "double" msgstr "" #: src/arrow_prop.cpp:234 msgid "blocked" msgstr "" #: src/arrow_prop.cpp:235 msgid "equilibrium" msgstr "" #: src/arrow_prop.cpp:239 src/bezier_prop.cpp:298 src/box_prop.cpp:177 msgid "Type" msgstr "" #: src/atom_prop.cpp:483 msgid "error where < _vec_str.size() in class etichetta." msgstr "" #: src/atom_prop.cpp:616 msgid "Atom Properties" msgstr "" #: src/atom_prop.cpp:627 msgid "String" msgstr "" #: src/atom_prop.cpp:638 msgid "Face:" msgstr "" #: src/atom_prop.cpp:644 src/multiline_label_prop.cpp:206 #: src/paragraph_text_prop.cpp:216 src/string_prop.cpp:149 msgid "Dimension:" msgstr "" #: src/atom_prop.cpp:678 msgid "Parse string" msgstr "" #: src/atom_prop.cpp:685 msgid "Vertical align" msgstr "" #: src/atom_prop.cpp:694 msgid "Electrons and other" msgstr "" #: src/atom_prop.cpp:710 msgid "Charge" msgstr "" #: src/atom_prop.cpp:758 msgid "Charge position" msgstr "" #: src/atom_prop.cpp:809 msgid "Lone pair:" msgstr "" #: src/atom_prop.cpp:818 msgid "Lone unpair:" msgstr "" #: src/atom_prop.cpp:828 src/string_prop.cpp:180 src/box_prop.cpp:184 msgid "Close" msgstr "" #: src/atom_prop.cpp:835 src/multiline_label_prop.cpp:290 #: src/paragraph_text_prop.cpp:302 msgid "Apply" msgstr "" #: src/bezier_prop.cpp:223 msgid "Bezier properties" msgstr "" #: src/bond_prop.cpp:154 msgid "Bond type" msgstr "" #: src/bond_prop.cpp:159 msgid "Single bond" msgstr "" #: src/bond_prop.cpp:163 msgid "Double bond" msgstr "" #: src/bond_prop.cpp:167 msgid "Triple bond" msgstr "" #: src/bond_prop.cpp:171 msgid "Double dashed bond" msgstr "" #: src/bond_prop.cpp:175 msgid "Stereospecific \"up\" bond" msgstr "" #: src/bond_prop.cpp:179 msgid "Stereospecific \"up\" reverse bond" msgstr "" #: src/bond_prop.cpp:183 msgid "Stereospecific \"down\" bond" msgstr "" #: src/bond_prop.cpp:187 msgid "Stereospecific \"down\" reverse bond" msgstr "" #: src/bond_prop.cpp:191 msgid "Dashed bond" msgstr "" #: src/bond_prop.cpp:195 msgid "Bold bond" msgstr "" #: src/bond_prop.cpp:199 msgid "Unknown stereochemistry bond" msgstr "" #: src/bond_prop.cpp:216 msgid "Scale" msgstr "" #: src/bond_prop.cpp:308 msgid "Bond properties" msgstr "" #: src/chain_prop.cpp:103 msgid "Draw chain..." msgstr "" #: src/chain_prop.cpp:111 msgid "Number of carbon:" msgstr "" #: src/chain_prop.cpp:114 msgid "Angle:" msgstr "" #: src/command_line.cpp:98 msgid "Usage" msgstr "" #: src/command_line.cpp:99 msgid "Print this message and exit" msgstr "" #: src/command_line.cpp:100 msgid "Print version and package name and exit" msgstr "" #: src/command_line.cpp:101 msgid "Format of the converted file" msgstr "" #: src/command_line.cpp:102 msgid "Input file(s) to convert" msgstr "" #: src/editor.cpp:198 msgid "Image modified, exit without saving?" msgstr "" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "Yes" msgstr "" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "No" msgstr "" #: src/editor.cpp:243 msgid "No such plugin " msgstr "" #: src/editor.cpp:321 msgid "Export..." msgstr "" #: src/editor.cpp:417 msgid "Please insert rotation entity in degrees." msgstr "" #: src/editor.cpp:520 msgid "I can not create a new window" msgstr "" #: src/editor.cpp:525 msgid "Really quit?" msgstr "" #: src/editor.cpp:562 msgid "Pick a file..." msgstr "" #: src/editor.cpp:613 msgid "Save As..." msgstr "" #: src/editor.cpp:834 src/main.cpp:201 msgid "&File" msgstr "" #: src/editor.cpp:868 msgid "Create a new window" msgstr "" #: src/editor.cpp:873 msgid "Open a file" msgstr "" #: src/editor.cpp:878 msgid "Save" msgstr "" #: src/editor.cpp:883 src/plot_window.cpp:144 msgid "Save as" msgstr "" #: src/editor.cpp:888 msgid "Export as PostScript" msgstr "" #: src/editor.cpp:894 msgid "Export as PNG" msgstr "" #: src/editor.cpp:899 msgid "Undo!" msgstr "" #: src/editor.cpp:924 msgid "Rotate selected element" msgstr "" #: src/editor.cpp:931 msgid "Scale selected element" msgstr "" #: src/editor.cpp:939 msgid "Select Element" msgstr "" #: src/editor.cpp:947 msgid "Select a molecule" msgstr "" #: src/editor.cpp:961 msgid "Kill" msgstr "" #: src/editor.cpp:967 msgid "Draw single bond" msgstr "" #: src/editor.cpp:973 msgid "Draw double bond" msgstr "" #: src/editor.cpp:980 msgid "Draw triple bond" msgstr "" #: src/editor.cpp:986 msgid "Draw arrow" msgstr "" #: src/editor.cpp:992 msgid "Draw bezier curve" msgstr "" #: src/editor.cpp:998 msgid "Draw circle/ellipse" msgstr "" #: src/editor.cpp:1005 msgid "Draw box" msgstr "" #: src/editor.cpp:1012 msgid "Draw string" msgstr "" #: src/editor.cpp:1019 msgid "Draw p orbital" msgstr "" #: src/editor.cpp:1025 msgid "Insert template" msgstr "" #: src/editor.cpp:1037 msgid "Draw chain" msgstr "" #: src/editor.cpp:1043 msgid "Fixed angle rotation" msgstr "" #: src/editor.cpp:1049 src/main.cpp:212 msgid "Paste" msgstr "" #: src/editor.cpp:1055 msgid "Vertical flip" msgstr "" #: src/editor.cpp:1061 msgid "Orizontal flip" msgstr "" #: src/editor.cpp:1068 msgid "3D rotation" msgstr "" #: src/editor.cpp:1074 msgid "Select color" msgstr "" #: src/editor.cpp:1079 msgid "Delete selected" msgstr "" #: src/editor.cpp:1085 msgid "Zoom" msgstr "" #: src/editor.cpp:1091 src/editor.cpp:1097 msgid "Unzoom" msgstr "" #: src/immagine_cml.cpp:121 msgid "Couldn't allocate memory for parser" msgstr "" #: src/immagine_cml.cpp:136 msgid "Read error" msgstr "" #: src/immagine.cpp:2873 msgid "***Position: " msgstr "" #: src/immagine.cpp:2873 msgid " expected " msgstr "" #: src/immagine.cpp:2874 msgid " found " msgstr "" #: src/immagine.cpp:2883 msgid "Unexpected end of file." msgstr "" #: src/immagine.cpp:6253 msgid "Exporting..." msgstr "" #: src/lib_dialog.cpp:131 msgid "Insert object" msgstr "" #: src/lib_dialog.cpp:156 msgid "Library" msgstr "" #: src/lib_dialog.cpp:178 #, c-format msgid "Can not open library directory %s" msgstr "" #: src/lib_dialog.cpp:234 msgid "home" msgstr "" #: src/lib_dialog.cpp:235 msgid "shared" msgstr "" #: src/main.cpp:137 msgid "Option requires an argument -- f" msgstr "" #: src/main.cpp:149 msgid "Option requires an argument -- c" msgstr "" #: src/main.cpp:156 msgid "format" msgstr "" #: src/main.cpp:158 msgid "not supported, switching to ps" msgstr "" #: src/main.cpp:195 msgid "Error in path:" msgstr "" #: src/main.cpp:202 msgid "&New" msgstr "" #: src/main.cpp:203 msgid "&Open" msgstr "" #: src/main.cpp:204 msgid "&Save" msgstr "" #: src/main.cpp:205 msgid "Save &as..." msgstr "" #: src/main.cpp:206 msgid "&Export" msgstr "" #: src/main.cpp:209 msgid "&Quit" msgstr "" #: src/main.cpp:211 msgid "Edit" msgstr "" #: src/main.cpp:213 msgid "Undo" msgstr "" #: src/main.cpp:214 msgid "Erase" msgstr "" #: src/main.cpp:216 msgid "&Configuration" msgstr "" #: src/main.cpp:217 msgid "Set values" msgstr "" #: src/main.cpp:218 msgid "Reset to default" msgstr "" #: src/main.cpp:220 msgid "&Plug-in" msgstr "" #: src/main.cpp:222 msgid "&Help" msgstr "" #: src/main.cpp:223 msgid "About..." msgstr "" #: src/main.cpp:224 msgid "No Warranty" msgstr "" #: src/multiline_label_prop.cpp:164 src/multiline_label_prop.cpp:180 #: src/paragraph_text_prop.cpp:171 src/paragraph_text_prop.cpp:180 #: src/string_prop.cpp:135 msgid "Text properties" msgstr "" #: src/multiline_label_prop.cpp:198 src/paragraph_text_prop.cpp:207 #: src/string_prop.cpp:144 msgid "Font:" msgstr "" #: src/multiline_label_prop.cpp:295 src/paragraph_text_prop.cpp:307 msgid "Done" msgstr "" #: src/plot_window.cpp:99 msgid "Save Spectra As..." msgstr "" #: src/plot_window.cpp:525 msgid "Spectra prediction" msgstr "" #: src/pref_dialog.cpp:211 msgid "Set Preferences..." msgstr "" #: src/pref_dialog.cpp:213 msgid "UI" msgstr "" #: src/pref_dialog.cpp:214 msgid "Grid space:" msgstr "" #: src/pref_dialog.cpp:215 msgid "Click zone:" msgstr "" #: src/pref_dialog.cpp:216 msgid "Page width:" msgstr "" #: src/pref_dialog.cpp:217 msgid "Page height:" msgstr "" #: src/pref_dialog.cpp:218 msgid "Show splashpage" msgstr "" #: src/pref_dialog.cpp:219 msgid "Show grid" msgstr "" #: src/pref_dialog.cpp:220 msgid "\"Magnetic\" grid" msgstr "" #: src/pref_dialog.cpp:221 msgid "Bond" msgstr "" #: src/pref_dialog.cpp:222 msgid "Bond length:" msgstr "" #: src/pref_dialog.cpp:223 msgid "Bond angle:" msgstr "" #: src/pref_dialog.cpp:227 msgid "Double bond space:" msgstr "" #: src/pref_dialog.cpp:228 msgid "Bond dash:" msgstr "" #: src/pref_dialog.cpp:229 msgid "Width of wedge:" msgstr "" #: src/pref_dialog.cpp:230 msgid "Multiple Bond Gap" msgstr "" #: src/pref_dialog.cpp:231 msgid "Unknown stereochemistry bond freq.:" msgstr "" #: src/pref_dialog.cpp:232 msgid "Unknown stereochemistry bond amplitude:" msgstr "" #: src/pref_dialog.cpp:233 msgid "No. of bars in stereochemistry down bond:" msgstr "" #: src/pref_dialog.cpp:234 msgid "Fonts" msgstr "" #: src/pref_dialog.cpp:235 msgid "Sans font:" msgstr "" #: src/pref_dialog.cpp:236 msgid "Mono font:" msgstr "" #: src/pref_dialog.cpp:237 msgid "Serif font:" msgstr "" #: src/pref_dialog.cpp:238 msgid "Sans font italic:" msgstr "" #: src/pref_dialog.cpp:239 msgid "Mono font italic:" msgstr "" #: src/pref_dialog.cpp:241 msgid "Serif font italic:" msgstr "" #: src/pref_dialog.cpp:242 msgid "Sans font bold:" msgstr "" #: src/pref_dialog.cpp:244 msgid "Mono font bold:" msgstr "" #: src/pref_dialog.cpp:245 msgid "Serif font bold:" msgstr "" #: src/pref_dialog.cpp:246 msgid "Sans font bold italic:" msgstr "" #: src/pref_dialog.cpp:247 msgid "Mono font bold italic:" msgstr "" #: src/pref_dialog.cpp:248 msgid "Serif font bold italic:" msgstr "" #: src/pref_dialog.cpp:249 msgid "Symbol font:" msgstr "" #: src/pref_dialog.cpp:250 msgid "Dingbats font:" msgstr "" #: src/pref_dialog.cpp:254 msgid "Default" msgstr "" #: src/prefs.cpp:126 msgid "file " msgstr "" #: src/prefs.cpp:126 msgid "do not exists" msgstr "" #: src/set_conf.cpp:59 src/set_conf.cpp:81 #, c-format msgid "I could not create directory: \"%s\"" msgstr "" #: src/util.cpp:1446 msgid "Sorry, not yet implemented" msgstr "" #: src/util.cpp:1794 src/util.cpp:1802 msgid "File with name" msgstr "" #: src/util.cpp:1796 msgid "" "already exist.\n" "Do you want to overwrite it?" msgstr "" #: src/util.cpp:1804 msgid "" "already exist.\n" "Do you want to overwrite it?[y/N] " msgstr "" #: src/util.cpp:1810 msgid "y" msgstr "" #: src/box_prop.cpp:136 msgid "Box properties" msgstr "" #: src/box_prop.cpp:142 msgid "Dash:" msgstr "" #: src/box_prop.cpp:171 msgid "normal" msgstr "" #: src/box_prop.cpp:172 msgid "shadowed" msgstr "" bist-0.5.2/po/it.po0000644000175000017500000004015311440434363012436 0ustar cagecage# Italian translations for bist package. # Copyright (C) 2004 Valerio Benfante # This file is distributed under the same license as the bist package. # cage , 2004. # msgid "" msgstr "" "Project-Id-Version: bist pre-alfa.0.1\n" "Report-Msgid-Bugs-To: cage@katamail.com\n" "POT-Creation-Date: 2010-05-02 12:32+0200\n" "PO-Revision-Date: 2010-05-02 12:12+0200\n" "Last-Translator: cage \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/arc_prop.cpp:78 src/arrow_prop.cpp:86 src/atom_prop.cpp:386 #: src/atom_prop.cpp:403 src/bezier_prop.cpp:89 src/bond_prop.cpp:117 #: src/editor.cpp:673 src/multiline_label_prop.cpp:108 #: src/paragraph_text_prop.cpp:98 src/string_prop.cpp:66 src/box_prop.cpp:88 msgid "pick a color..." msgstr "scegli un colore..." #: src/arc_prop.cpp:126 msgid "Arc properties" msgstr "Propriet dell'arco" #: src/arc_prop.cpp:132 src/arrow_prop.cpp:178 src/bezier_prop.cpp:240 #: src/box_prop.cpp:153 msgid "Thickness:" msgstr "Spessore" #: src/arc_prop.cpp:143 msgid "Width:" msgstr "Larghezza" #: src/arc_prop.cpp:155 src/arrow_prop.cpp:246 src/bezier_prop.cpp:305 #: src/bond_prop.cpp:236 src/box_prop.cpp:165 msgid "Color" msgstr "Colore" #: src/arc_prop.cpp:160 src/arrow_prop.cpp:250 src/bezier_prop.cpp:309 #: src/bond_prop.cpp:248 src/chain_prop.cpp:117 src/pref_dialog.cpp:256 #: src/string_prop.cpp:177 msgid "OK" msgstr "OK" #: src/arc_prop.cpp:165 src/bond_prop.cpp:243 src/chain_prop.cpp:120 #: src/pref_dialog.cpp:255 msgid "Cancel" msgstr "Annulla" #: src/arrow_prop.cpp:161 msgid "Arrow properties" msgstr "Propriet della freccia" #: src/arrow_prop.cpp:167 src/bezier_prop.cpp:229 msgid "Dash step:" msgstr "Passo tratteggio:" #: src/arrow_prop.cpp:189 src/bezier_prop.cpp:251 src/pref_dialog.cpp:224 msgid "Arrow width:" msgstr "Larghezza della freccia:" #: src/arrow_prop.cpp:199 src/bezier_prop.cpp:261 src/pref_dialog.cpp:225 msgid "Arrow height:" msgstr "Altezza della freccia:" #: src/arrow_prop.cpp:208 src/bezier_prop.cpp:270 src/bond_prop.cpp:225 #: src/pref_dialog.cpp:226 msgid "Arrow gap:" msgstr "Rientro della freccia:" #: src/arrow_prop.cpp:230 src/bezier_prop.cpp:291 msgid "none" msgstr "niente" #: src/arrow_prop.cpp:231 src/bezier_prop.cpp:292 msgid "homolitic" msgstr "omolitico" #: src/arrow_prop.cpp:232 src/bezier_prop.cpp:293 msgid "heterolitic" msgstr "eterolitico" #: src/arrow_prop.cpp:233 src/bezier_prop.cpp:294 msgid "double" msgstr "doppio" #: src/arrow_prop.cpp:234 msgid "blocked" msgstr "bloccato" #: src/arrow_prop.cpp:235 msgid "equilibrium" msgstr "equilibrio" #: src/arrow_prop.cpp:239 src/bezier_prop.cpp:298 src/box_prop.cpp:177 msgid "Type" msgstr "Tipo" #: src/atom_prop.cpp:483 msgid "error where < _vec_str.size() in class etichetta." msgstr "errore where < _vec_str.size() nella classe etichetta" #: src/atom_prop.cpp:616 msgid "Atom Properties" msgstr "Propriet dell'atomo" #: src/atom_prop.cpp:627 msgid "String" msgstr "Stringa" #: src/atom_prop.cpp:638 msgid "Face:" msgstr "Font:" #: src/atom_prop.cpp:644 src/multiline_label_prop.cpp:206 #: src/paragraph_text_prop.cpp:216 src/string_prop.cpp:149 msgid "Dimension:" msgstr "Dimensioni" #: src/atom_prop.cpp:678 msgid "Parse string" msgstr "Interpreta stringa" #: src/atom_prop.cpp:685 msgid "Vertical align" msgstr "Allineamento verticale" #: src/atom_prop.cpp:694 msgid "Electrons and other" msgstr "Elettroni ed altro" #: src/atom_prop.cpp:710 msgid "Charge" msgstr "Cariche" #: src/atom_prop.cpp:758 msgid "Charge position" msgstr "Posizione carica" #: src/atom_prop.cpp:809 msgid "Lone pair:" msgstr "Doppietti:" #: src/atom_prop.cpp:818 msgid "Lone unpair:" msgstr "El. spaiati" #: src/atom_prop.cpp:828 src/string_prop.cpp:180 src/box_prop.cpp:184 msgid "Close" msgstr "Chiudi" #: src/atom_prop.cpp:835 src/multiline_label_prop.cpp:290 #: src/paragraph_text_prop.cpp:302 msgid "Apply" msgstr "Applica" #: src/bezier_prop.cpp:223 msgid "Bezier properties" msgstr "Propriet della curva" #: src/bond_prop.cpp:154 msgid "Bond type" msgstr "Tipo di legame" #: src/bond_prop.cpp:159 msgid "Single bond" msgstr "Legame singolo" #: src/bond_prop.cpp:163 msgid "Double bond" msgstr "Legame doppio" #: src/bond_prop.cpp:167 msgid "Triple bond" msgstr "Legame triplo" #: src/bond_prop.cpp:171 msgid "Double dashed bond" msgstr "Legame doppio/tratteggiato" #: src/bond_prop.cpp:175 msgid "Stereospecific \"up\" bond" msgstr "Legame stereospecifico \"verso di noi\"" #: src/bond_prop.cpp:179 msgid "Stereospecific \"up\" reverse bond" msgstr "Legame stereospecifico \"verso di noi\" opposto" #: src/bond_prop.cpp:183 msgid "Stereospecific \"down\" bond" msgstr "Legame stereospecifico \"all'interno\"" #: src/bond_prop.cpp:187 msgid "Stereospecific \"down\" reverse bond" msgstr "Legame stereospecifico \"all'interno\" opposto" #: src/bond_prop.cpp:191 msgid "Dashed bond" msgstr "Legame tratteggiato" #: src/bond_prop.cpp:195 msgid "Bold bond" msgstr "Legame inspessito" #: src/bond_prop.cpp:199 msgid "Unknown stereochemistry bond" msgstr "Legame a stereochimica sconosciuta" #: src/bond_prop.cpp:216 msgid "Scale" msgstr "Scale" #: src/bond_prop.cpp:308 msgid "Bond properties" msgstr "Propriet del legame" #: src/chain_prop.cpp:103 msgid "Draw chain..." msgstr "Disegna catena..." #: src/chain_prop.cpp:111 msgid "Number of carbon:" msgstr "Numero di carboni:" #: src/chain_prop.cpp:114 msgid "Angle:" msgstr "Angolo:" #: src/command_line.cpp:98 msgid "Usage" msgstr "Uso" #: src/command_line.cpp:99 msgid "Print this message and exit" msgstr "Stampa questo messaggio ed esci" #: src/command_line.cpp:100 msgid "Print version and package name and exit" msgstr "Stampa versione e nome del pacchetto ed esci" #: src/command_line.cpp:101 msgid "Format of the converted file" msgstr "formato dei file da convertire" #: src/command_line.cpp:102 msgid "Input file(s) to convert" msgstr "File di input da convertire" #: src/editor.cpp:198 msgid "Image modified, exit without saving?" msgstr "Immagine modificata, uscire senza salvare?" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "Yes" msgstr "Si" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "No" msgstr "No" #: src/editor.cpp:243 msgid "No such plugin " msgstr "Nessun plugin" #: src/editor.cpp:321 msgid "Export..." msgstr "esporta..." #: src/editor.cpp:417 msgid "Please insert rotation entity in degrees." msgstr "Inserire l'entita' della rotazione in gradi" #: src/editor.cpp:520 msgid "I can not create a new window" msgstr "Non posso creare un'ulteriore finestra." #: src/editor.cpp:525 msgid "Really quit?" msgstr "Desideri realmente uscire?" #: src/editor.cpp:562 msgid "Pick a file..." msgstr "Scegli un file" #: src/editor.cpp:613 msgid "Save As..." msgstr "Salva con nome" #: src/editor.cpp:834 src/main.cpp:201 msgid "&File" msgstr "&File" #: src/editor.cpp:868 msgid "Create a new window" msgstr "Crea un'ulteriore finestra." #: src/editor.cpp:873 msgid "Open a file" msgstr "Apri" #: src/editor.cpp:878 msgid "Save" msgstr "Salva" #: src/editor.cpp:883 src/plot_window.cpp:144 msgid "Save as" msgstr "Salva con nome" #: src/editor.cpp:888 msgid "Export as PostScript" msgstr "Esporta come PostScript..." #: src/editor.cpp:894 msgid "Export as PNG" msgstr "Esporta come PNG" #: src/editor.cpp:899 msgid "Undo!" msgstr "Annulla" #: src/editor.cpp:924 msgid "Rotate selected element" msgstr "Ruota elementi selezionati" #: src/editor.cpp:931 msgid "Scale selected element" msgstr "Scala gli elementi selezionati" #: src/editor.cpp:939 msgid "Select Element" msgstr "Selezione elemento" #: src/editor.cpp:947 msgid "Select a molecule" msgstr "Seleziona una molecola" #: src/editor.cpp:961 msgid "Kill" msgstr "Elimina" #: src/editor.cpp:967 msgid "Draw single bond" msgstr "Disegna legame singolo" #: src/editor.cpp:973 msgid "Draw double bond" msgstr "Disegna legame doppio" #: src/editor.cpp:980 msgid "Draw triple bond" msgstr "Disegna legame triplo" #: src/editor.cpp:986 msgid "Draw arrow" msgstr "Disegna freccia" #: src/editor.cpp:992 msgid "Draw bezier curve" msgstr "Disegna curva di bezier" #: src/editor.cpp:998 msgid "Draw circle/ellipse" msgstr "Disegna cerchio/ellisse" #: src/editor.cpp:1005 msgid "Draw box" msgstr "Disegna rettangolo" #: src/editor.cpp:1012 msgid "Draw string" msgstr "Disegna stringa" #: src/editor.cpp:1019 msgid "Draw p orbital" msgstr "Disegna orbitale p" #: src/editor.cpp:1025 msgid "Insert template" msgstr "Inserisci oggetto" #: src/editor.cpp:1037 msgid "Draw chain" msgstr "Disegna catena..." #: src/editor.cpp:1043 msgid "Fixed angle rotation" msgstr "Rotazione ad angolo fisso" #: src/editor.cpp:1049 src/main.cpp:212 msgid "Paste" msgstr "Incolla" #: src/editor.cpp:1055 msgid "Vertical flip" msgstr "Riflessione verticale" #: src/editor.cpp:1061 msgid "Orizontal flip" msgstr "Riflessione orizzontale" #: src/editor.cpp:1068 msgid "3D rotation" msgstr "Rotazione 3D" #: src/editor.cpp:1074 msgid "Select color" msgstr "Seleziona un colore" #: src/editor.cpp:1079 msgid "Delete selected" msgstr "Elimina selezionati" #: src/editor.cpp:1085 msgid "Zoom" msgstr "Zoom" #: src/editor.cpp:1091 src/editor.cpp:1097 msgid "Unzoom" msgstr "Unzoom" #: src/immagine_cml.cpp:121 msgid "Couldn't allocate memory for parser" msgstr "Impossibile allocare la memoria per il parser xml" #: src/immagine_cml.cpp:136 msgid "Read error" msgstr "Errore di lettura" #: src/immagine.cpp:2873 msgid "***Position: " msgstr "***Posizione" #: src/immagine.cpp:2873 msgid " expected " msgstr " atteso" #: src/immagine.cpp:2874 msgid " found " msgstr " trovato" #: src/immagine.cpp:2883 msgid "Unexpected end of file." msgstr "Fine del file prematura" #: src/immagine.cpp:6253 msgid "Exporting..." msgstr "Esporta..." #: src/lib_dialog.cpp:131 msgid "Insert object" msgstr "Inserisci oggetto" #: src/lib_dialog.cpp:156 msgid "Library" msgstr "Biblioteca" #: src/lib_dialog.cpp:178 #, c-format msgid "Can not open library directory %s" msgstr "Non posso aprire la directory %s" #: src/lib_dialog.cpp:234 msgid "home" msgstr "home" #: src/lib_dialog.cpp:235 msgid "shared" msgstr "condivisi" #: src/main.cpp:137 msgid "Option requires an argument -- f" msgstr "L'opzione -- f richiede un argomento" #: src/main.cpp:149 msgid "Option requires an argument -- c" msgstr "L'opzione -- f richiede un argomento" #: src/main.cpp:156 msgid "format" msgstr "formato" #: src/main.cpp:158 msgid "not supported, switching to ps" msgstr "non supportato selezionato ps" #: src/main.cpp:195 msgid "Error in path:" msgstr "Errore nel percorso:" #: src/main.cpp:202 msgid "&New" msgstr "&Nuovo" #: src/main.cpp:203 msgid "&Open" msgstr "Apri" #: src/main.cpp:204 msgid "&Save" msgstr "&Salva" #: src/main.cpp:205 msgid "Save &as..." msgstr "S&alva con nome" #: src/main.cpp:206 msgid "&Export" msgstr "&Esporta" #: src/main.cpp:209 msgid "&Quit" msgstr "Esci" #: src/main.cpp:211 msgid "Edit" msgstr "Modifica" #: src/main.cpp:213 msgid "Undo" msgstr "Annulla" #: src/main.cpp:214 msgid "Erase" msgstr "Cancella" #: src/main.cpp:216 msgid "&Configuration" msgstr "&Configurazione" #: src/main.cpp:217 msgid "Set values" msgstr "Imposta valori" #: src/main.cpp:218 msgid "Reset to default" msgstr "Reimposta come predefiniti" #: src/main.cpp:220 msgid "&Plug-in" msgstr "&Plug-in" #: src/main.cpp:222 msgid "&Help" msgstr "Aiuto" #: src/main.cpp:223 msgid "About..." msgstr "Sul programma" #: src/main.cpp:224 msgid "No Warranty" msgstr "Nessuna garanzia" #: src/multiline_label_prop.cpp:164 src/multiline_label_prop.cpp:180 #: src/paragraph_text_prop.cpp:171 src/paragraph_text_prop.cpp:180 #: src/string_prop.cpp:135 msgid "Text properties" msgstr "Propriet del testo" #: src/multiline_label_prop.cpp:198 src/paragraph_text_prop.cpp:207 #: src/string_prop.cpp:144 msgid "Font:" msgstr "Font:" #: src/multiline_label_prop.cpp:295 src/paragraph_text_prop.cpp:307 msgid "Done" msgstr "Fatto" #: src/plot_window.cpp:99 msgid "Save Spectra As..." msgstr "Salva spettro con nome" #: src/plot_window.cpp:525 msgid "Spectra prediction" msgstr "Predizione spettro" #: src/pref_dialog.cpp:211 msgid "Set Preferences..." msgstr "Imposta preferenze..." #: src/pref_dialog.cpp:213 msgid "UI" msgstr "UI" #: src/pref_dialog.cpp:214 msgid "Grid space:" msgstr "Passo della griglia:" #: src/pref_dialog.cpp:215 msgid "Click zone:" msgstr "Tolleranza del click:" #: src/pref_dialog.cpp:216 msgid "Page width:" msgstr "Larghezza della pagina:" #: src/pref_dialog.cpp:217 msgid "Page height:" msgstr "Altezza della pagina:" #: src/pref_dialog.cpp:218 msgid "Show splashpage" msgstr "Mostra splashpage" #: src/pref_dialog.cpp:219 msgid "Show grid" msgstr "Mostra griglia" #: src/pref_dialog.cpp:220 msgid "\"Magnetic\" grid" msgstr "Griglia \"magnetica\"" #: src/pref_dialog.cpp:221 msgid "Bond" msgstr "Tipo di legame" #: src/pref_dialog.cpp:222 msgid "Bond length:" msgstr "Lunghezza legame:" #: src/pref_dialog.cpp:223 msgid "Bond angle:" msgstr "Angolo legame:" #: src/pref_dialog.cpp:227 msgid "Double bond space:" msgstr "Spazio tra i doppi legami:" #: src/pref_dialog.cpp:228 msgid "Bond dash:" msgstr "Passo del tratteggio:" #: src/pref_dialog.cpp:229 msgid "Width of wedge:" msgstr "Larghezza del cuneo:" #: src/pref_dialog.cpp:230 msgid "Multiple Bond Gap" msgstr "Scarto tra i doppi legami" #: src/pref_dialog.cpp:231 msgid "Unknown stereochemistry bond freq.:" msgstr "Freq. del legame a stereochimica sconosciuta:" #: src/pref_dialog.cpp:232 msgid "Unknown stereochemistry bond amplitude:" msgstr "Amp. del legame a stereochimica sconosciuta:" #: src/pref_dialog.cpp:233 msgid "No. of bars in stereochemistry down bond:" msgstr "No. di barrette per il legame \"lontano da noi\"" #: src/pref_dialog.cpp:234 msgid "Fonts" msgstr "Font" #: src/pref_dialog.cpp:235 msgid "Sans font:" msgstr "Font senza grazie:" #: src/pref_dialog.cpp:236 msgid "Mono font:" msgstr "Font monospaziato:" #: src/pref_dialog.cpp:237 msgid "Serif font:" msgstr "Font con le grazie:" #: src/pref_dialog.cpp:238 msgid "Sans font italic:" msgstr "Corsivo senza grazie:" #: src/pref_dialog.cpp:239 msgid "Mono font italic:" msgstr "Monospaziato corsivo:" #: src/pref_dialog.cpp:241 msgid "Serif font italic:" msgstr "Con le grazie grassetto:" #: src/pref_dialog.cpp:242 msgid "Sans font bold:" msgstr "Senza grazie grassetto:" #: src/pref_dialog.cpp:244 msgid "Mono font bold:" msgstr "Monospaziato grassetto:" #: src/pref_dialog.cpp:245 msgid "Serif font bold:" msgstr "Con le grazie grassetto:" #: src/pref_dialog.cpp:246 msgid "Sans font bold italic:" msgstr "Senza grazie grassetto e corsivo:" #: src/pref_dialog.cpp:247 msgid "Mono font bold italic:" msgstr "Monospaziato grassetto e corsivo:" #: src/pref_dialog.cpp:248 msgid "Serif font bold italic:" msgstr "Senza grazie grassetto e corsivo:" #: src/pref_dialog.cpp:249 msgid "Symbol font:" msgstr "Lettere greche:" #: src/pref_dialog.cpp:250 msgid "Dingbats font:" msgstr "Simboli grafici:" #: src/pref_dialog.cpp:254 msgid "Default" msgstr "Predefiniti" #: src/prefs.cpp:126 msgid "file " msgstr "file" #: src/prefs.cpp:126 msgid "do not exists" msgstr "non esiste" #: src/set_conf.cpp:59 src/set_conf.cpp:81 #, c-format msgid "I could not create directory: \"%s\"" msgstr "Non posso creare la directory: \"%s\"" #: src/util.cpp:1446 msgid "Sorry, not yet implemented" msgstr "Non implementato" #: src/util.cpp:1794 src/util.cpp:1802 msgid "File with name" msgstr "Un file col nome" #: src/util.cpp:1796 msgid "" "already exist.\n" "Do you want to overwrite it?" msgstr "" "esiste gi\n" "Vuoi sovrascriverlo?" #: src/util.cpp:1804 msgid "" "already exist.\n" "Do you want to overwrite it?[y/N] " msgstr "" "esiste gi\n" "Vuoi sovrascriverlo?[s/N]" #: src/util.cpp:1810 msgid "y" msgstr "s" #: src/box_prop.cpp:136 msgid "Box properties" msgstr "Propriet del rettangolo" #: src/box_prop.cpp:142 msgid "Dash:" msgstr "Passo tratteggio:" #: src/box_prop.cpp:171 msgid "normal" msgstr "normale" #: src/box_prop.cpp:172 msgid "shadowed" msgstr "ombreggiato" #~ msgid "&Plug-in/" #~ msgstr "&Plug-in/" #~ msgid " " #~ msgstr " " #~ msgid "Couldn't delete Plotter\n" #~ msgstr "Non ho potuto eliminare dalla memoria il plotter.\n" bist-0.5.2/po/insert-header.sin0000644000175000017500000000124011166204327014721 0ustar cagecage# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } bist-0.5.2/po/pt.po0000644000175000017500000004141011443445126012444 0ustar cagecage# Portuguese (BR) translations for Bist package # Traduções do pacote Bist para o português (BR). # Copyright (C) 2010 Miriam Amicucci # This file is distributed under the same license as the bist package. # cage , 2005. # msgid "" msgstr "" "Project-Id-Version: bist beta.0.1\n" "Report-Msgid-Bugs-To: cage@katamail.com\n" "POT-Creation-Date: 2010-05-02 12:32+0200\n" "PO-Revision-Date: 2009-10-23 17:38+0200\n" "Last-Translator: Miriam Amicucci \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/arc_prop.cpp:78 src/arrow_prop.cpp:86 src/atom_prop.cpp:386 #: src/atom_prop.cpp:403 src/bezier_prop.cpp:89 src/bond_prop.cpp:117 #: src/editor.cpp:673 src/multiline_label_prop.cpp:108 #: src/paragraph_text_prop.cpp:98 src/string_prop.cpp:66 src/box_prop.cpp:88 msgid "pick a color..." msgstr "Escolha uma cor..." #: src/arc_prop.cpp:126 msgid "Arc properties" msgstr "Propriedades do arco" #: src/arc_prop.cpp:132 src/arrow_prop.cpp:178 src/bezier_prop.cpp:240 #: src/box_prop.cpp:153 msgid "Thickness:" msgstr "Espessura:" #: src/arc_prop.cpp:143 msgid "Width:" msgstr "Largura:" #: src/arc_prop.cpp:155 src/arrow_prop.cpp:246 src/bezier_prop.cpp:305 #: src/bond_prop.cpp:236 src/box_prop.cpp:165 msgid "Color" msgstr "Cor" #: src/arc_prop.cpp:160 src/arrow_prop.cpp:250 src/bezier_prop.cpp:309 #: src/bond_prop.cpp:248 src/chain_prop.cpp:117 src/pref_dialog.cpp:256 #: src/string_prop.cpp:177 msgid "OK" msgstr "OK" #: src/arc_prop.cpp:165 src/bond_prop.cpp:243 src/chain_prop.cpp:120 #: src/pref_dialog.cpp:255 msgid "Cancel" msgstr "Cancelar" #: src/arrow_prop.cpp:161 msgid "Arrow properties" msgstr "Propriedades da seta" #: src/arrow_prop.cpp:167 src/bezier_prop.cpp:229 msgid "Dash step:" msgstr "Passo do tracejado:" #: src/arrow_prop.cpp:189 src/bezier_prop.cpp:251 src/pref_dialog.cpp:224 msgid "Arrow width:" msgstr "Largura da seta:" #: src/arrow_prop.cpp:199 src/bezier_prop.cpp:261 src/pref_dialog.cpp:225 msgid "Arrow height:" msgstr "Altura da seta:" #: src/arrow_prop.cpp:208 src/bezier_prop.cpp:270 src/bond_prop.cpp:225 #: src/pref_dialog.cpp:226 msgid "Arrow gap:" msgstr "Interrupção da seta:" #: src/arrow_prop.cpp:230 src/bezier_prop.cpp:291 msgid "none" msgstr "Nenhum" #: src/arrow_prop.cpp:231 src/bezier_prop.cpp:292 msgid "homolitic" msgstr "Homolítico" #: src/arrow_prop.cpp:232 src/bezier_prop.cpp:293 msgid "heterolitic" msgstr "Heterolítico" #: src/arrow_prop.cpp:233 src/bezier_prop.cpp:294 msgid "double" msgstr "Duplo" #: src/arrow_prop.cpp:234 msgid "blocked" msgstr "Bloqueado" #: src/arrow_prop.cpp:235 msgid "equilibrium" msgstr "Equilíbrio" #: src/arrow_prop.cpp:239 src/bezier_prop.cpp:298 src/box_prop.cpp:177 msgid "Type" msgstr "Tipo" #: src/atom_prop.cpp:483 msgid "error where < _vec_str.size() in class etichetta." msgstr "erro where < _vec_str.size() ao classificar rótulo" #: src/atom_prop.cpp:616 msgid "Atom Properties" msgstr "Propriedades do átomo" #: src/atom_prop.cpp:627 msgid "String" msgstr "Texto" #: src/atom_prop.cpp:638 msgid "Face:" msgstr "Fonte:" #: src/atom_prop.cpp:644 src/multiline_label_prop.cpp:206 #: src/paragraph_text_prop.cpp:216 src/string_prop.cpp:149 msgid "Dimension:" msgstr "Tamanho:" #: src/atom_prop.cpp:678 msgid "Parse string" msgstr "Analisar texto" #: src/atom_prop.cpp:685 msgid "Vertical align" msgstr "Alinhamento vertical" #: src/atom_prop.cpp:694 msgid "Electrons and other" msgstr "Elétrons e outros" #: src/atom_prop.cpp:710 msgid "Charge" msgstr "Carga" #: src/atom_prop.cpp:758 msgid "Charge position" msgstr "Posição da carga" #: src/atom_prop.cpp:809 msgid "Lone pair:" msgstr "Par eletrônico isolado:" #: src/atom_prop.cpp:818 msgid "Lone unpair:" msgstr "Elétron desemparelhado:" #: src/atom_prop.cpp:828 src/string_prop.cpp:180 src/box_prop.cpp:184 msgid "Close" msgstr "Fechar" #: src/atom_prop.cpp:835 src/multiline_label_prop.cpp:290 #: src/paragraph_text_prop.cpp:302 msgid "Apply" msgstr "Aplicar" #: src/bezier_prop.cpp:223 msgid "Bezier properties" msgstr "Propriedades de Bezier" #: src/bond_prop.cpp:154 msgid "Bond type" msgstr "Tipo de ligação" #: src/bond_prop.cpp:159 msgid "Single bond" msgstr "Ligação simples" #: src/bond_prop.cpp:163 msgid "Double bond" msgstr "Ligação dupla" #: src/bond_prop.cpp:167 msgid "Triple bond" msgstr "Ligação tripla" #: src/bond_prop.cpp:171 msgid "Double dashed bond" msgstr "Ligação dupla tracejada" #: src/bond_prop.cpp:175 msgid "Stereospecific \"up\" bond" msgstr "Ligação estereoespecífica na direção do observador" #: src/bond_prop.cpp:179 msgid "Stereospecific \"up\" reverse bond" msgstr "Ligação estereoespecífica em direção contrária ao observador" #: src/bond_prop.cpp:183 msgid "Stereospecific \"down\" bond" msgstr "Ligação estereoespecífica que se afasta do observador" #: src/bond_prop.cpp:187 msgid "Stereospecific \"down\" reverse bond" msgstr "Ligação estereoespecífica que se aproxima do observador" #: src/bond_prop.cpp:191 msgid "Dashed bond" msgstr "Ligação tracejada" #: src/bond_prop.cpp:195 msgid "Bold bond" msgstr "Ligação em negrito" #: src/bond_prop.cpp:199 msgid "Unknown stereochemistry bond" msgstr "Ligação com estereoquímica desconhecida" #: src/bond_prop.cpp:216 msgid "Scale" msgstr "Escala" #: src/bond_prop.cpp:308 msgid "Bond properties" msgstr "Propriedades da ligação" #: src/chain_prop.cpp:103 msgid "Draw chain..." msgstr "Desenhar cadeia..." #: src/chain_prop.cpp:111 msgid "Number of carbon:" msgstr "Número de carbonos:" #: src/chain_prop.cpp:114 msgid "Angle:" msgstr "Ângulo:" #: src/command_line.cpp:98 msgid "Usage" msgstr "Uso" #: src/command_line.cpp:99 msgid "Print this message and exit" msgstr "Exibir esta mensagem e sair" #: src/command_line.cpp:100 msgid "Print version and package name and exit" msgstr "Exibir o nome e a versão do pacote e sair" #: src/command_line.cpp:101 msgid "Format of the converted file" msgstr "Formato do arquivo convertido" #: src/command_line.cpp:102 msgid "Input file(s) to convert" msgstr "Inserir arquivo(s) para converter" #: src/editor.cpp:198 msgid "Image modified, exit without saving?" msgstr "Imagem modificada, deseja sair sem salvar?" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "Yes" msgstr "Sim" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "No" msgstr "Não" #: src/editor.cpp:243 msgid "No such plugin " msgstr "Nenhum plug-in" #: src/editor.cpp:321 msgid "Export..." msgstr "Exportar..." #: src/editor.cpp:417 msgid "Please insert rotation entity in degrees." msgstr "Informe a rotação em graus." #: src/editor.cpp:520 msgid "I can not create a new window" msgstr "Não é possível criar uma nova janela" #: src/editor.cpp:525 msgid "Really quit?" msgstr "Deseja realmente sair?" #: src/editor.cpp:562 msgid "Pick a file..." msgstr "Escolha um arquivo..." #: src/editor.cpp:613 msgid "Save As..." msgstr "Salvar como..." #: src/editor.cpp:834 src/main.cpp:201 msgid "&File" msgstr "&Arquivo" #: src/editor.cpp:868 msgid "Create a new window" msgstr "Criar uma nova janela" #: src/editor.cpp:873 msgid "Open a file" msgstr "Abrir um arquivo" #: src/editor.cpp:878 msgid "Save" msgstr "Salvar" #: src/editor.cpp:883 src/plot_window.cpp:144 msgid "Save as" msgstr "Salvar como" #: src/editor.cpp:888 msgid "Export as PostScript" msgstr "Exportar como PostScript" #: src/editor.cpp:894 msgid "Export as PNG" msgstr "Exportar como PNG" #: src/editor.cpp:899 msgid "Undo!" msgstr "Desfazer!" #: src/editor.cpp:924 msgid "Rotate selected element" msgstr "Rotacionar o elemento selecionado" #: src/editor.cpp:931 msgid "Scale selected element" msgstr "Dimensionar o elemento selecionado" #: src/editor.cpp:939 msgid "Select Element" msgstr "Selecionar elemento" #: src/editor.cpp:947 msgid "Select a molecule" msgstr "Selecionar molécula" #: src/editor.cpp:961 msgid "Kill" msgstr "Excluir" #: src/editor.cpp:967 msgid "Draw single bond" msgstr "Desenhar ligação simples" #: src/editor.cpp:973 msgid "Draw double bond" msgstr "Desenhar ligação dupla" #: src/editor.cpp:980 msgid "Draw triple bond" msgstr "Desenhar ligação tripla" #: src/editor.cpp:986 msgid "Draw arrow" msgstr "Desenhar seta" #: src/editor.cpp:992 msgid "Draw bezier curve" msgstr "Desenhar curva de Bezier" #: src/editor.cpp:998 msgid "Draw circle/ellipse" msgstr "Desenhar círculo/elipse" #: src/editor.cpp:1005 #, fuzzy msgid "Draw box" msgstr "Desenhar seta" #: src/editor.cpp:1012 msgid "Draw string" msgstr "Texto" #: src/editor.cpp:1019 msgid "Draw p orbital" msgstr "Desenhar orbital p" #: src/editor.cpp:1025 msgid "Insert template" msgstr "Inserir modelo" #: src/editor.cpp:1037 msgid "Draw chain" msgstr "Desenhar cadeia" #: src/editor.cpp:1043 msgid "Fixed angle rotation" msgstr "Rotação com ângulo fixo" #: src/editor.cpp:1049 src/main.cpp:212 msgid "Paste" msgstr "Colar" #: src/editor.cpp:1055 msgid "Vertical flip" msgstr "Reflexão vertical" #: src/editor.cpp:1061 msgid "Orizontal flip" msgstr "Reflexão horizontal" #: src/editor.cpp:1068 msgid "3D rotation" msgstr "Rotação 3D" #: src/editor.cpp:1074 msgid "Select color" msgstr "Selecionar cor" #: src/editor.cpp:1079 msgid "Delete selected" msgstr "Apagar seleção" #: src/editor.cpp:1085 msgid "Zoom" msgstr "Aumentar" #: src/editor.cpp:1091 src/editor.cpp:1097 msgid "Unzoom" msgstr "Reduzir" #: src/immagine_cml.cpp:121 msgid "Couldn't allocate memory for parser" msgstr "Sem memória disponível para análise sintática" #: src/immagine_cml.cpp:136 msgid "Read error" msgstr "Erro de leitura" #: src/immagine.cpp:2873 msgid "***Position: " msgstr "***Posição:" #: src/immagine.cpp:2873 msgid " expected " msgstr "Esperado" #: src/immagine.cpp:2874 msgid " found " msgstr "Encontrado" #: src/immagine.cpp:2883 msgid "Unexpected end of file." msgstr "Fim inesperado do arquivo." #: src/immagine.cpp:6253 msgid "Exporting..." msgstr "Exportando..." #: src/lib_dialog.cpp:131 msgid "Insert object" msgstr "Inserir objeto" #: src/lib_dialog.cpp:156 msgid "Library" msgstr "Biblioteca" #: src/lib_dialog.cpp:178 #, c-format msgid "Can not open library directory %s" msgstr "Não é possível abrir a pasta da biblioteca %s" #: src/lib_dialog.cpp:234 msgid "home" msgstr "Início" #: src/lib_dialog.cpp:235 msgid "shared" msgstr "Compartilhado" #: src/main.cpp:137 msgid "Option requires an argument -- f" msgstr "A opção requer um argumento -- f" #: src/main.cpp:149 msgid "Option requires an argument -- c" msgstr "A opção requer um argumento -- c" #: src/main.cpp:156 msgid "format" msgstr "Formato" #: src/main.cpp:158 msgid "not supported, switching to ps" msgstr "Não suportado, substituindo por PS" #: src/main.cpp:195 msgid "Error in path:" msgstr "Erro no caminho:" #: src/main.cpp:202 msgid "&New" msgstr "&Novo..." #: src/main.cpp:203 msgid "&Open" msgstr "&Abrir..." #: src/main.cpp:204 msgid "&Save" msgstr "&Salvar" #: src/main.cpp:205 msgid "Save &as..." msgstr "Salvar &como..." #: src/main.cpp:206 msgid "&Export" msgstr "&Exportar" #: src/main.cpp:209 msgid "&Quit" msgstr "Sai&r" #: src/main.cpp:211 msgid "Edit" msgstr "Editar" #: src/main.cpp:213 msgid "Undo" msgstr "Desfazer" #: src/main.cpp:214 msgid "Erase" msgstr "Apagar" #: src/main.cpp:216 msgid "&Configuration" msgstr "C&onfigurar" #: src/main.cpp:217 msgid "Set values" msgstr "Indicar Valores" #: src/main.cpp:218 msgid "Reset to default" msgstr "Configuração padrão" #: src/main.cpp:220 msgid "&Plug-in" msgstr "&Plug-in" #: src/main.cpp:222 msgid "&Help" msgstr "&Ajuda" #: src/main.cpp:223 msgid "About..." msgstr "Sobre..." #: src/main.cpp:224 msgid "No Warranty" msgstr "Nenhuma Garantia" #: src/multiline_label_prop.cpp:164 src/multiline_label_prop.cpp:180 #: src/paragraph_text_prop.cpp:171 src/paragraph_text_prop.cpp:180 #: src/string_prop.cpp:135 msgid "Text properties" msgstr "Propriedades do texto" #: src/multiline_label_prop.cpp:198 src/paragraph_text_prop.cpp:207 #: src/string_prop.cpp:144 msgid "Font:" msgstr "Fonte:" #: src/multiline_label_prop.cpp:295 src/paragraph_text_prop.cpp:307 msgid "Done" msgstr "Concluído" #: src/plot_window.cpp:99 #, fuzzy msgid "Save Spectra As..." msgstr "Salvar espectro como..." #: src/plot_window.cpp:525 msgid "Spectra prediction" msgstr "Predição de espectro" #: src/pref_dialog.cpp:211 msgid "Set Preferences..." msgstr "Preferências..." #: src/pref_dialog.cpp:213 msgid "UI" msgstr "UI" #: src/pref_dialog.cpp:214 msgid "Grid space:" msgstr "Espaçamento de grade:" #: src/pref_dialog.cpp:215 msgid "Click zone:" msgstr "Região sensível ao click:" #: src/pref_dialog.cpp:216 msgid "Page width:" msgstr "Largura da página:" #: src/pref_dialog.cpp:217 msgid "Page height:" msgstr "Altura da página" #: src/pref_dialog.cpp:218 msgid "Show splashpage" msgstr "Mostrar visualização" #: src/pref_dialog.cpp:219 msgid "Show grid" msgstr "Mostrar grade" #: src/pref_dialog.cpp:220 msgid "\"Magnetic\" grid" msgstr "Grade \"Magnética\"" #: src/pref_dialog.cpp:221 msgid "Bond" msgstr "Tipo de ligação" #: src/pref_dialog.cpp:222 msgid "Bond length:" msgstr "Comprimento de ligação:" #: src/pref_dialog.cpp:223 msgid "Bond angle:" msgstr "Ângulo de ligação:" #: src/pref_dialog.cpp:227 msgid "Double bond space:" msgstr "Espaço entre ligações duplas:" #: src/pref_dialog.cpp:228 msgid "Bond dash:" msgstr "Ligação tracejada:" #: src/pref_dialog.cpp:229 msgid "Width of wedge:" msgstr "Largura da cunha:" #: src/pref_dialog.cpp:230 msgid "Multiple Bond Gap" msgstr "Diferença entre ligações múltiplas" #: src/pref_dialog.cpp:231 msgid "Unknown stereochemistry bond freq.:" msgstr "Frequência de ligação a estereoquímica desconhecida" #: src/pref_dialog.cpp:232 msgid "Unknown stereochemistry bond amplitude:" msgstr "Amplitude de ligação a estereoquímica desconhecida" #: src/pref_dialog.cpp:233 msgid "No. of bars in stereochemistry down bond:" msgstr "No. de barras na ligação afastada do observador:" #: src/pref_dialog.cpp:234 #, fuzzy msgid "Fonts" msgstr "Fontes" #: src/pref_dialog.cpp:235 msgid "Sans font:" msgstr "Fonte Sans:" #: src/pref_dialog.cpp:236 msgid "Mono font:" msgstr "Fonte Mono:" #: src/pref_dialog.cpp:237 msgid "Serif font:" msgstr "Fonte Serif:" #: src/pref_dialog.cpp:238 msgid "Sans font italic:" msgstr "Fonte Sans itálica:" #: src/pref_dialog.cpp:239 msgid "Mono font italic:" msgstr "Fonte Mono itálica:" #: src/pref_dialog.cpp:241 msgid "Serif font italic:" msgstr "Fonte Serif itálica" #: src/pref_dialog.cpp:242 msgid "Sans font bold:" msgstr "Fonte Sans negrito:" #: src/pref_dialog.cpp:244 msgid "Mono font bold:" msgstr "Fonte Mono negrito:" #: src/pref_dialog.cpp:245 msgid "Serif font bold:" msgstr "Fonte Serif negrito:" #: src/pref_dialog.cpp:246 msgid "Sans font bold italic:" msgstr "Fonte Sans negrito itálico:" #: src/pref_dialog.cpp:247 msgid "Mono font bold italic:" msgstr "Fonte Mono negrito itálico:" #: src/pref_dialog.cpp:248 msgid "Serif font bold italic:" msgstr "Fonte Serif negrito itálico:" #: src/pref_dialog.cpp:249 msgid "Symbol font:" msgstr "Fonte Symbol:" #: src/pref_dialog.cpp:250 msgid "Dingbats font:" msgstr "Fonte Dingbats:" #: src/pref_dialog.cpp:254 msgid "Default" msgstr "Padrão" #: src/prefs.cpp:126 #, fuzzy msgid "file " msgstr "&Arquivo" #: src/prefs.cpp:126 msgid "do not exists" msgstr "não existe" #: src/set_conf.cpp:59 src/set_conf.cpp:81 #, c-format msgid "I could not create directory: \"%s\"" msgstr "Não foi possível criar a pasta: \"%s\"" #: src/util.cpp:1446 msgid "Sorry, not yet implemented" msgstr "Ainda não implementado" #: src/util.cpp:1794 src/util.cpp:1802 msgid "File with name" msgstr "Arquivo com nome" #: src/util.cpp:1796 msgid "" "already exist.\n" "Do you want to overwrite it?" msgstr "" "Arquivo \"%s\" já existe.\n" "Deseja substituí-lo?" #: src/util.cpp:1804 #, fuzzy msgid "" "already exist.\n" "Do you want to overwrite it?[y/N] " msgstr "" "O arquivo \"%s\" já existe.\n" "Deseja substituí-lo?[S/N] " #: src/util.cpp:1810 msgid "y" msgstr "S" #: src/box_prop.cpp:136 #, fuzzy msgid "Box properties" msgstr "Propriedades da ligação" #: src/box_prop.cpp:142 #, fuzzy msgid "Dash:" msgstr "Passo do tracejado:" #: src/box_prop.cpp:171 #, fuzzy msgid "normal" msgstr "Normal" #: src/box_prop.cpp:172 #, fuzzy msgid "shadowed" msgstr "Sombreado" #, fuzzy #~ msgid "&Plug-in/" #~ msgstr "&Plug-in" #~ msgid " " #~ msgstr " " #~ msgid "Couldn't delete Plotter\n" #~ msgstr "Não foi possível apagar Plotter\n" #, fuzzy #~ msgid "no" #~ msgstr "Não" #~ msgid "export as postcript..." #~ msgstr "exportar como PostScript..." #~ msgid "export as png..." #~ msgstr "exportar como PNG..." #~ msgid "" #~ "File with name \"%s\" already exist.\n" #~ " Do you want to overwrite it?" #~ msgstr "" #~ "O arquivo de nome \"%s\" já existe.\n" #~ "Deseja substituí-lo?" bist-0.5.2/po/Makefile.in.in0000644000175000017500000003552411166204327014142 0ustar cagecage# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2007 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.17 GETTEXT_MACRO_VERSION = 0.17 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: check-macro-version all-@USE_NLS@ all-yes: stamp-po all-no: # Ensure that the gettext macros and this Makefile.in.in are in sync. check-macro-version: @test "$(GETTEXT_MACRO_VERSION)" = "@GETTEXT_MACRO_VERSION@" \ || { echo "*** error: gettext infrastructure mismatch: using a Makefile.in.in from gettext version $(GETTEXT_MACRO_VERSION) but the autoconf macros are from gettext version @GETTEXT_MACRO_VERSION@" 1>&2; \ exit 1; \ } # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if LC_ALL=C grep 'GNU @PACKAGE@' $(top_srcdir)/* 2>/dev/null | grep -v 'libtool:' >/dev/null; then \ package_gnu='GNU '; \ else \ package_gnu=''; \ fi; \ if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \ '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ *) \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) @XGETTEXT_EXTRA_OPTIONS@ \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --package-name="$${package_gnu}@PACKAGE@" \ --package-version='@VERSION@' \ --msgid-bugs-address="$$msgid_bugs_address" \ ;; \ esac test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: bist-0.5.2/po/nl.po0000644000175000017500000004022511437771637012451 0ustar cagecage# Copyright (C) 2008-2009 Paul Smits # This file is distributed under the same license as the bist package. #msgid "" msgid "" msgstr "" "Project-Id-Version: bist pre-alfa.0.1\n" "Report-Msgid-Bugs-To: cage@katamail.com\n" "POT-Creation-Date: 2010-05-02 12:32+0200\n" "PO-Revision-Date: 2009-05-03 20:52+0100\n" "Last-Translator: Paul Smits \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Poedit-Language: Dutch\n" "X-Poedit-Country: NETHERLANDS\n" "X-Poedit-SourceCharset: iso-8859-1\n" #: src/arc_prop.cpp:78 src/arrow_prop.cpp:86 src/atom_prop.cpp:386 #: src/atom_prop.cpp:403 src/bezier_prop.cpp:89 src/bond_prop.cpp:117 #: src/editor.cpp:673 src/multiline_label_prop.cpp:108 #: src/paragraph_text_prop.cpp:98 src/string_prop.cpp:66 src/box_prop.cpp:88 msgid "pick a color..." msgstr "kies een kleur..." #: src/arc_prop.cpp:126 msgid "Arc properties" msgstr "Boog eigenschappen" #: src/arc_prop.cpp:132 src/arrow_prop.cpp:178 src/bezier_prop.cpp:240 #: src/box_prop.cpp:153 msgid "Thickness:" msgstr "Dikte:" #: src/arc_prop.cpp:143 msgid "Width:" msgstr "Breedte:" #: src/arc_prop.cpp:155 src/arrow_prop.cpp:246 src/bezier_prop.cpp:305 #: src/bond_prop.cpp:236 src/box_prop.cpp:165 msgid "Color" msgstr "Kleur" #: src/arc_prop.cpp:160 src/arrow_prop.cpp:250 src/bezier_prop.cpp:309 #: src/bond_prop.cpp:248 src/chain_prop.cpp:117 src/pref_dialog.cpp:256 #: src/string_prop.cpp:177 msgid "OK" msgstr "OK" #: src/arc_prop.cpp:165 src/bond_prop.cpp:243 src/chain_prop.cpp:120 #: src/pref_dialog.cpp:255 msgid "Cancel" msgstr "Annuleren" #: src/arrow_prop.cpp:161 msgid "Arrow properties" msgstr "Pijl eigenschappen" #: src/arrow_prop.cpp:167 src/bezier_prop.cpp:229 msgid "Dash step:" msgstr "Streep stap:" #: src/arrow_prop.cpp:189 src/bezier_prop.cpp:251 src/pref_dialog.cpp:224 msgid "Arrow width:" msgstr "Pijl breedte:" #: src/arrow_prop.cpp:199 src/bezier_prop.cpp:261 src/pref_dialog.cpp:225 msgid "Arrow height:" msgstr "Pijl hoogte:" #: src/arrow_prop.cpp:208 src/bezier_prop.cpp:270 src/bond_prop.cpp:225 #: src/pref_dialog.cpp:226 msgid "Arrow gap:" msgstr "Pijl ruimte:" #: src/arrow_prop.cpp:230 src/bezier_prop.cpp:291 msgid "none" msgstr "geen" #: src/arrow_prop.cpp:231 src/bezier_prop.cpp:292 msgid "homolitic" msgstr "homolytisch" #: src/arrow_prop.cpp:232 src/bezier_prop.cpp:293 msgid "heterolitic" msgstr "heterolytisch" #: src/arrow_prop.cpp:233 src/bezier_prop.cpp:294 msgid "double" msgstr "dubbel" #: src/arrow_prop.cpp:234 msgid "blocked" msgstr "geblokkeerd" #: src/arrow_prop.cpp:235 msgid "equilibrium" msgstr "evenwicht" #: src/arrow_prop.cpp:239 src/bezier_prop.cpp:298 src/box_prop.cpp:177 msgid "Type" msgstr "Type" #: src/atom_prop.cpp:483 msgid "error where < _vec_str.size() in class etichetta." msgstr "fout where <_vec_str.size() in klasse etichetta." #: src/atom_prop.cpp:616 msgid "Atom Properties" msgstr "Atoom Eigenschappen" #: src/atom_prop.cpp:627 #, fuzzy msgid "String" msgstr "String" #: src/atom_prop.cpp:638 msgid "Face:" msgstr "Lettertype:" #: src/atom_prop.cpp:644 src/multiline_label_prop.cpp:206 #: src/paragraph_text_prop.cpp:216 src/string_prop.cpp:149 msgid "Dimension:" msgstr "Dimensie:" #: src/atom_prop.cpp:678 #, fuzzy msgid "Parse string" msgstr "String parsen" #: src/atom_prop.cpp:685 msgid "Vertical align" msgstr "Verticaal uitlijnen" #: src/atom_prop.cpp:694 msgid "Electrons and other" msgstr "Elektronen en overige" #: src/atom_prop.cpp:710 msgid "Charge" msgstr "Lading" #: src/atom_prop.cpp:758 msgid "Charge position" msgstr "Ladingspositie" #: src/atom_prop.cpp:809 msgid "Lone pair:" msgstr "Eenzaam elektronenpaar:" #: src/atom_prop.cpp:818 msgid "Lone unpair:" msgstr "Eenzaam elektron:" #: src/atom_prop.cpp:828 src/string_prop.cpp:180 src/box_prop.cpp:184 msgid "Close" msgstr "Sluiten" #: src/atom_prop.cpp:835 src/multiline_label_prop.cpp:290 #: src/paragraph_text_prop.cpp:302 msgid "Apply" msgstr "Toepassen" #: src/bezier_prop.cpp:223 msgid "Bezier properties" msgstr "Eigenschappen kromme" #: src/bond_prop.cpp:154 msgid "Bond type" msgstr "Type binding" #: src/bond_prop.cpp:159 msgid "Single bond" msgstr "Enkele binding" #: src/bond_prop.cpp:163 msgid "Double bond" msgstr "Dubbele binding" #: src/bond_prop.cpp:167 msgid "Triple bond" msgstr "Drievoudige binding" #: src/bond_prop.cpp:171 msgid "Double dashed bond" msgstr "Dubbel gestreepte binding" #: src/bond_prop.cpp:175 msgid "Stereospecific \"up\" bond" msgstr "Stereospecifieke \"omhoog\" binding" #: src/bond_prop.cpp:179 msgid "Stereospecific \"up\" reverse bond" msgstr "Stereospecifieke omgekeerde \"omhoog\" binding" #: src/bond_prop.cpp:183 msgid "Stereospecific \"down\" bond" msgstr "Stereospecifieke \"omlaag\" binding" #: src/bond_prop.cpp:187 msgid "Stereospecific \"down\" reverse bond" msgstr "Stereospecifieke omgekeerde \"omlaag\" binding" #: src/bond_prop.cpp:191 msgid "Dashed bond" msgstr "Gestreepte binding" #: src/bond_prop.cpp:195 msgid "Bold bond" msgstr "Vette binding" #: src/bond_prop.cpp:199 msgid "Unknown stereochemistry bond" msgstr "Onbekende stereochemische binding" #: src/bond_prop.cpp:216 msgid "Scale" msgstr "Schaal" #: src/bond_prop.cpp:308 msgid "Bond properties" msgstr "Bindingseigenschappen" #: src/chain_prop.cpp:103 msgid "Draw chain..." msgstr "Keten tekenen..." #: src/chain_prop.cpp:111 msgid "Number of carbon:" msgstr "Aantal koolstoffen:" #: src/chain_prop.cpp:114 msgid "Angle:" msgstr "Hoek:" #: src/command_line.cpp:98 msgid "Usage" msgstr "Gebruik" #: src/command_line.cpp:99 msgid "Print this message and exit" msgstr "Dit bericht printen en sluiten" #: src/command_line.cpp:100 msgid "Print version and package name and exit" msgstr "Versie en pakketnaam printen en sluiten" #: src/command_line.cpp:101 msgid "Format of the converted file" msgstr "Formaat van het geconverteerde bestand" #: src/command_line.cpp:102 msgid "Input file(s) to convert" msgstr "Te converteren bestand(en) invoeren" #: src/editor.cpp:198 msgid "Image modified, exit without saving?" msgstr "Beeld gewijzigd, afluiten zonder op te slaan?" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "Yes" msgstr "Ja" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "No" msgstr "Nee" #: src/editor.cpp:243 msgid "No such plugin " msgstr "" #: src/editor.cpp:321 msgid "Export..." msgstr "Exporteren..." #: src/editor.cpp:417 msgid "Please insert rotation entity in degrees." msgstr "Voer de rotatie-eenheid in graden in." #: src/editor.cpp:520 msgid "I can not create a new window" msgstr "Er kan geen nieuw venster worden geopend." #: src/editor.cpp:525 msgid "Really quit?" msgstr "Weet u zeker dat u wilt afsluiten?" #: src/editor.cpp:562 msgid "Pick a file..." msgstr "Een bestand kiezen..." #: src/editor.cpp:613 msgid "Save As..." msgstr "Opslaan als..." #: src/editor.cpp:834 src/main.cpp:201 msgid "&File" msgstr "&Bestand" #: src/editor.cpp:868 msgid "Create a new window" msgstr "Een nieuw venster openen" #: src/editor.cpp:873 msgid "Open a file" msgstr "Een bestand openen" #: src/editor.cpp:878 msgid "Save" msgstr "Opslaan" #: src/editor.cpp:883 src/plot_window.cpp:144 msgid "Save as" msgstr "Opslaan als" #: src/editor.cpp:888 msgid "Export as PostScript" msgstr "Exporteren als PostScript" #: src/editor.cpp:894 msgid "Export as PNG" msgstr "Exporteren als PNG" #: src/editor.cpp:899 msgid "Undo!" msgstr "Ongedaan maken!" #: src/editor.cpp:924 msgid "Rotate selected element" msgstr "Het geselecteerde element roteren" #: src/editor.cpp:931 msgid "Scale selected element" msgstr "Het geselecteerde element inschalen" #: src/editor.cpp:939 msgid "Select Element" msgstr "Element selecteren" #: src/editor.cpp:947 msgid "Select a molecule" msgstr "Een molecuul selecteren" #: src/editor.cpp:961 msgid "Kill" msgstr "Elimineren" #: src/editor.cpp:967 msgid "Draw single bond" msgstr "Enkele binding tekenen" #: src/editor.cpp:973 msgid "Draw double bond" msgstr "Dubbele binding tekenen" #: src/editor.cpp:980 msgid "Draw triple bond" msgstr "Driedubbele binding tekenen" #: src/editor.cpp:986 msgid "Draw arrow" msgstr "Pijl tekenen" #: src/editor.cpp:992 msgid "Draw bezier curve" msgstr "Bezierkromme tekenen" #: src/editor.cpp:998 msgid "Draw circle/ellipse" msgstr "Cirkel/ellips tekenen" #: src/editor.cpp:1005 #, fuzzy msgid "Draw box" msgstr "Pijl tekenen" #: src/editor.cpp:1012 #, fuzzy msgid "Draw string" msgstr "String tekenen" #: src/editor.cpp:1019 msgid "Draw p orbital" msgstr "p-orbitaal tekenen" #: src/editor.cpp:1025 msgid "Insert template" msgstr "Sjabloon invoegen" #: src/editor.cpp:1037 msgid "Draw chain" msgstr "Keten tekenen" #: src/editor.cpp:1043 msgid "Fixed angle rotation" msgstr "Vaste hoekrotatie" #: src/editor.cpp:1049 src/main.cpp:212 msgid "Paste" msgstr "Plakken" #: src/editor.cpp:1055 msgid "Vertical flip" msgstr "Verticaal spiegelen" #: src/editor.cpp:1061 msgid "Orizontal flip" msgstr "Horizontaal spiegelen" #: src/editor.cpp:1068 msgid "3D rotation" msgstr "3D rotatie" #: src/editor.cpp:1074 msgid "Select color" msgstr "Kleur selecteren" #: src/editor.cpp:1079 msgid "Delete selected" msgstr "Selectie verwijderen" #: src/editor.cpp:1085 msgid "Zoom" msgstr "Inzoomen" #: src/editor.cpp:1091 src/editor.cpp:1097 msgid "Unzoom" msgstr "Uitzoomen" #: src/immagine_cml.cpp:121 msgid "Couldn't allocate memory for parser" msgstr "Kan geen geheugen vrijmaken voor de parser " #: src/immagine_cml.cpp:136 msgid "Read error" msgstr "Leesfout" #: src/immagine.cpp:2873 msgid "***Position: " msgstr "***Positie:" #: src/immagine.cpp:2873 msgid " expected " msgstr " verwachtte" #: src/immagine.cpp:2874 msgid " found " msgstr " gevonden" #: src/immagine.cpp:2883 msgid "Unexpected end of file." msgstr "Onverwacht einde van bestand." #: src/immagine.cpp:6253 msgid "Exporting..." msgstr "Exporteren..." #: src/lib_dialog.cpp:131 msgid "Insert object" msgstr "Object invoegen" #: src/lib_dialog.cpp:156 msgid "Library" msgstr "Bibliotheek" #: src/lib_dialog.cpp:178 #, c-format msgid "Can not open library directory %s" msgstr "Bibliotheek map %s kan niet geopend worden" #: src/lib_dialog.cpp:234 msgid "home" msgstr "home" #: src/lib_dialog.cpp:235 msgid "shared" msgstr "gedeeld" #: src/main.cpp:137 msgid "Option requires an argument -- f" msgstr "Optie -- f heeft een argument nodig" #: src/main.cpp:149 msgid "Option requires an argument -- c" msgstr "Optie -- c heeft een argument nodig" #: src/main.cpp:156 msgid "format" msgstr "formaat" #: src/main.cpp:158 msgid "not supported, switching to ps" msgstr "wordt niet ondersteund; overschakelen naar ps" #: src/main.cpp:195 msgid "Error in path:" msgstr "Fout in pad:" #: src/main.cpp:202 msgid "&New" msgstr "&Nieuw" #: src/main.cpp:203 msgid "&Open" msgstr "&Openen" #: src/main.cpp:204 msgid "&Save" msgstr "O&pslaan" #: src/main.cpp:205 msgid "Save &as..." msgstr "Ops&laan als" #: src/main.cpp:206 msgid "&Export" msgstr "E&xporteren" #: src/main.cpp:209 msgid "&Quit" msgstr "&Afsluiten" #: src/main.cpp:211 msgid "Edit" msgstr "Bewerken" #: src/main.cpp:213 msgid "Undo" msgstr "Ongedaan maken" #: src/main.cpp:214 msgid "Erase" msgstr "Wissen" #: src/main.cpp:216 msgid "&Configuration" msgstr "%Eigenschappen" #: src/main.cpp:217 msgid "Set values" msgstr "Waarden instellen" #: src/main.cpp:218 msgid "Reset to default" msgstr "Standaard resetten" #: src/main.cpp:220 msgid "&Plug-in" msgstr "Plug-&in" #: src/main.cpp:222 msgid "&Help" msgstr "&Help" #: src/main.cpp:223 msgid "About..." msgstr "Info..." #: src/main.cpp:224 msgid "No Warranty" msgstr "Geen Garantie" #: src/multiline_label_prop.cpp:164 src/multiline_label_prop.cpp:180 #: src/paragraph_text_prop.cpp:171 src/paragraph_text_prop.cpp:180 #: src/string_prop.cpp:135 msgid "Text properties" msgstr "Tekst eigenschappen" #: src/multiline_label_prop.cpp:198 src/paragraph_text_prop.cpp:207 #: src/string_prop.cpp:144 msgid "Font:" msgstr "Lettertype:" #: src/multiline_label_prop.cpp:295 src/paragraph_text_prop.cpp:307 msgid "Done" msgstr "Klaar" #: src/plot_window.cpp:99 msgid "Save Spectra As..." msgstr "Spectrum Opslaan als..." #: src/plot_window.cpp:525 msgid "Spectra prediction" msgstr "Spectrum voorspelling" #: src/pref_dialog.cpp:211 msgid "Set Preferences..." msgstr "Instellen..." #: src/pref_dialog.cpp:213 msgid "UI" msgstr "UI" #: src/pref_dialog.cpp:214 msgid "Grid space:" msgstr "Raster ruimte:" #: src/pref_dialog.cpp:215 msgid "Click zone:" msgstr "Klikzone" #: src/pref_dialog.cpp:216 msgid "Page width:" msgstr "Paginabreedte" #: src/pref_dialog.cpp:217 msgid "Page height:" msgstr "Paginahoogte" #: src/pref_dialog.cpp:218 msgid "Show splashpage" msgstr "Splashscreen weergeven" #: src/pref_dialog.cpp:219 msgid "Show grid" msgstr "Raster weergeven" #: src/pref_dialog.cpp:220 msgid "\"Magnetic\" grid" msgstr "\"Magnetisch\" veld" #: src/pref_dialog.cpp:221 msgid "Bond" msgstr "Binding" #: src/pref_dialog.cpp:222 msgid "Bond length:" msgstr "Bindinglengte:" #: src/pref_dialog.cpp:223 msgid "Bond angle:" msgstr "Bindingshoek:" #: src/pref_dialog.cpp:227 msgid "Double bond space:" msgstr "Dubbele bindigsruimte" #: src/pref_dialog.cpp:228 msgid "Bond dash:" msgstr "Bindingsstreepje:" #: src/pref_dialog.cpp:229 #, fuzzy msgid "Width of wedge:" msgstr "Breedte van wig:" #: src/pref_dialog.cpp:230 msgid "Multiple Bond Gap" msgstr "Meervoudige bindingsruimte" #: src/pref_dialog.cpp:231 msgid "Unknown stereochemistry bond freq.:" msgstr "Onbekende stereochemische bindingsfreq.:" #: src/pref_dialog.cpp:232 msgid "Unknown stereochemistry bond amplitude:" msgstr "Onbekende stereochemische bindingsamplitudo:" #: src/pref_dialog.cpp:233 msgid "No. of bars in stereochemistry down bond:" msgstr "Hoeveelheid balkjes in stereochemische \"omlaag\" binding" #: src/pref_dialog.cpp:234 msgid "Fonts" msgstr "Lettertypen" #: src/pref_dialog.cpp:235 msgid "Sans font:" msgstr "Schreefloos Lettertype:" #: src/pref_dialog.cpp:236 msgid "Mono font:" msgstr "Niet-proportioneel lettertype:" #: src/pref_dialog.cpp:237 msgid "Serif font:" msgstr "Schreefletters:" #: src/pref_dialog.cpp:238 msgid "Sans font italic:" msgstr "Schreefloos cursief:" #: src/pref_dialog.cpp:239 msgid "Mono font italic:" msgstr "Niet-proportioneel cursief:" #: src/pref_dialog.cpp:241 msgid "Serif font italic:" msgstr "Schreefletters cursief:" #: src/pref_dialog.cpp:242 msgid "Sans font bold:" msgstr "Schreefloos vet:" #: src/pref_dialog.cpp:244 msgid "Mono font bold:" msgstr "Niet-proportioneel vet:" #: src/pref_dialog.cpp:245 msgid "Serif font bold:" msgstr "Schreefletters vet:" #: src/pref_dialog.cpp:246 msgid "Sans font bold italic:" msgstr "Schreefloos vet cusief:" #: src/pref_dialog.cpp:247 msgid "Mono font bold italic:" msgstr "Niet-proportioneel vet cursief:" #: src/pref_dialog.cpp:248 msgid "Serif font bold italic:" msgstr "Schreefletters vet cursief:" #: src/pref_dialog.cpp:249 msgid "Symbol font:" msgstr "Symbool lettertype:" #: src/pref_dialog.cpp:250 msgid "Dingbats font:" msgstr "Dingbat lettertype:" #: src/pref_dialog.cpp:254 msgid "Default" msgstr "Standaard" #: src/prefs.cpp:126 msgid "file " msgstr "bestand" #: src/prefs.cpp:126 msgid "do not exists" msgstr "bestaan niet" #: src/set_conf.cpp:59 src/set_conf.cpp:81 #, c-format msgid "I could not create directory: \"%s\"" msgstr "Kon de directory niet aanmaken: \"%s\"" #: src/util.cpp:1446 msgid "Sorry, not yet implemented" msgstr "Sorry, nog niet gemplementeerd" #: src/util.cpp:1794 src/util.cpp:1802 msgid "File with name" msgstr "Bestand met de naam" #: src/util.cpp:1796 msgid "" "already exist.\n" "Do you want to overwrite it?" msgstr "" "bestaat al. \n" " Wilt u het bestaande bestand overschrijven?" #: src/util.cpp:1804 msgid "" "already exist.\n" "Do you want to overwrite it?[y/N] " msgstr "" "bestaat al. \n" " Wilt u het bestaande bestand overschrijven?[j/N]" #: src/util.cpp:1810 msgid "y" msgstr "j" #: src/box_prop.cpp:136 #, fuzzy msgid "Box properties" msgstr "Bindingseigenschappen" #: src/box_prop.cpp:142 #, fuzzy msgid "Dash:" msgstr "Streep stap:" #: src/box_prop.cpp:171 #, fuzzy msgid "normal" msgstr "formaat" #: src/box_prop.cpp:172 #, fuzzy msgid "shadowed" msgstr "gedeeld" #, fuzzy #~ msgid "&Plug-in/" #~ msgstr "Plug-&in" #~ msgid " " #~ msgstr " " bist-0.5.2/po/es.po0000644000175000017500000004014111437771637012444 0ustar cagecage# Spanish translations for bist package # Traducciones al espaol para el paquete bist. # Copyright (C) 2005 Valerio Benfante # This file is distributed under the same license as the bist package. # cage , 2005. # msgid "" msgstr "" "Project-Id-Version: bist beta.0.1\n" "Report-Msgid-Bugs-To: cage@katamail.com\n" "POT-Creation-Date: 2010-05-02 12:32+0200\n" "PO-Revision-Date: 2008-09-14 10:00+0200\n" "Last-Translator: cage \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/arc_prop.cpp:78 src/arrow_prop.cpp:86 src/atom_prop.cpp:386 #: src/atom_prop.cpp:403 src/bezier_prop.cpp:89 src/bond_prop.cpp:117 #: src/editor.cpp:673 src/multiline_label_prop.cpp:108 #: src/paragraph_text_prop.cpp:98 src/string_prop.cpp:66 src/box_prop.cpp:88 msgid "pick a color..." msgstr "elija un color" #: src/arc_prop.cpp:126 msgid "Arc properties" msgstr "Propiedad del arco" #: src/arc_prop.cpp:132 src/arrow_prop.cpp:178 src/bezier_prop.cpp:240 #: src/box_prop.cpp:153 msgid "Thickness:" msgstr "Grosor" #: src/arc_prop.cpp:143 msgid "Width:" msgstr "Anchura:" #: src/arc_prop.cpp:155 src/arrow_prop.cpp:246 src/bezier_prop.cpp:305 #: src/bond_prop.cpp:236 src/box_prop.cpp:165 msgid "Color" msgstr "Color" #: src/arc_prop.cpp:160 src/arrow_prop.cpp:250 src/bezier_prop.cpp:309 #: src/bond_prop.cpp:248 src/chain_prop.cpp:117 src/pref_dialog.cpp:256 #: src/string_prop.cpp:177 msgid "OK" msgstr "Aceptar" #: src/arc_prop.cpp:165 src/bond_prop.cpp:243 src/chain_prop.cpp:120 #: src/pref_dialog.cpp:255 msgid "Cancel" msgstr "Cancelar" #: src/arrow_prop.cpp:161 msgid "Arrow properties" msgstr "Propietad de la flecha" #: src/arrow_prop.cpp:167 src/bezier_prop.cpp:229 msgid "Dash step:" msgstr "Paso del trateado" #: src/arrow_prop.cpp:189 src/bezier_prop.cpp:251 src/pref_dialog.cpp:224 msgid "Arrow width:" msgstr "Anchura de la flecha" #: src/arrow_prop.cpp:199 src/bezier_prop.cpp:261 src/pref_dialog.cpp:225 msgid "Arrow height:" msgstr "altura de la flecha" #: src/arrow_prop.cpp:208 src/bezier_prop.cpp:270 src/bond_prop.cpp:225 #: src/pref_dialog.cpp:226 msgid "Arrow gap:" msgstr "Interrupcin de la flecha" #: src/arrow_prop.cpp:230 src/bezier_prop.cpp:291 msgid "none" msgstr "ninguno" #: src/arrow_prop.cpp:231 src/bezier_prop.cpp:292 msgid "homolitic" msgstr "homoltico" #: src/arrow_prop.cpp:232 src/bezier_prop.cpp:293 msgid "heterolitic" msgstr "heteroltico" #: src/arrow_prop.cpp:233 src/bezier_prop.cpp:294 msgid "double" msgstr "doble" #: src/arrow_prop.cpp:234 msgid "blocked" msgstr "bloqueado" #: src/arrow_prop.cpp:235 msgid "equilibrium" msgstr "equilibrio" #: src/arrow_prop.cpp:239 src/bezier_prop.cpp:298 src/box_prop.cpp:177 msgid "Type" msgstr "Tipo" #: src/atom_prop.cpp:483 msgid "error where < _vec_str.size() in class etichetta." msgstr "error where < _vec_str.size() in class etichetta" #: src/atom_prop.cpp:616 msgid "Atom Properties" msgstr "Propiedad del atomo" #: src/atom_prop.cpp:627 msgid "String" msgstr "String" #: src/atom_prop.cpp:638 msgid "Face:" msgstr "fuente" #: src/atom_prop.cpp:644 src/multiline_label_prop.cpp:206 #: src/paragraph_text_prop.cpp:216 src/string_prop.cpp:149 msgid "Dimension:" msgstr "Tamao" #: src/atom_prop.cpp:678 msgid "Parse string" msgstr "Interpretar texto" #: src/atom_prop.cpp:685 msgid "Vertical align" msgstr "Centrar" #: src/atom_prop.cpp:694 msgid "Electrons and other" msgstr "Electrnes y dems" #: src/atom_prop.cpp:710 msgid "Charge" msgstr "Carga" #: src/atom_prop.cpp:758 msgid "Charge position" msgstr "Posicin de la carga" #: src/atom_prop.cpp:809 msgid "Lone pair:" msgstr "Par de electrnes" #: src/atom_prop.cpp:818 msgid "Lone unpair:" msgstr "Electrn desaparejado" #: src/atom_prop.cpp:828 src/string_prop.cpp:180 src/box_prop.cpp:184 msgid "Close" msgstr "Cierra" #: src/atom_prop.cpp:835 src/multiline_label_prop.cpp:290 #: src/paragraph_text_prop.cpp:302 msgid "Apply" msgstr "Aplica" #: src/bezier_prop.cpp:223 msgid "Bezier properties" msgstr "Propietad de bezier" #: src/bond_prop.cpp:154 msgid "Bond type" msgstr "Tipo de enlace" #: src/bond_prop.cpp:159 msgid "Single bond" msgstr "Enlace sencillo" #: src/bond_prop.cpp:163 msgid "Double bond" msgstr "Enlace doble" #: src/bond_prop.cpp:167 msgid "Triple bond" msgstr "Enlace triple" #: src/bond_prop.cpp:171 msgid "Double dashed bond" msgstr "Enlace doble punteado" #: src/bond_prop.cpp:175 msgid "Stereospecific \"up\" bond" msgstr "En. hacia el observador" #: src/bond_prop.cpp:179 msgid "Stereospecific \"up\" reverse bond" msgstr "En. inverso hacia el observador" #: src/bond_prop.cpp:183 msgid "Stereospecific \"down\" bond" msgstr "En. que se aleja del observador" #: src/bond_prop.cpp:187 msgid "Stereospecific \"down\" reverse bond" msgstr "En. inverso que se aleja del observador" #: src/bond_prop.cpp:191 msgid "Dashed bond" msgstr "En. punteado" #: src/bond_prop.cpp:195 msgid "Bold bond" msgstr "Enlace negrita" #: src/bond_prop.cpp:199 msgid "Unknown stereochemistry bond" msgstr "En. con estereoqumica desconoscida" #: src/bond_prop.cpp:216 msgid "Scale" msgstr "Escalar" #: src/bond_prop.cpp:308 msgid "Bond properties" msgstr "Propietad del enlace" #: src/chain_prop.cpp:103 msgid "Draw chain..." msgstr "Dibuja cadena" #: src/chain_prop.cpp:111 msgid "Number of carbon:" msgstr "Nmero de carbonos" #: src/chain_prop.cpp:114 msgid "Angle:" msgstr "Angulo" #: src/command_line.cpp:98 msgid "Usage" msgstr "Uso" #: src/command_line.cpp:99 msgid "Print this message and exit" msgstr "Muestra este mensaje y sal" #: src/command_line.cpp:100 msgid "Print version and package name and exit" msgstr "Muestra la versin y el nombre del programa y sal" #: src/command_line.cpp:101 msgid "Format of the converted file" msgstr "formato del fichero convertido" #: src/command_line.cpp:102 msgid "Input file(s) to convert" msgstr "fichero(s) de input para convertir" #: src/editor.cpp:198 msgid "Image modified, exit without saving?" msgstr "La imagen ha sido modificada , salir sin guardar?" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "Yes" msgstr "S" #: src/editor.cpp:198 src/editor.cpp:525 src/util.cpp:1797 msgid "No" msgstr "No" #: src/editor.cpp:243 msgid "No such plugin " msgstr "" #: src/editor.cpp:321 msgid "Export..." msgstr "Exporta..." #: src/editor.cpp:417 msgid "Please insert rotation entity in degrees." msgstr "Introduzca la rotacon en grados" #: src/editor.cpp:520 msgid "I can not create a new window" msgstr "no puedo crear una nueva ventana" #: src/editor.cpp:525 msgid "Really quit?" msgstr "Quiere cerrar?" #: src/editor.cpp:562 msgid "Pick a file..." msgstr "Elija un fichero" #: src/editor.cpp:613 msgid "Save As..." msgstr "Guardar como..." #: src/editor.cpp:834 src/main.cpp:201 msgid "&File" msgstr "&Fichero" #: src/editor.cpp:868 msgid "Create a new window" msgstr "Crear una nueva ventana" #: src/editor.cpp:873 msgid "Open a file" msgstr "Abrir un fichero" #: src/editor.cpp:878 msgid "Save" msgstr "Guardar" #: src/editor.cpp:883 src/plot_window.cpp:144 msgid "Save as" msgstr "Guardar como" #: src/editor.cpp:888 msgid "Export as PostScript" msgstr "Exporta como postscript" #: src/editor.cpp:894 msgid "Export as PNG" msgstr "exporta como png" #: src/editor.cpp:899 msgid "Undo!" msgstr "deshacer" #: src/editor.cpp:924 msgid "Rotate selected element" msgstr "Rotar elemento seleccionado" #: src/editor.cpp:931 msgid "Scale selected element" msgstr "Escalar el elemento seleccionado" #: src/editor.cpp:939 msgid "Select Element" msgstr "Elija un elemento" #: src/editor.cpp:947 msgid "Select a molecule" msgstr "Elija una molecola" #: src/editor.cpp:961 msgid "Kill" msgstr "Borrar" #: src/editor.cpp:967 msgid "Draw single bond" msgstr "Dibujar enlace sencillo" #: src/editor.cpp:973 msgid "Draw double bond" msgstr "Dibujar enlace doble" #: src/editor.cpp:980 msgid "Draw triple bond" msgstr "Dibujar enlace triple" #: src/editor.cpp:986 msgid "Draw arrow" msgstr "Dibujar flecha" #: src/editor.cpp:992 msgid "Draw bezier curve" msgstr "Bibujar bezier" #: src/editor.cpp:998 msgid "Draw circle/ellipse" msgstr "Dibujar circulo/elipse" #: src/editor.cpp:1005 #, fuzzy msgid "Draw box" msgstr "Dibujar flecha" #: src/editor.cpp:1012 msgid "Draw string" msgstr "Dibujar texto" #: src/editor.cpp:1019 msgid "Draw p orbital" msgstr "Dibujar orbital p" #: src/editor.cpp:1025 msgid "Insert template" msgstr "Introducir plantilla" #: src/editor.cpp:1037 msgid "Draw chain" msgstr "Dibuja cadena" #: src/editor.cpp:1043 msgid "Fixed angle rotation" msgstr "Rotacin con angulo fijo" #: src/editor.cpp:1049 src/main.cpp:212 msgid "Paste" msgstr "Pegar" #: src/editor.cpp:1055 msgid "Vertical flip" msgstr "Voltear vertical" #: src/editor.cpp:1061 msgid "Orizontal flip" msgstr "Voltear horizontal" #: src/editor.cpp:1068 msgid "3D rotation" msgstr "Rotacin 3D" #: src/editor.cpp:1074 msgid "Select color" msgstr "Elija un color" #: src/editor.cpp:1079 msgid "Delete selected" msgstr "borrar los seleccionados" #: src/editor.cpp:1085 msgid "Zoom" msgstr "Aumentar" #: src/editor.cpp:1091 src/editor.cpp:1097 msgid "Unzoom" msgstr "Reducir" #: src/immagine_cml.cpp:121 msgid "Couldn't allocate memory for parser" msgstr "No es posible destinar memoria para el parser" #: src/immagine_cml.cpp:136 msgid "Read error" msgstr "Error de lctura" #: src/immagine.cpp:2873 msgid "***Position: " msgstr "" #: src/immagine.cpp:2873 msgid " expected " msgstr "" #: src/immagine.cpp:2874 msgid " found " msgstr "" #: src/immagine.cpp:2883 msgid "Unexpected end of file." msgstr "" #: src/immagine.cpp:6253 msgid "Exporting..." msgstr "Exportando..." #: src/lib_dialog.cpp:131 msgid "Insert object" msgstr "Introduzca el objecto" #: src/lib_dialog.cpp:156 msgid "Library" msgstr "biblioteca" #: src/lib_dialog.cpp:178 #, c-format msgid "Can not open library directory %s" msgstr "No puedo abrir la carpeta de la biblioteca %s" #: src/lib_dialog.cpp:234 msgid "home" msgstr "raz" #: src/lib_dialog.cpp:235 msgid "shared" msgstr "compartidos" #: src/main.cpp:137 msgid "Option requires an argument -- f" msgstr "La opcon necesita un argumento -- f" #: src/main.cpp:149 msgid "Option requires an argument -- c" msgstr "La opcon necesita un argumento -- c" #: src/main.cpp:156 msgid "format" msgstr "formato" #: src/main.cpp:158 msgid "not supported, switching to ps" msgstr "no disponible, utilizar ps" #: src/main.cpp:195 msgid "Error in path:" msgstr "Error en path" #: src/main.cpp:202 msgid "&New" msgstr "&Nuevo" #: src/main.cpp:203 msgid "&Open" msgstr "Abrir" #: src/main.cpp:204 msgid "&Save" msgstr "Guardar" #: src/main.cpp:205 msgid "Save &as..." msgstr "Guardar como..." #: src/main.cpp:206 msgid "&Export" msgstr "Exportar" #: src/main.cpp:209 msgid "&Quit" msgstr "Salir" #: src/main.cpp:211 msgid "Edit" msgstr "Modificar" #: src/main.cpp:213 msgid "Undo" msgstr "deshacer" #: src/main.cpp:214 msgid "Erase" msgstr "Borrar" #: src/main.cpp:216 msgid "&Configuration" msgstr "&Configurar" #: src/main.cpp:217 msgid "Set values" msgstr "Indicar los Valores" #: src/main.cpp:218 msgid "Reset to default" msgstr "Valores por defecto" #: src/main.cpp:220 msgid "&Plug-in" msgstr "plug-in" #: src/main.cpp:222 msgid "&Help" msgstr "Ayuda" #: src/main.cpp:223 msgid "About..." msgstr "Sobre este programa..." #: src/main.cpp:224 msgid "No Warranty" msgstr "Ninguna garanta" #: src/multiline_label_prop.cpp:164 src/multiline_label_prop.cpp:180 #: src/paragraph_text_prop.cpp:171 src/paragraph_text_prop.cpp:180 #: src/string_prop.cpp:135 msgid "Text properties" msgstr "propiedades del texto" #: src/multiline_label_prop.cpp:198 src/paragraph_text_prop.cpp:207 #: src/string_prop.cpp:144 msgid "Font:" msgstr "Fuente:" #: src/multiline_label_prop.cpp:295 src/paragraph_text_prop.cpp:307 msgid "Done" msgstr "Hecho" #: src/plot_window.cpp:99 #, fuzzy msgid "Save Spectra As..." msgstr "Guardar como..." #: src/plot_window.cpp:525 msgid "Spectra prediction" msgstr "" #: src/pref_dialog.cpp:211 msgid "Set Preferences..." msgstr "Configurar..." #: src/pref_dialog.cpp:213 msgid "UI" msgstr "UI" #: src/pref_dialog.cpp:214 msgid "Grid space:" msgstr "Paso de la parrilla" #: src/pref_dialog.cpp:215 msgid "Click zone:" msgstr "Zona de sensibilidad" #: src/pref_dialog.cpp:216 msgid "Page width:" msgstr "Ancho de pagina" #: src/pref_dialog.cpp:217 msgid "Page height:" msgstr "altura de pagina" #: src/pref_dialog.cpp:218 msgid "Show splashpage" msgstr "Muestra splashpage" #: src/pref_dialog.cpp:219 msgid "Show grid" msgstr "Muestra la parrilla" #: src/pref_dialog.cpp:220 msgid "\"Magnetic\" grid" msgstr "\"Magntico\" parrilla" #: src/pref_dialog.cpp:221 msgid "Bond" msgstr "Tipo de enlace" #: src/pref_dialog.cpp:222 msgid "Bond length:" msgstr "longitud del enlace" #: src/pref_dialog.cpp:223 msgid "Bond angle:" msgstr "ngulo del enlace" #: src/pref_dialog.cpp:227 msgid "Double bond space:" msgstr "espacio del enlace doble" #: src/pref_dialog.cpp:228 msgid "Bond dash:" msgstr "Anchura del enlace punteado" #: src/pref_dialog.cpp:229 msgid "Width of wedge:" msgstr "Anchura de la cua" #: src/pref_dialog.cpp:230 msgid "Multiple Bond Gap" msgstr "Diferencia de long. en. mltiple" #: src/pref_dialog.cpp:231 msgid "Unknown stereochemistry bond freq.:" msgstr "Frecuencia del enlace a estereoqumica desconoscida" #: src/pref_dialog.cpp:232 msgid "Unknown stereochemistry bond amplitude:" msgstr "Amplitud del enlace a estereoqumica desconoscida" #: src/pref_dialog.cpp:233 msgid "No. of bars in stereochemistry down bond:" msgstr "Nmero de baritas en el enlace que se aleja" #: src/pref_dialog.cpp:234 #, fuzzy msgid "Fonts" msgstr "Fuente:" #: src/pref_dialog.cpp:235 msgid "Sans font:" msgstr "" #: src/pref_dialog.cpp:236 msgid "Mono font:" msgstr "" #: src/pref_dialog.cpp:237 msgid "Serif font:" msgstr "" #: src/pref_dialog.cpp:238 msgid "Sans font italic:" msgstr "" #: src/pref_dialog.cpp:239 msgid "Mono font italic:" msgstr "" #: src/pref_dialog.cpp:241 msgid "Serif font italic:" msgstr "" #: src/pref_dialog.cpp:242 msgid "Sans font bold:" msgstr "" #: src/pref_dialog.cpp:244 msgid "Mono font bold:" msgstr "" #: src/pref_dialog.cpp:245 msgid "Serif font bold:" msgstr "" #: src/pref_dialog.cpp:246 msgid "Sans font bold italic:" msgstr "" #: src/pref_dialog.cpp:247 msgid "Mono font bold italic:" msgstr "" #: src/pref_dialog.cpp:248 msgid "Serif font bold italic:" msgstr "" #: src/pref_dialog.cpp:249 msgid "Symbol font:" msgstr "" #: src/pref_dialog.cpp:250 msgid "Dingbats font:" msgstr "" #: src/pref_dialog.cpp:254 msgid "Default" msgstr "Defecto" #: src/prefs.cpp:126 #, fuzzy msgid "file " msgstr "&Fichero" #: src/prefs.cpp:126 msgid "do not exists" msgstr "" #: src/set_conf.cpp:59 src/set_conf.cpp:81 #, c-format msgid "I could not create directory: \"%s\"" msgstr "No he podido crear la carpeta \"%s\"" #: src/util.cpp:1446 msgid "Sorry, not yet implemented" msgstr "No esta disponible" #: src/util.cpp:1794 src/util.cpp:1802 msgid "File with name" msgstr "Fichero con nombre" #: src/util.cpp:1796 msgid "" "already exist.\n" "Do you want to overwrite it?" msgstr "" "Fichero de nombre \"%s\" ya existe\n" "Quiere reemplazarlo?" #: src/util.cpp:1804 #, fuzzy msgid "" "already exist.\n" "Do you want to overwrite it?[y/N] " msgstr "" "Fichero de nombre \"%s\" ya existe\n" "Quiere reemplazarlo?" #: src/util.cpp:1810 msgid "y" msgstr "" #: src/box_prop.cpp:136 #, fuzzy msgid "Box properties" msgstr "Propietad del enlace" #: src/box_prop.cpp:142 #, fuzzy msgid "Dash:" msgstr "Paso del trateado" #: src/box_prop.cpp:171 #, fuzzy msgid "normal" msgstr "formato" #: src/box_prop.cpp:172 #, fuzzy msgid "shadowed" msgstr "compartidos" #, fuzzy #~ msgid "&Plug-in/" #~ msgstr "plug-in" #~ msgid " " #~ msgstr " " #~ msgid "Couldn't delete Plotter\n" #~ msgstr "no se ha podido borrar el plotter\n" #, fuzzy #~ msgid "no" #~ msgstr "deshacer" #~ msgid "export as postcript..." #~ msgstr "exporta como postscript" #~ msgid "export as png..." #~ msgstr "exporta como png" #~ msgid "" #~ "File with name \"%s\" already exist.\n" #~ " Do you want to overwrite it?" #~ msgstr "" #~ "Fichero de nombre \"%s\" ya existe\n" #~ "Quiere reemplazarlo?" bist-0.5.2/po/LINGUAS0000644000175000017500000000002211367630253012502 0ustar cagecageit es fr nl pt ru bist-0.5.2/po/Rules-quot0000644000175000017500000000337611166204327013473 0ustar cagecage# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header bist-0.5.2/po/en@boldquot.header0000644000175000017500000000247111166204327015111 0ustar cagecage# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # bist-0.5.2/AUTHORS0000644000175000017500000000052211404470240012102 0ustar cagecageValerio Benfante cage@katamail.com Valov Vasily vasilyvalov@gmail.com Luisa Russo (logo's author) Stefano Forli (icons set author) Nicolas ELIE French traslation Paul Smits Dutch translation Miriam Amicucci Brasilian/Portuguese translationbist-0.5.2/Doxyfile0000644000175000017500000012511111025523004012536 0ustar cagecage# Doxyfile 1.3.4 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = bist # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, # Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en # (Japanese with English messages), Korean, Norwegian, Polish, Portuguese, # Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = Italian # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited # members of a class in the documentation of that class as if those members were # ordinary class members. Constructors, destructors and assignment operators of # the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. It is allowed to use relative paths in the argument list. STRIP_FROM_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explict @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # reimplements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = include/ src/ # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp # *.h++ *.idl *.odl *.cs *.php *.php3 *.inc FILE_PATTERNS = # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. EXCLUDE_SYMLINKS = YES # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. INPUT_FILTER = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output dir. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = YES # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimised for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assigments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = NO # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. PREDEFINED = # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse the # parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::addtions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or # super classes. Setting the tag to NO turns the diagrams off. Note that this # option is superceded by the HAVE_DOT option below. This is only a fallback. It is # recommended to install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similiar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found on the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes that # lay further from the root node will be omitted. Note that setting this option to # 1 or 2 may greatly reduce the computation time needed for large code bases. Also # note that a graph may be further truncated if the graph's image dimensions are # not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). # If 0 is used for the depth value (the default), the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::addtions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO bist-0.5.2/doc/0000755000175000017500000000000011740261236011606 5ustar cagecagebist-0.5.2/doc/about.html0000644000175000017500000000253511025523004013601 0ustar cagecage Bist: about
[bist logo]

bist: drawing tool for chemical structure
Copyright (C) 2005 Valerio "cage" Benfante

cage@katamail.com

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA


Last modified: Tue Aug 10 22:11:56 CEST 2004

bist-0.5.2/doc/internals/0000755000175000017500000000000011740261236013605 5ustar cagecagebist-0.5.2/doc/internals/grammar.bist0000644000175000017500000002026211367264754016135 0ustar cagecage/* Grammar for bist native file format Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ Questo file dovrebbe descrivere la grammatica usata dal programma per salvare le strutture molecolari. ? == uno o piu' * == 0 o piu' | == OR logico Gli spazi i caratteri di tabulazione i ritorni a capo e le linee che iniziano col cancelletto ('#')sono ignorati. atomo 0 : tipo_atomo 0 { elemento { etichetta { C_{2}^{++} }, 0,16,-2,1,1,10.8.10.8 } lista { legame {1,0,0} legame {2,1,0} } } gruppo 0: tipo_gruppo 0{ atomo 1 { ... } atomo 2 { ... } } stringa { etichetta { C_{6}H_{12}O_{6} }, 10,10 } APRI := '{' CHIUDI := '}' SEP := ',' IMMAGINE := GRUPPO* STRINGHE* GRUPPO := "gruppo" ID_GRUPPO ":" "tipo_gruppo" TIPO_GRUPPO APRI ROT* ATOMO* PROCEDURA* CHIUDI ROT := APRI XPIVOT SEP YPIVOT SEP ANGOLOROT CHIUDI TIPO_GRUPPO := (int) tipo di gruppo DA FARE ID_GRUPPO := (int) identifica univocamente il gruppo. ATOMO := "atomo" ID_ATOMO ":" "tipo_atomo" TIPO_ATOMO APRI "elemento" APRI ETICHETTA SEP CARICHE SEP POSIZIONE_CARICA SEP DOPPIETTI SEP EL_SPAIATI SEP MASSA SEP COLORE SEP COLORE SEP COLORE SEP POSX SEP POSY CHIUDI LISTA_DI_ADIACENZA CHIUDI COLORE := (int) una componente (RGB) del colore dell'elemento MASSA := (int) Il numero di massa PROCEDURA := 'ARC' APRI ID_PROC SEP XSTART SEP YSTART SEP XEND SEP YEND SEP X1 SEP Y1 SEP X2 SEP X2 SEP X3 SEP Y3 SEP X4 SEP Y4 SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH CHIUDI | 'ARROW' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE SEP ARRW SEP ARRH SEP ARRGAP CHIUDI | 'BEZIER' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE SEP ARRW SEP ARRH SEP ARRGAP CHIUDI 'BOX' APRI ID_PROC SEP LD_X SEP LD_Y SEP RU_X SEP RU_Y SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP BOX_TYPE CHIUDI LD_X := POSX LD_Y := POSX RU_X := POSX RU_Y := POSX (0,0) +--------------------------------------------> | | (LD_X,LD_Y) | +-----------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | +-----------------------------+ V (RU_X,RU_Y) XSTART YSTART XEND YEND X1 Y1 X2 X2 X3 Y3 X4 Y4 := POSX indicano le posizioni dei punti di controllo per questa ellisse. BOX_TYPE := NORMAL_BOX | SHADOWED_BOX NORMAL_BOX := 0 SHADOWED_BOX := 1 XPIVOT := (float) ascissa dell'asse di rotazione di questa procedura XPIVOT := (float) ordinata dell'asse di rotazione di questa procedura ANGOLOROT := (float) angolo di rotazione in senso orario. SPESSORE :=(int) lo spessore della linea che costituisce la procedura in px DASH :=(int) intervallo tra un tratteggio e l'altro: 0 indica nessun tratteggio. ID_PROC := (int) l'identificativo di questa procedura NUMPUNTE := puo assumere i valori: ARR_NO_PUNT ARR_OMOL_PUNT ARR_ETEROL_PUNT ARR_DOUBLE ARR_BLOC ARR_EQU Corrispondenti a nessuna freccia, scissione omolitica, scissione eterolitica, risonanza, freccia sbarrata ed equilibrio. ARRW := (float) larghezza della punta (immaginandola orizzontale) ARRH := (float) altezza della punta (immaginandola orizzontale) ARRGAP := (float) rientro della punta /* (se la procedura e' inserita in un gruppo allora il suo id deve coincidere con quello del gruppo) */ TIPO_ATOMO := (int) Ogni elemento ha un numero identificativo pari al numero atomico. ETICHETTA := "etichetta" APRI VALORE SEP FONT SEP DIMENSIONE_FONT SEP POSX SEP POSY SEP CR SEP CG SEP CG SEP ALLINEAMENTO SEP VALIGN CHIUDI ALLINEAMENTO := (int) 0 | 1 | 2 Indica l'allineamento dell'etichetta rispetto al suo legame, se esiste, 0=sx 1=cent 2=dx VALIG := (int) scarto verticale tra la posizione di default dell'etichetta e quella desiderata VALORE := CHAR* VALORE* | APICE VALORE* | APICE PEDICE VALORE* |PEDICE VALORE* | PEDICE APICE VALORE* | "#"(nessuna etichetta)VALORE* | "."VALORE* (idrogeno verso di noi) ESCAPED_COMMA= ESCAPE_CHAR ',' ESCAPE_CHAR = '\' APICE := '^{ CHAR? '}' PEDICE := '_{ CHAR? '}' LISTA_DI_ADIACENZA := "lista" APRI ( "legame" APRI ID_ATOMO SEP ID_LEGAME SEP TIPO_LEGAME SEP COLORE SEP COLORE SEP COLORE CHIUDI )? CHIUDI STRINGHE := ( ETICHETTA | MULTILINE_LABEL | PARAGRAPH) MULTILINE_LABEL := "multiline_label" APRI POSX SEP POSY SEP INTERLINE SEP LAYOUT SEP ETICHETTA* CHIUDI INTERLINE := (int) space between lines LAYOUT := 1|2|3 center left and right alignement PARAGRAPH := "paragraph" APRI POSX SEP POSY SEP INTERLINE SEP LAYOUT SEP MULTIFONT_LABEL* CHIUDI MULTIFONT_LABEL:= "multifont_label" APRI POSX SEP POSY SEP INTERLINE SEP ETICHETTA* CHIUDI ID_STR := (int) Identificativo della stringa. CHAR := (char) un carattere | ESCAPE_CHAR CHAR DOPPIETTI := (int) numero di doppietti CARICHE := (int) la carica dell'atomo o gruppo POSIZIONE_CARICA := (int) [0,1,2,3] la posizione della carica secondo il seguente schema: 3 +---------------------+ 0 | | | | | | | | | | 2 +---------------------+ 1 EL_SPAIATI := (int) numero di elettroni spaiati POSX := (float) ascissa POSY := (float) ordinata FONT := (int) puo' essere una di queste costanti : * 0 FL_HELVETICA - Helvetica (or Arial) normal (0). * 1 FL_HELVETICA_BOLD - Helvetica (or Arial) bold. * 2 FL_HELVETICA_ITALIC - Helvetica (or Arial) oblique. * 3 FL_HELVETICA_BOLD_ITALIC - Helvetica (or Arial) bold-oblique. * 4 FL_COURIER - Courier normal. * 5 FL_COURIER_BOLD - Courier bold. * 6 FL_COURIER_ITALIC - Courier italic. * 7 FL_COURIER_BOLD_ITALIC - Courier bold-italic. * 8 FL_TIMES - Times roman. * 9 FL_TIMES_BOLD - Times bold. * 10 FL_TIMES_ITALIC - Times italic. * 11 FL_TIMES_BOLD_ITALIC - Times bold-italic. * 12 FL_SYMBOL - Standard symbol font. DIMENSIONE_FONT := (int) dimensione del font in pixel PROCEDURA := //AGGIUNGERE ID_ATOMO := (int) identificatore dell'atomo, identifica univocamente l'atomo all'interno del gruppo. ID_LEGAME := (int) identificatore del legame TIPO_LEGAME := (int) tipo legame * 0 legame singolo * 1 legame doppio * 2 legame triplo * 3 legame "verso l'interno" * -3 legame verso l'interno al contrario * 4 legame "verso di noi" * -4 legame "verso di noi" al contrario * 5 legame inspessito * 6 legame tratteggiato * 7 Legame doppio solido + tratteggiato * 8 legame a stereochimica sconosciuta bist-0.5.2/doc/bistlogo.png0000644000175000017500000002142111025523004014124 0ustar cagecageJFIF,,C    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"E!1AQaq"2#RBb$3C%Sr45D/!1A"aQ#2q ?٨! (B(((! )ѭ1rVYt&|Z!2@[yY+c%Fs[ye/f >)N}0]iV55ݞ$.17+r-V]O>h,=HZu&|fʚ>3qyTґ+sXgGOJC<ޕ!E#s䂈6rNxZp*&8OiB[H;ˊ}f:*@hkN9g6!nT %G G@}*^3RrU0m)OQ3d:µJ[#se$4ɕz9As7:~l##XZvLr<;a†Rc';_9_7IS%!JRpp} s1%(e7Ww9W py*)]D# ^5xӴw (an(dGB+==9sgj\l\Xɶc |T [ '.b.qՑW?CdcmJ 4jmz 2fj]geؔy(N ЏJԫ[ M*JKjA>p'iR,JGu$'b~;_MjNevVP,TQE_+QD!EW9dtZ5=MU]q ݻqDb(VO͓rqs?#6%#JwW.G^e\;mzL{d6I߻tglkKr4 s c5VEƈp_G |Ƽ`W۹Ÿr5E}8x:p8瀄,3%%D^O?nJl5)#8 @Feu~,Pkkvc_ҭR1zjm[o w٬@ZX%>=Z۱ؘK0$t)#{MMJ J !#J9Xi~"V1/fQYX3%R$8$#֙ZDTH%[[5<*÷X'뭸OPP2_Y38Qs@n!JIΔa9*':4w*F GvNt }xVX0>Z^{Xh<9o7ar]Wvꯥds7ó_[u'*9 |RWA+ZG\Al`dv>NK&짃IjO=#6{ۈ=nW>>UDlg c1*XQԄ+O#[f Tj}#8ɫunv4߻QJ p+ep 肗XK)IgqҮ5]>tUJܠ&O"g\7`vRRGWB=J42sY8݄Er3e6$ Uoj,~$<]DS܀F fŝ%  Jp|WtB '=>5NMd/q;p+-1m(JFTMz Cd*LX(t>x- AJWQʱVSEG_LmDW8!^G? H,bK-ilB@Fz+o-T)Xޝ5ec+PVR9<5P'E]k} z;r$#!Ζ7?[\]kڈ}ƋsŰsoa>ۭpx=5kMݿJR'H~'L"o\rnN  :a 3EMɹ 5e8.cTZ@m*͌go٩yU'2!B2H@$[ZKTwy4}q^T˜ܦTC''Qܫ=AAj'ғ,DRBx_;.-nH@Qӓdži͑-9!K@R1Ҷ FsqnԬgw+. 9~H5HnSEI S,βiJ 88|c"! C*BЭh5$@c*rviM<*jƶAsS2Zܨ ujbG=(ՇRH<v"ഗJp-I}\~-[V)e.U<!i j#ereճ+ IIA)5ŝM);0 tzt?NFx-JpB -[‹AҘ'!ʹ9:yJ¤<L~ӗP=cPaN&dĎC.),(xzoP2L{ZN6:CZ\I5VQ~esxGySu `9UiS3fL~I TԮnaČ3\+Li,KNJT&Ņ.$ֳH`[";-ƮIS+Z䨜֜ǶxԂ-"1s+- JG5( 2# כkgG-^@fڢm̈́'NI> x|#r}?ec#Zt+\D}3*\V.+.'4).oPCJөX УU>~ ٻqO2zֳW81 *ou?kaK(QY)<_fq&P1Ȗ+s-e)-8c+#֔O69ZܥcV Qwυ; ʰZp|DF uSIKJ cGӯ?&*d̜^XR> 9(~у-qC5쌅žcӁեo?yej3hӭjPx\Y+0uqJ-8dQQ؃I֖b6.!)R(P OO2@ZyWVL5̖TG{X}HZX'j6/$שR \BXKdwΜl$uϗBۢ?4[)$lS݅)ImT~J@F۞^>5i烝wv{zc__3Z @A{"x,yJ%熝$v)L1/ )Gm*\M@ӏRE9rr+oӬ2|1L VH8Br@'Rp1!)Αҹ kV?qPJrb|nP6 y['ػEsZޢ#YBR H;vi%LѴq2WOΛI(b&.0RrU/1]FN@q|x jۥjDLxܫ0[%a aM >8>^OC4VbSh A䤝5EܾjܰI#u`(݈ޜ爤hX.dqwҐ!#e'qU\wp?-W`*OH߃^"k4QElVc;\'?iGO ItS5W6SN+m`IPP<]Q2H07TGs*d )8ܾ5,۲oS6Nu 5T+8N&jBQ-UMkC> 30dxy1X:>2&,A8(wHT2"\4FNjp;:%%r)AZ@$RO>uu1I'_|'b?wjl P֡KY'ijə5>QC>niy ]O-Q.R@(Bpo| ZGu ;&Q7|j~-?i"Ժ%z Oi~J7ݮ :xzxʾ¿0n(~_:er%%HJR0WUUKRNwgbBd(Drtam+!g.VJqT#:rW2Ǘlq]1 vI>OSUXd4o\r$*?[&n*@4go)8LAPT|!lK.2u%~k8٪QU?G}Dk;Jq_虯E&\(! (Hk/oqr2ϑRH&[lv;a|xum}O3W0! (QEBGnXlrOlHlm/ܥ3/,2Hկۺ7('D$"Q,GV?ĭT&KRr )?KRu]iuyהuE Fu'?#-cqN! z>gqnhx_ s`ѨlΣ pB@pq>>ȱqUʘeN]yP?ҟSUJ 'Uʮ=9ɷ@Ͷ\V@%`y1U9Tz$s'¶U%`kxQʏ̜y gBriNds)H1$?Wqsݡ%K$mh5DY+l!CV` XJ٪F{Si!y#uSXV$D]aes?ZޑSLC`c sF7jBh.QEQD!EQQEBQEEzڒ>Ij|`XQ.xU1M" ]EU'@cIq Kb`>NMOh +- Bq 5 .>H.W'm˝bSJDFլ'<}9OI3ى^LWLj:!5<.]JL i[:AAW+][{< Q.2ʣney^"u>8Wr1E:G~R_r$y`oXK텠#"r`ƴ%e+?:\MLHu\G*k@'s 's4zxF,f]2:;.Ĵ"JFSQ;։hc(<-n qiCjyΚG\~~ZJZh8͇:qP㡩nO{=}qt;$Uh;lq;|?j*Cb:k#bZ'9'rIs[$F-6qB˩9ۘcwWgMZW޶?VZQK='ʝS3ivY'41ѝH~׍[eA._-GK*QmY͡655 Ċ8Ki$+~EZ d]$(nN䟕' W%ow e[EhB[BP# JFiM TQE=QD!EQQEBQEQD!T(ij: ÞjIEO,]pՙJunRPAK$$>`Ҋ( (̵%iuR,d(`C8yMT$yIE]1S*qŸZEzz*$Ǐ]-J Bist: manual

[bist logo]

Manual

This document briefly describes the bist's user interfaces.

The main window

The main window appear after starting the program. One can see it's divided in five section: the upper menu, the top toolbar, the left toolbar, the canvas and the bottom toolbar. main window

Menubar

File
  • New: open a new, empty, window;
  • Open: open a new file, existing project will be overwritten;
  • Save: save a project in current path;
  • Save as: save the project in an arbitrary path;
  • Export: save the project in a image format (PostScript or PNG);
  • Quit: Exit from the program.
Edit:
  • Paste: paste il contenuto of current buffer;
  • Undo: Cancel last operation;
  • Erase: delete the element(s) selected.
Configuration:
  • Set Values: configure UI;
  • Reset to default: Revert to built-in configuration parameters.
Plug-in: Contenuto may vary
Help:
  • About: this manual;
  • No warranty: Display a (no) Warranty notice.

Last modified: Sun May 22 11:29:39 CEST 2005 bist-0.5.2/doc/tutorial/0000755000175000017500000000000011740261236013451 5ustar cagecagebist-0.5.2/doc/tutorial/bist_tutorial.html0000644000175000017500000000673611454302145017234 0ustar cagecage BIST DRAWING TOOL - TUTORIAL bist is a drawing tool for chemical structure. The process of drawing chemistry structure is described in this tutorial.

Introduction.


A program manipulates three kinds of objects:

  • molecules. Molecule is a set of atoms connected by bonds. Both atom and bonds have characterictics that can vary.
  • "graphical" objects. It consists of simple graphical element such as arrows,circles, bezier curves and etc.
  • free text. Text which is not a part of the molecule. Text can be more complex than just atom's label. It can be used as captions or notes. Newline symbol in text is allowed.

Drawing chemical structure may be difficult and take lots of your time.
Program allows you to make it easier by using predefined templates.
Templates is the very powerful tool for creating new structure. In program
templates are grouped by several categories:
  1. IR_prediction
  2. RNA
  3. alifatic
  4. aminoacids
  5. aromatic
  6. glusids
  7. insatures
  8. porphirine
  9. protective
  10. residual
  11. steroids

Categories may include subcategories. It allows user to group template object
precisely. So you can put cyclooctane template in alifatic category
under 8 terms subcategory. Templates usage will be covered in next sections.
You can zoom in / zoom out. For zooming you need to click on zoom in/zoom out
button and then click on draw area. You can do it with Ctrl+mousewheel either

Example1.Creating diagram for two-dimensiontal structure of the sulfonic acid or sulfo functional group.


Step 1. Click on "Draw single bond button". Then click at any point in draw area.
Now right click on any end of the bond will show you "Atom properties" window
atom properties window When "Atom properties" window appears, type "S" and then click on "Apply" button
and close the window. Do the same operation for the other end except typing"S".
Instead of typing "S" type "R"
step 1

Step 2. Push left mouse button on "S" and release it in any other point.
Now open "Atom properties" window for the free end of the bond.

Step 3. Repeat "Step 2" twice but type "O" instead of "S". For each newly created
bond choose type "Double bond". Right click on the bond will show you
bond type window. In the window you can choose any type you need. In our case
for two newly created bond we need to choose "Double bond". Bond type window looks like this:
bond type window
As a result our structure will look like this:
result of third step

Next: Hotkeys

Author: Valov Vasily

This work is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License

bist-0.5.2/doc/tutorial/atom_properties.png0000644000175000017500000006220111373740772017405 0ustar cagecagePNG  IHDR`>e;sBITOtEXtSoftwaregnome-screenshot> IDATxy\T> 2 ˰ ↢(h⚔[y]^PRļ7^-p_"5JM\"7PQE6Avf??; 3s=y;G8{sA$;c@!^>ĮH r»yVLB!ބ [w/>>IPTQߝC!ڭ^Ѷ2ɰ47ڻʑITv,|TymE!FyU}EuKgZX"3#.w/g.F"BϝGg_0o?>sGρ@dƧ HBNm1BȝO W8-]IEߒGn#2m&Ws3(yIѣ{_l?&B]nn`O_ͺSRZ.ճ~ʍʪ-8N?.oYhm!=~jCg̑yE6"Sâ"a6AB:A4ug86$a+ 肝-z>Y!ZVΜ9]+2{g̛{9$IVU雞nWVK2]qXZƭ$=OO/ڧ 2L*Lz՟ӸP'I6[ڍf1bXfEjæ".ôd0]# PvbV(WTuJ*J2bV(TJ6e)2w9lHxEP:9劲&|gOZs\nì+;ՒJbZ;VLKW '[\^`OT3~ W8Jm eyEp9K{XRZ.W*,J,e2;*;|~qH03%f?+,op\c'#"ZMϦm]74a0%Z q{/@b^l $ `<]pqv.KGVy:-ٰd0ӪZ;3H@dnq̶G? +oߋ (1a}fupo44(3r=#3k-?ici:}QyK&\ƐjNɶ8GR+$3QbncO#s[Xk AY~ɿjk 5㯫[Z[v˪@O:כ{H|$?V&G~ٷo]6wt{m|8b[`oTŮVbSʺyn#qh܃l]xO][AX2$A<ɎOV5-B$5 :th{+Zڲ9\-ى9l3\[z>3o4W;ƞ43[Ti! M8ʇj$E|X eĎ'?Axh4Z&p1_a>GֲY^qOT a%蕞@Byu QexfvӃ{-5$)ΞZ2cȨν]@bS,&A@^IUIe= TSp/ ҲT3_-_W/A{=m&ߦ8}g?{V6VbyPۑi#TRP( m{Lլ6UAZ r2{2Αś~z!z]&A*U}d\ IjvINl-BHԨ5 WDn ãYڱkx\nmjQk_/ACzُqxi&03Y=i ʼURQ' \EQ.,437[p>3O"VVzoA8,$/.>uww8CiYixo+"=mmz^ODFm]j$YS/=W7@PzX4Ϭ"Rm'w˓>}B]NlZA794A2C|:՝4-BH~H8lN_. ^ҎGS'{A슘\6\om]А$&6(L&CK>g訙9%J ləfӵ[?\iɠFz̧'cJ$ ?_7Z=DHiO^߷ـ=D+bolc>PoiȦdk f>9hOE.edvH߁3Ptb}2i: j=L7#WKr$Z5jZY?a3zK*QkIqU5*O~dcfVζm"k6Lhӵɚ$$i-,yf3|$Ir+y<݂@pn;e &V}k45{n߹T*\ |_r&0 dq]=G'#]f\JgGI:T8/P)hjIA$j 9lH-p=D}S},VKY{@_it>aY iŢGUMf^SMn'@AYu2g4V/E$W7 #cci !ޱ.++zPo9ï-QnRO귘$M+qجjyS9 UA U[0qXZ-YPV-S2%ś~Я@̿b=m6:5$X\⺺[? `#92`dG7 yqNgYYz 5>#% yr_ٶqssno?%vKdceȯY9;J̈́fzP\5rSkF[XVs6㾩\s##+K3==W&S2Y[hڻq9\< cwdTDZ__J ~<5WpKh@/ $5j9es*`@ś"?vν:ͅ.,/x_@x`0Za{ԒҊU*d lX,\Tl$V [wÝ畔>,r8{yhƝufBS7WY7nR(TXfܸyo2s &!XY[=yRVKVTT*U*Ap\VBj#Wj:aCCJ"s%=OPG1N&ys9-ĔTIӪ_S{k69w#j= D*UU(uZRU={6l]hc~߀mC'$l LKWgzYKFڼM[YjnOӳ^^= 5 fV XK$ֺ$I;՚ddw|L=d|7Yl3Y&C M3ǣG5(Dޘ A20A.@'ȴ )lvzƍ?\ͮ`1\6`2 Ai ڥ=S#X,Oᣣ'wP2$IRlAƣA=[I]ᘩyG0WBSfV?kכ{#BmC####޽90Gwz+XM*~tJ_ w`!Px‚uG|@ RiIIwlhE! u:  r\.p8~mW.TTgee5~ "Bu/@Gc1 *MӫR_* V+l6[;B$"O_# d29A$I&b0A" &H ! .&&H#뎘B$NBF g"B`D! jժ͛7wNtwB/]޽{wZZZUUo=h J-jj[33|8j)&M@Z ?e˖988\z[j5mڴ6!jH VJzM-_>== 666::ɩ!==]&EEEZ:,, e2RLMMU*Ǐ &4͛7p8".|!PZq K.)]>}zJJJJJ#;vl?8ZRRҠA9k׮'O>}*rƍS[[֯B]+$xbPPŋwܙL}@o޼͛7ADvvoh"zQQQ={p8$<<*511cǎuV+ng hZw7 o\dnnsyEGGǶv5k͛>|HUkB4hБ#GvuӧO@uu5kƎ{СϘ1qz۶m۩SV\ۿ+VܿYPPкuLxUppٳW&w^v|t9Aj4#FDFFD"HD~wӿzƦG[S&5ߞ?~}}ɁM._uegg744=+WDDDTIS w ݟ?̎ݿ*zv+00Ns^~ׯgdd9s櫯/[la;ە+W D sk%%%oX,f0*Zr]TyZZZ;wBPRۤ{5|L&ij|囷Z0a͛75 I\.HXifGrrr.]4r6GhϹ{ܹ;wtqq9s*6}u=NrvqEEEu~G.AZZZ\plB-7cƌ;w>}Ν;?3Uwcǎ'%%%$$P[]tiѢEhmkyyy|jGrӦM;pÇmll?Rߜd{zzg/_ޞ`ܺuKP+u>̎[(ܫW~7aaa{nτ-M޽[QQQXXHç'޽;##hΝ7ٞvSTsT=I^z֭277={k ,055ݻwoIIرcy晛GGGs\wwwjb7TVV^~]V=&&&W cǎ.\%zfϞ=vSy/]-,,twt˗+=t… mmmBabbbXXXUUUXXq!^Nsa0Be…&Mj甖fy7 IDAT-MxW\D'Oo-Z[eÆ ϼ->PyyyW\|XWWwdz6"jNI菺x뭷z[M2s͚5VVVѡ|>ǧg9͛jaaafruuUTYYY֭[ףG?8//ҒZdɆ bG}DuBMR(}_{|_s^r7nll6;$$$$$agtڪUVZ`P˖-p8}=x)jYF_P]Fݙ@]4m\t ˗/_\oI&M4?!=cƌij^ώ;1/C! x{m V!c(L|1BȘu9Lqqq?CwM@٬I]sz)3!Y{{Ћ fg"B`D! B !2$B!d&HBL! B!0A"BhOyvFX@PWW)))! Bnnn_ Xad2x !2$B!d'Fijj Qyƍ`ƍz5qBs9--O>SPX_|Ŋ+Z FzjeeP(,//sw]ݲ===Z9>>><<|Æ /^ׯ_{3gΜ;wZIl~SL?SHJ.yǎaaa"aѢEV؃DH`|kذa'N ~;f@ ;55++\.mjjjbq߾}WZꫯ۷v+}ںզPbAj*A={lI|1bŊ`ӞFڱc`޼yvO322AAAO?,]h=H>ooooaaAq>u߷%tWR,!:&H#e0ՋZ?~|@@@AdRbGCIR{{6DkhhdԲ@ |2gHPZ:&VVѣ呩#lmm}U;;64F$$''S%Ǐג$]OW2șvۃΝ;UUUm.$駵kN:n+ghINvbRêgool]]]\\[}bP>x￧,XpRRgSw%{ yyy.\ }#u#Ųrrrj*&dzsÇKJJR(0~> O>:x`JZ\\lccCDtHԀ*U8t-[+n޼yJرc1YY0W.4h}Ec?ӟ9w7nP%AAAW ܹt&jID<ͭU3qϝ[d &H)I:/^?&lL8mW"333s:#=zԒhǴ4*;'赮0|3g:'((h>>>wR>ݻw'8;;S}СC1YY?l*lff&:;͎9<͎ /FŵЮ\B駟ٳ믿;hSPi쪫Ą.!I2;;@xxykcFEEQ]l6e֕+[ns^SHa*MMMvŋWA|X,hݷoСC@x<77^z988>}zjF3^(Lp`@HKR53tɒ%_5|ڻwo@|A9rDwb%ɴ 6@t~m믿N$&{H#GtY@̀ dn>`r7 xxXa 6d[ }zOʼhM ,>j //( ^nެU >|[oξRի5ÔiagO?Tͥ#TWW=~X ÇZuX,>S\CYY\.VVK+* fԨQ Oyʔ)uuuY 233*++kK. (--}A}}ǡbK[~dB]qٺxXPt>׾~*272͵Ϧ/>61qv*&M/`a i#$ vB&K g;tYQep %߾E$'  DԔzFi&;ϧt26 NgjrJ- kjjzԩhQȢE-tAXXX^3111{5nBuA!؃4 III## &ת[1K!ԍ0Av?:BFA"B`!:o;$ 5<{ A0A"PWmgz.XDDD{[c藓wqk-L!E7w;J_T?܁ǭU$B!d@ /^ؒj.]]wUVY[[uwCBub}8=LY~=DJaaa۟)J5533lB%`pn4it\.>gg[n;wAx{{988PÝe2YTTTjjjLLL^^͖dk֬H$$I%&&7|sԩx}@||<FGGQw5<<\&)TR9~Pr|)))'((|B%gl6moP[|'No]y]IH\.vF3|LV[[{ox2رcJz͚5Ϋjo޼I%={vҥηoްauwgpJ!V=6nvRRʕ+ CBB<<HFJMMM]]YƦԌn5ICV;`%K@NNή]j&T*[po~bq^^\.Blmmvmp[ccP()((h4^^^T9{k׮5U]r%..F$M<_y晛GGGs\wwn;}kΚ5KVƶ,Y$::zl6;((hȐ!/B1۷oڵG1 i/}V/uknܸ`)SL27]#|gM}Nj9siBeF*MΙ3gΜ9 Þ'5~VK޽{EEE^^^J2>>̨~BF8[MN~V)((ww 64u B! yGGsss۷o_w!P,VB{u$z$%%uTjGBN tTjG6B\TS=wB/^D! B/UVm޼+7ݤ{2 B}Gz<h(kddm>>>zjo۪{rx !ѤIa*99Y"ꁨj?O6cZ&ݻBϧJj/oPo7"I2...11T,SNj;99544d2D{nkkk$I'&& 1cPeϝ;w\ ¨5Z޻\.߼ysJJ ***r˗/L&S*Jr񡡡]fL!dLO81w\*#UUUM0g.]6l011?~<رcJUVVJE5޽{[]]MV̟?_&|8qDݻرc%%%III Mű.--͔<oƌ;w<}tii;w~g411pmٲ6mD ڵ%%%[niQ"8ĊBFmҤINNN377rK IDATM>}ڵkg͚VcccuW-Xt޽%%%fffcǎ.z[:t|׮]km,Y|r64ḓlYQ]L۷߿zN.B4gΜӧw'o‚$Bns޽"///R_VVݍz$Bnjcbb }Æ b&HBm߾} p+B!d&HBȀVn߾3ځBV'wB3B!ҊMz|gzYۄ{zz.\[Bx[׃\~'tK;OԻ^H/ENX{Arj5|^== 666::ɩ!==]&EEETSNԸ>>>TpLT*SSSJCCClLfDsMMNN2eʶmrss׭[G龎(!(2333@ƍ*(ÇᇾVVV3fHNN\(H_{v`0x<^}}}RR{kkk"Ɏ=JW߸lwyqĈ~~~Ծ9RSBA{AU˓K,-V)dGrAAZӧ]ePXVVRo… h]veeeQ%͇-((PTT9lgY%f&E(!@ wIҶ d) ֯_3g|W_|@DDD1"22R$1@W ۸yl6MmޛE}=`(!jԜ#MKKkj˗b2I;~:]ru{ܹ;wtqq9szK,3|J̀Rbݿ.{nk5s0BuV rrr C/Qx{*ʫW*)Sx3fܹ۷*;;{`mm]ZZrBN|ĉw-=z+W6痢YXXܿB411pl٢׍3dܸq }mU-9l'Bhu}?O#{t̛7<>>>::庻S,X`jjwޒ33cRӧO_vYj5uۃExuֺlذwʕH4y_]]z֭[:dnn>{k׮ |7o={ψ# Vkf&BC,~-wV?kotw{BnC=j ={uW! B!0A"Bb*!ЋmrfےB roh!sjz@B !2$B!d&HBL! B!0A"Bt] ߳gO%BUVm޼BmZUUU}weeekʔ)Dyَ)J-ZxB\x -MG&Gxs纹)˗/oڴϏd?Zf:8?^£=mڴ6BunBZU#π7of0;vTI^^{5@Fٽ{wRRF0aBhh(Apܹ@mА.ɢr͛SRR8NPPPQQ]|9$XZZ*|ͩSv4*wppvB0a¿/**&&ԩS555...UjjjLLL^^͖dk֬H$V [~waQ\.]D.f! uՈ]( / 1D%K £QTJ|q"1Be 5RUS "lE1o:?Eֽgv.33|9\tK,/}}}Ʈ'N k}A>zl…" Paaujjj\\gR{zzV^& {{{ fϞW_/!\reǎmmmeeeJ`ƍ~R,**:*7<ѣ℄̗^z)..Ҳe˖_=;;[T˰x\tҒwww+_ɓЏG"hYgk֬qww\dǏ;wnHHHaavФў1c!yŊN"}:H*RQ-ryxxL&9s{][[;X @?z HWWW++[n :===Ӄp8IIIjܹs_|g}&Ju.3lc ѭƮ/OߗPZZZ_~mGGG.{ݮVDVVVׯ_~y<̂Vteeرcܬj5T*]j%ɹsieeuڐKRReԩSGRBffIx}egg w}R6lHIIommoΙ3g̘1Ԣ0P񼼼BCC&ŌBhjj r bʕ(>m۶6D, !|>ʕ+999 ,Xpa2.]uwy;33hb 8nw믿|r租~jccCRVZ}16qعsE"## !EEE)))G6·ۛOJU-)JA`+W|7.]j슌 Oqcbb^|gW+HJJݻw_p!!!A$}WԿbbb][WW~z.ϟ_~GUUUrr|ԯp9X111?Cbb_CCCtttpp0OڊⶶcǎG_@VVVƾꫝ|>xB˗ccc쒒]m޼/ى' `)FeܓǏ!uwHO7ߺuؕX8t5JM(&Vdq_L1`cN2ems\\\߿?=2.z.z{{:T[[KJNN} 6<@#}R2uq_L1`L&t9Ʈh1k.}U4}ܔqJZrӰ^lgg'J`~XL 4}/~񋶶6{tha#KJJ9%%%^ 7$SzM{=@#My{{P#O>{VOyyyTTTL6m:uTZZZuum._3G&ޣd;v<@#M-_Ν;󎝝em5q_L?Z2&2(([n:yٳu,DsիsӦMWF[<z:a;H*|rI˥IxhC8t0SQRRBIWL@`'!ON:# z=|0˗/ݻwϜ9YHǓ+''8EoNII6m}xQ!<;ǭ,jbd]ޞqpp̗'̔}q  l\ҭSTaxgPMi;2O\EC8t0h@N6B_.ER 7clljrrr 8zѐ'tgw Rd>mo#\([4 |$'n$ eB78tۼ2eN:J8tۼ2ea>8tgm^mXXZ@fffN4IӧO:`,* V^}˗/YؕdQsEEFFzzz&&&Rfi{1v-rҥKo9eeeF@?IIIƮNN:̽_VvzX%KE 魷bsCgw7x#;;{ɒ%.]={ YN@J0rT0g* ]od[uСVD{{{SbbbbqgggiiigggPPPdd$N㜜FGGe˖-Yd`111nnn핕[v-%|ǎ}6ÑJnnnV7ovrrwcbb^xǏ_tI,޽{=ۼ!EEE))) ͂@ `23o(a^Js,Rh4sn$.\HHHDyyyqqqNjT*UBBBLLL]]]DDɓ)oܸã*996((h`**11?nhhYr%!gbرcGNBHqqB6/AK}*ñ6H#˙7(%%%jdQ ƏOb[ѣG*jݺu25""B,+q8H4g~GG?#L6~s熄3fBWXq)j~@@\.wvv8qb\\oܸZw`` cN2ege9wM6)˗/ݻؕt!pE7|H%jkkONϑJ̠zi;;;=wyɆ E %'Ӟ7o+W 777kkkZM)Shݝ㕕-[l?Vʱc߻wvtt$ܽ{k_tWTT5ۼǏo޼I0aBpp&LWSS>akk+:;;ŋ\6##cnZt)!dܸq/^\ti{{޽{Y*//_d߾}Bw߭q/~gZ= eЀD Op8ۿݽСCŭ:tΝ;bx˖-}}}999˖-[d!wٳ'N(,,ĸWVVvtt̛7oڵ.kYD+,,LOO}2O޺u`A:C@zQYYڵkt+^p!!!A$ť▖-[YW_v!(oܸã*996((@Fȷ~+|||//oƍ>;w!Ņq񤤤^z2~BCJ rSZZG/1cyŊt jYDZaa!gϞ >>>藎} Zmmmww9RƍH$e2̙3ܹɓ 60 quu5X*++?B{ J ȉ'Ӟϟnݺ7p޼yY@IDATJIENDB`bist-0.5.2/doc/tutorial/example1_step1.png0000644000175000017500000010650111373740772017023 0ustar cagecagePNG  IHDR(l sBITOtEXtSoftwaregnome-screenshot> IDATxw\ggv6Y@: 6dpX8M1K;Fc9[~xWb(4s^*Qx= Jc¸Y4䳟eg7D}]-yfGB!wf#$^zc+穣zV!BCgU}Myg@U+B!^CRo0:YM<\}$ ~{u5ygU+B!cZwWp|qyϳĔ7>ʖZ :Vk wr!Bko7aZTEw1zXHhK3ޮms׳<yBDԪ `4KB#'ϫԚР E!4:}ai..c YϦKOpZ @ 8G o02^Ш=rS?Z.jK+kҵ5 >^1_kP_Gl-įI_`l&ߝsidU 7]6 Oԟ`kud`gkϥE:~|k޵VGЃEg=F@"Bcv8nLG`xYq^L/D}.v74 4T%ZQ >qBjKoUdP|`q\Ld]QT x<-"4 RSXSwjdrKA2Iz:lA>Sgat0v-ֻ3VL1u!X!bUk_76ډ:0Z w!|)*~K#BN\ tWㅲj#¼8NyL&kVV܇  qq9oOӿ?s/VeFXtʂvo39[-bh Jq>5Wn7:Vk=['M~wQueY{X4x!飣4ZJwS/OIlXm}yNKhU_5:Ckb?_,jv\oEO jy:mUV" 9:ymi.or-xoGZ0xQJ`^s(}ˤӴ6\nCa?9+5nz} Tַ.pv؈Qog/ N/TַFg4Ͽ81*>(*I8VbKIf8r};ƥ$3m{;ƥ$[/`c4ȻZv#HojU( FZ4:Zn/N r#[WXzr3*qꗊI\b$SpJ+[ZOmR޸Ӑ{fS]t.bqDXdz0jmG=lE|vhBiN7N]ҙ( XB) wS]b-!f,0"/%J݃}]G #)f2!!Yg .)zWcFvSC\_*UTUOr5!>UJAk븤$ b mUɏ@Yu:S`0拟/ ]ݬ7-w[( ADn>{$M@I*;#ЬpD(8z:0};j f)W)j=K7i6kjkuME-C=ھ|=D$ :v۳)w?cJIES]M@qF._kHշ(g_ A ,f`{IZVޜ ۑGaZ9sMǯ@ A%KUU&i"PkC,[nsܼ{BfrW$q5=tR`xX,XPX*u77+J\]5 +&+EST ì,\HdX6|GKGkkE/s&e`iHҫ)cTz6x!D`Fk, Y,~RtRt:,ti* rbcD!=*66Naa[IL3[ =ݼxU⢽R/) t43O¯E@VW h[zaM& 8."ɰ`T(w~:Vh7|F`8nܓUfz<{Ke^E!PwP iߗ߀n"['&>/D`iT6:!B (.MMfj&޷ͩ/BޢPi$IdyNPiZjD!E ==P-)}V!B-g@ B!% ΧzR!B;[,/ B=\X]B&^!B=/BB!P !BtAoddd+}2_ǏdEEE[۾s&}}J!z$lYv={̷_>...11ť+[nyV\0Nסo9vX]]߿ԩSGG9qĦM<<<AFs7f,]&Eu֮][UUe?]|y_}UPPP!C/\|9c@@<]\)'N҅W)z5{aÆ$ٹ^g;3h4[N-Y+BYձċ燇[l|7.\hd2999O=Դi:]QVq!3ydվ]ɓ}vDDFFڸqP(L4bN:gΜDؒ%KBBBZcǴZ_}U VZd2VVmT\.wʔ)UUU<oٲe0k֬?ӧ:5k|>kɒ%ST'O >UVVFDll…  ٴisN\Nn&EEEs,خ}N~,YP(._h&L/ӟ+B?u]v-^[`֭[- Ϝ9[omڴˬ\rذaO$//of͚ٳgGFFgeeYqݺu.\xw7o,˭^Uv>>aaa+Vq]~9(**4hua-> ,`vu?pT9sfvvvB/n߾V-ZdϯzjKtXz#͎):\1[bccTʼ,//7 dXQQQNV&88O>ڵk ]{9v\xqر`4,>-+i;v7ߤ߯XG8 o,..^v-C0}xxxSSSSS{+B1^VczsjKNgϏ$ɒNn1|ZG3aG^rD"aXiiitWcUCV\ID"a'Ε<%1mLT*N~ !~kWPPs~MlH7o޴Z$N`999Lݻ&)00\r~[ IڵkF+r9cee8555O?'źsNcں!]~9vPlk[k6czR>wnnn܅BWݕxQ3|vsNnn ^QTfJJJ@ <_|Ekk+dggWTTX=ۻk_}ս{޼yիYYY?h=ئM 233KKK?vJBaZZ'|rʕWGKLLϧs;wJ4ѣP(>#glݐ.abߢC?ԩS~momB=c] /n߾}ݺu</""gtׯK̏EψkӟD"QbbѣO1c^tޛ7oonZ[[bbb/_Nw͟?r<44 E֭[l23eʔd.K>}۷g̘!SSSVZ~O˗7.NsvnQĉ/Ś8qs=UE!c^hCfcC=P|AYY 7F瞛2eO<[dɒh#z@>}z uPQ~͛ uZIIIUUUZd2YoWo[BATUQQ1sۿ[zڍFg}V^^og7u-[0B>aW#B!PhՈK!BLB!z&^!B=/BB!PN"77WB!īF!MP(z!B?Z]eee=WB߯#,ܵg ]ޖ1]ڵz>}k]'Bg}.lbr=pXϮ| ?o'BasXc>1ֳd|e>̟OfŐd1cK/b9511;d̼<$lޡ^vXu?n0 ݃f>PBQTwWl0&i_|ELL /}Z=zTכkdrٳg Z[[u:DDDL4i\. ^7 NVyR Z6""bÆ cjZ1!Ŝ?L&Ŗj@ Xlٻ gvct:~'$[1dH bVrw%"cvd2qyi9BIII1bDVVD",R.zHU{\'8p@R<|0p8g}vڴiЖӘGhO.gff:tNljɓ:WO]^gk~􏾾;?:{ُf; ?éP0fUUk bN6L2nݺm6Hl6m^6m /ЉJv7Bqȑ_~?iҤ!C|}FEYp!:u*99=flՓ14ɴjժ / :z KXV}olNϿ^zil6i}L.%dLIsO>$N;QO${ E!:xeeeo__ߖRz|ׯ_̽tss+,,ha]PP0x༼<׹R{1cDPs[<otC-555&&f۶m;v0a/ܡzvX\\sСIzOKK^_c0 9v䈏?>uԞd:zhJJJEEJS+.0ôWUVV;w8K@ ͇ͥ!)KhnS[U:.33͛/vZE&]17lpK_\dIt"}ζ|>}:99y̙oD?KJJJyG}4{쬬R#FEE?~1LVc޸qCVLLLܾ}>h:Ӵo͏˜z1CBBǎd̬ɓ'|x޼y~Zdn_bżOƴ"͛zV* ˷}o|~JJJJJS~+;;ɺzfZc&gZlp)K@лWw 7(qe޽{7oެR>&%h3 ט۸qFi߁n'znڴIVۉB=I&g̘[o@ZZ`Μ96mM6m޼~b>#%z'c>6PǔJWW\e5uU̮yĉcYĤ 53s"ѣχadpʕ˗/z=I7o cv/tqK|Erww^W \ZKꚚ'$h~#.^daĈtw1^t-}݃b%>1Wh錭55wn݌9qPaa^߽{aVXa+r>#G \} :tС>gϞaÆu D!'9xd:}tRR}߾}@̷͛,b&%%_"&a^^Rb1r9EQC y-bN8pTẺ'>; DcO].ُR<<<׮]l߻wiӲ-bJRcƌ9t۾mʕ׮]{7/^ދ/r%/NohȖJ߯浶r\+$ Ckk$u csrz Fc1kmC?LW#3LV0hU|w_a^^ B"+Hn}Cnm(V۷[јw[n(}EEEyyyuULJgϞP!d_x%''O-A÷ <<|%%%s;ydd֤;wv4&}Q\{ssċݻ766ʕ+~G}llɓ'bqQQ߹s'ݲ׳k׮o?N!,dKi4BqccØ5Wfک'! S ߿Dr,8 IDATSEQWf+ $7! "^288 7g''anA&)88>\]]We:sΝ'Oa޹ p`qi~v9b844W[GQT4Ι\]p5zwuuG>ÜS.\p׮]CiiƲ蘘QF%''gĉ{[lٽ{wqq1\ 4|o⏐K.@ExDQFs4Tr˕f <5zRm ,0Vfy<ޛoiŋy%^_{X(D)))L=n]a :&á(!zS@ VTrL F?"< b9r=ڎ$KR Q*ZgBO($$d޼yK.7o^ff&]#!!/ܜsΐ!C ΝqF:ܹsW\vLzΝ;rʕ+wF&۲qcePT2!!!..V4%IrrJ?MMϘi^ӦMsuu=y*o#$-$ޠ[VT6VǺP`[⧞zԩS8%F Z4^l(h~ÑJ"o X4|𧒋+mu6zSЯ_?@`k. z>t,IYO;1Bg8xѭSl6{ۋZ[[y'9O2s+W LLF`?9#IR(kӧOoWWYe"@_Yihn֩t~mO?qՙ3Ntqqޖ-x`@XfMX  0@.[,Bמ8W[6^ͽs&~϶}y+BN$NjƍW^СCvvOX!0>r_HgVVVVYYIoxvdip@fta)488 "PrxFh{ `0ϩ# WZ:<;c#,pdlu[o981ݡ'ݻMMM_c@2WwC̿g~XHuupTiiy|ZqqqoߦWomwbrwpO.Amc޲eի ţиq}ŋu6lORO{GDDF\% //1cj2&C:ڴPh x[Odd$=|F[cnGȵ(@)!ċL70,>2㦬UV9Yf3Ù8q#vuܹPϻ &0iTFڨjZep:ձZTL#tg~ల} tN8̯kl\Z]fE5V57ƣ=ɓOcگx- 9rȑQ))u⥹ņ/|pXXX||<=ZVT|v„ V#_+iD$oРA}yUVVFO 0번i6h z;\T*lٲw^c/^l?>Bu\amЖo瘵=wMhwwSf>ȑ#IەJ(6yyӧ##*]khhX`~j^8p:m͊ /]Z`-80^b{AAɓ'g_iFD=̼u"Uf] ՗RMz; r-AuԢؿynĴ{OhL͚;N/կ_?OOtz>z}EY4ɋbXwq!zL'/mto#J`˖9 aR2b^te˖ H*L>:h֩y/W+755uDTԑ#G=zqMm<޼-tL6"2r͚5Ơo5+$LP(w˗k4FnnnŋmۖW^^N$SxxxSSSJ̛W:bn#GO~~OcZ@zUBH`??@777$ P YL"42'00P,/^8lL:KOOϱeLG !d}%^Ж{^:j~;V.]wNs/+zNjRi%1͟⤍=:22r͚5@Dz1`g9|T$nK &&Mm[ Ҋ?eIGek:6zh^O'|4zѫ :L6sLoӓQPH7w`SRmu KHƚǔk5w?*''n_U˘vGppűL=8uGB{8x9*ܶ ΃E}LYH[M/jսr=z`pxZN1aDo&--mξ}% n;vlJ :|ptthsrrJd2و#^y9|R2hР~~~Ğ=F} g/ qFYU}}}{e^J>uk?Ƌvo5ޖiӦ xq,|KD `hҋzKS,^xkwڙH"¯1 JXNx\qŋ?SO}6Я P/qxݻիﯨ0u}o$$Dt8W644-[ T{~~\.${..CO(mV qx:1S174T*Oիn 25Fr%{YY@ h;=Zx׮]oVyyyy@^yD"i 9ȯ1 !!!;uwwO4(..~m(YVW`X=pb7w1 ;3L&[fwA.굢'N0s~~lܴo>>2̢=y.\dddC-J)1. 2obcޙWUÖSE"WWW]4xf N]/.;h }lvpp0D>%aE"Iz5ԓ1k:]+s'vIY,MQSLzyn6ۮ5/CRDjjϤye#c39AQ6q!Wnnn c>1ֳk]a|"VgZݱfD!^hCfcC=P| zJ!B˗/o;n/!B&A轋Y^!Bhպ TޮB!= xuyP(Һ/2 F!PQ* F-^]zdu_dBd&c+KXWW׹ 9}B!d2}z;ZfffSSZ Bup%ǵ7++~˶QE˗/%kB!@sTʕ+U*UEEϧSbz}kZ˖-t}Jo㓏 3.⋽3B!U2 w5T*T-|>_*Fi>3oG߲mBkh TjvEQ,z/}>ჷel΃Xrڵk !BӚ<m2 cW իWw"8B!PhL (sK>_lll|z  -wOO8p`'"#Bu [}sdN:DH"HJ "B! dC>Gq86h~m۶==k:Ycbbx<=x!BN...QoޱcGQQl۶mrE… "(,,l!!!B!Իw5644H$N6Iׯ_N>MP(ލQQQQQC p8B!PCc,Aq`$ ߐ!Cq. B[_;$^.>pZZZ0B!Po  T;1#tRY_=sڵkҤIS!BKlذC Ŗޟ@V֕a1[=Ǐz+"!B>.=lB!Ѓ/Y؝B!ezgzg.ݲ-^!zd]-^!}q<ײe ++K"|СVc:ux!B<^.]RTl^tb]\\l"Pvزe޽{d]`>kWN_3B!Ppx[ltwwՔSΝrf¬ !B"}CdGEF!$^-!Bﳒx_W>1VEF!w5u ,/2B!Pgsp}]]]7"#BebS'O+(,,`K脄Çwb9m:'Ο?B!ggϮZt*~vx`{ 2C5!B}SWvvՌ/7 >[…SNu!BqVcvvvmF:? 0`Jfddgg;s6FF!x={jF:}b@Qdhw%4,?y} c$$$-J{y@sD!Ѓ^VW-]E[n+1 @tEHx ekk響e"#####LrX&[݋t{X{B=pu58qbR[?gxRfB"##"##O>AA"#ҧtڙucXͺv!d2ٌ3RSSƌa"vjB!zī0 VPS$d9lK"@ &M6۷aC V|SLϯܶm[zz:9''B!Ի񪨨g: j5`2L`0 zNh Zfƍyy{4*ŋ#x%:vܙ?x`(((HMMŅgϞ#Gdff&Erx\:B!Prjb@ `4j:JVkJ%\Ncl;p؉3PPPpuqӦMsYt)Sva2lr"2B!P_l6zVjJUNq8@QlA1r$1&brtښ5c ;w2܋w:2B!PxU&ZJR(---MuU55555̞={׮]0qDbK,1byĈFB>^%J`$:J455744TWWW?cow9PXXׯ_1cUVVZNG`̘1ZB^d/񊎎> *** h---- uu*>?yd;x{6a1ϟGO4 RbC#F(1"--~!BWW Op.$ͭNZZ嵴IR(=$)R ^C={3/E"B{-^Ò*u[AAO^7*nK_OK$Hoيd0+L&KpݺeBGٽbjpxƍ Ϲgrsl؁a#Bwtqqq- x m-- vщY<+"@!=qx$9~Ep.53sϞ=8L&{G>tIXB!43S&J;UѻH6{OJJ2 vu2dȐO̙3srrnݺŬ$ CBBd2YGc"BMN-$ :t[ZZNͅB=Wnnn7"#BqV/PM'!B}KPt9|"#B}ֻʺ}!B9N}B!2xuzyE!zN%~^B!,xٳIV?v [B! rj.7~-[H$ IDAT+U&'NľŁ !B,'/y O:}r0`@rrl6l2;;~W]r;Dc>)SYY)HƏB!8NxiZ8t[\\J$[ne֋RitC5$IRegƩSnٲ)..~uqcJp:jr>>[B!`x)""XRV>OP:NT-wmjl嬘Ba4ڊ̴xF|ٳqĝƌihh JII3f r !B"{ !ÇCn.IQӫj\p<h5j6M7i4[.\HX,(ǣFCkkk^^Ajk󟂂␐׏('E"x!BAd/"IR& il`kFWժT*.p9&FP(H4 |~tU,i:.4 I,$Id02JJbb?sR J/Hr/̽B!Hdȑ0DN`HNR)f[uu555UUU\_ Y\lbGEٚK4ZVjjZ `x<4* Ο?9dȐ f=Ţ(baօB/68ash5b/ @jE"kZSzK,*ۊU[B$696GTJ$///cB!D/Ws:okHTV8$KsoicǗk+mNk`0p8bX 0zRemf]!z9?tm <Ο"li!YQrM&ɤha"#qq4O[au:a`|hxVb/B= g yrrSddaJ˗zJ<AAAnn..bHd'j5Fz!m̺B! rH6c<'}||޽T*@ .>>>P(Q#˽̘L&:N-{gϟB!8/ I^Z$yxHJZjr)/|>F@h-N&%+**m^qcBEEyy93*B!ĩ s*߇Q:|_RT"f%>0uTlB!<^=Fi:ZѪU*ZϚ5+,,l֬Y۷oONN~FB=mZdNgJE!zXOrss|!Bx n:YEF!$^ k[!BXVVU'[!B}uuutB!ԗSV}999[/^[A!ZK&u]5rrrLYa!Bδx)מ={܋[K&u<[j. B![:x1)Wcc?C3|֯&>?v; !B@%蔫qժUpBȠ]|9<<~%fFҥNA!kEg]t%H֬Y#%Ipp0u7T*UWՏd.OB!:UQQA\lG>e˖K.g]]*nf3?B-^YYY|>F(jԩ.$O<1|.ĉx1cJXfju<>gLf23I&! DEQE UŊK]pVaU_BY ]0,* {H’}$e)d |crsϨ$o?sZJūk߷[_|qRRbq\"TQQ!"III"B uB/em-\B ^'N|7k}YihhPϜ9 k„ +DO>III} JLLt\s̙6mڢEZ8@ wU$Vd4^Ӫ̘1nظqX,SΚ樨()//w:TY9^M%Ԝ5n8QxM8q„ ^N:eʔLe~gy;]Wnnn0{5][k…rr'N 56B7x_|QDQF՝rV:mڴ3ftlxe|S}z{Lݻh}P딵Ngp2Ԩ=,$-yAzM&S>]Kwm-99KDf̘pBe㠎VU^<2>jZ1xZMjt\_|qG)X6{衇+d*((yBT&L<\[KY^TDl6'&&olW5}W^BTZX[uZ^+|c&L8ko8j #Rgj3]* 5.\077wǎuuuIIIIIId/p aӏ^jvX,:mYKўutY9YE >hX\Fm^ 3falh*k>xt:eneZ;f2@L𪩩{V 5?x)c2@7wŝtk;kSx<.,9t?AӵŋoذUUU6---K/4iRGu +xF,[vKccYvvRWaa/aÆ>(yylN>=!!=]r-tƤ\;ql—~={74o??`aa|˺kI";[D=v_<m[Ѷp_rÆy~vuO?|on~DCLW^9eʔvBa)!#+{' .|^kVZ ^"3?@xn23{,˒%F\`6ֹs>SmRrDErW;).nϷq~Lbװav?h^]Pr_-[6o}7FZϧxO>p6tD"D"61͎";ǎ Y{djgBO@wVӹd?69xQDf͚նU$D"ޓEDBD'Mo߾mh7xȱcǬ߃".l}vZ!?E*DO~rt:_.A+P}m֬kk""?hL/z<1"dٲDnկoȑ#ʚ5k\D)j9rT^\hO$U+R&HttC[cN> Ntp[o9hq"5"7i4;ޯ5Ձ@Ə ;4kSh-3 &"#w/])Vg9o{6]_?lXFko׋oEru:0hРݻvmzz[aG>JCcVW?VanP[۷7HFcj"gn!}7pϚ7'997-.QUUe3.B4zZy*YUrOȱ;1*:Cū[<Sډ'fIWEDz>))kꪗV5mMјD9۹͒{HS%4F(Z;͹[;͢T(tںavө3&O|饗6{YZZ+ 7D6Zr""z x%@%߃5;Di"F3Qt1F/Z9\iӦѣK.n#""/^|шNJ}>_ W1l[.W#*UHQVHc{A',hv2y+tOefftku}\peB6g0y 7ݴ{.4i_^xK[!r񖊷TpT-\v/F!1"^XdK/d0lnZ-_3}JߕpTeU#F>["_K3]K~fOO5zmw}wdddMIIi{lС7nܻloYY߿?,\9fe^u}fffjjhsgz ^N"""&L'N8ٳr-)R85rrr:~2@7L 9=:eI7뼖j@TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBPCÇ{XNmk&x;999 5Dny-tgg ^m<Ϟ={80pd܁:,xO?tf+{Q:ʕ+WΞ=[D|>Ǐ9Q+?|ױ-c*^eee^}U1 111Ҳ8q/\nݦM"##gΜiZ;}ut@*++[toNgfffۙW^~ݻwݻF ^eeeK,Y` %u 4hmhoYv^TTtYj2Fc; @ p> bccԕիW=]SSSZZz)kmJzwNI]CmO_G߿)bcc].WttNk[]@ "GYdɲeD`0$$$ddd :tfYѴONS۷IIIIII.Fmj<|o5`!C 0K=^WDz"222!!v[,67ЅZ7>`SWVVVSYGU–lRF-bccn7.p M߿G}$"W^VRng|ձZWVVVVVֈ#D$###!!!""R,s~"b6ZWVVndjg?^v󬬬wyÆ K铘ٞ[txy<Ç/ZRײe^|Eʺꫫz}~RSSFm&"=ZW ػw7l 'SנArڟ***맼^h=ܓnm6bt S^F](@ Λ7/z=hР .R׫zazE\tE^7&&FyQIZ:.**j-U<޽{͛i&1)))J^x˗/Zwݏ㚚޽{+kV0~^]WaaaԥԺ Եy#G(͛j t%FbaZx}7Ժt:III]tQYYYUUհa~ju8D.#\SSr233333322;Æ s:&)99f@OROZZZ듓!.1III~h4l6!-tC-/~Ԉj-\ȌFcLLZZ ^&******\#osD+''y-ts/I7뼖f2V 5?x)c2@7wŝtk;k6|ʋ|bxڵ֭#""{nj@jjj:TXXطovz޽;x0!!Wyy_|sY,믿[ni[;|ڵk?󢢢φ@ґ?~EDֶ蚚O/@5ڎj,Fnhhhskno|222N9rW1_]DFc\\fzmnPӕٳ'z/p6jo|ܹsdr\111iiimmÆ mۚ%"f9!!Fp6jW||A0u%''GFFԁO4=h6=^OMM-((xرc˗/wDb$&&FFFx|Jqn;&&2..`0&%%}g p6jcRj]MSWRRRddduu޽{;<~kZA_tE111`b1:9'N٨-Ku-^xŊҤ֥. uuuN3~x^6lذLժjM&rVEvwiuRRׂ =ZjڷorDTTTY;v V;p:^Ӻu|>ÇOI]J+l6?h0HQQѦM&Mt:NiZn0H]lԊ।y)f)i+111::r%&&jWLL / "z^D޽;ٶjƃΟ?"bNaTzׯ_bbR Z.LD۷gϞf 8KJ IDAT|>ߞ={~$u2L]III*Pt:pWg?S?~ꔢ+zϷ{ymذADl6[޽z}IIIaao4hPzzz޽ڶiZռD2zqϞ=t:z}iii0ul6%u7))Iն!0m۶m֭e4z=0vիWK6l(..IIIC5jM7dۻwZ ^>/??ܹ7nͦ`K~3u}G[nݸqcpF8p`\\\ddd;>'("z+~޽{.]tҡC*@kxڵKI]J`0p8VbQRנAbccL]>o̘1v=8p\zJKK8pܥ'0LNI 6 nСC^`0qqq%%%N_~J]AJvp(S䴴V-H|@ _i}>S]+zNȸꪫs ŤZlF1111%%p*uY{~ddfr86btCHbbbWweԩ_lZg͚u/9~v++DGIIIe˖=Ls^g:eto駟޾}{FF_e]x]/6eZљt^@zo={̞={"4yGy$&&;٪USSӱkkȑ;w\ziӦ-[]pannn߾}j s2-v^X:nرcǎ{{)**>}_'h3Noe:etӟ466+ͭNpiˎ~Z lĈ"N8}z6o gڵ[lٵkב#Gǣ8hР/tj4-Nzfؽ{t:ۭz :2x>d/~NꫯVXf͚O|ǟ|ɏ~lŢh!<Ǐ>}E]<[nEDƍ^M///YjU\\\޽ʄ+W"b4OهY|ܹs z}|| G}7EEEG8ql[7|7ߌ0`@dd#Gv^z饮 g6Ǐ\_=zt""b0Zn䫯RRWbbb|||ZZ펉JM|ƍ[n=~xNNh?~<٫S=w'|y漼55-eQFOO]A&**kj"xZ!&YS[RRעEV\)'k]'N8t萜L]QQQF1---::w%"v''')uk͑f9χ֣@' +x,[iԥTԵw?h4Tr8111,hx ^CؔKj ,8SK9.x<!d23\L]BTy}g"bv{III~~!把 z}DDd &iҤI \Q@!Wuu5k|UQQѴvUUUʋp7Lcƌ),,t8|6n%PciiiAAl>}v{rcccv{ -'$$2"Y__N_wW_LJ]#D.+%%%--Mח'''711%322Dѣ?ow߅@wR)))#GZZfkv~}lllll!CypРA"RTTqƊ 6NS:.TRj6-**f)qG_Q^^~Jr\C ݻNS;=/\q֭yyy-x<+..2dNMM5 Zcƌˮ N1r* vڵi&9ļWPZJӧ¿b8qh裏*g'M4f̘x[WW,eXl6[~!PMzzlMOO7Lǎ;qDCCNOOՔFq:Ǐܴiӑ#Gjkkտ^oAAUF=m4ze0nZ ^Z6##㪫ڳgω'333kjjDpt޽{GGG 6^^ JLL,))ihh꫏=`4ӭVѣuVnwȽ>j],Dr?S{h""""""lN_ 5Vk'ݬZGEEEȾ}N8_]L@_2dȑʳ۶m[dɚ5kl6[Ww sNC2y-YOMMU^oݺھ}'x+9錓닋;閝2Zvy==O@}!j8 _~fذa"lT"xUWWmj>/xAӘjVZv!#"`tW yW|>_TTl6>O566jZFzu:] h4>R~~}?CvuG8xzZRR(oZzu>}lْW^^L,۲eK~ Nqmz>`WsQv{CCC-*!gOdffu}%%%@஻K/4&&?|p]](Ņ?S} N[9AC GUq >]"ĖA#1T!CRaȑ%%%թsu LzS'bܹ399d2t:6^^~h4 -W,:rUWUTTl6٬h٪Z; @shѢɓ'7)))fYBMtF g|>_ˣ'Frv^?~|NN?jmgxM"2y۷@e-h4JR]!*4a&F1 1'' /m4mZŔFk EH[\Qw>6G^+22lٲeQQQ~_I ~+"^y<2jg4\1)&KLM]}+Saٍ^>2 /*9Lb:h4FFFL_nn")))@&ݷhMM͑oP^KCMwoTWpQmsolLz)6TWt/gT_M8x`ZZk$/I7뼖[[~b_Ί%|/R^^n6fb ( {@k&xt=yZao0ZWW:q|mmjZ&IÑF$5tе^+"NHHx<]}t*iacr>I(+GF9X :[IMM4hy7t ^1tЃnݺ/oz]w2AwD>-5FkZu:ϷN{)Î2Rt/sС͛7gdd\3hV+۷Oo"rQ!o'tz]4::%22Ma h^vnwkEʹO6Ld֪vR"„fF~p^9ugˉ6/F<~JkV|Ϋx_GEllljj`UKzE@(kҺNA,U1zݻdN(:+xmn]o݂O?mEEEcccWw ctU\+8Gx=5Z5-XuHF뷯m[%\Z%%%z6kߕ=$,umz\m]-paGj#"F|C;O}aeee @u ^ C-//VǨQYUzP^SSh#ZRRR6oxt:eneZ;f2@L𪩩{VnnnǶ pi~Gel@qjFdlWvQ3S7=Xeկnz˖Q#^٣.ҋ.g}?Hkddd* ZxegJNN5kn/N Q>y#@CCüyG=u╗uĉ^髊VDh^Uvf{3fPgsңˮO^:WJkڝ;wƌV.SЂ:zX!_U>YQc70fZ%" (Vxp&!f>R{{i0u5Ș1MePWϳ\Ue̘/]*0fQh*ш(]vF4?Mc'Wg,b1 yڅ11њU@6qVk^^f1jZ%B/% /F>}/䒤_14F ].׌3WRR("Ǎ{ DFc5P6&&ZјLŢ7""h#4'i1oÐ)S&׿߰u҄ hVh#)B/Qn\55Vk[g~̘1N"x9#{FE+++].N}QZ ^Mߊ,_Qӹ*ÆQBTVזA3fp m@S,0E+''G~x/ժ~?zfWnnθ#: @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/w^) IDATTBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/軺g^ay饗Zu}MM)GJ^*!xJ^*!xJ^*!xJ^*!xJ^*wuSN b:k֬Sup.i8 ^xZ';;Lrss[x#/9Sj9u NX!Sڦi 'u ͔f@{J^*aUpi0bZB ^_lZ_zvqԩlڦC~VZzQD6mtʑD\:a8CO ^"R\\:ϕ[E@TI D"uptvfשɡ/Rh=9x@tRm(:)E%d/zzxhNM=?x 39BQ!-+ 8j8{{G/:{Nə5kVRSSΛЁC 8ǵMy</ZO5Jgû=6SNU/=+s^nƻKLÇ?/TBP @%/t^Κ5k8P]]9xiӦ'xAeey֬YSRRb4SRRx ;w^RRbGqm9N5;Y]]7GU^Yf7 YYYv[ZZZw XZ|mیF鬬\nw]\\ۗ,YRZZڷoߔ£GH xG~?_sQ𿔷XVի]vl6Y~o~$Z ^k׮޲el۶mԨQٹ"dlCCCo7nܹs,YtқnIDjkkׯ_}׋RSS/^|;Sh"^SSoZ ^#GkDg---9sf 7n\vvv8M|))) /PyޜNw}WN2eҥJU)Xz"|Wk}}"R^^m6ɦ~EDK.IMM(Zn6LsμÇO6,11{UN%$$1BD^w…"8rH)//"lG}V\+))9޽?ׯߚ5k~TTҷt/@DL9~r5}QYYYWWgXZ8#fjeeeZF#GΜ9s̙z}K魲ڸqc\\ܳ>k6E)gnΝ;x`Yt ?dڻwozzRdtbĉ"駟666~"rW*jO'R2YVVO6=?rHZ?xߞ7`9s$%%)2f04M߾}EL !!'O{j bvjʕyyy"2nܸw2諯R1.qʋҦ/v;.Ьt֬Y"{.8ĶvG}GUfbnwygQQرc_|,WRE$99Y`߾} ,PG썌F2kΜ9^7==]m;;`IOOWF-iii111"_J% >4y晊ٳgs=;w|gi#GlذADt{VDrss"\y[oݾ}#G~_Lݻwk4+VORRRʎ;&"cǎK &ʬvvRDvܹuVd+++#fϞ,BsҜ%"bDL:^Ŝ9s/^|饗>]>|ԩS_^-T]vƍ"2iҤ@zBڹs5kǔ)SUL￿{B'n {w Po+B`-[&p#{'GGx^A@r7#tu} x_m;祥3,DYcIENDB`bist-0.5.2/doc/tutorial/hotkeys.html0000644000175000017500000000236311521672534016035 0ustar cagecage BIST Tutorial Hotkey

List of shortcuts

Shortcut

Action

Ctrl+NNew
Ctrl+OOpen an existing project
Ctrl+SSave
Shift+Ctrl+SSave as...
Ctrl+EExport project to
Ctrl-QClose all windows and exit
EscExit
Ctrl+VPaste
Ctrl+ZUndo
Shift+Ctrl+ZRedo
EraseDelete

Previous: Tutorial

This work is licensed under a Creative Commons Attribution-Share Alike 3.0 Unported License. bist-0.5.2/doc/tutorial/example1_step3.png0000644000175000017500000011114011373740772017020 0ustar cagecagePNG  IHDR(l sBITOtEXtSoftwaregnome-screenshot> IDATxwXTWΝr3@zQA6 &11h4˪1%KMLL#1놠bWQPDz8R{g{3;zιu`eB! 埄9ӛ(ψ>7jB!;E1u]z^7-;X9BZzL#<\(/܋y̝SQp2B!PihQ6U\;{O-3^P׬8qx7| gL&sXlevE,im'B!ƻfyA fD/thOC؅G"@kŜ O0Vf +g8+Z:/I `HBSTjMXp@P{B] 4wn}aywn}OB wPD?o`%&NAXLVGijx,F!dʚFNJU9y7=!9vKRD\\V/q~o6x{ Z#: Fg / '}!9f $"+ϥ~yVƕWߒXL?Y\IM#r&ׂW=>&6ĕmDu[BzN'=99j#Xn2ٽ˪ۍbputꓽF]jPdP׊cktjEML0jDYo,]d~7${..˜aFJRp8[Xp@Cc9HM]cMщq6.!sd 6,!iy[>AGXIG*Y]O 23L0*YUWn>2c?*uQ!F> !̓0B8,G%4G( :y']K` d:5C`2A]"=?ZH+~gQQl̽zX=XW#Xqai ڍ`~2[ _7>;jY#3nF3A4 +KkD!2KUHH<-4:-U-|e\* ^>_rY$ ylR[Y/EO jy:UD&Kt#&XNeʵ#ڍ`/J__t 4כ&Fs -So{Щ[߸xkCk^r!SDŽy,$:ԝOPY/[q.6d'?]xm&1&6(*&*$IHCxMHJ4?wm;&$%s/ڢwNHJ:1^Zr+hwF/ݺ-S( FrZ4:`Zn/ Oq#eW/(G=L^8kE8MT1I\dJ*[ZCg6)oi9uB0,$hB=TjmG=lEh7FkF0JsZfԧ0<$:uJgXD kbo)4Muɴ8z1& <}^x05!$X* q02oLs1Ʉ-!ɠF8NCcd0 tcfVZntl%x/m#՘U08wyK5US\MH`2 ja:6i$ # ̆GIf" qf V7(Jә  &.Q#|%`|?Rlez (6rWvfqXhPo]B/ t{&h:M26Ι.`9ν n;jlk3sܤ!RSFћ4zP5BHOc! _>2dozyyW :/ޜV\T׬tQlh*q+d冬Ka!p9aguV;{meoGEߘ'55A<(UUUX @oOwPo)cy ,dPM h{za"02b012X" F㭊GOy 9* azfVp;bGbGb/K&`0iqdqHkg(cTz&x! X~V7O2ޞ&ɼW*tO~Rt: p hbY#Bz|Ut@;-m}&"Xn 1֥K2nBjuНj+zG?BQQWWk]bk4H&3(0p$$C6"ZtkSu$jefލ` rNUWUhz%:|J}۲{!BA3Ny ~#\7 NN/D0#R}W6:!B(6I'Lj&9ݩ/BޢPiĮ)dyNPiZjD!E (ƌ/B!3 Y @qyA!B uPQ~-LݥP)Bߝ-։HeB!.ޮB!/BB!P !B`B!C z7۾׿{>Rz'nmνK3UB!3ڙN–uݻrˆ bbb]\\bNm6GYVlժU~~~ .tZZZǏձ쨨ӧ=No_=dȐ_\,''gذa?}NNNoogy&++UB!u~QVeeejzɒ%}}};ZvO prNMod2>E甗hF* BKa (Ode-,**O_P(- ޵cǥKƏF1..bn׿_G}.ghݺu}CBBCCCD"Q+B1^Z}gԖY,VΒ/I 8j(.fy+ ʕ+ǎj*X`0RSS@DDDZ X8W||qWww.igRRYuo0}Bxp8Gtɴt֭vK$霃92;;nD{dgXW^5oz~Ig$yuOXXXh+rJ[qjjjz)qNgktAQTPPP``l][rZYI[+WasB^uWEQO?_޽Ν;9992xERY(..裏~2 ***=˫k_}ߺuڵk?hr=͛󫪪222JJJ?vJ|~jj꧟~z՚ 6WGͥs]vJ4رcP(>cglݐ.abߢC/}]omB=c] /رc',,駟t7nK?){? cǶ{?czIxyymٲ۶m[mm-8pʕ+鮽 RS.;AAARXdWXbMf]f*++={P(LNN3+Yz {WW?OW\1ﵺ!vts?'Onll| ɓ{*BC,Z3JKKd1=ܴiޮHoѲe"##?#B:sʕ+g[tc⪪(VcǎޮT߂!PTUQQ3ϴwY>+n4?r {w<<<\=Kni/ޢ!v5"Bu]$B!P !B`B!C0B!!x!B$rrrz!B{IzqQaB߽$^ B!cժeXZZsuA!j;%|>0f۵1`]ٵ'BZ]e0;`=V,Bv\$;VlĘgZ_'Bb32KIIq&ٳ_z%é١'c۷$I&w(&g.;VzE:'N0 AwIwYm(GjzdzsΞ=T*@ՆM:uĈl6z1e2N)S9i0z`z"Pr*0LV[7<oŊ̝;;X,LlŤ!' Z-޽{@ xz .ٵnYOD^9qˣ$%%5*33S,EEg`V)DKO?СC*r{eeѣGb=3fr\q:=Vu2f!fr|ݺu~!z>^c2̦&HԹx:|@ ,ۻCyØUUU;*&d2Pxa'&Ͷm۶}v@l8c ^?cƌ^xn "//_-,,4oH$SL6lXg̘1ŋӧcƖ-^2dZzKWɦ R?]}|K/4k,&i?iM ef9w'x1֓$NaB%^oFYYл>C^a`e'[AAAdddG^^^Cݷo\LT`1-c `sm۶OgʕtC-99y۷o߹sI^~ճƢ3GL[Z`xg2;TQQRʲ˪̪#TVV?X,@7M:%ER,NP}t:]FFƭ[.]r;wۍq7n,_:Qe˖|-BYq̙3sfff>HLJeq '0͛j2f||;}QFј=\nlllk;~x'cfffN:k֬9zdѣ ,D"ZdnW_ >5S n fLT* wCo\nRRRRRĉ~+++˜u+V6wrE>^1~aB"bď7~lԏ.-[Xu9I 6mh4m;7oVvb"Pp+''gʔ)ٳgzA7o͛`[ly|Oi'bݻ7!!aĈtBN%^---`2Μ9`~ b˖-N[V16l`,RBraÆ}V1'O/Xljjr8**ɓ}S=p|24O].ُR׭[o޾3fdeeYŬJ;ǍwȑO>$::m۪U_ozyy]tI$b믿^ݷNohȒJ?dl6!I ɴ$3tk|[5h4VSk:COv5L&L+9RJ.D`\4HZZ& ڶZ_BBBјwe7J"""<==*Jڻwoppw7Hccۦ -A÷ pO>Q__ohBad&ƴ/ãՕ~μC1srrN prʘk׮Ƥ>ʙkonnvxq\GGG_zrO?d~})PXXX(3gܵkݲ'X3**jݺu`0$8= ;;ǐqXK$yzzzzz7P.;vhi;vl cǜ)l{$Eg8p+jtТc\7_ pd5NT*<<<?((W[BCC7eee/X,mNKK+((8sX,Gׯ_gܼ\Ro*+"""R'BT6l vV/)) Lc֬!ekȑ9 w{\.9Ѡz48y6Z4@RLN=577;YuUL6 6Ѡ񅍍3$;$cxuuuQQQtB!/qѯ`0H41 ~~~A gu6sj" N1a28jLcڵkԩS7N=ְM8C1-N](jˀ7*, IDATʙ9˶UV _Nr=0GeggO>}ŻwX"zwM3&11DzVޓ'O޿wNmݺuϞ=EEEp":4d˽mj\|/@0fz_Z5r~]] jhd MGvj&pl Cc^|Y^;&&hۋ E $s=m{n=tLEQ=1B/Rr9Йs=HF?2Q0g]`~Cx<'/(Ͳ!m[нs̡3ekڷ{{U]ݵo bEcZ]-Z!!!@BO;x+;;@de #G1rH??C1z{j;?.+J.^FGTjkD==Vn2bĈӧO>}ܵ\اbx\<&PMѠWi Ϸzxɳg@evc ڻUbdLBB1P(xx!zSݍP(Dy_w;e`NhSIlΜ9g2S#>ǝeǔ++'O*r 裏ډ`0_:ǽ")NC=`˗/X ##.G"''';;"##)ܹ3lذoڴ9UV[.##9k.\j*d[7m *oWVt=X,NLLTTcٳ\>ػB3\]]O:߿+yʲ~Cpu 5ꖺU!...EP(|'N>\ 㘞΃...?H$:u1y<^/v#8׶^~]?O{Uttuuj!&ٛ Z׫~l;cX_NLt1<?)D@Zap7 `tss;w\C+22?M N9E";;~wV8ա1k4͉1OBi/wAzX, r7n|W{z0Cؚ5)#p` ~#F,rl@)|lhuPrey%J%@ LP( 9r䓉EǏ4 zmL0`;dz5e=HiӤ۬!3J)&9vX텅2wߝ95cL7EQW^N8~rF$f͚vD&S S_HyY'ch͖< $# K Ĺz޲Ml-983u&wZ?b~54$$$ <تɳz+s+s1]Qgr/X<.엯5 `ba~~~DO1psssss ?텗}%aH ^M$IX~'NTVV:a$p[l Bu7/C&>Ow+oO^{%wFq8@ waGU@@oSSLBh՘@y$fhn\y(Ze|'HԱ=^ dxG";>))ʙ ?07(()1`łκ\nBBeeJJ:t3@ DEE9OQ=9m\ؚ5c6gr/lν<WP>ODbXiZFsk׮@||̙3?_?M@B\.;qFcc#y>JzK_3_NbvIB;*Bu!h֧ :|>#7@&X.|o3~>>>o=7?~4*x}M7ֹGOu*))cnv @LLLYYzoo/; ՗充?3{rbRuX_FP<:qo M.ݟ?߸κ>;J=d2r^ ϶eh9mGtֵВ$~ t۷p6}QˍrkY6 <O"9l E 2OiX|ꩧoʷf`''L[ WvNw`g5yQF޽VXp L`ҨQ1jFuc15FҩG&E! X@>q?ݫX>PWWpM͒Kk֌7o0N9?Zi5?7&)d]'0 thHHHll,=ZVT~vҤIiiiK.mҨ.j[?`!C|ǖ Vii)=ì* (lHHHȐ!CyrRܺuUO~CCktc掄wu6mӕODg}vJAG_[:vULz EZ1|ĸ ?^X:g}fY8pus- 8(SRr`80YťNr&BwHKK{gK3f305 >ui4>|{I@%CZ̍^mAsOߏaF{0#--{{rc[ ބBP(ܿ8!zL'/?Sto#J`y aJ"j^|+V ?V`zщFζNuUZ1W>>ɣ""=vqM޲-tQk׮7*+[gQ [̉BpV\h__FC?nzkKn߾=׷$Iz!Ц>xY6wѯtě6 -*!(|IAP"&/ .]m\&e]C:oW/hͽv/xj, 5wi?rY[[+NȮR?PFAFuuRl'1-⤍;6<<|ڵ@xz1`g=rT$iM fͭ[ rSSS>eIGek:6vXwww^O'ť݉?z/sCы^M/к|_RG<-zM-bh͐6&!oS6CΦ[:.r :\OKt Ps*rU};,^KVYWۘ.ݑ^Ԫ*{Z 񲵜b#Ӊ~mjjn߾=~Ç8zhddhiii󲳋RRRF+b!Cfe %:?#:͛7΢N+Rz{{p>8R1^ Fqxt8>!‡ B04I=).]tR˵;̮⽘fD]ms,'[,cMDkҥK|3gΔWBlj]v z_Bqqa:nРAcY@>lNpi{ӵd9{BrrrlN)2E[[:mڴ^cZ͐lIӶNuedKrrdAG_O+EaBOi?3ȧ3fwzvY/!h'ꎾpXϮ_>K~"}Ģ|1(.oƍ]%B߉+W6@E϶lM!B&zA˼.B!Paժ]B>NG|>nK4!BGT:_Vo#\"#Bu7'3[YͮƺUȡB!$+222juoW!B8\o^733Ӽ$vfff>"3?l7pʕd B!5O5ZJRUTTp\:***׷ݻbŊ˗/?`׿u<xa_|cF!jWJJr9jTTR[\T* v/}`g*##{uĉ!B}׶3-^RԲ튢(;MY^@'+aE}#nO,^`jժuaB!zedK,s\sk;zddd[[mo.&_֬YӉ!B]m+3ċ5/u_|90rvhͷ }5+aB!%l-:̽֒A:NWTTt~z~%TWWWQQەE!C[;\ҹ9;zb2_ݾ}Ssfw=5g9'=x!BqTcQQQccc'Bu⨲;wۗX.^(BBBԉ!BqWcCCX,Dhˉtƍ?̙3 1lذՉ B>4*2d $I`06,44@!PoJ6rqqq,+ .B>@3r9?N+))i7oy晉'޽{ʔ)S!BKlܸC Ֆޟ@V֕3PEXm_B!O5R%:G谘Љ'{+"!B>.s[W[B/Y؝B!ezgzg.ݲ-^!zgzg./B8kŊ)m|t&lB!y._Rټ(++rE{L'uɺr֮fB^ H$jH$Քek̟?alYB!\ȎB!ǵx=:Dt_dBīBȜou_dBҮ:UbEF!lSv_dB<^fj ***ۥRiddd\\ȑ#;6ɓ.\!B}׹sV/_>`B-vݸqƍ#;w ֡t_dB>ũ+++ZzO7 >_ӧOw!BqVcVVVmzz'? 0`J'Ԧgee9s6FF!x;wZzz ,(8oUKo,IO?y} Ž)J {edsD!Pd/Rի/57ZLQ&`2\/brrlͳ6=99ٲLxxxxxiӎ,G^{q=B!{]'O9+6VT2c'$&$Θ1#f֓[I!ׯ_w2r۬Rrr2rqqq'/!BK.\0vv"M( ]\}EMcС?@ @uu3ƍk7ڹsgJJJJJٳƍ3GdZB^d/*((HCBP&|. $$b8lJ(x<@0eʔ%#k̇~8mڴ۷#gggwRB!z1^ZBZL& Audj6mڴo^:J|g^]v:󓓓BaAAs ///###5'B!zSxAQթTjZ#W*wftZ}{:~oܸaFܼyy/_>mڴ;w,"B!8;s=ޠhZR)Eh5j4Ff?nνGodٳgH$]v tdB> EhZJP(ZZZjkjkjky䑰p:WLdzq\;wݻ`ɖŖ-[6j(sQFuB!{T*-a,6H*R.455744TWWW?cp9nܸ!HfϞMg`Vё7n\!BK"##ZnKKKKCC}]]-N:9l.C^^#Gty SL֔DQGJMM}kF!x.^ rssdt%˴Z iiia$_ ;v,IӦL{Cm+G9;wٳgg__vJKK[׋B!kxHLPo E^7*nL.Hz)X )o[,#dfr\SNcbb^,B!Pots~U11U*EeE͊4hP@@≞^n$Iڊr `K_T2`xp~B{A_jq؟s^{X-YbX,oڴi! KNٜZ#vb!q0DLL̬%Kdh^x@ @ ";wvfeWDƥB!{ "IrĉiKx@#yzZYF޽{;qW~#G!BOs{۷o iiiAAA)))B!79d>|ûnnn85B!~Orrr|!Bk'tB!x)=9!B}_]]uB!\_WWM!B}y=Oă"B/x"B/xݻIV&w [B!95j8q֭[b1EQt֕Kb<V/B[N$^&N/((8ssgoРA b2d2INȬFm[ף'Z^uvCsJXB!P?bop`);ę7(J.6$B5.>񺛛ݢMnVmS?}t r{5c0NF?!/6YB!#{C Gf㲘,&I0$I&bq8ؘW*p/Ͷ"gee;EI$DRT"xGϘ>}ihh/lB!?K.gij(ɸ7|&AZPtd/ˑ :{Vdso~d/BKKT*x1777/BO/EX݀Q]#q\AZt*RPmݽ{Q.3T(zzFE&يln2֭&g';4n82-LJfcB!#{ #GBNIQӫj\bh5j4M7h4[/^LP((áFL&۷oAjڵ;A 0(# x!B?x$qsWU563Z#jU*f,VVQ($IMƂ\.7 xVXZ $IAd2 F=}R J/@f/̽B!j$IahvRX\P0VUrYv]]}uMuuMMUUկ׮ExL ƍ[sIFjuZVQk4@ bGD <<< `n`0(b0u!B?d2'MS\BFS$sy\PtZ@@5ce55W./c<ʂqqBZu/$I:XLbJX,lplB!P {zV?mhKJκ ulvE2<:QKstUq,6d([ihuZ- <<-9%hkYB!#3s87\~¤~K ɸG6T&[Ό{ 3B`|6iw!BBzs$OLl /HJrʯZ__RCQ<]"H$77P  ~?͙v#6f]!/pL&x<77wLLLCCݻwJ%x<[,vy\.>~Dg{?D,a=lbQ… 1B!P8$OT*V l6<2i$ `YZ絟0~(;;rKZZҥK{>!B]xt]5MB!δx)޽{͹yngKVSՅB!zK/s8qď>b-\в>Hd^qӡB!$^)))tUTTظzjL/tؕ+WBCC$[2/H\ !B}c謫κbڵkBX, 4g]pMJUr)))]> !BuūNhYYY\.w֭/_ӯϺ,U*Fg~8 !B-^\.F(j.b?>r.ɓqJXvĉjuG!yZ̭Ex[zj%&&JR.+@*@EET*lB!P @ Φӧoݺ.{Vۯ[WZZ !!!R4$$ļK"⌌9s| B!0GMϭen2ce:TKΚ5rRwQU?g2ɤ7I$M| ~UV6X .Ųŵ+( ㊈iJ/$I2] ̤^χ<&9C̛9sXXS=9^%Ԝ/++.eɓ'M445~Z.--=ԩS322I͞v]w߿} xW㵵-Z$x-_|Pcc(dK曍>"r]w?YgΜYVVֶO Ѕڲe2նY}J={oۖ۷o_Ѷt`W}sF왥ff<\.d Gx%x̙3-ZlQy߯ʋ'|ȑ#2>jZ1dmO5FDD{'_lr:{9rD{ P4i0om-eziTٜ{\>}9? P֙x_+xc&Mjr^{7Y D}ÈML>ŭdqѢE%%%d/^0Ϭx,Eb%x-x)ڳW/K;"h'- @Oq9s:WNNN'ݯZ ^Vny-tꎽ/ou^_C4[켖'u-;eO56t:/ZT|<Ȓ%K6nܸJ͖r\wuI.Ԯz5~筷lm mK]G}7n8//RRVo˖Wo߱cǝwߞt9կՓ'7{ѣG__Ӓ? Y=2*/I  0;[D>qWE{ֶ Эh_mܘ`\~M.x7_aǎ5F_|ԩSCBBZ eqHHHHAk{lTl}W|IkV/ܹ0o3wtӛ^ZZt:_7ϲtDFzu_Z0*pHȡC/ˆ{Mvuuum]/#F\t]ѼR[ȑ rٲ!޹)Zjۭs:6tbEBD"6 M~~'?_PewL6}Fn!)S1bƽnhVyQ[i+ED~Fg0?^Ӻ *++EBD"6y.ݒ%܆'d׮"mk0ԨX!!):]H,3CZZNl9"F]4]"D"##>@wT}h7XDd޼ym[E.%%e[%:}JDDEt"D І`8qZU>MYhQn(((X%;wDE)"e"/tNwb{.R"`y3JduM͕˖-r/|kǎ{W֯_61^⩒cE<"".RE"##?K6<8 ^o={.Yw\5u^oȧUU?cccl_|DkAQ!5'~k˧rt:eDm|b#t`צuޮ?t:a \Er΋~z+rbjbC4AsС?V寴.m*ݿ15kШoKB~M6=@}AzY$N'Fc>}ΝѲeYYtDD+-}ipƍa;D&gС\3(~hlL1^O~+W ͈>C3bcSt׾[^WM.d2>N3 O?EW^+w" ٰ C$Zä|b)e{'ab.RwPч(,[Ws">C۷ooط|8ƠjE^x2Θ1#33y~p_s˭_]f]ha󮵲d䞒vi-bJUt]MKzr֟8uP/SNc/pkuUU]ß&\z/Z~FsIIɂi۽u""h""uYrvDc"Eku!sVCf]b' nܸl>3Lr4{YJJ+)iZm:xKoV狘SDfBEc^jst+///ꢋKKGu78$$dɒ%c;DQsyWT*K<w˥ʥTN<kt4;\庣s222YTiÆGgя/}DgQbŋ tө ;vu{ jr<|ŋlVF233;$u-[/R8099h4q"p8sE 15557|3<[3vշv|-ZԵln,X^f͚QF-^n4iRWn)Sl߾=%%E'vd5ԸgϞ7|sݺur:u)uuT|ŋaÆh44(99Yyڱ=7A++!b,^xŊ]&꫼<ɤ& 4c yꩧTԠL2m{ŋgee)cԽرc7nܷo5*+++""W_=|j3fLTTԘ1c\.WTTt:]XXٓzb/<:: nVٰaCee=Gd /x9N%u剈lׯߐ!CF![x=ܳgϞӧO4hP߾}}Is'[Ș1cZ`6vo߾]~AU5[]YA3 ^GmZСC322۟6mt1 Z?xĬ3s)iF-..V[P`gDUזx`. 7~h\vF.Ebb1cJKK+++GxV8#"SYYIAכVGX~Y\{h_2dHuuuDDDFFFFFFZZZ\\\G;22rĈ&)))fz( 'OHDTTr5; Pujo+!{iWFFD'%%+C]"b4CBB<hlFCZzb>|U.ؽ{wEEN:t*OWU{<Ox7tL2%??_^lߝv}ȑѣնBF u >\DzV8q|g-~*{]pv]՞AE u'٧OҨ#Gn=eIKK;|bC!g-Kф%$$$$$iNk@wZ+-tmaܸqcƌq:RM޽gx@A=S{sVxIs5_lܸq֭'OmA՝.PAg輖{%͘1krh4]o=z…zf͚iӦL2e{7~3{%k&OZVd2L&NP#V3jv:ާ !*_f]233W\yΟ?ѢE#Gl{9p\{o6ύ 9rdbb̎lZ_X,EkZRV3k޼y{[T]]ݱ-$׶-_9Az^xaAA/bŊ|=iҤo]?EoSV9 Ͽ뎉_Gا=; ]|n4U ׏ZbX]R+22G}Gչ/ FSPPjz}~7GTt IDAT򳉢)!fnq&c7˜N[0tvh4}Zvn:lLHu\9r-՞vZ۽vhQQ_aÆ͛7|'xR}KW[tt Fj xVuݛ6m{z~~~]]*@fUUWWk46!(wmx'N,_?ŒZ]]rRSS/_d'f͚UQQ!"111111QQQ!:::11/8p`\\\/)õNKm(}1lr ^x)Ʃ+11144jϞ=Ç7 'OrR1cDEE)h4t:p8jjjN:MjNZarډ,ԖRZd2}WRRx޲E e7eFaZZdR.joeulf㥤 RR몬TRbh4SN .KD?3^oXBCC VLII wݭiyjWul(w֭v>pœƽ{l6QF!a0}]),,˻>@)v~ph`۷A]J+*^JZ`l6K]  ]w]z'xbM*[u:6NoM[jhh8p{キn:lVqRz8p`BBڵk[633~&"{駟2t*^n~zw֬Y#RWF_HLL0aBt/k#'Od:W'񟽂,bY~~v޽{7nַo_^_\\|Q5xԾ}j("VUYKD].Ëϣ])zƩ+<<\I]%%%ԕK] PRNkn"m۶~DDDF^OūSu]w)*ZmHHȨQ x*^nСCoEf%$$4u)/K]J꒠w{\j֭[[ߌBtf+55uYz].Wmm͛_z+ @ok(+<<..N2""BD*++ˏ?^XX?;vlm3v̙3gN\.2ph/^zAjc:yʕ+}]9~!CDO?U3 ԕeەov֭'O1'N${uu{}]UUv" Z/jux<'O裏.]*"&)==t.]t͚5"b0㕪NsŊJJOOOMMMMMMJJ 3 ^uuuuuu 4hЇ~XXXjժ#F"e$wڵm{{Q`=^י+))IoݺuΝr:u9zcjjjVVVrrno999==Ok(#g.FvUWeddhZq:R>z}yK0|KI]/^ru:ur:uƔH? ሉIJJj)u{ӦMf9χ/ x$ur%uL&_ڳgl6FOz]#***,,,`4M}}oK/$Z󂑟WIIɜ9s9ͦ㯹ٙFivש_\|y:Px:p–j]ʑH%u,// ظnw8&)(ߪ`J =/{^|<333Ǐo2/_>qne@`Qa\`_|!"6-66n:tHZafr^b2d9R__:」߹sW\QSSs7?3իWvm|N[hQxUUU_^I]ufj<tz} dʋ`M&ӄ .ⴴjjjn 4x饗Yb,^xŊ]C:\URRrlMRW^qqqvO"HݻwwqqqA~<Ci_}U^^dz<;hР3fSO=ZPA#""뗒 Qj2+666::z nT?^VVVWW{7ܹs'{ˣ[o 6j ׯرcVeٚ_=tЌD7HQR_ʶ111CMOO XӅc:t(''/(**:thLLLrr`jg˖-_v ~]x:1 Qc>K(@K>/=r2>ś7o޻wj-..O9rݺulRVVL,۲e?p`:&_WEEEfp6 nnE%$5^r?HFFhܰa͛^w-"\pATT3nO/]TDbE6*rjMKKKJJ1bDRRҬYVʕ+bbb qGEE+F1---..nĈQQQxDOSWKxZA>###222<<)0lذȃ^}"rx٪Y)UOVJ[DUI[TNgrrrnnnnn>l0ߞ ^6lذlݺuܸqmX&I{{^ȗw$GiVNjt[*^N6mJKKhir\x޽z}1>uq~m  \IzQQQv|zqjDFF&%%lV=U?2ֶN}k -P<W4`h4y%j/jR=9Qp8X@kҺN[^,1*ӷo_՝Z[Rֹ7,|PwS6^fH\rnrw744tu:F7 ^Eo!)wgj=XWFm[I"r( _f{qq1ޡh4zw/^,uM~Ys:\SS\[hÎ@U%JD:g\3\ъZ VVVx9Ƿ/:T(,oUu"'F "xoӦMǏOIIܺu#NaÆvf˩{7.x\C0wC b7īSn;99m/Q4{wzzk|=.F/@/ЊUVVOpIDATf6'MT^^^ZZZSSzf;|펊j6mU74t6[DBBdޡuO;N)"O?EFF^r%\rI;螚^999tkk&xYNY 5;۱- 5v-(Z\_TTf?znI6@8xeg?ObWXmgg/'^)@sO>/9u,Y x ~Q:kkx`ي> .^x%@/`ˠ0d6^n"2eduPU: xegOJJ7oniSn57F56/X ;{3t7^_bUW-!"|NQeqĈK^ @k'm49s 7p6u w JHHPr?zfjU^3+77Wn~-nEP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%/TBP @%@ӞbZ (/Rnr9^*!xJ^*!xJ^*!xJ^*!xJ^*!x}Wwg6mZ[y59Hց,''/V(**j{JjhNy#/i)]O]Bh33V%/iI]Bh3%o.!xJX@ X-~$@PVk;[U&VK/;N6-@t_bYUVU0H^^^#*xȁu6:P%TN-xHQQQ#(j~-O5E@TI gE"u`tvfשɡ/Rh9x@tRm(:)E%d/zzyhNM?x 3YQ!-- 8jTUj;x ^999k[y:Prk{I^xht<J^*9^G~J릓Mj_zWu3O5}*vw=ztsTBP @%/T҉{5~qaaa]]b۷W^yW.X~{キo>uw(.\{R뮻n6m*--jǏ馛 CFx?\D.?O tbڱcDZcǢ\.wڵk׮#FȺu̙z###N7|}^{-11QDٓF?۵Z+**3|Nw-ϕƯ:;;;;;m۶?>;;;77WD.]o{ʕ+}ŋϚ5K9XWW'"=z~xb^]][o)M0aʕz0wӧ̜93;;[<:uJ駟~>lzzzBBB5vثJD|ɒsz.,;;;V;fϞ}}v}ڴi{߿HDGv w)f9\}"wQDʶm&"_~y0o{',,lݺuwYVVֿ)S(g=_t`nflٲӧO/--MHHSwh-R_r:Gӝ8p=OXXҷ`:Grr6mڴyftYYY>ϟ?~x衇ӆ&@1?VUf?þT4vعsΝ;Wo1w7!a ZDZPP$EDA`'N+6%F\z=wWEaABThV}Wh$fbڕNV0=<λw;;;(nmm|ODDD𰻻KDz^J9X֣#FzY[[s\DtrrX}ѧ7+(H@D `fxxXQ]]tL&0 ]N0L* D"P"8;;#"P]]ԤhSA˲,^]]gYg!^drnnj5gW bX,L^###333Ph4<{{+˳_ٻx^Z=55dԞ<}2D svG"ω[뉆.//䐫㵺 d2jdpoEE^W*שTJT,rT*t`nkk8NŎ(MӱX,IblG R`0ĝ_ Dd4ioF@fppPڈ_-^fl6;@@JPx^䉗 nDno /.-m /x:^.+}3/|}NIENDB`bist-0.5.2/doc/tutorial/bond_properties.png0000644000175000017500000006733711373740772017406 0ustar cagecagePNG  IHDR.G<sBITOtEXtSoftwaregnome-screenshot> IDATxy\w8w$@"(*Y? ŃVtUd+ڊv]z(UK.,OE[buG ZY*J~hFܧ\P $5.eُ)CьOdBc([ܡ121Aae"IMшFCOƖkEL?6p9F!Ÿ~1}&Bk?!0Aۍ⟦̘3ZhoMO"l-yx%@?Pihxv5Q#<.Cݖu¥.M x6=19u'[ #\FO#eo{?"|!#^,ȔVTrAs+^i\6aH`+,&1ڂ.{C<}_~o(Ͽ\rUyƏWT<_h4r1-B4n!CDM= wIķx=͝\>v8oF?{_ijኮ/ [aiUc Di{"tJQa(lU*==ytemK3.:~ o!־?-5sUkj;,%iWA]}#uˣZ: Ȣ 7Loivtij^jߕv>onP߫oEuSN 2~q?6^hG4~SKvHnmmWN1َoz]d BTqu34ђ}NSmaśzJy/p\換*ڊG[5҂C{U ywhd4–u.|VtցB 7JJ(JM854vFXqY]]^"kKv\6!ݣK<6WW:9h<::N\Z-S6-mX:Fyhi6xX߾ߢSA]dK>kҕ?vb .Ŏos:nm_(ozbk hRH{+FݣPDxѿ|?/x^ͷ0ʚ/4qd24:NEko8K#&EN:vLEѺ ztNCk)e8<6 F~tcɠww04CO`niW٬w)xxs ?QԦ!o|QΥ{k0XyA#Ů6NV/ BJr}46U1v?O,Q3ҁ@}?+ra?qfl\PN-jR x _*-h{<6|ۛ 7eS"Ər;sc‘~_k6l.]5+>#he3hP_Mfsn8mc~x́V=ȧ,^յk>=faNiE#OO~?iNNNN73G!Ync,uR[!GGGG6":1RAB7Y2L۬<&|Ut1[ED>+bv]{g5B{ޏ^ehD١筣g4]p雹pmU7·KtYL&jWK"~d4B/B4jg'G{{0mi_qꪻˇj_3CX,W)FX,gnnl6B& P| _cLj]]ݫ+)leed29e Ɛ  pt,((xϟ_"ET*APx h4Zqq+Wͯ]KkZmOOO` }(ںu맟~:ԭxgBw]\:;;}}} LixO<\W\\ϓoJLL OF_BNwww={_~'!?CPKK?u=z>?¡? gRzzzlmmY,tX}ٲeLV'%%9sbEFF/\B>ydVV!M~'2L(T3f,^qȑǏ͛7oΜ9Ȇjmfi4&`0LE'jϊgϞgdd[L/'LpѯԩSyyyxݻmۖXXXػĉ'Ν;7??????66VV)[ZZ~gTJV/>|8%%̙3x}zzzNNի:|tf# Fш㙙q8}OTʕ+3f8wܖ-[X,BC./]4009>>^$;DŽ{AAA4M \'Owrrd<6p^{ĉc^^UPPrtt\`Avv6BHR>|x͚5!!!QQQd HOZ7Fuvv8q?ꫯZ/֭[GWWWr+JPUUF!;>0Loooc:s̥K6441ĉ3f g9Y===뻺VZE-٘aOO5ٳ999^u˨τ 5j(X|ԩ͛7{/2331*y!$ Y,B + X$@d2d0:oVΜ9}eh4B+)))??fϚ5Fđ#G?^WWggg7o޼9sFsμ<!J/^L涶⸸8DhZNJJ:s Ŋ9,0 ={! sss󋊊juU &=z믿>uT^^^k׮O?t߾}mmmz^СC˗/OOO?yd_ؤmذ!'''33߳gOnn322֭[WQQov]TTm۶ƾճ^NOLLxY/_|h4@\\\joo͍qtt\|9WR>|x͚5!!!QQQ'N[{llCpppLLLvv6BC./]4009>>^$;vp:::N<$x< <z/$$$((իeeek||E~)]]]e>T*BUUUcƌtѣ{筬Zju&Qo455555)JVKt֭~h|||z&סai+2 ?~rrrFFƼy8N24.8qff@ t; 3<A.X'x6 (em/BPѨT*# SVV;19 \Bammmcc# Y,Bn6dR)6"VhDvV*d@R ͛7ܹst____'277 Emmݻ[[[{'rѩ999wޕ!PowoA]x133s!R\\\SS\QQ7`ff6mڴ4ܪj#w !xVT*MOOF#Уnc2rrr+Z=bĈI&{zժUvzY,֬YlvdVVVYYYvp8^^^z Jt:=""b…x}BBݲeK[[X,ޱcH$y+VHJJH$'OnWE&!dooOqh@ … g͚5w']c t"r\kjjƌVJ% ώ!AB===ﯪByyyر) C62陖6$U׳>afq0ĞUF~O ?g3Ygn@'ؙ[/:1F, sP*>!Ldɒޛ3=~i&uV6{?x&Q'WQ<<"  DPqss/R\\ѣGpfb8..N"ċ-:u͛7x<6Fٹsg^^J/: &ȑ#Ǐ7oޜ9sZ_hL&Dj@VO>}ٲeꤤ3gΰXͽÛ7 !D HtYqϞ=ׯXnurMZZچ rrr233{IOOYzC/__ &=z믿>uT^^^{m۶4669LH+2>H$AuttK:;;NjDcǎS{llCpppLLLىT*Ç׬Yhoou KyAAA4M \'Owrrd<ÛE@tk IDAT;sj&[nSOSSSSS kժU\ƗT* 7Օ\x*F3Loooc^ Ed8!?ɩd:WZ}gff e4RX'x]XX98K>:;oVTT ,KP[ X,mmm{Qˡ`P(D!777csn^_ɤ>R*//7 "xPDŢF#jR*JR' T۷o_rʕ+Ǎ{x⚚䊊ٳg$?? ~A Ν;e/fffH\.7:::555''ݻr#%n^_̦Mڊή6 7p4JS8ƍݸqc…t:%KHR&ac\-[b;D"4ʷz燆PJt:=""b…[keek.{Wig+bbb,,,$ɓ/ '8lzzá9ĝ!(S "C B!P`up@_LpӹRcvްaʕ+MJ&y{{/Yqg֭[l69&Q'W<<>>4Rj}}}nݺE~tuu%|> JL&~x E n$|033S muz@DCwY,j 3&AF&m$ \ZZjmmM$Bq8#P_U(4Pb) Xl(@d2t&;З E=ш̭T*MRSSJ/rٳg$rѩ999wޕ)aw/?]x133"""RRRkjj+**zWlڴiiiijS1 &AT*MOOF#ׂIX:.J.\;MllUVV֮]8Wttt_"""\-[b;D"Qm[bERRRLLD"cُϗ EásA$8^饗=-h4mmmqqq'^hԩSϟ?n޼㑷4Ν; T*]x1/ #G?~n޼ys_j:))̙3,+22kw۷oh4+W B`,K$mڴ!ݝ"˻g̘l2>>_>>>MMMMMMi^+++VZESNUUFL7~믯_Nrlhh@ '.Y$00?,,'$1Oa1`^+JÇՕ\ILY ENNN&ә(vO2pL@obj>?ɓ''&&p|Fm߾]P>}o׺#+܌~bH>z7ܠ =8F`oVTT ,KP[ X,mmm{Qˡ`P(D!777@d2OVBmmmccg;;;:~]FC;$''ӧO@c 47{m0e@/,Y"J̇IHHr[likk;vDx+++z->B-V*􈈈 nmllUVV֮]8AcŊIII111dx=w}!++R喔9r622_7| 4^8_/ m_~7!TJݦw6xxx 58M|}!~oɺ-9= gW/,E"C B!3q: 4a:, s%IR޽a+W"Z;Ν;ՕAnzvd2oo%K^[lܠaaa...޻+a-:u͛7x<|^Kܹ3//`HR2#)D"Z.((PӧO_lWV'%%9sbEFFt)gqшz|<;ͦ&NLL|]ZZO?zj7oرlxkNN|jPzzz_sܹ cǎ[n߾}"eӦM)Szzz]F,.7nG֮\ ԒrJ??2y۷7;BҒNP'K_{o9r|޼yiii[l!3u$\ׯdGG޽h۶mJ8vgn:xYf-_<99zSTÇY&00>$$$**ĉdDNӹ\r|ҥ"رcfFꫯ:88T~ ,ȑ#ᎎ^^^3g4=!!!**VVVw/)=66!888&&g4p$P&q'O;99d2gKHHHPPիW~E:*++VZE]L.i)M\UUj}}}>>>nB '.Y$00?,,9r$ӳZ*++U*q@?{_̶zQ;J#|>RUUh!&i? ?~rrrFFƼy85 㗙)Bobh4 Eqqӧ?ivwwD̜sT^ Ic'b=/&A{6qm/BPѨT*8Naa1m0X(X,BAQ(b;$''ӧOi666j.]dLkM¢x=V{aLW K 0̊ r4𸡈;J%juBB;w>}:==^pƍf6S[[{]\N>rJ"""RRRkjj+**fϞ8p@yyycccqqquuP(VUU*_~8Z\nTTTrrr^^^]]ݭ[~㠳K$ ~oy{a;w.^38M6---!]]]md3/ܠH*SCQ71999_}Z1bĤI{=uܹ|[oj322bccvpj \.w˖-mmmbxǎ-))9rHkkmdd믿HX:.Jq1õ,Z"55rԩ:>ʷz燆] ERi}}=AfHbŊ D2yd#xAЖe{Bmzg# D`ooOqyI|t z8Puo3Y!y B>`ݡۆ_|1M0L`A(0 b08!?q݄a&`Bq0 & ş} aBq]~!55ѣd|Iggwwzςt<`BqP\O9F۰/?OPPB`ݺuN}%&Ls & c8?`0BBBt~Kx0F[Pxxۻ\nnnɓl[?wzBg ?yÄzl'MD $Iqq~o|jgL(նN =s挭m@@@Y9 *?yWEƍ_8̭3L&:u7N({7ٻj+WjoѻT߽`ں;vb‰'TTTTWWTܑΝkrFp|ƍH#㠳K$ܨ(>S^^Inջe`qk޿ʔ)ZY?Jn97ӟ Ä3|"mmmo߾qF#Pu/?y1<{`Bq:PSq`<C B!P`A(0L܃:ud/& E8IR4Nժjwqܹ rIlݺfY\ēaw$&]zo\T*=<>^$;v !ܬhBBB^}U\_hh(BqنuȑpGGG//3gX̞effvA++'O;99d2Sk7j(~JJJxچ2< +B((((44F bmHwwX| @uv0 #W-zuUVVvuuZٙ\3$J}||nݺ'N\dI``XXN3rH2gSSSSSS}}}_TVVT :{UUFL7F?d%%%s̹tRII5 Kpuu%|<1}||S*Wuv0 ~0䌌yq8j|/33S -zwzh۷+ӧO79&˃IeLΝ;G?~KlllƎKdI?1P v|1 (ϴ" 5 o IDATJB1͍B!R(B!ɏ>>>NrrX,>}4LPZZjmmmccc|2P.LfEE/k___Fs!___:pҥK. B߳0 'Ȼ1ٙ[TIV'$$|7o޼sӧ}}}57nܨknnfѩ999wޕCo\.</"""%%&99b766WWW B\`UUUjjR_8FEE%''ݺu~00.ٴiZ[[BxF3vXRy5As~ŋRܠH*SCQ71999_}Z1bĤI{=uܹ|[oj322bccvpj \.w˖-mmmbxǎ-))9rHkkmdd믿HX:.Jq0õ,Z"55rԩ:˾bŊ D2ydrS_{?81cƔIT*LJ.""]\\{o~yy;xL>҉C! ˗/oذ!$$')m߾… ,PFFP(O>ܻ|g@ :4Ν; T*%O`TCFtljPoХOWy;̦O||ZFxϞ=Ν[~@ 8vغu'ZZZ6mN2ڵk䷭\.߸qG}T[[rJ';0PKjjjvvʕ+ZZZt͛>>nB '.Y$00?,,9r$ӳZ*++U*ՠ'\*F?2Lr;{?~|IIɂ JJJ̙sҥkkkAJx)cy^B۷or'Ofٷn2=PQ_9'ZT8zct ,+ `p84_ff@ [Ph۷oW(ŧOo>sUM&#W˓F=,˘,}ݝ;w:::F=~K.،;,Aɐ=?/&MO?7Nz DO30 (ϴ" 5JB1͍B!R(B!ɏ>>>NrrX,>}4LPZZjmmmccc|2P.LfEE/k___Fs!___:pҥK. /O" =s挭-78@})[P^Nǽ*7ncHognRI$Z-ɦNp~t___zÍ7pT33@Z}Zon+1NjHIIuqq9vXEEB'NBUUUΝk.poܸia\v33iӦy{{j???F;ǎT*kjjle$]SL]B ;wK{k~HMVnADPXAU"UREmEa[WܺE )E}di.aPk[>P r y Ϝs13gΏ_UUEMW|TpE"No{nnnyyyW_}֭;p;חdddp6n8\7T޵kˍyÇP\.,;;cԩWvAAA,Sm6}}CC˗4mЄ@}}}ooozp߹s֞={vEE:m(͛7u})A󛛛/Ϗ(:@;wKJimi&,%-))I$+s a]Bšqu0 M\]B~i !E B0T<F Kx ѣLw`A<`B0 !J^.3rN ccc/\@a<^C& !NNNq[[[iiijjjaa#G%`S8 y޼yKj...Bښ8 ^ UvQTcccC}޴iݻe{{{O>VPxx8ǓH$W^H$+VJʷ JRU˗6Rowwwaa)7XPPwL77H>Ǐ:t(55uȤDXlllLCbx_~'.^XXX8v@ILqㆯʕ+ǘ*iWWX,ޱceHH;ݻ.\>>)"X[[kii*[YYijj>کȲoݖO2XɆ]P"|4PSSSSSӠSSSSSSs޽'O꫄??Ԓ5k jTWW_ ;wn>|zYYYєly%Y|H$FT"7ݻ6m"hiiO?>i׮]\.7&&ӧx򍆆&$${xxx{{=>bvoh4vq,)r!ΎBJLrCFW9Gl|Aex27aE0"`B0L3dWّ]`8* ETҹ| w;99m߾]U }ҢͅBOQ(l%Qxx8ǓH$W^H$+V(]vP|r88Ãr?yyyl6w}7 !?oݺuQ%{rՓ'OhiixO>$##ڵkBHffuvvvnnncc ֮]Kٳg׮]xqqqUn8}eI*bTrJz  wppx񢦦-[ 455nݺzj :eNE||x}}}rrrsooo\\\aa!|R|N|$!! L^|Y>Qh4Ebx޽uuu!!! ۷h"Ż$&&{:|dddZZsuuH$eeeFFFԡJKK.\dO?䓭[}FTTo&{W*##ҥKaaavvv;|+yyy"?|0=~*hkkϞ=bT \nYYYvvvGGԩS[N___fffPPQNNN||Y]B!uePW{!`Đe!Qgii* r@eeeeeeLt?0Z[n}Mc"W &LfqTaE0"`B0 P qLZ#"Hn( %B3<+!aEq E "L|#LnooOMM-**jkkן1cƻ;L#}|7nhmm$(f NIDAT={_~^x1U2gz@NNNnnǏ -[&!ӧ544\\\BsssMMM7lذvZ ^ B100(..^dΝ smooʥR-[x<ӧOO>_XJDK.ݻwú+VP(XO?7ppppvv={6!;;;;44חbaa@tRꃅEddʕ+߿({䞞gƺB֯_P0 h ,uVEE?m۶{]~8qΝ;TIKKˠ:555{-|jPz뭔 6 WY*FDDx{{GEEM:b600@ʲzntY[[p8AZ[[~mSSSU[[+jw^$Ixx˝8΃D"!!d)))gܹmmmw711սrʺu:;;;&?ar7nܘ)Hnܸ!H5P"MMM77dDbbbꫯm۶맧744._p3g޼ysȃs87|x0i޹XRJkK3!f-BHݣҰ*0 P S4m!))i0وD"0~._<^qTg `UWW3݅ Wybu!$))CѾLxV C(|vu&0]^>;3PDPS?(xF! f=i%9dٓ0ndQ"䧄8{`@(zy`J(()::\(2ݑB(xeee]zI[[{/f_Ptׯ/PZZC%:/inn\.w3g)--=r䈗Vm[}}}zQqWZo*J:r䈕UhhhII۠W^y;09%$$Xd===yժUTޓ'Ottt{xxDAp[[gϞ]vũi *xu޼y311aX?|09uuu^C### BHbbbAA޽{333"##䏣Z^^+W_:tH}cQj MMMfffg33FrJCn;v xϟm5___r7,zQ__+]믿{JZC=\D},--l|tQ-OZBիW{{{g͚CTZXX%_&]]Evvvʖ X[[kiiw󔬦n*E۽{wmmu7utt{۷/00pܹϗ/y&о>@7TVV޾}ӛ7oKMM-))OIIZf͠#(YMT0J%g<<<233e7ɗؘ:uJ$566r8gg爈ڮ]\nLLӧO>d5j /0cc]vڵK~VHHHHH*Sѣ*A UKp e0]kBQvv,0n $ioH 4(BQqqfa#ߠKJJ~LBx 2r(Oa"@ jre0QY0 P C(!aE0"`B0 zLwauvv2݋񣧧j@@-xUlP-"P&0&xTϊaE0"`WttP(d#g\$ qLbE0!eee]zI[[{/f_㡹933~2eWPP)566>!!?ƘOLOOO$qqPknn\.w3g)--=r䈗fwаsΩSM>^$'''[XX ?8p`ӦM4*=,"`^BBJNNӣJWZb!ӧ544\\\B5U-<S_~3fﯫ5k!ۿPqq1&&P݃N8qzzԒ555===USSݽgBKKKuu]EO:1eʔ`"{E0KKK6믿U*FDDXYY}.]|V?]a,mQ[.8s*1,rPyee%Ţa|||XXؓ'O˗'2bA(.Z(77w o)Ū666t"U9Pc믟={Fvww;wnѢEόY,VXXXkkؚ+..F yPctP@ y3f_111սrʺu:;;;FOXP_>%%̝;ݻ\.wƍ麺ƍ$ `9ݻwܹS(ѓCCC422Ba|| gnnFMkllp8l6f߿gΜ122 y2ܶm~zzzCC˩ ##xqF5m$ӦMKMMDG} kLL ,CCãGh:#&;wKJimi&,teY]]=&\~=""/u n/?J!=,- ϊ&#\P0I!āP C(!0B,3݅q5 ZEz~MB;Q"`B0 P C(!a"*{xU0WEujLZw`0DIENDB`bist-0.5.2/bist.desktop0000644000175000017500000000026511733641566013412 0ustar cagecage[Desktop Entry] Version=1.0 Name=bist Comment=Bist stands for bidimensional structures Exec=bist Icon=bist.png Terminal=false Type=Application Categories=Education;Science;Chemistrybist-0.5.2/images/0000755000175000017500000000000011740261237012307 5ustar cagecagebist-0.5.2/images/lb_new.xpm0000644000175000017500000000471411025523004014276 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_new_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 76 1", " c black", ". c #090909", "X c #0C0C0C", "o c #101010", "O c #131313", "+ c #181818", "@ c #1E1E1E", "# c gray13", "$ c #2C2C2C", "% c gray19", "& c #313131", "* c gray21", "= c #373737", "- c #393939", "; c gray24", ": c gray26", "> c #444444", ", c #4C4C4C", "< c #4E4E4E", "1 c #505050", "2 c #515151", "3 c #535353", "4 c gray33", "5 c gray34", "6 c gray35", "7 c #5A5A5A", "8 c gray40", "9 c #6D6D6D", "0 c gray43", "q c #717171", "w c gray46", "e c #7B7B7B", "r c #908A00", "t c #FFF400", "y c #848484", "u c #909090", "i c gray57", "p c #9D9D9D", "a c #A5A5A5", "s c #ACACAC", "d c #B1B1B1", "f c gray70", "g c #B4B4B4", "h c gray71", "j c gray73", "k c gray74", "l c gray", "z c gray75", "x c #C0C0C0", "c c #C1C1C1", "v c #C8C8C8", "b c gray79", "n c #CECECE", "m c LightGray", "M c gray84", "N c #DFDFDF", "B c #E1E1E1", "V c gray89", "C c #E4E4E4", "Z c gray90", "A c #E6E6E6", "S c #E7E7E7", "D c gray92", "F c #ECECEC", "G c #EEEEEE", "H c gray94", "J c #F1F1F1", "K c gray95", "L c #F3F3F3", "P c #F4F4F4", "I c #F6F6F6", "U c gray97", "Y c gray99", "T c #FDFDFD", "R c #FEFEFE", "E c gray100", /* pixels */ "xx 7lxxxxx", "xx EEEEEESSSI w 7xxxxx", "xx EEEELe...# Eq 7xxxx", "xx EEEa@ +. EE9 7xxx", "xx Eb* XyIEE EEE8 xxx", "xx g 7BEE> 8EEE xxx", "xx a EbEEEEEE xxx", "xx a E EEEEEEEEE L xxx", "xx soEoEEEEEEEEEoL xxx", "xx g$E$EEEYEEYEY$G xxx", "xx l,I,LLILILIL2,D lxx", "xx b9D9DDDDDDDD29S jxx", "xx muSuSSSSSSS,t&B gxx", "xx NfDnSSSSxf;rtr, fxx", "xx LMDMMBDDm2trtrt sxx", "xl EILDDDDI2rrtttrr-xx", "xx EEEEEE55ttttttttt::", "xx EEEEEEEE5rrtttrr*xx", "xx EEEEEEEEE5trtrt pxx", "xx EEEEEEEEEE5rtr5 pxx", "xx t pxx", "xxju,&&&%%&%&&&X&$5pxx" }; bist-0.5.2/images/pivot.xpm0000644000175000017500000000412511025523004014165 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ static const char * pivot_xpm[] = { "22 22 53 1", " c None", ". c #000000", "+ c #0A0000", "@ c #560000", "# c #970000", "$ c #CD0000", "% c #F10000", "& c #450000", "* c #AB0000", "= c #FF0000", "- c #590000", "; c #D50000", "> c #F50000", ", c #A90000", "' c #680000", ") c #320000", "! c #0E0000", "~ c #BA0000", "{ c #540000", "] c #2A0000", "^ c #3A0000", "/ c #1A0000", "( c #1B0000", "_ c #B20000", ": c #2F0000", "< c #5C0000", "[ c #760000", "} c #FE0000", "| c #690000", "1 c #E40000", "2 c #DF0000", "3 c #310000", "4 c #010000", "5 c #A10000", "6 c #D80000", "7 c #660000", "8 c #190000", "9 c #BE0000", "0 c #E10000", "a c #9B0000", "b c #620000", "c c #370000", "d c #060000", "e c #210000", "f c #AE0000", "g c #F80000", "h c #EB0000", "i c #730000", "j c #150000", "k c #5B0000", "l c #C50000", "m c #ED0000", "n c #6D0000", " ........ ", " +@#$%%%%$#@+ ", " &*==========*& ", " -;=>,')!!)',>=;- ", " &;=~{. .{~=;& ", " +*=~] ]~=*+ ", " @=>{ {==^ ", ".#=,. . .,=/ ", ".$=' . (=_.", ".%=) . ..)=%.", ".%=! .=====", ".%=! ... .....===.", ".%=) ._=_.", ".$=' . :=< ", ".#=,. . ._. ", " [=}| . . ", " :1=23 ", " 45}=67. ", " 89==0abc!!d ", " efg==h===i ", " jklm===%n< ", " ....... "}; bist-0.5.2/images/lb_subs.xpm0000644000175000017500000000664711025523004014470 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_subs_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 104 2", " c black", ". c #010101", "X c #020202", "o c #040404", "O c gray2", "+ c #090909", "@ c gray4", "# c #0B0B0B", "$ c #0C0C0C", "% c gray5", "& c #0E0E0E", "* c gray6", "= c #111111", "- c #131313", "; c gray8", ": c #161616", "> c gray9", ", c #181818", "< c #1B1B1B", "1 c gray11", "2 c #1D1D1D", "3 c #1E1E1E", "4 c gray12", "5 c #202020", "6 c #222222", "7 c #232323", "8 c gray14", "9 c #252525", "0 c gray15", "q c gray16", "w c #2A2A2A", "e c gray17", "r c #2C2C2C", "t c gray19", "y c #323232", "u c gray21", "i c #393939", "p c #3A3A3A", "a c gray23", "s c #3C3C3C", "d c gray26", "f c #444444", "g c #484848", "h c #494949", "j c #4B4B4B", "k c gray30", "l c #4E4E4E", "z c gray31", "x c #505050", "c c gray32", "v c #535353", "b c gray33", "n c #565656", "m c #585858", "M c gray35", "N c #5A5A5A", "B c #5B5B5B", "V c gray36", "C c gray37", "Z c #646464", "A c #656565", "S c gray40", "D c #676767", "F c #686868", "G c #6F6F6F", "H c gray44", "J c gray46", "K c #767676", "L c gray48", "P c #7B7B7B", "I c #7E7E7E", "U c #C50000", "Y c #E20000", "T c red", "R c #838383", "E c gray52", "W c #898989", "Q c #8B8B8B", "! c gray55", "~ c #8E8E8E", "^ c #909090", "/ c gray57", "( c gray58", ") c #959595", "_ c gray61", "` c #9F9F9F", "' c #A0A0A0", "] c #A2A2A2", "[ c #A5A5A5", "{ c gray65", "} c #AAAAAA", "| c gray67", " . c #AFAFAF", ".. c #B2B2B2", "X. c #B6B6B6", "o. c gray72", "O. c #B9B9B9", "+. c gray73", "@. c #BBBBBB", "#. c #BCBCBC", "$. c gray", "%. c gray75", "&. c #C0C0C0", "*. c #CDCDCD", /* pixels */ "&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.", "&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.", "&.&.&.&.&. .B n O.%.&.&.&.&.&.&.&.&.&.&.&.&.", "&.&.&.&.&.B *.n R ..%.&.&.&.&.&.&.&.&.&.&.&.", "&.&.&.&. .B *.*.0 W O.&.&.&.&.&.&.&.&.&.&.&.", "&.&.&.&.B *.*.*.s B { &.&.&.&.&.&.&.&.&.&.&.", "&.&.&. .z *.*.*.O.5 W O.&.&.&.&.&.&.&.&.&.&.", "&.&.&.B *.q *.*.*.q Z } &.&.&.&.&.&.&.&.&.&.", "&.%. .z *.@ J *.*.! u ( %.&.&.&.%.&.&.&.&.&.", "&.%.C *.5 X 5 *.*.*.4 K ..&.&.&.%.%.&.&.&.&.", "&. .z *.*.*.*.*.*.*.n h Z q q P %.P r r P &.", "%.C *.t X X X a *.*.*.< 4 U U 0 J q U U 8 .", "%.v *.% X X X X *.*.*.a ; U T U 1 U T U ; P ", "C ! *.@ @ 0 r 4 W *.*.O.= % U T U T U o * v ", "*.*.*.*.< C W h *.*.*.*.} % o U T U o o ; n ", "t ; X X ; B ] E 4 o X X X o U T U T U o 0 P ", "f % X X @ d / ! s @ X X X U T U X U T U ; ( ", "D a t t a Z ] ] Z a r t @ U Y X o X U U % P ", "{ ( / / ( { O.O.{ ( / / z % X X = ; o X % v ", "&.&.&.&.&.&.&.&.&.&.&.&._ v , * t v s ; < v ", "&.&.&.&.&.&.&.&.&.&.&.&...P v h G ^ P v v P ", "&.&.&.&.&.&.&.&.%.%.&.&.%. ._ _ } X. .] ` ." }; bist-0.5.2/images/lb_select_font_color.xpm0000644000175000017500000001123611025523004017205 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_select_font_color_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 181 2", " c black", ". c #010000", "X c #010101", "o c #000301", "O c #000006", "+ c #020204", "@ c #030304", "# c #000601", "$ c #030403", "% c #040000", "& c #040202", "* c #040303", "= c gray2", "- c #050507", "; c #060606", ": c #01000F", "> c #03020F", ", c #000D03", "< c #000F03", "1 c #090000", "2 c #0C0000", "3 c #080B09", "4 c #0A0A0F", "5 c #0E0808", "6 c #0C0C0C", "7 c #030212", "8 c #030216", "9 c #040310", "0 c #040413", "q c #060513", "w c #070516", "e c #060618", "r c #090814", "t c #0B0B14", "y c #0C0B14", "u c #0D0C10", "i c #0D0D12", "p c #0F0E13", "a c #0C0B1A", "s c #0C0B1B", "d c #001204", "f c #031006", "g c #021205", "h c #021606", "j c #041306", "k c #061309", "l c #051609", "z c #06180A", "x c #0B100D", "c c #0B140D", "v c #0B150D", "b c #0C100D", "n c #09180C", "m c #0B1B0F", "M c #100000", "N c #120202", "B c #120303", "V c #120404", "C c #130404", "Z c #160202", "A c #160505", "S c #140808", "D c #140B0B", "F c #170C0C", "G c #190000", "H c #1A0D0D", "J c #1D0E0E", "K c #161616", "L c #101019", "P c #111913", "I c #121C15", "U c #1A1010", "Y c #1E1212", "T c #04012C", "R c #171623", "E c #012C0A", "W c #240000", "Q c #2C0101", "! c #291616", "~ c #3F0000", "^ c #222222", "/ c #262020", "( c gray14", ") c #25242A", "_ c gray19", "` c gray20", "' c #323235", "] c #353232", "[ c gray22", "{ c gray23", "} c #070067", "| c #080076", " . c #150F6C", ".. c #3C3C41", "X. c #006716", "o. c #006916", "O. c #007619", "+. c #3C413D", "@. c #5E0000", "#. c #413C3C", "$. c #630000", "%. c #6C0000", "&. c #6C0F0F", "*. c gray25", "=. c #47474B", "-. c gray29", ";. c #4B4B4B", ":. c #4E4B4B", ">. c gray31", ",. c #535355", "<. c #525452", "1. c #535553", "2. c #575454", "3. c #606060", "4. c #6F6F6F", "5. c gray46", "6. c #0A0092", "7. c #0A009E", "8. c #0B00AA", "9. c #0C00B9", "0. c #2319AE", "q. c #0E00D3", "w. c #2215D7", "e. c #372BDA", "r. c #514B9D", "t. c #706F8A", "y. c #635AE3", "u. c #6861CA", "i. c #00921F", "p. c #009E22", "a. c #1C9536", "s. c #00AA24", "d. c #00B928", "f. c #33B24F", "g. c #00D32D", "h. c #29DA4F", "j. c #488455", "k. c #40DE62", "l. c #8F0000", "z. c #920000", "x. c #9E0000", "c. c #A80000", "v. c #AA0000", "b. c #AE1919", "n. c #B90000", "m. c #BF0000", "M. c #9D4B4B", "N. c #8A6F6F", "B. c #D30000", "V. c #D71515", "C. c #DA2B2B", "Z. c #E00000", "A. c red", "S. c #CA6161", "D. c #E35A5A", "F. c #818181", "G. c #898989", "H. c gray57", "J. c gray58", "K. c #9492B7", "L. c #B79292", "P. c #A0A0A0", "I. c #A5A5A5", "U. c #AAAAAA", "Y. c #AEAEAE", "T. c #B2B2B2", "R. c gray70", "E. c #B4B4B4", "W. c #B6B6B6", "Q. c gray72", "!. c #B9B9B9", "~. c #BBBBBB", "^. c gray74", "/. c gray", "(. c gray75", "). c #A7A2EF", "_. c #98D4A4", "`. c #80E996", "'. c #ADF1BB", "]. c #EFA2A2", "[. c #C0C0C0", /* pixels */ "[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.", "[.[.[.[.[.[.[.[.[.[.[.5.E.[.[.[.[.[.[.[.[.[.", "[.[.[.[.[.[.[.[.[.[.>.$.M Y.(.[.[.[.[.[.[.[.", "[.[.[.[.[.[.[.[.[.!.1 A.$.{ T.(.[.[.[.[.[.[.", "[.[.[.[.[.[.[.[.[.>.$.A.A.% G.!.[.[.[.[.[.[.", "[.[.[.[.[.[.[.[.(.% A.A.A.~ _ I.[.[.[.[.[.[.", "[.[.[.[.[.[.[.[.>.~ A.A.A.Z.= G.~.[.[.[.[.[.", "[.[.[.[.[.[.[.(. A.G A.A.A.W ;.U.[.[.[.[.[.", "[.[.[.[.[.[.[.>.W A. l.A.A.c.K J./.[.[.[.[.", "[.[.[.[.[.[.[. A.2 W A.A.A.M 4.R.[.[.[.[.", "[.[.[.[.[.[.>.M A.A.A.A.A.A.A.$.^ P.[.[.[.[.", "[.[.[.[.[.[. A.W ~ A.A.A. F.!.[.[.[.", "[.[.[.[.[.H. A. A.A.A.~ _ I.[.[.[.", "[.[.[.[.>. c.A.1 = ^ ` 6 c.A.A.Z.1 [ !.[.[.", "[.[.2.:. A.A.A.A.2 ` *.~ A.A.A.A.m.# ;.!.[.", "E./ H J ! + > s R + # , g n 3 1.", "3.C &.M.N.] 5 + > .r.t.' 4 = # g o.a.j.P 6 ", "! @.V.D.].L.U 7 } w.y.).K.a u f X.g.k.'.(.I ", "! z.B.C.D.S.S e 6.q.e.y.u.t p z i.g.h.`._.v ", "! %.B.B.V.b.C s | q.q.w.0.0 ) m O.g.g.h.f.l ", "3.Z x.n.c.Q F u 8 7.9.8.T t =.x j p.d.s.E x ", "E.= A M C D #.,.+ w 7 0 t ..[.2.# l g j v +." }; bist-0.5.2/images/lb_draw_bond.xpm0000644000175000017500000000671611025523004015450 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_draw_bond_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 106 2", " c black", ". c gray1", "X c #040404", "o c gray2", "O c #060606", "+ c #070707", "@ c gray3", "# c #090909", "$ c gray4", "% c #0B0B0B", "& c #161616", "* c #181818", "= c gray10", "- c gray11", "; c #1E1E1E", ": c #202020", "> c gray13", ", c #222222", "< c gray14", "1 c gray15", "2 c #272727", "3 c #2C2C2C", "4 c gray20", "5 c #343434", "6 c gray21", "7 c #373737", "8 c gray22", "9 c #3E3E3E", "0 c #3F3F3F", "q c #414141", "w c gray26", "e c #434343", "r c #464646", "t c gray28", "y c #484848", "u c #494949", "i c gray29", "p c #4B4B4B", "a c #4C4C4C", "s c gray30", "d c #4E4E4E", "f c gray31", "g c #515151", "h c gray32", "j c gray34", "k c #5B5B5B", "l c gray36", "z c #606060", "x c #676767", "c c #6D6D6D", "v c gray43", "b c #6F6F6F", "n c #717171", "m c #727272", "M c gray45", "N c #747474", "B c #777777", "V c gray47", "C c gray48", "Z c #7C7C7C", "A c #7E7E7E", "S c gray50", "D c #818181", "F c #838383", "G c #898989", "H c gray54", "J c #8E8E8E", "K c #929292", "L c #939393", "P c gray58", "I c #979797", "U c gray60", "Y c #9A9A9A", "T c #9B9B9B", "R c gray61", "E c #9D9D9D", "W c gray62", "Q c #9F9F9F", "! c #A0A0A0", "~ c #A2A2A2", "^ c gray64", "/ c #A4A4A4", "( c gray65", ") c #A7A7A7", "_ c gray66", "` c #AAAAAA", "' c gray67", "] c gray68", "[ c #AEAEAE", "{ c #AFAFAF", "} c #B1B1B1", "| c #B2B2B2", " . c gray70", ".. c #B4B4B4", "X. c gray71", "o. c #B6B6B6", "O. c #B7B7B7", "+. c gray72", "@. c #B9B9B9", "#. c gray73", "$. c #BBBBBB", "%. c #BCBCBC", "&. c gray74", "*. c gray", "=. c gray75", "-. c #C0C0C0", /* pixels */ "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.=.O.K n T +.", "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.=.} c @ a ~ ", "-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.} x o 6 G ", "-.-.-.-.-.-.-.-.-.-.-.-.-.-.{ x o = i G ", "-.-.-.-.-.-.-.-.-.-.-.-.-.{ l & w n E ", "-.-.-.-.-.-.-.-.-.-.-.-.{ k o & 9 c T O.", "-.-.-.-.-.-.-.-.-.-.=.) k o = w c T O.=.", "-.-.-.-.-.-.-.-.-.=.) h o = w n T O.=.=.", "-.-.-.-.-.-.-.=.=.( h o ; w n E O.=.-.-.", "-.-.-.-.-.-.-.=.~ a o ; t N E O.=.-.-.-.", "-.-.-.-.-.-.=.~ t o ; t N ~ O.=.-.-.-.-.", "-.-.=.=.=.=.E i o > i N ~ +.=.-.-.-.-.-.", "-.-.-.-.=.E 9 @ > i V ~ +.=.-.-.-.-.-.-.", "-.-.-.+.T w @ > i V ~ +.=.-.-.-.-.-.-.-.", "-.-.=.P 8 @ > a V ( +.=.-.-.-.-.-.-.-.-.", "-.=.P 6 @ 1 a S ( +.=.-.-.-.-.-.-.-.-.-.", "+.P 6 @ 2 h A ( +.=.-.-.-.-.-.-.-.-.-.-.", "E 6 @ 1 h S ( =.=.-.-.-.-.-.-.-.-.-.-.-.", "n @ 2 h S ) +.-.-.-.-.-.-.-.-.-.-.-.-.-.", "G 3 > 4 k F ) =.=.-.-.-.-.-.-.-.-.-.-.-.-.-.", "} S c n J ) =.=.-.-.-.-.-.-.-.-.-.-.-.-.-.-.", "=.} ( ( } =.=.=.-.-.-.-.-.-.-.=.-.-.-.-.-.-." }; bist-0.5.2/images/lb_color_atom.xpm0000644000175000017500000001036711025523004015644 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ static const char * lb_color_atom_xpm[] = { "22 22 157 2", " c None", ". c #ADADAD", "+ c #FF0000", "@ c #CDCDCD", "# c #939393", "$ c #A3A3A3", "% c #080808", "& c #F40000", "* c #505050", "= c #000000", "- c #929292", "; c #C2C2C2", "> c #282828", ", c #313131", "' c #A5A5A5", ") c #1A1A1A", "! c #2C2C2C", "~ c #191919", "{ c #C3C8C4", "] c #727272", "^ c #373737", "/ c #4A4A4A", "( c #BDC5BF", "_ c #060606", ": c #010101", "< c #C7CAC7", "[ c #B2B2B2", "} c #0B0B0B", "| c #0F0F0F", "1 c #181818", "2 c #010008", "3 c #6D6D70", "4 c #C5C9C6", "5 c #000D03", "6 c #490606", "7 c #3A1515", "8 c #522C2C", "9 c #562D2D", "0 c #0B0505", "a c #000001", "b c #02001B", "c c #090539", "d c #171437", "e c #2E2C51", "f c #3A3667", "g c #06060D", "h c #000100", "i c #001B06", "j c #00350B", "k c #002E0A", "l c #0B3F16", "m c #165A24", "n c #210000", "o c #6C0F0F", "p c #9D4B4B", "q c #8A6F6F", "r c #363333", "s c #4F2C2C", "t c #09031B", "u c #020020", "v c #150F6C", "w c #514B9D", "x c #706F8A", "y c #333336", "z c #333158", "A c #040309", "B c #001A06", "C c #002007", "D c #006916", "E c #1C9536", "F c #488455", "G c #223225", "H c #2D6D3B", "I c #532D2D", "J c #670000", "K c #D71515", "L c #E35A5A", "M c #EFA2A2", "N c #B79292", "O c #341F1F", "P c #230A36", "Q c #070067", "R c #2215D7", "S c #635AE3", "T c #A7A2EF", "U c #9492B7", "V c #201F34", "W c #0E0D28", "X c #00390C", "Y c #006716", "Z c #00D32D", "` c #40DE62", " . c #ADF1BB", ".. c #BEBEBE", "+. c #223727", "@. c #920000", "#. c #D30000", "$. c #DA2B2B", "%. c #CA6161", "&. c #270F0F", "*. c #2A0729", "=. c #0A0092", "-. c #0E00D3", ";. c #372BDA", ">. c #6861CA", ",. c #100F27", "'. c #110D4B", "). c #00310B", "!. c #00921F", "~. c #29DA4F", "{. c #80E996", "]. c #98D4A4", "^. c #152919", "/. c #760000", "(. c #AE1919", "_. c #230303", ":. c #1F002F", "<. c #080076", "[. c #2319AE", "}. c #060323", "|. c #00410E", "1. c #007619", "2. c #33B24F", "3. c #07240D", "4. c #2B0000", "5. c #9E0000", "6. c #B90000", "7. c #AA0000", "8. c #590000", "9. c #4C0000", "0. c #03002B", "a. c #0A009E", "b. c #0C00B9", "c. c #0B00AA", "d. c #060059", "e. c #05004C", "f. c #002B09", "g. c #009E22", "h. c #00B928", "i. c #00AA24", "j. c #005913", "k. c #004C10", "l. c #550000", "m. c #2A0000", "n. c #220000", "o. c #230000", "p. c #4D0000", "q. c #060055", "r. c #03002A", "s. c #020022", "t. c #020023", "u. c #05004D", "v. c #005512", "w. c #002A09", "x. c #002207", "y. c #002307", "z. c #004D10", " ", " ", " . + ", " @ # + ", " $ @ @ % & + + + + ", " + + @ @ @ * = + = ", " + + - @ @ @ ; = + ", " @ > @ @ @ , ", " @ = - @ @ ' = ", " @ ) = ! @ @ @ ~ ", " + + @ @ @ @ @ @ { ] = ", " + + @ ^ = = = / @ ( @ _ ", " @ : = = = : @ < @ * = ", " [ @ } = = = = ' @ @ ; | ", " @ @ @ @ 1 2 3 @ @ @ @ 4 5 ", " 6 7 8 9 0 a b c d e f g = h i j k l m ", " n o p q r s t u v w x y z A B C D E F G H ", "I J K L M N O P Q R S T U V W X Y Z ` ...+.", "I @.#.$.L %.&.*.=.-.;.S >.,.'.).!.Z ~.{.].^.", "I /.#.#.K (._.:.<.-.-.R [.}. |.1.Z Z ~.2.3.", " 4.5.6.7.8.9. 0.a.b.c.d.e. f.g.h.i.j.k.", " l.m.n.o.p. q.r.s.t.u. v.w.x.y.z. "}; bist-0.5.2/images/lb_draw_bezier.xpm0000644000175000017500000000664011025523004016002 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_draw_bezier_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 103 2", " c black", ". c #010101", "X c #020202", "o c gray1", "O c #040404", "+ c #070707", "@ c gray3", "# c #090909", "$ c #0C0C0C", "% c gray5", "& c #0E0E0E", "* c gray7", "= c gray8", "- c #161616", "; c gray10", ": c #1B1B1B", "> c gray11", ", c #1D1D1D", "< c gray13", "1 c #232323", "2 c gray14", "3 c #272727", "4 c #282828", "5 c gray17", "6 c #2C2C2C", "7 c #2D2D2D", "8 c #323232", "9 c #343434", "0 c gray21", "q c gray22", "w c #3A3A3A", "e c #3C3C3C", "r c #3F3F3F", "t c gray25", "y c #434343", "u c #444444", "i c gray28", "p c #484848", "a c #494949", "s c gray29", "d c #4E4E4E", "f c gray31", "g c gray32", "h c #535353", "j c gray33", "k c #585858", "l c gray35", "z c gray36", "x c #606060", "c c gray38", "v c gray40", "b c #676767", "n c #686868", "m c DimGray", "M c #6A6A6A", "N c #6D6D6D", "B c gray43", "V c #6F6F6F", "C c gray44", "Z c gray47", "A c #797979", "S c #7E7E7E", "D c gray50", "F c #808080", "G c #818181", "H c gray51", "J c #868686", "K c #888888", "L c #898989", "P c gray55", "I c #8E8E8E", "U c #909090", "Y c gray57", "T c #939393", "R c gray58", "E c #979797", "W c gray60", "Q c #9A9A9A", "! c #9B9B9B", "~ c gray61", "^ c #9D9D9D", "/ c gray62", "( c #A2A2A2", ") c #A4A4A4", "_ c #A5A5A5", "` c gray65", "' c #A7A7A7", "] c #A9A9A9", "[ c #AAAAAA", "{ c gray67", "} c gray68", "| c #B1B1B1", " . c #B2B2B2", ".. c #B4B4B4", "X. c #B7B7B7", "o. c gray72", "O. c #B9B9B9", "+. c gray73", "@. c #BBBBBB", "#. c gray74", "$. c gray", "%. c gray75", "&. c #C0C0C0", /* pixels */ "&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.&.{ C 0 O & ", "&.&.&.&.&.&.&.&.&.&.&.&.&.&.( x 3 3 ", "&.&.&.&.&.&.&.&.&.&.&.R l ; 0 ", "&.&.&.&.&.&.&.&.&.&.&.' d @ @ d ", "&.&.&.&.&.&.&.&.&.&.&.#.[ G 2 > x ", "&.&.&.&.&.&.&.&.&.&.&.&.Q z O w A ", "&.&.&.&.&.&.&.&.K a ; @ h Y ", "&.&.&.&.&.&.Q > @ O 2 @ 1 b ' ", "&.&.&.&.&.@.& - 6 t 8 a w r j r a D .", "&.&.&.&.&.#.@ O w d b D K I Y I / R 6 m R #.", "&.&.&.&.&.@.@ i D ' ...@.@.@.#.@.Y Y [ &.", "&.&.&.&.&.@.O ; 0 { @.&.&.&.&.#.#.@. .@.#.", "&.&.&.&.&.&.' / @.&.&.&.&.&.#.&.&.&.", "&.&.&.&.&.&.@.Y O 1 R #.&.&.&.&.&.&.&.&.", "&.&.&.&.&.&.#.@.m t V { &.&.&.&.&.&.&.&.", "&.&.&.&.&.&.&.&. .R l / #.&.&.&.&.&.&.&.", "&.&.&.&.&.&.&.&.#.J h Q &.&.&.&.&.&.&.&.", "&.&.&.&.&.&.&.Y w * l / #.&.&.&.&.&.&.&.", "&.&.&.&.A a * - t C [ #.&.&.&.&.&.&.&.", "#. & * 8 d V Q @.&.&.&.&.&.&.&.&.", "#. & > 6 i h m J ' @.&.&.&.&.&.&.&.&.&.", "G V a i h x V D R ' ..#.#.&.&.&.&.&.&.&.&.&." }; bist-0.5.2/images/lb_save_as_file.xpm0000644000175000017500000000737411025523004016132 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_save_as_file_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 123 2", " c black", ". c gray3", "X c #090909", "o c #171001", "O c #131313", "+ c #181818", "@ c #1B1B1B", "# c #1E1E1E", "$ c gray13", "% c gray19", "& c gray21", "* c #3C3C3C", "= c #1D1648", "- c #4C3703", "; c #483737", ": c #4A3E3F", "> c gray25", ", c #444444", "< c #494949", "1 c gray29", "2 c #4C4C4C", "3 c gray31", "4 c #515151", "5 c #5D5D5D", "6 c #686868", "7 c #6D6D6D", "8 c gray44", "9 c gray46", "0 c #7B7B7B", "q c #3F28CB", "w c #422BCC", "e c #4630CD", "r c #4631CD", "t c #4934CE", "y c #4B35CF", "u c #4D38CF", "i c #503BD0", "p c #503CD0", "a c #523ED0", "s c #5440D1", "d c #5541D1", "f c #5440D2", "g c #5541D2", "h c #5844D2", "j c #5C49D3", "k c #5D4AD4", "l c #5D4BD4", "z c #604ED5", "x c #6352D6", "c c #6655D7", "v c #6656D7", "b c #6A59D8", "n c #6F60DA", "m c #7160DA", "M c #7161DA", "N c #7567DB", "B c #786ADC", "V c #796ADD", "C c #796BDD", "Z c #D30000", "A c #D50C0C", "S c #D50C0D", "D c #D61211", "F c #D92525", "G c #DE3F40", "H c #DE4040", "J c #E04A4A", "K c #E25556", "L c #E97F7F", "P c #8173DF", "I c #887CE2", "U c #E97F80", "Y c #FFB709", "T c #FFCB4E", "R c #818181", "E c #8B8B8B", "W c #929292", "Q c #9D9D9D", "! c #A2A2A2", "~ c gray64", "^ c #A5A5A5", "/ c gray66", "( c #A9A9A9", ") c #ACACAC", "_ c #AFAFAF", "` c #B1B1B1", "' c #B4B4B4", "] c gray71", "[ c #B6B6B6", "{ c gray72", "} c #B9B9B8", "| c #B9B9B9", " . c #BCBCBC", ".. c gray", "X. c gray75", "o. c #8D82E3", "O. c #8E83E3", "+. c #9086E4", "@. c #EC9090", "#. c #F3B7B9", "$. c #F3B8B9", "%. c #C0C0C0", "&. c #C1C1C1", "*. c #C6C6C6", "=. c gray79", "-. c #CACACA", ";. c #CBCBCB", ":. c #CDCDCD", ">. c #D7D7D7", ",. c #DDDDDD", "<. c #F7D1D2", "1. c #E4E4E4", "2. c #E7E7E7", "3. c #E9E9E9", "4. c #EEEEEE", "5. c #F1F1F1", "6. c gray95", "7. c #F3F3F3", "8. c #F6F6F6", "9. c #F9F9F9", "0. c gray98", "q. c #FDFDFD", "w. c gray100", /* pixels */ "%.%. | ....%.%.%.%.", "%.%. w.w.w.w.w.w.2.2.2.7. 0. ' %.%.%.%.%.", "%.%. w.w.w.w.7.0 . . . $ w.2. ' %.%.%.%.", "%.%. w.w.w.^ # @ . w.w.:. | %.%.%.", "%.%. w.=.& Y Y 1 4 w.w.w.) | %.%.", "%.%. ' @ - Y - , w.w.w.w. ' %.%.", "%.%. / . * =.w.1 o Y Y 1 ~ %.%.", "%.%. ) O w.O w.w.2 Y Y Y 2 w.w.O 5. Q %.%.", "%.%. ' $ w.$ w.w.2 2 Y Y - 2 2 $ 7. Q %.%.", "%.%. ' % w.% w.w.w.2 2 - Y Y 2 % 7. Q %.%.", "%.%. ..> w.> w.w.w. - Y T ", "%.%. %.2 w.2 w.w.w. O. ; T T G A | ", "%.%. *.5 w.5 w.w.w. O. : 2 J D d ", "%.%. =.6 7 ' w.w.w. O. #.<.$.L J A d ", "%.%. 2.R 8 8 R :.w. I L @.U K F Z u ", "%.%. w.0.' 9 8 8 W P u ", "%.%. w.w.w.4.! 8 8 V V V B M b x l d u ", "%.%. w.w.w.w.w.,.E n M u y ", "%.%. w.w.w.w.w.w.w. c v | l | } y r ", "%.%. 2.,.>.>.>.>.>. l l | h | } r w ", "%.%. = d | u | | w q ", "%.%.%.' / ^ ^ ! ^ ^ ! " }; bist-0.5.2/images/lb_exp_png.xpm0000644000175000017500000000674511025523004015153 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_exp_png_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 107 2", " c black", ". c #060606", "X c #070707", "o c #090909", "O c #0B0B0B", "+ c #0C0C0C", "@ c gray6", "# c #131313", "$ c #161616", "% c gray9", "& c #181818", "* c #191919", "= c #1B1B1B", "- c gray11", "; c #1E1E1E", ": c #220000", "> c #202020", ", c gray13", "< c #222222", "1 c #252525", "2 c gray15", "3 c gray17", "4 c #2C2C2C", "5 c gray18", "6 c #2F2F2F", "7 c #313131", "8 c #323232", "9 c gray20", "0 c #353535", "q c gray21", "w c gray22", "e c #3F3F3F", "r c #440000", "t c #660000", "y c #770000", "u c #444444", "i c gray27", "p c gray28", "a c #484848", "s c #4B4B4B", "d c #4C4C4C", "f c #4E4E4E", "g c gray31", "h c #505050", "j c #515151", "k c gray32", "l c gray33", "z c #555555", "x c gray34", "c c #585858", "v c #5A5A5A", "b c #5D5D5D", "n c gray37", "m c #5F5F5F", "M c gray38", "N c #686868", "B c DimGray", "V c gray43", "C c #727272", "Z c gray45", "A c gray46", "S c #7B7B7B", "D c #7C7C7C", "F c #7E7E7E", "G c #880000", "H c #990000", "J c #AA0000", "K c #BB0000", "L c #CC0000", "P c #DD0000", "I c #EE0000", "U c red", "Y c #818181", "T c #848484", "R c #8B8B8B", "E c gray57", "W c #939393", "Q c #9D9D9D", "! c #A2A2A2", "~ c gray64", "^ c #A5A5A5", "/ c #ACACAC", "( c #AFAFAF", ") c #B4B4B4", "_ c gray71", "` c #B6B6B6", "' c #B9B9B9", "] c #BCBCBC", "[ c gray", "{ c gray75", "} c #C0C0C0", "| c #C1C1C1", " . c gray79", ".. c gray80", "X. c #CDCDCD", "o. c #D8D8D8", "O. c gray87", "+. c gray88", "@. c #E1E1E1", "#. c #E7E7E7", "$. c #F3F3F3", "%. c #F4F4F4", "&. c #F6F6F6", "*. c #F9F9F9", "=. c gray99", "-. c #FDFDFD", ";. c gray100", /* pixels */ "} } } } } } } } } ", "} } ;.;.;.;.;.;.#.#.#.$. ;. } } } } } } ", "} } ;.;.;.;.$.S o o o , ;.$. [ } } } } ", "} } ;.;.;.^ ; & o ;.;.O. [ } } } ", "} } ;. .q + T $. j ;.;.;.} } } } ", "} } _ v @.;.;.i ;.;.;.;. ' } } ", "} } / # i X.;.;.;.;.;.j ~ [ } ", "} } _ 3 ;.3 ;.;.;.;.;.;.;.;.;.3 $. D ) } ", "} } } d ;.d ;.;.;.;.;.;.;.;.;.g $. n ~ } ", "} } X.V ;.V ;.;.;.;.;.;.;.;.;.V $. z Q } ", "} } o.E ;.E ;.;.;.;.;.;.;.;.;.E *. l Q } ", "A 2 & R V 9 B ;.B B @.B X a } ", "2 L U U P t 4 L U r R t U v G U U U I t A ", " U U K U U : U U P , y U G U I y H U K 3 ", " U K , : U y U U U r y U U I o e , r n ", " U K J U r U K U P y U U G q , % v ", " U U U U K U K y U H U U y , K U U K 3 ", " U P y r 2 U K U U U U J 9 r y U K 4 ", " U K & c F U K ; y U U P U t U K , ", " U K & W ` U K , U U : U U U U U J , ", "g t r c X.%.N t r n j r y 6 a H K K t % g ", "} M h C Y l w - & , 9 , @ & 4 , + X X & a D " }; bist-0.5.2/images/lb_draw_etich.xpm0000644000175000017500000000455311025523004015617 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_draw_etich_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 69 1", " c black", ". c #101010", "X c #202020", "o c gray19", "O c gray25", "+ c #555555", "@ c gray34", "# c gray35", "$ c #5A5A5A", "% c #676767", "& c #7B7B7B", "* c gray49", "= c #808080", "- c #888888", "; c gray55", ": c #909090", "> c gray58", ", c #979797", "< c #9B9B9B", "1 c #9D9D9D", "2 c #9F9F9F", "3 c #A0A0A0", "4 c gray63", "5 c #A2A2A2", "6 c #A5A5A5", "7 c gray65", "8 c gray66", "9 c #A9A9A9", "0 c #AAAAAA", "q c gray67", "w c gray68", "e c #AFAFAF", "r c gray69", "t c #B1B1B1", "y c #B2B2B2", "u c gray70", "i c #B4B4B4", "p c #B6B6B6", "a c #B7B7B7", "s c gray72", "d c #B9B9B9", "f c #BBBBBB", "g c #BCBCBC", "h c gray74", "j c gray", "k c gray75", "l c #C0C0C0", "z c #C1C1C1", "x c gray77", "c c #C6C6C6", "v c #C8C8C8", "b c gray79", "n c #CACACA", "m c #CECECE", "M c gray81", "N c #D0D0D0", "B c gray82", "V c #D5D5D5", "C c gray84", "Z c #D8D8D8", "A c gray85", "S c #DDDDDD", "D c #DFDFDF", "F c #E6E6E6", "G c #E9E9E9", "H c #ECECEC", "J c #EFEFEF", "K c #FBFBFB", "L c gray100", /* pixels */ "llVJJJJJJJJJJJJJJJJVll", "lxJOOOOOOOOOOOOOOOODvl", "lNk kvk", "lNk .wJLLO OLLJ2. kff", "lNk k6##VO ON#%el k7f", "lNk L+*:FO OV-<:L 5fu", "lvDlk=wkJO OA6kkDND. */ /* XPM */ const static char *lb_rotate_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 206 2", " c black", ". c #010000", "X c #060000", "o c #040404", "O c gray2", "+ c #0A0000", "@ c #0E0000", "# c #0B0B0B", "$ c #150000", "% c #190000", "& c #1A0000", "* c #1B0000", "= c gray7", "- c gray8", "; c #161616", ": c #191919", "> c gray10", ", c #1B1B1B", "< c #210000", "1 c #2A0000", "2 c #2F0000", "3 c #310000", "4 c #320000", "5 c #370000", "6 c #3A0000", "7 c #222222", "8 c #252525", "9 c gray15", "0 c #282828", "q c #282829", "w c gray16", "e c #2A292A", "r c #2A2A2A", "t c gray17", "y c #2C2C2C", "u c #2D2C2D", "i c #2D2D2D", "p c gray18", "a c #2F2F2F", "s c gray19", "d c #313131", "f c #323232", "g c #323332", "h c gray20", "j c #333433", "k c #343433", "l c #343434", "z c #343535", "x c #353535", "c c #353635", "v c #363536", "b c #393938", "n c #393939", "m c gray23", "M c #3C3B3C", "N c #3C3C3B", "B c #3D3C3D", "V c #3F403F", "C c #450000", "Z c #540000", "A c #560000", "S c #590000", "D c #5B0000", "F c #5C0000", "G c #620000", "H c #660000", "J c #680000", "K c #690000", "L c #6D0000", "P c #730000", "I c #760000", "U c gray25", "Y c #414140", "T c #414141", "R c #424142", "E c gray26", "W c #444444", "Q c #444544", "! c #454444", "~ c #454645", "^ c #464545", "/ c #464646", "( c #484748", ") c #484848", "_ c #494949", "` c gray29", "' c #4B4B4A", "] c #4B4B4B", "[ c #4E4E4E", "{ c #515150", "} c #515151", "| c gray32", " . c #535252", ".. c #535352", "X. c #535353", "o. c #575756", "O. c gray34", "+. c #585858", "@. c gray35", "#. c gray36", "$. c #5D5C5D", "%. c #5D5D5D", "&. c #5E5E5F", "*. c #606060", "=. c #606061", "-. c #656565", ";. c #666667", ":. c #676666", ">. c #676667", ",. c #676767", "<. c DimGray", "1. c gray42", "2. c #6C6C6C", "3. c #6D6C6D", "4. c #6D6D6D", "5. c gray43", "6. c #6F6F6F", "7. c #6F6F70", "8. c gray44", "9. c #717171", "0. c #727272", "q. c #747374", "w. c #747474", "e. c #777776", "r. c gray47", "t. c #7B7B7C", "y. c #7C7B7B", "u. c #7C7B7C", "i. c gray50", "p. c #970000", "a. c #9B0000", "s. c #A10000", "d. c #A90000", "f. c #AB0000", "g. c #AE0000", "h. c #B20000", "j. c #BA0000", "k. c #BE0000", "l. c #C50000", "z. c #CD0000", "x. c #D50000", "c. c #D80000", "v. c #DF0000", "b. c #E10000", "n. c #E40000", "m. c #EB0000", "M. c #ED0000", "N. c #F10000", "B. c #F50000", "V. c #F80000", "C. c #FE0000", "Z. c red", "A. c #818081", "S. c gray51", "D. c #848383", "F. c #848384", "G. c #848484", "H. c gray52", "J. c #878686", "K. c #878687", "L. c gray54", "P. c #8B8B8B", "I. c gray55", "U. c #8E8D8E", "Y. c #8F8F90", "T. c #908F90", "R. c #909090", "E. c gray58", "W. c #9A999A", "Q. c #9B999A", "!. c #9A9A9A", "~. c gray61", "^. c #9D9D9D", "/. c #9E9D9E", "(. c #9E9E9F", "). c #A1A0A2", "_. c #A4A4A4", "`. c #A6A5A5", "'. c #A6A5A6", "]. c #A7A6A7", "[. c #A7A7A7", "{. c #A9A9A9", "}. c gray67", "|. c gray68", " X c #AEADAE", ".X c #AEAEAE", "XX c #AFAEAE", "oX c #B2B1B2", "OX c #B3B2B3", "+X c #B4B4B4", "@X c gray71", "#X c #B7B7B7", "$X c gray72", "%X c #BAB9BB", "&X c gray73", "*X c #BBBBBB", "=X c gray74", "-X c #BEBDBD", ";X c #BEBDBE", ":X c gray", ">X c gray75", ",X c #C0C0C0", "X. s.Z.Z.c.G ] =.o.B E 6.!.$X,X,X,X,X*X@X$X", ",XR.% k.Z.Z.b.a.G 5 @ @ X #X,X,X,X,X,X,X,X,X", ",X=X8.< g.V.Z.Z.m.Z.Z.Z.P <.,X,X,X,X,X,X,X,X", ",X,X$X8.$ S l.M.Z.Z.Z.N.L F r.,X,X,X,X,X,X,X", ",X,X,X@XP.^ = O . . . o a +..X=X,X,X,X,X,X,X" }; bist-0.5.2/images/logo.xpm0000644000175000017500000114311511025523004013770 0ustar cagecage/* XPM */ static const char*logo[] = { /* columns rows colors chars-per-pixel */ "448 343 256 2", " c #030200", ". c #090500", "X c #0C0902", "o c #0C0D09", "O c #050806", "+ c #0D1109", "@ c #130C00", "# c #190E00", "$ c #110C06", "% c #141104", "& c #13130B", "* c #1B1201", "= c #1A170B", "- c #1B1B13", "; c #161815", ": c #0C1011", "> c #1D2018", ", c #221400", "< c #241902", "1 c #291600", "2 c #2C1A00", "3 c #241B0A", "4 c #321C00", "5 c #371901", "6 c #22190D", "7 c #2C2107", "8 c #252419", "9 c #342101", "0 c #3B2300", "q c #3C2902", "w c #36270A", "e c #352A14", "r c #393113", "t c #282A27", "y c #2D333A", "u c #35342A", "i c #373836", "p c #2D302A", "a c #1D2221", "s c #3C3D40", "d c #3D403B", "f c #3D4245", "g c #412600", "h c #442A00", "j c #4B2D00", "k c #442B09", "l c #4C3101", "z c #483307", "x c #493513", "c c #502E00", "v c #572905", "b c #513000", "n c #593500", "m c #5C3A00", "M c #553A06", "N c #573B15", "B c #442D11", "V c #433D2D", "C c #623C00", "Z c #683E00", "A c #643B09", "S c #683308", "D c #441D03", "F c #5B4207", "G c #5A4318", "H c #44443A", "J c #534931", "K c #644101", "L c #6B4300", "P c #674807", "I c #68471A", "U c #704600", "Y c #754A00", "T c #794D00", "R c #754A09", "E c #724D1C", "W c #7D5000", "Q c #775707", "! c #76521C", "~ c #6B520E", "^ c #7C5520", "/ c #775B22", "( c #695526", ") c #79621F", "_ c #4B4C4B", "` c #464744", "' c #55554A", "] c #525352", "[ c #5A5B5A", "{ c #585A55", "} c #4C504E", "| c #5C615A", " . c #5C6463", ".. c #65645B", "X. c #736A53", "o. c #636363", "O. c #6B6B6B", "+. c #676A65", "@. c #737373", "#. c #7B7B7B", "$. c #767A78", "%. c #6F736E", "&. c #5C5A55", "*. c #403E42", "=. c #787D80", "-. c #7B827B", ";. c #7B8484", ":. c #7F9488", ">. c #AE3202", ",. c #835301", "<. c #885601", "1. c #8B5802", "2. c #855806", "3. c #935B02", "4. c #985E01", "5. c #915804", "6. c #85540D", "7. c #845A22", "8. c #886407", "9. c #9C6202", "0. c #966506", "q. c #966D11", "w. c #8E6E2A", "e. c #A26503", "r. c #A56803", "t. c #AA6903", "y. c #A76805", "u. c #A56A13", "i. c #B26C03", "p. c #B76B07", "a. c #B57105", "s. c #BA7202", "d. c #B67807", "f. c #AB7811", "g. c #AA6715", "h. c #877A61", "j. c #C27601", "k. c #C57800", "l. c #C97A00", "z. c #CA7206", "x. c #D17E00", "c. c #DA7800", "v. c #C67914", "b. c #D55E01", "n. c #C13D00", "m. c #B5870C", "M. c #B18E33", "N. c #9E812F", "B. c #8A8677", "V. c #AD945E", "C. c #C9861A", "Z. c #C8970B", "A. c #D48100", "S. c #DB8400", "D. c #D98804", "F. c #D5971A", "G. c #CF9312", "H. c #DB9422", "J. c #CC8E25", "K. c #D9A50B", "L. c #DAA41B", "P. c #CFA112", "I. c #DDA822", "U. c #DAA726", "Y. c #D4AB39", "T. c #E48900", "R. c #E98C00", "E. c #E18600", "W. c #F19100", "Q. c #E99309", "!. c #E49622", "~. c #E69823", "^. c #E99C23", "/. c #F09E25", "(. c #E4AC0B", "). c #EBB20C", "_. c #FABD0D", "`. c #F4B80C", "'. c #EAAC16", "]. c #EBA222", "[. c #EEA922", "{. c #E4A923", "}. c #F1AC22", "|. c #F5A425", " X c #F5B321", ".X c #FBB823", "XX c #E7B227", "oX c #DCB648", "OX c #DBB546", "+X c #CFAA43", "@X c #E2BA49", "#X c #C19E41", "$X c #FEC10D", "%X c #FFC90E", "&X c #FEC523", "*X c #F4C965", "=X c #838383", "-X c #8B8B8B", ";X c #868A88", ":X c #8B9595", ">X c #929392", ",X c #9B9B9B", "Xh.;.@.....] | o.@.h.-X4XhXzXCXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXvXeX6XrXB.%._ V t - = & & u u | ,XaXGXJXJXJXJXJXKXSXbX5X,X..H ' u ; O @ o o . . o X & V } +.B.4XqXvXcXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXqX-X..e 8 8 # . . . . & u -.eXvXGX0X6XB.O.` = & X . o & X X @ * * 1 , 2 0 9 w w 1 @ # @ X X 3 p ' ..;X0XzXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXpX%.V * 3 & o X . @ @ @ # . . . . . . . . 3 ' @.8 - X . X X o . o 3 1 g g z n M K L Y T R 4.<.1.2.T C C m j 0 4 2 * @ . % % p ' ;X1XIXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXpX%.V @ @ @ @ . @ # 2 5 0 0 0 4 2 , * # . . . . . . o o $ = o . X 3 z R ,.4.5.e.t.y.t.t.t.y.t.r.t.e.9.9.r.9.9.9.1.W W K M h 9 < = $ o . % u @.;X6XbXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXzXB.i @ % @ @ @ 2 l b n b c b b b n c j g 0 4 , * @ . . . . o X $ $ X * w n 2.4.t.t.e.t.y.e.y.e.e.e.e.r.4.e.e.9.9.9.9.4.0.9.0.9.4.9.3.Q L A j w 2 & O . . 8 ' 1XiXcXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSX6X' * * @ X @ 7 n <.t.e.2.U m c c c c c c b c b b h 9 < , * X @ X X % w P 5.t.t.r.r.r.r.y.q.y.y.e.e.e.e.e.4.9.0.9.9.9.9.4.1.0.4.3.0.5.3.4.3.0.4.<.K M q < % o o X i ..4XvXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXbX$.8 * = = X , n <.u.t.r.r.u.4.<.U m c c c b c b c l b j j j 2 X . @ 9 K 5.t.e.r.e.e.e.e.r.9.0.e.e.e.e.e.e.9.r.9.4.9.3.8.1.0.4.1.0.3.3.3.3.5.4.3.1.3.0.3.1.T b 7 < . X + > ' >X0XvXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXaX&.3 = 3 X @ h T t.i.u.y.e.e.u.e.0.e.6.K b v c c c c n b j 0 < # X < M <.t.r.e.e.e.e.e.e.e.e.e.e.e.y.e.e.e.4.5.2.W 6.W 6.6.2.5.4.3.3.4.1.4.0.4.3.1.0.1.0.1.1.1.3.W K 4 * X X 8 { >XyXSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXbXJ = = = o # m 4.a.a.y.u.t.t.t.e.e.u.e.y.5.Y n c b c c n c 0 # . * b T 4.e.y.e.r.e.e.e.y.e.e.e.9.0.3.5.1.W T U K K L R R 6.6.1.5.4.3.0.5.1.5.3.0.<.1.4.1.1.3.<.0.1.3.3.W m j 1 < X X X % u %.aXCXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXCXvXMXCXvXCXGXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXVXX.% = $ X * L a.p.i.i.t.f.t.t.u.e.e.y.e.q.r.9.6.A c c c j 4 @ @ n 4.9.9.9.4.9.0.4.4.3.<.,.2.T R Z C C n b b n c j m m n R 6.3.4.1.0.3.3.5.4.1.<.3.0.3.3.1.<.2.0.1.1.2.3.1.3.Y M j < @ . o % p ..6XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXaX5X,X@.+...| | [ ..B.=X1XeXhXMXCXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX#.3 % o . 9 P a.a.i.p.f.p.t.t.y.u.e.r.e.e.e.e.0.4.1.K c c 0 . X g l M A A U Y L K K A n n m j c j h g 0 9 0 0 2 , 1 3 2 q 2.4.5.4.4.1.4.5.1.4.3.1.3.<.3.1.3.1.<.2.1.<.<.1.1.<.<.2.L b < * X > ;XaXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXvXdXXaXJXJXJXJXJXJXJXJXJXGXAX4XB.] u X X % X % @ . . . . . . . . . X o % @ 8 B.gXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXhXe @ X 0 3.t.a.a.a.a.p.f.i.a.t.t.u.r.q.e.e.0.y.0.y.0.u.4.T b 0 , # X X . . . X X @ # # * @ X @ . . . . X @ # , j L 2.4.3.5.1.2.2.2.3.4.3.3.1.3.5.1.1.1.1.1.1.1.1.1.2.<.1.<.<.<.,.<.1.1.<.K h 1 @ X H XX o X q i.a.s.9.M . X = * 3 < 3 , e K <.r.t.r.e.y.e.9.9.e.e.e.9.0.4.9.6.m j c c c b c c b 4 # * 0 M % = g L <.1.4.1.4.3.5.,.Z n m n C R 1.3.3.3.<.<.1.1.1.1.2.1.1.<.2.1.1.<.,.1.<.<.,.<.<.W <.<.W <.<.<.<.<.<.1.<.3.3.9.,.b # o X < m 1.9.9.9.9.9.9.4.4.9.9.9.e.9.9.9.4.e.9.e.4.4.9.4.4.e.4.e.T w @ $ $ X i >XzXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXB.i & . X X o O & & % o o o X o + + & i >XSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXNXu . @ < 2.s.p.4.B 7 F ) q.q.q.q.w.~ z 7 1 F <.9.r.0.e.r.9.9.4.u.4.9.e.4.9.R c c c c c j g 1 X 1 g 9 * % 9 F <.8.5.5.4.4.4.6.U n c c m m U ,.1.1.3.9.1.1.1.1.1.2.1.1.<.<.2.<.,.1.,.,.<.W <.<.<.<.<.W ,.W <.,.<.<.<.<.1.1.1.3.1.1.n w j P 4.4.4.4.4.4.9.9.4.4.4.4.9.4.9.9.9.4.4.4.4.4.4.4.4.4.9.9.4.9.,.h @ O o % 3 ' cXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCX5X` X . . . @ @ @ # # @ @ X o o + ; & ; @.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX5XX @ @ P s.a.t.K t N.U.{.{.{.{.{.XXXXP.q.F = 6 R 0.u.e.9.q.9.e.q.9.4.9.9.9.6.c c b c j < # * 0 l 9 X < m W 5.3.9.3.3.9.1.T Z c c c b c Z <.1.1.1.U K 1.1.1.1.1.2.<.<.2.<.<.2.1.,.,.,.,.,.,.,.W <.<.W <.W <.,.,.,.<.W <.<.<.1.1.3.4.4.4.4.5.5.1.4.3.3.4.4.3.3.3.4.3.3.4.3.4.4.4.4.4.4.4.4.9.5.9.9.4.3.4.<.b * . X % X -.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXuX..& . . @ , 1 2 4 4 4 5 4 5 2 , @ % o : & & o #.SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX+.. X , 4.a.a.9.N M.@XoXU.I.I.I.U.I.I.I.XXI.Q 7 * m 4.9.e.q.r.e.4.e.9.9.9.9.1.m b c h 2 @ 0 P K 9 * 0 W 3.9.4.3.3.3.3.2.U n c c c c z k Q ,.4.1.1.w * 1.1.1.1.1.1.2.<.<.<.<.<.,.,.,.1.<.,.,.,.<.W W <.W W W ,.,.W <.,.<.<.1.<.5.1.5.3.3.5.5.5.1.3.3.3.3.3.3.3.3.4.3.3.3.5.4.4.3.3.3.4.3.4.4.3.3.3.3.3.3.4.3.m * . % p 6XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX1Xp X . # 1 9 0 0 5 5 4 4 4 4 5 4 4 7 , % & & & : - -.VXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX' X w s.d.i.q.w.@XoXoXoXY.U.I.L.I.I.I.I.I.XXm.7 , m 9.4.e.e.0.4.y.q.e.e.9.0.Z b 0 2 9 b 2.U < 2 M <.0.5.4.4.3.3.1.T Z b c c g 0 0 j T 1.4.<.1.1.K m 1.1.2.<.<.<.<.<.<.<.W <.,.,.,.,.,.,.,.,.W W W W W ,.W W ,.,.,.,.,.,.<.<.<.<.3.1.1.5.3.5.5.5.3.3.3.5.3.3.3.3.5.3.3.5.3.4.5.3.3.5.3.1.4.3.3.4.5.3.3.3.1.0.K , O o o u dXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXO.& . . @ , 9 h q q q 0 0 0 4 5 9 4 2 4 4 4 1 , @ o & ; - -.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXnX8 . . k d.a.p.v.oXoXoXoXoXOXY.Y.I.I.I.I.I.I.I.I.! = 1 R e.9.e.q.y.9.0.e.9.9.4.Y 2 2 j <.4.L , 9 Y 1.4.0.3.4.5.3.2.R n j c c g , , N <.3.1.L Y 1.1.1.3.<.<.2.<.<.<.,.<.<.<.<.W ,.,.,.W ,.,.,.,.<.Q <.W <.T W W ,.W ,.,.,.W <.<.,.<.<.<.5.,.1.<.5.<.<.<.1.5.<.5.5.5.1.1.5.<.5.5.5.5.3.5.5.1.1.1.1.1.5.<.<.<.1.<.<.m * o o % +.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX0Xd . . , 0 0 j j 0 g q g g 0 0 5 4 4 2 5 4 2 4 2 * $ o & o - ;XAXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXqX . q i.i.y./ @XoXoXoXoXoXoX@XY.I.I.I.I.I.I.I.m.r 8 9 8.9.9.e.r.e.9.e.9.9.5.M < K 0.4.m = 9 W 4.4.5.3.4.5.<.T L c c c g 9 @ # m 3.1.,.C 4 C 1.1.1.1.2.<.2.<.<.<.2.<.,.,.<.W <.<.W W ,.W W W ,.,.,.,.W T W W W W ,.,.,.,.,.,.,.,.,.,.,.,.<.,.<.<.<.,.W <.1.<.<.1.1.<.1.1.1.1.1.5.1.<.<.<.<.<.1.<.2.1.,.,.1.,.,.1.n @ . $ X eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX;X; . % 9 g j j 0 < O + F ) Q ~ & * q j j g j j q g h g g q 4 * @ X # 1 4 0 5 , . ' vXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX+.. @ , t.d.e.K 3 M.oXoXoXoXoXoXoXoXoXoXoXoXY.).I.I.L.m.w.O X % l ,.r.t.r.t.r.r.3.g 9 9 w g j l K Y <.4.4.8.3.1.1.3.1.1.<.<.<.<.2.<.W <.,.<.<.W <.W W T ,.W ,.T W W T T W T W T W T W T T T T Y T T T T T T T T Y T T T T Y T Y T T T Y Y T T T Y Y T T Y Y L m h 1 l j j c c c c c n c c b j h 4 , 2 q P q.f.G.H.F.~.m.N % 9 h * . & 1XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXIX> o X 2 h j j j 9 < + G U.XXXX{.G @ 9 j j j l j j j j h g 2 @ , w 9 w 9 $ . , 9 5 0 , , eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX6X@ X * 1.s.p.3.+ / @XoXoXoXoXoXoXoXoXoXoXoXY.I.{.I.L.N.q O % h 2.r.y.t.r.4.Y T 2.t.4.1.3.0.9.4.4.4.3.3.1.8.1.1.1.<.1.1.2.2.<.,.<.,.,.,.Q <.W <.W <.W W W T W T T T W W T T T T T T T T T T T Y T T T T T T Y T T T T T T Y Q Y Y Y T T Y T T Y Y T T T Y Y U m m m K n c c c c c c c c j g 2 X 3 A u.F.F.F.F.F.F.C.F.F.C.G * 0 , X % { SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX] o . . 2 g j j j g 9 G ( M.oXU.L.XXm.3 , j j j j q j g h g g @ 4 0.m.f.f.d.R 1 @ 1 5 0 5 @ ..MXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXu @ X g y.d.e.7 x @XoXoXoXoXoXoXoXoXoXoX@XY.I.L.P.N.F O X 9 Q t.r.r.<.K k # . 2 K 4.9.9.4.0.5.1.<.3.1.1.1.1.1.<.<.<.<.<.2.,.<.,.,.,.,.<.W W W W W W W W ,.T W T T T W T W T T T T T T T T T Y W T T T T T T Y T Y Y T T Y Y Y T T Y Y T T T Y T T T Y Y Y Y K M b n h b j c c n c c g 2 @ @ l g.C.F.F.Z.G.F.F.F.F.F.G.F.J.q 1 4 X @ u cXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX;.; * 0 j j j j 9 G Y.#XY.oXY.XXL.L.z % 0 j j h j j j h h , * w.F.G.C.C.F.H.0.7 * 4 0 0 * . & 5XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX@.@ . . L d.t.U - Y.oXoXoXoXoXoXoXoXoXoXoXoXL.U.q.G O X 4 T a.t.r.Y 4 o @ X X Y 4.3.3.3.4.1.3.1.1.1.1.<.1.<.<.<.<.<.<.W <.,.,.,.W ,.,.W ,.W W W <.T T T W W T W W T T T T T T T T T T T Y T T Y T Y T T T T Y T T Y Y T T Y T Y T T Y Y T Y T Y T T Y U U K n c g 4 j c c c j 5 @ X 0 2.Z.H.F.F.G.L.H.L.L.F.F.F.F.F.F.q.< 9 @ . 8 gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXt @ q h g q j 0 x #X@X#XY.oXoXU.L.XX~ X 9 j g l l g h h 0 # ( Y.J.C.G.F.Z.C.F.0.3 , 5 0 0 * ..CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXqX, $ X z a.p.y.z I oXoXoXoXoXoXoXOXoXoXoXoXL.m.B O X 1 T y.t.9.P * & @ * * * @ @ 2 9.0.3.3.2.3.4.2.1.1.1.2.1.<.<.2.W W ,.<.W W ,.T ,.W W W W W W W W T T W T W W T T T T T T T T T T Y Y T T Y T T Y T Y T T Y Y T T Y T Y Y Y T Y T U T T T T T Y T T Y Y Y K m c b , 4 h c g , . 9 ~ d.F.F.F.L.F.F.L.H.L.I.L.F.L.L.L.L.P.w 2 @ . & 0XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX| O 9 j j j j h 2 w.+XoX#X+XoX@XU.L.XX8.% 9 h j j j l h j 1 w M.OXOXU.F.G.C.C.D.v.N * 4 0 q 4 . . t qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXV # . @ R s.d.t.k Y.@XoXoXoXoXoXOXoXOX@XoXM.P X , U a.e.4.M & @ * 4 0 0 g 1 @ % R 3.3.3.1.1.1.1.1.<.<.<.2.<.<.<.<.,.,.W <.Q ,.,.W W W W W T W T T T T W T T T T T T T T T T Y T Y T T T W Y T Y T Y Y Y T Y T T Y T T Y Y T Y T T Y Y Y Y Y Y Y Y Y Y Y Y L C b b 0 * , 0 @ 0 f.F.F.G.F.F.L.L.L.L.I.I.U.{.U.U.Y.H.Y.U.M 2 % . O ;XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXeX8 X q h j j l q q M.@XoXoXoXoXoXY.L.XXq.= 7 j l h h j j h @ I Y.+XY.Y.H.J.G.G.C.A.6., 9 q g h , o X B.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXX0XvXGXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX1X8 X $ r 4.e.<.< X x M.#XoXoXw. . X M i.9.r.m * g 0 0 , = # X * 4 5 2 2 @ 6 <.1.<.<.<.<.2.<.W ,.,.<.W W W T W W W W W T T W T W T T T T T T T T T T Y T Y Y Y T T Y T Y Y T K g @ 3 9 4 9 2 @ X o 9 K Y Y Y Y Y Y Y T Y Y Y Y T Y Y Y Y T U Y Y Y T U K b b c c j X N m.L.I.I.I.I.I.I.XXY.oXoXoXoXoXoXoXoXoXoXoXN.* * X o t MXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX;X+ O w h j g j g l l r M.@XoXoXoXoXoX@XY.I.C.7 * h j h j j j j 9 X w.+XOXOX+XY.Y.Y.C.v.C.C.R 9 9 g g k 2 = = i gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXLXbX1XH 3 8 8 ' 1XaXSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX#.3 . ; B 4.4.3.2 o % G N.N.e X X < 5.e.y.4.w . 0 1 X X # , , = & , 1 5 5 * = T 5.<.<.<.,.Q ,.,.W ,.W ,.W W W W W T W W T T T T Y T Y T T T Y T T Y T T Y Y T Y Y Y Y Y Y Y T 0 X 4 0 0 0 0 0 4 , @ < m T Y Y Y Y Y Y Y Y Y Y T Y Y Y U T Y Y Y Y Y Y U b j c b b , % q.L.I.I.I.I.I.I.Y.@XoXoXoXoXoXoXoXoXoXoX@Xw.< 1 @ & - kXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX` . @ 0 j j l l g j h z #XoXoXoXoXoXoXoXOXY.m.< 1 j j h l g j j 9 . ) OXoX+XY.Y.Y.Y.C.D.C.v.R w q 0 0 g 9 8 = + ,XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLXvXqX6XB.d > 8 8 p 8 > e u %.aXvXCXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX1Xt . $ g ,.4.5.l < O = O . * M t.e.e.T * , @ * b n b x 3 - & * 1 = = L 1.<.<.<.<.Q <.,.W ,.W W W W W W W T W T T T T T Y Q Y T T Y T Y T Y T T Y Y Y T T Y Y Y Y Y P @ 4 g q 0 w 0 9 9 4 4 @ * K Y Y Y Y Y Y Y Y Y Y U T Y Y Y Y T U Y Y Y Y U m j c b b j @ q C.L.I.I.I.L.U.oX@XoXoXoXoXoXoXoXoXoXoX@X( 3 9 X % 8 vXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX5X; . < q j j j j j j 9 G Y.oXoXoXoXoXoXoXY.XXQ * 9 z h l j q l j g X ~ Y.oXOX+XY.Y.U.C.Z.C.F.K k k q g g 0 7 > + o.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXgXyXrX' p * = - = > > > > > t p 8 V { %.>XbXVXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX5Xp . X 3 C 0.r.Q j 7 . X w 9.4.r.4.4 . # @ 4 j j c c c b j @ 1 , $ m <.,.<.<.W <.,.,.,.T ,.W W W W W W W T T T T T T T Y Y T Y T Y T T T Y T T Y T Y Y Y Y Y Y Y N , g q 5 0 5 5 4 4 4 4 1 X 2 U Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y T T m b c b c l * O ! U.U.I.I.U.oXoXoXoXoXoXoXoXoXoXoXoXoX@XG * 2 . & *.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX+.o O # g j j h q l j h < N +XoXoXoXoXoXoXoXXXU.G < g j j h j j l j h % 9 M.oX+XOXY.Y.Y.J.v.C.k.m w 0 0 5 g 5 , & & u hXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXcXdXwXB.u 8 3 7 7 % % * = 7 8 3 = = = 8 8 8 - - 8 i +.aXCXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXIX_ . . @ z W t.t.K O * Y t.e.9.R & X * j b b c c j c c c 0 @ @ 1 . b 1.,.W <.W ,.,.,.W 2.W T W T W W T T T T T T T T T Y Q T Y T Y Y Y T Y Y Y Y T Y Y Y Y Y Y T 7 0 g h 5 q 5 2 4 4 2 4 4 < & . l Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T m b j b b b 9 X > m.L.U.U.oXoXoXoXoXoXoXoXoXoXoXoXoXoX+Xw 2 0 X X =XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXt O , g j j j l l h j , ~ +XoXoXoXoXoXoXOXY.q.7 9 g j j j j j h j j < X / +X+XY.U.J.J.J.C.C.f.k * 4 0 0 q g , @ o t IXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLXvX4X{ - 8 8 3 2 * # * 1 h Y 3.<.F r 8 p y t > > * - > > > 8 ..7XyXMXAXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXH ; . 1 L 1.4 o 2 y.9.t.9.4 o . , j b c c c n c c c c n 0 O 4 X b 1.,.2.,.,.W ,.,.T ,.T W W T T T W T T Y Y T T T T T Y T Y Y T T Y Y T Y Y Y Y T Y Y Y Y U L 3 g g g g 5 0 4 4 9 2 4 2 5 1 % * L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Z b c b c c j # 8.U.U.OXOXoXoXoXoXoXoXOXoXoXoXoXoX@XM.w w 0 X o [ ZXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX-.& o . 2 q q l j j h j l % w.oXOXoXoXoXoXoX@XU.q * 0 j h q h j h q j j 0 @ x M.OXOXY.J.Y.J.C.A.5.< * 4 0 0 0 g 1 . @ = 7XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXCXzXwX;X} 8 8 8 3 * # 2 9 l C 4.k.A.l.a.~ H ] %.;X;.%.u = % 7 3 - > > 8 u { ;XaXgXLXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSX#.u X $ 4 . & U t.y.e.4.@ @ * j b b c c b c b c c b j j X 2 . b ,.,.,.W <.W W W W W ,.T T T T T W T T T Y T T Y T T Y T Y T T T Y T Y Y Y Y Y Y Y Y Y Y T c 9 h q q q 5 2 2 9 7 1 1 2 5 4 , O g U Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T K c b j c b c 5 . w m.Y.oXoXoXoXoXoXoXoXoXoXoXoXoXoX@X) = q 4 @ = %.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXV o X X 0 j j l h h j h l 1 z M.oXoXOXoXoXoXoX~ = 9 j j h h j j j j h j j % & N.Y.+XY.Y.Y.F.C.C.I # 1 0 5 5 0 0 1 . o X ;XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXAXhX1X+.H 8 % & = ; % 2 j U 1.t.k.x.A.l.l.l.9.w p d ;.iXxXlX4X( = * X < 8 e 8 - 8 p 8 J >XwXVXGXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXo.6 o . . 5 e.t.y.9.Y . * j b c b b c c c b b c b c c 4 . . C ,.,.<.W ,.W W W T W T T W T T T T T Y T T Y Y Y T T Y Y T Y Y Y Y Y Y Y Y Y T Y Y Y Y Y T 1 q j 0 9 , # & + = ; & @ , 4 4 2 @ . Z Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y L j n j j n c j # X Q Y.oXoXoXoXOXoXoXoXoXoXoXoXoXoXOXx * j 4 @ = 1XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXp X . X 0 j j j j j j j h 9 = M.oXoXoXoX@XoX) % 2 j j j l l j j j j h h g 1 X x M.Y.Y.Y.J.J.G.t.0 * 4 9 0 4 0 0 9 @ X O %.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXZXvX0X#.H 6 * = 6 = * < 0 K 4.l.R.D.l.l.l.l.l.l.i.M > t y O.uXxXFXvXB.q h 7 2 9 < < = 7 = 8 u u 8 &.1X7XSXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXB.. . . $ m t.9.y.4.q . g b l c c b b c c c l c b b c h @ @ T ,.,.,.,.W T W W W W W W W T T T T T Y T T T Y Y T Y T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U 2 h 0 1 X . . o @ , 1 # @ @ @ , 4 1 0 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T b c c c c b b 4 @ r M.oXoXoXoXoXoXOXoXoXoXoXoXOX@XM.7 * j 1 o - wXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX=X& X * q h j j h h j j j j . ( +XoXoX@X+X) = * q j j j h j h j j q j j j 0 * % 7.Y.Y.Y.H.J.m.K = , 4 4 9 4 0 4 4 # + X } vXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXSXcXeX%._ e * * * # * 4 h K 4.l.W.W.T.A.k.l.k.l.k.l.l.t.k > t t } 3XfXBXaXw.0.D.m.Q b 9 , * < 9 2 2 8 8 > - u ..:XaXxXLXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXh.. X 1 5.y.r.e.3.4 0 b b c b c b b b c c c b c b b b 4 w ,.T ,.T W T W W W T T T T T T Y T U Y T Y T Y T T Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T Y Y Y K 2 0 * . X * 0 j c b j 4 * . X , 4 $ X L Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y m c c c n c c j # @ M.oXoXoXoXOXoXoXoXoXoXoXoXoX@X^ % 0 j @ & 8 dXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX} $ < j g j j j h j h j k < X ) #X+XM.( % * g j j g j h q j l h j j j h h 0 * = ( M.M.M.u.M # @ 1 4 4 4 9 0 4 4 * $ & u hXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXLXLXKX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLXgX3XO.{ e = = 6 # # 2 h C 4.A.W.W.R.R.T.D.l.l.l.l.l.l.l.a.<.h < t t y . = @ < 0 n 4.A.W.W.W.R.R.R.R.S.l.k.k.l.l.l.l.e.T U P 9 > t p p _ +.J F K.K.K.K.`.$X).t.U j 2 4 q 0 < % - > > 8 8 t { 6XbXLXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXeX @ O * 1.t.e.e.e.R b j b c c c c c c b l b b b b j c c b L T ,.T ,.W W W W W T T W T T T T T T T Y T Y T Y Y T Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y n , , h b n c c c c c c b b b 2 @ , . , Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y m c c c c b c c c * 3 M.oXOXoXoXoXoXoXoXoXoXoXoXw.* 2 c 2 @ 8 1XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX1X- X 0 j j h q l j q j g j h h 1 X % 2 j l j j h l h j j h h j j h h h h g h 0 , @ . @ 1 4 4 4 4 4 4 4 4 4 , @ ; wXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXHXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX=Xd 8 ; ; & = = * 9 j U i.R.W.R.R.R.R.R.R.R.S.l.k.l.l.l.l.j.3.C 0.`.).2.* : > > t 8 9 m.%X$X_.).K.K.).$X_.(.r.M 2 % % X % % = e > > - 8 ' 1XeXcXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX.. . O 4 e.t.e.t.e.m c b b c c c c c c c c c c c b b b b b C T ,.,.W W W T W T T T T T T T T Y T T Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y 0 . * j b c c c j b b b b c c b b , @ @ m Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y C c c c b c b c c 0 * ( +XOXoXoXoXoXOXoXoXoXoX#Xk @ h b @ % ' CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX#.& % q h j j h j j j h j l j j l g g j j h l h h l h j j l j h j j j h j h g h 5 0 4 , # 1 2 4 2 2 2 4 4 2 5 4 2 9 @ ; qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLXvXeX' = ; = = * 2 0 n T t.S.W.W.R.R.R.R.R.R.R.R.E.A.k.k.k.k.l.s.,.F m._.$X$X).8.9 @ X X @ T Q.$X$X$X_._.).(.).).).`.K.L - > d } d 7 7 w e 8 > t 8 8 ..bXPXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX3 . . X Z i.y.t.y.2.c b c c b n c c c c j c c b c b c c c c n T ,.T W W T T W Y T T T T Y T T Y Y T Y Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T Y Z 4 @ * j c b j j c j b b c c c c b c j * X @ l Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T U T C b b c c c b c b j @ u #XoXoXoXoXoXoXoXoXoX@Xw.% , j q @ 8 B.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX+.& , 0 l h j j j h j j q j j j h j z j j h l j j h j j q j j j j h l g q q g q 0 4 5 5 5 4 2 5 2 2 5 2 1 4 4 5 2 0 # . X 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXCXvXyX1XH > & = - 9 g C 4.k.R.W.W.W.R.R.R.R.R.R.T.T.T.S.x.k.l.l.l.k.t.T K Z.$X`.$X_.$X_.d.g 4 4 * h 1.G.)._.$X_._._.).(.K.K.0.r s | 3XlXiX-.7 l T m e r 8 8 8 u &.rXzXSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXB. . @ , 4.t.e.t.y.T j c c c j b c c c b c c c b c b c b c c n T T T T T W T T T T T T Y T T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T U Y Y U b c 4 0 c b c b j b b b b c c b b c c b h @ @ * L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Z b c c c b b b b j < 3 N.oXoXoXoXoXoXoXoX@XM.7 % j c 1 @ u gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXi < g j j k j j h l j h j g j j h z j g j h j j g h j j j j h l h j h g j g q 5 0 9 4 5 2 2 2 1 5 1 5 2 2 5 1 2 j , . B.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXvX5X+.d 8 > & = w q Y e.A.R.W.R.R.R.R.R.R.R.R.R.R.E.A.A.l.l.l.k.l.A.k.4.M P K.$X$X$X_.$X$XZ.U j L 4.C j < g T m.K._._._._._._.K.M t p | 8XiXBXyX' * M Y P F = < = = t p u %.yXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXu . X & g i.y.y.t.e.C j b c c b c j 0 0 j c c c c b b b b c j m U T ,.T W T T T T T T T Y T T Y Y T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U T U T m c b j b c b c b b c c c b c b c c c c b b 0 @ . M Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K b c c b c c b c j g @ G +XoXoXoXoXoXoXoX+Xx @ 4 j g @ % @.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXt 2 g j j j j j j j j l l q j l g h j h j j q j j l l l j h h l l h j j h g q q 4 0 4 4 2 5 2 5 5 2 2 2 2 , 2 5 b 2 %.SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX1X' u 8 > - > r G r.D.W.W.R.R.R.R.R.R.R.R.R.T.T.E.A.l.k.s.t.e.s.k.l.s.1.j P F._._.$X$X$X).f.l l e.l.x.x.s.0.L g 4 c q.Z.)._.$X$XZ.r p t } 9XBXFXxXX.% < < * * < 7 % % = 8 3 = u >XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXaX* . X # R t.y.i.t.4.c c b c c j 0 * @ X , 0 c b b c c b j c j n K T T T T T T T T T T Y T Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y T U T K c b c b c c b b b b b b c c c j b b b b b b b g @ h L T Y Y Y Y Y T Y Y Y Y T Y Y Y Y Y K b b c j b b c b c j * e M.oXoXoXoXoX@X+XE % * j l , . > gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXzXt 9 g g j j g j h h h h j j j l j j j j j l l j j h g j g j l h q g j g h g 0 0 4 4 1 4 4 2 1 1 , 1 5 4 1 1 2 1 n 1 O.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX7Xp - 8 - > > p J u.T.R.T.T.R.R.R.R.R.R.R.T.S.S.l.l.k.a.9.K r G P 9.s.Q h 8.K.$X$X$X$X_.Z.Q j T k.A.l.l.k.l.l.x.s.<.g 1 0 Q m.K.).d.w t t d :.lXBXbXB.7 8.8.K l l z z 7 7 @ X * - r 1XvXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX+.. X X 1 e.p.e.p.y.R n c j b j < . O . @ j n c c c c n c c b Z T W T T T T T T Y Y Y Y T Y T T Y Y Y Y Y Y Y T Y Y Y Y T Y Y T Y Y Y Y Y Y Y Y Y n b c c c c b b j c b b b c b c b c b c c b n c c j j C Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U c c b l b c b b b l 4 % N.OXOXoXoXoX#XE O @ 0 c q @ . { DXJXJXJXJXJXJXJXJXJXJXJXKXSXvXdXdX0X;X8 . . 9 q j j j j j h j l j g j h g j l j h h h h j j l j j h j j j j j j g g g 5 0 4 4 2 2 1 1 1 2 2 2 1 2 2 2 2 1 m 2 . +.VXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXxX+.= - > t d . .H z ,.i.k.l.l.c.S.A.A.A.c.k.s.k.k.s.9.P 8 p .;.` F Q l 8.$X%X_.$X$X).f.M j 9.l.l.k.l.l.k.l.l.l.l.l.t.Y b g 4 b T K 3 t t p | 3X9X2X` q P.%X%X(.P.Z.Z.8.Q F q = + - 7 d 7XAXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXu o X X h t.y.y.t.y.R c c j j , . O O . o , j c c b c c c c j K T T T T T T T Y T Y T T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y K b c c b j b b c b c c b c j b j b b c c b b c c c c c m Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U b b b b c c b j c j j % ( +XOXoX@XY.( & @ 2 c c 2 . = 6XKXJXJXJXJXJXJXJXJXJXJXAX6X+.u + O & o o @ q g h j h j j h j g l l j l j h l j g j j j h 0 0 2 < 2 0 g q j h j g q 5 5 0 4 4 1 5 2 1 4 2 1 2 1 4 4 5 5 2 A 2 %.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCX-.p > > > } 2XjXAXfX_ * n Y ,.3.2.,.<.1.<.,.5.3.3.4.<.g o p #.iXmX6Xu 7 m.%X$X$X$X_.Z.2.j ,.k.A.k.l.l.l.k.l.l.l.l.l.k.l.A.A.s.,.n 2 , = p p p p } %.' 7 9 Q `.%X%X`.).`.$X$X_.m.z O % x d & +.SXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX,X. @ . % Y t.t.t.y.y.C c b c 9 & O ; f ] y . 4 b c b b c b c c C T T T T T T Y T Y T Y Y T Y T Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y M c c c c b c c b b c c b b c b c c c b b j c c c c n c m U Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y L c c c c c b b b b c l * 7 +X@XY.M.G = % 5 c c 5 # @ $.KXJXJXJXJXJXJXJXJXJXAXaX@.8 O % % . O o 3 q k j j l h h j j j l g h j l g h j j j g 9 , . X % % O X 2 g j h h g q g 5 4 4 2 2 1 5 2 , 1 1 1 1 1 1 1 1 2 F 9 :XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXrXt > > & a .3XjXZXBX } O q Q M m.`.$X$X_.`._._.`.0.= + } 1XB.P 8 %.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXo.. . . < 4.t.i.t.y.1.c c j j * o O + $.iXxX6X- , b j b c b b c b C T T T T T T Y T T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y K j c b c c b c b b c c b c c b b b b c b b b c c c c c j n Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y U b c b b b b c c b c j 2 o N.Y.w.e % * 4 l c 0 @ . u zXJXJXJXJXJXJXJXJXSXyX@.- o @ o . @ * # @ @ . # 8 7 9 q q h l j l h h j h j l j j j j j 0 , @ # r ( q.Q z = * q h g g g q 0 0 5 4 5 1 5 1 1 1 1 1 1 1 1 5 2 w L q o 0XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXqX_ 8 > + : t .7XiXFXFXMXX.F K.%X$X(.P.Z.K.K.K.Z.K.K.m.P & 8 y -.iXFXVXV.0.).%X`.Z.Q j T l.l.k.k.l.l.l.k.l.l.l.k.l.j.l.l.l.x.x.S.c.R.W.x.U g e 8 8 & % l q.).f.q q.m.m.Z.K.K.(.K.l O d 8XFXbX) 3 d 5XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXu X X X q t.t.t.t.t.<.j c c 2 o ; [ fXiXcXNX;.: . 0 j b b c c b b C T T T T T T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y T Y Y Y T m c c c b c b c c b c b c b c c b c c b b c b c c b c c c n U T Y Y Y Y Y T Y Y Y Y Y Y Y Y Y L b c b c b c c j c c j 0 X w B * = , 0 c c 0 @ . 3 6XKXJXJXJXJXJXJXGXqX..8 % & X @ , 9 n K F N x k k x 9 6 , < 9 9 9 q j j j j j h g j l j h * 3 B ) U.XXXXXX{.w.w X * q q g g 0 4 4 5 2 2 1 1 1 1 1 1 1 2 2 2 4 , j P j X . 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXLXLXDXAXSXAXGXLXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXVXO.3 > & O - p | 7XiXBXBXpXQ F K.%X$X$X%X$X%X$X%X$X$X$X$Xq.o - t ` 1XfXjXB.Q (.).m.m m i.l.l.l.l.l.l.l.l.l.l.k.l.l.l.x.x.S.R.R.W.R.R.R.T.R.S.T 4 , # 4 P m.`.$XZ.F * = 7 < l Y 8.q.* p ;XNXlXX.* = i uXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXhX8 X X @ b t.y.t.i.y.W j c c $ o & i kXiXlXNXDXAX_ , c c n c c c b C T T T Y Y Y Y T T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y T Y Y Y T b b c b b c b c b c n j b b c c b b c b c c c c b c c n j n L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U b b b b c b b b c c l g . X * 2 l b c 0 # . 8 >XGXJXJXJXJXJXJXcX1X8 & o + % < b U 3.0.4.q.u.u.q.~ M c h w 5 1 3 @ , 4 0 g j l j j g j j 2 * x #X@XoXU.I.I.L.XXm.r X < 0 g 0 4 4 2 9 5 5 1 1 1 1 , 1 1 2 1 2 5 1 n T M % 7XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXAXVXcXbXgXwX>X$.#.h.O.+.#.B.=X-X4XIXvXVXAXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXeXr > ; + + a p ] :.yXlXiXV.) Q $X$X$X$X$X%X_.$X%X$X_.$X$Xm.9 o t p ` ;X:.H P Z.2.0 L s.x.l.l.l.l.l.l.l.l.l.l.x.x.E.E.R.R.R.R.R.R.R.T.R.R.R.R.E.i.U 0 K R.%X$X$X$X$Xq.q F l 0 4 9 7 X O : ` 3X3XH % * e $.JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX-XX X . % W e.r.i.t.e.Z c c g o ; rXjXjXxXSXHXKX3X. $ j c j c c c c m Y T T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K j j b j b c b b n c j c c c b b c c l c c n c c n j c j j n U Y Y Y Y Y Y Y Y T Y Y T Y Y Y Y Y b c c j c b c c l c c h . @ 4 g l b j 9 # 8 5XKXJXJXJXJXJXJXzX{ 6 = & & # 5 T 4.e.4.4.3.5.4.u.u.w.7.A c c c l j D , @ @ , 2 q j j j j 9 * G Y.oXoXOXOXU.I.I.U.XXq.7 @ 9 0 0 0 9 4 4 2 1 1 2 1 1 , 1 1 1 5 1 2 1 A T j @ >XJXJXJXJXJXJXJXJXJXKXSXMXgX0X7X>X@._ u t - @ . : p H %. - 7 % ; p y f -.2X8XB.~ m.%X%X$X).$X).(.(.(.(.K.K.K.Z.P O & t p H u @ q l j 9.l.l.l.k.l.l.l.l.k.l.x.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.t.l Y ).%X$X_.$X).Q F t.s.t.t.1.z O : a } ' + * < 8 H gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX` @ o X < r.t.i.t.t.e.C c c 4 o i PXuXjXxXGXKXJXnX; O , l c c c c c n Y T T T Y T Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U n c b b b c b c c c c c j j j g g g j j c c c c c j c c c c n L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T b b b c b b c c n j c l , 1 l b c c , . . 8 5XGXJXJXJXJXJXJXMXV = > + & , n 4.9.9.9.4.4.0.3.5.7.u.7.w.q.A b c c c j l j 4 * X # 2 q j j % G Y.@XoXoXoXoXU.I.I.I.L.[.P X 1 0 5 4 4 2 1 5 1 1 1 1 1 1 1 1 1 5 5 1 9 K T 9 . ,XJXJXJXJXJXKXSXcXhXrX..i ; @ o . - ..4XhXvXSXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX5Xi > = h U w + > t t i { -.} q 0.K.K.Z.m.m.q.q.8.f.0.8.q.8.K z @ X % 3 < 9 9 * m t.l.l.l.l.l.k.l.j.j.k.x.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.T.R.E.E.R.T.T.i.D ,._.$X$X$X$X).Q M r.A.l.l.t.h = = = * * % * < 8 ..AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXzX3 & o X l t.t.i.t.t.9.b c c < % rXbXiXkXBXKXJXJXKX=Xo . 0 c b j n c n L T Y Y T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y T Y Y Y Y Y Y L b b c c b c b b c c c g 4 , * @ @ @ , 9 g c c n c c c c n j n K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T b c c b c c c c c c c b 5 1 j j 0 * . o u 6XJXJXJXJXJXJXJXcX' & O & 3 0 ,.e.e.9.e.e.4.4.4.4.0.3.3.4.q.w.7.P b c c b c c c b 0 @ X # 2 q @ w.oXoXoXoXoXoXoXU.U.{.I.XXw.3 , 0 0 4 5 2 2 5 2 1 , 1 1 1 1 1 1 2 2 # j R U < 3XJXDXSXlXIX t t 8 < 0 0 0 z z q b l F P P Q Y P F K K j % 9 z P f.~ < 0.l.l.l.l.l.l.l.l.l.l.l.x.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.R.R.T.E.T.E.R.e.5 Q `.$X$X$X$X).Q n t.l.l.k.d.9.C m P U @ * % % - ;XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX1X% $ o @ L t.t.i.t.t.4.b c j * X p PXhXfXxXZXKXJXKXJXcX: . 4 c n c c b n L T T Y Y Y Y Y Y T Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U C c c c c c c c b c h 4 . . . @ 2 j j c c b c b j b L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T b b c b b c b j b j c b 5 2 0 # & ' zXJXJXJXJXJXJXJXJXO.o . * m 5.e.e.e.t.e.e.e.9.4.4.4.3.3.5.0.2.6.6.Z c c c c c c j j j 1 @ . # . N.oXoXoXoXoXoX@XU.I.I.I.U.m.2 # 0 9 4 4 5 4 1 1 1 1 1 1 1 1 1 1 2 2 , m T Z 3 . >X0X-.' u + X $ = & 7 r x N Q F * < 2 4 2 # @ 1 4 4 4 4 9 5 g 0 4 4 2 , @ X . X o o o 8 1XAXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcX+.- = 7 <.s.Y F m.Q q 9 < @ 9 9.s.t.e.r.r.a.k.l.s.A.A.l.A.A.l.A.A.<.q q.Z.K.%X0.* U A.l.k.l.k.l.k.l.l.l.l.A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.E.T.c.R.R.S.W 9 8._.$X$X$X$XK.Y F a.l.k.s.k.A.k.a.e.j * < % - { JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXH = & . < 8.t.t.t.t.t.5.c c j X o %.PXdXkXMXKXKXJXJXJXKX} X c c c c b n L T Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y b c b c j c j c j 0 # . O . , j c c c c c j n K Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T T b b c c b c c c n j c c 0 < X . . = { cXJXJXJXJXJXJXJXJXdXt . < K 4.e.e.t.t.g.t.t.t.e.9.9.4.3.1.<.<.2.1.2.R m n c c c b c c b l g 1 @ ! Y.oXoXoXoXoXoXOXU.I.I.I.J.q * 4 4 4 5 1 1 2 1 1 1 1 1 1 1 1 5 1 1 4 C T m 6 & o & X O O % 8 7 r F ~ f.Z.F.{.XXQ 2 1 9 4 1 1 9 0 5 5 0 0 g g g 0 0 0 0 9 4 9 , @ X . X o X > B.cXKXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX,Xt - * m s.d.~ q.$X).m.q.m @ m A.A.s.l.l.k.l.l.l.l.k.l.l.l.l.l.k.A.9.q 8.%X$X%XZ.9 M A.l.l.l.l.l.l.k.l.k.x.T.R.T.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.T.R.E.T.S.R.E.K 5 r._.$X$X$X$X).Q U k.l.l.l.l.k.l.k.0.< * % 8 u gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXV = & . 2 t.t.t.t.t.t.W c n g o 1XkXiXlXVXKXKXJXKXJXKX8X X g c b c c c L T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T L j c n c c n c j 4 . X t t - ; O O o O X 4 j c b b c c n U Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T b b j b b b c b c j c b , . . = +.CXJXJXJXJXJXJXJXJXHX} o . 9 <.4.r.t.t.t.t.t.t.e.t.e.e.9.4.3.5.1.<.,.,.2.,.Y n c c c c c c n j c b 0 @ . / +XoXoXoXoXoXoXY.I.I.{.P.k # 2 2 5 5 2 2 2 1 1 1 1 1 1 1 2 2 5 @ g U W z = + O . O + = 3 x ) w.M.U.I.I.I.L.L.w.w 2 q 9 , 5 0 0 g h g g g g q q 0 9 2 , , < 2 0 0 0 < @ X o o % ` dXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX' . @ l t.x.0.8.K.%X_.%X).Y D e.R.W.T.c.l.l.l.k.l.l.l.l.l.l.l.k.l.l.a.m F ).$X$XK.P q s.l.l.l.l.l.l.k.l.l.l.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.E.E.E.R.x.n 2 r.$X$X_.`.%X).P <.s.l.l.l.l.k.l.l.n # * = t 1XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXzX% & X @ l a.t.i.i.t.y.T c c 5 o 1XbXiXcXAXKXGXJXJXJXJXCX; , c c c c b L Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y T Y C c c c c c c j # o t { 2X8X:X%.i : : o @ g c c c b c n U Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y T n b b c c c c b c j c b # . . > O.CXJXJXJXJXJXJXJXJXJXwX8 . @ T e.t.t.t.t.i.p.i.p.t.t.t.r.e.4.4.3.5.,.,.T W T W U n c c c c c c c j c b g # P #XOXoXoXoX@XU.L.U.XXm.r * 4 2 2 , 1 5 2 1 1 1 1 1 1 2 2 1 4 * l Y Q e & : o = 3 8 ( N.+XoXY.U.I.I.I.I.I.u.q 4 0 0 < 1 0 q q q g g g g q q 1 < * 7 0 k 7 & * 2 q h 0 , @ + X + %.SXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX;X> % 9 1.l.a.Y 8.$X$X$X$Xm.0 ,.R.R.T.R.R.T.A.l.l.l.k.k.l.l.k.l.k.k.l.l.,.z P.%X$X$Xm.q ,.l.l.k.l.l.k.l.k.k.x.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.E.R.E.E.W.l.g 7 m._._.$X$X%X(.Q 3.l.l.j.l.k.j.S.9.@ * 3 t ` MXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXrX= o X * T i.t.i.i.t.e.T c j , o 4XhXfXNXAXKXKXKXJXJXGXAXu O @ c b c b c L T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y n c b b b c j , = ( aXMXBXmXiXiX7X .p - & X 1 c c c b c n L T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R n b c c c b b b b j j j , . | AXJXJXJXJXJXJXJXJXJXJX_ o $ 7 4.e.t.t.i.t.i.i.i.i.i.i.t.t.e.4.4.5.5.<.,.<.,.T T R n c c c b b b c b j j j j * O G #XoXoXoXoXU.U.U.XXm.2 @ 2 4 5 5 1 1 5 2 2 1 1 1 1 1 2 1 4 9 m T K < . $ = ( w.M.@X@XoXoXoXXXL.I.I.I.f.w * 0 g 4 4 0 g 0 j g h h g g 7 * 3 x / m.L.I.J.q.F 8 7 q j q < % & X 8 4XJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX4X8 . = P k.d.Q P Z.%X$X$XK.Y M A.W.R.R.R.R.R.R.E.A.l.l.l.l.l.k.l.l.l.l.x.9.h q.$X$X%XK.F M l.l.l.l.l.k.l.k.l.x.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.E.R.E.E.R.R.s.w 9 m.$X$X_.%X$XQ.,.4.s.s.l.l.l.k.a.g * 2 p 8 1XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX+.= + $ 1 r.e.t.i.t.t.e.T c c , ; wXuXfXNXGXKXJXJXJXJXAXCX[ @ c c c c b L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y K n b b b c j 2 u B.PXVXAXBXBXFXiXyX3X:X@.p & . 0 c c c j n K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U b j j b b b c c b j c c 2 | LXJXJXJXJXJXJXJXJXJXhX8 o & T e.t.t.t.t.i.p.t.i.i.i.i.t.t.e.e.4.3.5.1.,.,.T T T T C c c c b j c b c b b j b j * O ( +X@XoXoXOXU.{.I.q.= , 2 2 2 2 2 2 1 5 2 2 1 1 1 1 1 2 1 h U T Y h * & / +X@XoXoXoX@XoXY.I.I.I.XXN.e % 0 g 9 0 0 q g j g q h j q * < G V.@XoXOXY.XXXXXXP.q.F q 9 9 2 @ . o o H uXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXhX_ X @ M t.A.e.K m.$X$X$X_.9.5 4.W.R.R.R.R.R.R.R.R.R.E.A.l.l.k.k.l.l.l.l.l.i.m K ).$X_.$Xm.q t.l.l.l.k.l.l.l.l.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.T.R.R.R.R.E.E.E.R.R.t.* q K._.$X).P.Z.e.c T s.l.l.c.R.k.W * * 8 8 } vXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCXu - o X 9 r.t.i.t.t.t.e.Y c c , u bXdXbXVXKXJXKXJXJXJXGXgXt q c c c m L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y Y Y U m c c j c b 4 . o e pXPXVXLXKXAXBXBXBXiXuX3X9X:X; : 2 c b c c c U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y R b b c c b j b b b b j c 4 . O i AXJXJXJXJXJXJXJXJXJX-X& . 1 4.y.t.t.t.p.i.p.i.i.i.i.i.i.t.e.9.4.3.1.,.,.T W T T R C b c c b b b c c b c b b M j * w.+XoXoXY.U.U.XXq.< , 4 2 4 2 1 2 2 1 1 1 2 2 5 1 1 0 4 M Y Y R R G / #X@XoXoXoXoX@XY.).I.I.I.P.G % 9 g 0 0 g q q j g h j h 9 % w w.OXOX@XoXoXI.L.U.L.I.Y.P.f.l 2 * @ X o + o %.ZXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXxX..= % h r.A.k.P P (.$X$X_.D.n K S.R.R.R.T.R.R.R.R.R.R.R.R.E.A.l.l.l.l.l.l.l.l.,.g Z.$X$X%XP.F T x.l.l.l.l.l.k.x.S.R.R.R.R.T.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.E.E.R.D.,., l m.Z.) G J N F Y k.l.l.x.W.R.c.L , 8 8 u B.JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXaX* ; X % g t.t.i.i.i.t.e.U j j , X ' vXfXlXSXKXKXJXJXJXAX>Xi . O o 2 c c j n L T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y n c b b b g . . o J pXaXLXKXHXHXDXLXBXBXBXiX9X3XiX..; o * j b b c n U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y P b c b c b b c c j b c c g . o t vXJXJXJXJXJXJXJXJXKX' + m 4.y.t.t.i.i.s.s.i.s.i.i.i.t.t.e.9.4.5.5.,.<.W W T T R L n c c b c c b j j j c j 0 l j % * N.oXoXY.I.I.{.G * 2 5 5 2 2 5 2 1 2 2 1 2 1 1 , 5 0 g K U P Q ~ ) Y.oXoXoXoXoXoX@XY.I.I.U.Z.F % 7 j g g q h j l g h j j 2 & G Y.@X@XoXoXoXoXXXI.L.I.U.F.Y.m.M . # h 4 . . + p 9XJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX-.> % 2 T s.l.9.F r.$X_.$X).3.j e.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.x.l.l.l.l.l.l.e.j <._.$X%X).0.m s.l.l.k.l.k.l.l.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.T.R.W.D.L * q t } . X T e.t.t.t.i.i.i.t.s.i.i.i.i.t.i.e.e.4.5.,.,.W <.W T T T P M b b b c b j c h 0 j * @ 7 r 0 G #XoXY.I.U.F.r @ 2 1 2 2 5 2 2 2 5 1 5 2 2 1 1 9 2 n K b F n G N.OXoXoXoXoXoXoXY.I.I.'.M.x % 9 h q 0 j j g h j j l h 9 * G #XoXoXoXoXoXoXoXY.XXI.I.I.U.P.q.e o 0 l 0 * . % 8 ,XJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJX4Xp = % M d.S.d.Y Q (.$X$X_.k.n T T.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.A.l.k.l.l.l.s.U l K.$X$X$Xm.M t.l.l.l.k.j.l.c.c.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.E.S.R.R.E.R.R.W.l.w a a { 3XiXxXbX;XR l.l.A.R.R.R.E.9.< - > p $.JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX' % @ X % P t.i.i.i.t.t.9.Z c l * O H MXbXlXSXKXKXJXJX8X; > p _ i . @ c c j m L U Y Y T Y Y Y Y Y Y Y Y Y Q Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y n c c n c * . O J wXVXVXKXJXJXJXHXHXGXLXAXBXNXiX9X8XfX=X8 2 n c b b Y Y T Y Y Y Y Y Y Y Y Y Y T Y Y U m c b b b c b c c c c c c j X . o wXJXJXJXJXJXJXJXJX>X8 . # ,.e.e.e.t.t.p.p.i.s.i.i.s.a.t.t.9.e.4.3.1.1.,.W T T T Y T n b j b b b b b l 4 1 @ X G G r * O N.oXXXI.{.f.3 , 5 2 5 4 2 2 2 5 1 2 2 2 1 1 4 4 0 C j m m z ( M.@XoXoXoXoXoXOXI.I.I.J.~ * 9 q g l j j h j h j j j 9 % J #XoXoXoXoXoXoXoXoXY.XXL.P.L.q.( ~ q 9 j j j 2 X - >XJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXbX' % = 9 1.k.l.9.l m.$X_._.(.,.j a.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.k.l.l.l.x.3.q m.$X$X$X(.<.U l.l.l.l.k.l.x.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.E.c.R.R.R.T.R.R.A.5.e f p } 3XfXxXCXhXE t.l.A.R.R.R.R.x.K & 8 - u rXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXi - o X * ,.i.i.i.t.t.e.9.C c l 9 X ' xXbXxXSXGXKXJXGXi O p 9XJX4X j c c c U T Y Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y P n n c c 4 o : pXGXKXJXKXJXJXJXJXHXHXLXZXBXNXlXiX3XuXvXt , j c b m Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U n b c c b c c c c c c c j c # X o ;XKXJXKXGXCXMXvXCX{ * X , 1.9.t.t.t.i.i.p.i.i.i.i.i.t.i.e.e.3.3.3.1.1.T W T T T T Y n b j b c c c b b j * , . ) +Xw.( 8 / +XU.I.{.F # 1 5 4 5 4 5 2 2 5 5 2 2 2 1 < 9 1 j j C m q x N.oXoXoXoXoX@XY.Y.I.L.J.G 3 5 h j j g h j j j l h j q * x M.oXoXoXoXoXoXoXoXoXY.U.m.N.q.m.m.P 9 g j j j 0 @ . $ $.LXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJX1X& ; , Y S.S.a.L Q (.$X$X$Xm.0 T S.S.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.T.x.k.k.k.l.l.i.C Q $X$X$X$Xm.n t.x.l.l.l.k.l.c.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.T.T.R.T.R.R.R.R.D.T + > 8 p _ 3XiXBXFXbXq.t.l.l.W.R.R.R.S.s.w - 8 t H JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXbX& = o X , 4.a.i.i.i.t.t.4.C j c 2 X h.SXzXvXCXGXKXJXcX- > 7XJXJXzX. 4 c m n L U Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y A c c n j . $ o o p } 3XiXiXBXyX~ 0.A.s.R.R.R.R.R.S.4.> t t d yXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX4X$ % X @ h y.a.i.i.t.t.t.4.C c c 1 o B.nXkXxXSXGXHXHX>Xo O.JXJXJXCX8 . 5 c c m U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U U Z c n c 1 8 o._ ; ; zXJXJXJXJXJXJXJXKXHXGXGXZXBXxXiX9XyXBXyX& < z b c K T Y Y Y Y Y Y Y Y Y Y Y Y Y Y T K c b b b c c b b c j b c j l 2 X p [ t X X X + o + + . g 5.9.e.e.e.t.t.t.i.t.i.i.t.t.e.e.9.4.3.1.<.,.<.T T T T T L m c c c b b b b j c n , o X w.OXOXoXoXOXU.{.I * 1 5 5 4 2 4 4 4 4 5 4 4 5 2 , * # 4 C Y b 4 4 w N.oXoXoXoX@XY.U.P.! 7 7 9 q j j j l h h j q l j g g r N.@XoXoXoXoXoXoXoXoXoXU.I.U.{.L.J.Q q q h j j h j j , X ` hXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXKX1X- ; 7 0.W.S.i.C Q `.$X$X$XK.P W T.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.l.l.k.l.l.l.9.l q.$X$X$X).8.C s.l.l.l.l.l.l.k.l.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.T.R.R.R.T.R.D.0.9 Q m.% : y ` :.9XiXiX2Xr b a.t.S.R.R.R.R.R.v.N 8 8 8 ' KXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLXX.= & . @ m t.a.i.t.t.y.t.4.S c c 0 6 eXCXkXxXNXKXJXAXo.; CXJXJXJXGXH 5 c c m U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y b c n j : 6XLXDXo. .JXJXJXJXJXJXKXJXGXGXDXZXBXxXiX9XyXBXNX= < b c b L Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y m b j b c b j l b b c b c j j 9 . ; O + & & - % + + + * . j 5.4.9.e.e.t.t.t.t.t.t.t.t.t.e.e.4.3.5.,.,.,.T T T W T T L n c c c c c c b c c b 4 . . G Y.OXoXoXY.U.f.2 * 4 4 4 9 4 4 4 4 4 4 2 2 2 2 * - x L Y m g 4 * , w.Y.@XoXOXY.J.8.7 * , 9 h j h j j h j j j j j h h 2 ( +XoXoXoXoXoXoXoXoXoXU.I.U.U.L.f.z 9 q l h h j l j j < . 8 6XJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXqXi O & R S.W.A.T c m.%X$X$X$Xq.m t.S.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.k.k.l.l.x.t.n F ).$X_.$XZ.C 5.s.s.k.l.l.k.l.l.k.l.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.W.S.<.9 q.$XZ.q p p } -.3X7X' < q <.k.l.R.R.R.R.R.R.m.u 8 8 u 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCXp % o X , 2.d.i.i.i.t.t.e.4.m c b j % B.NXkXlXNXGXJXGXi u JXJXJXJXKX;X 2 c c m U U Y T Y Y Y Y T Y Y Y T Y Y Y T Y Y Y T Y Y Y T Y Y Y T Y Y Y C c c n 7 @.GXHXJXNX: o zXJXJXJXJXGXJXJXKXHXAXFXBXNXiX9X8XlXFXt 2 l l n U Y Y Y Y Y Y Y Y Y Y Y Y Y T Y U n b b b c c b c c b c c b b j 1 . O = ; ; - 8 - 8 t t u J x L 5.9.4.e.e.e.e.g.t.t.t.t.e.e.e.3.5.5.5.<.,.,.T T T T T T K c c b c b c c b c c c j @ e #XoXoXoXU.m.8 % 2 4 2 4 4 4 0 9 4 4 5 4 2 2 1 ; 7 K T K j 5 4 * X G N.M.J.M.! w X @ 9 q j j j j j j l j h h j j h z q N.oXoXoXoXoXoXoXoXoXU.L.U.I.P.Q q q j j j h l j j h j < = 5XJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXcX..O : M A.R.R.9.q Y Z.).`.$XZ.M U S.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.A.k.l.l.l.l.s.U 9 m.$X$X$X).9.W l.a.s.j.k.l.l.l.l.l.l.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.E.4.9 Q $X`.).q. : p t p { | q q = m k.l.S.R.R.R.R.R.Q.w.& > 8 +.JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgX= X . @ 4 t.i.i.i.t.i.y.y.4.U c c j = B.VXlXxXCXAXJXSXi =XJXJXJXJXKX,X. , b c C Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y m c M M p xXJXJXJXxX: o.HXJXJXJXJXJXJXJXHXDXBXBXxXiX7X8XMXZX> 1 l b n Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T m b b c b c c c b c c b b b j j 2 . . ` } p ` +.@.3X4X2XhXMXaXN.6.5.5.9.9.9.e.e.e.e.e.e.e.4.4.9.5.5.1.,.,.T ,.T T T T T C b c c b b c j c b c b b , o @ ( #X+XM.f.w @ 2 0 4 9 0 4 0 4 0 9 4 4 5 2 1 @ 2 L T Y m 0 1 1 , @ . . X , < % % < 0 g q h q q h j h j l h h j j l w ( +X@XoXoXoXoXoXoXY.U.I.U.I.m.P q q j g j j j j j j j 4 @ . = 4XJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXAX$.; o 3 9.W.R.A.M % w G w.m.m.Q q 5.E.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.k.l.l.l.l.1.2 8._.$X`.(.d.1.i.s.a.s.a.s.l.l.l.k.l.l.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.5.g 8._.$X%X%Xm.q o > a t 8 q m.P.9 9 e.l.A.R.R.R.R.R.R.A.r 8 - u 0XJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX5X% o . . 0 9.i.i.t.i.t.e.e.4.U n c g 3 h.NXkXxXBXKXJXCXH uXJXJXJXJXCXu X @ c c C T U Y Y Y Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y Y Y Y Y Y Y T n c b e 5XHXJXJXJXwXo . a GXJXJXJXJXJXJXHXHXDXBXBXxXiX8X8XxXVX> 2 b b C T Y Y Y Y Y Y Y Y Y Y Y T Y Y U m b c b b c b b c b c c c j c c j X :XFXkXDXDXAXZXSXAXVXVXSXpXJ Z <.4.4.4.e.9.e.e.9.9.9.4.4.5.5.<.,.,.,.T T T T U Y U m b c j b c b b c b c l n 4 @ . > B 3 o @ 4 0 0 5 0 0 5 0 4 0 4 4 4 5 2 @ - F T Y K j 5 1 1 2 # . X % + * 2 0 g q 0 9 9 7 % 2 9 h h l j h q j b 7 w.oX@X@XoXoXY.Y.XXI.U.F.J.8.z 9 j h j l j j j q j j 0 % @ @ . 1XJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXKX6Xu X @ L S.Q.T.0.7 O p %.:.4XN.u m k.S.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.k.k.l.l.l.t.g h Z.`.f.h 3 e x P t.s.s.i.s.j.k.l.l.l.l.A.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.x.T 4 8.`.$X$X$X$X`.m.* O 7 l F m.%X_.q.@ Z l.l.T.R.R.R.R.R.D.0.8 > > +.JXJXJXJXJXJXJXJXJXJXJXJXJXJXGX+.@ X X c 4.t.i.i.i.t.t.y.4.T M c j * X.NXxXxXZXKXJXzXp CXJXJXJXKX;X$ ; . c c K U T Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T Y Y Y Y T j j x _ AXKXJXJXJXrX5 o nXJXJXJXKXKXJXHXGXDXSXNXxXkX9XwXNXgX: 0 l c U Y Y Y T Y Y Y Y Y Y Y Y Y Y Y L n c j c c b c c j b b b b c c c j @ ;.mXZXBXCXnXCXVXVXPXMXPXbXeXe M <.5.4.4.4.4.e.5.4.4.4.3.5.<.,.,.,.,.T T Y Y U T K b b c j c c b b b b b b b q @ O * 9 , < 5 0 0 0 w 0 5 0 0 0 0 g 5 4 5 1 @ . z R Y Y n 5 1 1 2 2 2 1 1 2 0 q q 9 2 < 7 e G r w * % 7 h j j j j j g q N.Y.@XY.Y.I.I.I.L.L.P.q.k 0 j j j j j h h j j q j h , @ 0 2 . B.JXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXgXH . X 0 i.W.R.A.F O y :XiXBXFXxX=X/ l.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.Q.R.R.R.R.R.R.R.A.k.l.l.l.l.k.P , 1.,.X 8 { ;X;X&.M M T 4.e.t.i.k.k.l.l.j.x.E.R.T.R.R.R.R.R.R.R.R.T.R.R.l.U , 2.$X$X$X$X$X$X$Xq.7 7 ~ m.).).$X%XK.q 4 9.s.A.R.R.R.R.R.R.A.n - > e qXJXJXJXJXJXJXJXJXJXJXJXJXJXSXi % . O @ Z e.a.i.t.t.y.e.e.1.6.n c h % ' cXvXNXAXKXHXLX| GXJXJXKXbX8 S e . c b L T U Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y Y Y c n e 6XHXJXJXKXSXE >.@ o gXJXJXJXJXJXJXHXHXAXBXNXxXkX9XyXSX > } AXJXJXJXJXJXJXJXJXJXJXJXJXcX8 X $ O * ,.i.i.i.i.i.t.e.t.9.W m c h < } MXxXMXAXKXJXAX..HXJXJXvX*.V >.5 @ v n U U T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T c 0 H LXJXJXGXKXV.>.>.$ O tXJXJXJXJXJXJXHXGXLXBXMXmXlXyXyXAXB.X j l m Y Y Y T U Y Y Y Y Y Y Y Y Y Y U m c c c l c b b b j b c b c c c c l , *.tXxXxXxXlXxXkXbXbXbXbXhXbXgXX.= 4 T 4.5.3.4.3.1.3.<.1.,.,.,.,.T W T T T T T P b c c b c b c c c c b b b c C * . 2 x B z g k h g w h g q g q 0 0 0 < . * C T T T n 5 1 1 2 1 2 4 9 9 1 7 r ) Y.@XoXoXoXoXOXU.I.{.~ < g j j j l l 9 r w.J.C.m.J.m.Q F l j j j q j j j l h l h j j h 0 @ # m m @ . @ ,XJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXKX;X= . @ j s.W.R.A.P % : y %.8X9XkXBXiX@.w.Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.l.l.l.l.t.m * + } :XyXiXBXFXaXq.8.m.U l q j K 3.t.s.j.l.l.S.R.R.R.R.R.R.R.R.R.D.T * F (.$X$X$X$X$X_.Z.z 2 9.D.P K Z.$X$X$X$X`.Q 2 Y k.x.R.R.R.R.R.R.S.A & - 8 B.JXJXJXJXJXJXJXJXJXJXJXJX0X. X X . 4 T t.i.t.i.t.t.e.4.4.,.Z c c < 8 kXmXxXAXKXHXVXV GXJXPX+.$ R n.5 . v C U T U Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y n 0 ;XGXJXJXJXPX>.>.>.6 3XJXJXJXJXHXHXHXHXZXBXMXBXlXyXyXBXH * l b L Y Y Y T Y Y Y Y Y Y Y Y Y Y T L M c c c c c c j c b b b c b b b c b 1 . X O.6XjXiXjXiXfXfXbXfXgXdXaXaXbXh.= 2 U 1.4.1.3.1.1.<.,.T ,.T T T T T T U Y U C b b c j b c c c c c j n b j m 1 O 3 j M B c k h k j h h g g 0 0 0 , . X c Y T T L h 1 1 1 1 5 5 2 1 * r ) +X@X@XoXoXoXoXoXU.I.I.XXw.r q j j l j j g q 9 < < w < 2 0 q j h h j j l j j g j j j h h 0 * @ j U g @ 8 eXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXbX&.X @ 0 e.W.T.k.Q 7 O - p +.3X8XfXlX8X@.w./.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.k.l.k.4.l = ; d :XyXyXkXBXaXN.r.%X%XK.f.F 0 h b Q e.t.s.l.A.T.R.R.R.R.R.R.A.Q * P ).%X$X_._.$X$XK.F , <.S.Q.m.2 F `.$X`.$X$XK.l 0 9.k.T.R.R.R.R.R.T.a.2 ; & t gXJXJXJXJXJXJXJXJXJXJXGX-X. X X * h e.i.i.i.t.t.t.4.4.<.Z c c 9 t PXlXNXZXHXHXgXa PXsXh.B $ >.>.1 . c S U Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y U Y c 2 0XGXGXJXPX>.n.>.>.B =.JXJXJXJXJXJXHXLXZXBXMXxXkXiXiXvX8 1 j n U Y Y Y Y T U T Y Y Y Y Y Y Y Y m c c c c c c b b b c c c b b c c c j 4 . X + p B.9XiXiXdXiXdXhXdXhXdXdXaXqXh.2 , L <.1.2.<.<.W ,.,.,.,.T T T T T U Y K m c c b b b c c c n b j j j j m * o 2 z M x z l l k k h h h g q 0 % X . 7 L W T T n 4 1 2 1 2 2 2 2 w E Y.@X@XoXoXoXoXoXoXY.I.I.I.XXw.w 9 j l g j l l z j j q j j l j j j j j l h q j j h h q h h q < X 0 L C 4 . u aXJXJXJXJXJXJXJX", "JXJXJXJXJXJXAX+.@ @ # T S.R.k.T q 7 + > p } -.2X8XuX-XH u.W.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.T.R.R.A.k.l.l.a.K q 0 > d -.yXyXiXMXeX8.q.%X%X$X%X_.m.Q F l 0 z P 4.i.k.S.R.R.R.D.A.Y % F K.%X_.$X$X$X_.K.Q , W A.T.R.E.0.7 0.$X$X_.$X_.m.0 j s.A.W.R.R.R.R.T.l.U = = > ..KXJXJXJXJXJXJXJXJXJXVX+.X X . . 2 <.a.i.i.i.t.t.r.e.4.2.Z c c g > aXxXxXZXDXHXeX: h.7.y.5.$ n.n.5 . c C Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y c e pXGXJXVXw.b.b.>.>.i O [ KXJXJXJXHXJXHXLXBXBXxXxXiXuXmX:X& 2 j n U Y Y Y T U T U Y Y Y Y Y Y Y U n c c c j b b c b c c b b j b c b j j 0 X o : o & { 3XyXiXiXiXiXuXhXaXdXiXgXtXw.3 * b Y W <.<.W ,.,.,.T U T T T T T P m c c c c c c c n c c c c c j c n = o < B M v N z z z l k k g g 4 * . . X = K W T T U 0 1 1 , 2 2 5 w ( M.oXoXoXoXoXoXoXoXoXoXU.U.I.{.Y.w.7 0 h q j j j h l l h h l j h h j j j j h h j l j h h h h g 2 @ 1 U U b 1 . ' zXJXJXJXJXJXJXJX", "JXJXJXJXJXJXeXH X X m l.W.j.T l Q m.q + t t d } $.;.} 7 9.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.k.l.k.W j 0.q.O ; p { :.8XyXiX1XF f.%X$X_._.$X%X$X`.Z.Q P q q b W 9.k.A.A.A.P * F Z._._._.$X$X$X).Q @ C k.S.R.R.W.A.n b Q.$X_._.$X`.8.2 Y l.T.W.R.R.R.T.E.i.q = & - .>.B o s GXKXJXJXJXHXGXDXBXBXxXcXiXiXAX..X h c L Y Y Y Y T Y Y Y Y Y Y T Y Y Y C c c c n c c c b c b b b c c b c c c c g X ; _ > + + t ;XwXuXuXuXiXfXuXhXgXgXdXqXw.x * 3 l Y W W T T T T U T U U U Z n c c c c c b c b c c j j b c c l 9 * o & 2 q B z z z z z h 0 1 * @ . . . % h Y W W W C 9 1 1 1 2 2 x ! Y.oXoXoXoXoXoXoXoXoX@XY.L.U.I.I.Y.~ 2 h j j j l j q h j h l j j j l j j j h j j g h h h h h g < X 4 U Y n j , %.AXJXJXJXJXJXJXJX", "JXJXJXJXJXhX_ @ @ 2 4.T.k.Y h f.`.`.q.= > t a p d p % Q S.A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.A.l.l.t.m Y _.m.% + t d } -.:.;X` F K.$X$X$X_.$X$X_.$X$X$X).P.m.Q q q h z T 8.7 q Z.$X$X(.K.$X$X).8.@ m k.l.D.R.R.R.T.a.j 8.$X$X$X$X$X(.F 2 <.A.R.T.R.T.T.R.E.9.6 & $ t dXKXJXJXJXJXJXKX5XX X . . j i.a.i.i.i.t.t.t.r.r.e.4.4.6.n c j 6 B.SXMXBXAXGX;X6 Z W.R.c.b.b.n.D # n L U Y Y Y Y Y Y Y Y T Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T j l s.6.q.' @ T b.n.>.D o p GXKXJXJXJXHXAXFXBXNXlXfXiXvXCXu * c m Y Y Y Y Y Y Y Y Y Y T Y Y Y Y U c c c n c b c c b j b c c b b l c b c c j @ ; ;.$.y ; & 8 -.8XuXuXhXaXiXiXdXdXhXhXaXV./ x & * n L T U T T U U K C n c c c c c c c b c j b b j c c c b h @ & * . @ * 9 w w w 4 , @ X . X @ , , 2 U ,.,.W T b 4 1 2 2 2 B ) Y.oXoXoXoXoXoXoXoXoXoXI.L.I.I.I.{.q.w 9 j j j q j j j l j l j h h j h h q h j q j j g g h g 0 1 @ 2 L <.Z c 0 @ . % B.KXJXJXJXJXJXJXJX", "JXJXJXJXJX4X8 X X F l.s.Y M m.$X`.%XZ.F & > > - 7 7 9 9.T.A.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.l.k.T z Z.%XZ.l O > t t d { d = 8.%X$X$X_.$X$X_.$X$X$X$X$X$X%X$XK.m.Q 9 X & ; r 8.m.`.)._.$X).r.@ n s.l.x.S.R.R.R.R.S.T l m.$X$X$X$X$XP.9 j t.T.R.R.R.R.R.W.c.M ; o X 8 6XJXJXJXJXJXeX- . . . 0 t.d.s.i.t.i.i.i.t.t.r.e.4.4.T L j j w ' SXVXMXSXLX4Xo n W.R.c.b.b.>.1 @ S L Y Y Y Y Y Y Y Y Y U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y l g l.R.R.U X Z b.n.>.D : ] GXJXKXJXHXKXDXBXBXNXlXfXiXxX4X@ 4 n L Y Y Y Y Y Y Y T Y Y Y Y Y Y Y C c c c c b b b b b b c b c b c c b c c c c O o :.3X2XO.p ; + f 3XuXiXiXiXhXfXiXfXfXaXhXbX4XJ 3 X , n L U U Z m n c c j j j c n c c b c b c c b j j j j 2 . 9 b 1 @ @ @ @ # @ X o X @ @ < 4 M q m W ,.,.,.L j 2 1 1 , , G #X@XoXoXoXoXoXoXoXoXoXXXL.I.I.I.XXJ.G 7 q j j l j j j h g h g h j j j j j h j h h h g h g q 0 * @ 0 Y <.L c c 4 . . - ,XJXJXJXJXJXJXJXJX", "JXJXJXJXAX$.% @ g e.l.<.F m.%X$X$X$X_.m.* 7 q F 8.f.F <.T.A.T.R.R.R.R.R.R.T.R.R.R.R.R.R.T.R.R.R.R.R.R.R.T.S.k.l.t.b W _.`.).m.7 + : > > + O q r.K.)._.$X$X$X_.$X_.$X_._.$X$X$X$X$XK.F + d +.:.-.B.q.m.`.$Xf., j a.A.l.S.W.R.R.R.R.R.l.m F K.$X_.$X$X`.f.@ Y A.S.R.R.E.R.R.T.u.- = o > gXJXJXJXJXdX8 . . @ c t.s.a.i.s.i.i.i.t.t.r.y.4.4.4.,.Y j l h e aXAXSXVXLX4X 5 W.E.c.b.n.>.. 1 S T Y Y Y Y Y Y Y U Y U Y Y Y U Y U Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y m 1 l.R.R.T * p.n.n.>.5 o ` GXJXJXJXHXDXAXBXNXcXlXjXjXBX..* j n Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U m c c c c c c c c c c c c b j b c b c c c j . o 3X9X3X2X:.+.t = u :XyXiXiXhXiXdXhXfXgXaXbXbXhXB.H 8 . # 0 h c c c c c c c j j c c c c b c b c c b l l 4 . @ m T T K j 2 < 1 * * 3 r k b C <.m 4 L <.,.,.W C 0 2 1 1 , B M.@XoXoXoXoXoXoXoXoXoXOXU.L.I.I.I.U.~ * 9 j j h j j g l j j l j h l j g j h j g q j g g g 0 5 , @ j W <.T n c c , V hXJXJXJXJXJXJXJXJX", "JXJXJXGX>X8 @ * K t.0.Y m.%X$X$X`.$X).8.* P K.`.%XZ.M <.R.S.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.l.k.,.c m.$X_._.$Xr.% + * = * 9 q < 7 P m.K.`.`.$X$X$X_.$X$X$X$X$X`.K.Q O p -.8XiXBXmXV.,.a.m.4 9 e.l.l.l.S.R.R.R.R.R.R.S.r.K 8._.$X_.$X$X).K 2 r.S.R.R.R.R.T.W.F.' X . 8 qXJXJXJXgXt @ X j i.s.i.i.i.i.i.p.i.i.t.t.e.9.4.3.3.6.b n j 6 B.VXLXLXLX6X = x.S.c.n.b.>.* g P Y U Y Y Y Y U Y U Y Y Y U Y Y Y L Y Y L Y Y Y Y Y Y T Y Y Y Y Y Y Y M & z.W.W.W.p.b.n.n.,.: : $.KXHXHXKXDXAXZXNXxXmXkXkXvXhX; 9 j C T Y Y Y Y Y Y Y Y Y Y Y Y Y T m b b b c c b b c b b c b c b b b c c b c j c @ : 7XiXdX8X:X d ;.yXiXlXFXbXq.0 * 9 e.x.l.l.A.T.R.R.R.R.R.R.W.S.U h Q %X$X$X$X_.Z.* m a.R.R.R.R.R.R.!.rX X u gXJXJXSX{ X . X 0 t.i.s.s.s.p.i.i.s.i.e.t.t.e.e.9.3.3.<.Z j j h I bXVXKXKXdXX @ 4.c.c.b.n.7.. n P Y Y Y Y U U Y U Y Y U U Y L Y Y Y U Y T Y Y Y Y U Y Y Y Y Y Y Y Y Y M . e.R.R.W.c.b.b.>.v o O 8XJXKXJXHXAXZXBXmXxXxXkXlXMXB.= j n L Y Y Y Y Y Y Y Y Y Y Y Y Y U P n c c c c c c b b c c b b b b c b c b b c c c 2 $ eXxXlXfXtX3X:X:X;.s t ;XwXiXjXiXfXfXiXkXjXfXjXlXfXkXhX-X{ 8 & X , 4 g h j j c c j k j h j h g 0 , . . @ 4 L T T Y T T ,.,.W <.<.,.2.,.<.<.m q L 2.1.<.<.U b 5 1 , # 8 M.@XoXoXoXoXoXoXoXoXY.XXI.I.I.U.L.) 3 7 j g j j h j h l j h j j h g j j h h h g g q g q 0 , @ , C W ,.,.Y n c b 2 @ -XKXJXJXJXJXJXJXJXJX", "JXJXGX1X8 & w T 2.M Q (.$X$X$X$X`.q.q K z Q `.$X$XK.~ m A.D.W.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.l.l.1.b m.$X).$X$X).Q q d.W.R.T.A.k.l.l.i.,.C 9 2 h T m.(.`.`.$X$X$X`.8.: p d :.uX9XuXMXPXV.4 0 t.x.l.l.l.S.R.R.R.R.R.R.R.R.R.j.M M K.$X$X$X$X(.M X Y S.R.R.R.R.R.F.X.; + ` JXJXKXrX@ . X 9 4.a.s.s.a.i.i.s.t.i.t.4.<.4.4.4.5.3.1.3.Y c c m M V.aXKXKXAX_ . K z.c.n.>.r . m T U Y U U U U U U U L U U U Y U U U U Y L U U T U Y Y Y Y Y Y Y Y Y Y K X T T.W.c.c.c.n.>.5 $ O iXKXKXHXZXZXBXBXxXlXlXxXNXbXt 2 l K Y Y Y Y Y Y Y Y Y Y Y T U Y P m c c c c b c b c b j b b c j b c c b j c c c c 5 $ >XxXZXnXkXiX3X-X:X:X} t $.9XiXiXiXfXfXjXjXjXiXlXfXiXfXgXfX9XO.u & & @ # , 2 1 1 5 5 6 % # . . o X X h U K Y T W Y Y T T W ,.,.<.W <.,.,.0 j W <.<.<.<.U g 1 1 1 N M.@XoXoXoXoXoXoXoXY.U.I.I.I.U.G.6.9 9 j j j j g j j j h h j h j h g q h h g q q 0 q 5 5 , @ 0 L W W <.T A j b j , . u eXJXJXJXJXJXJXJXJXJX", "JXJX8Xi ; > ~ 0.F Y K.).$X$X$X`.f.h ,.a.l P (.$X_.`.Q j k.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.T.R.R.R.R.R.T.S.l.i.m T `.`._.$X$XZ.j Q R.W.R.R.R.A.l.l.l.k.s.t.W b 9 2 b 8.f.m.K.`.K.~ : t y %.7X3XuXlXkXrX0 <.l.l.l.l.l.S.R.R.R.R.R.R.T.R.R.S.0.l Q `.`.$X`.K.m.% 9 k.W.R.R.R.R.A.J ; & H GXJXcXt . 2 <.s.s.a.s.s.p.a.i.i.i.e.T T T T C L L T W W C c j j g V.PXKXJXtX: T n.>.5 * L Y U L L U U L U U U U U K U L L L U K Y L U U Y U Y U Y Y Y Y Y Y Y Y Y , 5 z.c.c.c.b.n.>.; $ t HXJXHXLXBXBXNXmXxXkXxXxXNXX.X q L Y Y Y Y Y Y Y Y Y Y Y Y T L K C n j c b c c b j b c b b b j b c b b b c b n j c 4 . ,XnXAXAXBXjXiX8X:X;X:X[ t .7XiXkXfXjXiXfXjXjXjXkXjXfXfXiXfXiXwX$.{ u > 6 # # # $ O . . X X & - & O , c U L U Y Y T T T W <.,.W ,.,.<.U 1 m <.<.<.<.T C 5 1 1 , . r #X@XoXoXoXoXoXoXU.I.I.I.I.I.f.z * 9 h j j j h l l j j q j h h h h j g 0 g 0 0 g g 0 4 @ # b ,.,.,.<.T C c c b g @ = 1XKXJXJXJXJXJXJXJXJXJX", "JXHX1X8 ; d ( M F Z.%X`.).`.$Xf.j U Z.k.F l K.$X%X$X8.b A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.T.l.l.5.c m.$X_.$X$X`.8.g l.R.R.R.R.T.R.R.A.l.l.k.s.s.a.e.Y n h 2 9 z U 1.q > p p } :.2X8XyXeXh.m s.l.l.l.l.A.R.R.R.R.R.R.R.R.R.R.W.S.U 0 q.).).K.K.(.Y < ,.W.T.R.R.R.D.J o & 8 =XKXB.. o < 4.s.s.s.s.s.a.s.a.i.i.i.i.i.t.r.e.e.9.1.Y K m m c j c g 2 B.VXJXAX_ o O O O 0 L P U L U U K L U L L L L L L L K U L L L U K U U U U K Y Y Y Y Y Y Y Y Y j # n c.c.c.b.>.B : o @.JXHXLXAXBXBXlXxXkXxXMXVXeX. 2 m Y Y Y Y L Y Y Y Y T U T U U Z C n c n c c b b l c b c b j b j c c b b c b b j c b 5 . $.jXSXGXZXCXxXiX8X.,.: $ ; CXKXHXZXZXmXxXxXkXMXmXmX0X8 . l L Y Y Y Y Y Y Y Y Y U T U Z C m n n c c c c c c j b b j c b b b b b b c c b b c c j , @ 6 p B.cXAXAXFXxXkX9X3X:X:.O.i p ;XuXiXfXjXjXkXjXkXjXjXgXjXjXiXiXiXiXiXtX9XuX3X:.-X;.;X%. . .o. .%.;.,X{ u @ h K F K Y Y Y T U U T W <.W < M <.<.<.<.5.U g 2 1 1 1 @ O N Y.oXOXOXY.U.L.U.U.J.7.q < 0 j j j j j j j j j h h g g j g g g g 0 0 q 0 0 5 2 # @ 9 U <.<.,.,.,.Z c c c c 2 . . = 5XJXJXJXJXJXJXJXJXJXJXJX", "HX7Xp & & + O ~ `.$X$X$X).m.m L s.l.k.l.F F m.K.K.(.0.M d.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.A.k.3.j r.$X$X$X$X_.f.j i.W.R.R.R.R.R.R.R.R.R.R.E.x.l.l.s.s.s.l.l.A.k.9.L q 8 d ; p t t d t X * 2.s.l.l.l.l.S.R.R.R.R.R.R.R.R.R.R.R.R.R.4.9 q.%X$X$X$X).Z.<.U l.x.R.R.A.l O + & 8 H X @ 0 s.s.s.d.s.a.i.i.a.i.a.i.i.i.t.t.t.e.9.9.3.3.0.<.<.,.Y b g 0 * o { hXqXdX& X . X l P K K Z K C C C n m m n n m n C m K C U K L K L L L L U U U U Y Y P Y Y Y Y Y = . 5 v , : ; : =.ZXDXLXBXxXxXxXkXkXfXiX+.+ 2 K U Y Y Y Y Y Y Y Y Y U L C C n b n c c c n c c c c b b c c b c b c b c c c j c j c j 4 + + X H 6XMXAXBXNXkXwX3X:.;X$.d 8 O.8XiXfXjXkXkXkXkXjXjXjXjXiXiXiXuXtXtXuXtX9X8X8X:.2X:.;.$.$.@.%.=.;X7XO.8 . , 4 0 j n c j 5 g L W W n , m 1.<.<.2.<.A 0 2 1 , , * o w.Y.U.U.H.F.P.f.R 9 3 w l j h h h h j h h g j j g g g h q q q 0 5 5 0 0 5 , @ * j T W T W ,.,.T m c c c 0 @ . . ..CXJXJXJXJXJXJXJXJXJXJXJX", "0X..3 > - = + 7 f.$X_._.m.j K l.l.l.s.A.Y F P.$X%X%Xm.F r.W.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.A.s.L P K._.$X$X%XK.P Z T.R.R.R.R.R.R.R.R.R.R.R.R.R.E.A.l.l.s.s.k.k.l.l.l.r.r 8 > t > + O q m , ,.s.l.l.k.A.R.R.R.R.T.R.R.R.R.R.R.R.R.W.A.M h (.$XK.m.~ Q 9.i.a.T.R.R.D.K O + : > % X * T a.s.s.a.s.e.R 4.s.s.i.i.i.i.t.t.t.e.e.9.3.3.1.1.<.<.,.,.Z n j @ . + o o # g K b j 0 9 5 , , @ @ . X . X @ @ 2 5 h b m m C K C U K L L U U U U U Y Y L Y Y L m & . + : : y kXkXNXxXxXkXfXiX3X$.i & X . * M L Y Y U Y Y Y Y Y U Z Z C C n n c n c c v j n c c b b b b c b c b j b b j b b b b b c 0 . o 8 - & 8 | uXSXZXNXlXiX8X1X:.-.d p ' 8XjXjXfXkXlXkXlXjXjXjXlXiXiXiXuXuXtXtX9X9X9X7X3X:X:X;.=.@.%.=.;.,XwX:Xi o . X @ @ , j L Y T T g 4 U 1.<.<.,.<.n 2 1 1 1 1 , @ % w R q.8.R M 7 < q g h h q q j j j g q h h g q q g g 0 q q g 0 0 0 5 4 1 * @ 4 L ,.2.,.<.W ,.T C c c b j , . u pXJXJXJXJXJXJXJXJXJXJXJXJX", "J p 7 ' $.B.B.u F (.$XK.P C s.l.l.l.l.A.8.M r.).$X$XZ.P f.W.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.0.j d.%X_._.$X$Xm.c 9.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.A.l.l.s.s.l.l.l.j.Y . w z z F m.`.d.< 9.s.l.l.l.A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.t.7 0.q.7 - > t t b 4.s.R.R.A.n . o + X O 1 a.d.p.s.t.5.v 4 ,.p.t.i.i.i.t.i.t.e.9.9.9.4.3.1.1.5.T ,.,.,.2.U C 9 @ @ . @ 1 b b , X X X @ * 2 4 g g j l b j h 4 4 @ @ * 2 0 b m Z K L L L U U U L Y Y Y Y Y Y U b o o o : : X 3XfXuXiX9XuX7X;X| O o o + 3 m L L L Y Y Y U Y Y U U K C C m n n n c c c c c c c j b c b c c c b c b c b j b b c b c c c 4 . . X & & 8 7 u 3XAXZXNXxXfX6X:X:X:X=Xi { 8XjXkXjXkXkXkXkXjXjXjXjXfXfXiXiXiXtXtXtX9X8X8X3X3X:.;.=.=.=.UX>X5XtXgX..& @ 1 4 j n m C L L K 1 h T 2.1.,.<.T c 2 < 1 1 1 1 , # # 3 , # # @ 2 0 w q g j g h g h h h h g h g g q q g g 0 0 5 5 0 9 2 * @ 1 m ,.,.,.,.,.,.,.T L b n n j 2 . . . O.SXJXJXJXJXJXJXJXJXJXJXJXJX", "> : i yXJXKXGXX7XdXkX#.a D c c m C C C Z C , j T <.,.2.<.R D 3 1 1 1 < , 1 , , 1 1 1 5 5 2 0 0 0 0 q 0 q g q q g g 0 0 0 g q 0 0 0 4 0 4 9 5 1 @ @ j T 1.,.,.,.,.,.<.T L m c c n 5 @ . V hXJXJXJXJXJXJXJXJXJXJXJXJXJX", "> & &.vXJXLXGXaXJ 0 9 n s.l.l.l.l.k.A.l.t.F 8.).).%X).Q T W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.S.t.M 0.$X_.$X_.$XZ.b 3.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.l.l.l.l.s.Y % 8.%X$X).$X$Xf.2 9.s.s.l.l.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.U ; } 2XlXBXNXhXJ j t.t.s.z . + X X X P e.5.A 1 # c t.s.d.i.i.i.i.i.t.y.t.r.e.9.4.1.3.3.1.<.W ,.T ,.T ,.Y Y Y U K z % X % 4 j C C C m m m m n C b m n n m n n m m m m Z C n g 5 g Z Z Z L L Y L L U Y Y Y Y T L m 0 % . : o X o X O X % = z M T T U Y U Y Y Y Y Y K C K l j q M n m m b M m M m n M b m m b c b b j b b b c b c j c b j c c j c j 4 . , 4 * X . : H eXAXGXBXzXfX8X3X:XX8 X 2 5 c n n n C j # j ,.,.,.,.<.E h 2 5 1 1 , 1 # , , , 1 , , 1 2 5 4 4 0 0 g g g 0 g g g g 5 0 q 5 5 5 5 4 4 4 1 # @ 5 L 2.,.,.1.,.,.,.,.<.Z c c c c 0 @ . = >XKXJXJXJXJXJXJXJXJXJXJXJXJXJX", "> & ' aXKXLXGXPX' g r.l.l.k.k.l.l.k.l.d.F Q $X$X%X`.Q K W.R.R.R.Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.l.,.M Z.$X$X_.$X`.e.b k.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.l.k.l.l.l.s.Y * f.%X$X$X$X`.m.9 9.l.l.l.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.s.= ; y } 7XiXBXAXcX$. < 9 q % X % O % K j % . @ n p.s.a.s.a.s.i.i.i.y.t.t.r.9.e.9.3.3.3.<.1.,.,.,.T ,.U T L U L g X % * l K C m m C n n b j g j j b b n n n n n n m n m m m C C n n C K L L L L U Y L Y Y Y T T L Y m 9 * = 3 2 8 < w h P P Y T U Y Y Y Y Y Y Y Z K n l b b Z Z L C C C P Z Z K m P Z Z C Z m b c b b c c b b j b c b b b b b j c c j @ # h b 0 @ X + e 5XAXAXNXxXfX9XXt 2 c b n n n 0 # C ,.,.,.,.,.U g 2 6 1 3 < # , # , , # 1 1 1 4 5 4 4 0 0 5 0 5 0 g 5 0 0 0 0 4 9 0 0 5 5 2 * * 9 L 1.5.,.,.,.,.,.,.<.T U m c c c g * . . X { vXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "> = d 2XBXVXSXB.6 , 3.x.l.l.l.l.l.k.k.l.d.M P ).`.$X$XQ K Q.R.R.R.R.R.R.R.R.R.T.R.R.T.R.R.R.R.T.R.R.p.m Q `.$X$X$X$XK.T U R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.l.l.l.l.l.A.Q = m.$X$X$X$X$Xq.2 r.s.A.l.D.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.s.* ; p _ 3XuXlXZXvX1X* 8.f.q.9 o X X O O @ X X g t.s.s.t.i.i.i.i.i.y.t.t.t.r.e.e.9.3.3.1.1.,.2.,.T T ,.T U Y U K j , 5 m K C C n b j 9 < X X X @ g n n n n n n n m n m n C C C C m C L L U K Y L Y Y Y Y Y Y Y T T Y L U T T T U T P T Y Y Y Y Y Y Y U Y K b j m L U P K L Y K K L b M m j b n m M F C n c c b c b c b b c b c c b c c c j j c n 0 . 4 c b h * . @ r 6XLXDXBXcXiXtXX,X9XdXAX3Xt X 2 b c m 2 , C T ,.T ,.<.Y k 3 5 1 6 , # # # , , # # , , , 1 1 1 1 5 5 4 4 4 0 4 4 4 4 4 4 5 5 # @ 0 Y 1.<.<.2.<.,.W <.,.,.,.T T m c c c n 4 @ . . = ,XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "8 > & & X X X X h t.l.l.l.l.l.l.l.l.k.k.A.T M P.).`.%Xq.K A.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.E.a.n , M m.K.%X$X`.0.U E.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.T.R.R.R.E.l.l.l.l.l.s.L 7 m.$X$X$X$X$X8.9 r.k.s.l.S.W.R.R.R.T.R.R.R.R.R.T.R.R.R.R.R.l.1 : p y ] :XiXyX;X% 9 Z.K.m.2 O X O @ K d.s.p.p.a.t.i.t.i.t.i.t.t.e.r.e.9.9.9.3.5.<.,.,.,.,.T T Y T K L Z Z C C C m n b # . r N.J.V.f.Q K k g , X 5 j n c n c n c n n n n m C C C L K L L U L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y L j q M n b 0 j q l m U T Y T T Y Y Y Y Y Y Y T Y Y Y T Y K m b b c c b b b c b c c c c j j j n c c j @ , j c b b 0 @ = i qXDXAXCXxXiXtX:X:XX5X0XjXCX3Xt @ 0 c b 4 , Z T <.T W ,.Z k 5 e 5 3 1 1 , , # , , , , , , , , 1 1 1 1 1 5 4 4 5 4 4 4 5 2 , , 9 K <.1.<.W ,.<.<.1.<.W ,.,.,.T n j c j c 5 * . . & o.cXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "t 8 > & % % * l s.S.x.S.S.E.T.R.S.l.l.l.A.T 0 f.`.$X%Xm.m S.W.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.A.<.0 - H J l Q K.$Xm.j 9.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.x.j.l.l.l.k.L 7 Z.%X$X$X$X$Xm.w r.s.s.A.A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.T . + ; p } ;.-.8 7 m.K.f.% . . = 3 X g t.9.p.i.p.y.1.i.p.y.t.y.y.t.t.e.9.9.4.3.5.3.,.1.,.,.T T T Y U L Z C C C C C n n j r oX@X@XOX@XY.C.z.p.g.M . 5 n n c c n c n n n n m m C C C K K L U K Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y m q 0 M l 0 q m L L Y T T Y Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y L b c c b c b c c b c j n c j j j h c c c 0 @ g c b b b b 2 @ @ H gXDXFXBXmXiX9X:X:X2X6X..-.iXxXkXlXxXxXxXjXlXlXjXjXjXiXiXiXiXtXtXtX8X7X7X3X3X:X:X-X=X;X>X5XqXgXvX>X> # g m , , K T T T T T A x w 5 5 1 2 1 # , , # @ , , , , , # 1 1 1 2 2 2 2 2 2 4 4 4 * 1 b T 1.<.<.<.,.<.<.<.<.W W <.,.T L n c c c v g # X # X.SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "rX{ ; & o @ m l.W.R.R.R.R.R.R.R.S.A.l.k.A.W q m.$X`.%Xm.U m.W.R.R.R.R.R.R.R.R.R.R.R.T.S.S.x.0.h X f :X8X4Xm.8.8.K.q.v x.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.k.l.l.l.s.L w P.$X_.$X_.`.m.0 t.s.l.l.A.W.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.k.1 O > t y : 7 z X 9 2 2 @ X = B.h. # T d.y.t.e.Y 2 Z i.t.p.i.t.t.t.e.e.e.9.4.9.3.1.<.3.<.W T T Y Y L L L Z C C n n n n g . 7.OXOXoXOX+XY.C.t.g.p.v.k 1 c c c n c n c n n n n m C C C C C L L L Y L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y L K g h m l 0 n Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y U C c b b c b b c c b c c c c j j 0 j j c j 4 , j b c b c c 9 @ . _ bXAXAXZXxXiX8X - o U T.R.R.R.R.R.R.R.R.S.l.k.l.A.2.q m.K.).%Xm.Q s.Q.R.R.T.S.S.D.D.A.A.l.s.0.L j * . > %.yXiXaXsXY.q.8.W U W.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.T.R.R.R.E.l.k.l.l.l.s.F 7 Z.$X$X$X_.).r.0 t.s.s.l.A.R.R.Q.R.R.R.R.R.R.R.R.R.T.R.R.R.R.T.t.9 O . O 7 m.F 9 a.9.W @ X . ; X.& . . g e.4.3.M 0 4 U i.i.t.i.i.t.t.y.e.e.e.9.9.9.3.1.1.<.W T T T Y L L Z Z Z C n n n c n b X I @XOXoXoXOXY.J.f.g.p.g.N . 2 b n c c n c b n n n m n C C C C Z Z L L U Y U Y Y Y Y Y Y Y Y Y Y Y Y T Y m 0 2 C M h n T Y Y Y Y Y Y Y Y Y T Y T Y U Y Y Y Y Y Y Y Y T Y Y Y Y Y Y L b c c n c b c b c b c c b 4 @ < 2 h j c j @ h b b c b b b h @ @ u 6XAXAXNXvXiX8X2X = O C E.R.R.R.R.R.R.R.R.T.A.l.l.l.9.z 8.(.(.$Xm.j ,.A.s.e.T M 0 l q 9 7 * @ @ . X o + O t -.8XyXfXmXvXV.T <.s.W.R.R.R.R.T.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.x.l.l.l.l.s.L 7 P.$X$X_.$X).q.2 0.s.j.l.A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.W.s.% * z P K.).P z s.s.,.# . o X % O @ Q 9.b , . 9 8.a.a.i.i.t.t.i.y.y.r.e.e.e.9.1.3.3.<.<.W <.T ,.Y U U Z Z m m m n n n c c @ w OXOXOXoXOX+XJ.z.f.v.C.2 g b b c b b c n c n c m n n n C C C L L L U U Y Y Y Y Y Y Y Y Y Y Y Y Y L g , b T Y U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Z c c c c b c c b c b b b 4 X . * 0 j j * 1 c b b c l b c h @ . - qXAXZXNXzXiX8X3X3XwX;._ 2XlXxXxXxXxXNXxXxXlXkXkXjXjXjXiXiXiXtXtX9X9X3X7X3X3X3X:.:.=.:X,X9XjXzX>Xe @ X c U T T Y T L , 3 w w 5 5 5 4 4 1 1 , 1 # , , , , # @ @ @ # 2 g m Y <.<.<.,.<.,.1.<.<.1.,.<.<.<.W ,.,.U b c c c c c j 2 . X # $.LXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXqXu & ; o A S.R.R.R.R.R.R.R.R.T.A.k.l.l.d.9.q.q.P P F l 0 w % % , < 7 < w q w 9 q z F P z = + p %.yXyXyXmXkXM.U <.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.l.l.k.k.l.k.T q P.$X$X$X$X(.T 0 s.l.k.l.x.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.s.9 8.%X%X%X).Q w l.k.,.. O X O . . 9 ,.l . X 1 9.d.i.i.y.i.t.t.t.y.r.t.9.9.9.9.3.3.<.2.<.,.,.W U Y U L Z Z C n n C b n c m 0 = w.OXOXOXOXOX+XF.v.m.2. , b c b b n c c n n j c n n n S m C m Z K U U U Y Y Y Y Y Y Y Y Y Y Y Y C 9 0 K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y c c c j b c b j l c c c c 0 . X . . , g h * 4 j b c c b b b 0 X . V bXGXZXBXkXtX9X7X8XuX1X' 7XlXNXxXmXxXxXxXxXxXkXjXjXjXiXiXiXyXtXtXtXtX7X7X3X3X3X:X-X:X:X3XtXIXIXh.2 . . 1 K T T T T T b @ @ < 5 e 3 2 3 , 1 # @ @ @ . X X # 1 0 n U <.<.<.<.<.W <.,.1.<.1.,.<.1.,.<.<.<.,.T C c c c c c c c 4 . @ 3 @.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXgX} & & o n x.W.R.R.R.R.R.R.R.T.A.l.l.l.r.l * = F 8.) F 7 3 F Q m.).).K.).$X$X`.$X_.$X%Xm.* : d +.9X9X3XfXbXB.m 9.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.W.E.l.k.l.l.l.k.T q (.$X$X$X_.(.T 5 s.k.s.l.A.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.T.R.k.9 Q %X$X$X).8.7 a.j.3.X . O X O O @ 0 , . . # T s.t.i.a.p.y.y.t.y.t.y.r.e.e.9.0.4.3.1.1.<.<.W R T Y L L C C C n n c n n c n c 0 = M.oXoXOXoXC.8.8 = @ * l j b c c c c c c c c n n n n m C C C C L L U U U L Y Y Y Y Y Y Y Y Y U 2 l Y T Y Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y m n c c b c c b c b c n c j 2 . 1 * X X q 2 @ h c c c b b b b 0 . . +.nXGXSXcXkXwX8X3X8XiX;.X.0XxXMXNXmXcXNXcXxXkXkXkXjXjXfXfXuXuXwXtXtX7X8X3X3X3X:X=.-X=.:X5XtXjXjX$.e = $ j Y Y U T T T n * . @ . X . . . . X . X @ * 5 j m W <.<.2.<.<.<.<.<.2.<.,.<.<.<.,.1.,.1.<.W ,.U n j c c c b c b 4 X , 1XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXCX..o : o n S.R.R.R.R.R.R.R.T.R.A.k.l.f.q d -.1XeXyXB.2.m.%X%X$X$X$X$X$X$X$X$X$X$X`.`.m.7 & p } :.7X8XuXyX) D 4.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.l.k.l.l.l.k.T q (.$X$X$X$XK.n 0 i.l.l.l.x.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.l.9 Q %X$X$X).~ 2 t.s.T . . O O O . . @ . X h a.p.i.y.a.y.t.y.t.t.y.r.r.e.4.9.9.3.5.1.<.<.W T ,.Y L Z Z Z C n C n n n c c n c 0 0 8 #XoX@X4X1 , 0 0 h b c b b b b j c c n b n b n c n m n C C C L L K U U Y Y Y Y Y Y Y T T Y L M T Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y C c c b b c c b b c c c c c c @ , m j * @ 1 . 0 b c b c c b b b 0 @ @ ,XLXLXZXcXhX9X8X3X8XiX>X%.iXMXcXcXcXNXnXnXlXkXkXkXkXfXfXuXiXuXtXtX9X9X7X3X3X3X:X:X:X:X>X6X0XmXNXeXH = % n T T T T T T K j 1 # # @ @ , , * 9 j C Y W <.1.6.<.W ,.,.,.,.,.<.<.<.1.,.,.<.1.,.,.,.W Y C b b c c c c c c 4 @ X . %.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXcX| & ; O n x.R.R.R.R.R.R.R.R.R.S.k.A.Q O : } :XyXbXBXPXV.m.`.$X$X$X$X$X$X$X$X$X$X$X`.K.f.q + a t d } -.;.( @ * n k.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.T.R.R.E.l.l.l.l.l.s.Y q `.$X$X$X$XK.m 4 t.l.k.l.A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.W.l.q Q %X$X$X`.q.* r.t.T $ o X O . . . . * 4.p.a.i.t.t.i.i.y.t.t.y.e.e.e.e.9.9.4.3.3.<.<.,.,.T U Y L K Z S C n n n c n c c c c c 5 k M.V.0 0 b b c c c c c b c c c c c c c n n c n n n C C m L Z L L U Y U Y Y Y U Y Y Y Y Y Y T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Z b b c b b b b c b c c c j c 1 . j L n * X , j c c b b c c n b 5 . - 0XGXZXCXlXuX9X7X8XyXmX1XB.fXNXCXnXNXnXnXnXnXlXlXjXfXfXfXiXiXtXtXtX9X9X7X3X3X:X:X:X=.-X,X8XtXxXCX7Xu o 9 K Y Y Y R Y T T T U K K Y W T W <.<.,.,.,.,.<.,.W <.W <.<.<.<.,.,.<.<.1.1.,.,.1.,.,.L b c c c c c c c h 2 @ @ @ ..cXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXHX-.- - + M x.W.R.R.R.R.R.R.R.R.S.k.s.F + > | 2XyXyXkXCXV.r.)._._._._._._.$X).K.(.(.K.Z.8.q . ; t a a p 8 + 9 n % K S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.k.l.l.A.d.K r `.$X$X_.$X(.Y 9 t.l.l.l.S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.p.0 P %X$X$X_.f.% Q <.M . + o . o - 7 . 9 a.t.p.i.i.t.t.y.t.t.t.y.t.y.e.0.9.4.0.3.1.1.<.,.W T T L Z Z Z C m C c n c j c m c c b j b c c 5 l c b c c c c b c b c c c c c c b b n c C C n C C Z Z L L U U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T C b b j c c c c b c c c j j c j X * K T K , . X g c c c c n c j c b * e gXGXZXCXkXiX7X3X8XyXaX;X2XzXnXnXNXnXnXxXnXlXlXkXkXjXjXiXiXiXtXtX9X9X8X8X3X3X:X:X-X-X-XXt X 4 m U U T T T T T T T W W W W W W W T ,.T T W W <.W <.<.<.,.,.,.<.1.,.,.,.,.,.T L m c c c c b b c c 4 @ . . 3 B.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXAXO.= > = A A.R.R.R.R.R.R.R.R.R.T.A.s.M + t ] :XyXyXiXlXV.U d.K.K.K.).K.K.K.Z.Z.Z.0.P q % @ @ + O X + + X l m.0.9 < <.W.T.R.R.R.T.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.E.x.l.l.l.l.s.m h $X$X$X$X$X(.K g a.s.l.l.A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.A.k.C P $X$X$X_.Z.@ T 0.m o o o r V.w @ R p.i.p.p.t.t.i.t.y.y.y.e.e.e.9.9.9.4.0.3.1.1.1.,.,.T U Y Z Z Z C n n n n n c n c c b b c b n j b c b b c n c c c c c c c c c n b n c b c n n m C m C L L U U U U Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y C b c b b b b c c b c c c j j c 4 X g Y T T 4 X 2 j b c c c c c c b h @ ` kXGXCXcXjXuX7X3XwXgXfXB.wXNXBXNXNXnXnXnXxXnXzXkXjXjXfXfXiXtXtXtXtX9X8X3X3X3X:.;.:.=.3X3X0XgXCXnX[ a O 1 m T Y T T Y T T T T T T T W W W W ,.T ,.,.<.,.,.,.,.,.,.,.<.,.,.,.<.<.T L n c j j b c b c c 0 * . . # u 4XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXAX%.+ & O M A.W.R.R.R.R.R.R.R.R.S.A.s.b O > d %.:X3XiXyX+.0 8.m.q.q.0.Q Q F q < , < 4 h m L c = < 7 F Q m.K.K.(.q.* j a.W.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.E.x.k.l.l.l.a.m M $X_.$X_._.Z.j 9 4.k.l.l.l.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.S.A.K m $X_._._.Z.# U 9.U X o o u B.h.@ X g a.a.i.a.a.t.t.t.t.y.y.t.4.e.e.e.9.9.0.4.3.5.1.,.,.T T Y Y L Z Z C m n n n c n c c c c j c n c c c b b b b c b c b j b c b c c b c n c n n n n C C C C L L K L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y C c c c j c b c 0 0 5 h c c c h g @ # C U T T U m b c c c c c b b b b 5 . O.CXGXnXxXiXyX3X3X9XkXeX;XbXZXCXBXnXmXBXNXxXxXlXkXjXjXjXjXiXiXtXtX9X9X9X3X3X:.3X:X;.:X3X7XtXzXAXnX[ $ o 5 L Y Y Y Y T T Y Y T T T T W T T T T W T W ,.,.,.<.W ,.,.,.,.W ,.T L C j c c c l n b c c b 2 X $ 7 $.SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJX;X- ; O b A.R.R.R.R.R.R.R.R.W.S.A.l.T + ; t p f .-.| > + * 2 < 4 0 j m K T <.e.i.j.s.s.s.1.7 7 8.(.$X(.K.$X$X_.r.1 n S.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.l.k.l.l.l.d.M q `.%X$X_._.K.q 0 9.l.l.l.x.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.E.T.R.S.0.q )._.$X_.K.5 T t.K X X t pXV.u . @ U d.p.a.i.i.i.a.i.y.t.y.y.y.e.4.3.4.1.3.1.3.<.1.<.W ,.W Y U L L C C n n b c n c c n c c c c c c c b b c c b c c b b b b b c b n c b c n c n n n n C C C C L C T L L Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y T T U m b b b b b c b , . . @ @ 0 j c j < X l K T T <.<.Y m c c c c b j c c b , . @ 6XAXAXZXlXfX8X3X7XiXxX1X4XvXCXCXZXnXBXcXnXxXxXlXjXjXjXjXtXtXiXtXtX9X9X8X3X3X3X:.:.=.;. p t i t O * z F Y 2.t.k.l.l.A.l.x.l.l.l.l.l.l.a.P * z m.(.(.(.$X$X$X).T * ,.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.k.l.l.l.l.a.l q (.`.(.(.K.m.w 2 9.x.l.k.x.R.R.R.R.R.R.R.R.T.R.R.R.R.R.T.S.W.R.R.R.e.0 K.$X$X_.(.j P a.m X o H bXB.o . , e.a.t.d.i.i.t.i.t.t.t.t.y.4.,.4 , 2 1 5 T 3.1.1.<.,.W T Y U L Z Z C C n n n c n c c c c b c c c b c c j b j b c c b c j b c b c c c n c n c n m C C C K L L L U T K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y L n c b c b j b b j 0 , X . . . , 0 0 . , C T T W W ,.<.C c c c b b b b c j @ . = 6XSXNXmXlXiX8X3X9XkXxX1XuXNXZXCXCXCXNXnXxXxXlXjXjXjXjXjXfXiXtXtXtX9X8X8X3X3X:X:X=.3X B.1X+ . % Q t.t.p.i.i.t.p.i.y.i.t.e.Y @ 2.e.4.b c c j # , R 1.,.,.,.W Y Y Z Z C C n C n n n b n c 0 . 1 j j j c c c b c c b j b b c c c c c c c c n c n n m C m C Z L L L K Y L Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y W T Y Y T Y W Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y L m c c c b b c b c c c c c c c b c 4 @ 2 l 4 K Y U W W W <.,.,.T Z b b c c c c j # - 6XSXNXxXkXuX7X7XuXzXxXkXNXAXAXZXZXZXNXnXmXmXmXlXlXjXjXjXiXiXtXtXtXtXtX3X3X:X:X:X-X=.-X,X6XtXlXFXcX..- o O * j n C K L U C Z U Y Y U K L C c c c c b c c b c c c c c c c c j c j c c v , @ # # rXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXqX` & : 8 y.W.R.R.R.R.R.R.R.R.R.S.k.l.9.q Q ).$X$X(.L q s.R.R.R.R.R.R.R.T.A.l.l.l.l.l.l.l.k.l.k.d.P % 7 m.$X$X$X_.$X$X%Xm.9 C E.R.R.R.T.R.R.R.R.R.R.R.R.S.l.l.l.j.j.i.5.c # O + > t } 3XyXjXvXV.Z T x.l.l.k.l.E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.t.0 q q.Q K P 1 < r.Y o > %.-.O + X F 2.4.4.2.T l A Y 9.4.,.P 4 % K T T T n c c h # 5 1.,.T Z <.Y Z Y C Z C C n n n c c c n j # . @ 4 j j n b b b c b c c c b c c c c c c n n c n n m C C Z Z L L U U U Y Y Y Y Y Y Y Y Y Y Y Y U Y T Y Y Y Y Y Y T T Y Y T Y Y T Y Y Y Y Y Y Y U T Y Y Y T Y Y Y Y Y Y Y Y Y C j c b j c b c j b b b c c c c c b j g * j Y Y L T W W T ,.W ,.<.W m c c c n c c D @ J vXLXNXlXfX9X7XwXfXcXlXCXCXZXAXZXCXBXZXmXmXmXmXlXjXlXlXiXiXiXtXtX7X7X8X3X3X:X:X:X-X;.:X3XtXtXmXZXqXu o o . # 0 b n n n c M n b n b c c c c c c c b b b c b b c c c c c c j j C U ,.U 1 @ # 3 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXqXi = & 7 0.Q.R.R.R.R.R.R.R.R.R.D.k.A.0.F q.$X$X$X).2.9 r.R.R.R.R.R.R.R.R.R.R.T.A.x.l.l.l.l.l.l.l.a.F + F Z._.$X$X$X$X$X`.q.2 ,.R.R.R.R.R.T.R.R.R.R.T.S.l.l.s.e.U j 2 < m 1.K e p t f 2XyXiXlX4Xn Z d.A.s.l.l.A.W.T.R.R.R.R.R.R.R.T.R.R.R.R.R.R.A.k.t.K . O X z 8.0 q 9.Q o > 3X>X X . @ @ # @ O . . * M W 1.0 , R 4.4.4.<.n j j 1 @ n 6.,.,.W T Y U Z Z C C c n n n n n c c c @ . . * q j j c c c c j c b c c c c c n c n c n n n m C C C C L L U U Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y T T T Y W Y Y W Y T T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T L n b b b b c b b b j j b c c c c n b c b h 1 m Y L Y T T W T <.W <.<.<.C c c c c c b 5 . $ >XCXSXCXlXiX7X7XtXlXnXCXZXZXAXZXZXZXZXnXnXnXmXxXlXkXjXjXkXiXiXtXtXtXtX8X3X:X:.:X;.=.;.:X3XtXlXSX4XJ - + X . . 2 j c j j c c j j c b b j c b b c c c c b b c c n b c j c C T ,.,.4.Z 1 @ @ # 4XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXDXB.> & ; 5.W.R.R.R.R.R.R.R.R.R.S.A.l.4.q m.%X$X`.$X8.2 r.T.R.R.R.R.R.R.R.R.R.R.R.R.S.l.k.l.l.k.l.k.9.j @ Q `._.$X_._.$X$X(.~ 2 4.W.R.R.R.R.R.R.R.R.S.k.a.<.q = , l 0.K.%XZ.Q G y t y ;.3XiXaXB.5 Z A.l.A.s.k.l.T.R.R.R.T.R.R.R.R.R.R.R.R.T.T.D.A.t.P % O + & w m U Q ,.b . o - 5X;Xo o O . . . . < 0 0 , # b W , , W e.9.9.4.6.n c c , 2 T ,.,.T T U U L Z C C C n n m n n b j 9 @ . . . . # 2 h j c c n c c c n c c c n c c n n m m C C L L L L U U Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T T T T T T T T T T T T T Y T Y Y U Y U U Y Y Y Y Y Y Y Y Y Y Y Y m b c c j b c b c b b c c c n j c c j j b b j 4 m K T Y T W W W W W <.<.T n c c c b c c , . e hXDXnXnXgX9X8XtXgXnXmXCXDXZXAXZXZXZXZXBXnXnXxXkXkXzXjXiXtXuXtXtXtX8X8X3X3X3X:X=.=.=.;.3X8XtXxXfXO.8 % X X X . @ , 9 0 j c c c c b c c c c c c c c j c b b c b v c S Z ,.1.1.<.5.m , @ @ # 4XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXHX#.> ; ; 8.W.R.R.R.R.R.R.R.R.R.S.l.l.e.b q.$X$X$X$X0.0 9.W.R.R.R.R.R.R.R.R.R.R.R.R.T.A.l.l.l.l.l.l.l.9.0 2 q.K.).$X$X$X$X%XZ.q g i.R.R.R.T.R.T.T.S.t.K , * q 0.).$X%X$X$X).q.w p t p f .:XB.x . 9 Y t.A.s.l.l.S.R.R.R.R.R.R.R.R.R.R.R.T.D.A.x.e.m . O > { -.-.X.W <.T < X . ; 6XSX%.p > e u # . * U L j j 1 1 , @ * 6.e.4.9.4.4.6.c c 2 # n 1.,.,.T Y U Z Z Z C C n b b j j 0 , . . # 5 4 , @ . @ # , 4 j j c c c c c n c n n n n n m C C m C L K U U L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T T T T T W T T T T Y T T L U C C 0 , * < m Y Y Y Y Y Y Y Y T Y Y A c b b b c b b c b c c b b c c c c b b c c K 2 , Z Y W T T T W W ,.W ,.2.W C j c c c c h @ . ' zXZXnXlXiX8XtXiXxXnXnXZXDXAXZXZXZXZXCXnXnXnXxXxXlXjXjXjXjXiXtXtXtX9X7X3X3X3X:X;.=.=.=.:X9XiXcXNX7Xy X X @ X @ . X @ # 4 h j j j c j n c j c h 0 q j c c c c C T ,.1.1.,.,.,.1.c @ # # 3 eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJX5X8 & 6 0.W.R.R.R.R.R.R.R.R.R.T.l.x.e.m f.%X$X$X%XZ.j 1.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.k.k.k.l.k.k.k.4.2 9 0.K._.$X_.).).$XZ.4 c k.W.R.R.Q.A.,.9 * 2 Q P.)._.$X$X$X$X$X$XP.M 8 t p t p V u O 7 Q F P r.l.k.l.A.S.R.R.R.R.R.R.R.R.R.R.T.A.j.9.2 @ + a y ;.iXfX0Xw.2.4.1 ; ,XJXJXJXKXJXSXu @ m t.a.Y c j j 9 @ * R e.0.0.0.3.1.K c c 1 1 T ,.,.W T U L L K Z C 0 # . @ . . @ 4 4 c c c b b j 4 , * # # 2 j n c c n j n n n n n n C m C U L L U U U Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T Y T T T T T T T m g 4 * % , 2 j L 0 @ @ , # . . j U Y Y Y Y Y Y Y L K n j b j c j b c b j c b c c c c c b b b b b 0 @ l T Y T Y T T T W W <.W ,.<.T C c b c b c 2 . , 6XAXBXcXiX8X8XtXmXnXnXAXZXAXAXAXZXZXZXCXNXnXmXxXkXkXkXiXjXiXtXtXtX9X9X3X3X:X:X;.=.=.=.:.:X9XjXcXAX:X> . X @ @ @ @ @ @ # @ * , 2 9 q 4 2 , 1 g c c c c c m T T ,.,.,.,.<.<.<.3.m # @ # e pXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXeXp & t u.W.R.R.R.R.R.R.R.R.R.T.A.l.t.K m.%X`.$X$XZ.M W R.T.R.R.R.R.R.T.R.R.R.R.R.R.R.T.l.l.l.k.l.l.l.j.,.* r Z.).)._._._.$X`.d.@ q s.S.t.M * 7 P m.`.$X$X$X_.$X$X$X$X_.$X_.m.z < + - = . O 7 m.%X).8.K t.l.l.l.A.R.T.R.R.R.R.R.R.T.S.l.r.m w T m p y %.8X9XyXV.T e.2 . ; rXKXJXJXJXJXvX@ X % Y s.s.i.U c c m , * Q e.4.4.0.4.4.1.n c 0 @ M ,.T T T Y L L L Z C C C j 2 2 5 g c m n n c n c n c c c c h 2 # # 5 j n c n c n c n m C m C C L L U L U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T Y T T T W T m 2 . X X X @ X @ K 2 9 L U m b g . @ j Y Y Y Y Y Y U K n b c b b b b c b b c b c c j n c c c j b j , @ M Y Y T Y Y W W T W W <.,.W <.<.W m j c b b b # J zXAXNXkXtXtXwXjXnXnXCXZXAXDXDXAXZXZXZXnXNXNXxXxXlXkXjXjXjXiXiXtX9X8X8X3X3X:X:X;.=.=.=.=.3XwXhXvXNX] X 1 2 , @ @ @ % # @ @ @ @ @ * , 4 h b c c c c m Y T T T ,.,.<.,.1.5.,.3.v # @ @ 3 eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXwXi % y f.W.R.R.R.R.R.R.R.R.R.T.A.l.t.K q.%X$X$X$XZ.l T R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.l.l.l.l.l.l.s.P % F Z.`.$X$X$X_.`.Z.K @ , 0 * F r.K.$X$X$X$X$X_.$X$X_._.$X_._.$X$XK.~ * X . @ * z m.).$X%Xm.P d.A.k.A.T.R.R.S.T.R.R.T.D.k.W w K Z.).P O p y O.8X9X9XB.F <.X . o ] JXJXJXJXJXJXgX @ 2 e.d.s.s.i.L j j 1 @ j e.9.4.4.5.0.5.Y c c , 2 <.,.W T Y Y U Z L Z Z C C m n n n n n c m c c n c n n c b n c c 2 # 1 c c n c n n n n n C m K L L L K Y Y Y U Y Y Y T Y Y Y T Y Y Y T T Y T W T W L 1 X X X @ * 2 4 * X * , Y Y T T m c 0 @ * n Y Y Y Y U L n b b c b b j c l b c c j c c c b b c n j 0 @ 1 K T Y Y T Y T T T T W W W W <.W <.1.T m b c c c 4 @ ; 6XAXAXvXgX9X8XdXxXnXBXDXAXDXDXDXAXAXZXCXNXnXnXxXzXlXjXjXiXiXiXtXtX9X9X3X3X:X;.=.=.=.=.=.:X5XqXgXAX7Xp @ g b b 5 5 0 0 0 g h c c b c c c c c c b L T T T ,.,.,.,.,.<.<.3.<.<.n @ @ @ e eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJX7Xu & i w.Q.R.R.R.R.R.R.R.R.R.T.A.A.t.M 8.$X$X$X$XP.F T W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.l.l.l.l.l.k.l.s.M 7 f.`.`.`.P.q.P 9 7 * < L m.$X%X$X$X_.$X$X_._.$X$X_.$X_.$X_.).m.Q q % X 9 K m * z m.).$X$XK.Q m.A.l.D.R.R.R.T.T.A.A.s.j h q.`.$X).P a y ` ;X2X3X{ g K X u DXJXJXJXJXJXKX5X @ 2 ,.s.a.p.a.e.M j 5 @ w e.9.0.4.4.6.<.,.b M 5 # U ,.<.T T T Y L L U Z C C n m m n n n c n c n c n c c n n c n c c 4 @ , n c n n n n C C C Z K L L L U L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T W Y m * X @ 9 0 j j j j j * . 4 Y T Y T T m c @ . X h U U L m n j c c b c c b c c c b c n c j n c j j 4 * @ 1 C Y Y Y Y Y Y T T Y T T W W ,.,.<.<.<.<.T b c c c j @ . V zXAXnXjXtXwXtXlXNXCXAXDXDXDXDXFXAXAXZXBXnXnXnXxXxXkXkXlXlXiXtXtX9X8X7X3X3X:X=.=.=.=.=.=.:XeXwXlXZXo.% 1 j b j c c b c c c c c c c c c c c m Y T T T T W ,.,.,.1.,.,.3.4.4.l @ @ @ e 0XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXgX_ & - X.~.R.R.R.R.R.R.R.R.R.R.S.k.s.K 8.$X$X$X$X(.~ L R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.j.k.l.l.l.k.A.9.9 m K.q.l 7 ` $.+.$.+.G f.%X_._._.$X$X_.$X$X$X_.$X$X$X_.(.m.P * % 7 m 0.s.s.d.,.* q q.).$X$XK.~ 0.A.S.R.R.R.T.A.t.8.9 F K.$X$X$X(.P : a p p d | +.= w m @ o V GXJXJXJXJXJXGX=X @ * 3.s.a.s.i.p.3.b 9 X < 1.9.0.4.4.9.1.5.K j c 1 l <.W T T T U L U Z Z Z C C C n m n n n m b n c c n c n c n n c c c c g n n n C n C C C C Z K U L U Y P Y K Y Y Y Y Y Y Y Y Y Y T T T T Y n 0 9 * @ 2 L <.T m c c b c 4 . g T T T U T U c 9 . . X b m n c c b b c c b b c b b b j b c b c c j 4 * . X 1 C Y Y Y Y Y Y Y Y T T T T W T W W W <.W <.<.U n l b b 4 X . 5XAXZXnXfX9XtXzXnXnXAXAXDXDXDXDXDXAXZXAXCXnXnXnXxXlXkXiXiXiXiXtXtX9X7X3X3X:X=.=.=.=.=.=.;X,X6XfXAX5Xu @ j b c b c c c c c c c n b c b c m Y T T T W T W ,.,.,.,.5.3.3.3.9.n @ @ e qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJX;X> & d w.Q.R.R.R.R.R.R.R.R.R.S.k.s.K Q _.$X$X%XZ.M C R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.k.l.l.l.k.k.3.j 7 7 > i -.yXlXBXBXV.Q P.%X$X$X$X$X$X$X_.$X$X_._.K.0.w # * j ,.i.l.l.l.j.l.l.9.9 < Q (.%X`.K.q.Q d.S.R.T.D.m.P q 8.`.$X$X$X$X).P $ p p p p t & % Y n X + ' JXJXJXJXJXJXGX-X @ 1 9.s.a.s.z.a.u.,.c , # Y 0.4.4.5.<.3.1.<.n n 0 2 1.,.W ,.Y T Y Y U Z Z Z C C C C m n n m n n n n n n n c n c n n n n c n n m n m C C C Z L L L U U U Y Y T Y Y Y Y Y Y Y Y Y Y T Y T b 1 9 F n @ 2 U W <.<.T C c c c 4 . h T T Y T Y Y m h @ @ . @ j c c b c c b b c b b b c c j b c j c 0 # . X X , m K U Y Y Y Y Y Y Y Y T T T W W W ,.,.,.,.2.<.<.K b b c j @ i gXDXnXlXtXtXjXxXBXAXAXDXAXDXGXDXAXAXZXZXBXBXnXxXxXlXjXjXjXiXtXtXtX8X8X3X:.3X=.=.=. .=.=.:X3XtXzXZX=.& 1 c c c c c c c c c c c c c c m U T T T T T T W W <.2.1.1.<.3.3.4.K , @ @ H hXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXKX;X> > i w.v.R.R.R.R.R.R.R.R.W.S.k.k.L F K.$X$X%XP.l C R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.W.S.k.l.l.k.k.k.l.t.h ; a y -.yXbXBXBX*Xr.Q $X$X$X$X$X$X$X`._.).m.F , * 5 U s.j.s.l.l.l.j.l.l.l.l.a.l * F m.K.Z.P.m.~ m.S.A.8.z l P.$X_._._._.$XZ.4 # t [ u > + % U r.z o - +.JXJXJXJXJXJXJXeX X 0 y.s.s.s.d.a.i.y.C 0 @ T <.4.0.4.3.0.2.1.C h 9 # T ,.W T T Y Y Y L Z Z L Z C C C C C n n n n n n n n n n n c n n n n n n n m n C C m L L L L L U Y U Y Y Y Y Y T Y Y Y Y Y Y T Y T T M C W L # , L ,.,.<.<.1.T M c c 2 @ j W T T T Y T C c # , 4 . 2 c c b c b b c c c c b c b j b c q , @ @ . @ g L Y Y U Y Y U Y Y Y Y Y Y T T W W W W ,.,.<.<.W <.W m b c b 4 . @ rXSXZXmXiXtXdXlXnXZXAXDXDXGXDXGXDXFXAXZXCXCXnXnXxXlXjXjXjXiXtXtXtX8X8X8X3X:.;.=.=.=.@.=.:.:X0XgXZXmX_ . 5 c c c c c c c b c c c c b U T T T T T T T <.W W 1.5.1.<.1.3.4.C # @ @ J bXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXDX-.e 8 ; 8 6.T.R.R.R.R.R.R.R.W.S.k.l.T M K.`.K.Z.m.z C x.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.l.l.l.k.k.k.a.G t a t .8XyXxXFXPXM.Q ).$X$X$X_._.Z.8.n 2 @ , M 1.s.l.l.k.a.k.k.j.j.l.l.l.l.l.k.<.q 2 q.).%X_.q.M 0.8.< P K.$X_._.$X_.`.f.D 0 1 1 # 8 & 7 1.t.T @ X 8 X; # j c c c c c c c c c c m L U T U T Y T T T W <.,.<.5.5.5.5.3.9.Z , i hXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJX0Xy > 8 ; e 4.W.R.R.R.R.R.T.R.S.l.A.,.5 ~ m.m.m.q.l C S.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.l.l.k.k.A.9.d d t y .8XyXyXMXSX4XP Z.`.Z.q.F 4 * @ * l e.j.l.l.l.l.l.l.j.s.s.s.l.l.l.k.k.l.l.l.s.T 9 8.Z.m.f.l 2 9 Q `.$X_.$X$X$X).0.4 4.k.<.k 5 c F r.t.,.# . o t 0XJXJXJXJXJXJXJXqX. X w 4.d.z.s.a.a.a.p.3.* , ,.5.g.0.4.4.4.3.1.Q K j , X @ 4 m T ,.T Y Y Y L L K Z L Z C C C C m n C C n m m m m n n C C C m C C C C Z Z L L L L L U U Y Y U Y Y Y Y U U Y Y Y T Y W T Y T W W h @ 0 ,.1.1.W <.<.<.<.T c c 1 * W T T Y T T Y L b 0 @ h j . , n c c b c b c n b b b 0 @ @ . . @ j L T Y Y T Y Y Y Y Y Y U Y Y Y Y T T T T W W W W <.,.2.,.<.2.T b j b , X - qXDXnXxXiXtXiXnXNXAXAXGXGXGXDXDXDXDXAXZXZXCXnXnXnXlXlXjXjXjXtXtXtX9X8X3X3X;.;. .=. .%.$.;.,X8XkXAXPX` @ g c c c c n b c c c b L Y T T T T T T T W W W <.<.<.3.5.3.3.9.,.2 @ u qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXAXB.> = > ; z s.R.R.R.R.R.R.R.S.k.s.P * % = e P 2.T 5.E.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.W.T.A.l.k.k.l.9.G f t t } :X7XyXfXfX1Xm 0.F 2 @ @ * 0 U t.j.l.l.l.l.l.l.l.l.l.k.l.l.k.k.l.k.l.l.l.l.l.k.8.< 7 = O + q Q m._._.$X_.`.A.Z M r.s.s.i.a.a.j.t.9.e.0 X & ` HXJXJXJXJXJXJXJXgX X 2 e.s.d.s.z.a.i.p.t.2.m 0.9.e.9.9.4.3.4.5.1.1.<.T K 9 @ X 2 c R T Y Y Y Y U L L L L C C C C C m C C C C C C C C n C m C C C C C Z Z L L U U U U U Y Y Y Y Y Y Y Y T T Y Y T T T T W W W T 1 * L 1.1.1.1.<.<.<.<.,.b j , j Y T T T Y T T L b j # j j 4 X 1 j b b c j c c c q , . . . @ # 4 m Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T Y T W W W W W <.<.<.<.<.<.L b c 0 . X ;.CXAXmXdXtXfXzXcXAXAXGXGXGXDXGXGXDXDXAXZXZXNXnXnXmXlXjXjXjXiXtXtX9X3X3X:.;.=.;.O.@.=.@.=.:X3XIXnXJX-X= # g n b c c c c c n K T Y Y T Y T T T T W W <.W <.3.3.3.3.4.e.,.4 . @ = 4XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXLX#.> - ; + T T.R.R.R.R.R.R.A.A.0.7 O : u +.B.N.3.t.x.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.T.R.R.R.T.R.T.c.l.l.l.t.G ` t y d d -.2X9X7X..@ % # , 2 l <.a.l.l.l.l.l.l.l.l.l.k.l.l.l.l.l.l.k.l.l.l.k.k.l.k.A.d.z + + p { -.N.r.K.$X_.(.9.j T k.k.k.a.t.l.k.j.s.t.g . . @ s MXJXJXJXJXJXJXJXJXcX; X , 1.d.j.a.a.p.d.p.p.i.4.t.t.e.e.9.0.0.5.1.1.1.1.<.,.<.K h * . 1 b L Y Y Y K U L L L K C L K C Z C C m C C C C C C C C C C C Z Z L L L L U U U Y Y Y Y Y Y Y Y Y Y Y Y Y T T Y T W W ,.,.l @ j <.4.1.1.1.1.<.<.<.<.m j # K T W T T T T Y L b b * n l g . @ M c c c c c j 2 . . . . @ 4 m Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T W ,.,.,.2.<.<.<.<.W n c b # . _ lXAXnXlXtXtXlXmXCXAXDXGXHXHXHXGXHXDXAXAXZXBXnXnXmXmXjXjXlXiXiXtX9X9X8X3X:.;.=.=. . .O.=.-X,X0XxXGXCX` . g c n b c c c c m Y Y Y T T T T T T T W <.W <.<.1.5.3.5.3.4.3.g . . @ X; 2 c c c c c c m L Y Y Y T Y T T T W T T W <.<.1.3.3.3.4.4.4.4.c . @ = 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXvX+.> ; : o j z.W.R.R.R.T.A.s.m O + d 2XyXyXkXpX3.9.A.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.k.l.l.t.m 7 e > t p d ` e g T s.k.S.A.A.S.E.A.E.E.E.E.T.R.R.R.R.S.x.l.l.l.k.l.k.l.k.l.l.k.l.s.,. = d :XyXyXbX#XT L g ,.j.s.l.l.j.i.s.k.j.i.p.T @ . X 8 $.JXJXJXJXJXJXJXJXJXJXSXH . * U i.k.s.s.s.a.a.i.i.i.p.t.t.e.e.9.3.4.3.3.3.1.<.<.<.W W Y L n 1 . # g m K U U U U L L L L L Z L Z L Z C K Z Z Z Z Z L L K L L U L U U U U Y Y Y Y Y Y Y Y Y T T U T T T Q W W W W <.Y X h 3.3.3.4.3.3.3.2.<.<.,.n g g W <.T T T Y T Y T b b , K m c 4 . . 0 2 . . . . . @ * 0 K Y Y Y Y T Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T T T T T W W ,.,.2.<.<.<.<.,.T n c c , . .cXDXmXjXiXfXxXBXAXFXGXHXGXHXGXGXGXGXDXAXZXZXNXmXmXmXlXjXlXiXtXtX9X8X3X3X;.=.;. .@.O.=.=.-X6XgXcXJXhXu # g c j n b c C Y Y Y Y Y T T T T T T W <.,.<.<.3.3.3.4.9.4.e.n # . 8 wXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXcX&.+ ; ; X L S.R.R.W.E.A.9.2 : > p $.8XyXiX1XF Y l.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.k.k.l.,.* 0 w r r - = Y D.Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.T.D.k.k.l.k.j.l.k.j.l.l.l.l.<. : i :X9XuXhXM.M <.t.s.k.l.l.l.j.s.l.k.s.j.4.2 . . > ;XJXJXJXJXJXJXJXJXJXJXJXAX` . * c s.j.d.a.a.s.s.a.i.a.i.t.y.e.e.e.9.0.4.1.1.1.1.2.,.,.,.W T L C j X @ 2 C L U U U U U K L L Z L L L L L L Z Z K L K L L L U K U L U U U Y Y Y Y Y Y Y Y Y T T Y T T T T T ,.,.,.<.1.m # T 4.4.3.4.3.3.1.1.<.,.,.m 0 n T T W T T T Y Y Y n l 1 Y m j g # . . X . X . * h C Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T <.,.,.,.<.W <.<.<.<.L c c 2 . i zXLXnXkXiXhXzXNXZXAXGXHXHXHXHXHXGXGXDXAXZXZXZXBXnXxXxXkXjXdXtXtXtX8X3X3X;.=.=.=. . .=.=.;.3XtXmXDXGX] . 0 c c c c m U Y Y Y Y Y Y Y T T W W W <.<.1.1.1.3.4.9.4.4.e.n @ . 8 0XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJX6Xu = : + < 1.W.R.R.S.s.m + > a } ;.3X8X+.9 <.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.S.l.l.k.j.,.Q (.Q z < % ~ D.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.l.l.l.l.l.l.l.l.l.l.e.. O t } ;X7X8X' K j.l.l.l.k.l.s.i.l.l.k.s.4.4 @ @ 6 o.SXJXJXJXJXJXJXJXJXJXJXJXGX>X @ 0 i.i.s.j.i.a.s.d.s.a.p.i.t.t.y.r.9.9.4.4.3.1.1.<.<.,.,.<.W W Y C j # @ , n U T L U U U U Y L U L L L K L L L L L U L U U U U U U Y U Y Y Y Y Y Y Y Y Y T Y T T T W W W ,.,.1.1.1.C # 0 3.3.4.0.3.3.<.1.<.<.<.,.m 4 Y W W W T Y T Y Y T b g 9 T K j b % . X @ 1 j K Y Y Y U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y W T W W W ,.<.<.<.<.<.<.<.<.n c g @ & 0XAXSXzXfXiXkXnXAXGXGXHXHXHXHXHXHXGXGXAXAXAXBXZXNXnXxXkXjXjXiXtXtX9X7X3X:X;.=.=.=. .=.=.=.:.tXlXAXKX[ 1 j c c j C Y Y Y Y Y T T T T T W T T W ,.,.5.3.3.4.4.9.4.e.U , X - 5XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJX5X8 & % o 0 i.R.R.S.1.q * O : t y ] %.u 7 0.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.s.a.i.T q.$X%XZ.z q s.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.k.l.l.k.l.k.k.l.l.e.2 . - p d [ _ * 2.s.l.l.l.A.x.j.x.S.E.c.l.c . * * i hXJXJXJXJXJXJXJXJXJXJXJXJXJXgX= @ 4 1.l.z.d.p.p.s.p.i.a.p.i.t.y.t.t.r.9.9.3.3.3.<.<.,.<.,.W W W W Q L c @ @ , m Z Y U U T U L K T L U U U L U U U U U L U U Y U Y Y Y Y U Y Y Y Y Y Y Y Y Y Y T T W W W ,.W ,.K b , # # Z 3.4.4.0.3.3.3.1.<.<.W ,.l n T W W T T Y T Y Y Y m g 0 Y Y j j , . . . 2 K Y T Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T W W W ,.,.,.,.<.<.<.,.<.S S c < @ ,XSXSXvXkXjXkXxXCXAXGXHXHXHXHXHXHXHXGXDXAXDXZXnXnXnXnXlXjXjXiXtXtX9X7X3X:X:.=.=. . . .O.=.:.8XhXnXKX@.$ 2 j j c c L U Y Y Y Y Y Y T Y T T W 2.,.,.<.1.5.5.4.9.9.e.t.W 4 8 eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXLX$.= = + X m A.R.l.b K r.9 O ; > > : O q m.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.l.k.k.e.<.m.$X).m.7 F R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.l.j.l.l.l.k.l.l.j.,.# O O ; 8 ; . n s.x.A.T.R.R.S.S.R.R.E.A.T . @ * u 0XJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX_ # n l.s.a.s.a.s.s.a.i.i.i.i.i.t.t.t.9.9.9.3.3.<.<.<.<.,.<.W W W T R C j 2 X 1 C U Y Y U Y Y U L Y Y U L Y Y L Y L Y U U Y U Y Y U Y L Y Y Y Y Y Y T Y Y T T T T W ,.,.W n 2 @ , j T 5.5.4.4.5.3.3.3.1.1.2.<.,.<.0 T W W T T Y T T Y Y Y b g j Y T j c 9 . X b Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T Y T T T T W W W W ,.,.<.2.<.<.<.W T C c 5 @ H vXAXCXjXfXjXmXBXAXGXGXHXHXHXHXHXHXGXHXDXDXZXAXBXNXnXlXkXjXjXuX9X8X9X7XXa @ 5 j j Z Y Y Y U T Y Y Y T T T T W <.,.<.<.3.3.9.9.9.e.e.e.9.g - 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXKX5Xi > & . 4 e.Y F K.$X).m.9 O X * F P.m.l 8.W.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.T.R.R.R.R.R.A.k.l.s.W ~ K.$X).f.5 e.W.W.R.R.T.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.k.l.l.l.l.4.* P `.K.Z.0.0 a.l.x.T.R.R.R.T.R.R.R.S.t.# $ * 8 ..AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX%.@ @ < 3.s.a.a.s.s.d.s.i.a.a.i.t.t.t.e.e.e.4.3.3.1.<.2.,.<.T ,.W W T R C j j , * C Y U U Y Y Y Y Y Y U Y Y Y Y Y Y U U Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y T W <.T <.L , # j W 4.4.4.3.9.4.4.3.3.3.4.1.1.<.2.,.,.,.C U T W T T T Y T Y Y Y C j j K Y T j j b X % q Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T W W W W W <.<.<.<.<.2.,.<.<.K b @ ,XSXCXcXkXfXxXBXAXGXHXHXHXHXHXHXHXHXGXGXDXAXZXCXBXnXmXlXjXjXiXtX9X8X7X3X:.;.=.=. . .=.=.;.:X0XkXGX,Xt @ g j j Z T Y T Y Y Y T T Y T T T T W W <.<.3.3.4.9.9.9.e.e.e.j . . ,XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXCX+.+ % . , h f.%X$X$X$Xq.* 7 q.$X).$Xq.M k.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.k.l.l.,.Y `.).).q.0 a.W.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.k.l.s.K 2 m.$X_.).8.b A.x.T.R.R.T.S.T.R.R.T.a.1 @ , 3 o.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXZX8 @ * 4 i.a.s.p.a.a.s.p.p.a.i.a.t.t.t.r.e.9.4.1.1.1.<.2.T <.,.W W W Y K c c 0 . 2 L Y T T U U K Y Y Y Y T P Y Y L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T W W W h * j ,.3.3.<.3.3.4.1.3.3.3.3.3.1.1.2.<.<.3.,.T M T W W W T T Y Y Y U L n n n Y Y K j b j X X * 9 U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T W T T W W ,.,.<.<.<.<.<.<.<.<.L b 5 . X.vXAXxXjXiXlXZXAXDXGXJXHXJXHXJXHXHXHXGXAXAXAXCXBXBXnXxXlXjXiXiXtXtX7X3X:.;.=.=. . .=.=.;.3X5XdXDXtXi . 5 g n U Y Y Y Y Y Y Y Y Y T T W ,.W ,.<.1.3.1.4.4.9.e.e.e.r.n @ . ,XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXyXi @ X @ P K.%X$X$X_.8.* 7 Q ).$X$XK.Q T R.R.R.R.R.R.R.R.R.R.R.R.Q.R.R.R.R.R.R.R.R.T.A.l.l.k.2.Q %X$X`.8.q k.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.E.l.l.t.9 F $X$X`.Z.M 4.l.S.R.R.T.A.T.R.R.T.s.4 % = e .SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXh.@ * * j s.p.a.s.s.z.p.i.i.s.i.t.i.t.t.9.9.9.0.3.1.<.<.,.,.W W W W Y U n c j , . 0 T U Y T U T Y Y Y U Y U U U Y Y T Y Y Y Y Y Y Y T Y Y Y Y Y T T T W <.T 0 * U 1.1.1.3.3.9.3.3.3.3.3.1.1.<.1.<.<.<.W ,.,.C T W W W T T T T Y Y U K c K Y Y Y m h c 0 X . % m Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T W W 2.,.W <.<.2.<.<.<.<.2.T n j # H xXDXNXkXjXzXNXSXDXHXKXHXHXHXHXHXHXHXHXHXDXAXZXCXnXnXxXkXkXiXiXtX9X8X3X:.;.=.=. .] =.=.;.3X6XIXZXtXy . 0 c m L Y Y Y Y Y Y T Y T T T T W <.,.<.<.3.4.9.9.9.9.e.e.t.Z @ . >XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJX1X= * X 7 m.`._.$XK.K U ,.2 q.%X).(.m.F a.W.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.A.k.l.s.2.8.%X$X).Q l A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.T.R.R.R.R.R.R.R.R.R.R.T.x.l.4.1 Q $X_.`.m.0 s.S.R.R.R.T.S.R.R.S.s.h % 8 p ] ZXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCX..@ @ @ , n t.t.d.s.i.a.a.i.d.t.i.t.t.e.e.9.4.3.3.<.<.,.,.T W W W T U n j b 5 @ C Y U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T W K , # U <.3.3.4.3.4.4.3.3.3.3.0.1.1.<.<.<.<.,.,.,.,.U T W T T T Y U T Y Y U m C T U T Z m j b * . X j U Y Y Y Y T Y Y Y T Y Y Y T Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y T T T T T W W W <.W <.<.,.<.W 2.<.<.,.L b 4 @ hXLXnXzXjXzXBXZXGXHXHXJXJXHXJXHXHXHXDXDXDXAXZXZXCXnXxXxXkXjXiXtX9X9X3X:.=.;.=. .=. .=.;.:X7XqXnXxXi 5 v b L Y Y Y Y Y Y Y T Y Y T T T W W <.<.1.3.9.9.9.9.e.e.t.Y , ;XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXCXO.* % % q m._.`.4.j t.k.j F K.$X`.).q.n l.W.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.A.k.x.s.Q q.%X$XZ.P K Q.Q.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.T.x.s.T < m._._.`.0.C S.R.R.R.R.R.R.R.R.k.n o 8 u H XSXCXzXjXkXmXAXDXHXHXHXHXJXHXJXJXHXHXHXDXAXZXZXCXnXxXxXjXlXiXtXtX8X3X3X;.;. . . . .%.=.:.8X0XcXgXi 0 j n L Y T Y Y Y Y Y T T T T W W <.,.<.3.4.3.9.9.9.9.9.r.t.T * #.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXH % % % ,._.G.C m A.A.W < 8.%X_.`.K.Q W R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.W.T.x.l.l.i.W m.%X$Xm.j Y Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.i.m z K.)._.K.Q e.R.R.R.R.E.E.R.R.S.Q % > t H 1XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgX= @ @ @ 2 P s.s.s.i.i.i.p.i.i.t.t.e.e.9.4.4.3.<.1.,.,.,.,.T T R m j c j * . @ @ 4 l U Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T Y T W 9 @ 9 1.4.3.4.3.3.3.3.3.3.1.1.1.<.,.<.,.<.<.,.,.W T W W T T T T T T Y Y Y Y Y Y Y T L m m m 0 @ @ 1 K T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y W T T W W W <.W 1.<.1.<.<.<.<.<.1.T C j @ [ xXAXzXlXkXxXAXGXHXHXJXJXHXJXHXHXHXHXGXGXDXZXZXZXNXnXxXlXlXiXiXtX9X3X:.;.;.=. . .=.;.=.:.3XwXnX0Xu 9 n n L Y Y Y Y Y Y T Y T T T T W W W <.<.3.3.3.4.9.t.e.e.r.,.1 +.SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXeXr * X 7 0.s.W t.R.T.k.K q m.%X`._.Z.L t.W.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.S.k.l.l.t.,.Z.%X%XZ.q 8.W.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.x.9.g W %X_.$XZ.b S.R.R.T.A.T.R.R.E.<.% 8 p u +.SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX$.% @ @ # 0 9.p.s.i.i.i.i.i.t.t.t.e.9.9.3.3.5.,.,.,.,.,.T T Y C j c j , . . . X @ 1 g n L T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T m X @ K 3.3.3.3.3.3.3.4.<.<.<.1.<.2.<.<.,.,.,.W W W T W T T T Y T T Y Y Y Y Y Y Y Y L n c C g # @ 2 K Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T W W T W <.W 1.,.<.<.,.2.,.1.,.U n @ 8 hXCXnXkXkXxXCXAXGXHXHXHXJXHXJXJXHXGXGXGXDXZXZXAXNXxXmXlXjXiXtXtX8X3X3X:.;.;. . .=.=.=.:.9XdXnX-X; . 9 j b L T Y Y Y Y Y T Y Y T T ,.T W ,.2.<.1.4.9.9.9.9.e.e.t.1.2 ' vXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX;X* % @ 0 W a.S.R.R.A.4.q P (.$X$XK.Q Z E.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.l.l.l.9.Z K.$X$Xm.q 0.W.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.l.4.0 m.$X_.).m.l T.R.R.T.S.R.R.R.9.7 8 p u #.LXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX>X- * . @ # g i.i.t.i.t.t.e.t.t.t.9.9.4.1.3.1.,.,.,.T T Y Z Z c c c 1 1 0 @ * . @ @ * * * * 9 g l c n n F Y Y Y Y Y Y Y Y Y Y Y T T T < X 0 <.3.4.3.3.3.3.3.<.1.1.<.<.<.,.<.<.W <.,.,.T W T T T T T T Y T Y Y Y Y Y Y T L m c m 0 # . 4 L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T T Y Y W W W <.<.W <.<.1.<.<.<.1.,.,.,.T n @ . rXcXvXbXkXxXBXGXHXHXJXJXHXJXHXHXHXHXHXGXDXAXZXnXnXnXmXlXjXlXiXtX8X3X3X:.;.=.=. . .@.=.:X8XfXnXo.$ @ 5 n b L T Y Y Y Y Y Y T Y T T T T W ,.<.<.1.3.9.9.9.e.9.e.e.1.w H bXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXDX$.* 1 # 0 e.W.R.R.S.l.T q f.%X$X$Xm.b 5.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.S.j.l.l.5.F (._.$Xq.9 d.W.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.E.l.,.q (.$X_.(.W Y W.R.R.E.R.R.R.i.2 8 u d -.KXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXqXi X . @ @ h 9.t.i.i.i.i.t.t.t.t.9.4.3.3.1.,.,.T T R Y P C b c c 4 9 c c j g 2 1 2 2 1 2 1 2 4 0 l c m Y Y Y Y Y Y Y T Y Y T Y T m @ @ L <.3.3.9.3.3.3.1.1.<.1.,.<.<.,.W <.<.T W W W W T T Y T Y T Y Y Y Y Y Y T T Z c c j 5 . @ 4 L Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T W W W W W <.<.W <.<.<.2.<.,.,.,.T C , %.bXmXjXkXxXBXGXGXHXHXJXHXJXJXHXHXHXHXDXDXDXAXZXBXmXmXlXjXiXiX9X9X3X:.=.=.=. . .O.$.;. +.:X:.4Xw.Z s.W.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.R.R.R.R.R.R.D.<.M m.Q 8.f.l 8.l.D.R.R.R.d.w 8 u p %.JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXqXX . . j s.t.i.i.t.t.e.e.4.4.1.W T T U C C n c c c c 4 . h l j b b b c b c b c n m U Y Y Y Y Y Y Y Y Y T Y Y Y Y Y T T 2 . j <.3.3.3.4.3.3.1.1.<.<.<.<.<.W W W W W T Y T Y T T Y Y Y Y Y Y C c c c c j # . X 4 j m Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T W W W ,.,.<.2.<.<.<.<.<.,.W <.,.Y m @ . 3XcXkXjXxXCXAXHXHXJXHXJXJXHXHXJXHXHXGXGXDXAXZXAXnXnXlXlXiXiXtX9X7X3X:.=.=.=. .=.=.=.3XuXfX` X 0 c c c c C U Y Y Y T T T Y Y T T ,.,.,.<.1.1.4.9.4.9.e.e.r.r.r.n . - eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXbX} * * * K s.W.R.S.l.T j m * . i %.:.h.0.<.<.T Q 8.1.<.m m m j q 9 q 9 X O O H 8XiXmXbXV.T 5.W.T.R.R.R.R.T.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.D.s.F X & J B.w.q j s.D.R.R.R.l.m & 8 p ..DXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXhX@ . . * r.a.i.i.t.t.t.e.4.3.3.,.,.T Z Z C M b c c j 9 . n n c b c b c j m m U Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y T T T T , . C 4.3.3.4.3.3.3.<.<.<.2.W ,.,.W W W W W Y W T T Y Y Y Y T L m b c c c c 5 # . # 0 c c m Y Y Y T U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y U Y Y Y Y Y T Y T Y Y W T T ,.,.,.<.2.<.2.2.<.<.6.<.<.,.T C * 5XxXkXkXxXZXAXHXKXHXHXKXKXGXGXGXKXKXHXDXDXAXZXNXnXnXlXlXjXjXtXtX3X3X3X;.=.=.=. .=.=.3XfX5Xt . @ 0 c c c c m U Y Y T U Y Y T T T T W 2.,.,.<.3.0.4.9.9.9.e.9.e.y.m - eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXeXu = X 9 3.k.R.R.A.s.,.< o 8 ] :XyX4Xw.0.K 9 7 z F ~ ~ Q 8.f.m.Z.K.Z.Q + + } 8XiXiXDXV.U <.W.R.R.R.R.R.R.Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.D.r.7 O ` :X9XiXbXM.C k.R.R.R.S.F & 8 8 &.VXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXyXX . # 4.i.i.t.t.t.e.9.9.4.5.T T T Z C C C C n n c g X b Y Z C C m C C U Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T * X g 1.3.3.3.4.3.3.1.1.<.<.<.,.,.<.W W W T T Y Y Y Y Y Y C n b b b c c j 4 . @ 5 j j b c K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T T Y T T T W W ,.W <.1.W <.<.<.<.W <.,.<.T m , =.gXkXkXxXBXAXGXDXAXDXHXHXJXJXHXAXGXGXDXDXDXZXZXnXmXmXlXjXiXtX9X3X3X;.=.=.;. .=.=.:.8XuX$.- @ g c c c c S U Y Y U T T T T T T T W W ,.2.<.3.3.4.9.9.e.e.e.e.t.L $ p IXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX>X> > + 7 m t.A.s.l.t.g O a f :XyXwXaXV.8.m.K.(.%X_.`._.).).`.).`.K.Q % + f 3XyXiXxX>Xv C A.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.r.n 7 * O p .3XiXBXVX4X4.k.R.R.S.1.& 8 t { SXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdXo @ @ ,.a.i.t.t.t.t.r.9.4.1.W W T U P Z R A C n c c # 4 T Y T T Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T Y T T * X 0 1.3.0.3.3.3.3.1.1.<.<.W <.W W W W W T Y T T Y Y Y m c b l c c c 0 # @ @ 0 j b c b n L Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T Y Y Y Y Y Y Y Y Y Y T W W W W ,.,.,.W <.2.<.<.<.<.<.,.,.R C 1 . @.kXlXjXmXCXAXGXHXHXJXJXJXJXHXHXHXGXHXHXDXAXZXCXnXnXnXlXjXtXtXtX7X3X:.=.=.=.=.=.=.:.tX7Xi o @ 9 c c c c b L T U T U Y T Y T T Y W ,.,.2.3.3.3.0.9.e.e.e.e.e.y.U # t aXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX| - = & - w ,.l.k.a.m O t d :.yXuXjX4X8.q.K.K.`.`.(.(.).`.$X).).P.8.% X > { ;.7XqXw.1 < h 9.Q.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.R.T.R.R.R.T.t.g * 9 z = + p ] 3XyXiXAXsXe.E.E.T.9.= > u d 3XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX>X . . * e.i.i.t.t.t.t.e.e.9.5.4.,.,.T U U Y Y L C n c , * L Y T Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T W 9 0 3.3.4.3.9.3.3.<.<.<.<.<.<.W <.T W Y Y T Y Y Y Y K m c c c j j 2 @ @ , h j b b b c n K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Q T T T W W ,.,.,.,.<.<.<.<.<.<.<.,.<.T C 1 } IXlXvXxXNXAXGXGXGXJXJXHXJXJXJXHXLXHXGXDXAXZXCXCXnXlXlXjXiXtX9X7X3X3X=.=.=.=.=.=.3X7X:Xp o O . @ g b c c M L T U U T Y U T T T T W <.,.<.1.3.4.0.9.9.e.e.e.e.y.Y # t qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXeXd - > > - = 0 Y t.K ; t .:X7X9XB.G 8.K.).$X_.`._._.`.`.$X%X%XZ.q + . ; y ' I 2 P K.8.q b s.W.T.R.T.T.R.R.R.R.R.R.R.R.R.R.R.W.x.2.g 7 l q.K.Z.7 : d } :.yXiXbXV.4.l.Y 9 - > p _ 3XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX_ % . , e.i.i.i.t.i.t.t.e.9.4.5.<.,.<.T R Y Y L C n c 4 @ K T T Y Y T Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y T Y T l X 4 <.3.3.3.3.3.4.1.<.<.W <.<.W ,.W T T T Y Y Y Y U m c c c q 4 , X 1 j c c c c b c n K Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T U Y Y Y Y Y Y Y Y Y Y Y Y Y Y T U Y Y Y Y Y Y Y Y Y Y T T W W W W ,.,.2.<.W <.<.W <.,.<.<.<.W T 9 +.fXkXkXxXBXGXGXJXJXKXJXJXJXHXKXKXGXGXDXDXAXAXCXnXnXmXlXjXtXtX8X7X3X u ' pXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSX- o . . 5 s.i.i.i.t.t.t.e.e.9.4.5.2.1.W W T Y T Z Z C j g @ b T T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T W K X @ T 3.3.4.3.0.<.1.<.<.,.2.W W W W T T T T W Y Y U M c c c h 0 2 . 5 j c c b c c c c n L Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T T T T T W ,.,.,.<.<.<.<.<.<.2.2.,.W <.<.w +.hXvXjXbXNXGXGXJXKXJXJXJXHXJXHXHXHXHXHXDXDXZXAXnXxXmXlXjXiXtX9X8X3X:.=.=.=.=.=.=.tX9Xd o + j b g * @ g v j m L Y Y T Y Y T T T W W W <.<.<.3.3.9.9.9.e.e.e.e.y.T , o 7XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXeX' p u u 8 7 * % X O O ; i ` ` 8 * Y P.K.m.m.m.0.Q Q l w , # < 9 9 X q m.$X$X$X`.(.K.m.F P f.D.W.T.R.R.R.R.Q.D.9.K 2 n 8.K._.$X$X$X$X(.G : a p d +.{ t = 8 8 8 8 8 u eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX% . . @ j s.s.i.i.i.i.t.t.e.9.4.3.1.,.W T <.T <.L C b c j @ j U Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y T Y T W T * X q 3.3.4.4.3.3.<.2.2.<.<.,.,.T W T T Y Y Y Y Y K c c c c c 0 * 2 j b b b b c b b c n L Y T Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y U Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T Y T T T W W ,.<.<.<.2.<.<.<.W 2.Y U n j r = . .fXkXjXzXBXDXKXKXJXKXHXJXJXKXJXGXGXGXGXDXDXAXAXBXnXxXlXjXtXtXtX3X3X3X;.=.=.=.;.:XwXUXa & $ c L L n , , l m b P T Y Y Y Y Y Y W T T W <.2.1.3.3.9.9.9.e.e.e.4.t.2.2 o ,XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXLXaX..p r p 8 > % X O O O + X X . @ @ @ # * * < 9 q l K W e.r.0.e.3.j # # P Z.$X$X`.$X$X(.(._.Z.Q F 1.k.S.T.D.s.Y 2 9 2.K.`.$X_.$X$X_.$X_.P.) O O + + X X X 8 8 t 8 } 4XZXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX4X X @ @ C s.i.i.i.i.i.t.t.9.9.4.3.1.<.,.,.W T T Y m m b j # 4 C T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T W W 4 X * <.3.3.4.3.3.<.<.<.<.,.,.,.<.W T T T T Y Y Y A c c c c 4 . 4 j c b c c c c b j c n U Y Y Y Y Y Y Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T W W W W <.Q W T F N r r 8 8 u d _ 8 O %.gXlXxXNXCXDXLXJXJXJXJXJXJXKXJXKXGXGXDXDXDXZXCXnXnXlXkXkXfXtXtX8X3X;.;.=.=.=.=. - % . % @ X # 4 q l m L ,.e.t.t.t.t.a.a.s.t.e.t.k.s.4.c < M q.).$X_.`.`.).K.).`.m.g * 9 l K q q Q K.).`.$X_.$X_.$X%XK.q.7 & : X O O O & p u +.5XvXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX[ . X . * <.s.i.i.i.i.i.t.t.9.9.4.3.5.,.<.,.W <.T Y C m n n 5 2 K T T Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T T Y T T W K @ @ <.0.4.4.3.3.1.1.<.2.,.,.W W W T T Y T T Y ~ Z b b b g @ X 0 c c b j c b b c b c n U Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y U T m U Y T Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y T W T W ,.,.T M 7 w p ' +.$.:X7XyX7X;Xu O %.fXlXvXbXNXGXHXHXJXHXJXKXJXJXHXDXKXGXGXDXAXZXCXnXnXnXjXfXtXtXtX8X3X:.;.=.=.=.;X5X5Xi . j R Y U U T M * g m Z U T R Y Y Y T T T W ,.W <.3.3.4.4.4.e.e.9.e.e.e.0.9 =XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXMXeXeX6X+.t > = % * * * h 9.x.A.x.j.s.S.A.A.x.l.l.l.s.s.s.k.k.l.s.0.F w z m.%X$X$X_._.K.K.8.X . * h Q m.K.).`.$X$X$X$X$X).q.q = - - - 3 > > 8 8 } B.yXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXdX> % * @ 1 e.i.i.i.i.t.t.t.e.t.4.3.3.3.3.<.W <.W W Y Z n b c 0 # C T T Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T T T ,.,.2 X P 3.4.0.3.3.1.<.<.,.<.,.,.W W W T T Y Y Y T C c c m 4 @ @ g j n b b b b c b c c n K Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y Y Y Y T L m U Y Y U T Y T Y T U T Y Y Y Y Y Y T T T T <.W ,.,.h u %.1X9XuXyXyX3X:.' 8 7 % & 1XkXkXcXB.dXDXHXHXCXZXKXGXHXJXHXGXKXGXGXDXAXZXBXnXnXxXlXkXtXtX7X3X3X3X:.=.=.=.:X6X@.a , C T Y U Y Y T C 1 j C P Y T Y T T T T T T W <.1.<.1.3.4.4.e.e.e.r.e.9.3.0 ;XHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXgXB.u = = @ @ * 2 M i.R.R.R.R.R.R.R.R.R.R.S.x.l.x.l.k.i.t.j.t.Y g F m.)._.$X`.2. O : t d m Q 9.P.%X$X$X%X%XK.Q 9 = ; 8 > 8 8 8 t t [ qXAXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXB.% % * * h a.i.s.s.i.t.a.t.t.e.e.4.3.<.1.<.,.<.T T T K n n c c @ m T Y T T Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y T T W ,.j X g 3.4.3.3.3.<.1.1.<.<.,.T W W W T Y T Y Y L m c c j , 4 . 1 c c c c b c c c c c n K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T m L Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y T T W T T ,.F e 7XuXiX8X .f e * w F F P < 8 8XjXkXNX,XeXAXKX6Xi - H H J ' %.cXKXKXGXDXDXZXAXnXnXxXlXiXtXtX8X7X3X:X;.=.=.-X 8 p p u u u ` 1XZXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX' % = @ * C i.i.i.i.i.i.i.t.e.e.9.4.3.4.1.<.,.<.W T T Y n n c c , j T Y T Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T T Y T W T W m X * ,.3.4.3.3.4.2.,.<.W ,.,.W W W T T T Y R L m b c q 1 c , @ g c c b c b b c c b c C Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y U c U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T T W <.q ..9XiXyXd p z F K U U L U * } fXfXfXcXtXO...H = p %.;X1X-.$.J yXHXGXDXDXAXZXCXnXnXlXjXkXiXtX6X3X3X:X:.=.=.:X3X=.a O @ M T Y Y U Y Y Y T T l 9 b U Q T T T T T T W ,.<.<.<.1.4.9.9.9.e.9.e.e.r.e.0 ..VXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXbX=X' x 1 * * * , 5 b e.S.R.R.R.R.R.R.S.A.A.T.E.E.S.A.l.l.l.s.9.C 2 b K X : p f :XwXeXh.T Q 8.P % % % & 8 u p r r } 5XaXyXAXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXbX@ = % @ 4 e.s.s.i.a.i.i.t.t.r.e.e.4.3.<.<.<.<.W ,.W W Y n n c j 0 2 T T T T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y T T T T W Y X @ T 4.3.4.3.3.1.1.<.,.,.,.,.W T T T T Y Y L n b c 0 9 c j . 5 j b j j b b b b b c n U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T 0 b U Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y T T T T W W 2.q $.wXiXjXf F U Y Y Y U Y C * #.zXxXhXcXmX` i +.p ;.wXuXiXiXiX..B.AXKXDXAXAXZXCXnXxXxXkXkXtXtX8X3X3X:X;.=.=.:X3X_ : 4 K T Y Y Y Y Y Y Y Y Y m h m Y Y Y T T T T W ,.2.<.3.3.3.4.9.e.e.r.r.e.9.e.j o.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcX-.e * @ @ # * * j e.E.R.R.R.R.R.E.x.l.A.A.T.R.E.c.x.l.l.s.t.T q : a p s :.yXqXh.g q 7 = = 8 d r u u 7 d -.jXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXrX@ - @ * F i.i.s.i.s.t.i.t.t.t.e.9.9.3.5.<.<.2.<.W ,.T T C c c c 0 * T Y Y T T Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T Y T T W <.T * X C 4.4.4.3.3.<.<.<.,.,.,.W T T T T T Y Y P n c c 5 j b c # @ j b c b b c c c c j b U Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T m 2 L T U T Y Y Y Y T U Y Y Y Y Y Y Y Y T T T T T W W ,.M ` 9XiXiX%.> F Y T U Y T l % 4XxXxXvXxXZX} { ` = ;XuXiXiXiXfX%.-.PXHXDXDXAXZXCXnXmXzXjXiXtXtX8X3X 8 u u d 8 8 i ..5XxXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXMXp 3 3 @ % 3.i.i.i.i.i.i.a.t.t.r.9.9.0.3.4.1.<.<.,.,.T W T Z n c n 0 # U T T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T W <.W 2 X l 3.4.3.3.3.1.1.1.,.,.,.,.,.T T T T Y R P n c j h c c b 0 . 4 c c c c c c c b b n K Y Y Y Y Y Y Y Y T Y Y Y Y Y T Y Y Y Y Y Y h q P Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T Q T T ,.C 8 H :XiXuX_ 7 l F U Y ~ 7 8 yXxXxXxXBXkX+.eX7XJ %.$.} J 8XjX;.%.vXHXGXAXAXZXCXNXxXlXiXiXtXtX8X3X3X:X;.;.:X3Xo.= # j U Y U Y Y Y Y Y Y Y Y Y U L U Y T T T T W T W W <.3.3.0.0.0.e.9.e.9.e.r.r.l H kXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXGXhX%.w # @ # # , h 4.T.R.R.R.T.T.S.T.E.R.R.R.E.T.S.x.k.2., + t p > : O O X - u t r r ` ;XbXHXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHX4X- - @ @ D i.a.s.i.i.i.i.t.t.t.t.e.9.9.3.3.<.<.,.,.,.,.,.T Z n c c h , K T T T Y T Y Y Y Y T Y Y Y Y Y Y Y Y T Y Y Y T Y T Y T T W <.h @ q 4.4.3.3.5.3.1.1.<.,.,.W W W W T T Y R L m c g c c c b j @ * c n c c c c c c c n C U U Y Y Y Y T U Y Y Y Y Y Y Y Y Y Y Y Y T * j Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T Y T T T W W <.W Y x e ] :.3X+.u 8 q l M + d hXBXxXxXBXlX..zXHX@.i ..d d 7XyX;X%.MXHXDXAXAXCXCXNXxXkXmXiXtX9X8X3X:X:X:X;X>X d -.7XyXCXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXB.> - . @ j t.s.s.i.t.t.i.t.t.t.e.e.9.9.3.3.<.<.W ,.,.,.,.T Z n c c j , m T U T U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T W W n . * <.4.3.4.3.3.<.<.<.<.,.W W W W T T Y Y P m j j c b b b c 4 . 4 j c c j n c c n c m U T Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y Y Y K * C T Y Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y T T T W W W W W <.<.W R x r J &.-.$...H u + 8 { ;XeXaXPXlX..aXHXGXZXcXB.J 7XlX-.;XMXHXDXAXZXBXcXNXxXkXiXiXtX9X7X3XX| & # g C Y Y Y Y Y Y Y Y Y Y Y Y Y U U T Y T T T T ,.,.<.<.3.3.4.9.9.e.9.9.e.e.e.r.j i gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXaX@.e . @ @ # 4 ,.A.W.R.R.R.R.R.R.R.R.R.T.A.t.n @ X . O + = u 1XvXHXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXVXt 7 > . * U a.s.i.i.i.i.t.t.t.t.9.e.9.4.3.4.1.<.<.,.W T T T K j c c j 2 j T T Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y T T T W W <.Z X @ T 4.0.3.3.4.1.1.<.<.,.<.T W T T T T Y L b c c c c j c b b * @ g c j c j j n c c n K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y 9 1 L Y Y Y Y W n L Y Y Y Y Y Y Y Y Y Y Y Y T T T W T W <.W <.<.<.1.Q F z 9 p H | %. .-.{ H H H u p > H } H ' d d -.5X1X' 0XGXDXDXAXZXBXNXxXlXkXlXiXtXtX3X3X2X > p H $.wXbXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX4X= 8 & X 2 t.i.s.i.i.i.a.i.t.t.t.t.9.9.9.1.1.3.<.<.,.,.,.,.T C c c n c 5 9 T Y T T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T W W Y * @ Y 4.4.4.3.3.<.1.<.<.W <.T W W T T T Y P b c b c c b c c b j . * j c j n c c c c M Z Y Y Y Y Y U Y Y Y Y Y Y Y Y T Y Y Y L * 4 L T Y Y T m b U Y Y Y Y Y Y Y Y Y Y Y T Y T T W W W <.W W <.2.2.<.<.<.T T L G 3 > 8 t ' ..%.%.%.| -.' d H J d d J -.aXGXHXDXDXAXZXBXNXcXxXkXiXuX9X9X3X3X2X 3 X , K p.i.s.i.i.i.i.t.t.t.t.r.9.9.4.3.3.<.<.<.,.,.,.,.T Z n c b c j 2 T Y T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T T W ,.W 1 @ m 4.4.4.4.3.3.1.1.<.<.W <.W T T T T Y P b b b b l b c c b c 5 . 2 n c b b c c n c A Y T Y Y Y T Y U T Y Y Y Y Y Y Y Y T l @ h U Y Y Y U M Y Y Y Y Y Y Y Y Y T Y Y Y Y T T T T W W W W 2.<.2.<.<.<.<.<.2.<.F * %.-.' ;XrX$.%.-.X.' %.B.1X1X1XyXMXSXHXKXHXAXAXZXZXBXNXxXxXjXjXiX9X9X7X3X:X;.o.+.p . # 0 c n U T U T T Y Y Y Y Y Y Y Y Y Y Y T Y T T W W W ,.<.3.3.3.4.9.9.9.e.e.9.e.e.e.M . t qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXVXeX' , , 3 < 3 r r p 8 8 8 H B.qXBXDXAXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXeX& > = % # e.a.s.i.i.i.i.i.t.t.t.e.r.9.9.4.3.3.1.1.<.,.,.,.T T C c c c c j , K T Y T T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T W <.h . M 3.4.3.4.3.3.1.<.W ,.<.W W T W T Y Y L l b c c c b b c b c c # . 5 c b c c c c c C L Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y 9 . g Y Y Y C 0 L Y T Y Y Y Y Y Y T Y Y Y Y Y T T T T W W <.W <.1.,.<.W <.<.,.2.<.l X 1X2X{ yXZXSXGXAXZXLXGXKXKXLXKXKXGXGXHXKXLXLXAXZXZXBXcXmXlXfXiXiXtXX9XtX7X7X7X3X8X;.e , j c c c L T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T W T T W <.1.3.1.3.9.e.9.4.9.r.e.e.e.t.l i gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXV = % @ * m a.i.s.p.i.i.i.i.t.t.t.t.e.e.9.4.3.3.<.1.<.<.,.,.W W T M c n c c b 2 b T T Y Y Y Y Y Y T Y Y U T Y Y Y Y Y Y Y Y Y Y Y Y Y T T W ,.,.0 @ Z 3.4.3.3.3.3.<.1.<.W <.W W T T T Y T Y K n b b b c b b b c b b c 4 . @ 5 c n n m C K L Y T Y Y T Y Y Y Y Y Y Y Y Y 0 X 1 4 < K T T Y Y T Y Y Y Y Y Y Y Y Y Y Y T Y T T T T W <.,.,.<.<.,.<.<.<.<.<.<.l @ i jXZX7X_ aXKXJXKXJXJXJXKXJXJXJXKXJXJXAXcXzX4X..{ B. @ * < e.i.i.s.i.i.i.i.i.t.t.t.r.e.e.9.4.4.3.1.1.<.,.,.,.W T T n j j n j c 0 4 T Y T Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T ,.b @ n 3.4.0.4.3.4.<.<.<.<.W W <.T T T T T Y L n c c b j c c b c c c b l 0 . X 4 m n C C C T T U Y Y U Y Y Y Y T U Y Y Y 1 . @ @ m Y T U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y W W W W W ,.,.<.2.<.W <.W <.<.g @ +.xXAXHXB.,XGXJXJXJXJXJXJXJXJXcXaXXX.X.X.O.-XeXjXNXCXCXZXSXNXxXlXjXdXiXtX8X7X7X7XXt . 2 j c c b b b L T T Y Y Y Y Y Y T Y Y Y Y Y Y Y T Y T T T T W ,.<.1.5.3.4.9.9.4.e.e.r.e.r.9.1.9 ..cXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXw % * # 3 1.d.i.i.i.s.i.i.i.t.t.t.t.e.9.9.9.0.3.1.1.<.<.<.<.W <.T W U j c c b b j g # T T Y Y Y Y T Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T T T T W W ,.1 * <.4.3.4.1.3.3.1.1.<.,.,.W W W Y T Y T Y Y U K n b c c c c b c c b b b j j 1 X . 2 U U U U Y Y Y Y Y Y Y Y Y Y T g @ . g j Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T T W T W <.W <.<.1.,.,.1.,.6.h # 3XDXHXHXHXHXKXJXJXJXJXJXHXKXJXKXKXKXGXGXDXAXAXCXNXmXxXxXfXiXiXwX9X8X7XeX[ & # h c c c b c c L T Y Y T Y Y Y Y Y Y T Y Y Y Y Y T T T T T W W <.1.1.3.3.9.4.9.e.r.4.e.e.e.4.1.9 O.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX@.@ # # # l a.a.i.a.a.a.i.t.t.s.t.t.t.e.e.9.9.4.3.3.<.<.,.,.,.,.W ,.W m b c b c b c g , Y Y T T Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T W W q * T 4.0.4.0.3.3.1.1.W ,.,.<.T W T T T Y Y Y Y Y K n c b b c c c b b c c c c j , @ @ 0 L U Y Y Y Y Y T Y Y Y Y Y T 9 . . j c U Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T W ,.,.<.,.,.<.1.,.2.,.2 t gXHXHXHXHXGXHXHXGXJXJXJXJXJXHXJXHXHXHXGXGXAXZXBXNXNXlXlXjXiXtX9X9X7X7X1X8 # j v b c c c j C U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T ,.T ,.,.<.<.1.5.0.9.9.4.9.e.e.e.e.e.e.4.9 ..CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX= @ # * * <.i.i.i.i.t.i.i.p.t.t.t.t.e.e.e.9.9.3.3.3.1.<.,.<.,.,.,.T T m b c b b c b g 2 T T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T W W ,.j # L 4.3.0.9.3.3.4.1.<.<.,.T W W Y T Y T Y Y Y Y U L m c c c b b b j b c b b b g # @ @ n Y Y Y Y Y Y T Y Y Y Y Y T 4 @ @ j j U Y T Y Y Y Y Y Y T U Y Y Y Y Y Y Y Y Y T T T T ,.W W W <.<.<.,.,.<.<.Y * } NXKXHXKXGXDXGXGXJXJXHXJXJXJXKXHXKXHXGXDXAXAXZXBXcXxXlXjXjXfXtX9X8X7X7X' @ 0 c c c c c b j L T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U T T T T T ,.,.<.<.3.3.3.4.9.4.9.e.e.e.9.e.9.4.0 ..CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX>X# @ @ * g i.a.i.i.t.a.i.i.t.t.t.t.t.e.e.9.9.3.3.3.1.1.<.,.W <.W W W Y b c b j b c l 0 # Y Y Y T U Y Y Y T Y Y Y Y T Y Y Y T Y Y Y Y Y Y Y T Y T T T W ,.j # Y 3.3.3.3.3.3.<.1.<.,.,.,.W T T T T Y Y Y Y Y Y U P m n j b b b b b b c c b c q # @ @ c U Y Y Y Y Y Y Y Y Y Y Y , . , c c U Y Y Y Y Y Y Y Y Y T Y Y Y Y U Y T Y T T T T T T ,.,.W <.,.1.6.<.<.1.j $ :XAXHXHXHXAXAXHXHXJXJXJXJXKXJXKXHXHXHXHXDXDXAXCXNXnXxXkXjXiXiXtX9X8X8XB.8 1 j c c c c c c m U Y Y Y Y U T Y Y T T Y Y Y T Y Y T Y T W T T ,.,.<.<.1.3.3.9.9.9.e.e.e.r.e.9.9.<.< #.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXV @ X @ < 3.p.i.i.i.i.s.i.i.t.t.t.t.t.e.e.9.0.3.3.<.1.<.<.,.<.W ,.T T T b b b c b b c j # Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T W ,.n @ Y 3.3.4.0.3.4.1.1.<.,.,.,.W W T T Y T Y Y Y T Y U U C m b c b c c c c b c c c b 4 X @ n U Y Y Y Y Y Y Y U T L @ . 1 b c U Y Y T Y Y Y Y Y Y Y Y Y Y T T Y Y Y U T T T W W W W <.W 2.1.,.<.<.<.2 8 hXKXHXHXAXAXAXAXHXJXJXJXJXKXHXHXHXHXHXGXAXAXAXBXNXxXzXkXjXiXtX9X8X7X7Xf % g c n c c c c c C U U T Y T U T Y Y Y Y Y Y Y Y Y T Y T T T T T T <.1.1.3.4.4.4.9.9.9.e.e.r.e.e.r.K @ #.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXB.@ % # @ g t.d.i.d.p.d.a.i.t.i.t.t.e.e.9.9.9.4.3.3.<.<.<.W ,.<.T ,.W W T c c c b b j c 0 # U T T T Y Y Y U Y Y T Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T T T T W m @ C 4.3.4.4.4.3.0.<.<.,.,.T W T W T T Y Y Y Y Y Y Y Y U C n b c b b b b j c c n c c # . * K Y Y Y Y Y Y Y Y T b @ . 0 j c U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T T W ,.,.<.<.,.<.<.5.T # %.ZXHXHXGXBXBXZXDXHXJXHXHXJXJXHXJXKXHXGXDXDXZXBXnXnXxXzXjXiXuXuX9X8X9X@.- 4 c c c c c c c b L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T W T W ,.<.<.3.3.3.9.9.e.e.e.e.e.e.e.9.r.l X B.HXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCXu # * X * T s.a.i.i.i.i.t.t.t.i.t.t.r.e.9.9.9.3.3.1.1.<.<.,.,.,.T ,.W T T c c b b c j c g # U T Y Y Y Y Y Y Y Y U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T W ,.K @ n 3.4.4.4.9.3.0.1.<.,.W <.W T W T T Y Y Y Y Y T Y Y Y R m n b b c b c c c b b c b j # . 4 K Y Y Y Y Y Y U T D . @ g c j U Y Y Y Y Y Y Y Y T T Y Y Y Y Y Y Y Y Y T T T T ,.W T W <.,.,.<.<.<.b 8 wXGXKXAXCXBXZXAXHXHXJXJXJXHXHXHXHXHXGXDXDXDXZXCXNXxXlXkXjXfXuXtX9X9X>Xp , h c c n c c b c m U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T W W W 2.1.1.3.0.0.9.9.e.e.e.e.e.e.e.9.h + 2XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX6X. * * @ 1 9.i.i.a.i.i.i.i.t.t.t.r.t.e.e.9.4.0.3.4.1.1.1.,.,.,.W ,.W W T L c b c b c b c 0 * T Y Y Y U Y Y Y T Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y T T Y T T T W L # n 3.3.3.4.3.3.3.1.1.1.,.,.W T T T T T T Y Y Y Y Y Y Y U U C n j j c b b b c c j c c q . . . 0 U T Y Y Y Y Y T g @ @ h c c Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y T U T T W T ,.<.,.,.<.1.1.,.1.5 { MXKXDXZXNXNXZXAXHXHXJXHXJXHXJXHXHXHXGXDXDXAXZXZXNXnXlXjXjXiXtXtX9X0X] * g c c c c c c c j C Y T Y Y Y Y U U Y Y Y U Y Y Y Y Y Y T T T W W W <.2.1.3.3.3.9.9.e.e.e.e.e.e.9.9.0.q = 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXJ @ @ @ * 9 e.d.i.i.i.a.i.i.t.i.t.t.e.e.e.9.9.3.3.1.1.<.,.,.,.,.,.W T W T C j c c b b c c g # T Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T T T T * m 3.3.3.3.9.3.3.1.1.<.,.W W T W T Y T Y Y Y Y Y Y Y Y Y Y Y K n b b c b c b c b b c b 1 X @ U Y Y Y Y Y Y T 2 . # c b j Y Y Y T Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y T T T T W W W ,.W 2.<.,.1.Z * XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXfX= < * @ , C d.i.i.i.i.t.t.t.t.t.t.9.e.4.4.3.3.1.1.1.<.<.W W <.W ,.T W T T T n c b j b b j n c c # , L Y Y T Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Y Y Y Y Y Y T Y T T T T W W 1 b 1.3.3.3.9.3.4.3.1.1.W ,.T W T T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y T K b b b c c b c c , # n Y Y Y Y n . @ j b j U Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y Y Y Y T T T T T T ,.,.,.<.Y < B.bXNXNXxXjXlX6XdXNXZXAXHXHXHXGXHXHXHXGXDXDXAXZXCXnXcXNXlXkXgXbXB.1 , h c b j c c c n c m Y Y Y Y Y Y Y Y Y Y Y Y T Y Y T Y T T T W T W <.<.<.1.1.3.3.4.4.9.9.9.r.9.9.r.e.9.4.U T k . t eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX#.= < * * 2 3.i.i.i.i.i.i.t.t.t.t.e.e.4.0.3.3.3.1.1.<.W <.,.,.T <.W W T T T Y c b b c c b c c c j , L Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T Y Y Y Y Y Y Y Y T T T T W T <.1 l <.3.3.9.3.3.3.3.3.1.<.,.W W T T T T Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T U T m c c c b b c c 5 X M Y Y Y Y j . , j b C U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T T T W W W ,.,.3.z e 0XPXxXkXjXkXgX6XkXBXAXDXAXHXDXGXHXGXGXDXDXAXAXZXBXnXcXcXlXfXkXqXV # 0 c c n c c n c j m L Y Y Y Y Y Y Y Y Y Y T Y Y T T Y Q T T T T W W W <.1.1.3.3.3.4.9.9.9.9.9.r.r.9.r.9.3.K L 4 ..cXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX[ = < @ * 0 t.a.i.i.i.i.t.t.t.t.e.e.9.4.4.3.4.<.<.<.,.,.,.W <.W W T W T T T m c b j c b b j c c q . * U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y T Y T Y T T W W ,.0 j 1.0.3.3.3.9.9.3.1.<.W ,.,.T W T T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y K c c c c c c g X l Y Y Y Y 9 . , j c m Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T <.T W W <.<.<.0 -.gXxXlXkXjXkX,XuXxXBXSXDXHXAXHXHXGXGXHXDXDXDXZXBXBXnXxXvXkXjXgX' , 4 j c c c c c j c b L T Y Y Y Y Y Y T T Y T Y Y Y T T T T W T W W ,.W <.<.<.3.3.3.4.9.9.9.e.e.r.e.r.e.e.e.W K b * @.LXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXcXu 8 = * , K a.t.i.i.t.i.t.t.t.e.e.9.4.4.3.3.1.<.<.<.2.,.W <.T W T W W T T Y j c c j c b c b c b 2 . * L T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y T Y T Y T T W W g z 1.<.0.3.4.3.0.3.3.1.,.,.T W T T T T Y Y Y Y Y Y Y Y Y Y T Y T U Y Y Y Y Y Y Y Y L c j c c c m 5 j U Y Y T , . 0 j b K Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y T T T T T T T ,.W <.K H wXlXkXjXjXjXqX>XjXBXcXZXAXGXGXGXGXHXAXDXDXAXAXZXZXNXnXxXkXkXxX-X8 1 h n c c c c c j b L Y T Y Y T T Y Y T Y T T T T T T T T W W T W ,.,.<.2.2.1.1.3.4.9.9.9.e.e.r.e.r.e.9.e.e.U Y j . X B.GXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX8 w * @ < 1.s.i.i.t.i.t.t.t.t.e.9.9.4.3.3.3.<.<.<.<.<.W W W W W W W T T T C c n c b b c b c b j , . < K Y Y Y Y Y Y Y Y U T Y Y Y Y T U Y Y Y Y Y Y Y Y Y T Y T T W W ,.q c 1.3.3.4.4.4.3.3.3.1.<.,.<.T T T T Y T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U Y Y Y Z n m c c j j 0 Y Y Y T w X h l c U T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T ,.T W <.W 7 B.iXbXjXjXjXzX;.eXxXBXBXZXAXAXHXHXDXDXGXGXAXAXZXBXCXnXnXxXjXxX6Xr # g c c c c c c c b C U Y T T Y T T T T Y T Y T T T T T T W W W ,.W <.<.1.<.3.3.3.3.0.9.9.9.9.e.9.e.e.e.e.e.4.P U 9 t 0XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX0X= 8 * X 1 9.i.i.t.i.t.t.t.t.e.e.4.4.3.3.3.<.<.<.<.W ,.W W W W W T T T T U n c j c c c c b c b j @ . * b P Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y T Y T T W W ,.j M 1.1.3.3.0.3.9.3.<.1.,.<.W W T T Y Y Y Y Y Y Y Y T Y Y Y Y T Y Y Y Y T Y Y T Y Y Y Y K c c c j j 0 L Y Y Y * @ j c b U T Y Y Y T Y Y Y T Y Y Y Y T Y Y Y Y Y Y T Y T T T W ,.,.<.b ' wXjXjXjXfXkX7X=XdXnXnXNXBXAXDXDXGXAXGXDXDXAXAXZXBXnXnXnXcXbXzXX.= 4 v c c c c c c c m Y T T T T T Y Y T Y Y T T W T T W T T T ,.,.,.<.<.<.1.3.5.4.0.3.9.9.9.e.e.9.e.9.e.9.9.9.1.L b * . ' vXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX{ > 8 % * 9 9.i.a.i.t.i.t.t.e.e.9.9.3.3.5.3.1.,.,.W <.<.T <.T W T T T T T K c c c c c c c c j c g . , L K U Y Y Y T T Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T W W K 0 1.1.3.3.3.9.3.3.3.1.<.W W W T W Y T Y Y U Y Y Y Y Y Y Y Y U Y T Y Y Y Y U T T Y Y Y T L j j n c h K Y U L @ , j c C Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T T T 2.T L J 3XfXfXfXfXfXuXo.7XxXcXNXCXZXAXDXDXDXGXDXAXAXAXZXZXCXnXnXnXkXzXrXe , g c c c c n c c m T T T T T T T T T T T W W T T W W W W W T <.,.<.<.<.<.<.3.3.4.4.4.9.9.9.9.e.r.r.e.e.9.e.e.Q P q X . @.LXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXH 8 8 + * 7 9.s.t.t.t.t.t.t.t.9.9.4.3.3.1.<.1.,.,.<.W W W T T ,.T T T T T m c c c j c c c j j j 2 . . 9 T Y K U Y Y U Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y T Y W W W T K 0 <.3.3.3.9.3.3.3.3.1.<.,.W W T T T T Y Y T Y Y Y Y Y Y Y Y T Y U Y Y Y Y Y Y Y Y Y Y Y U m c b b n L Y Y m @ 2 j j C U T Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y W W W W q ;XuXuXuXfXfXkX-X-XfXxXNXZXNXZXZXZXDXDXAXGXFXAXAXZXCXnXnXnXxXcXqXV . g c c c c c c n K Y T T T T T W T W W W W T W T W T W T W ,.,.W ,.1.1.<.1.3.3.0.4.4.9.9.9.9.e.e.9.e.9.e.9.9.r.K n 2 @ eXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXB.% = * X < <.a.a.t.t.t.t.e.e.9.4.4.3.1.1.<.,.,.,.W W W W T T T W T T T Z c c c n j c j c j c c , X 9 T Y U K U Y Y Y Y U T Y Y T Y Y Y Y T Y Y Y Y Y T Y Y T T Y T T <.T 2 W 3.3.3.3.4.9.3.3.3.<.,.,.W T T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U n c c m C Y Y m @ 0 j b L Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T T T T W W z x 3XqXuXiXfXkX7X{ 8XxXcXNXNXBXZXZXAXDXDXDXAXAXAXZXBXBXnXnXmXxXbXX.% 2 c c c c c c C U T T T W W T W W W W W W W W W W ,.<.W ,.<.W <.<.1.1.1.<.1.0.4.4.9.4.9.9.e.e.e.9.e.e.e.e.9.9.4.L 0 X } zXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgX= = * % < ,.t.t.i.t.t.t.e.9.9.4.3.5.<.3.,.W ,.,.T W <.T W T W T T T T m c c c c j c c c c c c , . h Y T T U K U Y Y Y Y Y Y Y U Y Y T U T Y Y Y Y Y Y Y T T T Y W W W <.4 W 1.3.3.9.0.3.3.3.<.1.,.,.T W W T T Y T Y Y Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y U b c m Z Y T m @ g c C Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T T Y T U 1 -.8XiXfXiXfXlX .:XfXxXcXNXAXZXZXZXAXAXAXAXDXAXAXZXZXnXnXxXxXBXh.6 1 h c c c c h C T T T ,.,.T T T W W W W W W ,.W ,.,.W <.W <.<.<.<.2.2.<.3.3.3.3.4.4.9.4.9.9.9.e.e.e.e.e.9.9.9.e.T m < X >XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCXu % * * * Y s.t.t.t.t.e.e.9.9.4.3.5.<.,.,.,.,.,.,.W T T T T T T T T m c b c b c c b c c c c b 0 . l T Y Y Y Y m K T T U T Y Y T Y Y Y Y Y Y Y Y Y Y T Y T Y T T W W T <.1 L <.3.3.9.3.9.3.3.3.<.,.,.W T T T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y C b n L T Y j # h b U Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y T Y Y T T T T 2 ..wXiXiXiXiXkX$.o.wXxXcXNXCXZXZXBXZXAXDXDXAXZXAXZXSXBXBXnXxXzXeXV # g c c c c c C T ,.,.<.W W ,.,.W <.W ,.W <.W <.W <.<.W <.,.,.<.<.1.1.3.3.3.0.3.3.9.9.9.9.e.e.e.e.e.e.9.e.9.9.9.9.m 9 X H gXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX| % < @ < K s.i.t.t.e.e.e.4.4.3.5.4.<.W ,.,.,.,.T ,.T T T T T T T L c c j b j b c b b c c c c 4 X j T Y Y Y Y U K U T T U Y Y T Y Y Y Y Y Y Y Y Y T U Y T Y T T T W W W 1 Y <.1.4.3.4.3.3.5.3.1.,.,.W W T T T Y Y Y Y Y Y Y T Y Y Y Y T U Y Y Y Y Y Y Y Y Y Y Y Y Y Y Q b b U Y T 0 1 b C Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T T ,.4 V 6XuXfXiXhXfX1Xi 6XkXxXxXZXAXZXCXZXAXAXZXAXDXAXSXZXBXBXNXnXmXhX( , 0 c c n c n Y W <.,.,.,.<.W W ,.<.W ,.,.,.W <.W <.W <.<.2.1.1.<.<.1.3.3.3.3.3.0.4.4.9.e.e.e.e.e.e.9.9.9.9.9.4.4.W M < O . $.DXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX7X * * * h t.t.t.t.r.e.9.4.4.<.1.<.,.,.,.W T T T T W T T T T T Y n j c c b b b b b j b c c j , . 4 T Y Y T Y U l 0 b T U T Y U T Y T T U Y Y Y Y Y Y Y Y T T T W W W <.4 K 1.<.0.3.3.9.4.3.3.1.1.,.T T T T Y T Y Y Y Y Y Y Y Y Y Y T Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y T n M K Y T 9 2 n U Y Y Y Y Y Y Y T Y U Y Y Y Y Y Y Y Y Y Y Y Y Y Y T Y T n e 1XaXiXfXiXjXiX_ #.fXkXcXNXZXDXZXSXZXZXAXAXAXDXSXZXZXZXNXMXxXCX-X6 1 c c c b L T ,.2.<.,.<.,.<.<.,.,.,.W <.<.<.1.W W W <.1.<.1.1.<.2.3.1.1.3.3.3.3.9.9.9.9.9.e.e.9.9.e.e.9.9.9.9.9.9.U 9 X O X = 6XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXIX * % 2 2.t.t.e.r.9.9.3.4.<.1.,.,.W ,.,.,.T ,.T T T T T T T m c c n c c c c c c b b c j j . @ L Y Y Y Y U 2 X , L Y Y Y T U U T Y Y Y T Y Y Y Y Y Y T T T W W W W g b 1.1.1.3.9.3.4.0.3.1.<.<.W T W Y T T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T Y Y Y Y Y Y T Z b R Y Y < g Z Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y U b b B.IXhXiXuXkXuX{ %.uXvXkXmXNXZXZXAXAXZXSXZXAXZXZXZXBXZXMXNXNXcXlX` # 0 h n L ,.T 2.1.,.<.,.,.<.<.,.<.<.<.<.,.,.<.W <.<.<.1.<.1.1.1.1.4.1.3.4.3.4.4.9.9.9.9.e.9.e.r.9.e.9.9.9.9.9.4.9.,.h @ . * } zXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX5X{ ` ] >XcXJXKXKXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXVX. @ * * m a.t.r.9.9.9.3.3.<.<.<.W <.T T T T T T T T T T T L m c c c c b j b c b c c b n 4 . . . l Y Y Y T K @ X g K T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T T W W ,.j g 1.1.3.3.3.4.0.3.3.3.1.,.W W W T T Y Y Y Y Y T Y Y Y Y U Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y L c L Y Y , n U T Y Y Y Y Y Y Y T U T T Y Y Y Y Y Y T Y Y Y Y Y T Y j n B.dXiXiXjXkX9X` %.uXkXzXcXnXZXZXAXAXAXSXZXAXAXAXDXZXBXCXNXcXxXxX%.= j U 6.T T W W <.W W ,.W ,.T T W W <.<.W ,.W <.2.,.<.2.2.1.1.1.<.3.1.3.1.0.0.9.9.9.9.e.9.9.e.e.9.9.9.9.9.9.9.4.9.9.T 2 . X = ; . t -XKXKXJXKXGXKXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCX8 X * * 9 r.r.r.9.9.4.3.<.<.<.W <.W T T T T T T T T T T U m c c c b b c b b b c b b j c , . 1 Y Y Y Y n . X # n U U Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y T W T W <.F 2 ,.1.3.3.3.4.4.3.3.5.1.<.<.W W T T T T U Y Y U T Y Y Y T Y Y T U Y Y U Y Y Y Y Y Y Y Y Y Y U T c L Y U 2 L T U Y Y T T T T U U T U U Y T K T T Y T T T T T Y Y T P B.tXfXfXjXlXuXd .yXiXfXfXCXSXAXHXJXGXDXAXZXSXAXAXZXZXAXNXNXxXyX%.8 @ @ 0 L <.,.<.2.2.T ,.<.1.<.<.2.<.<.<.1.2.1.1.2.1.1.1.1.<.3.1.3.1.3.3.3.0.3.9.9.9.9.9.e.e.r.e.e.e.e.9.9.9.9.9.3.0.9.m * . X +.CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX5Xo ; -XyXiXtX-Xt o @.GXGXGXKXKXKXKXKXHXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXB. X * * Y r.e.9.4.4.3.<.2.W <.W T W ,.T T T T T T T T m c c c b c b c b c c j b b b j . . . . b Y Y Y g X . . @ 9 T U Y Y U T Y Y Y T Y Y Y Y Y Y T T T T W W T W 2 Y 1.1.4.4.1.4.4.3.4.<.1.W ,.T T T Y T Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y n L Y K 0 U T T T Y m c l b b 0 g h h 0 4 1 0 l l M b j 0 9 5 * , J eXiXjXkXlX-Xi { yXxXjXwX8XuX6X6X6X6X>X5X2X5XuXvXFXZXAXZXAXFXZX$.8 o o o X * 4 b m Y <.1.1.<.<.<.<.1.2.1.2.2.1.1.1.1.1.1.1.1.3.1.1.3.3.3.3.4.4.0.0.9.e.9.9.e.9.e.9.9.9.9.9.9.9.4.4.3.9.Y , X o ` hXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXhX- p wXcXZXCXbXgX5X*.o -XGXGXLXGXGXGXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvXu . @ * j t.e.4.4.1.1.<.<.<.W W <.T T T T T T T T T C b b c b c b c b c c b b b c b 0 O < T Y K 7 X o . X 0 U U Y Y Y Y Y Y Y Y Y Y Y Y Y W T T Y T T W ,.h C 1.1.3.3.4.3.4.3.3.4.<.<.,.T T T Y T Y Y T Y Y Y Y Y Y Y Y Y T Y Y Y T Y Y Y T Y Y T Y Y Y U C K L P m T Z h 2 * @ @ , @ @ X # # * % X @ % @ @ @ @ % . X @ o @ ] iXkX7X:X_ a + - p 8 t 8 8 t 8 t 8 t 8 t 8 u t p u u y i ` ' { t o o . . X + * @ * M T 3.1.1.1.2.1.<.<.1.1.<.1.2.<.1.1.1.1.1.0.4.5.3.0.4.4.4.4.4.4.e.9.e.9.4.9.e.9.4.4.9.9.9.9.4.4.T 9 . . o 7 4XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXDX$.; >XSXCXcXvXjXgXpX-X; p vXLXLXDXLXDXGXGXJXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX4X X @ 2 0.9.9.3.3.1.<.,.,.,.W T T T T T T T T T L b c l c b c c b b b b c b c j c # . X . 0 T Y , . 8 %.o X q Y Y Y Y Y Y L Y Y Y Y Y Y Y Y T T T T W T ,.M 0 <.1.<.3.3.0.4.4.3.3.1.<.,.W W T T T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y T P K R L L g 9 * @ % X @ . X @ @ . . . . X O X . . . . . o & o + o 8 p u - ; o o o O . o o o o + & o % = $ $ = = ; & + . O + & & ; & + i { i & . . . X . @ @ 4 n T 3.3.1.1.3.1.3.1.1.4.5.3.3.3.3.3.5.0.0.3.4.4.4.4.9.9.4.4.9.9.e.e.9.9.9.9.9.4.9.4.4.9.W 9 . . & * B.ZXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXzXi u vXcXPXmXvXgXeX,X=X*. i >XAXSXAXAXDXLXLXGXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX6 . @ * m e.4.3.<.1.<.,.W <.T T T T T T Y T W U b c b b c j c b c c c c b b c j h . . . $ . X 9 m X 8 cXXh.;.5X0XqXdXgXnXSXSXSX p V t t 8 t 8 t u H p X & ; - X . : qXJXJXHXLXfX;X[ 8 X . X X X X @ * 1 * * 9 g l L L U W W 1.1.4.4.9.r.r.r.9.e.9.9.y.e.4.e.e.e.r.e.9.0.3.<.m 2 X . . { vXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXIX; [ bXdXdX8X-X@.[ _ _ y X I u.5 : [ qXCXSXSXAXDXGXGXGXKXKXKXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX.. X < Y 4.<.1.2.,.T T T T T T T T T Y Y m b b c c b b c b c b b c b j c j * . . = O.GX+. o o o . o O.JXJXCXi . , C T Y Y Y Y T Y Y Y Y T T Y T T W T W <.W W <.1.<.3.3.4.3.4.3.3.3.1.1.W W ,.T T T Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y T Y Y Y Y Y Y Y Y Y U L 9 . . @ X o > ] 5XIXvXCXAXGXGXGXGXGXHXHXJXJXJXJXJXJXJXqX8 o o . . ` ..;.2XeXqXdXqXuXhXxXcXzXMXCXMXcXcXvXvXvXMXCXCX9XdXzXgXwX;Xo.9XGXJXJXJXJXJXGXZXvX6X{ - . . X X X X . @ @ @ % % * * * * , 4 9 h g j k j C T Z L A c 0 j g g 0 g 9 * * X . . . o %.zXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXt i IX6X>Xh.[ f *.*.i t $ w.^.v.6.; ; @.gXCXZXAXAXDXGXGXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX3 * j 4.1.1.W <.W W T T T T T T T Y C b b c b c c c b c b c b c b c c , . . . _ AXJXCXp o o o . o o ;XJXJXJXvXo. * l Y T Y Y Y Y Y Y Y T Y T Y T W W W <.W ,.<.,.<.1.4.3.3.3.3.3.3.3.3.W <.T T T T Y T Y T Y Y Y Y T Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y F m , . ` B.dXCXKXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX[ & i =X7XcXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXAXJXJXJXJXJXJXJXJXJXJXKXAXbX>X+.p o . . . . . X X . . @ . . . X X . . X @ @ * @ # @ @ . @ . . . . . & t B.MXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSX+.: #.-X@.{ s i s y p o 2 v./.!.!.v.M o t -XxXCXSXAXAXDXGXGXKXKXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX.. . % n 1.<.,.<.W W T T T T T T U C b b c j b b b c b b b c c b j j 4 . . u bXJXJXJXMX;X= X & >XJXJXJXJXAXO. @ , n T T Y Y Y Y Y Y Y T T T W T W W <.2.q * ,.<.3.3.3.3.3.4.3.3.3.<.<.W W T T T T Y Y Y Y Y Y Y Y Y Y Y Y Y T Y Y Y Y Y Y Y T Y Y K j X > rXCXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSXcXMXGXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXAXCXaX-XO.i - X . . . . . . . p [ =XqXvXCXAXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX6Xo t @.&.*.s s *.i ; . I /.~.~.~.~.H.v.B o i X,XqXcXSXSXSXLXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXgXt # $ O : : o 4 J./.!.!.!.~.!.~.~.^.!.J.7.$ a o.qXCXCXSXAXAXAXGXGXKXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX4X X < b b b b c b b c b j c b b l c b b c c b c c c b j 4 . . . @ = ,XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX>X& . X X * * 9 j n L T W W <.<.<.,.<.W Y K m <.<.1.3.3.3.3.3.3.3.1.<.W <.W T T Q 6.T T T T Y T Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y * . . . 6XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXKXKXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXdXu I v.R B # 5 B % 5 u.~.~.!.!.~.!.!.!.!.^.!.v.E # a UXgXcXSXSXAXAXDXGXGXKXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX| . @ h c c c c c b b b c b c b c b c c c b c b b l h * X $ X X 5XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX6Xi X X X @ * 2 2 2 9 1 1 < < # # @ @ 0 <.1.1.3.3.3.3.3.3.3.3.5.W W <.T T W T T W T T Y T Y T T Y Y Y Y Y Y Y Y Y Y Y j X . u CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXhXt E |.H.C.v.J.f.w i u . B v./.~.!.~.~.^.!.!.!.~.H.v.N $ y -XcXCXCXAXSXAXGXGXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXgXi * j c n b c c c c b j b c b j c b b c b b j 0 # . . . X 7 5XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX-Xu . . . . . . . . . X K <.1.1.3.3.4.3.3.3.3.3.3.<.<.,.T T T T T T Y Y T T Y Y Y T Y Y T Y Y Y Y T C % 1XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXgXu S |.!.!./.^.v.e *.wX>Xa o N J./.^.!.!.!.!.^.~.~.!.J.g.e o ` ,XcXCXCXSXAXGXGXGXKXKXKXJXHXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX0X= . X * h j c c c c b b c c b b b c b c c c j 1 @ . . J 0XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXVXwX=X' % o . . * Y 1.1.3.3.3.4.3.4.3.3.3.<.<.W W W W T T W T T T T T T Y T Y T T Y Y Y Y P 2 . ` CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXGXgXu E /.^.!.~./.v.8 ` ,X>X0X@.o # R H././.!.~.~.~.~.!.!.!.H.g.6 ; [ 6XcXCXSXAXAXGXGXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX;X. . . * j j b n c c c b b c j c b b c b g * . . 3 B.MXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXCXbXgX>X%.' u t - o e ' [ 2 Y <.<.3.3.3.3.0.3.3.3.5.<.<.W W ,.W W T T W T T T T T T Y T Y T T T Y j X . 1XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXgXu I /.!.~.~.~.v.e *.X-X=XhX_ O 5 7.!./.~.~.~.~.!.!.!.~.H.v.6.; a @.dXcXCXSXSXAXDXGXGXKXKXJXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSX%. . , j b b c b c c b b b b c b g , @ . . u 0XGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXLXVXMXcXcXbXzXcXCXZXKXJXJXqX] < L 1.1.3.3.3.3.4.3.3.3.1.<.<.<.,.W W W W W W T T T Y W Y T T Y T T L * . H CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXGXJXgXp S /.~.!.!.^.g.t *.>X-X-X=X=X=XwXp g u./.~.!.!.!.!.!.~.!./.H.g.N & t UXzXcXCXCXAXAXDXGXGXKXKXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvXH O . . * 0 l b b b b b b b c g , @ . . @ @ O.vXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXMX_ . , L 1.1.3.3.3.4.9.3.3.3.3.<.<.,.W ,.,.,.W W W T W W W T T T T T Y < . t dXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXbXV A /.~.!.~.^.C.e V >X-X=X=XUXUXUX-X5Xa . N v.|.!./.!.!.!.!.!.!./.H.g.B O s >XcXCXCXSXAXDXGXGXHXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXzX| . X < 5 0 g g 0 4 2 , @ . @ V B.AXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXvX@.8 . , K 1.3.3.3.9.3.3.3.3.3.1.2.,.,.,.W <.W <.W W W W W W T T T T q . . . >XKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXkXi K |.!.~.~.^.v.w s :X=X=X=X#.UX;.=X=.3X>X; . A H./.~.~.~.~.~.!.~.~.~.J.g.w : ] 6XcXNXSXSXLXDXGXGXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCX@.% & o . X @ X @ @ X @ . . . e { eXPXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXrX% . * m 3.1.3.3.3.9.3.3.3.3.1.<.<.<.W <.<.W ,.,.W W W T W W W m @ . X ` CXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXxXV A /.!.~.~.^.v.e s -X;XUXUXUX;.h.=X=X=XUXqX[ o , 6.H./.~.!.~.~.~.~.!./.~.C.7., - +.IXcXCXSXAXLXLXGXKXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXSX-Xu X o % . . o . 3 >XzXCXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX#.. . * C 1.4.3.4.0.0.3.3.3.3.1.1.<.W W <.,.,.,.<.,.,.,.W W T < . . + 3XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXxX*.N /.!.~.~.^.v.5 i -X=X=.UX=.=.UX=X=X-X-X=X-XtXs 5 u./.~.~.~.!.~.~.!.!.^.!.6.@ ; y o.5XSXAXAXLXLXGXKXKXKXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXbX1XH 7 & X X & t H 1X0XvXLXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAXrX> . . * n <.3.3.4.4.4.4.3.3.5.<.<.1.W 1.,.<.,.W <.W ,.W Y 2 . . + o s ZXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXxXV S /.^.~.~.^.J.3 y -XUXUX=.UXUX=X-X-X-X-X-X-X-X-X8Xt k f.|./.~.~.~.~.~.!.M @ @ p *.t $ ; [ gXSXLXDXLXGXKXKXKXKXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLXvXqXeX0X6XqXbXNXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX4X3 X % 9 Y 4.3.4.4.3.4.3.3.3.1.1.<.,.<.2.<.1.W <.<.T 1 X o X H qXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXzX*.M /.~.!.~./.v.8 p -XUX=.=.UXUX;X-X>X>X>X>X>X>X>X-X,X,X; . N v.|.~.~.!.!.j . i =X,X6XeX5X_ _ zXSXSXLXAXGXGXGXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX0X@ . X , m 3.9.5.4.4.4.3.3.1.1.<.1.<.<.<.<.<.<.Z , X . X X B.xXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXvX*.N |.!.~.!./.v.5 y =XUX=.=.=XUX-X-X>X,X,X,X,X,X>X>X-X-X6X$.: & R !./.^.I X t >X6XdXIXdXdX0X_ O.cXCXCXAXLXLXLXGXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXqX..= . # 9 L 9.4.4.4.3.3.3.1.1.1.<.1.1.W C j * . . X H 7XAXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXzX` v |.~.!.~.~.v.7 p =X#.=.h.=.-X-X>X,X,X5X5X5X5X5X5X,X>X>X=XqX] 6 7.!.5 : #.6X0X0XpXdXdXqX-X> t IXcXcXCXSXAXDXDXGXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXAX6Xr . . , g m ,.4.e.0.4.3.0.1.<.m h 1 , @ @ H 6XvXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXvX` N /.!.~.!./.J.8 y UX=.h.=.-X-X>X,X5X6X6X0X0X0X6X6X5X,X,X>X>X=X0Xy $ # @ y 6X5X6X0XdXgX6X>X=.i & =XzXcXcXCXSXAXAXGXGXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXbX#.= . X $ @ , g b Z P m m j 9 1 @ X @ p @.kXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXKXcX` b |.~.~.~.^.v.5 p =XUX#.=.=X-X>X,X5X0X0XqXqXqX0X0X0X6X5X5X,X>X>X>X,X: . ` qX0X0XdXdX,X=.O.o.y $ O.gXgXzXnXcXSXAXLXDXGXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXLX0XH % X . * , # * # @ . @ . @ o ] qXAXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXxX_ c |.~.~.!.^.v.5 p =X#.#.UX=X>XX,X6X0X5Xt X e N N N x # t p ; N g.v.B O O.-XO._ i i i y a O a 5X6XqXwX] o 5 N I I N 3 > >XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGXSXAXCXSXGXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXvXJ j |.~.!.!.^.J.3 p UX=.UXUX-X>X5X6X5X` 2 I I E ^ ! E N 3 # 6.H.^.^.u.X ; [ ] *.y u i a $ o ] 5X6X6XO. $ N I ! ^ ^ ^ E N . a 0XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXcX` c /.~.~.!.^.C.w y UX=.UXUX-X>X5X6XUX 6 I E ^ E ^ ! ^ E N e . E |.!.~.~.6.. : a t p t ; $ O s >X5X5X-X; . N I E E ^ ^ ^ ^ ^ x f JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXKXHXJXJXHXHXHXKXKXKXKXKXKXKXKXKXKXHXKXJXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXJXKXJXJXJXHXJXJXHXJXJXKXJXJXJXHXKXJXKXKXGXKXJXJXKXJXJXJXKXHXJXHXKXJXJXJXHXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXcX_ v /.!.!.!.^.C.4 p =X=XUX=X-X>X5X,X*. B ^ E ^ ^ ^ ^ E E ^ N o 5 !././.C.6.6 O O O a @.>X,X,Xo. 6 I I I E E ^ ^ ^ 7.^ , ; qXJXJXJXJXJXJXJXJXJXJXHXJXHXJXJXHXKXKXKXKXHXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXi y y y y y y y y y y y y y y y f HXGXHXHXGXGXKXKXKXJXHXKXKXJXJXJXJXHXJXJXJXHXJXJXKXKXHXJXKXKXKXKXJXKXGXJXKXKXKXHXKXHXKXHXKXHXHXHXKXHXJXKXKXJXKXHXKXKXKXKXKXKXKXHXJXKXKXKXKXJXJXKXJXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXcX] B |.!.^.!.!.J.2 p =X=X=XUX-X,X5X>Xa $ E E ^ ^ ^ ! ^ ^ ^ ^ I 3 # 7.E w 6 @ o a t ] =.` . B N I I E E ! ! ^ 7.^ x o ;XJXJXAXp y y y y y y y y y y y y y _ GXKXKXHXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXi y y y f.u.u.u.u.u.u.u.u.f.u.u.u.u.V.O y y y y *.GXGXGXGXGXKXHXKXKXHXi y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y i SXGXGXKXKXKXHXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXCX] D /.~.~.!.!.J.5 t =XUXUX;X-X,X5X-X 6 ^ E ^ ^ 7.^ ^ ^ ^ 7.E e O # o $ 8 e B B B D e e 6 # $ O o ; : . N N I I E E E ^ ^ ^ 7.G @.JXJXcX g.g.u.g.g.y.g.g.g.g.u.u.5.: DXLXGXGXGXGXKXGXKXKXKXKXJXJXJXJXJXi y u.u.u.f.|./.].|.^.]./././.].].]././.@Xf.u.u.u.u. y y *.DXDXDXGXGXGXGX u.u.u.u.y.g.g.y.u.u.u.u.g.y.u.u.y.u.u.u.u.u.u.u.u.u.y.u.u.u.u.y.u.u.u.u.u.u.u.y.u.u.u.y.u.u.u. cXLXDXDXGXGXGXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXcX_ h /.!.~.!./.C.w y =XUXUX=X-X,X5X-X # E E ! ^ ^ 7.^ 7.^ ^ E 5 O . 5 N N N N N N N N N N N B B e 1 $ O N I I I E ^ ^ ^ ^ 7.^ N o #.JXJXcX@ |./.!./.!./.!./././.^./.J.: AXSXAXAXLXGXGXGXKXKXKXKXJXJXJXJXy f.g.|.].[.].^.^.^.~.^.^.^.^.^.^.^.^.^.^.!.[.]./.].].f.u.u. V SXZXAXAXGXDX !.!.!.!.!.!.!.^.!././.^.!././.!./.^.^.^.^.^.^./.^.^.^.].~./.^././.^.^.^./.^.^./.^.^.^.^././.|. cXAXSXAXAXDXGXGXGXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXCX] h /.~.~.~.^.J.5 y UX=XUX=X-X,X5X,Xt @ N ^ E ^ ^ ^ ^ ^ 7.7.I 8 e I I E I I I I N N N N x N x N N N B e : B I I E E ^ E ^ ^ ^ ^ x : >XJXJXcX@ /./.!.!.!.!.!.!.!.!.!.^.C.: CXcXCXCXSXSXLXDXGXGXKXKXKXJXJXp . f.|./.^.].].~.].].~.].^.].].L.^.^.^.]./.^.].~.].^.~.]./.].^.u. nXcXSXAXSXAX v.H.H.H.!.!.!.!.!.!.!.!.!.!.~.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.~.!.!.!.!.!.!.!.!.~.~.!.!.!.!./.. gXCXCXCXSXSXAXLXGXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXnX_ h /.~.~.~.^.J.5 t -X=XUX=X>XzXtXs . e ^ ^ ! ^ ^ 7.^ 7.7.^ I E ^ ^ E E I I I G N N N N N N N N N N N B B I I E E E ^ ^ 7.7.^ X ; nXJXJXcX. /.!.!.!.!.!.!.!.!.!.!.!.C.: zXzXcXcXcXCXCXSXAXGXGXKXKXKXy v.[.^.].^.].~.].^.^.].~.^.^.^.^.].^.^.^.^.^.~.].^.^.].~.].~.].|. zXcXcXnXcXCX !.H.H.H.H.H.!.!.!.!.!.^.~.!.~.~.~.!.~.~.!.!.!.^.!.!.!.!.!.!.!.!.!.!.~.~.!.!.~.!.~.~.!.!.!.!./.O dXzXzXcXcXnXCXSXLXLXGXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXnX] k /.^.!.~.^.J.5 t -XUXUX5XAX_ ; 3 N @ @ N 7.^ 7.^ 7.^ ^ 7.^ 7.^ ^ E E ( E I I G I N I N N N N N N G I I N I E E E ^ ! ^ 7.7.5 o.JXJXJXcX. /.!.!.!.!./.!.!.!.!.!.^.v.: gXgXgXzXzXcXcXCXSXAXLXGXHXy f.|.~.].~.~.].~.~.].^.^.].].].^.].].^.].].^.].^.].].~.].].^.].{.H. dXgXgXzXxXmX C.H.!.H.H.H.!.!.~.~.~.~.~.~.!.^.!.~.~.~.^.!.~.~.~.~.~.!.^.!.!.^.~.~.~.~.!.!.^.!.~.~.~.^.!.~./. qXhXgXzXzXcXcXCXSXAXLXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXKXcX_ k /.!.~.~.~.J.w t =X>XGXo.a - A v.J.P & B ! 7.7.7.7.7.^ 7.^ ^ ^ ^ ^ E E E I I N I N N N N N I G I I I ( E E ! 7.^ 7.7.I 3 y nXJXJXJXcX@ /.!.!.!.!.!.!.!.!.!.^./.v.: IXIXIXIXhXzXvXcXCXSXLXCXy v.[.~.].].].].].].].^.^.].^.^.^.].^.^.^.^.^.^.^.^.^.^.^.].~.].~.].~. qXtXIXhXgXzX v.H.H.J.H.!.!.!.~.~.~.~.^.!.!.^.^.~.~.^.!.^.^.~.^.~.~.^.^.!.^.!.~.~.~.].^.!.~.^.~.~.^.!.~.~./. 6XIXIXdXgXgXzXcXCXAXLXLXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXVX] 0 |.~.!.!.^.J.5 y SX,Xt ; k g.J./.~.J.M 6 w e D N 7.^ ^ ^ ^ ^ ^ ! E E E I I I I I N I I I I I I I E E E ! I 8 B e 6 @ V gXJXKXJXKXcX$ /.!.!.!.!.!./.!.!.!.!.!.J.: 6X6X0XqXIXIXgXzXcXCXAXDX f.].~.].~.].~.].~.].^.].].^.].^.^.^.]./.].].].].].].].^.].].^.].].].]. 6XeX0XqXIXjX v.J.v.H.!.H.F.!.~.~.~.~.!.!.^.!.~.^.^.~.~.~.~.~.~.~.^.^.^.~.!.^.^.~.^.~.^.~.~.~.~.^.^.~.~.~./. ,X6X0X0XIXdXgXzXcXCXSXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXnX} 5 |.~.!.!./.J.5 t *.; 5 q.C.!./.!.~.~.J.g.B @ O e E 7.^ ^ ^ ^ ^ ^ ! ! E E E E I I I I I I I I I I E E E E ^ / B O . : i =XnXJXJXJXJXJXPX@ /.^.!.!.!.!.!.!.!.!.!.!.v.o 5X5X5X6X0XqXgXgXvXcXxXp |.~.{.~.].].].].^.].].].^.^.^. X.X|.}.|..X|.|.}.^.].^.].].^.].].~.~.~. ,X5X7X0X0XtXO v.C.v.H.F.F.!.!.!.!.~.!.^.^.^.!.~.^.~.~.^.^.^.~.^.~.~.^.~.~.~.~.~.~.~.^.^.~.^.~.~.^.~.^.^.~./. >X5X5X6X0XqXdXgXzXcXCXLXGXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXnX] k /.!.!.!.~.J.e . 8 E v.!./.!.!.!.!.~.^.^.v.N # E 7.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ E E E E E J E E E E I E E E E ^ E ^ ^ E 3 d cXAXJXJXJXJXJXJXcX. /.!.!.!.!.!./.!.!.!.!.!.v.: >X>X,X,X6X0XqXdXgXvXVX f.~.~.].^.^.].].^.].^.]./.^. X|.g 5 2 2 2 1 5 2 x |. X|.|.|.].^.].^.].]. >X>X,X5X6X0X v.v.C.J.H.H.H.!.!.^.^.^.^.^.^.^.^.^.~.~.^.^.~.~.'.^.~.^.^.~.^.].^.^.^.^.^.~.^.^.^.].^.^.^.^./. =X>X,X5X5X0XqXIXzXcXCXSXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXCX{ g /.~.^.^.^.J.S M g.H.^.!.!.!.!.~.!.~.^.~.E 6 $ N E E E ^ E ^ ^ ^ ^ ^ ^ ^ E ^ E E E E E E E E E E E ^ ^ ^ ^ ^ ^ ^ E X t cXJXJXJXJXKXJXKXnX. /.!.!.!.!.!.!.!.!.!.!./.v.: UXUX-X>X,X5X0XIXgXgXy /.H.H.~.^.L.].].].].].]..XsXk 1 ] ] _ _ _ _ 6X 5 5 5 B .X.X|.].].].|. UX-X-X,X,X6X M.C.J.!.!./././.|.|.|.|.|.|.|.|.|.~.].].^.!.^.^.~.~.^.^.^.^.|.|.|.|.|.|. X|.|.|.|.|.|.|.|.|.|.. $.-X-X>X,X6X0XIXgXvXcXCXAXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXNX[ 5 |./.C.v.!./.J.J./.~.!.~.~.!.~.!././.u.5 @ 3 E E E E E ^ ^ ^ ^ ^ ^ ^ ^ ^ E ^ ^ ^ E E E E 7.E ^ ^ ^ ^ ^ ^ ^ ^ 7.7.k O.JXJXJXJXKXJXKXcX@ /.!.!.!.!.!.!.!.!.!.!.!.J.: @.UXUX=X>X,X6X0XdXIX u.H.I.{.~.^.].].].].].].Q.w ; ] } O.o.o.o.o.o.o.*.*._ 6X 5 4 B X|.|.k $.UX=X-X>X5X , , 1 1 1 1 1 1 2 1 1 5 4 4 2 4 q ~.^.~.^.^.^.^.^.^.^.^.^.^.B 4 4 2 4 4 5 4 2 5 2 2 4 2 1 5 5 O O.UX=X-X>X5X0XqXIXzXcXCXAXGXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXCX .1 6.w , # , S g.!.^.!.~.~.~.~.~./.J.D # = : . x I I I I E E E ^ E ^ ^ ^ ^ ^ ^ ^ 7.E ^ ^ 7.7.E 7.^ ^ ^ ^ ^ ^ 7.7.7.7.E . t SXJXJXJXJXJXKXcX@ |.!./.!.!.!.!.!.!./.!.^.v.o O.@.#.UX-X,X5X0XqXtX !.F.H.H.].].^.].].].].].sX ] ] O.o.o.o.[ o.[ [ o.o.[ o.o.*.` 6X 4 5 2 _ @.@.UX-X>X,X@.@.#.=.#.=.@.O.O.o.[ ] ] _ _ ` 9X ~.^.^.^.^.].^.^.L.].^.^.]. i d s i *.s s s *.*.*.` ` _ *.` *.O.@.=.=X>X,X5XqXdXgXcXCXAXGXGXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXKXAXo. @ t ] .y & @ A !.^.!.~.^./.H.z # ; [ O. $ I I J I I I E E ^ ^ ^ ^ ^ ^ ^ ^ ^ 7.E 7.7.E ^ 7.E ^ 7.^ ^ ^ 7.7.7.7.7.^ 4 : 7XJXJXJXJXJXJXcX$ /.!.!.!.!.!.!.!.^.!.^.!.J.o o.O.O.=.UX>X5X6XqX0X F.H.H.~.].].].].].].].~.p O.o.[ [ [ [ [ [ [ [ [ o.[ o.o.o.[ o.f ` ` ` _ O.O.@.#.UX>X>X5X6X0X0X0X0X5X5X>X-XUX#.@.O.o.+.JX H.].^.].^.^.^.^.^.].^.^.]. _ ] ] _ ] ] ] ] [ [ [ [ [ o.o.o.O.O.O.#.-X-X,X5X0XIXzXcXCXSXDXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXgXp : @.6XqX0X7X>Xt . I H.^./.^.I # % s O.AXo. 3 N N I I I I ( E ^ ^ ^ ^ ^ ^ 7.7.7.7.7.7.7.7.7.7.7.^ 7.7.7.7.^ 7.7.^ 7.7.N o.JXJXKXJXKXKXcX. /.!.!.!.!.!.!.!.!.!.!.!.v.O [ [ O.@.UX-X,X5X0XtX. J.F.!.F.].I.].].[.].].F. ] o.[ [ ] ] ] ] ] [ [ o.[ o.o.o.O.O.O.O.+.o.o.o.O.O.@.#.=X-X>X,X6X6X0X6X0X5X5X>X-XUX#.@.O.+.o.JX ^.].].^.^.].^.^.^.^.].^.|. ` ` _ _ _ ] ] ] ] ] [ [ [ [ o.o.o.O.=.h.UX>X,X6X0XIXgXvXCXAXGXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXDX#.= %.zXzXbXgXdXaX5Xa @ g.|.g.1 # p ] #.-XAXV e N N N N I I I E E E ^ ^ ^ 7.7.7.7.S I 7.7.7.7.7.7.^ 7.^ 7.7.7.7.7.7.7.7.! i JXJXJXJXKXKXcX@ /.!./.Q.!.!.!.!.!.!.!.!.v.o [ [ o.O.#.-X>X6X0XqX. H.F.F.].].^.].].].'.].!. t [ ] ] ] ] ] ] [ [ o.o.O.O.O.O.O.O.O.O.@.O.O.@.@.@.#.UX=X-X>X5X6X0X0X0XeX7X5XX,X6X0XdXzXcXCXAXGXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXgXt i hXvXbXbXhXdXIX0X..$ 3 5 o t *.O.=.UXUXnXt . e N N N N I I E I E ^ ^ 7.7.I D 6 $ $ : ; 8 B E 7.7.7.7.7.7.7.7.7.7.7.7.7.^ 6 - AXJXJXKXKXKXcX@ /.!.!.!.!.!.!.^.^.!.!./.J.o ] [ [ O.@.=X>X5X0X0X H.H.H.I.~.].].].].].].].q. - ] _ _ ] ] [ [ o.o.O.O.@.@.#.@.=.@.$.@.@.@.@.@.@.=.UX-X>X,X5X6X0X0X0XeX6X6X,X>X-XUX#.@.@.O.JX ^.].^.^.L.].].^.].^.].]./. *.*.*.` _ _ ] ] [ [ o.o.o.O.O.@.@.@.=.UX-X,X5X6XqXIXzXcXCXAXAXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX7Xo @.xXzXgXjXzXpX,X-Xo.; ; *.[ @.#.#.#.h.tXa . B N N N N I I I E E E 7.^ t % k E u.u.f.q.N 3 * N w.7.7.7.7.7.7.7.7.7.7.w.7.5 ; jXJXJXHXKXKXnX. /.!.^.!.!.!.!.!.!.!.!.!.J. ] ] [ O.@.=X>X5X0X0X H.H.H.F.].].].].[.[.].[.|.5X a } _ ] ] [ .o.@.@.@.UXUXUX-XUX=X=XUXUX=XUXUX=X=X-X>X>X5X5X0X0XIXqX0X0X6X5X,X>X-XUXUXUX#.JX ~.].].].^.].].^.].].~.].[. *.*.` ` _ ] ] [ [ o.o.O.@.@.@.#.#.UX=X-X>X5X5X0XIXgXzXVXCXAXGXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKX-X: >XzXgXgXfX6X-X@.o._ ; - _ @.@.@.@.@.#.#.6X: O x B x N N N I I ( E 7.I 6 5 7.m.!.f.6.^ u.F.g.! * w 7.7.7.7.7.7.7.7.7.7.7.7.k ; qXJXJXJXJXKXnX@ /.!.!.!.!.!.!.!.!.!.!./.v.O ] ] [ o.@.UX-X5XeX0X F.F.F.].^.].[.].].].[.[.}.*Xq. f f a [ [ o.@.@.=.UX=X-X-X>X-X>X>X-X-X-X-X-X-X-X>X,X5X5X0X0XIXIXIXIXqX0X6X5X,X>X>X-X-X=XJX ^.].].].].].].].].].].].]. s *.` _ _ ] [ o.o.O.@.@.#.UXUXUX-X-X>X,X5X5X0XIXIXzXcXCXAXGXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX>Xo =XdXtX0X>X@.&.*._ y $ a o.#.@.@.@.@.@.#.5Xo @ B x x N N N N I E E I 6 5 v.~.H.! x Q ) N F !.!.q.6 e 7.7.7.7.7.7.7.7.7.7.7.w ; qXJXJXHXJXKXnX@ /.~.^.!.!.^.!.!.^.!.!./.J.O _ ] [ o.@.UX>X5X6X0X. H.H.H.L.].].].].[.[.[.].}.^.|.u.u.0. f f f a =.=X-X:X>X,X,X,X,X,X,X,X,X>X,X,X,X5X5X6X0XtXIXIXgXdXdXIXqXqX6X6X5X,X,X,X>XKX ~.].^.].].].].].].].^.]./. s *._ _ ] [ o.o.@.@.UXUX-X-X>X>X,X,X5X5X6X0XqXdXgXzXcXCXAXGXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX0Xo ] 0X,Xh.[ _ *.s s 8 o a UX@.#.@.@.@.#.IX: $ B N N N N I I I E E e a v.!.H.u.r m.{.}.C.F R /./.7.# N w.7.7.7.7.7.7.7.7.7.w ; qXJXJXJXKXKXcX@ /.~.!.!.!.!.!.!.!.!.!.~.C.O _ ] [ o.@.=X-X5X6X0X x {.F.^.L.].].[.].[.].].].[.[. X|.|.u.7.g.q. _ f f _ y 5X5X5X6X6X5X6X5X5X5X5X5X0X6X0XqXIXdXgXgXgXgXgXIXIXIXqX0X6X6X5X5XKX ].].].].].].].].].].].].[. s *._ _ ] [ o.@.@.UX-X>X>X,X,X5X5X6X6X0XqXIXgXgXzXcXCXSXAXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXzXi - UXh.[ ` s y i p ; . x A o t =X@.@.#.#.xX; @ k x N N N N I I E N $ g.!.!.J.R ~ &X&X&X&Xm.w /.^.H.I # 7.7.7.7.7.7.7.7.7.7., ; zXJXJXJXKXKXcX. /.!.!.^.!.!.^.!.!.!.!.!.v.o _ ] [ o.@.UX-X5X6X0XUX H.~.].{.{.[.[.[.[.|.[.[.[.[.[.[.[.}.|..X|.u.u.q.q.q. _ f *.0X0X0X0X6X0X6XeX0X0XqXIXdXgXgXzXzXzXvXzXzXgXIXIXIXIXqX0X0XJX ].].].].].].].[.].].[.[.[. s ` _ ] [ o.O.#.=X-X,X,X5X6X6X0X0XqXIXIXIXgXgXzXcXCXSXAXDXGXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXGX,X t [ ] *.s s i a 3 C.!.u.k $ f UX#.#.AXy . D N N N I I I E I B D J.H.!.v.E 2.&X&X.X&XJ.< |.!.!.v.6 v 7.7.7.7.7.7.7.7.^ O t JXJXJXJXJXKXcX. /.!.!.!.!.!.!.!.!.!.!.~.v.O _ ] [ o.@.=.-X5X0XqXhX. {.L.F.].].[.[.[.].[.[.[.|.[.[.[.[.[.[.[.[..X.X|.|.}.u.q.7.. _ i wXwX0XwXqXqXIXqXdXdXgXgXzXcXcXcXcXPXcXzXzXzXgXgXdXdXIXJX ].].].].].].[.].].].].].|. s _ } ] o.O.@.=X-X>X5X6X0X0XIXIXIXdXhXgXzXzXcXcXCXSXAXDXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXnX_ ; t t p a : $ q.~.^.!.v.7.a o [ =.zX_ 6 N N N G I I E I 8 S ~.H.H.~.g.3 F.&X&X{.A N /.^.!.H.R 5 7.7.7.7.w.7.7.7.E ` JXJXJXJXJXKXcX@ /./.!.!.!.!.!.!.~.~.!.!.H.O _ ] [ o.@.UX>X,X6XtXIX M ].].].].].[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.[.].[..X|.}.u.5. f f qXqXIXIXdXgXgXgXvXvXcXcXCXCXCXcXCXcXPXcXzXzXbXkXjXJX ].].].].[.[.].].[.].].[.|. ` _ ] [ o.@.#.-X>X5X6X0XqXIXgXgXgXzXvXvXcXcXcXCXSXAXGXGXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXCXo.. 6 O O o B u.!.~.~.!././.v.6.= ; @.[ 6 G N N I I I E N 6 g.~.H.H.~.H.R B F ~ B R J.^.!.^.!.7.6 w.7.7.7.7.7.7.7.x : UXJXJXJXKXKXKXcX@ /.~.!.!.^.^.!.^.^.~.!.!.J.O _ } [ o.@.UX-X5X6XqXIX=X {.].{.[.[.[.[.[.[.|.}.[.[.[.}.[.|.[.[.[.[.[.[.[.[.[.|.XX X}.u.0. _ *.IXdXdXgXgXzXvXcXcXCXSXAXSXAXAXCXCXCXCXcXcXcXzXJX ].[.[.|.[.].].[.].|.[.].|. ` _ ] [ o.@.UX-X,X6X0XIXgXgXzXvXcXcXcXcXCXAXSXAXAXDXGXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXCX[ 4 v.q.S I 7.u.v.^.^.~.~.!.~.!.~.!.f.A & : $ x N N E I I E N # v.H.v.!.!.!.J.g.! 6.q.J.^.!.~.^.!.g.. 7.7.7.7.7.7.7.^ = ; bXJXJXJXJXKXKXnX@ /.!.^.~.^.~.~.^.~.~.^.!.v.o _ ] [ o.@.UX>X,X6XqXdXzX M X].[.[.}.].}.[.}.[.}.[.[.[.}.[.}.[.}.[.[.}.[.[.|.}.}.[.[..X Xu.q. *.dXdXgXzXzXcXcXVXCXAXAXAXAXAXDXAXAXAXAXSXCXnXJX ].[.[.[.[.].].[.[.[.].[.|. ` _ ] [ O.#.UX>X5X0XIXgXgXcXcXcXCXSXAXAXAXAXDXDXGXGXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXZX .w ].~.H.J.!.!.H.].~.H.~.~.~.~.~.~.^.!.u.z . 3 I N I I E E N = g.!.!.H.H.!.!.!.].H./.~.!.!.!.!.!.7.O 7.7.7.7.7.7.7.I _ JXJXJXJXJXJXKXcX. /.^.~.~.^.~.^.~.^.~.!./.J.O _ ] [ o.O.UX-X5X6XqXdXdX;X N .X].'.}.}.}.[.[.}.[.}.[.}.[.}.[.}.[.}.}.[.}.}.[.[.[.}.[.[.|. X}.q. IXdXgXgXzXzXCXCXAXAXAXGXGXGXGXDXDXDXDXLXAXSXJX ].[.].].|.[.[.[.].[.].[.[. ` ] ] o.O.UX=X,X6X0XIXgXvXcXCXSXAXAXAXAXAXGXGXGXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXCX[ 0 ^.^.^.^.^.H.A I v./.!.~.~.~.~.~.!.~.^.H.6.. $ N N I I I ! N , w.!.H.!.!.!.!.!.~.~.~.~.!.!.~.^.H.7.# w.7.7.7.7.7.^ 6 o 6XJXJXJXJXJXKXKXCX. |.^.^.^.^.^.~.^.^.^.^.^.J. _ ] [ o.@.=.-X,X6XqXdXhXgX-X G .X X[.}.}.}.}.}.}.}.[.}.[.[.}.[.}.}.}.}.[.}.[.}.}.}.[.[.}.}.}.}. *.tXqXgXgXzXcXCXCXAXAXAXGXGXGXKXGXGXGXLXGXLXJX ].[.[.[.[.[.[.[.[.|.[.[.|. ` ] ] [ @.#.-X,X6XqXdXzXcXCXSXAXLXGXGXGXGXKXKXKXKXJXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXCX[ w /.!.!.!.^.J.B , 6.H./.^.~.~.!.~.~.~.^.!.w 6 I N I I E I e N /.H.H.H.!.!.!.~.~.~.~.~.!.!.^.H.v e 7.7.7.7.7.7.N ` KXJXJXJXJXJXJXKXcX. |.^.^.^.^.^.L.^.^.^.^.^.C.. _ ] ] o.@.UX>X5X6XIXhXgXjXgX-X g P .X.X[.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.|.}.}.}.}.}.'.q. *.qXIXgXgXzXcXCXSXAXGXGXGXKXKXKXKXKXKXGXDXJX ].[.[.[.[.[.[.[.[.[.[.}.}. _ ] [ o.O.UX-X,X6XIXgXvXcXSXAXLXGXGXKXKXKXKXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXZX .D /.~.~.!.!.H.B ; [ : 1 6.~./.!.~.~.~.~.~.~.g.6 O B I I I I E B 6 J.H.H.H.!.!.!.!.~.~.!.~.~.~.~.f.% I 7.7.7.7.7.I $ ; dXJXJXJXJXJXKXJXGXnX@ |.^.^.L.^.^.^.].^.^.^./.J. _ ] [ o.@.UX-X5X6XqXdXgXgXgXhX#.:X g N .X.X.X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.u. eX0XIXgXgXcXcXCXAXAXGXGXKXJXKXJXKXKXKXGXJX ].[.[.[.[.}.[.[.[.[.[.[.}. _ ] ] o.@.UX>X,X0XIXgXcXVXSXDXGXKXKXKXKXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXZXo.5 /.~.~.!./.!.B t =.7Xy X B u./.^.!.~.~.~.~.!.7.. O B I N I ^ N , S H.!.H.!.!.!.!.!.!.~.~.~./.J.k 3 7.7.7.7.7.! * ;XJXJXJXJXJXJXJXJXKXcX. |.|.^.^.].^.].^.].^.^./.J. _ ] [ o.@.UX>X,X0XqXgXgXzXgXgXIXqXO.>X k g I .X.X.X.X}.}.}.}.}.}.}.}.}.}.}.}.}.XX}.}.}.}.}.}.}.}. X 5X6X0XIXIXgXcXcXSXAXGXGXKXKXHXKXJXJXKXHXJX ].[.[.}.|.[.[.[.}.}.[.}.}. _ ] [ o.@.UX-X5X0XIXgXcXCXAXGXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXZXo.0 ^.!.!.~.~.H.D t -X-X#.,Xa . A v././.!.!.!.^.H.N @ x E I I I x # 6.!.H.!.!.!.!.!.~.~.~.^.H.S 6 ! 7.7.7.7.^ 3 o.GXJXJXJXJXJXJXJXKXKXnX@ /.^.].].^.^.^.F.].^.^.].H. _ ] [ o.@.UX>X,X6XIXhXzXzXzXbXgXqX6X5X .] :X j h h N .X.X.X.X}. X}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.[. y ,X6X0XIXdXgXvXCXCXLXGXKXKXJXJXJXJXKXHXJX [.[.}.}.[.[.}.}.[.[.}.}.}. _ ] ] o.O.UX-X,X0XIXzXcXCXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXAXo.0 /.!.~.~.~.H.k t -X=XUX#.#.UX: & I v.|.~.~.!.~.H.k $ B E I E E B 6 A J.^.!.~.!.!.^.^./.v.x = N w.7.7.7.I 7 ] CXJXJXJXJXJXJXJXKXKXKXcX$ |.^.].^.].].].].].].^.].J.O _ ] ] o.O.UX>X5X6XIXhXzXzXzXzXgXIXqX6X,X>X=._ f s >X v h h G &X.X.X.X}.}. X}.}.}.}.}. X}. X}.}. X}.u.. >X,X5X0XqXgXzXcXCXAXLXGXKXKXJXJXHXJXHXJX [.}.}.[.[.[.}.}.}.}.}.}.|. _ ] [ o.@.UX>X5X0XIXgXcXAXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXHXAXo.9 ^.~.!.~.~.H.k t =X=XUX#.@.@.>XO.$ # 7.H./.^.!.!.J.x @ e I E E E B 6 k R v.H.!.!.J.u.A w 3 I 7.7.w.7.N $ O o.mXJXJXJXJXJXJXJXJXKXKXKXcX@ |.].].^.].^.].^.].^.].].F. _ ] [ o.@.UX>X5X6XIXgXzXvXvXvXzXgXIX0X5X,X-XUX@.O.o.i y i >X h h k N .X.X}.}.}.}.}.}. X X}.}.}. X X X =X>X,X5X0XtXgXvXcXSXAXGXGXKXKXKXJXJXHXJX [.}.}.}.}.}.}.}.}.}.}.}..X _ _ [ o.@.UX>X,X0XIXgXnXCXAXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXAXO.4 /.~.~.~.~.H.z t =X=X=.#.@.@.@.O.eXi k g.!.|.!.~.H.6.@ * x E E ^ N B 3 8 w B B 5 e w r ! 7.7.7.S B . o h.CXJXJXJXJXJXJXJXJXJXJXJXKXnX@ |.].].].].].].].].].].].J. _ ] ] o.@.UX-X5XeXtXgXzXcXcXcXzXgXIXqX0X5X>X-XUX=.O.o.o.[ [ i y p X,X6X0XIXgXcXCXSXGXGXKXKXKXKXJXKXJX [.}.}.}.}.}. X[.}.}.}.}. X _ } [ o.@.UX>X5X0XdXzXcXSXDXGXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXAXo.5 |.!.~.!.~.!.j t =X=XUX#.@.@.@.@.#.O.,Xt O v f./.^.^.!.u.< . 3 B I 7.^ I N B B B B N ^ 7.7.7.N w . i 6XDXJXJXJXJXJXJXJXJXJXJXJXJXKXcX@ |.|.].].].].].].].].].|.F. _ ] [ o.@.UX>X5XeXIXgXzXcXcXcXnXzXzXIXqX6X5X,X-XUX=.=.O.o.o.[ [ [ [ i :X P '. X}. X}.}.}. X}.}.}.}.}. O.=.UX>X5X6XqXgXzXcXSXAXGXKXKXJXJXKXKXJX }.}.}.}.}.}.}.}.}.}. X}. X _ ] [ o.O.UX>X5X0XIXzXcXSXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXAXO.4 H.~.~.~.~.H.B t =.UX#.#.@.@.@.@.#.#.UX=.-X; . A C.^.^.~.C.! 2 # e x N I ! ! ! ^ ! I N B 3 . y =XzXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXcX. .X].[.].].[.].].[./.].|.J. _ ] ] o.@.UX>X,X0XIXgXvXcXcXCXnXcXzXgXIXqX6X5X,X>XUXUXh.@.@.O.o.o.[ [ [ rX. sX}. X}. X}. X}. X}. X X[. o.@.UX-X>X6X0XIXgXcXCXAXGXGXKXJXHXJXKXJX {.}.}. X}.}.}.}.[. X[.}.}. ` _ [ o.@.=X>X5XeXIXgXcXSXAXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXAXO.2 H.~.~.~.~.H.M t =.UX#.@.@.@.#.=.UXUX=X=X=X-X$.; * ! J././.!.v.7.M ; & = , , # , , & X ; _ >XgXHXJXJXJXKXJXJXJXJXJXJXJXJXJXKXJXKXcX$ |.].].].[.].].].[.].[.].J. } ] [ o.@.UX-X5X0XIXgXvXnXCXZXCXCXcXzXgXIX0X6X5X,X,X-X-XUXUX@.@.O.O.o.o.,X ' X X}. X X X}.}. X}.}.}. [ O.@.UX-X5X6XIXgXzXcXAXAXGXKXJXHXJXKXJX [.}. X}. X}. X}. X}. X X X _ _ [ o.@.UX-X5X6XIXgXcXSXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXHXAXO.7 ~.~.!.~.~.H.B t =.UX#.#.#.#.=.UX=X=X-X-X-X-X=X,X[ $ 1 6.!./././.C.g.7.P 2 a a t ; .dXzXKXKXJXKXJXKXKXKXJXKXJXJXJXJXJXJXJXKXKXcX$ |.|.[.]./.[.[.].].[.].].H. _ ] [ o.@.UX>X5X6XIXzXvXnXBXZXCXCXcXnXgXgXIXqX0X6X5X,X>X>X-X=X=.#.@.@.@.O.6X .X X X}.}.}. X X}. X X[. [ o.O.UX-X>X6X0XIXzXcXCXAXGXKXKXJXKXHXJX [.}.[.}.}. X}. X}.}.}.|..X ` ] [ o.O.UX>X5X0XdXzXcXSXDXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXDX@.2 ~.!.!.~.~.!.v a =.UX=.#.#.#.UX=X-X-X>X>X>X>X>X>X-X5Xi o k u.^././././.6.& ; O.5X5X5X,X..: *.gXGXGXKXKXKXKXKXKXJXJXKXJXJXJXJXJXJXJXJXKXcX. .X/.[.].[.[.[.[.].[.}.|.F. _ ] [ o.@.UX>X5X0XIXgX_ } } } o.CXCXnXxXzXgXIXqX0X6X6X5X,X,X>X-X-XUXUXh.JXo. .X X}. X X X X X X X X X ] [ O.@.UX>X5X0XIXzXcXCXAXGXKXKXJXKXHXJX [. X X X}. X}.}. X X}.}..X _ ] [ o.@.UX>X5X0XIXzXcXSXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXAX@.5 !.!.^.!.!.H.z t =.UX=.#.#.UX=X-X>X>X,X,X,X,X,X,X,X,X-X>Xt X A f././.g.5 ; ;XgXxXxXcXbXaXo.o _ GXGXGXGXGXGXKXGXKXJXJXJXJXJXJXJXJXJXKXKXCX. X[.[.[.[.[.[.|.[.[.}.].F.O } ] ] o.@.UX-X5XeXqX*. 2.6.R [ o.CXmXzXzXgXIXqXqX0X6X6X5X5X,X,X:X>X:X[ q. X X X XXX X X X X}. X.X ] [ o.O.UX>X5X6XIXgXvXCXAXGXKXKXHXKXHXJX }.[. X X X}. X X}. X X}. X _ ] ] o.@.UX>X5X0XIXzXcXCXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXJXAX@.2 H.~.~.!.^.H.v t #.=X#.#.UXUX-X>X,X,X5X5X6X5X6X5X5X5X5X5X>XUX; # R C.! O [ gXjXgXjXgXdXIX5XV ; 6XDXAXDXDXGXGXGXKXKXJXJXKXJXKXJXJXJXKXKXnX@ |.|.[.[.[.[.[.[.[.[.[.}.J.O _ ] [ o.%.UX>X5X6X0X 7.}.}.XXq.Q [ [ [ lXzXjXhXIXtXwX0X0X6X6X5X5XkX[ 5X.X.X X X X X X}. X X X XF } [ .O.UX-X,X6XqXdXvXCXAXDXGXKXKXKXKXKX [. X X X X}. X X}. X}. X X ` ] [ o.@.UX>X5XeXdXzXcXSXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXAX@.5 !.~.!.~.!.!.z a #.=X#.UXUX-X>X,X,X6X6X0X0X0X6X0X6X6X5X6X5X5X,XO.& , 2 ; 5XdXdXhXgXgXaXrX-X] o o.SXSXAXAXAXDXGXGXGXKXKXJXJXJXJXKXJXJXKXnX$ .X].[.[.[.[.[.[.[.[.[.}.F. _ ] ] o.@.=.>X5X0X0X. L.F.{.'..X X8.8.Q [ [ [ [ ] IXtXtXqX0X0XKX .] B.*X X X X X X X X X X X X X p _ ] [ O.#.-X>X6XqXgXzXcXAXAXGXGXKXKXGXJX [. X X}. X}. X X X X X X X _ ] [ o.O.=X>X5XeXIXgXcXCXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXDX@.1 H./.!.!.^.!.B t =.=X#.UX=X-X>X,X5X6X0XqXqXIXqXqXqX0X0X6X6X0X6X5X#.y t qXIXdXgXdX0X-X@.O._ : V nXCXCXCXCXAXDXGXGXKXKXKXJXJXJXJXJXKXKXnX. .X|.[.}.}.[.[.[.|.[.}.}.H. _ ] { o.@.=.:X5XeX0X F.L.{.'.}. X.X.X.X7.8.8.2.Q .[ [ [ [ [ [ O 8.q.*X'. X}. X X X X X X X X X.X _ _ [ [ O.#.=X,X6XqXgXcXcXCXGXGXKXKXJXKXJX X X X X X X X X X X X X.X ` ] ] o.O.UX>X5X0XIXzXcXCXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXDX@.1 H.!.!.^.!.H.v t $.=XUXUX=X-X>X,X6X0XqXIXdXhXdXdXIXIXIXqX0X0XdXGXo.; t qXdXaX0X>X#.' _ _ i o i zXvXcXCXCXCXAXAXGXGXKXKXKXKXJXJXJXKXKXcX@ .X}.}.}.[.}.}.[.}.}.}.|.H. _ ] [ o.@.h.>X5XeX0X. I.L.{.'.XX X X X X&X.X.X.X.Xq.8.Q Q 5.2.! 8.q.&X&X.X X.X.X X X X X X X X X}.G _ _ ] [ O.@.-X>X5XqXdXcXcXAXGXGXKXKXKXKXJX XX X X X X X X X X X X X.X _ ] [ o.@.UX-X5X0XIXzXcXSXAXGXGXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXDX=.1 v./.!.~.^.H.v t @.=.UXUX-X-X>X5X6XqXIXhXgXgXzXzXgXhXhXdXgXKXUXi - z e a >X6X,XUX&.*.*.s s t : ] gXzXzXcXcXCXCXAXAXGXGXKXJXJXJXJXJXJXKXcX$ .X|.}.}.}.}.}.}.[.}.}.}.H. _ ] [ o.@.=X-X5XeX0X H.L.{.'.}. X X X X.X X.X X X&X.X&X&X.X&X&X.X.X X X X.X X X X X X.X X X X X&X t _ _ ] o.O.@.-X,X6X0XgXzXCXAXAXGXKXJXKXKXJX }. X X X X X X.X X X X X.X ` ] [ o.@.UX>X5X0XqXzXcXSXAXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXGXUX1 H.^.!.~.~.H.z y @.=XUXUX-X>X,X5X0XqXdXgXzXzXvXvXzXzXgXJX0X_ t 4 6.v.E O _ >X@.] *.i i s t : ; UXIXdXgXgXzXcXCXCXAXGXGXKXKXKXJXJXJXKXKXcX. .X|.}.}.}.}. X}.}.}.}.}.H.O _ ] [ o.@.UX>X5X0X0X L.L.{.XX X X X X X X X X X.X.X.X X.X.X X.X X.X.X X X X X X.X X X.X.X X.X&XF ` _ _ [ [ O.#.-X>X6X0XgXzXcXAXGXGXKXKXKXKXJX X X X X X X X X X X X X.X _ } [ o.O.=.>X5X0XIXzXcXSXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX=.1 H.^.~.~.~.!.v t #.=XUX=X-X>X,X6X0XIXgXzXcXcXcXnXcXDXnXO.t 3 R v.~.|.J.8 o ' o.` y i i i ; . p 0XqXIXIXgXgXzXcXcXAXAXDXGXKXKXKXKXJXKXKXcX. .X|.}.}. X}.}.}.}.}.[. XF.O _ ] [ o.O.=X>X,X6X0X I.L.'. XXX X X X X X.X.X X X.X X X.X X X X X.X X X X X.X.X X.X X X X.X&XF t _ _ ] [ o.O.#.-X,X6XqXgXzXCXSXAXGXKXJXKXKXJX }. X X X X X X X X X X X.X ` ] [ o.@.UX-X5X0XIXzXcXSXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXHXHX;.1 J.^.~.~.~.H.B t $.=X=.UXUX>X,X6X0XIXgXzXcXcXSXAXKX-Xi = N g.!./.~.~.!.g.# . a p t t a : a =X6X0X0XqXIXgXgXvXCXCXAXDXGXGXJXJXJXKXJXJXcX@ .X X}. X}.}.}. X X}. X XF.O _ ] [ o.@.UX-X5X0X0X. I.L.XX'.'. X X X.X X X.X.X X X.X.X X X X.X.X X.X X.X.X X X X$X.X X.X.XF p _ ` _ ] ] o.O.UX-X,X6XIXgXzXVXAXGXGXKXKXKXKXJX X.X X.X X.X X.X X&X X X.X _ ] [ o.@.=X>X5X0XdXbXnXCXGXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXHXKX=X, J.!.!.~.~.!.x t @.=X=.=X;X>X,X6X0XdXgXcXcXSXJX0X] a w u.J./.^.!.~.~.~.!.u.3 . . . i @.5X5X6X0X0XIXIXgXzXcXCXSXLXGXGXKXJXKXJXKXKXnX. .X|. X}. X}. X}. X}. X XF. _ ] [ o.@.UX-X5X6X0X ~ XX X'.XXXX X X.X X$X X X&X X X$X&X X&X X X X X.X X X X.X X.X.X.X&XA . y _ _ _ _ ] [ o.O.UX>X,X0XIXgXnXCXAXDXKXKXJXHXKXJX X.X X&X X X X.X X X.X.X.X _ ] [ o.@.UX>X5X0XIXzXcXSXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXHX;X# J.!.!.~.~.!.v t @.=XUXUX;X>X,X6X0XIXbXxXGXzX@.t 6 R C./.!.!.!.~.~.~.~././.7.@ a y ` .UX,X5X5X5X6X0XqXIXaXzXcXVXAXAXGXKXKXKXKXJXJXKXCX@ .X}.}.}.}. X X X}. X}. XF.O ] ] [ o.#.UX>X5X0X0XO. b E &X&X&X X X.X.X X&X.X X X X X X X X X&X.X X.X X X.X.X.X&X.X*XP y ] _ _ _ ] [ o.O.=.UX,X5X0XdXgXcXSXAXGXKXKXJXKXKXJX X X.X X X.X X X.X.X X X.X _ ] [ o.@.UX>X5X0XIXzXcXSXDXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXGX-X1 H./.!.~.^.H.v t @.=X=X=X-X>X,X6X0XhXcXDXUXi # A v.!./.!.!.!.^.!.!.~./.J.x 1 t _ @.UX-X>X>X>X,X,X5X5X0X0XIXdXzXcXcXSXAXGXGXGXJXJXKXJXKXcX@ &X&X.X&X.X|..X.X&X.X&X.X[.O ] ] [ O.@.UX>X5X0XtXdX@.@. v v ~ &X&X&X&X&X&X X.X.X.X.X X&X&X X X X.X.X&X X&X&X&XP v V y _ _ _ _ ] ] [ O.=.UX>X,X6XqXgXvXcXSXDXGXKXJXKXHXKXJX &X&X&X&X&X&X&X&X&X&X&X&X&X ] ] o.o.@.=X,X5X0XdXzXcXSXDXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXHX-X6 v.^.!.!.~.!.B p @.=X=XUX;X>X,X6X0XJX>X_ ; k u.H./.~.~.!.^.~.!.!./.!.I 5 = i @.>X>X>X>X>X>X>XX5X0XIXdXgXgXO.O.UX M M F F F ~ &X&X&X&X&X&X&X&X&X&X&X&X&X&X&XP M M y y p ] ] ] _ ] ] [ o.O.h.UX>X5X0XIXgXcXCXAXGXGXKXJXJXJXHXJX M M v M F F m M F m n M F ] ] o.O.#.UX>X5XqXIXzXcXSXDXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXKX-X, J.!.!.~.~.H.M y O.=XUX=X;X>X,XJX7X] a 9 q.v./.~.~.~.~.!.~.~././.7.k , p o.-X,X>X>X-X-X>X>X>X,X,X5X6X0XIXIXgXzXcXCXSXLXGXGXKXJXJXKXJXKXCXUX=.@.=.o.[ [ ] *.*.y y p y i ] [ o.O.#.UX,X5X0XIXhXgXgXgXgXIXo.[ ] _ ` =. m m F m M M F F m n m M M F M i y V [ [ ] ] ] ] ] ] [ o.O.@.UX-X,X6XqXIXzXcXCXLXGXKXKXKXKXKXKXKX=XUX=.O. . .[ } _ *.s y u p p ] [ o.O.@.-X,X6X0XIXzXcXSXDXGXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXHXHX-X, C.!.!.~.~.H.M t @.;XUXUX-XIXxX] t 6 E f.|./.~.!.~.~.~.~.~./.f.v 6 t ] UX,X>X-X-X-X-X-X-X>X>X,X5X5X0X0XIXIXzXzXcXCXAXAXGXGXKXJXKXJXKXKXGXDXAXnXzXgXtX5X,X-XUX=.O.o.[ [ [ o.o.@.UX-X,X5X0XqXhXzXzXgXgXIX0X5X,X-X=X$.*.i i i y y p y i y i i i y i y i .o.[ [ [ [ ] ] ] [ [ o.O.@.UX-X>X5X0XIXgXzXCXSXLXGXKXJXJXJXKXKXGXLXSXcXzXhXqX7X,X-X=.@.o. .[ [ [ o.o.@.UX-X,X6XqXgXzXcXAXAXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXHX>X# C./.!.!.!.H.m a O.=XUX5XGX[ y - v g.~./.~.~.!.~.!.~.~./.!.I 4 a _ UX,XX-X-X-X-X-X-X-X>X,X,X5X0X0XqXIXgXzXcXCXSXAXGXGXGXKXKXJXKXJXGXGXAXCXnXzXgXqX6X5X>XUXh.O.+.o.[ o.O.O.#.UX>X,X6XqXdXhXzXzXgXgXIX0X6X5X>X;X=.$.O.+.o.o.o.o.| | o.[ o.o.o.o.[ o.[ [ [ [ [ [ [ [ [ o.o.O.@.UX-X>X5X6XIXdXzXcXCXAXGXKXKXKXJXJXJXJXGXLXAXCXzXgXIX6X5X-X=X@.@.o.o.o.o.o.@.=.UX>X,X6XqXhXvXCXSXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXHX:X6 v.~.~.~.~.~.N t =.=XJX@.y a 0 w.H./.~.~.~.~.~.!.!./.!.7.5 3 *.@.,X,X,X>X-X-X-X-X=X-X>X>X,X5X5X6X0XqXIXgXzXcXVXCXAXGXGXGXGXKXKXJXJXJXKXGXDXAXcXzXgXIXtX5X>X-XUX@.@.O.O.O.O.@.UX-X>X5X0XqXdXgXzXzXzXgXIXqX0X5X>X-X=X#.@.O.O.O.o.o.o.o.o.o.o.o.o.o.o.| o.o.[ [ [ [ [ o.o.o.@.@.UX=X>X,X6X0XIXzXcXCXSXLXGXKXKXJXJXKXJXKXGXDXAXCXvXgXtX0X5X,X-XUX@.@.O.O.O.O.#.UX-X>X5X0XIXgXzXCXSXGXGXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXGX:X, v././././.^.m t gXeXs a 1 6.C././.!.!.^.!.!.!.^./.u.M 6 t o.>X,X,X>X>X-X-X-X-X=X-X-X>X,X,X5X6X0XIXIXgXgXcXcXCXAXAXGXKXKXKXJXKXKXKXJXKXGXGXAXcXcXgXdXqX6X,X>X-XUX=.h.@.@.UXUX-X>X,X6X0XIXgXzXzXzXzXzXgXIX0X6X5X>X-XUXUX@.@.@.@.O.O.O.o.+.O.o.O.o.o.o.o.o.o.o.o.o.o.O.@.@.#.UX-X>X5X6X0XIXgXvXcXCXAXGXKXKXKXJXKXKXJXKXGXGXAXCXcXgXhX0X6X,X>X-XUXh.=.@.=.=.UX-X>X,X6X0XdXzXcXCXAXGXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXX>X-X-X=XUXUXUX-X-X>X,X,X5X6X0XIXdXgXzXcXcXCXAXAXDXGXKXKXKXJXJXJXJXJXKXKXGXAXCXcXzXgXIX0X5X,X>X-X-XUXUXUXUX-X>X,X6X0XIXdXzXzXcXcXcXzXzXIXIX0X6X,X,X-X-XUX=.=.h.@.@.%.@.O.O.O.O.O.O.O.@.O.O.O.O.@.@.@.#.UX-X>XX-X-XUXUXUXUX-X>X,X5X0XqXgXzXcXSXAXDXKXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXX>X-X-XUX=X=XUX-X-X-X>X,X6X6XqXqXIXgXzXcXcXCXAXAXGXGXKXKXJXJXJXJXJXKXKXKXKXGXDXSXcXcXgXdXIX6X5X,X,X>X-X>X>X>X,X,X5X6XqXIXgXzXcXcXcXCXcXzXzXIXIX0X6X5X,X>X-X-XUXUXUXUX#.#.#.#.#.#.=.=.=.h.=.@.UXUXUXUX=X-X>XX>X-X>X>X,X,X5X0XqXIXzXcXcXSXAXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKX,X $ t O.-X>X=XO.a A /.^.!.!.^.!.!.!./.^.7.g 6 y O.X-X-X-X=X=X=X=X=X-X-X>X,X5X5X6X0XIXdXgXzXcXcXSXAXAXLXGXGXKXKXKXJXJXKXJXJXJXJXKXGXDXAXCXcXcXgXIXIX0X6X5X,X5X,X5X5X5X6X0XIXdXgXvXcXcXCXCXSXcXcXzXzXgXIXtX0X6X5X,X,X>X>X-X-X-X-X=X-X=X=XUX-XUXUXUX-X=X-X-X>X>X,X,X5X0X0XIXdXgXzXcXCXSXAXGXGXKXKXJXJXJXJXJXJXKXKXGXGXAXCXcXzXgXdXIX0X6X5X5X,X,X5X5X5X6X0XIXIXgXzXcXCXAXGXKXKXHXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJX>X p ,XbXzXdXgXIX>Xa @ u./.!.!.!.~./.^.g.c 6 t ] -X5X,X>X>X-X-X;XUX=X=X=XUX-X-X>X>X5X6X6XqXIXdXgXvXcXCXSXAXDXGXGXKXKXKXJXJXJXJXJXJXJXJXKXKXKXGXAXAXCXcXzXgXdXIXqXtX6X6X6X6X0X0XqXIXdXgXzXcXcXAXSXAXAXSXCXcXcXzXgXIXIX0X0X6X6X5X5X5X,X,X>X,X,X>X>X>X>X,X>X>X>X,X,X,X,X5X6X6X0XqXdXhXzXvXcXCXAXDXGXHXKXKXJXJXJXJXJXJXJXKXKXKXGXAXAXCXcXzXgXdXIX0X0X6X6X6X6X0X0X0XIXIXgXzXcXVXCXAXGXKXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXAXO.: >XcXzXdXgXdXdXqX@.O g !.~.!.!./.H.N 1 6 ` #.5X,X>X>X-X-X-X=XUXUX=XUX-X-X-X>X,X5X5X0XqXIXgXgXcXcXcXSXLXGXGXGXKXKXJXJXJXJXJXJXJXJXJXKXJXJXKXGXGXAXSXVXcXzXzXgXIXIXIXIXIXIXIXIXIXgXgXcXcXVXSXAXAXAXAXAXAXCXcXcXzXgXgXdXIXIX0X0X0X6X6X6X6X5X5X5X5X5X5X5X5X6X6X5X6X6X0X0XqXIXIXhXzXzXcXcXSXSXAXGXGXKXKXJXJXJXJXJXJXJXJXJXJXKXGXGXAXAXCXcXcXzXhXhXIXIXqXIXqXIXIXdXgXzXzXcXCXAXAXGXGXKXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXgXp V zXvXgXgXdXgX0X5XUXa , v.~.^.!.A 3 6 y O.>X>X>X-X-X-X-XUX=X=X=X=X=X-X-X>X>X5X5X6X0XIXIXgXzXcXcXCXAXAXGXGXGXKXKXKXJXKXJXJXJXJXJXJXJXJXJXKXKXKXGXGXAXSXCXcXcXzXzXgXgXdXgXgXgXgXzXzXcXcXCXSXAXLXLXGXLXGXAXAXSXCXcXcXzXzXgXgXdXIXIXIXqXqXtXqX0XwX0X0XqXqX0X0XqXqXqXIXIXIXgXgXgXzXvXcXCXSXAXDXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXKXKXGXGXAXAXCXcXvXvXzXgXgXgXgXgXgXgXzXzXcXcXCXCXAXGXGXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXwX: o.vXgXjXgXgX6X=X@.o.t $ w.|.6.4 , t ] UX>X>X-X-X-X=X=X=XUXUX=X=X-X-X>X>X,X5X6X6XqXIXIXgXzXcXCXSXAXAXGXGXGXKXKXJXJXKXJXJXJXJXJXJXJXJXJXKXJXKXKXKXGXGXAXAXAXCXcXcXcXcXzXzXzXzXcXcXcXCXCXSXAXLXGXGXGXGXGXGXGXAXAXSXCXcXcXcXzXzXzXgXgXgXhXhXIXgXdXdXdXdXIXdXdXdXdXgXgXgXgXzXvXcXcXCXSXSXAXDXGXKXKXKXKXJXJXJXJXJXJXJXJXJXJXKXKXKXGXGXGXAXSXCXCXcXcXcXcXzXzXzXvXcXcXcXCXCXAXAXAXGXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJX0X$ O.gXdXIX0X>X@.| _ _ a @ A B 5 a *.@.-X-X-X-X-X-X=X=XUX=X=XUX=X-X-X>X,X5X5X6X0XqXIXgXgXzXcXCXCXAXDXGXGXKXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXKXGXGXGXAXSXCXCXCXcXcXCXCXcXCXCXSXSXAXAXGXGXGXKXKXKXKXGXGXGXGXAXAXAXCXcXCXcXcXcXvXcXzXzXzXzXzXzXzXzXzXzXzXzXzXzXxXvXnXcXCXCXAXAXSXLXGXGXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXKXDXDXLXSXSXCXCXCXCXcXCXCXCXCXAXAXAXAXLXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXhX; _ dX6X>X#.[ ` *.i i ; . @ - y o.UX=X-X=X=XUXUX=X=XUX-XUX-X-X-X>X,X,X5X6X0XqXIXgXgXzXcXVXCXAXAXGXGXGXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXGXGXGXGXDXAXAXAXAXSXCXAXAXAXAXGXGXGXGXKXKXKXKXJXKXKXKXKXGXGXGXAXAXAXAXSXCXCXCXcXCXcXcXcXcXcXcXcXcXcXcXcXCXVXVXCXCXSXSXAXDXLXGXGXKXKXHXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXKXGXGXGXDXAXAXSXSXSXAXAXSXAXAXAXAXGXGXGXGXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXcX_ - -X-XO.] *.s i u a o p ] #.=X=X=X=X=X=X=X=X=X=X=XUX-X-X>X>X,X5X6X6X0XIXIXgXzXvXcXCXSXAXDXGXGXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXKXKXGXGXGXGXGXGXAXGXDXGXGXGXGXGXGXKXKXKXKXKXJXKXJXJXKXKXKXGXGXGXGXDXAXLXAXAXAXSXAXAXSXAXSXCXCXCXCXSXCXAXSXAXAXAXAXDXGXGXGXGXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXGXGXGXGXGXDXDXLXAXGXDXGXGXGXGXGXGXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXGX>X. i O.[ *.s *.i t : O i #.-X=X=X=X=X-X=X=X=X=XUX=X-X-X>X>X,X5X5X6X0XIXdXgXgXzXcXcXCXAXAXGXGXGXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXJXKXKXKXKXKXKXGXGXGXGXGXGXGXGXGXKXKXKXKXKXJXJXJXKXJXJXKXJXJXKXKXKXKXGXGXGXGXLXGXGXGXGXAXDXAXGXGXGXLXGXAXGXAXDXDXGXLXGXHXGXKXKXKXJXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXHXJXKXKXKXKXGXGXGXGXGXGXGXGXGXKXKXKXKXKXKXJXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXcX] t i *.s y a : y -X-X-X-X=X-X=X=X-X=X-X-X-X>X>X>X,X,X5X6X0XqXIXdXgXvXcXcXCXAXAXDXGXGXGXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXKXJXKXKXKXKXKXKXKXGXKXKXKXKXJXKXKXJXKXKXJXJXJXJXJXJXJXJXKXKXKXKXKXKXKXKXGXGXGXGXGXGXKXGXGXGXKXKXGXGXGXGXGXHXGXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXHXKXKXKXKXKXGXKXKXKXKXKXKXKXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXgX[ O & & o . o V #.>X-X-X-X-X-X=X-X-X-X>X-X>X>X,X,X5X6X0XqXIXdXhXzXcXcXCXSXSXAXDXGXKXGXGXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXKXJXKXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXJXKXJXKXKXKXKXKXKXKXKXKXKXKXKXKXKXGXKXKXKXKXKXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXHXJXJXJXJXJXJXKXKXKXJXKXKXJXKXJXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX", "JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXKXKXGXcX-X] i p i ` O.>X5X,X>X>X>X-X-X-X-X>X>X>X>X,X5X5X6X0XqXqXIXgXzXzXcXcXCXCXLXLXLXGXKXKXKXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXKXJXJXJXJXKXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXJXKXJXKXKXJXJXJXJXKXJXJXJXJXKXJXKXKXKXJXJXJXHXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXKXJXJXJXJXKXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX" }; bist-0.5.2/images/flu_pixmaps.hpp0000644000175000017500000001631711172112012015340 0ustar cagecage// $Id: flu_pixmaps.hpp,v 1.1 2004-08-09 19:14:42 cage Exp $ /* **************************************************************** * FLU - FLTK Utility Widgets * Copyright (C) 2002 Jason Bryan, Ohio Supercomputer Center, Ohio State University * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * To contribute, advise, suggest, berate, recommend, criticise, * or otherwise communicate with me: jbryan@osc.edu * Ohio Supercomputer Center * 1224 Kinnear Rd * Columbus, Ohio 43212 *************************************************************** ----------------------------------------------------------------------- This library depends on the following GPL free libraries: FLTK This library also uses OpenGL, which is a registered trademark of Silicon Graphics, Inc. (SGI), and Doxygen, a free HTML page generator for documentation of C++ classes. This library is hereby distributed under the same LGPL license as FLTK. Have fun with it! ----------------------------------------------------------------------- FLTK License December 11, 2001 The FLTK library and included programs are provided under the terms of the GNU Library General Public License (LGPL) with the following exceptions: 1. Modifications to the FLTK configure script, config header file, and makefiles by themselves to support a specific platform do not constitute a modified or derivative work. The authors do request that such modifications be contributed to the FLTK project - send all contributions to "fltk-bugs@fltk.org". 2. Widgets that are subclassed from FLTK widgets do not constitute a derivative work. 3. Static linking of applications and widgets to the FLTK library does not constitute a derivative work and does not require the author to provide source code for the application or widget, use the shared FLTK libraries, or link their applications or widgets against a user-supplied version of FLTK. If you link the application or widget to a modified version of FLTK, then the changes to FLTK must be provided under the terms of the LGPL in sections 1, 2, and 4. 4. You do not have to provide a copy of the FLTK license with programs that are linked to the FLTK library, nor do you have to identify the FLTK license in your program or documentation as required by section 6 of the LGPL. However, programs must still identify their use of FLTK. The following example statement can be included in user documentation to satisfy this requirement: [program/widget] is based in part on the work of the FLTK project (http://www.fltk.org). */ /* XPM */ static const char* folder_open_xpm[] = { "20 16 34 1", " c None", ". c #A68A5E", "+ c #FEF3A7", "@ c #FEECA1", "# c #FEE49A", "$ c #FEDD94", "% c #FED68E", "& c #FEF6A9", "* c #FEEEA3", "= c #FEE79D", "- c #FEDF96", "; c #FED890", "> c #FEF1A5", ", c #FEE99F", "' c #FEE298", ") c #FEDA92", "! c #FEF0A5", "~ c #FEEBA1", "{ c #FEE69C", "] c #FEE198", "^ c #FEDC93", "/ c #FED78F", "( c #54452F", "_ c #FEF2A6", ": c #FEEDA2", "< c #FEE299", "[ c #FEE99E", "} c #FEDE95", "| c #FED991", "1 c #FEEFA4", "2 c #FEEA9F", "3 c #FEE59B", "4 c #FEE096", "5 c #FEDB92", " ", " ..... ", " .+@#$%. ", " ......&*=-;%%. ", " .&&&&&>,')%%%. ", " .&&&&+@#$%%%%. ", " .&&............ ", " .&&.&!~{]^/%%%.( ", " .&&._:=<$;%%%%.( ", " .&.+*[#}|%%%%.( ", " .&.12345%%%%%.( ", " .!~{]^/%%%%.( ", " ............( ", " (((((((((((( ", " ", " "}; /* XPM */ static const char* folder_closed_xpm[] = { "20 16 44 1", " c None", ". c #A68A5E", "+ c #54452F", "@ c #FEE89E", "# c #FEE59B", "$ c #FEE298", "% c #FEDE95", "& c #FEDB93", "* c #CEAB75", "= c #FEF6A9", "- c #FEF2A7", "; c #FEEFA4", "> c #FEECA1", ", c #FEE99E", "' c #FEE69C", ") c #FEE399", "! c #FEDF96", "~ c #FEDC93", "{ c #FED991", "] c #FED68E", "^ c #FEF3A7", "/ c #FEF0A4", "( c #FEEDA2", "_ c #FEE99F", ": c #FEE097", "< c #FEDD94", "[ c #FEDA91", "} c #FED78E", "| c #FEF0A5", "1 c #FEEA9F", "2 c #FEE79D", "3 c #FEE49A", "4 c #FEE197", "5 c #FEDA92", "6 c #FED78F", "7 c #FEEEA3", "8 c #FEEAA0", "9 c #FEE198", "0 c #FEDB92", "a c #FED88F", "b c #FEEBA0", "c c #FED890", "d c #FEE299", "e c #FED990", " ", " .....+ ", " .@#$%&.+ ", " ......*******. ", " .=-;>,')!~{]].+ ", " .^/(_'):<[}]].+ ", " .|(1234<56]]].+ ", " .78239%0a]]]].+ ", " .b@#$%&c]]]]].+ ", " .@#d!~e]]]]]].+ ", " .')!~{]]]]]]].+ ", " .):<[}]]]]]]].+ ", " ..............+ ", " ++++++++++++++ ", " ", " "}; /* "20 16 29 1", " c None", ". c #9E9E02", "+ c #222202", "@ c #FEFECE", "# c #FEF2C2", "$ c #FEEABA", "% c #FEDEAE", "& c #FEDAA6", "* c #CECE62", "= c #FEFECA", "- c #FEFACA", "; c #FEF6C6", "> c #FEEEBA", ", c #FEE6B6", "' c #FEE2B2", ") c #FEDAAA", "! c #FEEEBE", "~ c #FEEAB6", "{ c #FEE6B2", "] c #FEE2AE", "^ c #FEDEAA", "/ c #FEFAC6", "( c #FEF6C2", "_ c #FEF2BE", ": c #FED6A2", "< c #FED6A6", "[ c #FED2A2", "} c #FED29E", "| c #FECE9E", " ", " .....+ ", " .@#$%&.+ ", " .*******...... ", " .@@=-;#>$,'%)*+ ", " .@@-;#!!~{]^)*+ ", " .@-/(_>$,']^)*+ ", " .@-;#!$,{')&:*+ ", " .@/(#!~,]])<:*+ ", " ./;#!$,'')&<[*+ ", " .;#_>${]%)<}}*+ ", " .##!${'%^<:[|*+ ", " .*************+ ", " ++++++++++++++ ", " ", " "}; */ static const char* plus_xpm[] = { "15 15 4 1", " c None", ". c #444444", "+ c #FFFFFF", "@ c #000000", " ", " ", " ........... ", " .+++++++++. ", " .++++@++++. ", " .++++@++++. ", " .++++@++++. ", " .+@@@@@@@+. ", " .++++@++++. ", " .++++@++++. ", " .++++@++++. ", " .+++++++++. ", " ........... ", " ", " "}; /* XPM */ static const char* minus_xpm[] = { "15 15 4 1", " c None", ". c #444444", "+ c #FFFFFF", "@ c #000000", " ", " ", " ........... ", " .+++++++++. ", " .+++++++++. ", " .+++++++++. ", " .+++++++++. ", " .+@@@@@@@+. ", " .+++++++++. ", " .+++++++++. ", " .+++++++++. ", " .+++++++++. ", " ........... ", " ", " "}; bist-0.5.2/images/lb_delete_selected.xpm0000644000175000017500000000365511025523004016622 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_delete_selected_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 38 1", " c black", ". c #060606", "X c #090909", "o c gray4", "O c #0E0E0E", "+ c gray7", "@ c #151515", "# c #181818", "$ c #191919", "% c gray11", "& c gray12", "* c #232323", "= c #2A2A2A", "- c gray19", "; c #393939", ": c #3F3F3F", "> c #414141", ", c #4B4B4B", "< c #535353", "1 c gray33", "2 c #5B5B5B", "3 c #606060", "4 c gray40", "5 c DimGray", "6 c #6F6F6F", "7 c gray50", "8 c #8B8B8B", "9 c #8E8E8E", "0 c gray58", "q c #959595", "w c #9D9D9D", "e c gray64", "r c gray65", "t c #B7B7B7", "y c gray72", "u c #C0C0C0", "i c LightGray", "p c gray100", /* pixels */ "uuuuuuuuuuuuuuuuuuuuuu", "uuuuuuuuu uuuuuuuuu", "uuuuuu3X@::::+O3uuuuuu", "uuuu3O@7: :5++2uuuu", "uuuu.2ip piii it*.yuuu", "uuuu+&::ppppii::&Xqtuu", "uuuu<+ip::::::t9X&4ruu", "uuuur.::iiii9t::.;4ruu", "uuuuy+ip::::::94X,9yuu", "uuuuu+iptii9tt94X1wuuu", "uuuuu+iptii9tt94X1wuuu", "uuuuu+iptii9tt94O1wuuu", "uuuuu+iptii9tt94X1wuuu", "uuuuu+iptii9tt94X1wuuu", "uuuuu+iptii9tt94X1wuuu", "uuuuu+iptii9tt94XX1wuuu", "uuuuu+@etii9tt2XX1wuuu", "uuuuuw=$+@@O++O$-1wuuu", "uuuuur6,;------;,6ruuu", "uuuuuyr8411111149ryuuu", "uuuuuuuyrwwwwwwryuuuuu" }; bist-0.5.2/images/lb_draw_double_bond.xpm0000644000175000017500000000717711025523004017004 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_draw_double_bond_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 117 2", " c black", ". c #010101", "X c gray2", "o c #060606", "O c #070707", "+ c gray3", "@ c #090909", "# c gray4", "$ c #0B0B0B", "% c #0C0C0C", "& c gray5", "* c #0E0E0E", "= c gray6", "- c #111111", "; c #1B1B1B", ": c gray11", "> c #1D1D1D", ", c #1E1E1E", "< c gray12", "1 c #202020", "2 c gray13", "3 c #232323", "4 c gray14", "5 c #252525", "6 c gray15", "7 c #272727", "8 c #282828", "9 c gray16", "0 c #2A2A2A", "q c gray17", "w c #2D2D2D", "e c gray18", "r c #2F2F2F", "t c gray19", "y c #313131", "u c #323232", "i c gray20", "p c #343434", "a c #353535", "s c gray21", "d c #373737", "f c gray22", "g c #3A3A3A", "h c #3C3C3C", "j c gray24", "k c #3E3E3E", "l c gray26", "z c #434343", "x c #444444", "c c gray27", "v c #4B4B4B", "b c #4C4C4C", "n c gray30", "m c #4E4E4E", "M c gray31", "N c #505050", "B c #515151", "V c #535353", "C c gray33", "Z c #555555", "A c #565656", "S c #585858", "D c gray37", "F c #5F5F5F", "G c #606060", "H c #646464", "J c #656565", "K c #6A6A6A", "L c #6C6C6C", "P c gray43", "I c gray44", "U c #727272", "Y c gray46", "T c #767676", "R c #777777", "E c gray47", "W c #797979", "Q c #7B7B7B", "! c #7C7C7C", "~ c gray49", "^ c #7E7E7E", "/ c gray52", "( c #868686", ") c gray54", "_ c #8B8B8B", "` c gray55", "' c gray58", "] c #959595", "[ c gray59", "{ c gray60", "} c #9D9D9D", "| c #A0A0A0", " . c #A2A2A2", ".. c gray64", "X. c #A4A4A4", "o. c #A5A5A5", "O. c gray65", "+. c #A7A7A7", "@. c gray66", "#. c #A9A9A9", "$. c gray67", "%. c #ACACAC", "&. c gray68", "*. c #AEAEAE", "=. c #AFAFAF", "-. c gray69", ";. c #B2B2B2", ":. c gray71", ">. c gray72", ",. c #B9B9B9", "<. c gray73", "1. c #BBBBBB", "2. c #BCBCBC", "3. c gray74", "4. c gray", "5. c gray75", "6. c #C0C0C0", /* pixels */ "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.3.3.3.", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.:.[ Q | ", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.-.U @ F ", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.-.K & Z ", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.=.K o 3 M ", "6.6.6.6.6.6.6.6.6.6.6.6.6.6.=.H o > t v ", "6.6.6.6.6.6.6.6.6.6.6.6.3.=.F o > r x L ", "6.6.6.6.6.6.6.6.6.6.6.3.$.F o 3 r d H [ ", "6.6.6.6.6.6.6.6.6.6.3.O.Z @ 3 r 4 q ( =.", "6.6.6.6.6.6.6.6.6.3.$.Z @ 4 t 4 t _ =.", "6.6.6.6.6.6.6.6.3.O.M @ 3 t 4 r Q O.", "6.6.6.6.6.6.6.3.O.v @ 4 r 3 @ t L O.", "6.6.6.6.6.6.3.| v @ 4 t 3 @ 4 j L $.", "6.6.6.6.6.3.| l & 4 t 3 @ 3 d M ( -.", "6.6.6.6.1.} x & 4 r 3 @ 4 d M Y | 3.", "6.6.6.3.[ j & 4 r 3 @ 4 f M Y } 1.6.", "6.6.3.[ f & q r ; @ 4 f N Q } 1.3.6.", "6.1.[ f - q r > @ q f N Q | 1.3.6.6.", "3.} d & q r ; & q f N Q | 1.3.6.6.6.", "3.Y - q t r q q 4 r f N Q O.1.3.6.6.6.6.", "3._ r q t f M L Y F v x Z Q O.1.3.6.6.6.6.6.", "6.=.Y N j Z Q [ ` Y L U ` $.1.3.6.6.6.6.6.6." }; bist-0.5.2/images/lb_align.xpm0000644000175000017500000000437311025523004014600 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_align_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 62 1", " c black", ". c #010000", "X c #040000", "o c #090000", "O c #0E0E0E", "+ c #100000", "@ c #190000", "# c #240000", "$ c #3F0000", "% c gray17", "& c gray19", "* c gray21", "= c #3E3E3E", "- c #3F3F3F", "; c #630000", ": c #414141", "> c gray27", ", c #484848", "< c gray29", "1 c gray31", "2 c #515151", "3 c gray33", "4 c #676767", "5 c #6A6A6A", "6 c gray44", "7 c #717171", "8 c #727272", "9 c gray46", "0 c #767676", "q c #777777", "w c gray47", "e c #8F0000", "r c #A80000", "t c #E00000", "y c red", "u c gray51", "i c #848484", "p c #8B8B8B", "a c gray55", "s c gray56", "d c #909090", "f c gray57", "g c gray58", "h c #9A9A9A", "j c gray61", "k c #9D9D9D", "l c gray62", "z c #A5A5A5", "x c gray65", "c c #AAAAAA", "v c #ACACAC", "b c #AEAEAE", "n c #AFAFAF", "m c #B4B4B4", "M c gray71", "N c #B6B6B6", "B c gray72", "V c #B9B9B9", "C c #BBBBBB", "Z c gray", "A c gray75", "S c #C0C0C0", /* pixels */ "SSSSSSSSSSSSSSSSSSSSSS", " xBSS9mSB ", "npwwwwwpnS1;onnpwwwwwp", " ugkxBBoy;>mxkg ", "npwwpnSSS1;yyXnASnpwwa", " xm yyy$2 ", "npwwwwwp<$yyytOuwwwwwa", "Bxkkkkkx y@yyy#5jkkkkx", "SSSSSSS1#y eyyr&BSSSSS", "SSSSSSS y+ #yyy+kSSSSS", "SSSSSS1+yyyyyyy;-BSSSS", "SSSSSS y# $yyy nSSSS", "SSSSSdXy uhk yyy$3ASSS", "SSSS1 ryo-AS:ryyto. */ /* XPM */ const static char *lb_orb_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 121 2", " c black", ". c #000204", "X c #000206", "o c #000308", "O c #00060E", "+ c #000A18", "@ c #010B19", "# c #000B1A", "$ c #000F24", "% c #001028", "& c #00132E", "* c #071935", "= c #02193C", "- c #051C3D", "; c #313233", ": c #353535", "> c gray22", ", c #3A3A3A", "< c gray24", "1 c #3E3E3E", "2 c #001A40", "3 c #001C44", "4 c #001D46", "5 c #011D47", "6 c #071E41", "7 c #001D48", "8 c #03214B", "9 c #062148", "0 c #06234E", "q c #07244F", "w c #0C274E", "e c #002152", "r c #032351", "t c #052451", "y c #05295D", "u c #082756", "i c #092853", "p c #0C2B58", "a c #162E52", "s c #193255", "d c #002A66", "f c #042A60", "g c #15396D", "h c #1D3E6D", "j c #25354B", "k c #2A3442", "l c #263750", "z c #2A3F5C", "x c gray27", "c c #4E4E4E", "v c #515151", "b c gray32", "n c #535353", "m c #535557", "M c #555555", "N c #545658", "B c gray36", "V c #465C7C", "C c #4F5F77", "Z c #545C68", "A c #6C6C6C", "S c #6F6F6F", "D c gray44", "F c #7B7B7B", "G c #0045A8", "H c #0045AA", "J c #1A53A6", "K c #254C85", "L c #224E8E", "P c #3A5E92", "I c #005ADC", "U c #005CE2", "Y c #0061EE", "T c #0067FC", "R c #076CFF", "E c #1B78FF", "W c #237DFF", "Q c #277FFF", "! c #486084", "~ c #717F93", "^ c #3D8CFF", "/ c #79889D", "( c #4591FF", ") c #63A3FF", "_ c #65A4FF", "` c #67A5FF", "' c #69A6FF", "] c #6BA7FF", "[ c #818283", "{ c gray55", "} c #8D8D8D", "| c #8B939F", " . c #989898", ".. c #9B9B9B", "X. c gray62", "o. c #A0A0A0", "O. c gray64", "+. c gray65", "@. c #A7A7A7", "#. c gray66", "$. c #A9A9A9", "%. c #AAAAAA", "&. c #ACACAC", "*. c gray68", "=. c #AFAFAF", "-. c #ABB2BD", ";. c #B2B2B2", ":. c gray70", ">. c #B4B4B4", ",. c #B6B6B6", "<. c #B7B7B7", "1. c #B5B7BB", "2. c gray72", "3. c #BBBBBB", "4. c #BABCBE", "5. c gray", "6. c gray75", "7. c #ABCDFF", "8. c #B7D4FF", "9. c #C0C0C0", "0. c #C1DAFF", /* pixels */ "9.9.9.9.9.9.9.4.L y 3 f J -.9.9.9.9.9.9.9.9.", "9.9.9.9.9.9.9.p + G E R H r 3.9.9.9.9.9.9.9.", "9.9.9.9.9.9.9.. 3 W _ ] 7.O | 2.9.9.9.9.9.9.", "9.9.9.9.9.9.9. d ^ _ ] 8.% C %.9.9.9.9.9.9.", "9.9.9.9.9.9.9.O r ^ ] 0.) O N ..5.9.9.9.9.9.", "9.9.9.9.9.9.9.w $ Q _ 0.U 0 v ..5.9.9.9.9.9.", "9.9.9.9.9.9.9./ . U ) _ 7 l B X.9.9.9.9.9.9.", "9.9.9.9.9.9.9.=.- 7 ( T 8 1 S %.9.9.9.9.9.9.", "9.9.9.9.9.9.9.3.~ . I 2 j v { <.9.9.9.9.9.9.", "9.9.9.9.9.9.9.5.=.a & t 1 A @.3.9.9.9.9.9.9.", "9.9.9.9.9.9.9.9.3. .+ k n { <.9.9.9.9.9.9.9.", "9.9.9.9.9.9.9.9.5.P & u S %.5.9.9.9.9.9.9.9.", "9.9.9.9.9.9.9.9.1.o I 2 V ;.9.9.9.9.9.9.9.9.", "9.9.9.9.9.9.9.9.g 4 ( T t O.3.9.9.9.9.9.9.9.", "9.9.9.9.9.9.9.-.. U _ ] 7 ! >.9.9.9.9.9.9.9.", "9.9.9.9.9.9.9.K $ ^ _ 0.U u o.5.9.9.9.9.9.9.", "9.9.9.9.9.9.9.# e ^ _ 8._ O [ >.9.9.9.9.9.9.", "9.9.9.9.9.9.9. d ^ ] ] 8.$ Z +.9.9.9.9.9.9.", "9.9.9.9.9.9.9.o 4 W ] ] 7.O N ..5.9.9.9.9.9.", "9.9.9.9.9.9.9.h + G E R G - v ..3.9.9.9.9.9.", "9.9.9.9.9.9.9.o.z 6 = 5 s ; M ..9.9.9.9.9.9.", "9.9.9.9.9.9.9.*.F c , : > x S #.9.9.9.9.9.9." }; bist-0.5.2/images/lb_exp_ps.xpm0000644000175000017500000000675611025523004015013 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_exp_ps_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 108 2", " c black", ". c #090909", "X c #0C0C0C", "o c gray5", "O c #111111", "+ c #131313", "@ c gray8", "# c #181818", "$ c #191919", "% c gray10", "& c #1B1B1B", "* c #1D1D1D", "= c #1E1E1E", "- c gray12", "; c #220000", ": c #202020", "> c gray13", ", c #222222", "< c gray14", "1 c #252525", "2 c gray15", "3 c gray16", "4 c #2C2C2C", "5 c #323232", "6 c gray20", "7 c gray21", "8 c gray22", "9 c #3C3C3C", "0 c gray24", "q c #3F3F3F", "w c #440000", "e c #660000", "r c #770000", "t c #414141", "y c gray26", "u c #434343", "i c #444444", "p c gray27", "a c gray28", "s c #484848", "d c #4C4C4C", "f c #515151", "g c #555555", "h c gray34", "j c #585858", "k c gray35", "l c #5A5A5A", "z c gray39", "x c DimGray", "c c gray43", "v c gray44", "b c #717171", "n c #767676", "m c gray47", "M c #7B7B7B", "N c gray49", "B c #7E7E7E", "V c #880000", "C c #990000", "Z c #AA0000", "A c #BB0000", "S c #CC0000", "D c #DD0000", "F c #EE0000", "G c red", "H c gray51", "J c #848484", "K c #8B8B8B", "L c #959595", "P c gray60", "I c gray61", "U c #9D9D9D", "Y c gray62", "T c #A0A0A0", "R c #A2A2A2", "E c gray64", "W c #A5A5A5", "Q c #A9A9A9", "! c #ACACAC", "~ c #AFAFAF", "^ c gray69", "/ c #B4B4B4", "( c gray71", ") c #BBBBBB", "_ c #BCBCBC", "` c gray", "' c gray75", "] c #C0C0C0", "[ c #C6C6C6", "{ c gray79", "} c gray80", "| c #D8D8D8", " . c gray86", ".. c #DDDDDD", "X. c #E1E1E1", "o. c #E7E7E7", "O. c gray91", "+. c #EFEFEF", "@. c #F1F1F1", "#. c #F3F3F3", "$. c #F4F4F4", "%. c gray96", "&. c #F6F6F6", "*. c #F9F9F9", "=. c #FBFBFB", "-. c gray99", ";. c #FDFDFD", ":. c gray100", /* pixels */ "] ] ] ] ] ] ] ] ] ", "] ] :.:.:.:.:.:.o.o.o.&. =. _ ] ] ] ] ] ", "] ] :.:.:.:.#.M . . . > :.+. ] ] ] ] ] ", "] ] :.:.:.W = # . :.:.| ] ] ] ] ", "] ] :.{ 7 X J &. f :.:.:.[ ] ] ] ", "] ] / l X.:.:.i :.:.:.:. _ ] ] ", "] ] W :.:.:.:.:.:.:.i ^ ] ] ", "] ] ! + :.+ :.:.:.:.:.:.:.:.:.+ #. T ] ] ", "] ] / 4 :.4 :.:.:.:.:.:.:.:.:.3 #. U ] ] ", "] ] ] d :.d :.:.:.:.:.:.:.:.:.d &. U ] ] ", "] ] } c :.c :.:.:.:.:.:.:.:.:.c &. U ] ] ", "] ] | l 5 > K :.x + i =. U ] ] ", "] ] O.2 S G G D e x e G G G F X :. U ] ] ", "] ] &. G G A G G ; G G r C G &. U ] ] ", "] ] :. G A : ; G r G V # 5 0 .. U ] ] ", "] ] :. G A Z G w G G S r y .. U ] ] ", "] ] :. G G G G A : ; D G G G o. U ] ] ", "] ] = :. G D r w 2 h 9 + r G r H = U ] ] ", "] ] i :. G A # h B t C e G e B i U ] ] ", "] ] M :. G A # L ) G G G G G ^ b U ] ] ", "] ] E E p e w 8 H I y w Z A C ; = b P U ] ] ", "] ] _ T n 5 3 0 j z z 0 @ o + 1 7 f M Q ] ] " }; bist-0.5.2/images/lb_normal_str.xpm0000644000175000017500000000463511025523004015667 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_normal_str_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 73 1", " c black", ". c #010101", "X c #020202", "o c gray1", "O c #040404", "+ c gray2", "@ c #090909", "# c gray4", "$ c #0B0B0B", "% c #0C0C0C", "& c gray5", "* c #0E0E0E", "= c gray6", "- c #101010", "; c gray8", ": c #181818", "> c #1B1B1B", ", c #1D1D1D", "< c #1E1E1E", "1 c gray12", "2 c #202020", "3 c #232323", "4 c gray14", "5 c #2C2C2C", "6 c gray19", "7 c #343434", "8 c gray22", "9 c #3A3A3A", "0 c gray23", "q c #3C3C3C", "w c #3F3F3F", "e c gray26", "r c #444444", "t c gray29", "y c #4E4E4E", "u c gray31", "i c gray33", "p c #585858", "a c #5A5A5A", "s c #5B5B5B", "d c gray38", "f c #676767", "g c #686868", "h c #6A6A6A", "j c #6D6D6D", "k c gray43", "l c gray44", "z c #717171", "x c gray46", "c c red", "v c #818181", "b c gray55", "n c #8E8E8E", "m c gray57", "M c #929292", "N c #959595", "B c #989898", "V c gray60", "C c #9F9F9F", "Z c #A0A0A0", "A c #A2A2A2", "S c #A4A4A4", "D c gray65", "F c #AEAEAE", "G c #B2B2B2", "H c #B4B4B4", "J c #B9B9B9", "K c gray74", "L c gray75", "P c #C0C0C0", "I c gray76", "U c #C6C6C6", "Y c #CDCDCD", /* pixels */ "PPPPPPPPPPPPPPPPPPPPPP", "PPPPPPxHPPPPPPPPPPPPPP", "PPPPPuj;FPPPPPPPPPPPPP", "PPPPJ%Yj0GLPPPPPPPPLPP", "PPPPujYY+7....uu....uP", "PPLL+YYYt.cccc..cccc.D", "PPPutYYYI..cc.;2.cc.:h", "PPL.Y1YYY4#.cc..cc..#e", "PPu5Y.mYYn%#.cccc..+1d", "PL.Y;.5YYU%7%.cc..+1sV", "Pu;YYYYYYYh11.cc..1sNJ", "P.Y5...uYYY..cccc.1mJP", "m+Y.....YYi.cc..cc.0JP", ".AY#+45%e..cc....cc.eJ", "YYYY;ift.ccccc..cccc.N", "....#sA0.......#....%d", "e#..#emb6.....+:1#..#e", "h0650hACs4%%%%2ru0650h", "DNmmNDJJAxzjjzxVCNmmND", "LPPPPPPPPPPPPPUUPPPPPP", "PPPPPPPPPPPPPPPPPPPPPP", "PPPPPPPPPPPPPPPPPPPPPP" }; bist-0.5.2/images/lb_unzoom.xpm0000644000175000017500000001303011025523004015023 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_unzoom_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 239 2", " c black", ". c #000001", "X c #010101", "o c #010202", "O c #020202", "+ c gray1", "@ c #020305", "# c #030405", "$ c #040400", "% c #040401", "& c #040404", "* c gray2", "= c #040607", "- c #060606", "; c #040608", ": c #05070A", "> c #06080B", ", c #07090C", "< c gray3", "1 c #090909", "2 c #0E0E0E", "3 c #091118", "4 c #0A121A", "5 c #171205", "6 c #171206", "7 c #181100", "8 c #1A1201", "9 c #181304", "0 c #181306", "q c gray7", "w c gray9", "e c #16191C", "r c #181819", "t c #191919", "y c #181A1B", "u c gray10", "i c #1B1B1C", "p c gray11", "a c gray12", "s c #0D1822", "d c #101E2B", "f c #1A1F25", "g c #12212F", "h c #13212F", "j c #132231", "k c #162A3B", "l c #182B3D", "z c #231800", "x c #231801", "c c #231901", "v c #241901", "b c #291C00", "n c #312200", "m c #3B2800", "M c #202020", "N c #232323", "B c gray14", "V c #272727", "C c #2A2927", "Z c #2A2A2A", "A c #2C2C2C", "S c gray18", "D c #282C30", "F c #293139", "G c #313131", "H c #323232", "J c #353535", "K c #373737", "L c #393836", "P c #3A3937", "I c gray22", "U c #3A3A3A", "Y c #3C3C3C", "T c gray24", "R c #3E3E3E", "E c #3F3F3F", "W c #1A3045", "Q c #1A3146", "! c #1F3244", "~ c #1D364D", "^ c #1E374E", "/ c #263747", "( c #2E3C49", ") c #203A52", "_ c #203C55", "` c #23415D", "' c #23425E", "] c #2D465D", "[ c #3E4043", "{ c #274866", "} c #284765", "| c #2B5072", " . c #2F577C", ".. c #3E5061", "X. c #355471", "o. c #345575", "O. c #432E00", "+. c #5F4100", "@. c #5F4201", "#. c #5D4304", "$. c #5C4407", "%. c #5A4919", "&. c #604100", "*. c #434343", "=. c #444444", "-. c gray27", ";. c #464646", ":. c gray28", ">. c #494949", ",. c gray29", "<. c #4B4B4B", "1. c #4C4C4C", "2. c #4E4E4E", "3. c gray31", "4. c #515151", "5. c gray32", "6. c #535353", "7. c gray33", "8. c #545A5E", "9. c gray35", "0. c #5A5A5A", "q. c #5B5B5B", "w. c #5F5F5F", "e. c #425C73", "r. c #4D5F70", "t. c #56616B", "y. c #626262", "u. c gray39", "i. c #656565", "p. c gray40", "a. c #676767", "s. c #65696D", "d. c DimGray", "f. c gray42", "g. c gray43", "h. c #6F6F6F", "j. c gray44", "k. c gray46", "l. c gray47", "z. c #7E7E7E", "x. c #386692", "c. c #3C6F9E", "v. c #4A83B8", "b. c #72818F", "n. c #6087AB", "m. c #4E8FCC", "M. c #5196D6", "N. c #5297D7", "B. c #57A0E5", "V. c #5AA5EB", "C. c #5FACF3", "Z. c #5EADF7", "A. c #6197CA", "S. c #78A4CC", "D. c #69A7E0", "F. c #60B1FC", "G. c #61B3FF", "H. c #68B7FF", "J. c #6CB8FF", "K. c #72BBFF", "L. c #77BBF9", "P. c #76BBFB", "I. c #78BEFF", "U. c #7ABFFF", "Y. c #8A5E00", "T. c #9A740A", "R. c #9B7C21", "E. c #A77200", "W. c #B19A50", "Q. c #BBAA71", "!. c #C58600", "~. c #818181", "^. c gray51", "/. c #838383", "(. c #848484", "). c gray53", "_. c #898989", "`. c #8B8B8B", "'. c gray55", "]. c gray57", "[. c #929292", "{. c #939393", "}. c #979797", "|. c #9D9D9D", " X c gray62", ".X c #BCB088", "XX c #A2A2A2", "oX c #A5A5A5", "OX c gray65", "+X c #A7A7A7", "@X c #A3A9AF", "#X c #A9A9A9", "$X c gray67", "%X c #ACACAC", "&X c #A7B2BC", "*X c #BEB8A4", "=X c gray69", "-X c #B2B2B2", ";X c gray70", ":X c #B4B4B4", ">X c gray71", ",X c #B7B7B7", " * d.fXhXfXfX", "fXfXoX * h Q ^ ! / ( F e ;.1XfXfX", "fXfXu > h ^ _ { X.e.r.t.8.[ i 4.1X7X", "fXfXq d Q { x.v.A.S.8XqX@X'.s.D 1 ).7X", "fX7X* s ' c.N.C.P.rXpXvXnXxX&Xb.f E #X", "fX7X* @ .m.Z.G.K.wXiXdXbXmXcX9X..@ J }.", "fX;XH l N.F.G.H.U.rXiXaXsXaXuXn.; E ^.", "fX7Xh.@ ^ B.G.G.J.U.wXtXyXtX0X] * :.).", "fX7XoXJ $ 4 | V.G.H.K.I.P.D.o. q 4.'.", "fX7X;X_.;.2 T.!.E. h ' ) l 4 V q. X", "fXfX7X#Xz.R.&.Y.8 $ * M J i.oX", "fXfX7X7XW.&.Y.v 9 Z ;.E Z u u w u Z E 3.^.;X", "fXfX7XQ.&.!.Y.v C J >.4.4.1.;.E E E 4.l.XX7X", "fXfX.X+.!.Y.v 0 E g.{.}.).k.d.i.i.h._.oX1X7X", "fX*X#.!.!.Y.c L y. X7X7X;X#X;. 3.", ".z.;X7X7XfXfX MXMXMXMXMXMX ", "%.Y.m m Y.c L y. X7XfXfXfXfX MXMXMXMXMXMX ", "q.Y.Y.b n 5 >.^.;XfXfXfXfXfX3. Z ", "q.O.Y.Y.8 U y. X7XfXfXfXfXfXfXoXh.4.7.7.7.h.", "^.;.V w N >.^.;XfXfXfXfXfXfXfX1XoX X X X XoX" }; bist-0.5.2/images/lb_fixed_rotation.xpm0000644000175000017500000000653211025523004016523 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_fixed_rotation_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 97 2", " c black", ". c #010000", "X c #060000", "o c #0A0000", "O c #0E0000", "+ c #0B0B0B", "@ c gray5", "# c #0E0E0E", "$ c #150000", "% c #190000", "& c #1A0000", "* c #1B0000", "= c gray10", "- c #210000", "; c #2A0000", ": c #2F0000", "> c #310000", ", c #320000", "< c #370000", "1 c #3A0000", "2 c gray15", "3 c #2C2C2C", "4 c #2F2F2F", "5 c gray20", "6 c #3A3A3A", "7 c #450000", "8 c #540000", "9 c #560000", "0 c #590000", "q c #5B0000", "w c #5C0000", "e c #620000", "r c #660000", "t c #680000", "y c #690000", "u c #6D0000", "i c #730000", "p c #760000", "a c gray25", "s c #414141", "d c #4B4B4B", "f c gray30", "g c #4E4E4E", "h c gray31", "j c gray35", "k c #5A5A5A", "l c gray40", "z c #676767", "x c DimGray", "c c #6C6C6C", "v c #6F6F6F", "b c #727272", "n c gray45", "m c #767676", "M c #7B7B7B", "N c gray50", "B c #970000", "V c #9B0000", "C c #A10000", "Z c #A90000", "A c #AB0000", "S c #AE0000", "D c #B20000", "F c #BA0000", "G c #BE0000", "H c #C50000", "J c #CD0000", "K c #D50000", "L c #D80000", "P c #DF0000", "I c #E10000", "U c #E40000", "Y c #EB0000", "T c #ED0000", "R c #F10000", "E c #F50000", "W c #F80000", "Q c #FE0000", "! c red", "~ c #808080", "^ c #818181", "/ c #898989", "( c gray55", ") c #8D8D8D", "_ c #909090", "` c gray58", "' c gray59", "] c #979797", "[ c #9A9A9A", "{ c #9D9D9D", "} c gray65", "| c gray69", " . c gray71", ".. c gray72", "X. c #BBBBBB", "o. c gray75", "O. c #C0C0C0", /* pixels */ "O.O.O.O.O...N g 2 + + + + 2 g N ..O.O.O.O.O.", "O.O.O.O.( o 9 B J R R R R J B 9 o ( O.O.O.O.", "O.O.O.v 7 Z ! ! ! ! ! ! ! ! ! ! Z 7 v O.O.O.", "O.O.v 0 K ! E Z t , O O , t Z E ! K 0 v O.O.", "O.( 7 K ! F 8 s b [ . .[ b s 9 F ! K 7 ( O.", "..o Z ! F ; ^ O.O.O.O.O.O.O.O.^ ; F ! Z o ..", "N 9 ! E 9 ^ O.O.O.O.O.O.O.O.O.O.^ 8 ! ! 1 ' ", "g B ! Z s O.O.O.O.O.O.O.b = O.s Z ! % / ", "2 J ! t b O.O.O.O.O.O.O. g O. x _ % ! D 6 ", "+ R ! , [ O.n 5 l l 5 b @ 2 ( 3 , ! R ", "+ R ! O .O.n @ 5 } @ g ! ! ! ! ! ", "+ R ! O .O.l } s O.O.O.O.g ! ! ! ", "+ R ! , [ O.2 l k ( O.O.O.O.O.6 D ! D 6 ", "2 J ! t b O. = O.= b O.O.O.O.O./ : ! w M ", "g B ! Z s ( l O. g O.O.O.O.O.O.6 D 6 O.", "z p ! ! t k l O.O.n ( O.O.O.O.O.O.O./ 6 / O.", "{ : U ! I , v o.O.O.O.O.O.O.O.O.O.O.O.O.O.O.", "O. V ! ! K r d n ' . .o.O.O.O.O.O.O.O.O.O.", "O.' % G ! ! I B e < O O X ..O.O.O.O.O.O.O.O.", "O.O.~ - S W ! ! Y ! ! ! i x O.O.O.O.O.O.O.O.", "O.O.O.( $ 0 H T ! ! ! R u w N O.O.O.O.O.O.O.", "O.O.O.O.| M 3 @ + k M o.O.O.O.O.O.O.O." }; bist-0.5.2/images/lb_kill.xpm0000644000175000017500000001035011025523004014431 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_kill_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 155 2", " c #020000", ". c #030101", "X c gray2", "o c #060505", "O c #070505", "+ c #0A0000", "@ c #080505", "# c #090707", "$ c #0A0404", "% c #0A0505", "& c #0B0404", "* c #0D0000", "= c #0F0101", "- c #0E0303", "; c #0E0707", ": c #090909", "> c gray4", ", c #0C0B0B", "< c gray5", "1 c #0E0D0D", "2 c #100101", "3 c #100303", "4 c #110303", "5 c #140606", "6 c #110909", "7 c #140B0B", "8 c #1F0101", "9 c #1B0808", "0 c #1E0808", "q c #121111", "w c gray7", "e c gray8", "r c #1A1616", "t c #1D1111", "y c #1E1B1B", "u c gray12", "i c #200909", "p c #250A0A", "a c #2D0101", "s c #211313", "d c #261818", "f c #2B1B1B", "g c #2B1C1C", "h c #340101", "j c #310909", "k c #310A0A", "l c #380101", "z c #380C0C", "x c gray15", "c c gray18", "v c #342525", "b c #372727", "n c #392A2A", "m c #3B2B2B", "M c #3D2E2E", "N c #3E2F2F", "B c #323232", "V c #353535", "C c #393939", "Z c gray24", "A c #410404", "S c #430C0C", "D c #4A0101", "F c #500000", "G c #560606", "H c #590909", "J c #5F0808", "K c #403232", "L c #463939", "P c #483B3B", "I c #4B3F3F", "U c #600000", "Y c #620404", "T c #660101", "R c #660707", "E c #6B0606", "W c #6E0000", "Q c #700000", "! c #720404", "~ c #760000", "^ c #4C4040", "/ c #4E4444", "( c #4B4B4B", ") c #514949", "_ c #534A4A", "` c #505050", "' c #565050", "] c #5B5858", "[ c #5C5A5A", "{ c #5D5B5B", "} c #5E5C5C", "| c #5E5D5D", " . c #5F5E5E", ".. c gray39", "X. c #676767", "o. c DimGray", "O. c #717171", "+. c gray48", "@. c #7B7B7B", "#. c #800000", "$. c #830000", "%. c #8D0000", "&. c #9B0000", "*. c #9D0000", "=. c #A50000", "-. c #A80000", ";. c #AD0000", ":. c #B00000", ">. c #B20000", ",. c #B50000", "<. c #B70000", "1. c #BA0000", "2. c #CA0000", "3. c #D00000", "4. c #D40000", "5. c #DB0000", "6. c #E60000", "7. c #E90000", "8. c #EA0000", "9. c #EB0000", "0. c #EC0000", "q. c #ED0000", "w. c #F00000", "e. c #F10000", "r. c #F40000", "t. c #F70000", "y. c #F90000", "u. c #FD0000", "i. c red", "p. c #868686", "a. c gray54", "s. c gray56", "d. c #929292", "f. c gray59", "g. c #989898", "h. c #9F9F9F", "j. c gray63", "k. c gray64", "l. c #A5A5A5", "z. c gray65", "x. c #A9A9A9", "c. c #ACACAC", "v. c gray68", "b. c #AFAFAF", "n. c #B4B4B4", "m. c gray71", "M. c #B6B6B6", "N. c gray72", "B. c gray73", "V. c #BBBBBB", "C. c #BCBCBC", "Z. c gray74", "A. c gray", "S. c gray75", "D. c #C0C0C0", /* pixels */ "D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.N. .I Z.D.D.D.", "D.D.D.D.D.D.D.D.D.D.D.S.D.Z.{ 6 ! / D.D.D.D.", "M I .b.D.D.D.D.D.D.D.S.l.m E 1.v N.l.D.D.D.", "D.; #.. L +.D.D.D.D.D.{ i ,.9.; o.w b.D.D.D.", "D.s.v &.=.H g { b.N._ R e.q.0 w > f.D.D.D.D.", "D.D.X.- Y e.2.#.6 M ! i.r.A O > O.D.D.D.D.D.", "D.D.D.g.@ h q.i.6.>.i.i.T @ > ( D.D.D.D.D.D.", "D.D.D.D.b., - e.i.i.i.-.5 > c Z.D.D.D.D.D.D.", "D.D.D.D.D.N.r Q i.i.i.i.8 > N.D.D.D.D.D.D.D.", "D.D.D.D.D.j.p e.i.i.i.i.9.k .D.D.D.D.D.D.D.", "D.D.D.D.D.m <.i.q.h J e.i.9.z .D.D.D.D.D.D.", "D.D.D.D. .R i.r.D O $ a 9.i.9.9 x.D.D.D.D.D.", "D.D.D.D.g 2.i.W $ > V 1 $ 4.i.5.t b.D.D.D.D.", "D.D.D. .R i.=.4 > x Z.V.B - ;.i.*.^ D.D.D.D.", "D.D.D.M >.3.- > w M.D.D.D.` 4 ~ i.G .D.D.D.", "D.D.d.z 9.. @ > l.D.D.D.D.D.+.$ D 4.s Z.D.D.", "D.D.' %.k O > p.D.D.D.D.D.D.D.h.O a T .D.D.", "D.D.d J y > ..D.D.D.D.D.D.D.D.D.M.w . f D.D.", "D.a.S _ > Z D.D.D.D.D.D.D.D.D.D.D.V.C 5 Z.D.", "D.' N p.u V.D.D.D.D.D.D.D.D.D.D.D.D.D...f.D.", "D.[ D.B n.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.j.D.", "D.D.M.h.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D.D." }; bist-0.5.2/images/lb_draw_arc.xpm0000644000175000017500000000662311025523004015270 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_draw_arc_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 102 2", " c black", ". c gray1", "X c #040404", "o c gray2", "O c #060606", "+ c #070707", "@ c #090909", "# c #101010", "$ c gray7", "% c #161616", "& c gray10", "* c #1B1B1B", "= c gray11", "- c #1E1E1E", "; c gray12", ": c #222222", "> c gray14", ", c gray17", "< c #2C2C2C", "1 c #2D2D2D", "2 c #2F2F2F", "3 c #323232", "4 c #373737", "5 c gray22", "6 c #393939", "7 c #3C3C3C", "8 c gray24", "9 c #3E3E3E", "0 c #414141", "q c #434343", "w c #464646", "e c gray29", "r c #4C4C4C", "t c #4E4E4E", "y c gray31", "u c #535353", "i c #555555", "p c #565656", "a c gray34", "s c #585858", "d c #5D5D5D", "f c #5F5F5F", "g c gray38", "h c #626262", "j c gray39", "k c gray40", "l c #686868", "z c DimGray", "x c #6D6D6D", "c c gray43", "v c #6F6F6F", "b c #717171", "n c #767676", "m c #797979", "M c gray48", "N c #7B7B7B", "B c gray49", "V c #7E7E7E", "C c gray50", "Z c #808080", "A c gray52", "S c gray53", "D c #888888", "F c #898989", "G c #8B8B8B", "H c #8D8D8D", "J c #8E8E8E", "K c #909090", "L c gray57", "P c #929292", "I c #939393", "U c gray58", "Y c gray59", "T c #979797", "R c #989898", "E c #9B9B9B", "W c #9D9D9D", "Q c #A2A2A2", "! c gray64", "~ c #A4A4A4", "^ c #A5A5A5", "/ c gray65", "( c gray67", ") c gray68", "_ c #AEAEAE", "` c #AFAFAF", "' c gray69", "] c #B1B1B1", "[ c #B2B2B2", "{ c gray70", "} c #B4B4B4", "| c gray71", " . c #B6B6B6", ".. c gray72", "X. c #B9B9B9", "o. c gray73", "O. c #BBBBBB", "+. c #BCBCBC", "@. c gray74", "#. c gray", "$. c gray75", "%. c #C0C0C0", /* pixels */ "%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.%.$.%.%.%.%.%.", "%.%.%.%.%...B e : @ @ @ @ = w b _ $.%.%.%.%.", "%.%.%.%.G 7 < n .$.%.$.", "%.%.%.N = X = < 7 t t 0 3 & $ d _ $.$.", "%.%.G = & 3 u z B G T T H B w % $ j _ $.", "%...7 & 0 j A Q ] .$.$...] Q v & = A .", "%.B X 3 j L ] $.%.%.%.%.%.%.$.] j X & d ^ ", "%.e = u A ] $.%.%.%.%.%.%.%.%.%.] < = d W ", "%.: < z Q $.%.%.%.%.%.%.%.%.%.%.$.T j v ^ ", "%.@ 7 B ] $.%.%.%.%.%.%.%.%.%.%.%.L X T ", "%.@ e H ..%.%.%.%.%.%.%.%.%.%.%.%.] X v ", "%.@ t T $.%.%.%.%.%.%.%.%.%.%.%.%...i 6 z ", "%.@ 0 T $.$.%.%.%.%.%.%.%.%.%.%.%.$.R B H ", "%.: 3 H ..$.%.%.%.%.%.%.%.%.%.%.%.R j j ^ ", "%.w & B ] %.%.%.%.%.%.%.%.%.%.%.%.7 6 T ", "%.b w Q $.%.%.%.%.%.%.%.%.%.%.Z X 7 B ", "%._ < % b ] $.%.%.%.%.%.%.%.%...Q N : i G ", "$.$.N @ & j ] $.%.%.%.%.%.%.Z W H A j Z Q ", "%.%. .d $ : t N L ] ... .A X $ i L Q ^ ] ", "%.%.$._ j = X = , i R W @ 6 G ( ..$.", "%.%.%.$._ G i 7 3 X X 6 i T j j j L ] $.%.", "%.%.%.%.$. .^ L G N j d j A Q ^ R R _ $.%.%." }; bist-0.5.2/images/lb_supers.xpm0000644000175000017500000000701411025523004015022 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_supers_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 110 2", " c black", ". c #010101", "X c gray2", "o c #060606", "O c #070707", "+ c gray3", "@ c #090909", "# c #0B0B0B", "$ c #0C0C0C", "% c gray6", "& c #101010", "* c #111111", "= c #131313", "- c #161616", "; c gray9", ": c #181818", "> c gray12", ", c #232323", "< c gray14", "1 c gray16", "2 c #2C2C2C", "3 c gray18", "4 c gray19", "5 c #323232", "6 c #343434", "7 c gray21", "8 c #3A3A3A", "9 c gray23", "0 c #3C3C3C", "q c #3E3E3E", "w c #3F3F3F", "e c gray25", "r c #414141", "t c gray26", "y c #444444", "u c gray27", "i c #484848", "p c #494949", "a c gray29", "s c gray30", "d c gray32", "f c #535353", "g c #565656", "h c gray34", "j c #5A5A5A", "k c #5B5B5B", "l c gray37", "z c gray39", "x c #646464", "c c #656565", "v c #676767", "b c #686868", "n c #6F6F6F", "m c #747474", "M c gray48", "N c #7E7E7E", "B c #C50000", "V c #C60101", "C c #C90404", "Z c #CA0505", "A c #CC0707", "S c #D20D0D", "D c #D81313", "F c #DE1C1C", "G c #E90707", "H c #E21D1D", "J c red", "K c #E72222", "L c #E92424", "P c #ED2828", "I c gray53", "U c #898989", "Y c gray54", "T c #8B8B8B", "R c gray55", "E c gray56", "W c #909090", "Q c gray57", "! c #929292", "~ c gray58", "^ c #959595", "/ c #9A9A9A", "( c #9B9B9B", ") c gray61", "_ c #9F9F9F", "` c #A0A0A0", "' c #A2A2A2", "] c gray64", "[ c #A5A5A5", "{ c gray65", "} c #A7A7A7", "| c gray66", " . c #AAAAAA", ".. c #ACACAC", "X. c #AFAFAF", "o. c #B2B2B2", "O. c #B4B4B4", "+. c gray71", "@. c #B6B6B6", "#. c #B7B7B7", "$. c gray72", "%. c #B9B9B9", "&. c gray73", "*. c #BBBBBB", "=. c #BCBCBC", "-. c gray", ";. c gray75", ":. c #C0C0C0", ">. c gray76", ",. c #CDCDCD", /* pixels */ ":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.", ":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.", ":.:.:.:.:.:.o.#.%.;.:.;.P L ` ..%.L L _ o.;.", ":.:.:.:.:.%.,._ E o.;...H J D M K J D d M o.", ":.:.:.:.:...,.,.i T %.` f Z J S J S ; ; f ` ", ":.:.:.:.#.,.,.,.f j { ` f ; V J A = O ; f ` ", ":.:.:.:.| ,.,.,.>.7 U | M S J V J V = q M o.", ":.:.:.%.,.i ,.,.,.e x ] K J A O V J A f ~ %.", ":.:.:.{ ,.; ~ ,.,.{ e I F G = O O V V 8 M ..", ":.:.%.,.q O 3 ,.,.,.7 z s ; O & > ; O ; f ` ", ":.:.{ ,.,.,.,.,.,.,.m y u ; % 4 d 8 ; : f ` ", ":.%.,.d O i ,.,.,.4 f s i n ! M d f M o.", ":.{ ,.: ,.,.,.f f U _ | #...` ` ..;.", ";.o.,.& $ < 4 < | ,.,.:.q U %.:.:.:.:.:.:.:.", ",.,.,.,.3 l U U ,.,.,.,.,.j ) %.:.:.:.:.:.:.", "c 1 @ ; k ] ! q @ O , z { :.:.:.:.:.:.", "u @ @ t ! E q O @ u ( :.:.:.:.:.:.", "b 8 4 4 8 b ` _ c 8 4 4 4 8 b { :.:.:.:.:.:.", "{ ~ ! ! ~ { %.%.{ ~ ! ! ! ~ { %.:.:.:.:.:.:.", ":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.", ":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.", ":.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:." }; bist-0.5.2/images/lb_select_color.xpm0000644000175000017500000001156111025523004016160 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_select_color_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 194 2", " c black", ". c #000001", "X c #010000", "o c #010101", "O c #000102", "+ c #020202", "@ c gray1", "# c #000208", "$ c #0D0000", "% c #090909", "& c #000310", "* c #000412", "= c #000619", "- c #101010", "; c #111111", ": c gray8", "> c #151515", ", c #161616", "< c #000926", "1 c #000927", "2 c #000929", "3 c #000C32", "4 c #000C33", "5 c #0E3C00", "6 c #2F0000", "7 c #3C0000", "8 c #3E0000", "9 c #2D2D2D", "0 c #313131", "q c gray20", "w c #373737", "e c gray22", "r c gray23", "t c #3F3F3F", "y c #001045", "u c #001457", "i c #001761", "p c #001866", "a c #00196B", "s c #114A00", "d c #124E00", "f c #145700", "g c #165C00", "h c #186600", "j c #1A7200", "k c #1B7400", "l c #1C7900", "z c #420000", "x c #4A0000", "c c #4E0000", "v c #570000", "b c #5C0000", "n c #660000", "m c #6E0000", "M c #720000", "N c #740000", "B c #790000", "V c gray25", "C c #414141", "Z c #434343", "A c #484848", "S c #5F5F5F", "D c #606060", "F c DimGray", "G c gray42", "H c #6F6F6F", "J c #727272", "K c #7E7E7E", "L c #001E80", "P c #002296", "I c #002397", "U c #00249B", "Y c #0027A7", "T c #0028AE", "R c #0029B2", "E c #002BB8", "W c #002BBA", "Q c #002BBC", "! c #002DC1", "~ c #002EC5", "^ c #0030CE", "/ c #0031D2", "( c #0031D5", ") c #0031D6", "_ c #0034E0", "` c #0035E4", "' c #0037ED", "] c #0038F3", "[ c #003BFF", "{ c #294191", "} c #29439B", "| c #2946A7", " . c #2947AD", ".. c #2950CE", "X. c #2955E5", "o. c #4059AC", "O. c #405FC5", "+. c #4068EB", "@. c #1D8000", "#. c #208B00", "$. c #229300", "%. c #229600", "&. c #239600", "*. c #239700", "=. c #249D00", "-. c #259F00", ";. c #25A000", ":. c #26A400", ">. c #27A700", ",. c #29B200", "<. c #2AB600", "1. c #2BB800", "2. c #2BBA00", "3. c #2BBC00", "4. c #2BBD00", "5. c #2EC500", "6. c #30CE00", "7. c #31D200", "8. c #31D500", "9. c #34E000", "0. c #35E400", "q. c #37ED00", "w. c #38F300", "e. c #3BFF00", "r. c #49B329", "t. c #4BBE29", "y. c #5DBD40", "u. c #52DC29", "i. c #57F029", "p. c #62D440", "a. c #6AF640", "s. c #800000", "d. c #8B0000", "f. c #930000", "g. c #960000", "h. c #970000", "j. c #9D0000", "k. c #9F0000", "l. c #A40000", "z. c #A70000", "x. c #B20000", "c. c #B60000", "v. c #B80000", "b. c #BA0000", "n. c #BC0000", "m. c #BD0000", "M. c #A72929", "N. c #AF2929", "B. c #B52929", "V. c #BB4040", "C. c #C50000", "Z. c #CE0000", "A. c #D20000", "S. c #D50000", "D. c #C52929", "F. c #CE2929", "G. c #E00000", "H. c #E40000", "J. c #ED0000", "K. c #F30000", "L. c red", "P. c #E52929", "I. c #F52929", "U. c #CA4040", "Y. c #DA4040", "T. c #F24040", "R. c gray51", "E. c gray53", "W. c gray61", "Q. c #A5A5A5", "!. c #A7A7A7", "~. c #AFAFAF", "^. c #B7B7B7", "/. c #B9B9B9", "(. c #8093D2", "). c #8098E7", "_. c #ADBAE3", "`. c #ADBBE9", "'. c #ADBDF1", "]. c #95DD80", "[. c #9AF080", "{. c #BBE9AD", "}. c #BCEFAD", "|. c #BEF6AD", " X c #D98080", ".X c #DE8080", "XX c #EA8080", "oX c #F28080", "OX c #E9ADAD", "+X c #ECADAD", "@X c #F1ADAD", "#X c #F5ADAD", "$X c #C0C0C0", "%X c gray100", /* pixels */ "$X$X$X$X$X$X$X$XF 0 - @ - 0 G $X$X$X$X$X$X$X", "$X$X$X$X$X$XQ.r @ c M d.B v @ V !.$X$X$X$X$X", "$X$X$X$X$X$Xr 8 B f.j.z.U.U.M.x V $X$X$X$X$X", "$X$X$X$X$XF @ B j.z.x.D..X$XY.N.@ J $X$X$X$X", "$X$X$X$X$X0 c f.z.v.C.Y.@X%X+XU.n r /.$X$X$X", "$X$X$X$X$X- M j.x.C.S.P.oX#XXXF.f.: $X$X$X$X", "$X$X$X$X$X@ d.z.v.A.G.J.I.T.P.Z.c.@ $X$X$X$X", "$X$X$X$X$X- B z.n.A.H.K.L.K.H.A.j., $X$X$X$X", "$X$X$X/./.0 v l.v.Z.H.K.K.K.S.S.m r $X$X$X$X", "$X$X$XF q % @ $ 6 m S.S.H.S.S.C.@ q R.$X$X$X", "$X!.t @ d k @.k g # z x.A.Z.m.b , u @ A ~.$X", "$Xr 5 l &.-.r.y.r.*.s 8 j.M @ 4 { .} y C ^.", "F @ @.*.>.u.].{.].t.=.@ # 2 u .(._.(.| @ D ", "0 d &.>.<.p.{.%X|.p.<.h 1 I Y O.`.%X`.O.p q ", "- l =.,.5.u.[.|.[.u.5.&.# Y E ..).'.)...U , ", "@ @.>.<.6.0.i.a.i.8.6.<.# R ~ ( X.+.X./ Q @ ", "; l >.4.7.0.w.e.w.0.8.-.* E ^ _ ' ] ' _ T , ", "q f >.<.6.9.q.w.q.0.6.j 4 Q ( ` ] [ ] ` L w ", "G @ *.,.5.8.9.0.8.8.4.@ i E ^ _ ' ] ' ( @ S ", "$XV s ;.<.5.6.7.6.4.g = I R ~ ( _ ` ( a V E.", "$X!.V @ h *.<.;.j @ V r @ p U ! T a % Z o.W.", "$X$X/.H e : @ : r J /./.S 9 : % , w S E.!.OX" }; bist-0.5.2/images/lb_3D_rotation.xpm0000644000175000017500000001267711025523004015701 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_3D_rotation_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 232 2", " c gray1", ". c #040404", "X c #070707", "o c #0E0505", "O c gray4", "+ c #0B0B0B", "@ c #0C0C0C", "# c gray5", "$ c gray6", "% c #100707", "& c #150B0B", "* c #111111", "= c gray8", "- c #151515", "; c #1E1414", ": c #191919", "> c gray10", ", c gray12", "< c #211616", "1 c #291F1F", "2 c #301111", "3 c #361717", "4 c #202020", "5 c #212122", "6 c #222222", "7 c #242525", "8 c #252525", "9 c #272727", "0 c #282828", "q c gray17", "w c #2B2C2B", "e c #2D2D2D", "r c #2D2E2E", "t c gray18", "y c #2F2E2F", "u c #2F2F2E", "i c #2F2F2F", "p c #322222", "a c gray19", "s c #323233", "d c #363536", "f c #373737", "g c #393938", "h c #3B3C3B", "j c #3C3B3C", "k c #410505", "l c #460A0A", "z c #422B2A", "x c #4B2222", "c c #4C2C2C", "v c #48302F", "b c #403F3F", "n c #582F2E", "m c #601C1C", "M c #751010", "N c #7E1A19", "B c #692525", "V c #6D2929", "C c gray25", "Z c #414041", "A c #414141", "S c #414241", "D c gray26", "F c #454444", "G c #454445", "H c #4A4040", "J c #484848", "K c #4A4A49", "L c #4B4B4B", "P c gray30", "I c #4D4E4D", "U c #5B4B4B", "Y c #5F4E4E", "T c #515150", "R c #515151", "E c #525152", "W c #525251", "Q c #535252", "! c #535353", "~ c #545453", "^ c #555555", "/ c #565656", "( c gray34", ") c #5B5B5B", "_ c gray36", "` c #5D5C5D", "' c #5D5D5D", "] c #6D4444", "[ c #6D5252", "{ c #606061", "} c #646465", "| c #656565", " . c #676666", ".. c #676667", "X. c #676767", "o. c #6B6A6B", "O. c #6C6C6C", "+. c #6D6D6D", "@. c #6F6F6F", "#. c #6F6F70", "$. c #766969", "%. c #766B6B", "&. c #717171", "*. c #727272", "=. c gray47", "-. c #797979", ";. c #7C7B7B", ":. c #7C7B7C", ">. c #7C7C7B", ",. c #7F7D7E", "<. c #821E1E", "1. c #951D1D", "2. c #833232", "3. c #8A3939", "4. c #912C2C", "5. c #972F2F", "6. c #9B3636", "7. c #9B3A3A", "8. c #A90000", "9. c #AA0101", "0. c #AF0505", "q. c #A31E1E", "w. c #B10A0A", "e. c #B30A0A", "r. c #BD0101", "t. c #BE0101", "y. c #BE0E0E", "u. c #B11919", "i. c #B81111", "p. c #A02828", "a. c #AB2727", "s. c #A82D2D", "d. c #A03B3B", "f. c #B63232", "g. c #B83333", "h. c #8E4040", "j. c #946B6B", "k. c #A74646", "l. c #AA4242", "z. c #B54E4E", "x. c #B55454", "c. c #B95555", "v. c #C40707", "b. c #C90101", "n. c #CA0101", "m. c #CC0101", "M. c #CC0303", "N. c #CF0101", "B. c #CF0404", "V. c #C90B0B", "C. c #CF0909", "Z. c #CC0E0E", "A. c #C11111", "S. c #C11313", "D. c #C21111", "F. c #C21414", "G. c #C51E1E", "H. c #CE1111", "J. c #C81919", "K. c #D20101", "L. c #D30000", "P. c #D20202", "I. c #C53636", "U. c #C43F3F", "Y. c #C15A5A", "T. c #C15C5C", "R. c #C55C5C", "E. c #818081", "W. c gray51", "Q. c #848383", "!. c #848384", "~. c #848484", "^. c gray52", "/. c #868686", "(. c #878686", "). c #878687", "_. c gray54", "`. c #8F8E8F", "'. c gray56", "]. c #8F8F90", "[. c #908F90", "{. c gray57", "}. c #929193", "|. c #939393", " X c #969595", ".X c #9D9292", "XX c #9E9090", "oX c gray60", "OX c #9A999A", "+X c #9B999A", "@X c #9A9A9A", "#X c #9E9D9E", "$X c #A79A9A", "%X c #A79D9D", "&X c #B48A8A", "*X c #B98888", "=X c #BC9292", "-X c #A1A0A2", ";X c #A1A1A2", ":X c #A2A2A2", ">X c gray67", ",X c #ACACAC", " 1 w d D R { &.;.!.).^.` # 2.L.S.&.", "wXx.L.D.c = r a g G R [ ..O.#.O.s 3 y.P.7.=.", "yX%Xf.L.i.l 6 w a g b L ! ( ( H k e.L.a.%.^.", "sX9XXXl.V.M.9.M m x a c n V N 9.b.v.5.$.Q.@X", "sXyX2X@Xj.d.e.t.b.M.M.M.P.b.t.0.<.] &.^.oX2X", "jXjXyX2X:X{.=.L 4 @ O = 9 A ) -.{.;X5XiX", "jXjXjXsXwX,X;X'.=.| ( P P ( } =.'.;X,XwXpXjX", "jXjXjXjXgXpXtXqX>X;XoX|.|.oX;X>XqXtXpXhXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX", "jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX" }; bist-0.5.2/images/lb_redo.xpm0000644000175000017500000000671611523576233014461 0ustar cagecage/* Bist icon derived from lb_undo.xpm Copyright (C) 2008-2010 eNtropia Copyright (C) 2011 cage This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ static const char * lb_redo_xpm[] = { "22 22 103 2", " c None", ". c #C0C0C0", "+ c #8C8C8C", "@ c #404040", "# c #262626", "$ c #4D4D4D", "% c #787878", "& c #B5B5B5", "* c #6F6F6F", "= c #1C1C1C", "- c #040503", "; c #0C1109", "> c #12200A", ", c #1C350D", "' c #274C10", ") c #326414", "! c #406F23", "~ c #3D6127", "{ c #0F160A", "] c #4B4B4B", "^ c #9A9A9A", "/ c #BEBEBE", "( c #191B17", "_ c #050C00", ": c #071200", "< c #0E2400", "[ c #173C00", "} c #205400", "| c #2A7000", "1 c #348A00", "2 c #3EA600", "3 c #47AE08", "4 c #64B632", "5 c #192511", "6 c #5F5F5F", "7 c #90918F", "8 c #081400", "9 c #0E1808", "0 c #0C1507", "a c #121E0A", "b c #254313", "c c #3C7719", "d c #4CCA00", "e c #5DF800", "f c #64EB13", "g c #3D5F29", "h c #17230F", "i c #050E00", "j c #000000", "k c #0C0C0C", "l c #191919", "m c #121212", "n c #3E791B", "o c #54E000", "p c #6BFC14", "q c #233418", "r c #959595", "s c #091800", "t c #585858", "u c #646464", "v c #545454", "w c #3F3F3F", "x c #2A2A2A", "y c #66F311", "z c #61FF01", "A c #78DD3B", "B c #464646", "C c #A7A7A7", "D c #B1B1B1", "E c #B0B0B0", "F c #A5A5A5", "G c #7A7A7A", "H c #515151", "I c #304921", "J c #979797", "K c #B8B8B8", "L c #A0A0A0", "M c #696969", "N c #2D2D2D", "O c #78DA3C", "P c #4F4F4F", "Q c #868686", "R c #A2A2A2", "S c #3E7A1A", "T c #395727", "U c #737373", "V c #B7B7B7", "W c #BABABA", "X c #818181", "Y c #313131", "Z c #65E717", "` c #76F628", " . c #6FCF35", ".. c #7C7C7C", "+. c #363636", "@. c #ABABAB", "#. c #383838", "$. c #3C3C3C", "%. c #3E6626", "&. c #9F9F9F", "*. c #232323", "=. c #8F8F8F", "-. c #808080", ". . . . . . . . . . . . . . . . . . . . . . ", ". . . . . . . . . . . . . . . . . . . . . . ", ". . . + @ # # # # $ % & . . . . . . . . . . ", ". * = - ; > , ' ) ! ~ { ] ^ / . . . . . . . ", ". ( _ - : < [ } | 1 2 3 4 5 6 . . . . . . . ", "7 8 - _ 9 9 0 a b c 3 d e f g 6 . . . . . . ", "h i j - k l = l m k - n o e p q r . . . . . ", "s _ j = t u u v w x l k a y z A B . . . . . ", ": j j + C D E F r G H x ; ! z z I J . . . . ", "_ - ] / . . . . . K L M N - f z O ] . H j P ", "- - Q . . . . . . . / R v m S z z T U j z j ", "j j V . . . . . . . . W X Y j Z z ` ; j z j ", "j r . . . . . . . . . . F t m b z z .j z j ", "..K . . . . . . . . . . K Q +.j z z z z z j ", "& . . . . . . . . . . . . @.6 k j z z z z j ", ". . . . . . . . . . . . . / #.j j z z z z j ", ". . . . . . . . . . . . . . j z z z z z z j ", ". . . . . . . . . . . . . E $.j j j j j %.P ", ". . . . . . . . . . . . . &.u @ N # *.w M . ", ". . . . . . . . . . . . . E =.X -.-.% ..C . ", ". . . . . . . . . . . . . . . . . . / & / . ", ". . . . . . . . . . . . . . . . . . . . . . "}; bist-0.5.2/images/lb_unzoom_1on1.xpm0000644000175000017500000001244211025523004015667 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_unzoom_1on1_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 223 2", " c black", ". c #000001", "X c #010101", "o c #010202", "O c #020202", "+ c gray1", "@ c #020305", "# c #030405", "$ c #040400", "% c #040401", "& c #040404", "* c gray2", "= c #040607", "- c #060606", "; c #040608", ": c #05070A", "> c #06080B", ", c #07090C", "< c gray3", "1 c #090909", "2 c gray4", "3 c #0E0E0E", "4 c #091118", "5 c #0A121A", "6 c #171205", "7 c #171206", "8 c #181100", "9 c #1A1201", "0 c #181304", "q c #181306", "w c #111111", "e c gray7", "r c gray9", "t c #16191C", "y c #191919", "u c #181A1B", "i c gray10", "p c gray11", "a c gray12", "s c #0D1822", "d c #101E2B", "f c #1A1F25", "g c #12212F", "h c #13212F", "j c #132231", "k c #162A3B", "l c #182B3D", "z c #231800", "x c #231801", "c c #231901", "v c #241901", "b c #291C00", "n c #312200", "m c #3B2800", "M c #202020", "N c #222222", "B c #232323", "V c gray14", "C c #272727", "Z c #2A2927", "A c #2C2C2C", "S c gray18", "D c #282C30", "F c #293139", "G c #313131", "H c #323232", "J c #353535", "K c #373737", "L c #393836", "P c #3A3937", "I c gray22", "U c #3A3A3A", "Y c #3C3C3C", "T c gray24", "R c #3E3E3E", "E c #3F3F3F", "W c #1A3045", "Q c #1A3146", "! c #1F3244", "~ c #1D364D", "^ c #1E374E", "/ c #263747", "( c #2E3C49", ") c #203A52", "_ c #203C55", "` c #23415D", "' c #23425E", "] c #2D465D", "[ c #3E4043", "{ c #274866", "} c #284765", "| c #2B5072", " . c #2F577C", ".. c #3E5061", "X. c #355471", "o. c #345575", "O. c #432E00", "+. c #5F4100", "@. c #5F4201", "#. c #5D4304", "$. c #5C4407", "%. c #5A4919", "&. c #604100", "*. c #434343", "=. c #444444", "-. c gray27", ";. c gray28", ":. c #484848", ">. c #494949", ",. c gray29", "<. c #4B4B4B", "1. c gray31", "2. c #515151", "3. c gray32", "4. c #545A5E", "5. c gray35", "6. c #5A5A5A", "7. c #5B5B5B", "8. c #5F5F5F", "9. c #425C73", "0. c #4D5F70", "q. c #56616B", "w. c #626262", "e. c gray39", "r. c #656565", "t. c gray40", "y. c #676767", "u. c #65696D", "i. c gray42", "p. c gray43", "a. c #6F6F6F", "s. c #7E7E7E", "d. c #386692", "f. c #3C6F9E", "g. c #4A83B8", "h. c #72818F", "j. c #6087AB", "k. c #4E8FCC", "l. c #5196D6", "z. c #5297D7", "x. c #57A0E5", "c. c #5AA5EB", "v. c #5FACF3", "b. c #5EADF7", "n. c #6197CA", "m. c #78A4CC", "M. c #69A7E0", "N. c #60B1FC", "B. c #61B3FF", "V. c #68B7FF", "C. c #6CB8FF", "Z. c #72BBFF", "A. c #77BBF9", "S. c #76BBFB", "D. c #78BEFF", "F. c #7ABFFF", "G. c #8A5E00", "H. c #9A740A", "J. c #9B7C21", "K. c #A77200", "L. c #B19A50", "P. c #BBAA71", "I. c #C58600", "U. c #818181", "Y. c gray51", "T. c #838383", "R. c #848484", "E. c gray53", "W. c #898989", "Q. c #8B8B8B", "!. c gray55", "~. c gray57", "^. c #939393", "/. c #9D9D9D", "(. c gray62", "). c #BCB088", "_. c #A5A5A5", "`. c gray65", "'. c #A3A9AF", "]. c #A9A9A9", "[. c gray67", "{. c #A7B2BC", "}. c #BEB8A4", "|. c #B2B2B2", " X c gray70", ".X c #B4B4B4", "XX c #B7B7B7", "oX c #BFBDB4", "OX c #B9B9B9", "+X c #BBBBBB", "@X c #BCBCBC", "#X c gray74", "$X c gray", "%X c gray75", "&X c #90AFCB", "*X c #9EBCD8", "=X c #80BAEF", "-X c #A5B6C6", ";X c #89C6FF", ":X c #8FC9FF", ">X c #91C9FC", ",X c #93CBFF", " 2 * i.7X0X7X7X", "7X7X_. * h Q ) ! / ( F t -.OX7X7X", "7X7Xi > h ^ _ } X.9.0.q.4.[ p 1.OX%X", "7X7Xe d Q { d.g.n.m.&X-X'.!.u.D 2 R.OX", "7X%X* s ' f.z.v.S.>X3XyXiXrX{.h.f E [.", "7X%X* @ .k.b.B.Z.;X2X6XuXpXtX*X..@ L ^.", "7X XH k l.N.B.V.F.:X2X4X5X4X2Xj.; *.U.", "7X%Xp.& ^ x.B.B.C.F.;X,X. */ /* XPM */ static const char *lb_incr_interline_mlabel_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 27 1", " c black", ". c #010000", "X c #040000", "o c #060000", "O c #0A0000", "+ c #0B0000", "@ c #0C0000", "# c #160000", "$ c #190000", "% c #290000", "& c #320000", "* c #390000", "= c #3B0000", "- c #440000", "; c #530000", ": c #5F0000", "> c #740000", ", c #790000", "< c #BE0000", "1 c #E10000", "2 c #E80000", "3 c #EC0000", "4 c #ED0000", "5 c #F90000", "6 c #FC0000", "7 c red", "8 c None", /* pixels */ " 8888 8888888888888888", " 88 8 88888 *- 88", " 888 .23. 8", "888888888888888 :77> 8", "888888888888888o5776+8", "888888888888888%,77,&8", "88 8888 88 8888 77 8", "8 888 88 888 77 88", " 88 8 88 77 88", "8888888888888888 77 88", "8888888888888888 77 88", "8888888888888888 77 88", " 88 888888 88888 77 88", " 8 888 888 77 88", " 8 8 8 888 77 88", "88888888888888 O$77$@ ", "88888888888888 =7777; ", "88 8888888 888 1774 ", "88 888888 888 #77# 8", "8 88 888 << 88", " 8 8 88 XX 88", "8888888888888888888888" }; bist-0.5.2/images/lb_lib.xpm0000644000175000017500000000731411025523004014252 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_lib_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 121 2", " c black", ". c #000001", "X c #010101", "o c #020102", "O c #020201", "+ c #030203", "@ c #040504", "# c gray2", "$ c #070707", "% c #0E0601", "& c gray3", "* c #0B0B0B", "= c #0C0C0C", "- c #0E0E0E", "; c #0E0F0F", ": c #0F0E0E", "> c gray6", ", c #1F1006", "< c #1F1107", "1 c gray7", "2 c #131313", "3 c #131413", "4 c gray8", "5 c #161616", "6 c #181818", "7 c #1B1B1A", "8 c #1B1B1B", "9 c #201107", "0 c #211107", "q c #221309", "w c #291608", "e c #321603", "r c #311504", "t c #31190A", "y c #321A0A", "u c #331B0A", "i c #222222", "p c #232323", "a c gray16", "s c #2A2A2A", "d c #313031", "f c #313131", "g c #393939", "h c gray24", "j c #411B02", "k c #40210D", "l c #532201", "z c #542201", "x c #5E2601", "c c #5F2601", "v c #512B11", "b c #572D12", "n c #582E13", "m c #593219", "M c #602802", "N c #662900", "B c #682A01", "V c #643414", "C c #484848", "Z c #484949", "A c gray29", "S c #4B4B4B", "D c gray31", "F c gray33", "G c #5A595A", "H c #5A5A5A", "J c #5B5B5B", "K c #626262", "L c #666766", "P c DimGray", "I c #6C6C6C", "U c #727272", "Y c #AA4C0D", "T c #AC551A", "R c #B8520D", "E c #B35B1F", "W c #BC5815", "Q c red", "! c #CA5100", "~ c #CA5201", "^ c #CA5202", "/ c #C85406", "( c #CB5506", ") c #C85A11", "_ c #C26D34", "` c #D36E2B", "' c #D26F2D", "] c #D2702E", "[ c #D47231", "{ c #FF4343", "} c gray51", "| c #858686", " . c #8B8B8B", ".. c #939391", "X. c gray58", "o. c gray59", "O. c #989899", "+. c #999898", "@. c #9A9A9B", "#. c #9D9D9D", "$. c #A1A0A1", "%. c gray63", "&. c #A1A1A2", "*. c #A2A2A2", "=. c #A5A5A5", "-. c gray65", ";. c #A8A9A9", ":. c #AAAAAA", ">. c #AAABAB", ",. c gray68", "<. c #AFAFAF", "1. c #AEB1AE", "2. c #AFB0B0", "3. c #B4B4B4", "4. c gray72", "5. c #B9B9B9", "6. c #BBBBBB", "7. c #BCBCBC", "8. c gray74", "9. c gray75", "0. c #C0C0C0", /* pixels */ "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.", "0.0.. . Z 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.", "0.0.> K 5 . 7 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.", "0.. Z O.%.o.2 . P 8.0.0.0.0.0.0.0.0.0.0.0.0.", "0.# p @.+...| 1.8 . L %.0.0.0.0.0.0.0.0.0.0.", "0.4 s *.%.-.. . m 4 U ,.0.0.0.0.0.0.0.0.0.0.", ". f 3.2.. . % W _ 2 I D . D 0.0.0.0.0.0.0.0.", ". . # . e T R / ' > a . Q . 0.0.0.0.0.0.0.0.", ". q E 6 e ) ! ! ' # . { Q . . . D 0.0.0.0.0.", ". < ! . j Y ! ! n . { Q Q Q Q Q . . . D 0.0.", ". < ! & c ( ! ! . { Q Q Q Q Q Q Q Q { . D 0.", ". < ! & z ! ! ! n . { Q Q Q Q Q Q Q Q { . D ", ". < ~ & l ! ! ! ` . . { Q . . . . { Q Q { . ", ". w ~ # c ! ! ! ` . 4 . Q . Z F p . { Q Q . ", ". y ~ # c ! ! ! ` . C h . p } #.#.g . Q Q . ", ". y ~ . B ! ! ! ` . H 5.o.} -.0.0.4.. Q Q . ", ". y ~ . N ~ ` ` ` 4 J 0.4.<.4.0.0.0.. { Q . ", ". u ~ . V [ ` . . H 0.0.0.0.0.0.0.0.D . Q . ", ". k ~ . n * . * >.5.0.0.0.0.0.0.0.0.0.. Q . ", ". v ~ . . > 4.:.8.0.0.0.0.0.0.0.0.0.0.. Q . ", "0.: . . <.:.6.0.0.0.0.0.0.0.0.0.0.0.0.D . f ", "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.-. ." }; bist-0.5.2/images/lb_scale.xpm0000644000175000017500000000524411025523004014573 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_scale_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 91 1", " c black", ". c #040404", "X c #040405", "o c #050404", "O c #050405", "+ c #050504", "@ c gray4", "# c #0B0A0A", "$ c #111111", "% c #111211", "& c #181818", "* c #181819", "= c #191818", "- c #191919", "; c #1E1E1E", ": c gray13", "> c #272727", ", c #272728", "< c #282929", "1 c gray16", "2 c #292A29", "3 c #2C2D2D", "4 c #2D2C2D", "5 c gray18", "6 c gray19", "7 c #313130", "8 c #313131", "9 c #353535", "0 c gray21", "q c gray22", "w c #393939", "e c #393A39", "r c #393A3A", "t c #3B3A3B", "y c gray23", "u c #3C3C3C", "i c #3D3D3E", "p c #3D3E3E", "a c #3E3E3D", "s c #3E3E3E", "d c #6E2222", "f c gray25", "g c gray26", "h c gray28", "j c gray30", "k c #515151", "l c gray32", "z c gray33", "x c gray34", "c c #5A5A5A", "v c #5D5D5D", "b c #606060", "n c gray40", "m c #6A6A6A", "M c #6C6C6C", "N c gray43", "B c #6F6F6F", "V c #777777", "C c gray47", "Z c #964A4A", "A c #BE7272", "S c #C20F0F", "D c #C51212", "F c #DA2727", "G c red", "H c #E12E2E", "J c #E22F2F", "K c #EC3939", "L c gray51", "P c #8B8B8B", "I c #8E8E8E", "U c gray56", "Y c gray58", "T c gray59", "R c #979797", "E c gray60", "W c #9D9D9D", "Q c gray62", "! c gray64", "~ c #A4A4A4", "^ c gray65", "/ c gray66", "( c gray67", ") c #AFAFAF", "_ c #B2B2B2", "` c gray72", "' c gray73", "] c #BBBBBB", "[ c gray", "{ c #D38787", "} c #C0C0C0", /* pixels */ "} } } } } } } } } } } ", " }}}}}}}}}}}}}}}}}}}}}", "`)`}}G}}}}}}}}}}}}}}} ", " W)}GGG`}}}}{GGGGGG}}}", ")W)GGGGG`}}}[_AGGGG^` ", " W)`YGgvY`}}`^FGGGGN^}", ")W))LGgzL)}}[_GGGGGzW ", " W)`^GnL^`}}}GGGDdGzW}", ")W)}}GVW}}}}KGGk0yGcW ", " W)}}GCW}}}KGHbgkmZmW}", ")W)[}WVW}}}GJBjbI(EL! ", ";:50iy5682G(CzNE`}_^_}", "*;>8qyuyqS2LNVW`}}[`[ ", "%*:28qigi02kL(]}}}}}}}", "#%*:28yigy5hY}}}}}}}} ", "+#%*:25qifykW}}}}G}}}}", " +#$*:28qigzW}}}}GG`} ", " +#%*:28qizGGGGGGGG`}", " +#%*:26yzY^WWWGGvY ", " O#%*:26zYPVVCGggC)", " X#%*:2zY^WWWLzvY ", " O#%*:z } } ^ Y }" }; bist-0.5.2/images/lb_flip_v.xpm0000644000175000017500000000337511025523004014766 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_flip_v_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 27 1", " c black", ". c #232323", "X c gray18", "o c #393939", "O c #444444", "+ c #4B4B4B", "@ c gray31", "# c gray33", "$ c #5D5D5D", "% c #6F6F6F", "& c gray47", "* c #7E7E7E", "= c #E80000", "- c #F40000", "; c red", ": c #808080", "> c gray51", ", c gray52", "< c #8B8B8B", "1 c gray56", "2 c gray58", "3 c #979797", "4 c #9D9D9D", "5 c gray65", "6 c #AFAFAF", "7 c gray72", "8 c #C0C0C0", /* pixels */ "8888888888888888888888", "8888888888 88888888888", "88888888 7 888 8888", "888888 75 12 6788", "88888 752>*>>%% >588", "8888 74>>2 121 $488", "8888 4<25764674% #488", "88885>2788 4686>#o#488", "8@ @88646@ O88", "8 ;;-=- 88 46 <<,&& 88", "8 ;;;;; 78646 <<<<< 78", " ;; X 8 4 @ << 8", "8 ;;;;; 58646 <<<<< 48", "8 ;;;;; 68 46 <<<<< 48", "8 ;; X58646@ << 48", "8 ;; +#%58 4685% << 48", "8 ;; >4578646875 << 48", "8@ .48888 46888@ .48", "885%%5888864688885%%58", "8875578888 46888875578", "8888888888646888888888", "8888888888 46888888888" }; bist-0.5.2/images/lb_load_file.xpm0000644000175000017500000000430111025523004015413 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *load_file_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 57 1", " c black", ". c #090909", "X c #0C0C0C", "o c #131313", "O c #181818", "+ c #1E1E1E", "@ c #352602", "# c gray13", "$ c #2C2C2C", "% c gray21", "& c #4C3703", "* c #444444", "= c #4C4C4C", "- c #515151", "; c #5A5A5A", ": c gray39", "> c gray43", ", c #767676", "< c #7B7B7B", "1 c #B28006", "2 c #FFB709", "3 c #848484", "4 c gray57", "5 c #9D9D9D", "6 c #A0A0A0", "7 c #A2A2A2", "8 c #A5A5A5", "9 c #ACACAC", "0 c #AFAFAF", "q c gray70", "w c #B4B4B4", "e c gray71", "r c #BCBCBC", "t c gray", "y c gray75", "u c #C0C0C0", "i c #C6C6C6", "p c gray79", "a c gray80", "s c LightGray", "d c #D5D5D5", "f c #D8D8D8", "g c gray86", "h c #E1E1E1", "j c #E4E4E4", "k c #E7E7E7", "l c #EAEAEA", "z c #ECECEC", "x c #EEEEEE", "c c #EFEFEF", "v c #F1F1F1", "b c #F3F3F3", "n c #F4F4F4", "m c #F6F6F6", "M c #FBFBFB", "N c #FDFDFD", "B c gray100", /* pixels */ "uu uuuuuuu", "uu BBBBBBkkkm M ruuuuu", "uu BBBBb<...# Bc uuuuu", "uu BBB8+ O. BBf uuuu", "uu Bp% X3m - BBBi uuu", "uu w ;hBB* BBBB ruu", "uu 8 %pBBBBB* quu", "uu 9oBoBBBBBBBBBob 6uu", "uu w$B$B BB$b 5uu", "uu u=B= @1221& B=m 5uu", "uu a>B> 122221& 5uu", "uu f4B4 2222222221& uu", "uu kqBq 2 ", "uu cssl 2 22222222222 ", "uu Mclc 2 22222222222 ", "uu BBBB 2 22222222222 ", "uu BBBB 1 22222222222 ", "uu BBBB & 22222222222 ", "uu BBBB &12222222222 ", "uu BBBB 122222222221 ", "uu 22222222221& ", "uur6,:: u" }; bist-0.5.2/images/lb_select_group.xpm0000644000175000017500000000403311025523004016172 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_select_group_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 46 1", " c black", ". c gray4", "X c #151515", "o c gray11", "O c #252525", "+ c #272727", "@ c #2A2A2A", "# c gray19", "$ c #313131", "% c #323232", "& c #353535", "* c gray21", "= c #373737", "- c #393939", "; c gray24", ": c #3F3F3F", "> c gray25", ", c gray27", "< c gray28", "1 c gray29", "2 c gray32", "3 c gray33", "4 c #555555", "5 c #565656", "6 c gray34", "7 c #5D5D5D", "8 c #606060", "9 c #6C6C6C", "0 c gray50", "q c #908A00", "w c #FFF400", "e c #848484", "r c gray52", "t c #8B8B8B", "y c #8E8E8E", "u c #939393", "i c gray58", "p c gray60", "a c #9A9A9A", "s c #9D9D9D", "d c gray65", "f c #AFAFAF", "g c #B4B4B4", "h c gray72", "j c #BBBBBB", "k c #C0C0C0", /* pixels */ "kkkkkkkkkkkkkkk6fhkkkk", "kkkkkkkkkkkkkk6w#dkkkk", "kkkkkkkkkkkkk;qwq6hkkk", "kkkkkkkkkkkk6wqwqw hkk", "kkkkkkkkkkj6qqwwwqq#hk", "kkkkkkkkk66wwwwwwwww*>", "kkkkkkkkkhd6qqwwwqqX9a", "kkkkkkkkjgt26wqwqw *60", "kkkkkkkkkhe+ 6qwq6@;9a", "kkkkkkkkka* w +*8aj", "kkkkkkkka* +o.+*7ihk", "kkkkkkka* #*<1<8ihkk", "kkkkkka* #-7yueahkkk", "kkkkja* #-7 h g k k ", "kkkka* #-7ihkkkkkkkk", "kkka* #-7ih kkkkkkk ", "kka* #-7ihkkkkkkkkkk", "ka* #-7ihkk kkkkkkk ", "a* #-7ihkkkkkkkkkkkk", "* #-7ihkkkk kkkkkkk ", " #-7ihkkkkkkkkkkkkkk", "s6#-7ihkkkkkk k k k k " }; bist-0.5.2/images/lb_save_file.xpm0000644000175000017500000000735111025523004015442 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_save_file_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 122 2", " c black", ". c gray3", "X c #090909", "o c #0C0C0C", "O c #131313", "+ c #181818", "@ c #1E1E1E", "# c gray13", "$ c gray19", "% c gray21", "& c #3C3C3C", "* c gray25", "= c #444444", "- c gray29", "; c gray31", ": c #515151", "> c #5A5A5A", ", c #5D5D5D", "< c #686868", "1 c #6D6D6D", "2 c gray44", "3 c gray46", "4 c #7B7B7B", "5 c #3F28CB", "6 c #422BCC", "7 c #4630CD", "8 c #4631CD", "9 c #4934CE", "0 c #4B35CF", "q c #4D38CF", "w c #503BD0", "e c #503CD0", "r c #523ED0", "t c #5440D1", "y c #5541D1", "u c #5440D2", "i c #5541D2", "p c #5844D2", "a c #5C49D3", "s c #5D4AD4", "d c #5D4BD4", "f c #604ED5", "g c #6352D6", "h c #6655D7", "j c #6656D7", "k c #6A59D8", "l c #6F60DA", "z c #7160DA", "x c #7161DA", "c c #7567DB", "v c #786ADC", "b c #796ADD", "n c #796BDD", "m c #D30000", "M c #D50C0C", "N c #D50C0D", "B c #D61211", "V c #D92525", "C c #DE3F40", "Z c #DE4040", "A c #E04A4A", "S c #E25556", "D c #E97F7F", "F c #8173DF", "G c #887CE2", "H c #E97F80", "J c #818181", "K c #848484", "L c #8B8B8B", "P c #929292", "I c #9D9D9D", "U c #A2A2A2", "Y c gray64", "T c #A5A5A5", "R c gray66", "E c #A9A9A9", "W c #ACACAC", "Q c #AFAFAF", "! c #B1B1B1", "~ c #B4B4B4", "^ c gray71", "/ c #B6B6B6", "( c gray72", ") c #B9B9B8", "_ c #B9B9B9", "` c #BCBCBC", "' c gray", "] c gray75", "[ c #8D82E3", "{ c #8E83E3", "} c #9086E4", "| c #EC8F90", " . c #EC9090", ".. c #F3B7B9", "X. c #F3B8B8", "o. c #F3B8B9", "O. c #C0C0C0", "+. c #C1C1C1", "@. c #C6C6C6", "#. c gray79", "$. c #CACACA", "%. c #CBCBCB", "&. c #CDCDCD", "*. c #D7D7D7", "=. c #DDDDDD", "-. c #F7D1D2", ";. c #F7D2D2", ":. c #F8D1D2", ">. c #E1E1E1", ",. c #E4E4E4", "<. c #E7E7E7", "1. c #E9E9E9", "2. c #EEEEEE", "3. c #F1F1F1", "4. c gray95", "5. c #F3F3F3", "6. c #F6F6F6", "7. c #F9F9F9", "8. c gray98", "9. c #FDFDFD", "0. c #FFFEFF", "q. c gray100", /* pixels */ "O.O. _ ` O.O.O.O.O.", "O.O. q.q.q.q.q.q.<.1.1.5. 8. ~ O.O.O.O.O.", "O.O. q.q.q.q.5.4 . . . # q.1. ~ O.O.O.O.", "O.O. q.q.q.T @ + . q.q.&. _ O.O.O.", "O.O. q.#.% o K 5. : q.q.q.W _ O.O.", "O.O. ~ > >.q.q.= q.q.q.q. ~ O.O.", "O.O. R . & #.q.q.q.q.q.- Y O.O.", "O.O. W O q.O q.q.q.q.q.q.q.q.q.O 3. I O.O.", "O.O. ~ # q.# q.q.q.q.q.q.q.q.q.# 5. I O.O.", "O.O. ~ $ q.$ q.q.q.q.q.q.q.q.q.$ 5. I O.O.", "O.O. ` * q.& q.q.q. ", "O.O. O.; q.; q.q.q. { ..;.X.D C M _ ", "O.O. @., q., q.q.q. { :.q.;.| A B y ", "O.O. #.< 1 ~ q.q.q. { ..;.X.D A M y ", "O.O. <.J 2 2 J &.q. G H | H S V m q ", "O.O. q.8.~ 3 2 2 P F q ", "O.O. q.q.q.2.U 2 2 b b b v x k g s y q ", "O.O. q.q.q.q.q.=.L l x q 0 ", "O.O. q.q.q.q.q.q.q. h j _ d _ ) 0 8 ", "O.O. 1.=.*.*.*.*.*. s s _ p _ ) 8 6 ", "O.O. y y _ q _ _ 6 5 ", "O.O.O.~ R T T U T T U " }; bist-0.5.2/images/lb_draw_arrow.xpm0000644000175000017500000000657711025523004015665 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_draw_arrow_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 101 2", " c black", ". c #020202", "X c gray1", "o c #040404", "O c #060606", "+ c #070707", "@ c gray3", "# c #0B0B0B", "$ c #0C0C0C", "% c gray5", "& c #0E0E0E", "* c #111111", "= c gray8", "- c #181818", "; c gray10", ": c #1B1B1B", "> c #1D1D1D", ", c #232323", "< c gray14", "1 c gray15", "2 c #272727", "3 c #282828", "4 c gray17", "5 c gray18", "6 c #323232", "7 c #343434", "8 c gray21", "9 c gray22", "0 c #3A3A3A", "q c #3C3C3C", "w c gray25", "e c gray28", "r c #484848", "t c #4C4C4C", "y c #4E4E4E", "u c #515151", "i c gray32", "p c gray35", "a c #5A5A5A", "s c gray37", "d c #606060", "f c gray38", "g c gray40", "h c #6A6A6A", "j c gray42", "k c #6D6D6D", "l c gray43", "z c gray44", "x c #727272", "c c gray45", "v c #747474", "b c gray46", "n c #777777", "m c #797979", "M c #7B7B7B", "N c gray49", "B c #7E7E7E", "V c gray50", "C c #818181", "Z c gray51", "A c #848484", "S c gray53", "D c #8B8B8B", "F c gray55", "G c #909090", "H c gray57", "J c #939393", "K c gray58", "L c #959595", "P c gray59", "I c #979797", "U c #989898", "Y c gray60", "T c #9A9A9A", "R c #9D9D9D", "E c gray62", "W c #9F9F9F", "Q c #A0A0A0", "! c #A2A2A2", "~ c #A4A4A4", "^ c #A5A5A5", "/ c gray65", "( c #A7A7A7", ") c #A9A9A9", "_ c #AAAAAA", "` c #ACACAC", "' c gray68", "] c #AFAFAF", "[ c #B1B1B1", "{ c #B2B2B2", "} c gray70", "| c #B4B4B4", " . c gray71", ".. c gray72", "X. c #B9B9B9", "o. c gray73", "O. c #BBBBBB", "+. c gray74", "@. c gray", "#. c gray75", "$. c #C0C0C0", /* pixels */ "$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.", "$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.", "$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.| V ! +.", "$.$.$.$.$.$.$.$.$.$.$.$.$.$.$.' z 8 $ K ' ", "$.$.$.$.$.$.$.$.$.$.$.$.! d 2 4 z ( ", "$.$.$.$.$.$.$.$.$.K p ; 8 n ' ", "$.$.$.$.$.$.$.$.$.( y @ @ y F o.", "$.$.$.$.$.$.$.$.$.+.) V 2 > d W +.", "$.$.$.$.$.$.$.$.$.+.o.Z o 9 M [ $.", "$.$.$.$.$.$.$.$.$.$.F o o $ u H o.$.", "$.$.$.$.$.$.$.$.$.A o @ 6 @ , g ( +.$.", "$.$.$.$.$.$.$.+.| Y o 8 d w e V [ $.$.", "$.$.$.$.$.$.$.n q K 5 $ q d H Y 4 h Y +.$.$.", "$.$.$.$.$.$.l h n h l K | o.H H ) +.$.$.", "$.$.$.$.$.[ K * V Y ( | +.$.o.[ o.$.$.$.", "$.$.$.$.p K W 8 = e M ' +.+.$.$.+.$.+.$.$.$.", "$.$.$.u M Z n z Y o.+.$.$.$.$.$.$.$.$.$.", "$.$.F 9 > A ! ) o.$.$.$.$.$.$.$.$.$.$.$.", "$.$.( l 2 ; y Z ' +.$.$.$.$.$.$.$.$.$.$.$.$.", "$.$.o.W V z n W o.$.$.$.$.$.$.$.$.$.$.$.$.$.", "$.$.$.o.) ( ' o.$.$.$.$.$.$.$.$.$.$.$.$.$.$.", "$.$.$.$.+.+.+.$.$.$.$.$.$.$.$.$.$.$.$.$.$.$." }; bist-0.5.2/images/icon.xpm0000644000175000017500000000665111025523004013762 0ustar cagecage/* XPM */ static const char* icon_xpm[] = { "22 22 149 2", " c None", ". c #A49172", "+ c #6B4301", "@ c #543300", "# c #835201", "$ c #7C5D23", "% c #957125", "& c #926108", "* c #5A3600", "= c #754A00", "- c #7B4E01", "; c #945C02", "> c #826739", ", c #483B27", "' c #A5822F", ") c #805B0F", "! c #5D3900", "~ c #7A520B", "{ c #8E8472", "] c #56400C", "^ c #705D3E", "/ c #9F9889", "( c #968968", "_ c #4A2E02", ": c #C8A137", "< c #705B2F", "[ c #715415", "} c #7C5B1B", "| c #A76C10", "1 c #A47412", "2 c #796328", "3 c #C2A891", "4 c #704600", "5 c #633D00", "6 c #8A6F2B", "7 c #3F2803", "8 c #432901", "9 c #3E2500", "0 c #926920", "a c #9D7113", "b c #D07F00", "c c #CB7D02", "d c #8F6819", "e c #AB9573", "f c #807A6C", "g c #4F3918", "h c #553909", "i c #7D7261", "j c #835E22", "k c #4E3102", "l c #87671C", "m c #321D01", "n c #958768", "o c #5C5039", "p c #BAA785", "q c #D78904", "r c #CF8904", "s c #DC8A02", "t c #986F23", "u c #9A7D4E", "v c #A49E93", "w c #AEAAA1", "x c #856D41", "y c #6E6656", "z c #9C6103", "A c #674100", "B c #5D4411", "C c #A58127", "D c #7B6C51", "E c #8A7034", "F c #D58811", "G c #C27D04", "H c #A47E24", "I c #B58316", "J c #C08306", "K c #B9955C", "L c #8D621F", "M c #9C7E5A", "N c #8E7C58", "O c #61430D", "P c #9E6D1E", "Q c #A47619", "R c #DA8400", "S c #9A6D13", "T c #CC8103", "U c #6D5424", "V c #A06303", "W c #684409", "X c #74603F", "Y c #5C4D34", "Z c #ACB3B3", "` c #8F9695", " . c #5D4D2F", ".. c #AAA396", "+. c #AB6A04", "@. c #B0821B", "#. c #E48A00", "$. c #BD7A04", "%. c #6C4A10", "&. c #8D897D", "*. c #C6CDCD", "=. c #8A8B84", "-. c #694C1F", ";. c #B26F04", ">. c #BE8206", ",. c #6B5A35", "'. c #70572D", "). c #D6DBDB", "!. c #A59783", "~. c #CC8612", "{. c #BA7404", "]. c #9D917E", "^. c #8B5808", "/. c #CED0CF", "(. c #C0C7C8", "_. c #726B5C", ":. c #B3A483", "<. c #AD730D", "[. c #A27D45", "}. c #8E5801", "|. c #BBB5A8", "1. c #747369", "2. c #7E5001", "3. c #D58403", "4. c #B27915", "5. c #B59D73", "6. c #8A5601", "7. c #E5E4E3", "8. c #666357", "9. c #BAA37C", "0. c #A9792F", "a. c #876017", "b. c #B2A288", "c. c #995F02", "d. c #77561A", "e. c #CCCDCB", "f. c #C2BEB3", "g. c #C0C5C4", "h. c #B89E74", "i. c #936B2D", "j. c #EAEBEA", "k. c #876C39", "l. c #DEE2E3", "m. c #B4AB9A", "n. c #9C9E9B", "o. c #6C542A", "p. c #513811", "q. c #7B633B", "r. c #8C754D", " ", " . + @ # $ ", " % & * = # - ; > , ", " ' ) + - - - ! ~ { ] ^ ", " / ( _ + - ! ! + : < [ } ", " | 1 2 3 @ 4 = * @ 5 6 7 8 9 ", " 0 a b c d e f + = g h 5 i j k l m n o ", "p q r c s t u v 5 4 w x 5 y z A B 7 [ C D ", "E F G H I J K L M + = 3 x ! y N k 8 O P k D ", "Q s r R S T U V W _ 5 X W @ Y Z ` .h _ @ ..", "+.@.0 #.$.s h z 4 %.5 4 = 5 8 &.*.=.@ A -. ", ";.G >.c d R ,.4 5 8 ! = 5 5 @ '.).Z .* !. ", "P ~.{.H {.1 ].^.+ 5 5 4 + 9 5 = /.(._.= !. ", ":.$.s s b <. [.}.* = # - ! = # |.).1.2.p ", " $ S 3.4.5. }.! 5 6.@ 4 = - ..7.8.- 9. ", " 0.a.b. c.5 = # _ 4 4 d.f e.,.- 9. ", " e c.5 = 2.@ A 5 # f.g.O # h. ", " i.}.! = # + @ A ~ j.v A 6.h. ", " # = * = # = ! 4 k.l.X - c.m. ", " j * g + # - A ,._.n.o.= ~ ", " / p. q.# q. ", " r. "}; bist-0.5.2/images/lb_group_ungroup_mlabel.xpm0000644000175000017500000000260111053227524017736 0ustar cagecage/* Bist icon Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ static const char * lb_group_ungroup_mlabel_xpm[] = { "22 22 3 1", " c None", ". c #FF0000", "+ c #000000", " ", " ", " ", " ", " ... ... ... ... ... ", " . ", " . ++++++++++++++++ . ", " . . ", " . ", " ++++++++++++++++ . ", " . . ", " . . ", " . ++++++++++++++++ ", " . ", " . . ", " . ++++++++++++++++ . ", " . ", " ... ... ... ... ... ", " ", " ", " ", " "}; bist-0.5.2/images/lb_zoom.xpm0000644000175000017500000001263411025523004014471 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_zoom_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 231 2", " c black", ". c #000001", "X c #010101", "o c #010202", "O c #020202", "+ c gray1", "@ c #020305", "# c #030405", "$ c #060500", "% c #070601", "& c #040404", "* c gray2", "= c #040607", "- c #060606", "; c #040608", ": c #05070A", "> c #06080B", ", c #07090C", "< c gray3", "1 c #090909", "2 c #0E0E0E", "3 c #091118", "4 c #0A121A", "5 c #181100", "6 c #181203", "7 c #191303", "8 c #181204", "9 c #1B1503", "0 c #1C1300", "q c gray7", "w c gray9", "e c #16191C", "r c #181819", "t c #191919", "y c #181A1B", "u c gray10", "i c #1B1B1C", "p c gray11", "a c gray12", "s c #0D1822", "d c #101E2B", "f c #1A1F25", "g c #12212F", "h c #13212F", "j c #132231", "k c #162A3B", "l c #182B3D", "z c #231800", "x c #241900", "c c #251900", "v c #291C00", "b c #312200", "n c #3B2800", "m c #202020", "M c #232323", "N c gray14", "B c #272727", "V c #2A2927", "C c #2A2A2A", "Z c #2C2C2C", "A c gray18", "S c #282C30", "D c #293139", "F c #313131", "G c #323232", "H c #353535", "J c #373737", "K c #393835", "L c #3A3936", "P c gray22", "I c #3A3A3A", "U c #3C3C3C", "Y c #3E3E3E", "T c #3F3F3F", "R c #1A3045", "E c #1A3146", "W c #1F3244", "Q c #1D364D", "! c #1E374E", "~ c #263747", "^ c #2E3C49", "/ c #203A52", "( c #203C55", ") c #23415D", "_ c #23425E", "` c #2D465D", "' c #3E4043", "] c #274866", "[ c #284765", "{ c #2B5072", "} c #2F577C", "| c #3E5061", " . c #355471", ".. c #345575", "X. c #432E00", "o. c #604100", "O. c #604200", "+. c #604300", "@. c #614600", "#. c #614701", "$. c #614D0C", "%. c #434343", "&. c #444444", "*. c gray27", "=. c #464646", "-. c gray28", ";. c #494949", ":. c gray29", ">. c #4B4B4B", ",. c #4C4C4C", "<. c #4E4E4E", "1. c gray31", "2. c #515151", "3. c gray32", "4. c #535353", "5. c #545A5E", "6. c gray35", "7. c #5A5A5A", "8. c #5B5B5B", "9. c #5F5F5F", "0. c #425C73", "q. c #4D5F70", "w. c #56616B", "e. c #626262", "r. c gray39", "t. c #656565", "y. c #676767", "u. c #65696D", "i. c DimGray", "p. c gray42", "a. c gray43", "s. c #6F6F6F", "d. c gray46", "f. c #7E7E7E", "g. c #386692", "h. c #3C6F9E", "j. c #4A83B8", "k. c #72818F", "l. c #6087AB", "z. c #4E8FCC", "x. c #5196D6", "c. c #5297D7", "v. c #57A0E5", "b. c #5AA5EB", "n. c #5FACF3", "m. c #5EADF7", "M. c #6197CA", "N. c #78A4CC", "B. c #69A7E0", "V. c #60B1FC", "C. c #61B3FF", "Z. c #68B7FF", "A. c #6CB8FF", "S. c #72BBFF", "D. c #77BBF9", "F. c #76BBFB", "G. c #78BEFF", "H. c #7ABFFF", "J. c #8A5E00", "K. c #A77200", "L. c #BB8F04", "P. c #B79211", "I. c #BFA334", "U. c #C58600", "Y. c #C4AE54", "T. c #C2B270", "R. c #818181", "E. c gray51", "W. c #838383", "Q. c #848484", "!. c gray53", "~. c #898989", "^. c #8B8B8B", "/. c gray55", "(. c gray57", "). c #929292", "_. c #939393", "`. c #979797", "'. c #9D9D9D", "]. c gray62", "[. c #A2A2A2", "{. c #A5A5A5", "}. c gray65", "|. c #A3A9AF", " X c #A9A9A9", ".X c gray67", "XX c #ACACAC", "oX c #A7B2BC", "OX c gray69", "+X c #B2B2B2", "@X c gray70", "#X c #B4B4B4", "$X c gray71", "%X c #B7B7B7", "&X c #B9B9B9", "*X c #BBBBBB", "=X c #BCBCBC", "-X c gray74", ";X c gray", ":X c gray75", ">X c #90AFCB", ",X c #9EBCD8", " * i.tXiXtXtX", "tXtX{. * h E ! W ~ ^ D e =.%XtXtX", "tXtXu > h ! ( ] .0.q.w.5.' i 2.%XtX", "tXtXq d E ] g.j.M.N.>X1X|./.u.Z & < ~.%X", "tX:X* s _ h.c.n.F.4X9XgXjXdXoXk.h T XX", "tX:X* @ } z.m.C.S.2X8XwXhXkXfX,X| * H _.", "tX@XG l x.V.C.Z.H.4X8X0XqX0X8Xl.; T W.", "tX:Xa.@ ! v.C.C.A.H.2X5X6X5X. */ /* XPM */ const static char *lb_undo_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 142 2", " c black", ". c #010101", "X c #020000", "o c #020101", "O c #030000", "+ c #030202", "@ c #040101", "# c #050000", "$ c #040202", "% c #050303", "& c #080000", "* c #090303", "= c #0B0000", "- c #0A0202", "; c #0E0000", ": c #0C0C0C", "> c gray5", ", c #0E0E0E", "< c #110000", "1 c #130000", "2 c #170000", "3 c #150606", "4 c #150707", "5 c #100909", "6 c #120909", "7 c #150A0A", "8 c #170808", "9 c #1C0808", "0 c #1D0A0A", "q c #111111", "w c gray7", "e c #1B1717", "r c #181818", "t c #191919", "y c #1B1B1B", "u c gray11", "i c #1E1E1E", "p c gray12", "a c #240000", "s c #200A0A", "d c #220F0F", "f c #251111", "g c #350D0D", "h c #3B0000", "j c #331818", "k c #232323", "l c #252525", "z c gray15", "x c #2A2A2A", "c c #2D2D2D", "v c #313131", "b c gray21", "n c gray22", "m c gray23", "M c #3C3C3C", "N c #3F3F3F", "B c #411111", "V c #431313", "C c #4C1010", "Z c #540000", "A c #482121", "S c #572727", "D c #5E2929", "F c #641414", "G c #6E1D1D", "H c #700000", "J c #761919", "K c #781B1B", "L c #7A1A1A", "P c #612727", "I c #652626", "U c #6F2323", "Y c gray25", "T c #464646", "R c #484848", "E c #494949", "W c #4B4B4B", "Q c gray30", "! c gray31", "~ c #515151", "^ c gray33", "/ c #555555", "( c gray34", ") c #585858", "_ c #5D5D5D", "` c #5F5F5F", "' c #646464", "] c #656565", "[ c DimGray", "{ c #6F6F6F", "} c gray45", "| c gray47", " . c gray48", ".. c #7C7C7C", "X. c #8A0000", "o. c #A60000", "O. c #AD0808", "+. c #B53232", "@. c #C00607", "#. c #C90000", "$. c #DF0000", "%. c #D03434", "&. c #DA3B3B", "*. c #DD3B3B", "=. c #E10D0D", "-. c #EF0F0F", ";. c #E61717", ":. c #EB1313", ">. c #F80000", ",. c red", "<. c #FF0303", "1. c #F31010", "2. c #FC1313", "3. c #F62727", "4. c #808080", "5. c #818181", "6. c gray52", "7. c #868686", "8. c gray55", "9. c #8E8E8E", "0. c gray56", "q. c #918F8F", "w. c gray58", "e. c #959595", "r. c #979797", "t. c #9A9A9A", "y. c #9F9F9F", "u. c #A0A0A0", "i. c #A2A2A2", "p. c #A5A5A5", "a. c #A7A7A7", "s. c gray67", "d. c gray69", "f. c #B1B1B1", "g. c #B4B4B4", "h. c gray71", "j. c #B7B7B7", "k. c gray72", "l. c gray73", "z. c gray74", "x. c gray", "c. c #C0C0C0", /* pixels */ "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.c.h.| Q z z z z Y 8.c.c.c.", "c.c.c.c.c.c.c.x.t.W 7 P U F C g s 5 % u { c.", "c.c.c.c.c.c.c.` f +.O.o.X.H Z h a < % = e c.", "c.c.c.c.c.c.` D :.>.#.O.J V 0 4 8 8 = % 1 q.", "c.c.c.c.c.e.j 2.>.$.K % : w t u t : % ; d ", "c.c.c.c.c.T *.,.1.0 : t x N ^ ' ' ) u = 2 ", "c.c.c.c.r.A ,.,.U 5 x ~ .e.p.d.f.a.8. < ", "! ~ c.W &.,.:.% c [ u.k.c.c.c.c.c.x.W % = ", " ,. } S ,.,.L w ^ i.x.c.c.c.c.c.c.c.7.% % ", " ,. 5 3.,.;. v 5.l.c.c.c.c.c.c.c.c.j. ", " ,. %.,.,.V w ) p.c.c.c.c.c.c.c.c.c.c.e. ", " ,.,.,.,.,. b 7.k.c.c.c.c.c.c.c.c.c.c.k...", " ,.,.,.,. : ` s.c.c.c.c.c.c.c.c.c.c.c.c.h.", " ,.,.,.,. n x.c.c.c.c.c.c.c.c.c.c.c.c.c.", " ,.,.,.,.,.,. c.c.c.c.c.c.c.c.c.c.c.c.c.c.", "! I M d.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.[ N k z c Y ' y.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.a...| 4.4.5.0.d.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.x.h.x.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.", "c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c." }; bist-0.5.2/images/lb_flip_h.xpm0000644000175000017500000000337411025523004014747 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_flip_h_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 27 1", " c black", ". c #232323", "X c gray18", "o c gray19", "O c #393939", "+ c #414141", "@ c #4B4B4B", "# c gray31", "$ c gray33", "% c #5D5D5D", "& c gray40", "* c #6F6F6F", "= c #717171", "- c red", "; c gray51", ": c gray53", "> c #8B8B8B", ", c gray56", "< c gray58", "1 c #979797", "2 c #9D9D9D", "3 c #9F9F9F", "4 c gray65", "5 c #A7A7A7", "6 c #AFAFAF", "7 c gray72", "8 c #C0C0C0", /* pixels */ "8888888# #88888888", "8888888 ----- 88888888", "8888888 ----- 78888888", "8888888 -- X48888888", "8888888 ----- 48888888", "8888888 ----- 6 88888", "8888888 -- X474 7888", "8888888 -- @$*46>; 788", "8888888 -- ;247741 277", "8888888# .28888871 58", "888888884**48888884 17", " 6 6 6 6 1 4 6 6 6 : 1", "6222222+ +22222222 =:", "7666666 >> 66666666 ,3", "8888888 >> 8888888 >4", "8888888 >> #88 8 >*2", "8888888 >>>>> 88 **4", "8888888 >>>>> 8 &>7", "8888888 >> #8 28", "8888888 >>>>> 84&Oo@>7", "8888888 >>>>> 84*$$%;6", "8888888# #87422247" }; bist-0.5.2/images/lb_draw_box.xpm0000644000175000017500000000465411367264754015344 0ustar cagecage/* Bist icon Copyright (C) 2010 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char * lb_draw_box_xpm[] = { "22 22 75 1", " c None", ". c #C0C0C0", "+ c #BEBEBE", "@ c #BDBDBD", "# c #BCBCBC", "$ c #BBBBBB", "% c #BFBFBF", "& c #B7B7B7", "* c #ABABAB", "= c #A0A0A0", "- c #9E9E9E", "; c #9C9C9C", "> c #9B9B9B", ", c #9D9D9D", "' c #9F9F9F", ") c #B9B9B9", "! c #ACACAC", "~ c #434343", "{ c #404040", "] c #4F4F4F", "^ c #575757", "/ c #5D5D5D", "( c #5A5A5A", "_ c #585858", ": c #5B5B5B", "< c #595959", "[ c #505050", "} c #424242", "| c #444444", "1 c #A2A2A2", "2 c #3B3B3B", "3 c #898989", "4 c #999999", "5 c #989898", "6 c #979797", "7 c #959595", "8 c #7E7E7E", "9 c #BABABA", "0 c #B8B8B8", "a c #B3B3B3", "b c #929292", "c c #A4A4A4", "d c #555555", "e c #A6A6A6", "f c #969696", "g c #5C5C5C", "h c #A7A7A7", "i c #3E3E3E", "j c #5E5E5E", "k c #4C4C4C", "l c #9A9A9A", "m c #A3A3A3", "n c #4B4B4B", "o c #4E4E4E", "p c #5F5F5F", "q c #A1A1A1", "r c #545454", "s c #565656", "t c #535353", "u c #A8A8A8", "v c #515151", "w c #B6B6B6", "x c #474747", "y c #353535", "z c #919191", "A c #878787", "B c #373737", "C c #242424", "D c #2C2C2C", "E c #414141", "F c #525252", "G c #484848", "H c #B2B2B2", "I c #AEAEAE", "J c #A5A5A5", "..+@#$$$$$$$$##@@+%%..", ".&*=--;->>>>;;,,'-=*).", "%!~{]^/(/_(:^(<(^[}|!+", "%1234>4565654464478|'+", "%1|;&9)9)))))0000ab];$", "%c~'$.........%%%)6d;$", "%e}=#............)fg,$", "%hi=$............0fj-$", "%ckl$............07/>$", "+mnl$............07/l$", "+mol9............06/;$", "@m^l9............04p;$", "#qrl$............)l_,#", "$,r69............)4g,#", "$,s6)............)ls-@", "#'_6)............)lt'@", "@m. */ /* XPM */ const static char *lb_draw_triple_bond_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 123 2", " c black", ". c #010101", "X c #020202", "o c gray2", "O c #060606", "+ c #070707", "@ c gray3", "# c #090909", "$ c gray4", "% c #0B0B0B", "& c #0C0C0C", "* c gray5", "= c #0E0E0E", "- c #111111", "; c #1B1B1B", ": c gray11", "> c #1D1D1D", ", c #1E1E1E", "< c gray12", "1 c #202020", "2 c gray13", "3 c #222222", "4 c #232323", "5 c gray14", "6 c #252525", "7 c gray15", "8 c #272727", "9 c #282828", "0 c gray16", "q c #2A2A2A", "w c gray17", "e c #2D2D2D", "r c gray18", "t c #2F2F2F", "y c gray19", "u c #313131", "i c #323232", "p c gray20", "a c #343434", "s c #353535", "d c gray21", "f c #373737", "g c gray22", "h c #3A3A3A", "j c gray23", "k c gray24", "l c #3E3E3E", "z c gray26", "x c #444444", "c c gray27", "v c gray28", "b c gray29", "n c #4B4B4B", "m c #4C4C4C", "M c gray30", "N c #4E4E4E", "B c gray31", "V c #505050", "C c #515151", "Z c #535353", "A c gray33", "S c #555555", "D c #565656", "F c #585858", "G c #5A5A5A", "H c #5B5B5B", "J c #5D5D5D", "K c gray37", "L c #5F5F5F", "P c #606060", "I c gray39", "U c #656565", "Y c #686868", "T c #6A6A6A", "R c #6C6C6C", "E c gray43", "W c gray44", "Q c #717171", "! c #727272", "~ c gray46", "^ c #767676", "/ c #777777", "( c gray47", ") c #797979", "_ c #7B7B7B", "` c #7C7C7C", "' c gray49", "] c #7E7E7E", "[ c gray52", "{ c #868686", "} c gray54", "| c #8B8B8B", " . c gray55", ".. c gray56", "X. c gray58", "o. c #959595", "O. c #989898", "+. c gray60", "@. c #9D9D9D", "#. c #A0A0A0", "$. c #A2A2A2", "%. c gray64", "&. c #A4A4A4", "*. c #A5A5A5", "=. c gray65", "-. c #A7A7A7", ";. c gray66", ":. c #A9A9A9", ">. c gray67", ",. c #ACACAC", "<. c gray68", "1. c #AEAEAE", "2. c gray69", "3. c #B2B2B2", "4. c gray72", "5. c #B9B9B9", "6. c gray73", "7. c #BBBBBB", "8. c #BCBCBC", "9. c gray74", "0. c gray", "q. c gray75", "w. c #C0C0C0", /* pixels */ "w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.0.", "w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.o.) #.", "w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.0.3.Q . @ I ", "w.w.w.w.w.w.w.w.w.0.1.I 1 f S +.3.Y . . = S ", "w.w.w.w.w.w.w.w.w.;.K . . @ I +.U . . O 6 m ", "w.w.w.w.w.w.w.0.;.S . . @ t H c . . O < f m ", "w.w.w.w.w.w.0.;.S . . @ 6 p w . . O < t c E ", "w.w.w.w.w.0.&.V . . @ 1 p 6 . . O 1 t p U o.", "w.w.w.w.0.&.n . . @ 6 t 1 . . O 1 t 6 w { ;.", "w.w.w.0.@.n . . @ 6 p 1 . . @ 1 t 6 . p .1.", "w.w.0.#.z . . @ 6 t 1 . . @ 6 p 6 . . w ' &.", "w.0.&.z . . = 6 p < . . @ 6 t 1 . . @ p E #.", "w.3.Y . . @ w t < . . @ 6 t 1 . . @ 6 k Q &.", "w.#.m . = w t ; . . @ 6 p 1 . . @ 1 f V { 3.", "w.&.K 1 t t < . . @ 6 p 1 . . @ 6 f m ~ #.0.", "0.1.' H h ; . . = 6 t 1 . . @ 6 h m ) @.7.0.", "w.7. .Y 1 . . = 6 t < . . @ 6 h m ) @.7.0.w.", "0.7.} t . . = w t < . . @ w f V ) #.7.0.0.w.", "0.@.f . . = w w ; . . = w h V ' &.7.0.w.w.w.", "0.~ . . - 6 p p w 6 6 t h V ' #.7.0.0.w.w.w.", "0.} t w t f m E ~ K n c H ' &.7.0.w.w.w.w.w.", "w.1.~ V k S ' o.} ~ E Q } ;.7.w.w.w.w.w.w.w." }; bist-0.5.2/images/lb_draw_chain.xpm0000644000175000017500000000524311025523004015602 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_draw_chain_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 91 1", " c black", ". c #060606", "X c #090909", "o c #0B0B0B", "O c gray6", "+ c #101010", "@ c gray7", "# c gray8", "$ c gray9", "% c #1E1E1E", "& c gray13", "* c #232323", "= c gray15", "- c gray18", "; c gray19", ": c #323232", "> c gray20", ", c #353535", "< c gray21", "1 c #3A3A3A", "2 c gray24", "3 c #414141", "4 c gray26", "5 c gray27", "6 c gray28", "7 c #484848", "8 c gray29", "9 c #4B4B4B", "0 c #4C4C4C", "q c #4E4E4E", "w c gray31", "e c #505050", "r c gray32", "t c #555555", "y c #585858", "u c #5A5A5A", "i c #5B5B5B", "p c gray36", "a c #5D5D5D", "s c #5F5F5F", "d c #626262", "f c #646464", "g c #656565", "h c #676767", "j c #686868", "k c #6A6A6A", "l c gray42", "z c #6D6D6D", "x c gray43", "c c gray44", "v c #717171", "b c #727272", "n c #7B7B7B", "m c gray50", "M c #848484", "N c gray52", "B c gray53", "V c #8E8E8E", "C c #909090", "Z c gray58", "A c #959595", "S c #989898", "D c #9A9A9A", "F c #9D9D9D", "G c gray62", "H c #9F9F9F", "J c #A0A0A0", "K c gray63", "L c #A2A2A2", "P c gray64", "I c #A5A5A5", "U c #A9A9A9", "Y c gray67", "T c #ACACAC", "R c gray68", "E c #AEAEAE", "W c #AFAFAF", "Q c gray69", "! c #B1B1B1", "~ c gray70", "^ c #B4B4B4", "/ c gray71", "( c #B6B6B6", ") c gray72", "_ c gray73", "` c #BBBBBB", "' c #BCBCBC", "] c gray74", "[ c gray", "{ c gray75", "} c #C0C0C0", /* pixels */ "}}}}}}}}}}}}}}}}}}}}}}", "}}}}}}}}}}}}}}}}}}}}}}", "}}}}}}}}}}}}}}}}}}}}}}", "}}}}}}}}}}}}}}}}}}}}}}", "}}}}}}}}}}}{}}}}}}}}{{", "}}}R,G({}}}{a(`}}}}~h~", "}}}* #B(}}}4 >L`}}{> d", "}}V o 1D{}~ * vY{{V =t", "}{O >. jY{% a# V({O 2i", "}9 45r %Bn zjn 9Gr 45M", "L =5vL- 8 rzVRa j =8vY", " o8dL{Lo OjB~{~# .8dL{", "IvhA`}`n+,hG{}{n+1iV`}", "RGL`}}}(hiB~{}{GdhB(}}", "({}}}}}{RGY`}}A{YGR{}}", "{{}}}}}}{`{}}} 9 9}}}", "{{}}}}}}}}}}}} r9 }}}", "}}}}}}}}}}}}}} 9}I }}}", "}}}}}}}}}}}}}} }}I }}}", "}}}}}}}}}}}}}} }}I }}}", "}}}}}}}}}}}}}}}}}}}}}}", "}}}}}}}}}}}}}}}}}}}}}}" }; bist-0.5.2/images/lb_paste.xpm0000644000175000017500000000337211025523004014620 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_paste_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 27 1", " c black", ". c gray19", "X c gray33", "o c gray40", "O c #6F6F6F", "+ c #727272", "@ c red", "# c #FF4343", "$ c gray57", "% c gray58", "& c #9D9D9D", "* c gray65", "= c gray72", "- c #C0C0C0", "; c #C3C3C3", ": c gray77", "> c #C5C5C5", ", c #C6C6C6", "< c gray78", "1 c #C8C8C8", "2 c gray79", "3 c #CACACA", "4 c gray80", "5 c #CDCDCD", "6 c #CECECE", "7 c gray82", "8 c gray100", /* pixels */ " ,;=;=;;;;==;;;;=", " ;;; $ *=;;;;=;;;;;=;;", " ;88 O*=;;;=;==;;;;;", " ;888; X&;;=;;;;;;=;=;", " ;888; X* +;=;=", " ;8@8; X& 7322, $ +=;;", " ;8@8; X& 38888 8$ +=;", " ;;@;; X& 38888 88$ +=", " @# X& 28888 888$ %", "&X.@@..X& ,8888 o", "*OX@@XXO* ,88888888; X", "=*&@@#&*= ,@8888888; X", ";;;#@@#;; ,@#888888; X", "=;;=#@@@@@@@@#88888; X", ";=;=;#@@@@@@@@#8888; X", ";;;;;=;=@@@@@#88888; X", ";=;=;=;;; ;@#888888; X", ";;;=;;=;; ;@8888888; X", "=;=;=;;;= ;;;;;;;;;; X", ";;;;;;;=; X", ";=;=;;;=;&X..........X", ";;;;;=;;=*+XXXXXXXXXXO" }; bist-0.5.2/images/lb_decr_interline_mlabel.xpm0000644000175000017500000000374211063144061020013 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ static const char *lb_decr_interline_mlabel_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 41 1", " c black", ". c #020202", "X c gray2", "o c #090909", "O c #0B0B0B", "+ c #0E0D0D", "@ c #0E0E0E", "# c #101010", "$ c #111111", "% c #1C1717", "& c #211E1E", "* c #261D1D", "= c #202020", "- c #312929", "; c #352B2B", ": c #4C2C2C", "> c #542D2D", ", c #5A2F2F", "< c #463535", "1 c #4A3838", "2 c #622F2F", "3 c #773030", "4 c gray30", "5 c gray31", "6 c #515151", "7 c #5A5A5A", "8 c #6A4444", "9 c #7C4848", "0 c #606060", "q c #872E2E", "w c #8A2E2E", "e c #E50F0F", "r c #E90D0D", "t c #FB0202", "y c red", "u c #FE0202", "i c #F80505", "p c #D83333", "a c #E32B2B", "s c #BE4242", "d c None", /* pixels */ "dddddddddddddddddddddd", "dddddddddddddddd dd", "dddddddddddddddd yy dd", "ddddd dddddddddd yy dd", " ddd d d ddddd yy dd", " dd0-1yy1;6", "dddddddddddddd08yyyy96", "dd dddd dd ddd0 pyya 6", "dd dddd dd d dd$d", " d d d4 yy 4d", "dddddddddddddddd yy dd", "dddddddddddddddd yy dd", "dddddddddddddddd dd" }; bist-0.5.2/images/lb_snap_to_grid.xpm0000644000175000017500000000647311025523004016161 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_snap_to_grid_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 95 2", " c black", ". c #030101", "X c #070101", "o c #080202", "O c #0E0505", "+ c #160202", "@ c #140A0A", "# c #1D0404", "$ c #1D0505", "% c #1F1212", "& c #2E0909", "* c #211212", "= c #231515", "- c #261616", "; c #221C1C", ": c #271919", "> c #3C0909", ", c #3F0909", "< c #292222", "1 c #312626", "2 c #322727", "3 c #342525", "4 c #322A2A", "5 c #382929", "6 c #382E2E", "7 c #3A2F2F", "8 c #3C3B3B", "9 c #4E0303", "0 c #500505", "q c #500606", "w c #560404", "e c #520808", "r c #590303", "t c #413333", "y c #413838", "u c #443838", "i c #493D3D", "p c #640606", "a c #6B0101", "s c #6C0202", "d c #6F0101", "f c #730101", "g c #770101", "h c #780101", "j c #780202", "k c #474343", "l c #494040", "z c #4B4141", "x c #4E4747", "c c #494848", "v c #534C4C", "b c #565656", "n c gray35", "m c #5D5B5B", "M c gray36", "N c #606060", "B c #717171", "V c gray45", "C c gray47", "Z c #7E7E7E", "A c #970000", "S c #A00000", "D c #A60000", "F c #AB0000", "G c #B20000", "H c #E50000", "J c #F50000", "K c #FA0000", "L c red", "P c #838383", "I c gray53", "U c #888888", "Y c gray54", "T c #909090", "R c #959595", "E c #9D9D9D", "W c #A0A0A0", "Q c gray64", "! c #A4A4A4", "~ c gray65", "^ c gray66", "/ c #AAAAAA", "( c #ACACAC", ") c gray68", "_ c #B1B1B1", "` c #B2B2B2", "' c #B4B4B4", "] c gray71", "[ c #B7B7B7", "{ c gray72", "} c #B9B9B9", "| c gray73", " . c gray", ".. c gray75", "X. c #C0C0C0", /* pixels */ "X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.", "X. X. X. X. X. X. X. X. X. X. X. ", "X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X...X.X.", "X. X.X.X.X.X.N X.X.X.X.X.T X.X.X.X.X.) X.X.", "X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.", "X. X.X.X.X.X.N X.X.X.X.X.T X.X.X.X.X.) X.X.", "X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.", "X. X.N X.N X.N X.N X.N X.N X.N X.N X.b X.N ", "X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.", "X. X.X.X.X.X.N X.i = v R T X.X.X.X.X.) X.X.", "X.X.X.X.X.X.X.X.X.m p j & @ z I X.X.X...X.X.", "X. X.X.X.X.X.N X.` O L L H A , t C / X.X.", "X.X.X.X.X.X.X.X.X.X.5 G L L L L K D q 3 { ", "X. X.T X.T X.N X.T C q L L L L L J d X 7 Z ", "X.X.X.X.X.X.X.X.X.X. . K L L L L + : m I / ", "X. X.X.X.X.X.N X.X.X.u S L L L L d = V / } ", "X.X.X.X.X.X.X.X.X.X.X.Y > L L a L L f - W .", "X. X.X.X.X.X.N X.X.X...@ H 9 % r L L g = ) ", "X.X.X.X.X.X.X.X.X.X.X.X.x g X n 2 w L F : k ", "X. X.) X.) X.b ..) X.) E $ 4 B W 7 q $ < P ", "X.X.X.X.X.X.X.X.X.X.X.X...i T W } ' 8 2 8 ~ ", "X. X.X.X.X.X.N X.X.X.X.X.Y ` { . .' c ~ { " }; bist-0.5.2/images/lb_select_atom.xpm0000644000175000017500000000301511025523004015775 0ustar cagecage/* Bist icon Copyright (C) 2008 eNtropia This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* XPM */ const static char *lb_select_atom_xpm[] = { /* columns rows colors chars-per-pixel */ "22 22 10 1", " c black", ". c #6F6F6F", "X c gray47", "o c gray51", "O c #8B8B8B", "+ c #9D9D9D", "@ c gray65", "# c #AFAFAF", "$ c gray72", "% c #C0C0C0", /* pixels */ "%%%%%%%%%%%%%%%%%%%%%%", "% @$%% @$%% @", "% X.O#%%#OXXXXO#%%#O X", "% .o@$%%$@++++@$%%$@ .", "%@O@%%%%%%%%%%%%%%%%@O", "%$#$%%%%%%%%%%%%%%%%$#", "%%%%%%%%%%%%%%%%%%%%%%", "%%%%%%%%%%%%%%%%%%%%%%", "% #$%%%%%%%%%%%%%%%% #", "% O@%%%%%%%%%%%%%%%% O", "% X+%%%%%%%%%%%%%%%% X", "% X+%%%%%%%%%%%%%%%% X", "% X+%%%%%%%%%%%%%%%% X", "%@O@%%%%%%%%%%%%%%%%@O", "%$#$%%%%%%%%%%%%%%%%$#", "%%%%%%%%%%%%%%%%%%%%%%", "%%%%%%%%%%%%%%%%%%%%%%", "%%%%%%%%%%%%%%%%%%%%%%", "% #$%%%%%%%%%%%%%%%% #", "% O@%%%%%%%%%%%%%%%% O", "% @$%% @$%% .", "%@X.O#%%#OXXXXO#%%#O.X" }; bist-0.5.2/README0000644000175000017500000000335211740106673011727 0ustar cagecageBist stands for bidimensional structures (in italian it sounds like "beast" in english ) and is a chemical drawing tool. It is focused on organic chemistry but may it may be useful also for chemists or teacher as well. Bist support many of the formalism used to describe molecoles structures like single bond, double bond, stereospecific bond, charges, resonance arrows, lone pairs etc... It can export both postscript and png formats. Currently portability is not my goal so only GNU/Linux platform is supported. However any effort in this direction is appreciated so feel free to ask me about any porting question. Please remember that bist is actually in a beta stage of development so i strongly suggest you to not using it except for testing or hacking purpose. Bist is free software released under GNU GPL You must have installed this software to build this software. * g++ >= 4.2 * fltk >= 1.3 && < 2.0 * libcairo * libpango * expat XML parsing library * libcurl * gnu scientific library (libgsl) logo.png, bist.png and icon.xpm are Copyright (C) 2005,2006,2007,2008,2009 Luisa Russo and Paul F. Johnson and are released under GPLV3 include/Flu_Enumerations.h include/FluSimpleString.h include/Flu_Tree_Browser.h include/flu_export.h images/flu_pixmaps.hpp src/FluSimpleString.cpp src/Flu_Tree_Browser.cpp are Copyright (C) 2002 Jason Bryan, Ohio Supercomputer Center, Ohio State University and are released under LGPL v2 or later and FLTK license (http://www.fltk.org/COPYING.php), see http://www.osc.edu/archive/FLU/ Except where otherwise noted all icon files are (C) 2008,2009 eNtropia and they are released under GPLV3 or later version.bist-0.5.2/m4/0000755000175000017500000000000011740261236011361 5ustar cagecagebist-0.5.2/m4/lib-prefix.m40000644000175000017500000001503611166204327013671 0ustar cagecage# lib-prefix.m4 serial 5 (gettext-0.15) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl the basename of the libdir, either "lib" or "lib64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. The current dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl libraries go under $prefix/lib. We determine the compiler's default dnl mode by looking at the compiler's library search path. If at least dnl of its elements ends in /lib64 or points to a directory whose absolute dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl default, namely "lib". acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ]) bist-0.5.2/m4/ChangeLog0000644000175000017500000000061511166204327013135 0ustar cagecage2009-04-04 gettextize * gettext.m4: New file, from gettext-0.17. * iconv.m4: New file, from gettext-0.17. * lib-ld.m4: New file, from gettext-0.17. * lib-link.m4: New file, from gettext-0.17. * lib-prefix.m4: New file, from gettext-0.17. * nls.m4: New file, from gettext-0.17. * po.m4: New file, from gettext-0.17. * progtest.m4: New file, from gettext-0.17. bist-0.5.2/m4/gettext.m40000644000175000017500000003457011166204327013320 0ustar cagecage# gettext.m4 serial 60 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code=' #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) bist-0.5.2/m4/nls.m40000644000175000017500000000226611166204327012425 0ustar cagecage# nls.m4 serial 3 (gettext-0.15) dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) bist-0.5.2/m4/lib-ld.m40000644000175000017500000000653111166204327012773 0ustar cagecage# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) bist-0.5.2/m4/lib-link.m40000644000175000017500000007205511166204327013335 0ustar cagecage# lib-link.m4 serial 13 (gettext-0.17) dnl Copyright (C) 2001-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ(2.54) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= LIB[]NAME[]_PREFIX= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) AC_SUBST([LIB]NAME[_PREFIX]) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl acl_libext, dnl acl_shlibext, dnl acl_hardcode_libdir_flag_spec, dnl acl_hardcode_libdir_separator, dnl acl_hardcode_direct, dnl acl_hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Autoconf >= 2.61 supports dots in --with options. define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix], [ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= LIB[]NAME[]_PREFIX= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" dnl The same code as in the loop below: dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` dnl First look for a shared library. if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi dnl Then look for a static library. if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$acl_hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` LIB[]NAME[]_PREFIX="$basedir" additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$acl_hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) bist-0.5.2/m4/po.m40000644000175000017500000004460611166204327012253 0ustar cagecage# po.m4 serial 15 (gettext-0.17) dnl Copyright (C) 1995-2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) dnl Checks for all prerequisites of the po subdirectory. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake AC_REQUIRE([AM_NLS])dnl dnl Release version of the gettext macros. This is used to ensure that dnl the gettext macros and po/Makefile.in.in are in sync. AC_SUBST([GETTEXT_MACRO_VERSION], [0.17]) dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Test whether it is GNU msgfmt >= 0.15. changequote(,)dnl case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac changequote([,])dnl AC_SUBST([MSGFMT_015]) changequote(,)dnl case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac changequote([,])dnl AC_SUBST([GMSGFMT_015]) dnl Search for GNU xgettext 0.12 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Test whether it is GNU xgettext >= 0.15. changequote(,)dnl case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac changequote([,])dnl AC_SUBST([XGETTEXT_015]) dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >&]AS_MESSAGE_LOG_FD[ 2>&1], :) dnl Installation directories. dnl Autoconf >= 2.60 defines localedir. For older versions of autoconf, we dnl have to define it here, so that it can be used in po/Makefile. test -n "$localedir" || localedir='${datadir}/locale' AC_SUBST([localedir]) dnl Support for AM_XGETTEXT_OPTION. test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS= AC_SUBST([XGETTEXT_EXTRA_OPTIONS]) AC_CONFIG_COMMANDS([po-directories], [[ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done]], [# Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Postprocesses a Makefile in a directory containing PO files. AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], [ # When this code is run, in config.status, two variables have already been # set: # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, # - LINGUAS is the value of the environment variable LINGUAS at configure # time. changequote(,)dnl # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Find a way to echo strings without interpreting backslash. if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then gt_echo='echo' else if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then gt_echo='printf %s\n' else echo_func () { cat < "$ac_file.tmp" if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` cat >> "$ac_file.tmp" < /dev/null; then # Add dependencies that cannot be formulated as a simple suffix rule. for lang in $ALL_LINGUAS; do frobbedlang=`echo $lang | sed -e 's/_/-/g' -e 's/^sr-CS/sr-SP/' -e 's/@latin$/-Latn/' -e 's/@cyrillic$/-Cyrl/' -e 's/^sr-SP$/sr-SP-Latn/' -e 's/^uz-UZ$/uz-UZ-Latn/'` cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) bist-0.5.2/m4/iconv.m40000644000175000017500000001375311166204327012752 0ustar cagecage# iconv.m4 serial AM6 (gettext-0.17) dnl Copyright (C) 2000-2002, 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK([for iconv], am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_CACHE_CHECK([for working iconv], am_cv_func_iconv_works, [ dnl This tests against bugs in AIX 5.1 and HP-UX 11.11. am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi AC_TRY_RUN([ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; }], [am_cv_func_iconv_works=yes], [am_cv_func_iconv_works=no], [case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac]) LIBS="$am_save_LIBS" ]) case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function and it works.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) bist-0.5.2/configure.ac0000644000175000017500000001630311740105067013331 0ustar cagecagednl Autoconf requirements dnl `AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)' dnl information on the package dnl checks for programs dnl checks for libraries dnl checks for header files dnl checks for types dnl checks for structures dnl checks for compiler characteristics dnl checks for library functions dnl checks for system services dnl `AC_CONFIG_FILES([FILE...])' dnl `AC_OUTPUT' dnl program AC_INIT([bist],[0.5.2],[cage@katamail.com],[bist]) AC_CONFIG_MACRO_DIR([m4]) AC_USE_SYSTEM_EXTENSIONS AM_INIT_AUTOMAKE([-Wall foreign]) AM_GNU_GETTEXT([external]) AC_SUBST([VERSION],AC_PACKAGE_VERSION) AC_SUBST([TARNAME],AC_PACKAGE_TARNAME) AC_SUBST([ELF],AC_PACKAGE_NAME) AC_LANG([C++]) AC_PROG_CXX([g++-4.6 g++-4.5 g++-4.4 g++-4.3 g++-4.2 g++ c++]) AC_PATH_PROG([SHELL],[bash]) AC_LIBTOOL_DLOPEN AC_DISABLE_STATIC AC_PROG_LIBTOOL AC_CHECK_PROG(INSTALL, [install], [TRUE], [FALSE], [$PATH], []) AC_CHECK_PROG([MSGFMT], [msgfmt], [TRUE], [FALSE], [$PATH:/usr/libexec:/usr/sbin:/usr/etc:etc], []) AC_CHECK_PROG([PYTHON], [python], [TRUE], [FALSE], [$PATH:/usr/libexec:/usr/sbin:/usr/etc:etc], []) AC_CHECK_PROG([PKGCONFIG], [pkg-config], [TRUE], [FALSE], [$PATH:/usr/libexec:/usr/sbin:/usr/etc:etc], []) AC_CHECK_PROG([FLTKCONFIG], [fltk-config], [TRUE], [FALSE], [$PATH:/usr/libexec:/usr/sbin:/usr/etc:etc], []) if [[ $FLTKCONFIG = "FALSE" ]]; then AC_MSG_ERROR([cannot find fltk-config!], [1]) fi if [[ $PKGCONFIG = "FALSE" ]]; then AC_MSG_ERROR([cannot find pkg-config!], [1]) fi if [[ $PYTHON = "FALSE" ]]; then AC_MSG_WARN([cannot find python interpreter but do not worry it is not not mandatory to run bist!], [1]) fi if [[ $MSGFMT = "FALSE" ]]; then AC_MSG_WARN([cannot find msgfmt, this is a problem only if you want to update traslations files!], [1]) fi AC_CHECK_PROG([CTAGS_PROG], [ctags], [TRUE], [FALSE], [$PATH:/usr/libexec:/usr/sbin:/usr/etc:etc], []) AC_SUBST([HOME],[$HOME]) AC_ARG_ENABLE([static], [AC_HELP_STRING([--enable-static],[enable static linking with fltk. Default: disabled])], [AC_SUBST([CSTATIC],[TRUE])], [AC_SUBST([CSTATIC],[FALSE])]) if [[[ "$enable_static" = "yes" ]]]; then AC_SUBST([LIBS],[$LIBS\ `fltk-config --use-images --ldstaticflags`]) else AC_SUBST([LIBS],[$LIBS\ `fltk-config --use-images --ldflags`]) fi AC_MSG_CHECKING([pkg-config --exists cairo]) pkg-config --exists cairo if test $? -ne 0 ; then AC_MSG_ERROR([pkg --exists cairo failed! do you have cairo header installed?]); else AC_MSG_RESULT([OK]) fi AC_MSG_CHECKING([pkg-config --exists pangocairo]) pkg-config --exists pangocairo if test $? -ne 0 ; then AC_MSG_ERROR([pkgconfig --exists pangocairo failed! do you have pango header installed?]); else AC_MSG_RESULT([OK]) fi AC_SUBST([LIBS],[$LIBS\ `pkg-config --libs cairo`]) AC_SUBST([LIBS],[$LIBS\ `pkg-config --libs pangocairo`]) AC_ARG_ENABLE([debug], [AC_HELP_STRING([--enable-debug],[enable debugging output. Default: disabled])], [AC_SUBST([DEBUG],[DEBUG])], [AC_SUBST([DEBUG],[NODEBUG])]) dnl AC_SUBST([CPPFLAGS],[$CPPFLAGS\ \-rdynamic]) AC_SUBST([CPPFLAGS],[$CPPFLAGS\ -I./pluginclude\ -I.\ -I./include\ -I../images\ -pedantic\ `fltk-config --cxxflags`]) AC_SUBST([CPPFLAGS],[$CPPFLAGS\ `pkg-config --cflags cairo`]) AC_SUBST([CPPFLAGS],[$CPPFLAGS\ `pkg-config --cflags pangocairo`]) opt=`echo "$CPPFLAGS" | grep Wall` if [[[ $opt = "" ]]]; then AC_SUBST([CPPFLAGS],[$CPPFLAGS\ -Wall]) fi opt=`echo "$CXXFLAGS" | grep "O[[0-9]]"` if [[[ $opt = "" ]]]; then AC_SUBST([CXXFLAGS],[$CXXFLAGS\ -O3]) fi opt=`echo "$CXXFLAGS" | grep "\-g"` if [[[ $opt = "" ]]]; then AC_SUBST([CXXFLAGS],[$CXXFLAGS\ -g]) fi AC_SUBST([CXXFLAGS],[$CXXFLAGS\ -rdynamic]) dnl header AC_CHECK_HEADERS([ncurses.h],[AC_SUBST([USE_CURSES],[TRUE])],[AC_SUBST([USE_CURSES],[FALSE])]) AC_CHECK_HEADERS([X11/xpm.h],[],[AC_MSG_ERROR([cannot find xpm.h header file!])]) AC_CHECK_HEADERS([libintl.h],[],[AC_MSG_ERROR([cannot find libintl.h header file!])]) AC_CHECK_HEADERS([cairo/cairo.h],[],[AC_MSG_ERROR([cannot find cairo.h header file!])]) dnl checking for pointer size AC_CHECK_SIZEOF([int *]) if [[ $USE_CURSES = "TRUE" ]]; then AC_SUBST([LIBS],[$LIBS\ -lncurses]) fi opt=`echo "$LIBS" | grep fltk-images` if [[[ $opt = "" ]]]; then AC_SUBST([LIBS],[$LIBS\ -lfltk_images]) fi opt=`echo "$LIBS" | grep lpthread` if [[[ $opt = "" ]]]; then AC_SUBST([LIBS],[$LIBS\ -lpthread]) fi AC_MSG_CHECKING([if fltk library works]) AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include #include ]], [[Fl::run();]])], [AC_MSG_RESULT([it works!])], [AC_MSG_ERROR([fltk do not works], [1])], [AC_MSG_ERROR([fltk do not works], [1])]) dnl AC_MSG_CHECKING([if libplot library works]) dnl AC_SUBST([LIBS],[$LIBS\ -lplot]) dnl AC_RUN_IFELSE([#include dnl #include dnl int main(int argc, char** argv){ plPlotterParams *plotter_params; dnl /* set a Plotter parameter */ dnl plotter_params = pl_newplparams ();}], dnl [AC_MSG_RESULT([it works!])], dnl [AC_MSG_ERROR([libplot do not works], [1])], dnl [AC_MSG_ERROR([libplot do not works], [1])]) AC_MSG_CHECKING([if expat library works]) AC_SUBST([LIBS],[$LIBS\ -lexpat]) AC_RUN_IFELSE([AC_LANG_PROGRAM([#include #include ], [XML_Parser p = XML_ParserCreate(NULL)])], [AC_MSG_RESULT([it works!])], [AC_MSG_ERROR([libexpat do not works], [1])], [AC_MSG_ERROR([libexpat do not works], [1])]) AC_SUBST([LIBS],[$LIBS\ -ldl]) AC_MSG_CHECKING([if dl library works]) AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [dlerror()])], [AC_MSG_RESULT([it works!])], [AC_MSG_ERROR([libdl do not works], [1])], [AC_MSG_ERROR([libdl do not works], [1])]) AC_MSG_CHECKING([if cairo library works]) AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [cairo_t* cr])], [AC_MSG_RESULT([it works!])], [AC_MSG_ERROR([libcairo do not works], [1])], [AC_MSG_ERROR([libcairo do not works], [1])]) AC_CHECK_LIB([Xpm],[XpmCreatePixmapFromData], [AC_SUBST([LIBS],[$LIBS\ -lXpm])], [AC_MSG_ERROR([libXpm do not works], [1])], []) AC_CHECK_LIB([X11],[XOpenDisplay], [], [AC_MSG_ERROR([no!], [1])], []) AC_SUBST([LIB_DIR_CONFIG],[$libdir]) dnl expanding exec_prefix PATTERN_EXEC_PREFIX="exec_prefix(.*)" PATTERN_GET_LAST_DIR="/.*$" if [[[ "$LIB_DIR_CONFIG" =~ $PATTERN_EXEC_PREFIX ]]]; then if [[[ $exec_prefix = "NONE" ]]]; then [[[ "$LIB_DIR_CONFIG" =~ $PATTERN_GET_LAST_DIR ]]]; if [[[ $prefix = "NONE" ]]]; then ac_libdir=/usr/local$BASH_REMATCH AC_SUBST([LIB_DIR_CONFIG_PATH],[$ac_libdir]) dnl echo "LIBDIRR_NONE!! $ac_libdir --" else ac_libdir=$prefix$BASH_REMATCH AC_SUBST([LIB_DIR_CONFIG_PATH],[$ac_libdir]) dnl echo "prefix yes eprefix no!! $ac_libdir --" fi else [[[ "$LIB_DIR_CONFIG" =~ $PATTERN_GET_LAST_DIR ]]]; ac_libdir=$exec_prefix$BASH_REMATCH AC_SUBST([LIB_DIR_CONFIG_PATH],[$ac_libdir]) dnl echo "LIBDIRR eprefix yes $LIB_DIR_CONFIG" fi fi AC_CONFIG_FILES([Makefile po/Makefile.in src/Makefile]) AC_CONFIG_HEADER([include/config.h]) AC_CONFIG_SUBDIRS([pluginsrc/TREcalc]) AC_CONFIG_SUBDIRS([pluginsrc/fetch_nist_database]) AC_OUTPUT bist-0.5.2/TODO0000644000175000017500000000000011170156021011507 0ustar cagecagebist-0.5.2/src/0000755000175000017500000000000011740261236011630 5ustar cagecagebist-0.5.2/src/Makefile.am0000644000175000017500000000333711733641566013704 0ustar cagecagebin_PROGRAMS = bist bist_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) bist_SOURCES = ../include/arc_prop.hpp arc_prop.cpp ../include/box_prop.hpp box_prop.cpp ../include/arrow_prop.hpp arrow_prop.cpp ../include/atomo.hpp atomo.cpp ../include/atom_prop.hpp atom_prop.cpp ../include/bezier_prop.hpp bezier_prop.cpp ../include/bist_plugin.hpp bist_plugin.cpp ../include/bond_prop.hpp bond_prop.cpp ../include/cairo_t_singleton.hpp cairo_t_singleton.cpp ../include/chain_prop.hpp chain_prop.cpp ../include/command_line.hpp command_line.cpp ../include/editor.hpp editor.cpp ../include/etichetta.hpp etichetta.cpp ../include/gruppo.hpp gruppo.cpp ../include/immagine_cml.hpp immagine_cml.cpp ../include/immagine.hpp immagine.cpp ../include/immagine_mol.hpp immagine_mol.cpp ../include/interfacce.hpp interfacce.cpp ../include/legame.hpp legame.cpp ../include/lib_dialog.hpp lib_dialog.cpp ../include/matr.hpp main.cpp ../include/mol_canvas.hpp mol_canvas.cpp ../include/multifont_label.hpp multifont_label.cpp ../include/multiline_label.hpp multiline_label.cpp ../include/multiline_label_prop.hpp multiline_label_prop.cpp ../include/paragraph_text.hpp paragraph_text.cpp ../include/paragraph_text_prop.hpp paragraph_text_prop.cpp ../include/parse_residual.hpp parse_residual.cpp ../include/plot_window.hpp plot_window.cpp ../include/pref_dialog.hpp pref_dialog.cpp ../include/prefs.hpp prefs.cpp ../include/procedura.hpp procedura.cpp ../include/set_conf.hpp set_conf.cpp ../include/string_prop.hpp string_prop.cpp ../include/substructure_search.hpp substructure_search.cpp ../include/util.hpp util.cpp ../include/2D_vector.hpp 2D_vector.cpp ../include/newton_integ.hpp newton_integ.cpp ../include/similar_to.hpp ../include/font_factory.hpp font_factory.cpp bist-0.5.2/src/main.cpp0000644000175000017500000001463311521672534013273 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include finestra_pr* MainWindow; Preferences __pref; Fl_Menu_Item* voci_menu; #define CMDLINEOPT "vhc:f:" static struct option long_options[] ={ {"help",no_argument,NULL,'h'}, {"version",no_argument,NULL,'v'}, {"covert-to",required_argument,NULL,'c'}, {"input-file",required_argument,NULL,'f'}, {0,0,0,0} }; int main(int argc , char** argv){ setup_conf(); setlocale (LC_ALL, ""); textdomain (TEXT_DOMAIN); bindtextdomain (TEXT_DOMAIN, CATALOG_DIR); string format_output; int option_v; int indice_arg; bool convert=false; string file_input=""; while((option_v=getopt_long (argc, argv, CMDLINEOPT, long_options,&indice_arg))!=-1){ switch(option_v){ case 'h': print_help(argv[0]); exit(EXIT_SUCCESS); break; case 'v': print_version(); exit(EXIT_SUCCESS); break; case 'f': { file_input=optarg; if(file_input[0]=='-'){ cerr << ELF << "\t" << _("Option requires an argument -- f") << endl; exit(EXIT_FAILURE); }else{ convert=true; } break; } case 'c': { string oparg=optarg; if(oparg[0]=='-'){ cerr << ELF << "\t" << _("Option requires an argument -- c") << endl; exit(EXIT_FAILURE); }else{ if(format_supported(oparg)){ format_output=optarg; }else{ cerr << ELF << "\t" << _("format") << " " << oparg << " " << _("not supported, switching to ps") << endl; format_output="ps"; } } break; } case '?': print_version(); print_help(argv[0]); exit(EXIT_FAILURE); break; } } if(convert){ wordexp_t res; int funz=wordexp (file_input.c_str(), &res, WRDE_SHOWERR | WRDE_UNDEF); if(!funz){ for(unsigned int i=0;i1){ if(string(argv[1])=="redfog"){ print_redfog_wisdom(); exit(EXIT_SUCCESS); }else{ window.file_inp(argv[1]); } } Pixmap p, mask; XpmCreatePixmapFromData(fl_display, DefaultRootWindow(fl_display), const_cast(icon_xpm), &p, &mask, NULL); window.icon((char *)p); window.show(); if(__pref.getSplash()){ splash.show(); } Fl::run(); font_map_singleton::free_context(); exit(EXIT_SUCCESS); } } bist-0.5.2/src/string_prop.cpp0000644000175000017500000004533211406210753014706 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void string_prop_color_cb(Fl_Widget* w, void* d){ string_prop* prop=dynamic_cast(w->parent()); unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); if(pushd){ prop->_str->cr(r); prop->_str->cg(g); prop->_str->cb(b); } editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void string_prop_ok_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); string_prop* prop=dynamic_cast(w->parent()); Fl_Choice* dimensioni=dynamic_cast(prop->child(2)); Fl_Choice* i_font=dynamic_cast(prop->child(1)); int font_ch=i_font->value(); prop->_str->font(font_ch); prop->_str->dim(strtol(dimensioni->mvalue()->text,NULL,0)); ed->redraw(); } void string_prop_font_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); string_prop* prop=dynamic_cast(w->parent()); Fl_Choice* dimensioni=dynamic_cast(prop->child(2)); prop->_str->dim(strtol(dimensioni->mvalue()->text,NULL,0)); ed->redraw(); } void string_prop_canc_cb(Fl_Widget* w, void* d){ string_prop* prop=dynamic_cast(w->parent()); prop->hide(); } Fl_Menu_Item str_voci_font_face[] = { {"helvetica", 0, 0, 0,}, {"helvetica bold", 0, 0, 0,}, {"helvetica italic", 0, 0, 0,}, {"helvetica bold italic", 0, 0, 0,}, {"courier", 0, 0, 0,}, {"courier bold", 0, 0, 0,}, {"courier italic", 0, 0, 0,}, {"courier bold italic", 0, 0, 0,}, {"times", 0, 0, 0,}, {"times bold", 0, 0, 0,}, {"times italic", 0, 0, 0,}, {"times bold italic", 0, 0, 0,}, {"symbol", 0, 0, 0,}, {"screen", 0, 0, 0,}, {"screen bold", 0, 0, 0,}, {"zapf dingbats", 0, 0, 0,}, {0} }; Fl_Menu_Item voci_font_dim_str[NUM_FONT_DIM]; string_prop::string_prop(etichetta* et) :Fl_Double_Window(339,144,_("Text properties")), _str(et) { { Fl_Box* o = new Fl_Box(5, 5, 330, 100); //0 o->box(FL_ENGRAVED_BOX); } { Fl_Choice* o = new Fl_Choice(90, 15, 145, 20, _("Font:")); //1 o->down_box(FL_BORDER_BOX); o->menu(str_voci_font_face); } { Fl_Choice* o = new Fl_Choice(90, 40, 60, 20, _("Dimension:"));//2 o->down_box(FL_BORDER_BOX); for(int i=0;imenu(voci_font_dim_str); o->value(8); o->callback(string_prop_font_cb); } Fl_Button* text= new Fl_Button(109, 65, 30, 30);//3 text->type(FL_RADIO_BUTTON); text->image(image_lb_normal_str_atom); Fl_Button* sup= new Fl_Button(139, 65, 30, 30);//4 sup->type(FL_RADIO_BUTTON); sup->image(image_lb_supers); Fl_Button* sub= new Fl_Button(169, 65, 30, 30);//5 sub->type(FL_RADIO_BUTTON); sub->image(image_lb_subs); Fl_Button* color=new Fl_Button(199, 65, 30, 30);//6 color->image(image_lb_select_font_color); color->callback(string_prop_color_cb); Fl_Return_Button* ok= new Fl_Return_Button(110, 109, 80, 30, _("OK"));//7 ok->callback(string_prop_ok_cb); Fl_Button* ann=new Fl_Button(190, 109, 65, 30, _("Close"));//8 ann->callback(string_prop_canc_cb); end(); set_modal(); /************************************************************/ std::vector < std::pair > the_vec_str=_str->vec_str(); //std::cerr << the_vec_str.size() << std::endl; if(the_vec_str.size() >0){ // _pos.first=the_vec_str.size()-1; //_pos.second=((the_vec_str.back().first).size())-1; int currtype=_str->type_etic_at_cur_pos(); if(currtype>0){ set_type_text_button(currtype); }else{ set_type_text_button(ET_STR); } } //_str->set_cursor_position(_pos); _str->draw_cursor(true); dialog_position(this); } string_prop::~string_prop(){ _str->draw_cursor(false); } void string_prop::set_type_text_button(int which){ Fl_Button* text_normal=dynamic_cast(child(3)); Fl_Button* apic=dynamic_cast(child(4)); Fl_Button* pedic=dynamic_cast(child(5)); switch(which){ case ET_STR: text_normal->value(1); apic->value(0); pedic->value(0); break; case ET_APICE: text_normal->value(0); apic->value(1); pedic->value(0); break; case ET_PEDICE: text_normal->value(0); apic->value(0); pedic->value(1); break; } } // void string_prop::delete_char_curr_pos(bool before){ // std::vector < std::pair > the_vec_str=_str->vec_str(); // try{ // check_if_type_etic(ET_STR,_pos.first); // check_if_type_etic(ET_APICE,_pos.first); // check_if_type_etic(ET_PEDICE,_pos.first); // std::string to_update= the_vec_str[_pos.first].first; // int type=the_vec_str[_pos.first].second; // //std::cerr << "to_update.size()" << to_update.size() << " " << _pos.second << std::endl; // if(before){ // cerr << "to update " << to_update << std::endl; // cerr << "BBBB" << _pos.first <0){ // to_update.erase(_pos.second-1,1); // _str->sostituisci(to_update,type,_pos.first); // _pos.second--; // }else if(_pos.second==0 && ( (static_cast(_pos.first)-1) >=0)){ // //cerr << "AAAAAA" << _pos.first-1 << " " << ( (_pos.first-1) >=0) <elimina(_pos.first); // _pos.first--; // _pos.second=the_vec_str[_pos.first].first.size(); // }else{ // //cerr << "fermo" << std::endl; // } // }else{ // if(_pos.secondsostituisci(to_update,type,_pos.first); // }else{ // _str->elimina(_pos.first); // if(static_cast(_pos.first) < _str->size_str()){ // _pos.second=0; // }else{ // _pos.first--; // _pos.second=the_vec_str[_pos.first].first.size(); // } // } // //_pos.second++; // } // } // }catch (out_of_range e){ // std::cerr << __FUNCTION__ << "Exception: can not delete char" << std::endl; // } // } // void string_prop::insert_char_in_curr_pos(char add, int type){ // std::vector < std::pair > the_vec_str=_str->vec_str(); // if(the_vec_str.size()<=0){ //inizializza il vettore // _str->aggiungi(std::string(1,add),type); // _pos.second=1; // _pos.first=0; // }else if(_pos.first0){ // std::string to_update= the_vec_str[_pos.first].first; // to_update.insert(_pos.second,std::string(1,add)); // _str->sostituisci(to_update,type,_pos.first); // _pos.second++; // }else{// ma vuota // _str->sostituisci(std::string(1,add),type,_pos.first); // _pos.second=1; // } // }else{ // non vuota inserisci // std::string to_update= the_vec_str[_pos.first].first; // //std::cerr << "to_update.size()" << to_update.size() << " " << _pos.second << std::endl; // if(_pos.secondsostituisci(to_update,type,_pos.first); // _pos.second++; // }else{ // to_update+=std::string(1,add); // _str->sostituisci(to_update,type,_pos.first); // _pos.second=to_update.size(); // //std::cerr << "dopo :" << to_update.size() << " " << _pos.second << std::endl; // } // } // } // } // bool string_prop::check_if_type_etic(int typ,int pos) throw (out_of_range){ // //int nis=_str->size_str(); // vector < pair > stringhe=_str->vec_str(); // if(static_cast(pos) < _str->vec_str().size()){ // vector < pair >::iterator it= stringhe.begin(); // pair pt= *(it+pos); // if(pt.second==typ){ // return true; // }else{ // return false; // } // }else{ // string exc="Errore where < _vec_str.size() nella classe etichetta."; // throw out_of_range(exc); // } // } // bool string_prop::check_if_type_etic(int typ) throw (out_of_range){ // bool res=false; // if(_str->size_str()>0){ // //int nis=_str->size_str(); // vector < pair > stringhe=_str->vec_str(); // pair pt= stringhe.back(); // if(pt.second==typ){ // res= true; // }else{ // res= false; // } // return res; // }else{ // std::string exc="Errore where < _vec_str.size() nella classe etichetta. " // + std::string(__FUNCTION__); // throw out_of_range(exc); // } // } int string_prop::handle(int e){ editor* ed=dynamic_cast(MainWindow); Fl_Double_Window::handle(e); switch(e){ case FL_FOCUS: return 0; break; case FL_KEYDOWN: { //int p; Fl_Button* apic=dynamic_cast(child(4)); Fl_Button* pedic=dynamic_cast(child(5)); string car; //int carattere=0; if(Fl::event_state(FL_SHIFT)){ car=toupper(Fl::event_text()[0]); }else{ car=Fl::event_text()[0]; } /* if( isprint(car[0]) && !ispunct(car[0]) && !isdigit(car[0]) && !isblank(car[0]) && car[0]!='\b'){ return 0; } */ //std::cerr << (int)car[0] << "delete " << FL_Delete << std::endl; if(Fl::event_key(FL_Delete)){ //cancellare il successivo // std::cerr << "canc" << std::endl; //if(_str->size_str()>0){ _str->delete_char_curr_pos(false); //} }else if(car=="\b"){//cancellare il precedente //if(_str->size_str()>0){ _str->delete_char_curr_pos(true); //} }else if(isprint(car[0])){ if(apic->value()){ //manage_sub_super(ET_APICE, ET_PEDICE,car); _str->insert_string_in_curr_pos(car,ET_APICE); }else if(pedic->value()){//dovremmo aggiungere un pedice //manage_sub_super(ET_PEDICE,ET_APICE,car); _str->insert_string_in_curr_pos(car,ET_PEDICE); }else{ // normal string // try{ // //std::cerr << "try..." << std::endl; // if(!_str->check_if_type_etic(ET_STR,_pos.first)){ // //std::cerr << "not str" << std::endl; // _pos.second=0; // _str->aggiungi(std::string(""),ET_STR); // _pos.first=_str->size_str()-1;//spostiamoci in modo da prenotare un nuovo // //elemento nel vettore // } // for(unsigned int i=0;iinsert_char_in_curr_pos(car[i],ET_STR); // } // }catch (out_of_range e){ // il vettore e' vuoto possiamo // // aggiungere e inizializzarlo // //std::cerr << "catch" << std::endl; // for(unsigned int i=0;iinsert_char_in_curr_pos(car[i],ET_STR); // } // } _str->insert_string_in_curr_pos(car,ET_STR); ed->redraw(); return 1; } }else if(Fl::event_key()==FL_Left){ // std::vector < std::pair > the_vec_str=_str->vec_str(); // if(_pos.second>0){ // _pos.second--; // }else if(( (static_cast(_pos.first)-1) >=0)){ // _pos.first--; // _pos.second=the_vec_str[_pos.first].first.size(); // }else{ // //cerr << "fermo" << std::endl; // } // //dobbiamo cambiare bottone ? // int currtype=the_vec_str[_pos.first].second; // set_type_text_button(currtype); //solo prova //_pos.second--; //std::cerr << "car == <-" << std::endl; int currtype=0; _str->cursor_one_step_back(currtype); set_type_text_button(currtype); }else if(Fl::event_key()==FL_Right){ // std::vector < std::pair > the_vec_str=_str->vec_str(); // if(_pos.second(_str->size_str())) { // _pos.first++; // _pos.second=0; // } // //std::cerr << "car == ->" << std::endl; // //dobbiamo cambiare bottone ? // int currtype=the_vec_str[_pos.first].second; // set_type_text_button(currtype); int currtype=0; _str->cursor_one_step_fwd(currtype); set_type_text_button(currtype); } //_str->set_cursor_position(_pos); ed->redraw(); return 1; } default: return 0; } } // void string_prop::manage_sub_super(int check, int troublesome,std::string car){ // //poniamo sia un apice // if(check_if_type_etic(check,_pos.first)){ //ultimo e' apice aggiungere // //std::cerr << "ultimo apice!" << std::endl; // for(unsigned int i=0;i > stringhe=_str->vec_str(); // std::string head_chunk; // std::string tail_chunk; // std::string to_break=stringhe[_pos.first].first; // head_chunk=to_break.substr(0,_pos.second); // tail_chunk=to_break.substr(_pos.second); // /* // std::cerr << "head: " << head_chunk << std::endl // << "tail: " << tail_chunk << std::endl; // */ // if(tail_chunk==""){ // _pos.second=0; // _pos.first++; // if(_pos.first(_str->size_str())){ // //if(check_if_type_etic(check,_pos.first)){ // //}else // if(check_if_type_etic(troublesome,_pos.first)){ // bool res_next_exist=true; // bool is_check=check_if_type_etic_next_chunk(check,res_next_exist); // if(res_next_exist && is_check){ // //std::cerr << "eoociqui!" << std::endl; // _pos.first++; // _pos.second=0; // }else{ // _str->insert(tail_chunk,troublesome,_pos.first); // } // }else if(check_if_type_etic(ET_STR,_pos.first)) { // _str->insert(tail_chunk,ET_STR,_pos.first); // } // for(unsigned int i=0;iaggiungi(tail_chunk,ET_STR); // _pos.first=_str->size_str()-1; //inutile ma innocuo...spero // for(unsigned int i=0;isostituisci(head_chunk,ET_STR,_pos.first); // _pos.first++; // _pos.second=0; // if(_pos.first(_str->size_str())){ // _str->insert(tail_chunk,ET_STR,_pos.first); // }else{ // _str->aggiungi(tail_chunk,ET_STR); // _pos.first=_str->size_str()-1; //inutile ma innocuo...spero // } // //std::cerr << "OK" << std::endl; // _pos.second=0; // _str->insert(std::string(""),check,_pos.first); // //std::cerr << "OK2" << std::endl; // for(unsigned int i=0;i > the_vec_str=_str->vec_str(); // try{ // //std::cerr << "eccoci " << std::endl; // if (check_if_type_etic(check,_pos.first+1)){ // _pos.first++; // _pos.second=the_vec_str[_pos.first].first.size(); // for(unsigned int i=0;isize_str()+1)" // << std::endl; // try{ // std::cerr << "_pos.first" <<_pos.first<< std::endl; // if (check_if_type_etic(ET_STR,_pos.first-2)){ // _pos.first--; // _pos.second=the_vec_str[_pos.first].first.size(); // for(unsigned int i=0;iaggiungi(std::string(""),check); // for(unsigned int i=0;isize_str()-2)" // << std::endl; // //std::cerr << "noped " << std::endl; // _pos.first++; //spostiamoci in modo da prenotare un nuovo // //elemento nel vettore // _pos.second=0; // _str->aggiungi(std::string(""),check); // for(unsigned int i=0;i > stringhe=_str->vec_str(); // bool res=false; // try{ // if(check_if_type_etic(equal,_pos.first+1)){ // res=true; // res_next_exist=true; // }else{ // res=false; // res_next_exist=true; // } // return res; // }catch(out_of_range e){ // res_next_exist=false; // res=false; // return res; // } // } bist-0.5.2/src/arrow_prop.cpp0000644000175000017500000001651511412200237014524 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; void arrow_prop_type_cb(Fl_Widget* w, void* d){ arrow_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); Fl_Menu_Button* the_menu=dynamic_cast(w); const Fl_Menu_Item* the_type=the_menu->mvalue(); ARR_PROP_SIZE_USER_DATA_MENU type_arrow=reinterpret_cast(the_type->user_data()); arrp->_arrow->punte(type_arrow); ed->redraw(); } void arrow_prop_color_cb(Fl_Widget* w, void* d){ unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); editor* ed=dynamic_cast(MainWindow); arrow_prop* propr=dynamic_cast(w->parent()); if(pushd){ propr->_arrow->cr(r); propr->_arrow->cg(g); propr->_arrow->cb(b); ed->redraw(); } } void arrow_prop_ok_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void arrow_prop_cancel_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void arrow_prop_width_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); arrow_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_arrow->spessore(static_cast(sl->value())); ed->redraw(); } void arrow_prop_tick_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); arrow_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_arrow->dash(static_cast(sl->value())); ed->redraw(); } void arrow_prop_width_arr_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); arrow_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_arrow->arr_w(static_cast(sl->value())); ed->redraw(); } void arrow_prop_height_arr_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); arrow_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_arrow->arr_h(static_cast(sl->value())); ed->redraw(); } void arrow_prop_gap_arr_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); arrow_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_arrow->arr_gap(sl->value()); ed->redraw(); } arrow_prop::~arrow_prop(){ } arrow_prop::arrow_prop(proc_arrow* arr) :Fl_Double_Window(455, 275), _arrow(arr), _tipo(0) { { Fl_Box* o = new Fl_Box(5, 20, 445, 200, _("Arrow properties")); o->box(FL_ENGRAVED_BOX); o->align(FL_ALIGN_TOP_LEFT); } { Fl_Value_Slider* o = new Fl_Value_Slider(200, 25, 210, 25, _("Dash step:")); o->type(FL_HORIZONTAL); o->step(0.01); o->align(FL_ALIGN_LEFT); o->range(0, 30); o->precision(0); o->value(_arrow->dash()); o->callback(arrow_prop_tick_cb); } { Fl_Value_Slider* o = new Fl_Value_Slider(200, 52, 210, 25, _("Thickness:")); o->type(FL_HORIZONTAL); o->step(0.01); o->align(FL_ALIGN_LEFT); o->range(0, 10); o->precision(0); o->value(_arrow->spessore()); o->callback(arrow_prop_width_cb); } Fl_Value_Slider* arr_w = new Fl_Value_Slider(200, 79, 210, 25, _("Arrow width:")); arr_w->type(FL_HORIZONTAL); arr_w->step(1); arr_w->align(FL_ALIGN_LEFT); arr_w->range(0, 50); arr_w->precision(0); arr_w->value(_arrow->arr_w()); arr_w->callback(arrow_prop_width_arr_cb); Fl_Value_Slider* arr_h = new Fl_Value_Slider(200, 107, 210, 25, _("Arrow height:")); arr_h->type(FL_HORIZONTAL); arr_h->step(1); arr_h->align(FL_ALIGN_LEFT); arr_h->range(0, 50); arr_h->precision(0); arr_h->value(_arrow->arr_h()); arr_h->callback(arrow_prop_height_arr_cb); Fl_Value_Slider* arr_gap = new Fl_Value_Slider(200, 134, 210, 25, _("Arrow gap:")); arr_gap->type(FL_HORIZONTAL); arr_gap->step(0.01); arr_gap->align(FL_ALIGN_LEFT); arr_gap->range(0, 0.99); arr_gap->precision(2); arr_gap->value(_arrow->arr_gap()); arr_gap->callback(arrow_prop_gap_arr_cb); /* #define ARR_NO_PUNT 1 #define ARR_OMOL_PUNT 2 #define ARR_ETEROL_PUNT 3 #define ARR_DOUBLE 4 #define ARR_BLOC 5 #define ARR_EQ 6 */ Fl_Menu_Item type_of_arrow_menu_item[] = { {_("none"), 0, 0, reinterpret_cast(ARR_NO_PUNT)}, {_("homolitic"), 0, 0, reinterpret_cast(ARR_OMOL_PUNT)}, {_("heterolitic"), 0, 0, reinterpret_cast(ARR_ETEROL_PUNT)}, {_("double"), 0, 0, reinterpret_cast(ARR_DOUBLE)}, {_("blocked"), 0, 0, reinterpret_cast(ARR_BLOC)}, {_("equilibrium"), 0, 0, reinterpret_cast(ARR_EQ)}, {0} }; Fl_Menu_Button* type_arr=new Fl_Menu_Button(w()/2-77, 170, 77, 30, _("Type")); type_arr->copy(type_of_arrow_menu_item); type_arr->callback(arrow_prop_type_cb); type_arr->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); add(type_arr); Fl_Button* colore=new Fl_Button(w()/2, 170, 55, 30, _("Color")); colore->callback(arrow_prop_color_cb); add(colore); Fl_Return_Button* ok=new Fl_Return_Button(w()/2-65/2, 235, 65, 30, _("OK")); ok->callback(arrow_prop_ok_cb); add(ok); end(); set_modal(); dialog_position(this); } void arrow_win(proc_arrow* at){ arrow_prop p(at); p.show(); while(p.shown()){ Fl::wait(); } } bist-0.5.2/src/box_prop.cpp0000644000175000017500000001212511412200237014153 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; void box_prop_type_cb(Fl_Widget* w, void* d){ box_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); Fl_Menu_Button* the_menu=dynamic_cast(w); box_type the_type=static_cast(the_menu->value()); arrp->_box->b_type(the_type); ed->redraw(); } void box_prop_color_cb(Fl_Widget* w, void* d){ unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); editor* ed=dynamic_cast(MainWindow); box_prop* propr=dynamic_cast(w->parent()); if(pushd){ propr->_box->cr(r); propr->_box->cg(g); propr->_box->cb(b); ed->redraw(); } } void box_prop_ok_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void box_prop_cancel_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void box_prop_width_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); box_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_box->spessore(static_cast(sl->value())); ed->redraw(); } void box_prop_tick_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); box_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_box->dash(static_cast(sl->value())); ed->redraw(); } box_prop::~box_prop(){ } box_prop::box_prop(BoxProc* arr) :Fl_Double_Window(400, 171), _box(arr) { { Fl_Box* o = new Fl_Box(5, 20, 395, 110, _("Box properties")); o->box(FL_ENGRAVED_BOX); o->align(FL_ALIGN_TOP_LEFT); } { Fl_Value_Slider* o = new Fl_Value_Slider(100, 25, 250, 25, _("Dash:")); o->type(1); o->step(0.01); o->align(FL_ALIGN_LEFT); o->range(0, 30); o->precision(0); o->value(_box->dash()); o->callback(box_prop_tick_cb); } { Fl_Value_Slider* o = new Fl_Value_Slider(100, 52, 250, 25, _("Thickness:")); o->type(1); o->step(0.01); o->align(FL_ALIGN_LEFT); o->range(0, 10); o->precision(0); o->value(_box->spessore()); o->callback(box_prop_width_cb); } Fl_Button* color=new Fl_Button(w()/2-LARG_BUTTON_DEFAULT*2, 92, LARG_BUTTON_DEFAULT*2, LARG_BUTTON_DEFAULT, _("Color")); color->callback(box_prop_color_cb); add(color); Fl_Menu_Item menu_type[] = { {_("normal"), 0, 0, NULL}, {_("shadowed"), 0, 0, NULL}, {0} }; Fl_Menu_Button* type_box=new Fl_Menu_Button(w()/2, 92, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Type")); type_box->copy(menu_type); type_box->callback(box_prop_type_cb); type_box->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); add(type_box); Fl_Button* annulla=new Fl_Button(w()/2-LARG_BUTTON_DEFAULT*3/2, h()-LARG_BUTTON_DEFAULT-10, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Close")); annulla->callback(box_prop_cancel_cb); add(annulla); end(); set_modal(); dialog_position(this); } void box_win(BoxProc* at){ box_prop p(at); p.show(); while(p.shown()){ Fl::wait(); } } bist-0.5.2/src/util.cpp0000644000175000017500000012773411733641566013341 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include <2D_vector.hpp> #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if HAVE_NCURSES_H #include #endif using namespace std; extern Preferences __pref; extern finestra_pr* MainWindow; gruppo create_ring(float side_lenght, float numsides, bool aromatic) throw (out_of_range){ if(numsides <3){ throw out_of_range("numsides < 3"); }else{ float alpha=2*M_PI/numsides; float radius=side_lenght/(sqrt(2*(1-cos(alpha)))); gruppo nw; for(float ang=0, i=0; iaggiungi(NO_ETIC, ET_STR); tmp.pos_x(radius*cos(ang)); tmp.pos_y(radius*sin(ang)); nw.add_atomo_id(tmp); } //link atoms vector::iterator beg=nw.iniz_atom(); vector::iterator end=nw.fin_atom(); int odd_ct=0; while(beg < end){ int the_id=(*beg).id();; int the_id2=-1; if(beg==end-1){ the_id2=(*nw.iniz_atom()).id(); }else{ the_id2=(*(beg+1)).id(); } atomo* a=nw.find_atomo_id(the_id); atomo* b=nw.find_atomo_id(the_id2); int type_bd=LEGAME_SINGOLO; if(aromatic){ if(odd_ct%2==1){ type_bd=LEGAME_DOPPIO; } } a->aggiungi_legame(the_id2, type_bd,0, 0 ,0); a->costruisci_arrivati(); b->aggiungi_legame(the_id, type_bd,0, 0 ,0); b->costruisci_arrivati(); beg++; odd_ct++; } return nw; } } int remap_color_48(int trentadue){ return static_cast(trentadue*65535/255); } float remap_color_1(int byte){ return static_cast(byte)/255.0; } string remap_ps_font(int fltkfont){ string font_ps; switch(fltkfont){ case 0: font_ps=__pref.get_sans_font().c_str(); break; case 1: font_ps=__pref.get_sans_font_bold().c_str(); break; case 2: font_ps=__pref.get_sans_font_italic().c_str(); break; case 3: font_ps=__pref.get_sans_font_bold_italic().c_str(); break; case 4: font_ps=__pref.get_mono_font().c_str(); break; case 5: font_ps=__pref.get_mono_font_bold().c_str(); break; case 6: font_ps=__pref.get_mono_font_italic().c_str(); break; case 7: font_ps=__pref.get_mono_font_bold_italic().c_str(); break; case 8: font_ps=__pref.get_serif_font().c_str(); break; case 9: font_ps=__pref.get_serif_font_bold().c_str(); break; case 10: font_ps=__pref.get_serif_font_italic().c_str(); break; case 11: font_ps=__pref.get_serif_font_bold_italic().c_str(); break; case 12: font_ps=__pref.get_symbol_font().c_str(); break; case 13: font_ps=__pref.get_mono_font().c_str(); break; case 14: font_ps=__pref.get_mono_font_bold().c_str(); break; case 15: font_ps=__pref.get_dingbats_font().c_str(); break; default: font_ps=__pref.get_serif_font().c_str(); break; } return font_ps; } void draw_pango_string(std::string st,int x, int y, std::string font,int dim, int cr, int cg, int cb){ int font_dim_std=dim; cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); PangoFontDescription* desc=pango_font_description_from_string(font.c_str()); pango_font_description_set_absolute_size(desc,font_dim_std*PANGO_SCALE); cairo_move_to(cn, x, y); PangoLayout *layout = pango_cairo_create_layout(cn); pango_layout_set_text(layout, st.c_str(), -1); pango_layout_set_font_description(layout, desc); pango_cairo_update_layout(cn, layout); pango_cairo_show_layout(cn, layout); g_object_unref(layout); pango_font_description_free(desc); cairo_restore(cn); } float remap_y_ps(float vx){ return __pref.getPageHeight() - vx; } bool rett_eqn(float x1, float y1, float x2, float y2, float& m, float& q){ bool result=true; const static float limit_similar=0.1; if(!similar_to(x1, x2, limit_similar)){ m=(y1-y2)/(x1-x2); q=y2-m*x2; }else{ m=0; q=0; result=false; } return result; } void is_perpendicular(float dax, float day, float ax, float ay, bool verso,float gap, float& resx, float &resy){ float m; float q; float trposx=0; float trposy=0; float treposx=ax-dax; float treposy=ay-day; bool result=rett_eqn(trposx,trposy, treposx,treposy, m,q); float alfafr; if(result){ alfafr=atan(-1/m); }else{ alfafr=0; } if(verso){ gap=-gap; } resx=gap*cos(alfafr); resy=gap*sin(alfafr); } void draw_parallel(float dax, float day, float ax, float ay, int cr, int cg, int cb, bool verso,float gap,bool tratt, bool noaccorc){ float m; float q; float trposx=0; float trposy=0; float treposx=ax-dax; float treposy=ay-day; float lung_princ=sqrt( pow(treposx,2) + pow(treposy,2) ); float lung_accorc= noaccorc ? 0 : lung_princ - gap * lung_princ; float gap_par=lung_princ - lung_accorc; bool risultato=rett_eqn(trposx,trposy, treposx,treposy, m,q); float alfa=atan2(treposy,treposx); float scompy=gap_par*sin(alfa); float scompx=gap_par*cos(alfa); alfa=M_PI+alfa; //ehm... ^_^; float ecompy=gap_par*sin(alfa); float ecompx=gap_par*cos(alfa); float lung=static_cast(__pref.getDoubleBondOffset()); //SPACE_BOND; float alfafr; if(risultato){ alfafr=atan(-1/m); }else{ alfafr=0; } bool semip= return_half_plane(lung*cos(alfafr)+dax+scompx, lung*sin(alfafr)+day+scompy, dax, day, ax, ay ); if(!(semip==verso)){ lung=-lung; } if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); if(tratt){ const double dash_gap[1]={__pref.get_tratteggio_legame()}; cairo_set_dash(cn,dash_gap,1,0); } cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,lung*cos(alfafr)+ax+ecompx, lung*sin(alfafr)+ay+ecompy); cairo_line_to(cn,lung*cos(alfafr)+dax+scompx, lung*sin(alfafr)+day+scompy); cairo_stroke(cn); cairo_restore(cn); }else{ if(tratt){ char dash[2]={__pref.get_tratteggio_legame(),0}; fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),dash); }else{ fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),0); } lung*=__pref.getZoom(); fl_color(cr,cg,cb); fl_begin_line(); fl_vertex(lung*cos(alfafr)+ax+ecompx, lung*sin(alfafr)+ay+ecompy); fl_vertex(lung*cos(alfafr)+dax+scompx, lung*sin(alfafr)+day+scompy); fl_end_line(); fl_line_style(0); } } void draw_arrow(float dax, float day, float ax, float ay, float thickness,float arr_w, float arr_h, float arr_gap, int cr, int cg, int cb, bool verso){ float the_zoom=__pref.getZoom(); float m; float q; float trposx=0; float trposy=0; float treposx=dax-ax; float treposy=day-ay; bool risultato=rett_eqn(trposx,trposy, treposx,treposy, m,q); if(risultato){ float alfa=atan2(treposy,treposx); float ecompy=arr_w*sin(alfa); float ecompx=arr_w*cos(alfa); float ecompy_fin=(arr_w-arr_gap*arr_w)*sin(alfa); float ecompx_fin=(arr_w-arr_gap*arr_w)*cos(alfa); float alfafr=atan(-1/m); if(m==0){ //mah? alfafr=M_PI/2; } float lung=arr_h+thickness; float lungspess=static_cast(thickness)/2.; if(verso){ lung=-lung; lungspess=-lungspess; } float lato1[4]={ lungspess*cos(alfafr)+ax,lungspess*sin(alfafr)+ay, lung*cos(alfafr)+ax+ecompx,lung*sin(alfafr)+ay+ecompy }; float lato2[4]={ dax,day, ax,ay }; float risx=0, risy=0; is_intersection(lato1,lato2, risx, risy); if(cairo_t_singleton::can_export()){ float back_point_x=lung*cos(alfafr)+ax+ecompx; float back_point_y=lung*sin(alfafr)+ay+ecompy; float back_point_x_w_gap=ecompx_fin+ax; float back_point_y_w_gap=ecompy_fin+ay; cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_line_width(cn,UTILS_ARROW_PLOTTER_LINE_WIDTH); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb) ); cairo_move_to(cn,risx,risy); cairo_line_to(cn,back_point_x,back_point_y); cairo_line_to(cn,back_point_x_w_gap,back_point_y_w_gap); cairo_close_path(cn); cairo_fill(cn); cairo_restore(cn); }else{ fl_line_style(FL_SOLID,static_cast(rintf(thickness))); int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float dx_sc=risx;//lu.first+w_sc/2; float dy_sc=risy;//lu.second+h_sc/2; float p1x=scale_center_point(risx,dx_sc, the_zoom); float p1y=scale_center_point(risy,dy_sc, the_zoom); float p2x=scale_center_point(lung*cos(alfafr)+ax+ecompx,dx_sc, the_zoom); float p2y=scale_center_point(lung*sin(alfafr)+ay+ecompy,dy_sc, the_zoom); float p3x=scale_center_point(ecompx_fin-arr_gap*ecompx_fin+ax,dx_sc, the_zoom); float p3y=scale_center_point(ecompy_fin+ay,dy_sc, the_zoom); fl_begin_complex_polygon(); fl_vertex(p1x+dx_scroll, p1y+dy_scroll); fl_vertex(p2x+dx_scroll, p2y+dy_scroll); fl_vertex(p3x+dx_scroll, p3y+dy_scroll); fl_end_complex_polygon(); } }else{ float spy=arr_w; //displ on y float spx=arr_h+thickness; //displ on x float lungspess=thickness/2.; if(verso){// revert displ spx=-spx; lungspess=-lungspess; } if(day>ay){ spy=-spy; } float lato1[4]={ lungspess+ax,ay, lungspess+ax+spx,ay-spy }; float lato2[4]={ dax,day, ax,ay }; float risx=0, risy=0; is_intersection(lato1,lato2, risx, risy); if(cairo_t_singleton::get_context()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_line_width(cn,UTILS_ARROW_PLOTTER_LINE_WIDTH); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb) ); cairo_move_to(cn,risx,risy); cairo_line_to(cn,ax+spx,ay-spy); cairo_line_to(cn,ax,ay-spy+(spy*arr_gap)); cairo_close_path(cn); cairo_fill(cn); cairo_restore(cn); }else{ fl_line_style(FL_SOLID,static_cast(rintf(thickness))); int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float dx_sc=risx;//lu.first+w_sc/2.0; float dy_sc=risy;//lu.second+h_sc/2.0; float p1x=scale_center_point(risx,dx_sc, the_zoom); float p1y=scale_center_point(risy,dy_sc, the_zoom); float p2x=scale_center_point(ax+spx,dx_sc, the_zoom); float p2y=scale_center_point(ay-spy,dy_sc, the_zoom); float p3x=scale_center_point(ax, dx_sc,the_zoom); float p3y=scale_center_point(ay-spy+(spy*arr_gap),dy_sc, the_zoom); fl_begin_complex_polygon(); fl_vertex(p1x+dx_scroll, p1y+dy_scroll); fl_vertex(p2x+dx_scroll,p2y+dy_scroll); fl_vertex(p3x+dx_scroll,p3y+dy_scroll); fl_end_complex_polygon(); } } } ////// void calculate_arrow_points(float dax, float day, float ax, float ay, float thick,float arr_w, float arr_h, float arr_gap, int cr, int cg, int cb, std::vector& results_x, std::vector& results_y, bool to){ float the_zoom=__pref.getZoom(); float m; float q; float trposx=0; float trposy=0; float treposx=dax-ax; float treposy=day-ay; bool result=rett_eqn(trposx,trposy, treposx,treposy, m,q); if(result){ float alfa=atan2(treposy,treposx); float ecompy=arr_w*sin(alfa); float ecompx=arr_w*cos(alfa); float ecompy_fin=(arr_w-arr_gap*arr_w)*sin(alfa); float ecompx_fin=(arr_w-arr_gap*arr_w)*cos(alfa); float alfafr=atan(-1/m); if(m==0){ //mah? alfafr=M_PI/2; } float lung=arr_h+thick; float lungspess=static_cast(thick)/2.; if(to){ lung=-lung; lungspess=-lungspess; } float lato1[4]={ lungspess*cos(alfafr)+ax,lungspess*sin(alfafr)+ay, lung*cos(alfafr)+ax+ecompx,lung*sin(alfafr)+ay+ecompy }; float lato2[4]={ dax,day, ax,ay }; float resx=0, resy=0; is_intersection(lato1,lato2, resx, resy); if(cairo_t_singleton::can_export()){ float back_point_x=lung*cos(alfafr)+ax+ecompx; float back_point_y=lung*sin(alfafr)+ay+ecompy; float back_point_x_w_gap=ecompx_fin+ax; float back_point_y_w_gap=ecompy_fin+ay; results_x.push_back(resx); results_y.push_back(resy); results_x.push_back(back_point_x); results_y.push_back(back_point_y); results_x.push_back(back_point_x_w_gap); results_y.push_back(back_point_y_w_gap); }else{ float dx_sc=resx;//lu.first+w_sc/2; float dy_sc=resy;//lu.second+h_sc/2; float p1x=scale_center_point(resx,dx_sc, the_zoom); float p1y=scale_center_point(resy,dy_sc, the_zoom); float p2x=scale_center_point(lung*cos(alfafr)+ax+ecompx,dx_sc, the_zoom); float p2y=scale_center_point(lung*sin(alfafr)+ay+ecompy,dy_sc, the_zoom); float p3x=scale_center_point(ecompx_fin-arr_gap*ecompx_fin+ax,dx_sc, the_zoom); float p3y=scale_center_point(ecompy_fin+ay,dy_sc, the_zoom); results_x.push_back(p1x);//+dx_scroll); results_y.push_back(p1y);//+dy_scroll); results_x.push_back(p2x);//+dx_scroll); results_y.push_back(p2y);//+dy_scroll); results_x.push_back(p3x);//+dx_scroll); results_y.push_back(p3y);//+dy_scroll); } }else{ float spy=arr_w; //displ on y float spx=arr_h+thick; //displ on x float lungspess=thick/2.; if(to){// revert displ spx=-spx; lungspess=-lungspess; } if(day>ay){ spy=-spy; } float lato1[4]={ lungspess+ax,ay, lungspess+ax+spx,ay-spy }; float lato2[4]={ dax,day, ax,ay }; float resx=0, resy=0; is_intersection(lato1,lato2, resx, resy); if(cairo_t_singleton::get_context()){ results_x.push_back(resx); results_y.push_back(resy); results_x.push_back(ax+spx); results_y.push_back(ay-spy); results_x.push_back(ax); results_y.push_back(ay-spy+(spy*arr_gap)); }else{ float dx_sc=resx;//lu.first+w_sc/2.0; float dy_sc=resy;//lu.second+h_sc/2.0; float p1x=scale_center_point(resx,dx_sc, the_zoom); float p1y=scale_center_point(resy,dy_sc, the_zoom); float p2x=scale_center_point(ax+spx,dx_sc, the_zoom); float p2y=scale_center_point(ay-spy,dy_sc, the_zoom); float p3x=scale_center_point(ax, dx_sc,the_zoom); float p3y=scale_center_point(ay-spy+(spy*arr_gap),dy_sc, the_zoom); results_x.push_back(p1x);//+dx_scroll); results_y.push_back(p1y);//+dy_scroll); results_x.push_back(p2x);//+dx_scroll); results_y.push_back(p2y);//+dy_scroll); results_x.push_back(p3x);//+dx_scroll); results_y.push_back(p3y);//+dy_scroll); } } } bool return_half_plane(float x, float y, float xrt, float yrt, float xrt2, float yrt2 ){ float m; float q; bool rest=rett_eqn(xrt,yrt,xrt2,yrt2,m,q); bool res; if(rest){ res = y >= m*x + q; }else{ res = x > xrt; } return res; } float b_clip_v(float da_x, float da_y, float end_x, float end_y, float x_edge){ float xpiv=min(da_x,end_x); float x1=min(da_x,end_x); float x2=max(da_x,end_x); float y1= x1==da_x ? da_y : end_y; float y2= x2==da_x ? da_y : end_y; float m ,q; bool risul=rett_eqn(x1,y1, x2, y2, m, q); if(risul){ while(abs(xpiv-x_edge)>0.001){ xpiv=(x2+x1)/2; if(xpiv0.001){ ypiv=(y2+y1)/2; if(ypiv(y_m), static_cast(thickness)); if(similar){ if(e_x - st_x >0){ return (x_m >=st_x && x_m <=e_x); }else{ return (x_m >=e_x && x_m <=st_x); } }else{ return false; } }else{ if(abs(x_m - static_cast(rintf(st_x))) < thickness && y_mmin(st_y,e_y)){ return true; }else{ return 0; } } } void draw_point(float x, float y){ int raggioatt=static_cast(rintf(RAGGIO_EL*1.5)); int xint=static_cast(rintf(x)); int yint=static_cast(rintf(y)); fl_color(0,0,0); fl_pie(xint-(raggioatt+1)/2, yint-(raggioatt+1)/2, raggioatt+1, raggioatt+1, 0, 360); fl_color(198,133,149); fl_pie(xint-(raggioatt+1)/2, yint-(raggioatt+1)/2, raggioatt, raggioatt, 0, 360); } void draw_shadowed_point(float x, float y, int r, int g, int b){ int raggioatt=static_cast(rintf(RAGGIO_EL*1.5)*__pref.getZoom()); int xint=static_cast(rintf(x)); int yint=static_cast(rintf(y)); fl_color(0,0,0); fl_pie(xint-(raggioatt+1)/2, yint-(raggioatt+1)/2, raggioatt+1, raggioatt+1, 0, 360); fl_color(r,g,b); fl_pie(xint-(raggioatt+1)/2, yint-(raggioatt+1)/2, raggioatt, raggioatt, 0, 360); } void draw_frame(int x, int y , int w ,int h){ draw_point(x,y); draw_point(x+w,y); draw_point(x+w,y+h); draw_point(x,y+h); } void get_visual_bb_etic(etichetta& et, float& x, float& y){ float st_xpos=et.visual_x(); float st_ypos=et.visual_y(); int half_w=0; int h=0; string car; vector < pair > stringhevec=et.vec_str(); switch(et.allineamento()){ case ETIC_ALLINEA_CT: st_xpos-=et.visual_w()/2; st_ypos-=et.visual_h()/2; break; case ETIC_ALLINEA_DX: if(stringhevec.size()>0){ car=stringhevec[(stringhevec.size()-1)].first; } if(car.size()>0){ car=car[car.size()-1]; fl_measure(car.c_str(), half_w, h); } st_xpos-=et.visual_w(); st_xpos+=half_w/2; st_ypos-=et.visual_h()/2; break; case ETIC_ALLINEA_SX: default: car+=((et.vec_str())[0].first)[0]; fl_measure(car.c_str(), half_w, h); st_ypos-=et.visual_h()/2; st_xpos-=half_w/2; break; } x=static_cast(rintf(st_xpos)); y=static_cast(rintf(st_ypos)); } void get_bb_etic(etichetta& et, int& x, int& y){ float st_xpos=et.x(); float st_ypos=et.y(); int half_w=0; int h=0; string car; vector < pair > stringhevec=et.vec_str(); switch(et.allineamento()){ case ETIC_ALLINEA_CT: st_xpos-=et.w()/2; st_ypos-=et.h()/2; break; case ETIC_ALLINEA_DX: if(stringhevec.size()>0){ car=stringhevec[(stringhevec.size()-1)].first; } if(car.size()>0){ car=car[car.size()-1]; fl_measure(car.c_str(), half_w, h); } st_xpos-=et.w(); st_xpos+=half_w/2; st_ypos-=et.h()/2; break; case ETIC_ALLINEA_SX: default: car+=((et.vec_str())[0].first)[0]; fl_measure(car.c_str(), half_w, h); st_ypos-=et.h()/2; st_xpos-=half_w/2; break; } x=static_cast(rintf(st_xpos)); y=static_cast(rintf(st_ypos)); } void get_bb_etic(etichetta& et, float& x, float& y){ string font_ps; int tipo_font; get_font_handle(et, tipo_font, font_ps); fl_font(tipo_font,et.phys_dim()); float st_xpos=et.phys_x(); float st_ypos=et.phys_y(); string car; vector < pair > stringhevec=et.vec_str(); switch(et.allineamento()){ case ETIC_ALLINEA_CT: st_xpos-=et.phys_w()/2; st_ypos-=et.phys_h()/2; break; case ETIC_ALLINEA_DX: if(stringhevec.size()>0){ car=stringhevec[(stringhevec.size()-1)].first; int tp_str=(stringhevec[0]).second; car=car[car.size()-1]; etichetta cp(et); cp.elimina(); cp.aggiungi(car, tp_str); st_xpos-=et.phys_w(); st_xpos+=cp.phys_w()/2; st_ypos-=et.phys_h()/2; } break; case ETIC_ALLINEA_SX: default: { if(stringhevec.size()>0){ car=((stringhevec[0]).first)[0]; int tp_str=(stringhevec[0]).second; etichetta cp(et); cp.elimina(); cp.aggiungi(car, tp_str); st_ypos-=cp.phys_h()/2; st_xpos-=cp.phys_w()/2; } } break; } x=st_xpos; y=st_ypos+et.v_offset(); } void get_font_handle(etichetta et, int &font_fltk, string &font_libplot){ font_factory* f_factory=font_map_singleton::get_context(); string font_ps; int tipo_font; switch(et.font()){ case 0: tipo_font=f_factory->get_actual_font(FL_HELVETICA); font_ps=__pref.get_sans_font().c_str(); break; case 1: tipo_font=f_factory->get_actual_font(FL_HELVETICA_BOLD); font_ps=__pref.get_sans_font_bold().c_str(); break; case 2: tipo_font=f_factory->get_actual_font(FL_HELVETICA_ITALIC); font_ps=__pref.get_sans_font_italic().c_str(); break; case 3: tipo_font=f_factory->get_actual_font(FL_HELVETICA_BOLD_ITALIC); font_ps=__pref.get_sans_font_bold_italic().c_str(); break; case 4: tipo_font=f_factory->get_actual_font(FL_COURIER); font_ps=__pref.get_mono_font().c_str(); break; case 5: tipo_font=f_factory->get_actual_font(FL_COURIER_BOLD); font_ps=__pref.get_mono_font_bold().c_str(); break; case 6: tipo_font=f_factory->get_actual_font(FL_COURIER_ITALIC); font_ps=__pref.get_mono_font_italic().c_str(); break; case 7: tipo_font=f_factory->get_actual_font(FL_COURIER_BOLD_ITALIC); font_ps=__pref.get_mono_font_bold_italic().c_str(); break; case 8: tipo_font=f_factory->get_actual_font(FL_TIMES); font_ps=__pref.get_serif_font().c_str(); break; case 9: tipo_font=f_factory->get_actual_font(FL_TIMES_BOLD); font_ps=__pref.get_serif_font_bold().c_str(); break; case 10: tipo_font=f_factory->get_actual_font(FL_TIMES_ITALIC); font_ps=__pref.get_serif_font_italic().c_str(); break; case 11: tipo_font=f_factory->get_actual_font(FL_TIMES_BOLD_ITALIC); font_ps=__pref.get_serif_font_bold_italic().c_str(); break; case 12: tipo_font=f_factory->get_actual_font(FL_SYMBOL); font_ps=__pref.get_symbol_font().c_str(); break; case 13: tipo_font=f_factory->get_actual_font(FL_SCREEN); font_ps=__pref.get_mono_font().c_str(); break; case 14: tipo_font=f_factory->get_actual_font(FL_SCREEN_BOLD); font_ps=__pref.get_mono_font_bold().c_str(); break; case 15: tipo_font=f_factory->get_actual_font(FL_ZAPF_DINGBATS); font_ps=__pref.get_dingbats_font().c_str(); break; default: tipo_font=f_factory->get_actual_font(FL_TIMES); font_ps=__pref.get_serif_font().c_str(); break; } font_fltk=tipo_font; font_libplot=font_ps; } void not_impl(){ fl_alert(_("Sorry, not yet implemented")); } bool format_supported(string format){ static const unsigned int num_format=3; const char* valid_format[num_format]={EXPORT_FORMAT_PS, EXPORT_FORMAT_SVG, EXPORT_FORMAT_PNG}; bool risul=false; for(unsigned int i=0;i(pow(255.0,M)) % q; M--; } return risul; } bool is_intersection(float* xy1,float* xy2, float& risx, float& risy){ float m1=-220, q1=-20; bool prima_retta=rett_eqn(xy1[0], xy1[1], xy1[2], xy1[3], m1, q1); float m2=0, q2=0; bool seconda_retta=rett_eqn(xy2[0], xy2[1], xy2[2], xy2[3], m2, q2); bool risul =true; if(prima_retta){ if(seconda_retta){ risy=( ( (q2-q1)/(m1-m2) ) * m1 ) + q1; risx=(q2-q1)/(m1-m2); }else{ risx=xy2[0]; risy=risx*m1+q1; } }else{ if(seconda_retta){ risx=xy1[0]; risy=risx*m2+q2; }else{ risul=false; } } return risul; } Splash_Window::Splash_Window() :Fl_Window(Splash_Window::splash_w,Splash_Window::splash_h), _logo(0,0,Splash_Window::splash_w,Splash_Window::splash_h) { clear_border(); resize(Fl::w()/2 - w()/2,Fl::h()/2 - h()/2,Splash_Window::splash_w,Splash_Window::splash_h); box(FL_FLAT_BOX); color(FL_BLACK); add(_logo); Fl::add_timeout(Splash_Window::splash_persistence, Splash_Window::hide_win_timeout, reinterpret_cast(this)); } Splash_Window::~Splash_Window() { Fl::remove_timeout(Splash_Window::hide_win_timeout, reinterpret_cast(this)); } int Splash_Window::handle(int e){ switch(e){ case FL_ENTER: hide(); return 1; } return 0; } void Splash_Window::hide_win_timeout(void* win){ Fl_Window* w=reinterpret_cast(win); w->hide(); } const double Splash_Window::splash_persistence=5; const int Splash_Window::splash_w=452; const int Splash_Window::splash_h=348; Splash_Widget::Splash_Widget(int x,int y,int w, int h) :Fl_Widget(x, y, w, h) { } Splash_Widget::~Splash_Widget(){ } void Splash_Widget::draw(){ fl_draw_pixmap(logo, 2, 2); } void merge_groups(gruppo* g_st , gruppo* g_arr,atomo* st, atomo* arr, int tipo){ //fare il join di due gruppi diversi int id_atom_arr_bk=arr->id(); int id_atom_st_bk=st->id(); int id_nuovo_arr=arr->id();; //the largest id in the st group int id_st_max=(*(g_st->fin_atom()-1)).id(); //cerchiamo se nel gruppo di arr esiste id_st_max bool exist_in_arr=false; vector::iterator inatm=g_arr->iniz_atom(); vector::iterator finatm=g_arr->fin_atom(); while(inatm!=finatm){ if((*inatm).id()==id_st_max){ exist_in_arr=true; break; } inatm++; } if(exist_in_arr){ }else{ if(id_nuovo_arr==-1){ id_nuovo_arr=id_atom_arr_bk; } } id_st_max++; int id_legato=g_arr->rimappa_da(id_st_max,id_nuovo_arr); vector::iterator inatm2=g_arr->iniz_atom(); vector::iterator finatm2=g_arr->fin_atom(); while(inatm2!=finatm2){ (*inatm2).aggiungi_genitore(g_st); g_st->add_atomo((*inatm2)); inatm2++; } vector::iterator inatm4=g_st->iniz_atom(); vector::iterator finatm4=g_st->fin_atom(); atomo* nuovoarr=0; atomo* nuovost=0; while(inatm4!=finatm4){ if((*inatm4).id()==id_legato){ nuovoarr=&(*inatm4); } if((*inatm4).id()==id_atom_st_bk){ nuovost=&(*inatm4); } inatm4++; } nuovost->aggiungi_legame(nuovoarr->id(),tipo,0,0,0); nuovost->costruisci_arrivati(); if(tipo==LEGAME_INTERNO || tipo== LEGAME_ESTERNO || tipo==LEGAME_INTERNO_OPP || tipo==LEGAME_ESTERNO_OPP){ tipo=-tipo; } nuovoarr->aggiungi_legame(nuovost->id(),tipo,0,0,0); nuovoarr->costruisci_arrivati(); vector::iterator inatm3=g_st->iniz_atom(); vector::iterator finatm3=g_st->fin_atom(); while(inatm3!=finatm3){ (*inatm3).costruisci_arrivati(); inatm3++; } } bool calc_bb_gen_intersect(pair& lu1, pair& rd1, pair& lu2, pair& rd2 ){ bool res=true; if(lu1.first > rd2.first) { //OK res=false; } if(rd1.first < lu2.first ){ res=false; } if(lu1.second > rd2.second ){ res=false; } if(rd1.second < lu2.second ){ //OK res=false; } return res; } void calc_bb_gen(vector x, vector y, pair& ld, pair& ru){ float min_xbb=1E20; float min_ybb=1E20; float max_xbb=1E-20; float max_ybb=1E-20; for(unsigned int i=0;i max_xbb){ max_xbb=x[i]; } if(y[i]< min_ybb){ min_ybb=y[i]; } if(y[i]> max_ybb){ max_ybb=y[i]; } } ld.first=min_xbb; ld.second=min_ybb; ru.first=max_xbb; ru.second=max_ybb; } float scale_center_point(double point,double trasl, double zoom){ return static_cast( (point-trasl)*zoom+trasl ); } float descale(float scaled){ return scaled/__pref.getZoom(); } float scale_z(float scaled){ return scaled * __pref.getZoom(); } vector correct_arrow(float xtan_st, float ytan_st, float xtan_end, float ytan_end, float entity){ vector result; float pt_x=xtan_end; float pt_y=ytan_end; float x_c_diff=xtan_end-xtan_st; float y_c_diff=ytan_end-ytan_st; //module float mgn_diff=sqrt(pow(x_c_diff,2)+pow(y_c_diff,2)); //angle float angl_diff=atan2f(y_c_diff,x_c_diff); if(mgn_diff<20){ pt_x=xtan_st+( (mgn_diff*5/8) * cos(angl_diff)); pt_y=ytan_st+( (mgn_diff*5/8) * sin(angl_diff)); } result.push_back(pt_x); result.push_back(pt_y); return result; } int ask_overwrite_file(string the_file){ string the_choice=string(_("File with name")) + string(" ") + string(the_file) + string(" ") + string(_("already exist.\nDo you want to overwrite it?")); return fl_choice("%s",_("No"),_("Yes"),NULL,the_choice.c_str()); } int ask_overwrite_file_console(string the_file){ string the_choice=string(_("File with name")) + string(" ") + string(the_file) + string(" ") + string(_("already exist.\nDo you want to overwrite it?[y/N] ")); std::string ans; std::cout << the_choice << std::ends; getline(cin,ans,'\n'); int res=1; if(ans!=_("y")){ res=0; } return res; } std::pair poly_bezier(float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float t) throw (out_of_range) { if(t >=0 && t<=1){ std::pair res; float one_minus_t=(1-t); float one_minus_t_square=pow(one_minus_t,2); float one_minus_t_cube=pow(one_minus_t,3); float t_square=pow(t,2); float t_cube=pow(t,3); res.first=x0 * one_minus_t_cube + 3 * x1 * t * one_minus_t_square + 3 * x2 * t_square * one_minus_t + x3 * t_cube; res.second=y0 * one_minus_t_cube + 3 * y1 * t * one_minus_t_square + 3 * y2 * t_square * one_minus_t + y3 * t_cube; return res; }else{ throw out_of_range("poly_bezier: t <0 || t >1"); } } std::pair rotate_point(float x, float y, float angle){ matrix the_vec(2,1); matrix transformation(2,2); std::pair res(0,0); try{ the_vec(0,0)=x; the_vec(1,0)=y; transformation(0,0)=cos(angle); transformation(0,1)=sin(angle); transformation(1,0)=-sin(angle); transformation(1,1)=cos(angle); matrix mat_res= transformation * the_vec; res.first=mat_res(0,0); res.second=mat_res(1,0); }catch (matrix_error ex){ cerr << "exception in " << __LINE__ << " " << __FILE__ << ex.what() << endl; } return res; } void print_redfog_wisdom(){ const static char* wisdom_of_redfog[]={ " __@ ", //0 " _`\\< _ ",//1 " --(|)/ (|) ",//2 " -- (/)/ (/) ",//3 " -- (-)/ (-) ",//4 " -- (\\)/ (\\) ",//5 " -- (|)/ (|) ",//6 " - (/)/ (/) ",//7 " - (-)/ (-) ",//8 " (\\)/ (\\) ",//9 "...\"Caso mai passo\"... ", //10 "...\"Hai martello e scarpe da tennis?\"...",//11 "...\"Hai mollica?\"... ",//12 "...\"Qualcuno sa perche' l'installazione di Debian sull'amiga 2000 mi si fermi al 2%\"...",//13 "...\"Motoguzzi\"... ",//14 "\"ma sei pazzo?\nDove cazzo sei?\nMi risponde una voce in inglese!\"\n-- sms spedito a cage mentre questi e' in vacanza",//15 "...\"nelle moderne CPU il bus della cialda di silicio e' ormai cosi'\npiccolo da essere diventato puntiforme\"..."//16 }; const static int start_wisdom=10; const static int end_wisdom=16; srand(time(NULL)); unsigned int perl=( rand()%(end_wisdom - start_wisdom + 1 ) ) + start_wisdom; #if HAVE_NCURSES_H unsigned int wheel_start=2; unsigned int wheel_size=8; unsigned int wheel_ptr=0; char ch='a'; char st_ch='q'; initscr(); start_color(); init_pair(1,COLOR_WHITE,COLOR_BLACK); init_pair(2,COLOR_RED,COLOR_BLACK); init_pair(3,COLOR_GREEN,COLOR_BLACK); while(ch!=st_ch){ timeout(200); attron(COLOR_PAIR(1)); mvprintw(0, 0,wisdom_of_redfog[0]); mvprintw(1, 0,wisdom_of_redfog[1]); attron(COLOR_PAIR(2)); mvprintw(2, 0,wisdom_of_redfog[wheel_start + (wheel_ptr% wheel_size)]); attron(COLOR_PAIR(3)); mvprintw(3, 0,wisdom_of_redfog[perl]); #ifdef DEBUG mvprintw(4, 0,"%i",wheel_start + (wheel_ptr% wheel_size)); #endif refresh(); wheel_ptr++; ch=getch(); } endwin(); #else std::cout << wisdom_of_redfog[0] << std::endl; std::cout << wisdom_of_redfog[1] << std::endl; std::cout << wisdom_of_redfog[2] << std::endl; std::cout << wisdom_of_redfog[perl] << std::endl; #endif exit(EXIT_SUCCESS); } float rad2deg(float angle){ return 180.0*angle/M_PI; } float deg2rad(float angle){ return (angle*M_PI)/180.0; } void attract_mouse_to_magnetic_point(int* x_m, int* y_m){ double mag_gap=__pref.getMagnetic_point_gap() * __pref.getZoom(); if(mag_gap>0){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); *x_m-=dx_scroll; *y_m-=dy_scroll; int floor_x=static_cast(floor((*x_m)/mag_gap)); int floor_y=static_cast(floor((*y_m)/mag_gap)); int ceil_x=static_cast(ceil((*x_m)/mag_gap)); int ceil_y=static_cast(ceil((*y_m)/mag_gap)); if(abs(*x_m - (ceil_x * mag_gap)) < abs(*x_m - (floor_x * mag_gap))){ (*x_m)=static_cast(rintf(ceil_x * mag_gap)); }else{ (*x_m)=static_cast(rintf(floor_x* mag_gap)); } *x_m+=dx_scroll; if(abs(*y_m - (ceil_y * mag_gap)) < abs(*y_m - (floor_y * mag_gap))){ (*y_m)=static_cast(rintf(ceil_y* mag_gap)); }else{ (*y_m)=static_cast(rintf(floor_y* mag_gap)); } *y_m+=dy_scroll; } } std::string trim(std::string s,const std::string drop){ std::string r=s.erase(s.find_last_not_of(drop)+1); return r.erase(0,r.find_first_not_of(drop)); } void search_for_font(const char* desidered, Fl_Font destination, int num_fonts){ for (int i = 0; i < num_fonts; i++) { const char *name = Fl::get_font_name((Fl_Font)i,NULL); if(strcasecmp (desidered,name)==0){ Fl::set_font(destination, (Fl_Font)i); break; } } } void set_actual_font_from_prefs(){ int n=Fl::set_fonts(NULL); search_for_font(__pref.get_sans_font().c_str(),FL_HELVETICA,n); search_for_font(__pref.get_sans_font().c_str(),FL_HELVETICA,n); search_for_font(__pref.get_sans_font_bold().c_str(),FL_HELVETICA_BOLD,n); search_for_font(__pref.get_sans_font_italic().c_str(),FL_HELVETICA_ITALIC,n); search_for_font(__pref.get_sans_font_bold_italic().c_str(),FL_HELVETICA_BOLD_ITALIC,n); search_for_font(__pref.get_mono_font().c_str(),FL_COURIER,n); search_for_font(__pref.get_mono_font_bold().c_str(),FL_COURIER_BOLD,n); search_for_font(__pref.get_mono_font_italic().c_str(),FL_COURIER_ITALIC,n); search_for_font(__pref.get_mono_font_bold_italic().c_str(),FL_COURIER_BOLD_ITALIC,n); search_for_font(__pref.get_serif_font().c_str(),FL_TIMES,n); search_for_font(__pref.get_serif_font_bold().c_str(),FL_TIMES_BOLD,n); search_for_font(__pref.get_serif_font_italic().c_str(),FL_TIMES_ITALIC,n); search_for_font(__pref.get_serif_font_bold_italic().c_str(),FL_TIMES_BOLD_ITALIC,n); search_for_font(__pref.get_symbol_font().c_str(),FL_SYMBOL,n); search_for_font(__pref.get_mono_font().c_str(),FL_SCREEN,n); search_for_font(__pref.get_mono_font_bold().c_str(),FL_SCREEN_BOLD,n); search_for_font(__pref.get_dingbats_font().c_str(),FL_ZAPF_DINGBATS,n); } bond_type shift_bond_type(bond_type curr){ int curr_int=static_cast(curr); int res=LEGAME_SINGOLO; if(curr_int==LEGAME_INTERNO || curr_int==LEGAME_ESTERNO){ res=-curr_int; }else{ if(curr_int<0){ curr_int=abs(curr_int); } res = ( curr_int+1 ) % (LAST_BOND+1); } return static_cast(res); } bool guess_is_mdl_file(std::string f){ static const std::string signature="M END"; bool res=false; ifstream inf(f.c_str(),ios::in); if(inf){ while(!inf.eof()){ string line; getline(inf,line,'\n'); if(line.size()>=signature.size()){ std::string substr=line.substr(0,signature.size()); if(substr==signature){ res=true; } } } } inf.close(); return res; } bool guess_is_cml_file(std::string f){ static const std::string signature="=signature.size()){ std::string substr=line.substr(0,signature.size()); if(substr==signature){ res=true; } } } inf.close(); return res; } bool is_ELF_shared_object(std::string file){ std::string sub=file.substr(file.size()-2,2); if(sub=="so"){ return true; }else{ return false; } } proc_bezier* add_bezier_along_circle(gruppo* grp, float center_x, float center_y, float radius , float t1, float t2){ //from http://www.tinaja.com/glib/bezcirc2.pdf std::pair v1(0,0); std::pair v2(0,0); std::pair v1_tg(0,0); std::pair v2_tg(0,0); float theta=t2-t1; v1.first = cos(theta/2.0); v1.second = sin(theta/2.0); v2.first = v1.first; v2.second = -v1.second; v1_tg.first = (4.0-v1.first)/3.0; v1_tg.second = ( ((1.0-v1.first)*(3.0-v1.first))/(3.0*v1.second) ); v2_tg.first = v1_tg.first; v2_tg.second = - v1_tg.second; float bezAng = -(t1 + theta/2.0); v1=bidimensional_vector::rotate(v1,bezAng); v2=bidimensional_vector::rotate(v2,bezAng); v1_tg=bidimensional_vector::rotate(v1_tg,bezAng); v2_tg=bidimensional_vector::rotate(v2_tg,bezAng); v1=bidimensional_vector::scale(v1,radius); v2=bidimensional_vector::scale(v2,radius); v1_tg=bidimensional_vector::scale(v1_tg,radius); v2_tg=bidimensional_vector::scale(v2_tg,radius); v1=bidimensional_vector::translate(v1,center_x,center_y); v2=bidimensional_vector::translate(v2,center_x,center_y); v1_tg=bidimensional_vector::translate(v1_tg,center_x,center_y); v2_tg=bidimensional_vector::translate(v2_tg,center_x,center_y); proc_bezier* bz=new proc_bezier(); bz->ix(v1.first); bz->iy(v1.second); bz->ex(v2.first); bz->ey(v2.second); bz->tan1x(v1_tg.first); bz->tan1y(v1_tg.second); bz->dash(0); bz->tan2x(v2_tg.first); bz->tan2y(v2_tg.second); bz->spessore(1); int nwid=grp->aggiungi_procedura(bz); return dynamic_cast(grp->find_proc_id(nwid)); } void s_regmatch(std::string regex,std::string st, std::vector& vec_res, bool case_ins){ regex_t rex; if(case_ins){ regcomp(&rex,regex.c_str(),REG_ICASE); }else{ regcomp(&rex,regex.c_str(),REG_ICASE); } regmatch_t res_match; int res=regexec (&rex, st.c_str(), 1, &res_match, 0); if(res==0){ std::string match=st.substr(res_match.rm_so,res_match.rm_eo-res_match.rm_so); vec_res.push_back(match); regfree (&rex); if(res_match.rm_eo< static_cast(st.size())){ s_regmatch(regex,st.substr(res_match.rm_eo),vec_res,case_ins); } }else{ char err[255]; regerror (res, &rex, err, 255); regfree (&rex); } } std::string s_replace(std::string regex, std::string where, std::string what, bool case_ins){ regex_t rex; if(case_ins){ regcomp(&rex,regex.c_str(),REG_ICASE); }else{ regcomp(&rex,regex.c_str(),REG_ICASE); } regmatch_t res_match; int res=regexec (&rex, where.c_str(), 1, &res_match, 0); std::string result; if(res==0){ std::string match=where.substr(res_match.rm_so,res_match.rm_eo-res_match.rm_so); std::string lft=where.substr(0,res_match.rm_so); std::string rght=where.substr(res_match.rm_eo); result= lft + what + rght; regfree (&rex); }else{ char err[255]; regerror (res, &rex, err, 255); regfree (&rex); } return result; } void dialog_position(Fl_Window* win, int offset){ int x; int y; int w; int h; int mx=Fl::event_x_root(); int my=Fl::event_y_root(); Fl::screen_xywh(x, y, w, h); if(mx + offset + win->w() > w){ mx = mx -win->w()-offset; }else{ mx = mx + offset; } if(my + offset + win->h() > h){ my = my - win->h() -offset; }else{ my = my + offset; } win->position(mx,my); } bist-0.5.2/src/bist_plugin.cpp0000644000175000017500000001131411412200237014641 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; bist_plugin::bist_plugin(immagine* imm,string libpath) :_lib(libpath) { _the_image=imm; } bist_plugin::~bist_plugin(){ //TODO } string bist_plugin::libpath(){ return _lib; } vector * bist_plugin::r_etich(){ return & _the_image->_stringhe; } vector * bist_plugin::r_groups(){ return &_the_image->_gruppi; } vector< pair < int, pair > >* bist_plugin::r_elem_selected(){ return &_the_image->_elem_selected; } vector* bist_plugin::r_legami_selected(){ return &_the_image->_legami_selected; } void bist_plugin::image(immagine* imm){ _the_image=imm; } std::vector bist_plugin::get_all_etich_as_vector(){ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); std::map group_added; std::vector res; if(eliniz!=elend){ while(eliniz!=elend){ switch((*eliniz).first){ eliniz++; case ETICHETTA: { etichetta* labl=_the_image->ritorna_etich_pointer(((*eliniz).second).second); res.push_back(labl); break; } } eliniz++; } } return res; } std::vector bist_plugin::get_all_proc_as_vector(){ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); std::map group_added; std::vector res; if(eliniz!=elend){ while(eliniz!=elend){ switch((*eliniz).first){ case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz).second).second); res.push_back(proc); break; } } eliniz++; } } return res; } std::vector bist_plugin::get_all_molecule_as_vector(){ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); std::vector res; std::map group_added; if(eliniz!=elend){ while(eliniz!=elend){ switch((*eliniz).first){ case ATOMO: { if(group_added.count(((*eliniz).second).first)==0){ gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); res.push_back(the_grp); group_added.insert(std::pair((*eliniz).second.first,true)); break; } } } eliniz++; } } return res; } std::string bist_plugin::menu_path(){ return ""; } bist-0.5.2/src/gruppo.cpp0000644000175000017500000030234711657505745013676 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; bool ordina_gruppo_id(gruppo uno, gruppo altro){ // cout << "SORT GRUPPI!!!!!!!!!!!!!" << uno.id() << " " << altro.id() << endl; return uno.id() < altro.id(); } int dummy_pf(atomo* da , atomo* fino, void* data, void* data2 ,void* data3){ vector* visti=static_cast< vector* >(data); int* i=static_cast(data2); cout << "comp::" << *i << endl; (*visti)[*i]=true; return 0; } /*********************gruppo*********************/ gruppo::gruppo(const gruppo& altro) :_id_gruppo(altro._id_gruppo), _tipo_gruppo(altro._tipo_gruppo), _angolorot(altro._angolorot), _xpivot(altro._xpivot), _ypivot(altro._ypivot) { _atomi.erase(_atomi.begin(),_atomi.end()); _procedure.erase(_procedure.begin(),_procedure.end()); for(unsigned int i=0;i<(altro._procedure).size();i++){ switch(((altro._procedure)[i])->tipo()){ case PROC_ARC: { proc_arc* arc=dynamic_cast((altro._procedure)[i]); proc_arc* arcnw=new proc_arc(arc); arcnw->aggiungi_genitore(this); _procedure.push_back(arcnw); break; } case PROC_ARROW: { proc_arrow* arr=dynamic_cast((altro._procedure)[i]); proc_arrow* arrnw=new proc_arrow(arr); arrnw->aggiungi_genitore(this); _procedure.push_back(arrnw); break; } case PROC_BEZIER: { proc_bezier* bez=dynamic_cast((altro._procedure)[i]); proc_bezier* beznw= new proc_bezier(bez); beznw->aggiungi_genitore(this); _procedure.push_back(beznw); break; } case PROC_BOX: { BoxProc* box=dynamic_cast((altro._procedure)[i]); BoxProc* boxnw=new BoxProc(box); boxnw->aggiungi_genitore(this); _procedure.push_back(boxnw); break; } } } for(unsigned int cta=0;cta<(altro._atomi).size();cta++){ _atomi.push_back(altro._atomi[cta]); _atomi.back().aggiungi_genitore(this); } } gruppo& gruppo::operator=(const gruppo& altro){ #ifdef DEBUG cout << "OPERATORE GRUPPO =" << endl; #endif _id_gruppo=altro._id_gruppo; _tipo_gruppo=altro._tipo_gruppo; _angolorot=altro._angolorot; _xpivot=altro._xpivot; _ypivot=altro._ypivot; _atomi.erase(_atomi.begin(),_atomi.end()); _procedure.erase(_procedure.begin(),_procedure.end()); for(unsigned int i=0;i<(altro._procedure).size();i++){ switch(((altro._procedure)[i])->tipo()){ case PROC_ARC: { proc_arc* arc=dynamic_cast((altro._procedure)[i]); proc_arc* arcnw=new proc_arc(arc); arcnw->aggiungi_genitore(this); _procedure.push_back(arcnw); break; } case PROC_ARROW: { proc_arrow* arr=dynamic_cast((altro._procedure)[i]); proc_arrow* arrnw=new proc_arrow(arr); arrnw->aggiungi_genitore(this); _procedure.push_back(arrnw); break; } case PROC_BEZIER: { proc_bezier* bez=dynamic_cast((altro._procedure)[i]); proc_bezier* beznw= new proc_bezier(bez); beznw->aggiungi_genitore(this); _procedure.push_back(beznw); break; } case PROC_BOX: { BoxProc* box=dynamic_cast((altro._procedure)[i]); BoxProc* boxnw=new BoxProc(box); boxnw->aggiungi_genitore(this); _procedure.push_back(boxnw); break; } } } for(unsigned int cta=0;cta<(altro._atomi).size();cta++){ _atomi.push_back(altro._atomi[cta]); _atomi.back().aggiungi_genitore(this); } return *this; } gruppo::gruppo() :_id_gruppo(0), _tipo_gruppo(DEFAULT_TYPE_GROUP), _angolorot(0), _xpivot(0), _ypivot(0) { } gruppo::~gruppo(){ for(unsigned int i=0;i<_procedure.size();i++){ #ifdef DEBUG cout << "Eliminata procedura..." ; #endif delete _procedure[i]; } } bool gruppo::operator==(gruppo altro){ if(id_gruppo()==altro.id_gruppo()){ return true; }else{ return false; } } float gruppo::w(){ std::pair ld; std::pair ru; get_bounding_box(ld,ru); return ru.first-ld.first; } float gruppo::phys_w(){ std::pair ld; std::pair ru; get_phys_bounding_box(ld,ru); return ru.first-ld.first; } float gruppo::visual_w(){ std::pair ld; std::pair ru; get_visual_bounding_box(ld,ru); return ru.first-ld.first; } float gruppo::h(){ std::pair ld; std::pair ru; get_bounding_box(ld,ru); return ru.second-ld.second; } float gruppo::phys_h(){ std::pair ld; std::pair ru; get_phys_bounding_box(ld,ru); return ru.second-ld.second; } float gruppo::visual_h(){ std::pair ld; std::pair ru; get_visual_bounding_box(ld,ru); return ru.second-ld.second; } float gruppo::posx(){ std::pair ld; std::pair ru; get_bounding_box(ld,ru); return ld.first; } float gruppo::phys_posx(){ std::pair ld; std::pair ru; get_phys_bounding_box(ld,ru); return ld.first; } float gruppo::visual_posx(){ std::pair ld; std::pair ru; get_visual_bounding_box(ld,ru); return ld.first; } float gruppo::posy(){ std::pair ld; std::pair ru; get_bounding_box(ld,ru); return ld.second; } float gruppo::phys_posy(){ std::pair ld; std::pair ru; get_phys_bounding_box(ld,ru); return ld.second; } float gruppo::visual_posy(){ std::pair ld; std::pair ru; get_visual_bounding_box(ld,ru); return ld.second; } void gruppo::xpivot(float nw){ _xpivot=nw; } void gruppo::ypivot(float nw){ _ypivot=nw; } void gruppo::angolorot(float nw){ _angolorot=nw; } float gruppo::xpivot(){ return _xpivot; } float gruppo::ypivot(){ return _ypivot; } float gruppo::angolorot(){ return _angolorot; } /** *Setta il valore dell 'id del gruppo * \param nx nuovo id */ void gruppo::id_gruppo(int nw){ _id_gruppo=nw; } /** *Ritorna l'id del gruppo */ int gruppo::id_gruppo(){ return _id_gruppo; } int gruppo::id(){ return id_gruppo(); } void gruppo::id(int nw){ id_gruppo(nw); } void gruppo::tipo_gruppo(int nw){ _tipo_gruppo=nw; } int gruppo::tipo_gruppo(){ return _tipo_gruppo; } bool gruppo::purge_atom(int id){ vector::iterator inatom=iniz_atom(); vector::iterator finatom=fin_atom(); while(inatom!=finatom){ (*inatom).elimina_legame(id); inatom++; } elimina_atomo(id); inatom=iniz_atom(); finatom=fin_atom(); sort(_atomi.begin(), _atomi.end(), ordina_atomo_id); return true; } vector::iterator gruppo::elimina_atomo(int id){ vector::iterator inatom=iniz_atom(); vector::iterator finatom=fin_atom(); vector::iterator resul=fin_atom(); while(inatom!=finatom){ if((*inatom).id()==id){ //cout << "id da eliminare " << id ; resul=_atomi.erase(inatom); break; }else{ inatom++; } } //cout << "...eliminato" << endl; return resul; } void gruppo::add_atomo(atomo nw, bool sorted){ _atomi.push_back(nw); if(sorted){ sort(_atomi.begin(), _atomi.end(), ordina_atomo_id); } } void gruppo::ordina(){ sort(_atomi.begin(), _atomi.end(), ordina_atomo_id); } /** *Aggiunge un atomo al gruppo setta un id unico e ordina secondo l'operatore "minore di" *gli atomi. * *\param nw nuovo atomo */ int gruppo::add_atomo_id(atomo nw){ int id_atm=0; if(_atomi.size()>0){ id_atm=_atomi.back().id()+1; } nw.id(id_atm); _atomi.push_back(nw); sort(_atomi.begin(), _atomi.end(), ordina_atomo_id); return id_atm; } bool gruppo::has_atoms(){ return (iniz_atom() != fin_atom()); } void gruppo::depth_search(atomo& start){ if(!start.visitato()){ start.visitato(true); vector::iterator primo=start.primo_leg(); vector::iterator ultimo=start.ultimo_leg(); while(primo!=ultimo){ int legato=(*primo).id_atomo(); for(unsigned int i=0;i<_atomi.size();i++){ if((_atomi[i]).id()==legato){ if(!_atomi[i].visitato()){ render(start,_atomi[i],(*primo)); }else if ( !_atomi[i].e_arrivato( start.id() )){ render(start,_atomi[i],(*primo)); }else{ if((start.ultimo_leg()-start.primo_leg())<=1){ etichetta sy=start.etich(); allinea_etichetta(sy,start); if((sy.vec_str())[0].first!=string(NO_ETIC)){ if((sy.vec_str())[0].first!=string(ETIC_IDR_UP)){ sy.disegna(); }else{ if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(sy.cr()), remap_color_1(sy.cg()), remap_color_1(sy.cb())); cairo_move_to(cn,start.pos_x(),start.pos_y()); cairo_arc(cn,start.pos_x(),start.pos_y(),RAGGIO_EL,0,2*M_PI); cairo_fill(cn); cairo_restore(cn); }else{ fl_color(sy.cr(),sy.cg(),sy.cb()); int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float raggio_hidr_zoomed= RAGGIO_IDR_UP *__pref.getZoom(); int approx_r_hidr_zoomed=static_cast(rintf(raggio_hidr_zoomed)); fl_pie(static_cast(rintf(start.pos_x()-raggio_hidr_zoomed/2 +dx_scroll)), static_cast(rintf(start.pos_y()-raggio_hidr_zoomed/2 +dy_scroll)), approx_r_hidr_zoomed,approx_r_hidr_zoomed,0,360); } } } if(start.cariche()){ int free_side=render_carica(start,sy.x(), sy.y(), sy.w(), sy.font(),sy.dim()); (start.ritorna_lati_liberi())[free_side]=false; } render_el_spaiati(start,sy.x(), sy.y(), sy.w(),sy.h()); render_el_spaiati(start,sy.x(), sy.y(), sy.w(),sy.h(), true); start.libera_tutti(); } } start.setta_arrivati(_atomi[i].id()); depth_search(_atomi[i]); } } primo++; } }else{ } } void gruppo::visual_allinea_etichetta(etichetta& sy,atomo& start){ float st_xpos=0; float st_ypos=0; get_visual_bb_etic(sy, st_xpos, st_ypos); sy.trasla(static_cast(rintf(st_xpos+start.visual_pos_x())), static_cast(rintf(st_ypos+start.visual_pos_y())) ); } void gruppo::allinea_etichetta(etichetta& sy,atomo& start){ float st_xpos=0; float st_ypos=0; get_bb_etic(sy, st_xpos, st_ypos); sy.phys_translate(st_xpos+start.phys_pos_x(), st_ypos+start.phys_pos_y()); } etichetta scaled_charge_etichetta(atomo& atm,std::string& numc, float& scaled_dim, float f_size){ int car=atm.cariche(); etichetta et_charge; float sc_apic=SCALE_APICI; if(car){ ostringstream ostr; switch(car){ case 1: numc = PLUS; break; case -1: numc = MINUS; break; default: ostr << car; string to_reverse=ostr.str(); if(car<0){ numc=to_reverse.substr(1) + string("-"); }else{ numc=to_reverse + string("+"); } } //calculate position of charge if(numc==MINUS){ sc_apic*=SCALE_SUP_MINUS; } float sc_apic=SCALE_APICI; if(numc==MINUS){ sc_apic*=SCALE_SUP_MINUS; } etichetta tmp_etich=atm.etich(); et_charge.aggiungi(numc,ET_STR); et_charge.font(atm.etich().font()); et_charge.dim(f_size/sc_apic); scaled_dim=f_size/sc_apic; } return et_charge; } int gruppo::render_carica(atomo& atm,float x, float y, float w, int fon, int dim){ int res_free_side=0; int dx_scroll=0; int dy_scroll=0; if(!cairo_t_singleton::can_export()){ dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); } int car=atm.cariche(); if(car){ std::string numc; float scaled_dim=0; etichetta et_charge=scaled_charge_etichetta(atm,numc,scaled_dim,dim); float x_charge=x+w; float y_charge=y; switch(atm.position_charge()){ case L_BOTTOM: { float w_charge=0; etichetta tmp_etich=atm.etich(); w_charge=et_charge.phys_w(); x_charge=x-w_charge; if(cairo_t_singleton::can_export()){ if(numc==MINUS || numc==PLUS){ y_charge+=tmp_etich.phys_h() - et_charge.phys_h(); }else{ y_charge+=tmp_etich.phys_h() - et_charge.phys_h()/2; } }else{ y_charge+=tmp_etich.h(); } res_free_side=2; } break; case R_BOTTOM: { etichetta tmp_etich=atm.etich(); if(cairo_t_singleton::can_export()){ if(numc==MINUS || numc==PLUS){ y_charge+=tmp_etich.phys_h() - et_charge.phys_h(); }else{ y_charge+=tmp_etich.phys_h() - et_charge.phys_h()/2; } }else{ y_charge+=tmp_etich.h(); } res_free_side=0; } break; case L_TOP: { float w_charge=0; w_charge=et_charge.phys_w(); x_charge=x-w_charge; res_free_side=2; } case R_TOP: default: { if(cairo_t_singleton::can_export()){ y_charge-=et_charge.phys_h()/2; }else{ y_charge+=et_charge.phys_h()/2; } res_free_side=0; } } if(cairo_t_singleton::can_export()){ draw_pango_string(numc,x_charge,y_charge, remap_ps_font(fon),scaled_dim, atm.cr(), atm.cg(), atm.cb()); }else{ fl_font(fon,scaled_dim); fl_color(atm.cr(),atm.cg(),atm.cb()); fl_draw(numc.c_str(),static_cast(rintf(x_charge+dx_scroll)), static_cast(rintf(y_charge+dy_scroll))); } } switch(atm.position_charge()){ case L_BOTTOM: res_free_side=2; break; case R_BOTTOM: res_free_side=0; break; case L_TOP: res_free_side=2; break; case R_TOP: default: res_free_side=0; break; } return res_free_side; } void gruppo::render_el_spaiati(atomo& atm,float x, float y, float w, float h, bool dopp){ int w_f_atm; int dx_scroll=0; int dy_scroll=0; if(! cairo_t_singleton::can_export()){ dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); } etichetta sy=atm.etich(); //cout << "iio allineo da el_spaiati" << endl; allinea_etichetta(sy,atm); //cout << "YHHHHHHH" << endl; w_f_atm=sy.w(); float xr; float yr; /* int gruppo::clip_leg(float xrect, float yrect, float w, float h, atomo& da , atomo& fino, float& xrisul, float& yrisul){ */ vector:: iterator legin=atm.iniz_leg(); vector:: iterator legfin=atm.fin_leg(); while(legin!=legfin){ for(unsigned int i=0;i<_atomi.size();i++){ //cerchiamo gli atomi if(_atomi[i].id()==(*legin).id_atomo()){ clip_leg(sy.x(), sy.y(), sy.w(), sy.h(), atm , _atomi[i], xr, yr); if(static_cast(rintf(sy.x()+sy.w()))==static_cast(rintf(xr))){ (atm.ritorna_lati_liberi())[0]=false; }else if(static_cast(rintf(sy.y()+sy.h()))==static_cast(rintf(yr))){ (atm.ritorna_lati_liberi())[1]=false; }else if(static_cast(rintf(sy.x()))==static_cast(rintf(xr))){ (atm.ritorna_lati_liberi())[2]=false; }else if(static_cast(rintf(sy.y()))==static_cast(rintf(yr))){ (atm.ritorna_lati_liberi())[3]=false; } //}else{ /* fl_color(0,0,255); fl_rectf(sy.visual_x()+dx_scroll,sy.visual_y()+dy_scroll,3,3); fl_color(255,0,255); fl_rectf(sy.visual_x()+sy.visual_w()/2+dx_scroll, sy.visual_y()+sy.visual_h()/2+dy_scroll,3,3); fl_color(0,255,0); fl_rectf(sy.x()+dx_scroll,sy.y()+dy_scroll,3,3); fl_color(255,0,0); fl_rectf(atm.visual_pos_x()+dx_scroll,atm.visual_pos_y()+dy_scroll,3,3); */ //return; //cout << "entro clip" << endl; //clip_leg(sy.x(), sy.y(), sy.w(), sy.h(), // atm , _atomi[i], xr, yr); /* if(__pref.getZoom()>1) cout << "RRRRRRRRRRRRRRRRR"<< endl; else cout << "rrrrrrrrrrrrrrrrrrrrr"<< endl; */ // if(static_cast(rintf(sy.visual_x()+sy.visual_w()))==static_cast(rintf(xr))){ // (atm.ritorna_lati_liberi())[0]=false; // }else // if(static_cast(rintf(sy.visual_y()+sy.visual_h()))==static_cast(rintf(yr))){ // (atm.ritorna_lati_liberi())[1]=false; // }else // if(static_cast(rintf(sy.visual_x()))==static_cast(rintf(xr))){ // (atm.ritorna_lati_liberi())[2]=false; // }else // if(static_cast(rintf(sy.visual_y()))==static_cast(rintf(yr))){ // (atm.ritorna_lati_liberi())[3]=false; // } } } legin++; } /* cout << "Lati liberi" << endl; cout << "id: " << atm.id() << endl; for(int i=0;i<4;i++){ cout << (atm.ritorna_lati_liberi())[i] << ","; } cout << endl; */ /////////////////////////////////continuare if(! cairo_t_singleton::can_export()){ fl_color(atm.cr(),atm.cg(),atm.cb()); } int limite=0; if(dopp){ limite=atm.doppietti(); }else{ limite=atm.el_spaiati(); } int xr2=0; int yr2=0; int lati_ancora_liberi=(atm.ritorna_lati_liberi())[0] +(atm.ritorna_lati_liberi())[1] +(atm.ritorna_lati_liberi())[2] +(atm.ritorna_lati_liberi())[3]; //cout << "------------------------------------------------" << endl; while(limite>0 && lati_ancora_liberi>0){ lati_ancora_liberi=(atm.ritorna_lati_liberi())[0] +(atm.ritorna_lati_liberi())[1] +(atm.ritorna_lati_liberi())[2] +(atm.ritorna_lati_liberi())[3]; //cout << "Lati liberi" << endl; //cout << "id: " << atm.id() << endl; // for(int i=0;i<4;i++){ // cout << (atm.ritorna_lati_liberi())[i] << ","; // } // cout << endl; // cout << "LIMITE : " << limite << endl; int libero_e=6; for(int i=0;i<4;i++){ if((atm.ritorna_lati_liberi())[i]==true){ (atm.ritorna_lati_liberi())[i]=false; limite--; libero_e=i; //cout << "esce" << " ed i=" << i << endl; break; } } int radius_scaled=RAGGIO_EL; if(!cairo_t_singleton::can_export()){ radius_scaled= static_cast(rintf(radius_scaled * __pref.getZoom())); } bool electron_limit_excedeed=false; //trovato lato libero disegnamo switch(libero_e){ case 0: xr2=static_cast(rintf(x+w+radius_scaled/2)); yr2=static_cast(rintf(y+h/2-radius_scaled/2)); break; case 1: xr2=static_cast(rintf(x+w_f_atm/2-radius_scaled/2)); yr2=static_cast(rintf(y+h + radius_scaled/2 )); break; case 2: xr2=static_cast(rintf(x-radius_scaled/2)); yr2=static_cast(rintf(y+h/2-radius_scaled/2)); break; case 3: xr2=static_cast(rintf(x+w_f_atm/2-radius_scaled/2)); yr2=static_cast(rintf(y)); break; default: electron_limit_excedeed=true; break; } if(!electron_limit_excedeed){ if(!dopp){ if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(atm.cr()), remap_color_1(atm.cg()), remap_color_1(atm.cb())); cairo_move_to(cn,xr2,yr2); cairo_arc(cn,xr2,yr2,radius_scaled/2,0,2*M_PI); cairo_fill(cn); cairo_restore(cn); /*****************/ }else{ fl_pie(xr2+dx_scroll,yr2+dy_scroll,radius_scaled, radius_scaled, 0, 360); } }else{ int xdp; int ydp; switch(libero_e){ case 0: case 2: //yr2-=RAGGIO_EL; ydp=yr2+radius_scaled; xdp=xr2; break; case 1: case 3: xr-=radius_scaled; ydp=yr2; xdp=xr2+radius_scaled; break; default: xdp=0; ydp=0; break; } if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(atm.cr()), remap_color_1(atm.cg()), remap_color_1(atm.cb())); cairo_move_to(cn,xr2,yr2); cairo_arc(cn,xr2,yr2,radius_scaled/2,0,2*M_PI); cairo_move_to(cn,xdp,ydp); cairo_arc(cn,xdp,ydp,radius_scaled/2,0,2*M_PI); cairo_fill(cn); cairo_restore(cn); /*****************/ }else{ fl_pie(xr2+dx_scroll,yr2+dy_scroll,radius_scaled,radius_scaled, 0, 360); fl_pie(xdp+dx_scroll,ydp+dy_scroll,radius_scaled, radius_scaled, 0, 360); } } } } //cout << "" << endl; if(! cairo_t_singleton::can_export()){ fl_color(atm.cr(),atm.cg(),atm.cb()); } } std::vector gruppo::calculate_electron_pos_relative(atomo& atm){ if(atm.cariche()>0){ switch(atm.position_charge()){ case L_BOTTOM: (atm.ritorna_lati_liberi())[2]=false; break; case R_BOTTOM: (atm.ritorna_lati_liberi())[0]=false; break; case L_TOP: (atm.ritorna_lati_liberi())[2]=false; break; case R_TOP: default: (atm.ritorna_lati_liberi())[0]=false; break; } } etichetta sy=atm.etich(); allinea_etichetta(sy,atm); //int w_f_atm=sy.w(); //int htmp=sy.h(); float xr; float yr; /* int gruppo::clip_leg(float xrect, float yrect, float w, float h, atomo& da , atomo& fino, float& xrisul, float& yrisul){ */ vector:: iterator legin=atm.iniz_leg(); vector:: iterator legfin=atm.fin_leg(); while(legin!=legfin){ atomo* bond=find_atomo_id((*legin).id_atomo()); clip_leg(sy.x(), sy.y(), sy.w(), sy.h(), atm , *bond, xr, yr); if(static_cast(rintf(sy.x()+sy.w()))==static_cast(rintf(xr))){ (atm.ritorna_lati_liberi())[0]=false; }else if(static_cast(rintf(sy.y()+sy.h()))==static_cast(rintf(yr))){ (atm.ritorna_lati_liberi())[1]=false; }else if(static_cast(rintf(sy.x()))==static_cast(rintf(xr))){ (atm.ritorna_lati_liberi())[2]=false; }else if(static_cast(rintf(sy.y()))==static_cast(rintf(yr))){ (atm.ritorna_lati_liberi())[3]=false; } legin++; } // for(int i=0;i<4;i++){ // cout << (atm.ritorna_lati_liberi())[i] << ","; // } // cout << endl; /////////////////////////////////continuare int limite=atm.doppietti() + atm.el_spaiati(); int lati_ancora_liberi=(atm.ritorna_lati_liberi())[0] +(atm.ritorna_lati_liberi())[1] +(atm.ritorna_lati_liberi())[2] +(atm.ritorna_lati_liberi())[3]; std::vector res; //cout << "------------------------------------------------" << endl; while(limite>0 && lati_ancora_liberi>0){ lati_ancora_liberi=(atm.ritorna_lati_liberi())[0] +(atm.ritorna_lati_liberi())[1] +(atm.ritorna_lati_liberi())[2] +(atm.ritorna_lati_liberi())[3]; for(int i=0;i<4;i++){ if((atm.ritorna_lati_liberi())[i]==true){ (atm.ritorna_lati_liberi())[i]=false; res.push_back(i); limite--; break; } } } return res; } void gruppo::render(atomo& da, atomo& fino, legame& il_legame){ int dx_scroll=0; int dy_scroll=0; if(!cairo_t_singleton::can_export()){ dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); } etichetta sy=da.etich(); //float st_xpos=sy.x()+da.pos_x(); //float st_ypos=sy.y()+da.pos_y(); /* sy.trasla(static_cast(rintf(sy.x()+da.pos_x()))-sy.w()/2, static_cast(rintf(sy.y()+da.pos_y()))-sy.h()/2 ); */ //cout << "iioallineo da render inizio" << endl; allinea_etichetta(sy,da); // fl_color(sy.cr(),sy.cg(),sy.cb()); /* fl_rect(static_cast(rintf(sy.x())), static_cast(rintf(sy.y())), static_cast(rintf(sy.w())), static_cast(rintf(sy.h()))); */ if((sy.vec_str())[0].first!=string(NO_ETIC)){ if((sy.vec_str())[0].first!=string(ETIC_IDR_UP)){ sy.disegna(); }else{ if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_move_to(cn,da.pos_x(),da.pos_y()); cairo_set_source_rgb(cn, remap_color_1(sy.cr()), remap_color_1(sy.cg()), remap_color_1(sy.cb())); cairo_arc(cn, da.pos_x(), da.pos_y(), RAGGIO_EL, 0, 2*M_PI); cairo_fill(cn); cairo_restore(cn); }else{ fl_color(sy.cr(),sy.cg(),sy.cb()); float raggio_hidr_zoomed= RAGGIO_IDR_UP *__pref.getZoom(); int approx_r_hidr_zoomed=static_cast(rintf(raggio_hidr_zoomed)); fl_pie(static_cast(rintf(da.pos_x()-raggio_hidr_zoomed/2 +dx_scroll)), static_cast(rintf(da.pos_y()-raggio_hidr_zoomed/2 +dy_scroll)), approx_r_hidr_zoomed,approx_r_hidr_zoomed,0,360); /* fl_pie(static_cast(rintf(da.pos_x()-RAGGIO_IDR_UP/2+dx_scroll)), static_cast(rintf(da.pos_y()-RAGGIO_IDR_UP/2+dy_scroll)), RAGGIO_IDR_UP,RAGGIO_IDR_UP,0,360); */ } } } if(da.cariche()){ render_carica(da,sy.x(), sy.y(), sy.w(), sy.font(),sy.dim()); (da.ritorna_lati_liberi())[0]=false; } render_el_spaiati(da,sy.x(), sy.y(), sy.w(),sy.h()); render_el_spaiati(da,sy.x(), sy.y(), sy.w(),sy.h(),true); da.libera_tutti(); etichetta finsy=fino.etich(); allinea_etichetta(finsy,fino); /* if(plotter || cairo_t_singleton::can_export()){ }else{ fl_color(finsy.cr(),finsy.cg(),finsy.cb()); } */ float xr , yr; if((sy.vec_str())[0].first!=string(NO_ETIC) && (sy.vec_str())[0].first!=string(ETIC_IDR_UP)){ clip_leg(sy.x(), sy.y(), sy.w(), sy.h(), da , fino, xr, yr); }else{ xr=da.pos_x(); yr=da.pos_y(); } float xr2, yr2; if((finsy.vec_str())[0].first!=string(NO_ETIC) && (finsy.vec_str())[0].first!=string(ETIC_IDR_UP)){ clip_leg(finsy.x(), finsy.y(), finsy.w(), finsy.h(), fino , da, xr2, yr2); }else{ xr2=fino.pos_x(); yr2=fino.pos_y(); } switch(il_legame.tipo_legame()){ case LEGAME_TRIPLO: if(cairo_t_singleton::can_export()){ draw_parallel(xr,yr,xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb()); draw_parallel(xr,yr,xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb(),true); }else{ draw_parallel(xr+dx_scroll, yr+dy_scroll, xr2+dx_scroll, yr2+dy_scroll, il_legame.cr(),il_legame.cg(),il_legame.cb()); draw_parallel(xr+dx_scroll, yr+dy_scroll, xr2+dx_scroll, yr2+dy_scroll, il_legame.cr(),il_legame.cg(),il_legame.cb(),true); } case LEGAME_SINGOLO: { if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(il_legame.cr()), remap_color_1(il_legame.cg()), remap_color_1(il_legame.cb())); cairo_move_to(cn,xr,yr); cairo_line_to(cn,xr2,yr2); cairo_stroke(cn); cairo_restore(cn); /*****************/ }else{ fl_color(il_legame.cr(),il_legame.cg(),il_legame.cb()); fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),0); fl_begin_line(); fl_vertex(xr+dx_scroll, yr+dy_scroll); fl_vertex(xr2+dx_scroll, yr2+dy_scroll); fl_end_line(); fl_line_style(0); } break; } case LEGAME_DOPPIO: render_doppio(da, fino,xr,yr, xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb(), false); break; case LEGAME_DOPPIO_1: render_double_forced(da, fino,xr,yr, xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb(), false,true); break; case LEGAME_DOPPIO_2: render_double_forced(da, fino,xr,yr, xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb(), false,false); break; case LEGAME_INTERNO: if(cairo_t_singleton::can_export()){ render_stereo_down(xr, yr, xr2, yr2, il_legame.cr(),il_legame.cg(),il_legame.cb()); }else{ render_stereo_down(xr+dx_scroll, yr+dy_scroll, xr2+dx_scroll, yr2+dy_scroll, il_legame.cr(),il_legame.cg(),il_legame.cb()); } break; case LEGAME_INTERNO_OPP: if(cairo_t_singleton::can_export()){ render_stereo_down(xr2, yr2, xr, yr, il_legame.cr(),il_legame.cg(),il_legame.cb()); }else{ render_stereo_down(xr2+dx_scroll, yr2+dy_scroll, xr+dx_scroll, yr+dy_scroll, il_legame.cr(),il_legame.cg(),il_legame.cb()); } break; case LEGAME_ESTERNO: renderizza_stereo_up(da,fino,xr, yr, xr2, yr2, il_legame.cr(),il_legame.cg(),il_legame.cb()); break; case LEGAME_ESTERNO_OPP: renderizza_stereo_up(fino,da,xr2, yr2, xr, yr, il_legame.cr(),il_legame.cg(),il_legame.cb()); break; case LEGAME_ISPESSITO: if(cairo_t_singleton::can_export()){ renderizza_ispessito(xr,yr,xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb()); }else{ renderizza_ispessito(xr+dx_scroll,yr+dy_scroll, xr2+dx_scroll,yr2+dy_scroll, il_legame.cr(),il_legame.cg(),il_legame.cb()); } break; case LEGAME_TRATTEGGIATO: { if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); const double dash_gap[1]={__pref.get_tratteggio_legame()}; cairo_set_dash(cn,dash_gap,1,0); cairo_set_source_rgb(cn, remap_color_1(il_legame.cr()), remap_color_1(il_legame.cg()), remap_color_1(il_legame.cb())); cairo_move_to(cn,xr,yr); cairo_line_to(cn,xr2,yr2); cairo_stroke(cn); cairo_restore(cn); }else{ char dash[2]={__pref.get_tratteggio_legame(),0}; //preferenze fl_color(il_legame.cr(),il_legame.cg(),il_legame.cb()); fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),dash); fl_begin_line(); fl_vertex(xr+dx_scroll, yr+dy_scroll); fl_vertex(xr2+dx_scroll, yr2+dy_scroll); fl_end_line(); fl_line_style(0); } break; } case LEGAME_DOPPIO_TRATTEGGIATO: render_doppio(da,fino,xr,yr,xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb(), true); break; case LEGAME_DOPPIO_TRATTEGGIATO_1: render_double_forced(da, fino,xr,yr, xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb(), true,true); break; case LEGAME_DOPPIO_TRATTEGGIATO_2: render_double_forced(da, fino,xr,yr, xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb(), true,false); break; case LEGAME_STEREO_SCON: if(cairo_t_singleton::can_export()){ renderizza_stereo_scon(xr,yr,xr2,yr2, il_legame.cr(),il_legame.cg(),il_legame.cb()); }else{ renderizza_stereo_scon(xr+dx_scroll,yr+dy_scroll, xr2+dx_scroll,yr2+dy_scroll, il_legame.cr(),il_legame.cg(),il_legame.cb()); } break; default: break; } } /* #define LEGAME_SINGOLO 0 #define LEGAME_DOPPIO 1 #define LEGAME_TRIPLO 2 #define LEGAME_INTERNO 3 #define LEGAME_INTERNO_OPP -3 #define LEGAME_ESTERNO 4 #define LEGAME_ESTERNO_OPP -4 #define LEGAME_ISPESSITO 5 #define LEGAME_TRATTEGGIATO 6 #define LEGAME_DOPPIO_TRATTEGGIATO 7 #define LEGAME_STEREO_SCON 8 */ int gruppo::clip_leg(float xrect, float yrect, float w, float h, atomo& da , atomo& fino, float& xrisul, float& yrisul){ float x1,y1,x2,y2,y4; x1=xrect; y1=yrect; x2=xrect+w; y2=yrect; y4=yrect+h; /* x1,y1 x2,y2 ............. . . ............. x4,y4 x3,y3 */ unsigned char outcode=0x00 ; float a1_x=da.pos_x(); float a1_y=da.pos_y(); float a2_x=fino.pos_x(); float a2_y=fino.pos_y(); if(a2_xxrect+w){ outcode|=0x02; } if(a2_yyrect+h){ outcode|=0x04; } //cout << "--------------" << endl; //cout << hex << "0X" << (unsigned int)outcode << endl; switch(outcode){ case 0x01: yrisul=b_clip_v(a1_x, a1_y, a2_x, a2_y, x1); xrisul=x1; break; case 0x02: yrisul=b_clip_v(a1_x,a1_y, a2_x,a2_y, x2); xrisul=x2; break; case 0x08: xrisul=b_clip_h(a1_x,a1_y, a2_x,a2_y, y1); yrisul=y1; break; case 0x09: xrisul=b_clip_h(a1_x,a1_y, a2_x,a2_y, y1); yrisul=b_clip_v(a1_x,a1_y, a2_x,a2_y, x1); if(xrisulx2){ xrisul=x2; }else{ yrisul=y4; } break; case 0x0a: xrisul=b_clip_h(a2_x,a2_y, a1_x,a1_y, y2); yrisul=b_clip_v(a1_x,a1_y, a2_x,a2_y, x2); if(xrisul>x2){ xrisul=x2; }else{ yrisul=y2; } break; case 0x04: xrisul=b_clip_h(a1_x,a1_y, a2_x,a2_y, y4); yrisul=y4; break; } return 0; } void gruppo::render_stereo_down(float x1, float y1, float x2, float y2, int cr, int cg, int cb){ float m; float q; bool ris=rett_eqn(x1, y1, x2, y2, m, q); //float lung=sqrt( pow(x2-x1,2) + pow(y2-y1,2) ); float larg_cuneo=__pref.get_larg_max_cuneo(); //preferenze int numcunei=__pref.get_num_barrette_stereo_down(); //preferenze float decr=larg_cuneo/numcunei; float dx=(x2-x1)/numcunei; float dy=(y2-y1)/numcunei; float xef; float yef; float leff=0; if(cairo_t_singleton::can_export()){ leff=larg_cuneo; }else{ leff=larg_cuneo*__pref.getZoom(); decr*=__pref.getZoom(); } if(ris){ xef=x1+dx; yef=m*xef+q; }else{ xef=x1; yef=y1+dy; } while(numcunei>0){ float vert2x; float vert2y; float vert3x; float vert3y; is_perpendicular(x1, y1, x2, y2, true,leff, vert2x, vert2y); is_perpendicular(x1, y1, x2, y2, false,leff, vert3x, vert3y); if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn, xef+vert2x, yef+vert2y); cairo_line_to(cn,xef+vert3x,yef+vert3y); cairo_stroke(cn); cairo_restore(cn); /*****************/ }else{ fl_color(cr,cg,cb); fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),0); fl_begin_line(); fl_vertex(xef+vert2x, yef+vert2y); fl_vertex(xef+vert3x, yef+vert3y); fl_end_line(); fl_line_style(0); } if(ris){ xef+=dx; yef=m*xef+q; }else{ yef+=dy; } leff-=decr; numcunei--; } } ////////// void gruppo::render_double_forced(atomo& da, atomo& fino, float x1, float y1, float x2, float y2, int cr, int cg, int cb, bool tratt,bool side){ int dx_scroll=0; int dy_scroll=0; if(! cairo_t_singleton::can_export()){ dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); fl_color(cr,cg,cb); } if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,x1,y1); cairo_line_to(cn,x2,y2); cairo_stroke(cn); cairo_restore(cn); draw_parallel(x1, y1,x2, y2, cr,cg,cb, side, __pref.get_multiple_bond_gap(),tratt); }else{ fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),0); fl_begin_line(); fl_vertex(x1+dx_scroll, y1+dy_scroll); fl_vertex(x2+dx_scroll, y2+dy_scroll); fl_end_line(); fl_line_style(0); draw_parallel(x1+dx_scroll, y1+dy_scroll, x2+dx_scroll, y2+dy_scroll, cr,cg,cb, side, __pref.get_multiple_bond_gap(),tratt); } } //////////// void gruppo::render_doppio(atomo& da, atomo& fino, float x1, float y1, float x2, float y2, int cr, int cg, int cb, bool tratt){ int dx_scroll=0; int dy_scroll=0; if(! cairo_t_singleton::can_export()){ dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); fl_color(cr,cg,cb); } /* cout << "iio render doppio " <(rintf(__pref.getZoom())),0); fl_begin_line(); fl_vertex(xp+dx_scroll, yp+dy_scroll); fl_vertex(xp2+dx_scroll, yp2+dy_scroll); fl_end_line(); fl_line_style(0); if(return_half_plane(xp, yp, x1, y1, x2, y2 )){ //cout << "iiotrue" << endl; draw_parallel(xp+dx_scroll, yp+dy_scroll, xp2+dx_scroll, yp2+dy_scroll, cr,cg,cb, false, __pref.get_multiple_bond_gap(),tratt,true); //preferenze }else{ //cout << "iiofalse" << endl; draw_parallel(xp+dx_scroll, yp+dy_scroll, xp2+dx_scroll, yp2+dy_scroll, cr,cg,cb, true, __pref.get_multiple_bond_gap(),tratt,true); //preferenze } } }else{ if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,x1,y1); cairo_line_to(cn,x2,y2); cairo_stroke(cn); cairo_restore(cn); /*****************/ }else{ fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),0); fl_begin_line(); fl_vertex(x1+dx_scroll, y1+dy_scroll); fl_vertex(x2+dx_scroll, y2+dy_scroll); fl_end_line(); fl_line_style(0); } vector estremi; estremi.push_back(da); estremi.push_back(fino); vector::iterator estr_iniz=estremi.begin(); /* cout << "ESTREMI!!" << estremi.size()<< endl; while(estr_iniz!=estr_fin){ cout << (*estr_iniz).pos_x() << "\t" << (*estr_iniz).pos_y() << endl; estr_iniz++; } */ vector< vector > legati; /* bool ritorna_semipiano_app(float x, float y, float xrt, float yrt, float xrt2, float yrt2 ) */ /*ordine: da_sopra, da_sotto, fino_sopra , fino_sotto*/ for(int i=0; i<2;i++){ //estr_iniz=estremi.begin(); vector::iterator leginiz=(*estr_iniz).primo_leg(); vector::iterator legfin=(*estr_iniz).ultimo_leg(); vector sopra; vector sotto; while(leginiz!=legfin){ for(unsigned int cta=0;cta<_atomi.size();cta++){ if(_atomi[cta].id()==(*leginiz).id_atomo() && _atomi[cta].id()!=estremi[0].id() && _atomi[cta].id()!=estremi[1].id() ){ /* cout << "calcolo:\n" << _atomi[cta].pos_x() << "\t" << _atomi[cta].pos_y() << endl << (*estr_iniz).pos_x() << "\t" << (*estr_iniz).pos_y() << endl << (*(estr_iniz+1)).pos_x() <<"\t" << (*(estr_iniz+1)).pos_y() << endl; */ /* cout << "trovato:\n" << _atomi[cta].id() << "(" <<_atomi[cta].pos_x() << "," << _atomi[cta].pos_y() << ")" << "da\n" << (*estr_iniz).id() << "(" <<(*estr_iniz).pos_x() << "," << (*estr_iniz).pos_y() << ")" <pos_x(), ult->pos_y(), da.pos_x(), da.pos_y(), fino.pos_x(), fino.pos_y() ); // cout << semipiano << endl; //cout << "ciclo" << endl; if(cairo_t_singleton::can_export()){ draw_parallel(x1, y1,x2, y2, cr,cg,cb, semipiano, __pref.get_multiple_bond_gap(),tratt); //preferenze }else{ draw_parallel(x1+dx_scroll, y1+dy_scroll, x2+dx_scroll, y2+dy_scroll, cr,cg,cb, semipiano, __pref.get_multiple_bond_gap(),tratt); //preferenze } }else{ //se siamo arrivati qui non c'e' alcun ciclo /*ordine: da_sopra, da_sotto, fino_sopra , fino_sotto*/ if(legati[0].size()+legati[2].size()>legati[1].size()+legati[3].size()){ if(cairo_t_singleton::can_export()){ draw_parallel(x1, y1,x2, y2, cr,cg,cb, true, __pref.get_multiple_bond_gap(),tratt); //preferenze }else{ draw_parallel(x1+dx_scroll, y1+dy_scroll, x2+dx_scroll, y2+dy_scroll, cr,cg,cb, true, __pref.get_multiple_bond_gap(),tratt); //preferenze } /* disegna_parallela(x1+dx_scroll, y1+dy_scroll, x2+dx_scroll, y2+dy_scroll,true, __pref.get_multiple_bond_gap(),tratt); //preferenze */ }else{ if(cairo_t_singleton::can_export()){ draw_parallel(x1, y1,x2, y2, cr,cg,cb, false, __pref.get_multiple_bond_gap(),tratt); //preferenze }else{ draw_parallel(x1+dx_scroll, y1+dy_scroll, x2+dx_scroll, y2+dy_scroll, cr,cg,cb, false, __pref.get_multiple_bond_gap(),tratt); //preferenze } /* disegna_parallela(x1+dx_scroll, y1+dy_scroll, x2+dx_scroll, y2+dy_scroll,false, __pref.get_multiple_bond_gap(),tratt); //preferenze */ } /* disegna_parallela(x1+dx_scroll, y1+dy_scroll, x2+dx_scroll, y2+dy_scroll,true, __pref.get_multiple_bond_gap(),tratt); */ } } } bool gruppo::trova_ciclo(atomo& da , atomo& fino, atomo ** ultimo){ //cout << da.id() << " " << fino.id() << endl; // stack pila; // vector visti; // vector da_visti; // int visitato=da.ultimo_leg()-da.primo_leg(); // bool grigio=true; // pila.push(&da); // while(pila.size()>0){ // //cout << "size " << pila.size() << endl; // atomo* cima=pila.top(); // pila.pop(); // //cout << "estratto " << cima->id()<id()==da.id()){ // visitato--; // } // if(visitato<=0){ // return false; // } // bool e_visto=false; // /* // cout << "vvvvvvvvvvvvvvvvvvv"<< endl; // for(int i=0;iid()){ // e_visto=true; // break; // } // } // //cout << cima->id() << " " << e_visto << endl; // vector::iterator primo=cima->primo_leg(); // vector::iterator ultimo=cima->ultimo_leg(); // atomo* da_visit; // while(primo!=ultimo){ // for(int i=0;i<_atomi.size();i++){ // if(_atomi[i].id()==(*primo).id_atomo()){ // da_visit=&_atomi[i]; // } // } // primo++; // } // if(!e_visto){ // pila.push(da_visit); // }else{ // if(da_visit->id()==da.id()){ // visitato--; // } // } // visti.push_back(cima->id()); // } // //cout << "VV" << visitato << endl; // if(visitato<0){ // return true; // }else{ // return false; // } // return false; vector visti(_atomi.size(),0); vector grigi(_atomi.size(),0); vector genit(_atomi.size(),0); bool risult=false; bool primo_e_adiacente=false; // cout << "\nrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr" <& grigi, vector& visitati, vector & genitore, bool& risult, atomo** ultimo,bool& primo_e_adiacente){ if(visitati[get_position_inarr(fino->id())]==1){ //cout << "qwerty: fino is black" << std::endl; risult=false; return; } //cout << "RIsult " << risult << endl; if(risult){ return; } // cout << "parto da: " << st->id() << endl;; grigi[get_position_inarr(st->id())]=1; vector::iterator inleg=st->iniz_leg(); vector::iterator finleg=st->fin_leg(); while(inleg!=finleg){ if(risult){ return; } atomo* nuovost=0; if(st->id()==da->id() && !primo_e_adiacente){ primo_e_adiacente=true; nuovost=fino; }else{ for(unsigned int atct=0;atct<_atomi.size();atct++){ if(_atomi[atct].id()==(*inleg).id_atomo()){//trovato nuovo atomo if(_atomi[atct].id()!=fino->id() || primo_e_adiacente){ nuovost=&_atomi[atct]; break; } } } } //cout << "trovato atomo "<< nuovost->id(); int colgr=grigi[get_position_inarr(nuovost->id())]; int colbl=visitati[get_position_inarr(nuovost->id())]; if(colgr==0 && colbl==0){ //bianco mai visitato //cout << " mai visitato "; genitore[get_position_inarr(st->id())]=nuovost->id(); /* cout << "impostato genitore[" << get_position_inarr(st->id()) << "]=" << nuovost->id() << " di " << st->id() << endl; cout << "\ngenitori : "; for(unsigned int i=0;iid())]!=st->id()){ //cout << "ciclo" << endl; //cout << "figlio di (" << get_position_inarr(nuovost->id()) // << "): " << genitore[get_position_inarr(nuovost->id())] << " " << st->id() << endl; //for(unsigned int i=0;iid()==da->id()){ (*ultimo)=st; //cout << "ultimo del ciclo " << (*ultimo)->id() << endl; risult=true; return; }else{ //cout << "ma e' un altro ciclo quindi continuo l'esplorazione" << endl; } } //cout << "figlio di (" << get_position_inarr(nuovost->id()) // << "): " << genitore[get_position_inarr(nuovost->id())] << " " << st->id() << endl; //cout << "genitori : "; //for(unsigned int i=0;iid())]=1; } atomo* gruppo::find_atomo_id(int id){ atomo* risul=0; for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==id){ risul=&_atomi[i]; } } return risul; } procedura* gruppo::find_proc_id(int id){ procedura* risul=0; for(unsigned int i=0;i<_procedure.size();i++){ if(_procedure[i]->id()==id){ risul=_procedure[i]; } } return risul; } int gruppo::get_position_inarr(int id){ for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==id){ return i; } } cout << "ma qui!!!!" << endl; return -1; } void gruppo::generic_depth_search(atomo* da, void* data, void* data2 ,void* data3, int (*pf)(atomo* da , atomo* fino, void* data, void* data2, void* data3) ){ //cout << da.id() << " " << fino.id() << endl; int (*applica)(atomo* da , atomo* fino, void* data, void* data2, void* data3)=pf; stack pila; vector visti; pila.push(da); while(pila.size()>0){ //cout << "size " << pila.size() << endl; atomo* cima=pila.top(); pila.pop(); //cout << "estratto " << cima->id()<id()){ e_visto=true; break; } } //cout << "trasl cima " << cima->id() << " " << e_visto<< endl; //cout << "gruppo: " << id() << endl; if(!e_visto){ vector::iterator primo=cima->primo_leg(); vector::iterator ultimo=cima->ultimo_leg(); //cout << ultimo -primo << " "<< endl; while(primo!=ultimo){ //cout << cima->id() << " " << (*primo).id_atomo() << endl; for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==(*primo).id_atomo()){ applica(cima,&_atomi[i],data,data2,data3); pila.push(&_atomi[i]); } } primo++; } //cout << "--------------" << endl; } visti.push_back(cima->id()); } } void gruppo::generic_depth_search(atomo* da, void* data, void* data2 ,void* data3,void* data4, int (*map_atom)(atomo* da , atomo* fino, void* data, void* data2, void* data3), bool(*ignore)(atomo* atm, void* data4) ) { //cout << da.id() << " " << fino.id() << endl; int (*applica)(atomo* da , atomo* fino, void* data, void* data2, void* data3)=map_atom; stack pila; vector visti; pila.push(da); while(pila.size()>0){ //cout << "size " << pila.size() << endl; atomo* cima=pila.top(); pila.pop(); //cout << "estratto " << cima->id()<id()){ e_visto=true; break; } } //cout << "trasl cima " << cima->id() << " " << e_visto<< endl; //cout << "gruppo: " << id() << endl; if(!e_visto && !ignore(cima,data4) ){ vector::iterator primo=cima->primo_leg(); vector::iterator ultimo=cima->ultimo_leg(); //cout << ultimo -primo << " "<< endl; while(primo!=ultimo){ //cout << cima->id() << " " << (*primo).id_atomo() << endl; for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==(*primo).id_atomo()){ applica(cima,&_atomi[i],data,data2,data3); pila.push(&_atomi[i]); } } primo++; } //cout << "--------------" << endl; } visti.push_back(cima->id()); } } void gruppo::generic_depth_search_appl_popped(atomo* da, void* data, void* data2 , void* data3, void* data4, int (*pf)(atomo* da ,void* data, void* data2, void* data3) , bool(*ignore)(atomo* atm, void* data4)){ int (*applica)(atomo* da, void* data, void* data2, void* data3)=pf; stack pila; vector visti; pila.push(da); while(pila.size()>0){ atomo* cima=pila.top(); pila.pop(); bool e_visto=false; for(unsigned int i=0;iid()){ e_visto=true; break; } } //cout << "trasl cima " << cima->id() << " " << e_visto<< endl; //cout << "gruppo: " << id() << endl; if(!e_visto && !ignore(cima,data4)){ applica(cima,data,data2,data3); vector::iterator primo=cima->primo_leg(); vector::iterator ultimo=cima->ultimo_leg(); while(primo!=ultimo){ for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==(*primo).id_atomo()){ pila.push(&_atomi[i]); } } primo++; } } visti.push_back(cima->id()); } } void gruppo::generic_depth_search_appl_popped(atomo* da, void* data, void* data2 ,void* data3, int (*pf)(atomo* da ,void* data, void* data2, void* data3) ){ int (*applica)(atomo* da, void* data, void* data2, void* data3)=pf; stack pila; vector visti; pila.push(da); while(pila.size()>0){ atomo* cima=pila.top(); pila.pop(); bool e_visto=false; for(unsigned int i=0;iid()){ e_visto=true; break; } } //cout << "trasl cima " << cima->id() << " " << e_visto<< endl; //cout << "gruppo: " << id() << endl; if(!e_visto){ applica(cima,data,data2,data3); vector::iterator primo=cima->primo_leg(); vector::iterator ultimo=cima->ultimo_leg(); while(primo!=ultimo){ for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==(*primo).id_atomo()){ pila.push(&_atomi[i]); } } primo++; } } visti.push_back(cima->id()); } } void gruppo::no_componenti_connesse(int& no){ no=0; vector visti; for(unsigned int ctgr=0;ctgr<_atomi.size();ctgr++){ bool trov=false; for(unsigned int trvct=0;trvct pila; pila.push(da); while(pila.size()>0){ //cout << "size " << pila.size() << endl; atomo* cima=pila.top(); pila.pop(); //cout << "estratto " << cima->id()<id()){ e_visto=true; break; } } // cout << cima->id() << " " << e_visto<< endl; //cout << "gruppo: " << id() << endl; if(!e_visto){ vector::iterator primo=cima->primo_leg(); vector::iterator ultimo=cima->ultimo_leg(); //cout << ultimo -primo << " "<< endl; while(primo!=ultimo){ //cout << cima->id() << " " << (*primo).id_atomo() << endl; for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==(*primo).id_atomo()){ pila.push(&_atomi[i]); } } primo++; } //cout << "--------------" << endl; } visti.push_back(cima->id()); } } } } void gruppo::renderizza_stereo_scon(float x1,float y1, float x2,float y2, int cr, int cg, int cb){ float compx=x2-x1; float compy=y2-y1; float alfa=atan2(compx,compy)-M_PI/2.0; float lung=sqrt( pow(compx,2) + pow(compy,2) ); float laics=0; float laips=0; float ampiezza=__pref.get_ampiezza_stereo_scon(); //preferenze float frequenza=__pref.get_frequenza_stereo_scon();//preferenze if(!cairo_t_singleton::can_export()){ ampiezza*=__pref.getZoom(); frequenza/=__pref.getZoom(); } while(laics(rintf(xp+x1)), static_cast(rintf(yp+y1))); }else{ fl_line_style(FL_SOLID,static_cast(rintf(__pref.getZoom())),0); float radius=(__pref.getZoom()/2.0)+0.1; fl_color(cr,cg,cb); fl_begin_complex_polygon(); fl_circle(xp+x1,yp+y1,radius); fl_end_complex_polygon(); fl_line_style(0); } } laics+=0.1; } } void gruppo::renderizza_ispessito(float x1, float y1, float x2, float y2, int cr, int cg, int cb){ float vert2x; float vert2y; float vert3x; float vert3y; float larg_cuneo=__pref.get_larg_max_cuneo(); //preferenze if(!cairo_t_singleton::can_export()){ larg_cuneo*=__pref.getZoom(); } is_perpendicular(x1, y1, x2, y2, true,larg_cuneo, vert2x, vert2y); is_perpendicular(x1, y1, x2, y2, false,larg_cuneo, vert3x, vert3y); if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,vert2x+x1, vert2y+y1); cairo_line_to(cn,vert2x+x1, vert2y+y1); cairo_line_to(cn,vert3x+x1, vert3y+y1); cairo_line_to(cn,vert3x+x2, vert3y+y2); cairo_line_to(cn,vert2x+x2, vert2y+y2); cairo_line_to(cn,vert2x+x1, vert2y+y1); cairo_fill(cn); cairo_restore(cn); /*****************/ }else{ fl_color(cr,cg,cb); fl_begin_polygon(); fl_vertex(vert2x+x1,vert2y+y1); fl_vertex(vert3x+x1,vert3y+y1); fl_vertex(vert3x+x2,vert3y+y2); fl_vertex(vert2x+x2,vert2y+y2); fl_end_polygon(); } } void gruppo::renderizza_stereo_up(atomo &da, atomo& fino, float strettox, float strettoy, float largox, float largoy, int cr, int cg, int cb){ //cout << "iii:fino.id() " << fino.id() << endl; int dx_scroll=0; int dy_scroll=0; if(!cairo_t_singleton::can_export()){ dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); } float vert2x; float vert2y; float vert3x; float vert3y; float larg_cuneo=__pref.get_larg_max_cuneo(); //preferenze if(!cairo_t_singleton::can_export()){ larg_cuneo*=__pref.getZoom(); } is_perpendicular(strettox, strettoy, largox, largoy, true,larg_cuneo, vert2x, vert2y); is_perpendicular(strettox, strettoy, largox, largoy, false,larg_cuneo, vert3x, vert3y); vert2x+=largox; vert2y+=largoy; vert3x+=largox; vert3y+=largoy; etichetta sy=fino.etich(); vector < pair > stringhe=sy.vec_str(); bool noetic=true; if(stringhe.size()>0){ if(stringhe[0].first!=string(NO_ETIC)){ noetic=false; } } if(fino.ultimo_leg()-fino.primo_leg()==1 || !noetic){ if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,strettox, strettoy); cairo_line_to(cn,strettox, strettoy); cairo_line_to(cn,vert2x, vert2y); cairo_line_to(cn,vert3x, vert3y); cairo_line_to(cn,strettox, strettoy); cairo_fill(cn); cairo_restore(cn); /*****************/ }else{ fl_color(cr,cg,cb); fl_begin_polygon(); fl_vertex(strettox+dx_scroll,strettoy+dy_scroll); fl_vertex(vert2x+dx_scroll,vert2y+dy_scroll); fl_vertex(vert3x+dx_scroll,vert3y+dy_scroll); fl_end_polygon(); } }else if(fino.ultimo_leg()-fino.primo_leg()==2){ /* /- mcun /-- /----+ /- mleg /----------- | /-- ---\-- +- -------\ | -------\ | ---+ mcun2 */ float xleg=-1; float yleg=-1; vector::iterator legatoin=fino.primo_leg(); vector::iterator legatofin=fino.ultimo_leg(); int id_leg=-1; int tipo_leg=-1; while(legatoin!=legatofin){ if((*legatoin).id_atomo()!=da.id()){ id_leg=(*legatoin).id_atomo(); tipo_leg=(*legatoin).tipo_legame(); } legatoin++; } for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==id_leg){ xleg=_atomi[i].pos_x(); yleg=_atomi[i].pos_y(); } } if(tipo_leg==LEGAME_ISPESSITO){ float x_clip_lato1; float y_clip_lato1; float x_clip_lato2; float y_clip_lato2; float xy_lato1_a[2];//intersezione primo lato cuneo primo lato rettangolo float xy_lato1_b[2];//intersezione primo lato cuneo secondo lato rettangolo /* float xy_lato2_a[2];//intersezione secondo lato cuneo primo lato rettangolo float xy_lato2_b[2];//intersezione secondo lato cuneo secondo lato rettangolo */ float vertax; float vertay; float vertbx; float vertby; float larg_cuneo=__pref.get_larg_max_cuneo(); //preferenze if(!cairo_t_singleton::can_export()){ larg_cuneo*=__pref.getZoom(); } is_perpendicular(fino.pos_x(), fino.pos_y(), xleg, yleg, true,larg_cuneo, vertax, vertay); is_perpendicular(fino.pos_x(), fino.pos_y(), xleg, yleg, false,larg_cuneo, vertbx, vertby); clip_lato_cuneo(xy_lato1_a,vertax+fino.pos_x(),vertay+fino.pos_y(), xleg+vertax,yleg+vertay,strettox, strettoy, vert2x, vert2y); clip_lato_cuneo(xy_lato1_b,vertbx+fino.pos_x(),vertby+fino.pos_y(), xleg+vertbx,yleg+vertby,strettox, strettoy, vert2x, vert2y); float lung_lato1_a=sqrt(pow(static_cast(xy_lato1_a[0]-strettox),2.0)+ pow(static_cast(xy_lato1_a[1]-strettoy),2.0)); float lung_lato1_b=sqrt(pow(static_cast(xy_lato1_b[0]-strettox),2.0)+ pow(static_cast(xy_lato1_b[1]-strettoy),2.0)); if(lung_lato1_a<=lung_lato1_b){ x_clip_lato1=xy_lato1_b[0]; y_clip_lato1=xy_lato1_b[1]; }else{ x_clip_lato1=xy_lato1_a[0]; y_clip_lato1=xy_lato1_a[1]; } //otro clip_lato_cuneo(xy_lato1_a,vertax+fino.pos_x(),vertay+fino.pos_y(), xleg+vertax,yleg+vertay,strettox, strettoy, vert3x, vert3y); clip_lato_cuneo(xy_lato1_b,vertbx+fino.pos_x(),vertby+fino.pos_y(), xleg+vertbx,yleg+vertby,strettox, strettoy, vert3x, vert3y); lung_lato1_a=sqrt(pow(xy_lato1_a[0]-strettox,2)+pow(xy_lato1_a[1]-strettoy,2)); lung_lato1_b=sqrt(pow(xy_lato1_b[0]-strettox,2)+pow(xy_lato1_b[1]-strettoy,2)); if(lung_lato1_a<=lung_lato1_b){ x_clip_lato2=xy_lato1_b[0]; y_clip_lato2=xy_lato1_b[1]; }else{ x_clip_lato2=xy_lato1_a[0]; y_clip_lato2=xy_lato1_a[1]; } if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,strettox, strettoy); cairo_line_to(cn,strettox, strettoy); cairo_line_to(cn,x_clip_lato1, y_clip_lato1); cairo_line_to(cn,x_clip_lato2, y_clip_lato2); cairo_line_to(cn,strettox, strettoy); cairo_fill(cn); cairo_restore(cn); /*****************/ }else{ fl_color(cr,cg,cb); fl_begin_polygon(); fl_vertex(strettox+dx_scroll,strettoy+dy_scroll); fl_vertex(x_clip_lato1+dx_scroll,y_clip_lato1+dy_scroll); fl_vertex(x_clip_lato2+dx_scroll,y_clip_lato2+dy_scroll); fl_end_polygon(); } }else{ float xy_lato1[2]; float xy_lato2[2]; clip_lato_cuneo(xy_lato1,fino.pos_x(),fino.pos_y(), xleg,yleg,strettox, strettoy, vert2x, vert2y); clip_lato_cuneo(xy_lato2,fino.pos_x(),fino.pos_y(), xleg,yleg,strettox, strettoy, vert3x, vert3y); if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,strettox, strettoy); cairo_line_to(cn,strettox, strettoy); cairo_line_to(cn,xy_lato1[0], xy_lato1[1]); cairo_line_to(cn,xy_lato2[0], xy_lato2[1]); cairo_line_to(cn,strettox, strettoy); cairo_fill(cn); cairo_restore(cn); /*****************/ }else{ //cout << "YYYYYYYYYYYYYYYYYYYYYY" << endl; //float z=__pref.getZoom(); fl_color(cr,cg,cb); fl_begin_polygon(); fl_vertex(strettox+dx_scroll,strettoy+dy_scroll); fl_vertex(xy_lato1[0]+dx_scroll,xy_lato1[1]+dy_scroll); fl_vertex(xy_lato2[0]+dx_scroll,xy_lato2[1]+dy_scroll); fl_end_polygon(); } } }else{//clip attorno ai legami piu' prossimi vector::iterator legatoin=fino.primo_leg(); vector::iterator legatofin=fino.ultimo_leg(); bool has_bold=false; int id_leg=-1; while(legatoin!=legatofin){ if((*legatoin).tipo_legame()==LEGAME_ISPESSITO){ id_leg=(*legatoin).id_atomo(); has_bold=true; break; } legatoin++; } if(has_bold){ float xleg=-1; float yleg=-1; for(unsigned int i=0;i<_atomi.size();i++){ if(_atomi[i].id()==id_leg){ xleg=_atomi[i].pos_x(); yleg=_atomi[i].pos_y(); } } float x_clip_lato1; float y_clip_lato1; float x_clip_lato2; float y_clip_lato2; float xy_lato1_a[2];//intersezione primo lato cuneo primo lato rettangolo float xy_lato1_b[2];//intersezione primo lato cuneo secondo lato rettangolo /* float xy_lato2_a[2];//intersezione secondo lato cuneo primo lato rettangolo float xy_lato2_b[2];//intersezione secondo lato cuneo secondo lato rettangolo */ float vertax; float vertay; float vertbx; float vertby; float larg_cuneo=__pref.get_larg_max_cuneo(); //preferenze is_perpendicular(fino.pos_x(), fino.pos_y(), xleg, yleg, true,larg_cuneo, vertax, vertay); is_perpendicular(fino.pos_x(), fino.pos_y(), xleg, yleg, false,larg_cuneo, vertbx, vertby); clip_lato_cuneo(xy_lato1_a,vertax+fino.pos_x(),vertay+fino.pos_y(), xleg+vertax,yleg+vertay,strettox, strettoy, vert2x, vert2y); clip_lato_cuneo(xy_lato1_b,vertbx+fino.pos_x(),vertby+fino.pos_y(), xleg+vertbx,yleg+vertby,strettox, strettoy, vert2x, vert2y); float lung_lato1_a=sqrt(pow(static_cast(xy_lato1_a[0]-strettox),2.0)+ pow(static_cast(xy_lato1_a[1]-strettoy),2.0)); float lung_lato1_b=sqrt(pow(static_cast(xy_lato1_b[0]-strettox),2.0)+ pow(static_cast(xy_lato1_b[1]-strettoy),2.0)); if(lung_lato1_a<=lung_lato1_b){ x_clip_lato1=xy_lato1_b[0]; y_clip_lato1=xy_lato1_b[1]; }else{ x_clip_lato1=xy_lato1_a[0]; y_clip_lato1=xy_lato1_a[1]; } //otro clip_lato_cuneo(xy_lato1_a,vertax+fino.pos_x(),vertay+fino.pos_y(), xleg+vertax,yleg+vertay,strettox, strettoy, vert3x, vert3y); clip_lato_cuneo(xy_lato1_b,vertbx+fino.pos_x(),vertby+fino.pos_y(), xleg+vertbx,yleg+vertby,strettox, strettoy, vert3x, vert3y); lung_lato1_a=sqrt(pow(xy_lato1_a[0]-strettox,2)+pow(xy_lato1_a[1]-strettoy,2)); lung_lato1_b=sqrt(pow(xy_lato1_b[0]-strettox,2)+pow(xy_lato1_b[1]-strettoy,2)); if(lung_lato1_a<=lung_lato1_b){ x_clip_lato2=xy_lato1_b[0]; y_clip_lato2=xy_lato1_b[1]; }else{ x_clip_lato2=xy_lato1_a[0]; y_clip_lato2=xy_lato1_a[1]; } if(cairo_t_singleton::can_export()){ /****testing cairo*********/ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr), remap_color_1(cg), remap_color_1(cb)); cairo_move_to(cn,strettox, strettoy); cairo_line_to(cn,strettox, strettoy); cairo_line_to(cn,x_clip_lato1, y_clip_lato1); cairo_line_to(cn,x_clip_lato2, y_clip_lato2); cairo_line_to(cn,strettox, strettoy); cairo_fill(cn); cairo_restore(cn); /*****************/ }else{ fl_color(cr,cg,cb); fl_begin_polygon(); fl_vertex(strettox+dx_scroll,strettoy+dy_scroll); fl_vertex(x_clip_lato1+dx_scroll,y_clip_lato1+dy_scroll); fl_vertex(x_clip_lato2+dx_scroll,y_clip_lato2+dy_scroll); fl_end_polygon(); } }else{ vector xy_clip_a; vector xy_clip_b; vector xleg; vector yleg; vector::iterator legatoin=fino.primo_leg(); vector::iterator legatofin=fino.ultimo_leg(); while(legatoin!=legatofin){ if((*legatoin).id_atomo()!=da.id()){ atomo* found=find_atomo_id((*legatoin).id_atomo()); if(found != NULL){ if(fino.ultimo_leg()-fino.primo_leg()<=3){ xleg.push_back(found->pos_x()); yleg.push_back(found->pos_y()); }else{ float m1=1; float q1=1; rett_eqn(da.pos_x() , da.pos_y(), fino.pos_x(), fino.pos_y(), m1, q1); float m2=1; float q2=1; rett_eqn(fino.pos_x(), fino.pos_y(), found->pos_x(), found->pos_y(), m2, q2); if(!similar_to(m1,m2,DEFAULT_SIMILAR_THRESHOLD)){ xleg.push_back(found->pos_x()); yleg.push_back(found->pos_y()); } } } } legatoin++; } for(unsigned int i=0;i(coordclip_a[0])==static_cast(vert2x) && static_cast(coordclip_a[1])==static_cast(vert2y)){ coordclip_a[0]=vert2x; coordclip_a[1]=vert2y; xy_clip_a.push_back(coordclip_a); } clip_lato_cuneo(coordclip_b, fino.pos_x(),fino.pos_y(), xleg[i],yleg[i], strettox, strettoy, vert3x, vert3y); lung_seg_clip=sqrt(pow(coordclip_b[0]-xleg[i],2)+pow(coordclip_b[1]-yleg[i],2)); if(lung_seg_clip(coordclip_b[0])==static_cast(vert3x) && static_cast(coordclip_b[1])==static_cast(vert3y)){ coordclip_b[0]=vert3x; coordclip_b[1]=vert3y; xy_clip_b.push_back(coordclip_b); } } unsigned int posclip_a=0; if(xy_clip_a.size()>0){ //cout << "iiia" << xy_clip_a.size() << endl; float min_a=10000000; for(unsigned int c1=0;c1lung){ min_a=lung; posclip_a=c1; } } }else{ float* coordclip=new float[2]; coordclip[0]=vert2x; coordclip[1]=vert2y; xy_clip_a.push_back(coordclip); posclip_a=0; } unsigned int posclip_b=0; if(xy_clip_b.size()>0){ //cout << "iiib" << xy_clip_b.size() << endl; float min_b=10000000; for(unsigned int c2=0;c2lung){ min_b=lung; posclip_b=c2; } } }else{ float* coordclip=new float[2]; coordclip[0]=vert3x; coordclip[1]=vert3y; xy_clip_b.push_back(coordclip); posclip_b=0; } /* cout <<"iix_m" << strettox << " " <(rintf(risul[0]))==static_cast(rintf(xcunstart)) && static_cast(risul[1])==static_cast(ycunstart)){ //cout << "iiibbbbb " << xcunstart << " " << ycunstart << endl; risul[0]=xcunend; risul[1]=ycunend; } }else{ risul[0]=xlegstart; risul[1]=mcun*risul[0]+qcun; } if(static_cast(risul[0])==static_cast(xcunstart) && static_cast(risul[1])==static_cast(ycunstart)){ risul[0]=xcunend; risul[1]=ycunend; } }else{ if(risleg){ risul[0]=xcunstart; risul[1]=mleg*risul[0]+qleg; }else{ risul[0]=xcunend; risul[1]=ycunend; } } float lung_legame=sqrt(pow(xlegend-xlegstart,2)+pow(ylegend-ylegstart,2)); float lung_clip=sqrt(pow(risul[0]-xlegstart,2)+pow(risul[1]-ylegstart,2)); if(lung_legame0){ id_ult=_procedure.back()->id(); } procedura* nuova=0; if(typeid(*proc)==typeid(proc_bezier)){ nuova=new proc_bezier(dynamic_cast(proc)); }else if(typeid(*proc)==typeid(proc_arrow)){ nuova=new proc_arrow(dynamic_cast(proc)); }else if(typeid(*proc)==typeid(proc_arc)){ nuova=new proc_arc(dynamic_cast(proc)); }else if(typeid(*proc)==typeid(BoxProc)){ nuova=new BoxProc(dynamic_cast(proc)); } nuova->id(id_ult+1); nuova->aggiungi_genitore(this); _procedure.push_back(nuova); #ifdef DEBUG for(unsigned int i=0;i<_procedure.size();i++){ std::cerr << "aggiunto_ size " << _procedure.size() << " id proc : " << _procedure[i]->id() << " id gruppo genitore " << _procedure[i]->id_gruppo() << " id gruppo (this) " << id() << std::endl; } #endif return nuova->id(); } void gruppo::ruota(float angl,float x_pivot,float y_pivot){ for(unsigned int i=0;i<_atomi.size();i++){ (_atomi[i]).ruota(x_pivot,y_pivot,angl); } for(unsigned int i2=0;i2<_procedure.size();i2++){ (_procedure[i2])->ruota(x_pivot,y_pivot,angl); } /* xpivot(x_pivot); ypivot(y_pivot); angolorot(angl); */ } void gruppo::scale_from_origin(float sc){ for(unsigned int i=0;i<_atomi.size();i++){ _atomi[i].scale(sc); } vector::iterator proc_st=iniz_procedure(); vector::iterator proc_fin=fin_procedure(); while(proc_st!=proc_fin){ (*proc_st)->scale(sc); proc_st++; } } void gruppo::scale(float sc){ float dx_scale=posx()+w()/2.0; float dy_scale=posy()+h()/2.0; trasla(-dx_scale,-dy_scale); for(unsigned int i=0;i<_atomi.size();i++){ _atomi[i].scale(sc); } vector::iterator proc_st=iniz_procedure(); vector::iterator proc_fin=fin_procedure(); while(proc_st!=proc_fin){ (*proc_st)->scale(sc); proc_st++; } trasla(dx_scale,dy_scale); } void gruppo::trasla(float dx,float dy){ //trasliamo gli atomi for(unsigned int i=0;i<_atomi.size();i++){ _atomi[i].trasla(dx,dy); } //trasliamo le procedure vector::iterator proc_st=iniz_procedure(); vector::iterator proc_fin=fin_procedure(); while(proc_st!=proc_fin){ (*proc_st)->trasla(dx,dy); proc_st++; } } void gruppo::phys_translate(float dx,float dy){ //trasliamo gli atomi for(unsigned int i=0;i<_atomi.size();i++){ _atomi[i].phys_translate(dx,dy); } //trasliamo le procedure vector::iterator proc_st=iniz_procedure(); vector::iterator proc_fin=fin_procedure(); while(proc_st!=proc_fin){ (*proc_st)->phys_translate(dx,dy); proc_st++; } } void gruppo::cancel_visitato_all(){ for(unsigned int i=0;i<_atomi.size();i++){ _atomi[i].visitato(false); } } bool gruppo::is_shown() { if(cairo_t_singleton::can_export()){ return true; }else{ std::pair ld; std::pair ru; get_bounding_box(ld,ru); ld.first+=MainWindow->ritorna_mol_canvas()->x(); ld.second+=MainWindow->ritorna_mol_canvas()->y(); ru.first+=MainWindow->ritorna_mol_canvas()->x(); ru.second+=MainWindow->ritorna_mol_canvas()->y(); int main_w=MainWindow->ritorna_mol_canvas()->window()->w(); int main_h=MainWindow->ritorna_mol_canvas()->window()->h()-ALT_BUTT_TOP-HEIGHT_INF_BAR; if(ld.first < main_w && ru.first > 0 && ld.second < main_h && ru.second > 0){ return true; }else{ return false; } } } void gruppo::disegna(){ if(is_shown()){ //disegna la molecola if(_atomi.size()>0){ depth_search((*iniz_atom())); } for(unsigned int act=0;act<_atomi.size();act++){ _atomi[act].reset_arrivati(); } //resetta i valori di visitato for(unsigned int i=0;i<_atomi.size();i++){ _atomi[i].visitato(false); } //disegnamo le procedure vector::iterator proc_st=iniz_procedure(); vector::iterator proc_fin=fin_procedure(); while(proc_st!=proc_fin){ (*proc_st)->disegna(); proc_st++; } } } void gruppo::ruota(){ /* for (int i=0;i<_atomi.size();i++){ _atomi[i].ruota(angolorot(),xpivot(),ypivot()); } */ for(unsigned int i2=0;i2<_procedure.size();i2++){ (_procedure[i2])->ruota(angolorot(),xpivot(),ypivot()); } } void gruppo::genera_seme(float x1, float y1, float x2, float y2,int tipo) throw (range_error){ if(_atomi.size()==0){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); atomo uno; atomo altro; uno.id(0); uno.pos_x(descale(x1-dx_scroll)); uno.pos_y(descale(y1-dy_scroll)); uno.etich_punt()->aggiungi(NO_ETIC, ET_STR); uno.aggiungi_genitore(this); altro.pos_x(descale(x2-dx_scroll)); altro.pos_y(descale(y2-dy_scroll)); altro.etich_punt()->aggiungi(NO_ETIC, ET_STR); altro.aggiungi_genitore(this); /* int nw_leg_id_atomo, int nw_leg_tipo_legame,int nwcr, int nwcg , int nwcb) */ add_atomo_id(uno); add_atomo_id(altro); _atomi[0].aggiungi_legame(_atomi.back().id(),tipo,0,0,0); //uno if(tipo==LEGAME_INTERNO || tipo== LEGAME_ESTERNO || tipo==LEGAME_INTERNO_OPP || tipo==LEGAME_ESTERNO_OPP){ tipo=-tipo; } _atomi.back().aggiungi_legame(_atomi[0].id(),tipo,0,0,0); //altro _atomi[0].costruisci_arrivati(); _atomi[1].costruisci_arrivati(); }else{ throw range_error("genera_seme: il vettore degli atomi ha size()>0"); } } void gruppo::rimappa_da(int nwid){ for(unsigned int i=0;i<_atomi.size();i++){ int vecchio_id=_atomi[i].id(); _atomi[i].id(nwid); for(unsigned int rm=0;rm<_atomi.size();rm++){ vector::iterator inleg=_atomi[rm].iniz_leg(); vector::iterator finleg=_atomi[rm].fin_leg(); while(inleg!=finleg){ if((*inleg).id_atomo()==vecchio_id){ (*inleg).id_atomo(nwid); } inleg++; } } nwid++; } } int gruppo::rimappa_da(int nwid,int id_vec){ //cout << "RIMAPPA" << endl; //cerchiamo il vecchio id e prediciamo in cosa si trasformera' int nuovo_id=-1; int id_vec_trans=nwid; for(unsigned int i=0;i<_atomi.size();i++){ int vecchio_id=_atomi[i].id(); if(vecchio_id==id_vec){ nuovo_id=id_vec_trans; break; } id_vec_trans++; } //settiamo tutti gli id al loro opposto per evitare conflitti //(ovviamente 0 rimane 0) for(unsigned int i=0;i<_atomi.size();i++){ int vecchio_id=_atomi[i].id(); int oppid=-vecchio_id; _atomi[i].id(oppid); for(unsigned int rm=0;rm<_atomi.size();rm++){ vector::iterator inleg=_atomi[rm].iniz_leg(); vector::iterator finleg=_atomi[rm].fin_leg(); while(inleg!=finleg){ if((*inleg).id_atomo()==vecchio_id){ (*inleg).id_atomo(oppid); } inleg++; } } } // a questo punto rimappiamo partendo da nwid for(unsigned int i=0;i<_atomi.size();i++){ int vecchio_id=_atomi[i].id(); _atomi[i].id(nwid); for(unsigned int rm=0;rm<_atomi.size();rm++){ vector::iterator inleg=_atomi[rm].iniz_leg(); vector::iterator finleg=_atomi[rm].fin_leg(); while(inleg!=finleg){ if((*inleg).id_atomo()==vecchio_id){ (*inleg).id_atomo(nwid); } inleg++; } } //cout << "rimappa " << nwid << endl; nwid++; } return nuovo_id; } bool gruppo::substructure_match(gruppo substructure){ substructure_search::molecule_matching s(*this,substructure); bool res =s.match(); DEBUG_TO_CERR(res); return res; } atomo* gruppo::check_atom_son_by_bond_type(atomo* parent, int bond_type){ atomo* result=0; vector::iterator first=parent->primo_leg(); vector::iterator last=parent->ultimo_leg(); while(first!=last){ atomo* child=find_atomo_id((*first).id_atomo()); int type_bond_parent=(*first).tipo_legame(); if(type_bond_parent==bond_type){ result=child; break; } first++; } return result; } atomo* gruppo::check_atom_son_by_bond_type(atomo* parent, int bond_type, bool visited_value){ atomo* result=0; vector::iterator first=parent->primo_leg(); vector::iterator last=parent->ultimo_leg(); while(first!=last){ atomo* child=find_atomo_id((*first).id_atomo()); int type_bond_parent=(*first).tipo_legame(); if(type_bond_parent==bond_type && child->visitato()==visited_value){ result=child; break; } first++; } return result; } atomo* gruppo::check_atom_son_by_bond_type(gruppo* group, atomo* parent, int bond_type, bool visited_value){ atomo* result=0; vector::iterator first=parent->primo_leg(); vector::iterator last=parent->ultimo_leg(); while(first!=last){ atomo* child=group->find_atomo_id((*first).id_atomo()); int type_bond_parent=(*first).tipo_legame(); if(type_bond_parent==bond_type && child->visitato()==visited_value){ result=child; break; } first++; } return result; } void gruppo::get_bounding_box(std::pair& ld, std::pair& ru){ vector x; vector y; for(unsigned int i=0;i<_procedure.size();i++){ std::pair ldp; std::pair rup; _procedure[i]->get_bounding_box(ldp,rup); x.push_back(ldp.first); x.push_back(rup.first); y.push_back(ldp.second); y.push_back(rup.second); } for(unsigned int i=0;i<_atomi.size();i++){ etichetta lb=_atomi[i].etich(); if(false && lb.to_raw_string()!=std::string(NO_ETIC)){ //do take into account labels int w_lb=0; int h_lb=0; etichetta lb=_atomi[i].etich(); allinea_etichetta(lb,_atomi[i]); w_lb=lb.w(); h_lb=lb.h(); x.push_back(lb.x()); y.push_back(lb.y()); x.push_back(lb.x()+w_lb); y.push_back(lb.y()+h_lb); }else{ x.push_back(_atomi[i].pos_x()); y.push_back(_atomi[i].pos_y()); } } calc_bb_gen(x,y,ld,ru); } void gruppo::arrows_points(std::vector& x, std::vector& y){ for(unsigned int i=0;i<_procedure.size();i++){ _procedure[i]->arrows_points(x,y); } } void gruppo::get_phys_bounding_box(std::pair& ld, std::pair& ru){ vector x; vector y; for(unsigned int i=0;i<_procedure.size();i++){ std::pair ldp; std::pair rup; _procedure[i]->get_phys_bounding_box(ldp,rup); x.push_back(ldp.first); x.push_back(rup.first); y.push_back(ldp.second); y.push_back(rup.second); } //std::cerr << "_atomi.size() " << _atomi.size() << std::endl; for(unsigned int i=0;i<_atomi.size();i++){ etichetta lb=_atomi[i].etich(); if(lb.to_raw_string()!=std::string(NO_ETIC)){ int w_lb=0; int h_lb=0; etichetta lb=_atomi[i].etich(); allinea_etichetta(lb,_atomi[i]); w_lb=lb.phys_w(); h_lb=lb.phys_h(); x.push_back(lb.phys_x()); y.push_back(lb.phys_y()); x.push_back(lb.phys_x()+w_lb); y.push_back(lb.phys_y()+h_lb); }else{ //std::cerr << "add " << _atomi[i].id() << " " <<_atomi[i].phys_pos_x() << " " << _atomi[i].phys_pos_y() << std::endl; x.push_back(_atomi[i].phys_pos_x()); y.push_back(_atomi[i].phys_pos_y()); } atomo cp=_atomi[i]; etichetta lab=cp.etich(); std::ostringstream car; if(cp.cariche()>0){ car << cp.cariche() << "+"; }else if(cp.cariche()<0){ car << cp.cariche() << "-"; } allinea_etichetta(lab,cp); std::vector res=calculate_electron_pos_relative(cp); for(unsigned int i=0;i& ld, std::pair& ru){ vector x; vector y; for(unsigned int i=0;i<_procedure.size();i++){ std::pair ldp; std::pair rup; _procedure[i]->get_visual_bounding_box(ldp,rup); x.push_back(ld.first); x.push_back(ru.first); y.push_back(ld.second); y.push_back(ru.second); } for(unsigned int i=0;i<_atomi.size();i++){ x.push_back(_atomi[i].visual_pos_x()); y.push_back(_atomi[i].visual_pos_y()); } calc_bb_gen(x,y,ld,ru); } gruppo link_groups(gruppo* fst, gruppo* snd, std::vector links){ gruppo linked=*fst; vector::iterator beg=snd->iniz_atom(); vector::iterator end=snd->fin_atom(); while(beg!=end){ (*beg).aggiungi_genitore(&linked); (*beg).visitato(false); (*beg).costruisci_arrivati(); (*beg).reset_arrivati(); linked.add_atomo((*beg),false); beg++; } for(unsigned int i=0;i< links.size();i++){ atomo* f=linked.find_atomo_id(links[i]._first); atomo* s=linked.find_atomo_id(links[i]._second); f->aggiungi_legame(s->id(), links[i]._bondtype, 0,0,0); f->costruisci_arrivati(); s->aggiungi_legame(f->id(), links[i]._bondtype, 0,0,0); f->costruisci_arrivati(); } return linked; } bist-0.5.2/src/paragraph_text.cpp0000644000175000017500000013236111425043465015355 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* #include #include #include #include #include #include #include #include */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; paragraph_text::paragraph_text() :etichetta(), _pointer_to_currline(0), _interline_space(paragraph_text::_default_interline_space), _layout_lines(PARAGRAPH_TEXT_ALIGN_LEFT_TEXT_LAYOUT) { //std::cerr << "creo paragraph " << __FUNCTION__ << std::endl; } paragraph_text::paragraph_text(const paragraph_text& other) :etichetta(other), _pointer_to_currline(other._pointer_to_currline), _interline_space(other._interline_space), _layout_lines(other._layout_lines) { for(unsigned int i=0;i< (other._lines_of_text.size()) ;i++){ multifont_label* tmp=new multifont_label(other._lines_of_text[i]); _lines_of_text.push_back(tmp); } } paragraph_text::paragraph_text(const paragraph_text* other) :etichetta(other), _pointer_to_currline(other->_pointer_to_currline), _interline_space(other->_interline_space), _layout_lines(other->_layout_lines) { //std::cerr << "ricopio paragraph " << __FUNCTION__ << std::endl; for(unsigned int i=0;i< (other->_lines_of_text.size()) ;i++){ multifont_label* tmp=new multifont_label(other->_lines_of_text[i]); _lines_of_text.push_back(tmp); } } paragraph_text& paragraph_text::operator=(const paragraph_text& other){ _pointer_to_currline=other._pointer_to_currline; _interline_space=other._interline_space; _layout_lines=other._layout_lines; for(unsigned int i=0;i< (other._lines_of_text.size()) ;i++){ multifont_label* tmp=new multifont_label(other._lines_of_text[i]); _lines_of_text.push_back(tmp); } return (*this); } paragraph_text::~paragraph_text(){ //std::cerr << __FUNCTION__ << std::endl; for(unsigned int i=0;i< _lines_of_text.size(); i++){ //std::cerr << "paragr eliminata " << _lines_of_text[i] << std::endl; delete _lines_of_text[i]; } } void paragraph_text::update_highligted_text(){ if(size_lines_of_text()>0){ int saved_ptrline=pointer_to_currline(); int saved_ptrline_child=_lines_of_text[pointer_to_currline()]->pointer_to_currline(); std::pair saved_curpos(0,0); get_cursor_position(&saved_curpos); go_to_start_of_label(); _lines_of_text[pointer_to_currline()]->set_cursor_position_abs(0,0,0); int currtype=0; while(cursor_one_step_fwd(currtype)){ bool old_h=highlight_child(true); if(old_h){ dim_child(phys_dim()); font_child(font()); color_child(cr(),cg(),cb()); } highlight_child(old_h); } pointer_to_currline(saved_ptrline); _lines_of_text[pointer_to_currline()]->set_cursor_position_abs(saved_ptrline_child, saved_curpos.first, saved_curpos.second); } } int paragraph_text::cr(){ return _cr; } int paragraph_text::cg(){ return _cg; } int paragraph_text::cb(){ return _cb; } void paragraph_text::cr(int nw){ _cr=nw; } void paragraph_text::cg(int nw){ _cg=nw; } void paragraph_text::cb(int nw){ _cb=nw; } int paragraph_text::font(){ return _font; } int paragraph_text::dim(){ int res=5; if( cairo_t_singleton::can_export()){ res=phys_dim(); }else{ res=visual_dim(); } return res; } int paragraph_text::phys_dim(){ return _dim; } int paragraph_text::visual_dim(){ int res=static_cast(rintf(phys_dim()*__pref.getZoom())); if(res<5){ res=5; } return res; } void paragraph_text::dim(int nw){ _dim=nw; } bool paragraph_text::set_ptrline_to_modify_children(int* whished_ptr_line, int* whished_ptr_line_child, int* saved_ptr_line, int* saved_ptr_line_child, int* act_ptr_line, int* act_ptr_line_child){ bool is_legal_req=false; if(pointer_to_currline() >= 0 && ptr_line_less_lines_text() && _lines_of_text[pointer_to_currline()]->pointer_to_currline() >= 0 && (_lines_of_text[pointer_to_currline()]->pointer_to_currline() < static_cast(_lines_of_text[pointer_to_currline()]->size_lines_of_text()))){ is_legal_req=true; *saved_ptr_line=pointer_to_currline(); *saved_ptr_line_child=_lines_of_text[pointer_to_currline()]->pointer_to_currline(); *act_ptr_line=*saved_ptr_line; *act_ptr_line_child=*saved_ptr_line_child; if(whished_ptr_line!=NULL && *whished_ptr_line < static_cast(size_lines_of_text()) && *whished_ptr_line>=0){ *act_ptr_line=*whished_ptr_line; } if(whished_ptr_line_child!=NULL && *whished_ptr_line_child < static_cast(_lines_of_text[*act_ptr_line]->size_lines_of_text()) && *whished_ptr_line>=0){ *act_ptr_line_child=*whished_ptr_line_child; } } return is_legal_req; } int paragraph_text::dim_child(int nw,int* ptr_line, int* ptr_line_child){ int res=-1; int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); res=_lines_of_text[act_ptr_line]->dim(); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); _lines_of_text[act_ptr_line]->dim(nw); pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } return res; } int paragraph_text::font_child(int nw,int* ptr_line, int* ptr_line_child){ int res=-1; int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); res=_lines_of_text[act_ptr_line]->dim(); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); _lines_of_text[act_ptr_line]->font(nw); pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } return res; } void paragraph_text::highlight_current_line(){ if(size_lines_of_text()>0){ if(pointer_to_currline()>=0 && ptr_line_less_lines_text()){ bool old_t=_lines_of_text[pointer_to_currline()]->treat_as_a_whole(true); _lines_of_text[pointer_to_currline()]->draw_negative(true); _lines_of_text[pointer_to_currline()]->treat_as_a_whole(old_t); } } } void paragraph_text::dehighlight_current_line(){ if(size_lines_of_text()>0){ if(pointer_to_currline()>=0 && ptr_line_less_lines_text()){ bool old_t=_lines_of_text[pointer_to_currline()]->treat_as_a_whole(true); _lines_of_text[pointer_to_currline()]->draw_negative(false); _lines_of_text[pointer_to_currline()]->treat_as_a_whole(old_t); } } } bool paragraph_text::highlight_under_bounding_box(std::pair ld, std::pair ru){ format_paragraph(); bool res=false; for(unsigned int i=0; i<_lines_of_text.size(); i++){ std::vector labels=_lines_of_text[i]->get_lines_text(); for(unsigned int j=0; jx() > ld.first && labels[j]->x() < ru.first && labels[j]->y() > ld.second && labels[j]->y() < ru.second){ labels[j]->draw_negative(true); res=true; } } } return res; } bool paragraph_text::some_highlighted(){ bool res=false; for(unsigned int i=0; i<_lines_of_text.size(); i++){ std::vector labels=_lines_of_text[i]->get_lines_text(); for(unsigned int j=0; jdraw_negative()){ res=true; break; } } } return res; } bool paragraph_text::invert_highlight_child_and_shift_cursor(bool fwd){ int dummy=0; bool res=false; if(fwd){ pointer_to_currline(); cursor_one_step_fwd(dummy); _lines_of_text[pointer_to_currline()]->go_to_end_of_line(); res=highlight_child(true); highlight_child(!res); }else{ pointer_to_currline(); res=highlight_child(true); highlight_child(!res); _lines_of_text[pointer_to_currline()]->go_to_start_of_line(); cursor_one_step_back(dummy); } return res; } bool paragraph_text::highlight_child(bool nw,int* ptr_line, int* ptr_line_child){ int res=false; int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); res=_lines_of_text[act_ptr_line]->draw_negative(); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); _lines_of_text[act_ptr_line]->draw_negative(nw); pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } return res; } int paragraph_text::cr_child(int nw,int* ptr_line, int* ptr_line_child){ int res=-1; int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); int old_cg=_lines_of_text[act_ptr_line]->cg(); int old_cb=_lines_of_text[act_ptr_line]->cb(); color_child(nw, old_cg, old_cb, ptr_line,ptr_line_child); pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } return res; } int paragraph_text::cg_child(int nw,int* ptr_line, int* ptr_line_child){ int res=-1; int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); int old_cr=_lines_of_text[act_ptr_line]->cr(); int old_cb=_lines_of_text[act_ptr_line]->cb(); color_child(old_cr, nw, old_cb, ptr_line,ptr_line_child); pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } return res; } int paragraph_text::cb_child(int nw,int* ptr_line, int* ptr_line_child){ int res=-1; int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); int old_cr=_lines_of_text[act_ptr_line]->cr(); int old_cg=_lines_of_text[act_ptr_line]->cg(); color_child(old_cr, old_cg, nw, ptr_line,ptr_line_child); pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } return res; } void paragraph_text::color_child(int cr, int cg, int cb, int* ptr_line, int* ptr_line_child){ int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); _lines_of_text[act_ptr_line]->cr(cr); _lines_of_text[act_ptr_line]->cg(cg); _lines_of_text[act_ptr_line]->cb(cb); pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } } void paragraph_text::query_child(int* cr, int* cg, int* cb, int* font, int* dim, int* ptr_line, int* ptr_line_child){ int saved_ptr_line=-1; int saved_ptr_line_child=-1; int act_ptr_line=-1; int act_ptr_line_child=-1; bool is_legal=set_ptrline_to_modify_children(ptr_line, ptr_line_child, &saved_ptr_line, &saved_ptr_line_child, &act_ptr_line, &act_ptr_line_child); if(is_legal){ bool old_t=_lines_of_text[act_ptr_line]->treat_as_a_whole(false); _lines_of_text[act_ptr_line]->pointer_to_currline(act_ptr_line_child); if(cr!=NULL){ *cr=_lines_of_text[act_ptr_line]->cr(); } if(cg!=NULL){ *cg=_lines_of_text[act_ptr_line]->cg(); } if(cb!=NULL){ *cb=_lines_of_text[act_ptr_line]->cb(); } if(dim!=NULL){ *dim=_lines_of_text[act_ptr_line]->dim(); } if(font!=NULL){ *font=_lines_of_text[act_ptr_line]->font(); } pointer_to_currline(saved_ptr_line); _lines_of_text[pointer_to_currline()]->pointer_to_currline(saved_ptr_line_child); _lines_of_text[act_ptr_line]->treat_as_a_whole(old_t); } } float paragraph_text::x(){ float res=0; if( cairo_t_singleton::can_export()){ res=phys_x(); }else{ res=visual_x(); } return res; } float paragraph_text::visual_x(){ float res=(rintf(phys_x()*__pref.getZoom())); return res; } float paragraph_text::phys_x(){ return _x; } float paragraph_text::y(){ float res=0; if( cairo_t_singleton::can_export()){ res=phys_y(); }else{ res=visual_y(); } return res; } float paragraph_text::visual_y(){ float res=phys_y()*__pref.getZoom(); return res; } float paragraph_text::phys_y(){ return _y; } void paragraph_text::font(int nw){ _font=nw; } void paragraph_text::x(float nw){ _x=nw; } void paragraph_text::y(float nw){ _y=nw; } void paragraph_text::misura(float& altris,float& larris ){ if( cairo_t_singleton::can_export()){ phys_misura(altris,larris); }else{ visual_misura(altris,larris); } } /** *Misura l'altezza e la larghezza di questa etichetta tenendo conto dello zoom *\param altris l'altezza dell'etichetta *\param larris la larghezza dell'etichetta */ void paragraph_text::visual_misura(float& altris,float& larris ){ phys_misura_as_a_whole(altris,larris); altris*=__pref.getZoom(); larris*=__pref.getZoom(); } void paragraph_text::phys_misura(float& altris,float& larris ){ phys_misura_as_a_whole(altris,larris); } void paragraph_text::phys_misura_as_a_whole(float& altris,float& larris ){ if(static_cast(size_lines_of_text())>0){ format_paragraph(); float ypos_max=-1; float ypos_min=10000000; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->phys_y() < ypos_min){ ypos_min=_lines_of_text[i]->phys_y(); } if(_lines_of_text[i]->phys_y() + _lines_of_text[i]->phys_h() > ypos_max){ ypos_max=_lines_of_text[i]->phys_y() + _lines_of_text[i]->phys_h(); } } float xpos_max=-1; float xpos_min=10000000; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->phys_x() < xpos_min){ xpos_min=_lines_of_text[i]->phys_x(); } if(_lines_of_text[i]->phys_x() + _lines_of_text[i]->phys_w() > xpos_max){ xpos_max=_lines_of_text[i]->phys_x()+ _lines_of_text[i]->phys_w(); } } altris=ypos_max - ypos_min; larris=xpos_max - xpos_min; if(layout_lines()!=MULTILINE_LABEL_ALIGN_SINGLE_LINE_TEXT_LAYOUT){ altris+= phys_interline_space(); } }else{ altris=0; larris=0; } } float paragraph_text::h(){ float h=0; float w=0; if( cairo_t_singleton::can_export()){ phys_misura(h,w); }else{ visual_misura(h,w); } return h; } float paragraph_text::visual_h(){ float h=0; float w=0; visual_misura(h,w); return h; } float paragraph_text::phys_h(){ float h=0; float w=0; phys_misura(h,w); return h; } float paragraph_text::w(){ float h=0; float w=0; if( cairo_t_singleton::can_export()){ phys_misura(h,w); }else{ visual_misura(h,w); } return w; } float paragraph_text::visual_w(){ float h=0; float w=0; visual_misura(h,w); return w; } float paragraph_text::phys_w(){ float h=0; float w=0; phys_misura(h,w); return w; } float paragraph_text::interline_space(){ float res=0; if( cairo_t_singleton::can_export()){ res=phys_interline_space(); }else{ res=visual_interline_space(); } return res; } int paragraph_text::interline_space(int nw){ int old=_interline_space; _interline_space=nw; return old; } float paragraph_text::phys_interline_space(){ return _interline_space; } float paragraph_text::visual_interline_space(){ return _interline_space * __pref.getZoom(); } std::vector< std::pair > paragraph_text::vec_str(){ std::vector< std::pair > res=etichetta::vec_str(); if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->vec_str(); } return res; } void paragraph_text::aggiungi(std::string nw, int tipo){ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->aggiungi(nw,tipo); } } void paragraph_text::add_line(multifont_label new_line){ multifont_label* tmp=new multifont_label(new_line); add_line(tmp); } void paragraph_text::add_line(multifont_label* new_line){ _lines_of_text.push_back(new_line); _pointer_to_currline=_lines_of_text.size()-1; } void paragraph_text::add_line(multifont_label new_line,int pos){ if(pos>=0 && static_cast(pos) < _lines_of_text.size()){ multifont_label* tmp=new multifont_label(new_line); add_line(tmp,pos); } } void paragraph_text::add_line(multifont_label* new_line, int pos){ if(pos>=0 && static_cast(pos) < _lines_of_text.size()){ if(static_cast(pos)==_lines_of_text.size()-1){ add_line(new_line); }else{ std::vector::iterator beg=_lines_of_text.begin() + pos + 1; _lines_of_text.insert(beg,new_line); _pointer_to_currline=pos+1; } } } void paragraph_text::insert(std::string nw, int type, int pos){ //DA FARE } void paragraph_text::insert_line(multifont_label new_line, int pos){ add_line(new_line,pos); } void paragraph_text::insert_line(multifont_label* new_line, int pos){ add_line(new_line,pos); } void paragraph_text::delete_line(int pos, bool reset_pointer_currline){ etichetta* to_delete=0; std::vector ::iterator pos_iter=_lines_of_text.begin()+pos; if(pos>=0 && static_cast(pos) < _lines_of_text.size()){ to_delete=*pos_iter; _lines_of_text.erase(pos_iter); if(reset_pointer_currline){ reset_pointer_to_currline(); } } delete to_delete; } void paragraph_text::elimina(bool reset_cur){ for(unsigned int i=0;i< _lines_of_text.size();i++){ multifont_label* to_delete=_lines_of_text[i]; vector::iterator beg=_lines_of_text.begin(); beg+=i; _lines_of_text.erase(beg); delete to_delete; } if(reset_cur){ reset_pointer_to_currline(); } } void paragraph_text::subst_line(multifont_label* nw, int pos){ delete_line(pos,false); if(static_cast(pos)!=_lines_of_text.size()){ insert_line(nw,pos); }else{ _lines_of_text.push_back(nw); } } void paragraph_text::format_paragraph(){ switch(layout_lines()){ case PARAGRAPH_TEXT_ALIGN_LEFT_TEXT_LAYOUT: { for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->x(_x); float total_h=0; for(unsigned int j=0;jphys_h(); total_h+=phys_interline_space(); } _lines_of_text[i]->y(_y+total_h); } } break; case PARAGRAPH_TEXT_ALIGN_RIGHT_TEXT_LAYOUT: { format_lines_align_right(); } break; case PARAGRAPH_TEXT_ALIGN_CENTER_TEXT_LAYOUT: { format_lines_align_center(); } break; case PARAGRAPH_TEXT_ALIGN_SINGLE_LINE_TEXT_LAYOUT: { for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->y(_y); int total_w=0; for(unsigned int j=0;jphys_w(); } _lines_of_text[i]->x(_x+total_w); } } break; default: format_lines_align_center(); break; } } void paragraph_text::draw_cursor(bool draw){ if(pointer_to_currline()>=0 && _lines_of_text.size()>0){ _lines_of_text[pointer_to_currline()]->draw_cursor(draw); } } void paragraph_text::disegna(){ format_paragraph(); if( cairo_t_singleton::can_export()){ for(unsigned int i=0;i<_lines_of_text.size();i++){ /* cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); int yy=_lines_of_text[i]->y(); cairo_set_source_rgb(cn,1,0,1); cairo_move_to(cn,_lines_of_text[i]->x(),yy); cairo_line_to(cn,_lines_of_text[i]->x()+99,yy); cairo_stroke(cn); cairo_set_source_rgb(cn,1,0,0); cairo_move_to(cn,_lines_of_text[i]->x()+100,yy+_lines_of_text[i]->h()); cairo_line_to(cn,_lines_of_text[i]->x()+200,yy+_lines_of_text[i]->h()); cairo_stroke(cn); cairo_restore(cn); */ _lines_of_text[i]->disegna(); } }else{ for(unsigned int i=0;i<_lines_of_text.size();i++){ bool old_t=_lines_of_text[i]->treat_as_a_whole(true); _lines_of_text[i]->draw_cursor(false); _lines_of_text[i]->treat_as_a_whole(false); if(static_cast(i)==pointer_to_currline()){ _lines_of_text[i]->draw_cursor(true); }else{ _lines_of_text[i]->draw_cursor(false); } _lines_of_text[i]->treat_as_a_whole(old_t); _lines_of_text[i]->disegna(); } } } void paragraph_text::trasla(float dx, float dy){ x(descale(x()+dx)); y(descale(y()+dy)); } void paragraph_text::phys_translate(float dx, float dy){ x(phys_x()+dx); y(phys_y()+dy); } void paragraph_text::scale(float sc){ if(sc<1){ if(phys_dim()>6){ for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->dim(_lines_of_text[i]->phys_dim()-1); } } }else{ for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->dim(_lines_of_text[i]->phys_dim()+1); } } } void paragraph_text::ruota(float xpiv, float ypiv,float angl){ not_impl(); } bool paragraph_text::dentro_bb(float x_bb, float y_bb, float w_bb , float h_bb){ std::pair ld(x_bb,y_bb); std::pair ru(x_bb+w_bb,y_bb+h_bb); if(can_highlight()){ highlight_under_bounding_box(ld,ru); } if(x() > x_bb && x()+w() y_bb && y()+h()(nw)<_lines_of_text.size()){ _pointer_to_currline=nw; } } int paragraph_text::pointer_to_currline(){ return _pointer_to_currline; } int paragraph_text::pointer_to_currline_transl(int delta){ int nw=pointer_to_currline()+delta; int old=pointer_to_currline(); if(nw>=0 && static_cast(nw) < _lines_of_text.size()){ pointer_to_currline(nw); } return old; } int paragraph_text::set_cursor_position(int limit){ int res=-1; int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->set_cursor_position(limit); } return res; } void paragraph_text::go_to_end_of_label(){ if(size_lines_of_text()>0){ for(unsigned int i=0;igo_to_end_of_label(); } pointer_to_currline(size_lines_of_text()-1); } } void paragraph_text::go_to_end_of_line(){ if(size_lines_of_text()>0 && pointer_to_currline()>=0 && ptr_line_less_lines_text()){ _lines_of_text[pointer_to_currline()]->go_to_end_of_label(); } } void paragraph_text::go_to_start_of_label(){ if(size_lines_of_text()>0){ for(unsigned int i=0;igo_to_start_of_label(); } pointer_to_currline(0); } } void paragraph_text::go_to_start_of_line(){ if(size_lines_of_text()>0){ _lines_of_text[pointer_to_currline()]->go_to_start_of_label(); } } int paragraph_text::get_cursor_position(std::pair* pos){ int res=-1; int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->get_cursor_position(pos); } return res; } bool paragraph_text::cursor_one_step_fwd(int &curr_type){ int ptr_line=pointer_to_currline(); bool has_more=true; if(size_lines_of_text()>0 && _lines_of_text[ptr_line]->size_lines_of_text()>0){ if(ptr_line>=0 && ptr_line_less_lines_text()){ //int currt=0; bool not_end = _lines_of_text[ptr_line]->cursor_one_step_fwd(curr_type); if(!not_end){ int old_pos_line=pointer_to_currline(); pointer_to_currline_transl(1); ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->pointer_to_currline(0); _lines_of_text[ptr_line]->set_cursor_position(0,0); if(old_pos_line== static_cast(size_lines_of_text()-1)){ has_more=false; } } } } }else{ has_more=false; } return has_more; } bool paragraph_text::cursor_one_step_back(int &curr_type){ int ptr_line=pointer_to_currline(); bool has_more=true; if(size_lines_of_text()>0 && _lines_of_text[ptr_line]->size_lines_of_text()>0){ if(ptr_line>=0 && ptr_line_less_lines_text()){ bool not_beg = _lines_of_text[ptr_line]->cursor_one_step_back(curr_type); if(!not_beg && ptr_line>0){ pointer_to_currline_transl(-1); ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ std::vector < std::pair > the_vec_str= _lines_of_text[ptr_line]->vec_str(); int nl=_lines_of_text[ptr_line]->size_lines_of_text()-1; int size_f=the_vec_str.size()-1; int size_s=(the_vec_str.back().first).size(); _lines_of_text[ptr_line]->pointer_to_currline(nl); _lines_of_text[ptr_line]->set_cursor_position(size_f,size_s); } }else{ has_more=false; } } }else{ has_more=false; } return has_more; } bool paragraph_text::cursor_one_step_up(int &curr_type){ bool has_more=false; if(pointer_to_currline()>0){ has_more=true; int ptr_line_child=_lines_of_text[pointer_to_currline()]->pointer_to_currline(); std::pair cpos(0,0); get_cursor_position(&cpos); unsigned int line=pointer_to_currline(); /* std::cerr << line << " " << ptr_line_child << " " << cpos.first << " " << cpos.second << std::endl; std::cerr << "before=" << calculate_no_chars_before_abs_cur_pos(line, ptr_line_child, cpos) << std::endl; */ int limit=calculate_no_chars_before_abs_cur_pos(line,ptr_line_child,cpos); //std::cerr << "limit(up)= " << limit << std::endl; pointer_to_currline_transl(-1); line=pointer_to_currline(); calculate_curpos_until_limit(pointer_to_currline(), line, cpos, limit); /* std::cerr << "line=" << line << " cpos=" << cpos.first << "," << cpos.second << " limit=" << limit << std::endl; */ _lines_of_text[pointer_to_currline()]->pointer_to_currline(line); /* std::cerr << "cpos.first=" << cpos.first << "cpos.second=" << cpos.second << "_lines_of_text[pointer_to_currline()]->pointer_to_currline()=" << _lines_of_text[pointer_to_currline()]->pointer_to_currline()<< std::endl; */ _lines_of_text[pointer_to_currline()]->set_cursor_position(cpos.first,cpos.second); if(_lines_of_text[pointer_to_currline()]->pointer_to_currline()>0 && cpos.second==0){ cursor_one_step_fwd(curr_type); cursor_one_step_back(curr_type); } } return has_more; } bool paragraph_text::cursor_one_step_down(int &curr_type){ /* std::cerr << "legal=" << check_if_abs_pos_legal(int ptrline, int ptrline_child, int cpos_f, int cpos_s) <=0 && pointer_to_currline() < static_cast(_lines_of_text.size())){ has_more=true; int ptr_line_child=_lines_of_text[pointer_to_currline()]->pointer_to_currline(); std::pair cpos(0,0); get_cursor_position(&cpos); unsigned int line=pointer_to_currline(); int limit=calculate_no_chars_before_abs_cur_pos(line,ptr_line_child,cpos); //std::cerr << "limit(down)= " << limit << std::endl; pointer_to_currline_transl(1); line=pointer_to_currline(); calculate_curpos_until_limit(pointer_to_currline(), line, cpos, limit); /* std::cerr << "line=" << line << " cpos=" << cpos.first << "," << cpos.second << " limit=" << limit << std::endl; */ _lines_of_text[pointer_to_currline()]->pointer_to_currline(line); /* std::cerr << "cpos.first=" << cpos.first << "cpos.second=" << cpos.second << "_lines_of_text[pointer_to_currline()]->pointer_to_currline()=" << _lines_of_text[pointer_to_currline()]->pointer_to_currline()<< std::endl; */ _lines_of_text[pointer_to_currline()]->set_cursor_position(cpos.first,cpos.second); if(_lines_of_text[pointer_to_currline()]->pointer_to_currline()>0 && cpos.second==0){ cursor_one_step_fwd(curr_type); cursor_one_step_back(curr_type); } } return has_more; /* bool has_more=false; if(pointer_to_currline() < static_cast(_lines_of_text.size())){ has_more=true; int ptr_line_child=_lines_of_text[pointer_to_currline()]->pointer_to_currline(); std::pair cpos(0,0); get_cursor_position(&cpos); pointer_to_currline_transl(1); _lines_of_text[pointer_to_currline()]->pointer_to_currline(ptr_line_child); _lines_of_text[pointer_to_currline()]->set_cursor_position(cpos.first+cpos.second); } return has_more; */ } void paragraph_text::insert_string_in_curr_pos(std::string str,int type){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ bool old_v=_lines_of_text[ptr_line]->treat_as_a_whole(false); _lines_of_text[ptr_line]->insert_string_in_curr_pos(str,type); int phys_dim_l=_lines_of_text[ptr_line]->phys_dim(); if(!some_highlighted()){ phys_dim_l=phys_dim(); } _lines_of_text[ptr_line]->treat_as_a_whole(old_v); font_child(font()); dim_child(phys_dim_l); color_child(cr(),cg(),cb()); }else if(_lines_of_text.size()==0){ multifont_label* tmp=new multifont_label(font(),phys_dim(),cr(),cg(),cb()); tmp->insert_string_in_curr_pos(str,ET_STR); set_cursor_position(0,str.size()); tmp->reset_cursor_if_outside_limits(); add_line(tmp); } } bool paragraph_text::ptr_line_less_lines_text(){ bool res=false; if(static_cast(pointer_to_currline()) < _lines_of_text.size()){ res=true; } return res; } bool paragraph_text::ptr_line_is_last_line(){ return pointer_to_currline() == static_cast((_lines_of_text.size()-1)); } void paragraph_text::reset_cursor_if_outside_limits(){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->reset_cursor_if_outside_limits(); } } void paragraph_text::reset_pointer_to_currline(){ if(_lines_of_text.size() == 0){ _pointer_to_currline=-1; }else if(static_cast(_pointer_to_currline) >= _lines_of_text.size()){ _pointer_to_currline=_lines_of_text.size()-1; } } void paragraph_text::delete_char_curr_pos(bool before){ if(size_lines_of_text()>0){ if(_pointer_to_currline >= 0 && ptr_line_less_lines_text()){ _lines_of_text[pointer_to_currline()]->delete_char_curr_pos(before); } if(_lines_of_text[pointer_to_currline()]->size_lines_of_text()==0){ delete_line(pointer_to_currline(),true); } } } std::vector paragraph_text::get_lines_text(){ return _lines_of_text; } bool paragraph_text::dump_label(){ std::cerr << __FUNCTION__ << std::endl; std::cerr << __FUNCTION__ << "x: " << x() << std::endl; std::cerr << __FUNCTION__ << "y: " << y() << std::endl; std::cerr << __FUNCTION__ << "w: " << w() << std::endl; std::cerr << __FUNCTION__ << "h: " << h() << std::endl; std::cerr << __FUNCTION__ << "interline " << interline_space() << std::endl; for(unsigned int i =0;i< _lines_of_text.size();i++){ std::cerr << __FUNCTION__ << _lines_of_text[i]->to_raw_string() << std::endl; } return true; } int paragraph_text::layout_lines(){ return _layout_lines; } void paragraph_text::layout_lines(int nw){ _layout_lines=nw; } void paragraph_text::format_lines_align_right(){ float w_max=0; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->phys_w() > w_max){ w_max=_lines_of_text[i]->phys_w(); } } for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->x(_x + (w_max - _lines_of_text[i]->phys_w()) ); int total_h=0; for(unsigned int j=0;jphys_h(); total_h+=phys_interline_space(); } _lines_of_text[i]->y(_y+total_h); } } void paragraph_text::format_lines_align_center(){ float w_max=0; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->phys_w() > w_max){ w_max=_lines_of_text[i]->phys_w(); } } for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->x(_x + w_max/2 - _lines_of_text[i]->phys_w()/2 ); int total_h=0; for(unsigned int j=0;jphys_h(); total_h+=phys_interline_space(); } _lines_of_text[i]->y(_y+total_h); } } void paragraph_text::increase_highlighted(){ //da fare } void paragraph_text::decrease_highlighted(){ //da fare } void paragraph_text::de_highlight(){ if(size_lines_of_text()>0){ int saved_ptrline=pointer_to_currline(); int saved_ptrline_child=_lines_of_text[pointer_to_currline()]->pointer_to_currline(); std::pair saved_curpos(0,0); get_cursor_position(&saved_curpos); go_to_start_of_label(); _lines_of_text[pointer_to_currline()]->set_cursor_position_abs(0,0,0); int currtype=0; while(cursor_one_step_fwd(currtype)){ highlight_child(false); } pointer_to_currline(saved_ptrline); _lines_of_text[pointer_to_currline()]->set_cursor_position_abs(saved_ptrline_child, saved_curpos.first, saved_curpos.second); } } unsigned int paragraph_text::size_lines_of_text(){ return _lines_of_text.size(); } bool paragraph_text::break_and_split_normal_str(etichetta** left , etichetta** right){ bool res=false; int point_bk=pointer_to_currline(); if(*left==0 ){ *left=new multifont_label(); } if(*right==0 ){ *right=new multifont_label(); } if(typeid(**left) == typeid(multifont_label) && typeid(**right) == typeid(multifont_label) && pointer_to_currline()>=0 && ptr_line_less_lines_text() ){ if((*left)!=0 && (*right)!=0){ delete (*left); delete (*right); } multifont_label copy_lb(_lines_of_text[pointer_to_currline()]); //std::cerr << copy_lb.dump_label() << std::endl; unsigned int labels_size=copy_lb.get_lines_text().size(); int cpos=copy_lb.pointer_to_currline(); (*left)=new multifont_label(copy_lb); (*right)=new multifont_label(copy_lb); dynamic_cast((*left))->elimina(); dynamic_cast((*right))->elimina(); //delete_line(int pos, bool reset_pointer_currline); for(unsigned int i=0;i(i)<=cpos){ dynamic_cast((*right))->add_line(copy_lb.get_line_copy(i)); }else{ dynamic_cast((*left))->add_line(copy_lb.get_line_copy(i)); } } insert_line(dynamic_cast(*right), pointer_to_currline()); insert_line(dynamic_cast(*left), pointer_to_currline()); delete_line(pointer_to_currline()-2,true); pointer_to_currline(point_bk); pointer_to_currline_transl(1); _lines_of_text[pointer_to_currline()]->set_cursor_position_abs(0,0,0); res=true; } return res; } bool paragraph_text::check_if_abs_pos_legal(int ptrline, int ptrline_child, int cpos_f, int cpos_s){ bool res=false; if(ptrline >=0 && ptrline < static_cast(size_lines_of_text())){ int size_pointer_child=_lines_of_text[ptrline]->size_lines_of_text(); if(ptrline_child >=0 && ptrline_child < size_pointer_child ){ etichetta lb=_lines_of_text[ptrline]->get_line_copy(ptrline_child); std::vector < std::pair > the_vec_str=lb.vec_str(); if(cpos_f >= 0 && cpos_f < static_cast(the_vec_str.size())){ std::string st=the_vec_str[cpos_f].first; if(cpos_s >= 0 && cpos_s <= static_cast(st.size())){ res=true; } } } } return res; } etichetta paragraph_text::get_label_copy_from_coordinate(int ptrline, int ptrline_child) throw (out_of_range){ etichetta lb; if(ptrline >=0 && ptrline < static_cast(size_lines_of_text())){ int saved_pointer_child=_lines_of_text[ptrline]->pointer_to_currline(); if(ptrline_child >=0 && ptrline_child < static_cast(saved_pointer_child)){ lb=_lines_of_text[ptrline]->get_line_copy(ptrline_child); }else{ std::string st=std::string("error in ") + std::string(__FUNCTION__); throw out_of_range(st); } } return lb; } int paragraph_text::calculate_no_chars_before_abs_cur_pos(int line, int line_child, std::pair cpos_c){ int res=0; if(check_if_abs_pos_legal(line, line_child, cpos_c.first, cpos_c.second)){ for(int i=0;i > the_vec_str=lb.vec_str(); for(unsigned int j=0;j0){ res+=cpos_c.first; } res+=cpos_c.second; } return res; } void paragraph_text::calculate_curpos_until_limit(unsigned int ptrline, unsigned int& line, std::pair& cpos, int limit){ int raw_count=0; int label_in_line=_lines_of_text[ptrline]->size_lines_of_text(); for(unsigned int j=0;j< _lines_of_text[ptrline]->size_lines_of_text();j++){ line=j; etichetta lb=_lines_of_text[ptrline]->get_line_copy(j); std::vector < std::pair > the_vec_str=lb.vec_str(); for(unsigned int k=0;k(j) == label_in_line-1 && limit-raw_count>0 ){ s_l_size_mod=1; } for(unsigned int l=0;l(j) == label_in_line-1 && raw_count<=limit) || (static_cast(j) < label_in_line && raw_count(j) == label_in_line-1 " << (static_cast(j) == label_in_line-1) << " " << label_in_line-1 << " "<< "j="<< j << "raw=" << raw_count << "s_l=" << s_l << std::endl; */ raw_count++; }else{ return; } } } } } const int paragraph_text::_default_interline_space=5; bist-0.5.2/src/procedura.cpp0000644000175000017500000026557111657505745014355 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; /**procedura*****************/ /** *\return true se altro ha lo stesso id di quest'istanza **/ bool procedura::operator==(procedura* altro){ //cout << "IDENT" <"<id()<< endl; if(id()==altro->id()){ return true; }else{ return false; } } procedura::~procedura(){ } procedura::procedura(const procedura& altra) :_tipo(altra._tipo) { _il_genitore=altra._il_genitore; } procedura::procedura(const procedura* other) :_tipo(other->_tipo) { _il_genitore=other->_il_genitore; } int procedura::id_gruppo(){ gruppo* grp=dynamic_cast(_il_genitore); if(grp){ return grp->id(); }else{ #ifdef DEBUG cout << "ppp gruppo indirizzo invalido " //<< typeid(*_il_genitore).name() << " " <<_il_genitore << endl; #endif return -1; } } const float procedura::_tolerance_hit_control_point=5; /*************************proc_arc***********************/ /** *Costruttore di default. */ proc_arc::proc_arc() :procedura(PROC_ARC) { } proc_arc::proc_arc(const proc_arc* altro) :procedura(*altro), _id(altro->_id), _xstart(altro->_xstart), _ystart(altro->_ystart), _xend(altro->_xend), _yend(altro->_yend), _x1(altro->_x1), _y1(altro->_y1), _x2(altro->_x2), _y2(altro->_y2), _x3(altro->_x3), _y3(altro->_y3), _x4(altro->_x4), _y4(altro->_y4), _cr(altro->_cr), _cb(altro->_cb), _cg(altro->_cg), _xpivot(altro->_xpivot), _ypivot(altro->_ypivot), _angolorot(altro->_angolorot), _spessore(altro->_spessore), _dash(altro->_dash), _edited_cp(altro->_edited_cp) { /* cout << "zoom: " << __pref.getZoom() << endl; cout << "copiata proc_arc " << phys_xstart() << endl; cout << "copiata proc_arc " << xstart() << endl; */ } /** *Costruisce loggetto arco. *\param id id della procedura la identifica univocamente *\param posx ascissa dell arco *\param posy ordinata dell arco * *\param w larghezza dell'arco *\param h altezza dell'arco * *\param startangl angolo (in gradi) da cui partire per disegnare l'arco *(partendo da ore 3). * *\param endangl angolo (in gradi) a cui arrivare per disegnare l'arco *\param cr componente rossa del colore della procedura *\param cg componente verde del colore della procedura *\param cb componente blu del colore della procedura *\param xpiv ascissa dell'asse di rotazione. *\param ypiv ordinata dell'asse di rotazione *\param spess spessore in px della "penna" *\param tratt lunghezza del tratteggio (nota: 0 nessun tratteggio). * */ proc_arc::proc_arc(int id, float xst, float yst, float xen, float yen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt) :procedura(PROC_ARC), _id(id), _xstart(xst), _ystart(yst), _xend(xen), _yend(yen), _x1(x1), _y1(y1), _x2(x2), _y2(y2), _x3(x3), _y3(y3), _x4(x4), _y4(y4), _cr(cr), _cb(cb), _cg(cg), _xpivot(xpiv), _ypivot(ypiv), _angolorot(anglrot), _spessore(spess), _dash(tratt), _edited_cp(none) { init(); } proc_arc::~proc_arc(){ } void proc_arc::init(){ ruota(xpivot(),ypivot(),angolorot()); } /*ritorna i valori*/ int proc_arc::id(){ return _id; } float proc_arc::posx(){ if(cairo_t_singleton::can_export()){ return phys_posx(); }else{ return visual_posx(); } /* float lung=sqrt( pow(x4()-x1(),2) + pow(y4()-y1(),2) ); float angl=atan2(y4()-y1(),x4()-x1()); return (lung/2.0)*cos(angl)+x1()-w()/2; */ } float proc_arc::visual_posx(){ return __pref.getZoom() * phys_posx(); } float proc_arc::phys_posx(){ // float lung=sqrt( pow(phys_x4()-phys_x1(),2) + pow(phys_y4()-phys_y1(),2) ); // float angl=atan2(phys_y4()-phys_y1(),phys_x4()-phys_x1()); // return (lung/2.0)*cos(angl)+phys_x1()-phys_w()/2; std::pair ld; std::pair ru; get_phys_bounding_box(ld,ru); return ld.first; } float proc_arc::posy(){ if(cairo_t_singleton::can_export()){ return phys_posy(); }else{ return visual_posy(); } /* float lung=sqrt( pow(x4()-x1(),2) + pow(y4()-y1(),2) ); float angl=atan2(y4()-y1(),x4()-x1()); return (lung/2.0)*sin(angl)+y1()-h()/2; */ } float proc_arc::visual_posy(){ return __pref.getZoom() * phys_posy(); } float proc_arc::phys_posy(){ // float lung=sqrt( pow(phys_x4()-phys_x1(),2) + pow(phys_y4()-phys_y1(),2) ); // float angl=atan2(phys_y4()-phys_y1(),phys_x4()-phys_x1()); // return (lung/2.0)*sin(angl)+phys_y1()-phys_h()/2; std::pair ld; std::pair ru; get_phys_bounding_box(ld,ru); return ld.second; } float proc_arc::w(){ vector xtmp; xtmp.push_back(x1()); xtmp.push_back(x2()); xtmp.push_back(x3()); xtmp.push_back(x4()); xtmp.push_back(xstart()); xtmp.push_back(xend()); float wtmp=(*max_element(xtmp.begin(),xtmp.end())) - (*min_element(xtmp.begin(),xtmp.end())); return wtmp; } float proc_arc::visual_w(){ vector xtmp; xtmp.push_back(visual_x1()); xtmp.push_back(visual_x2()); xtmp.push_back(visual_x3()); xtmp.push_back(visual_x4()); xtmp.push_back(visual_xstart()); xtmp.push_back(visual_xend()); float wtmp=(*max_element(xtmp.begin(),xtmp.end())) - (*min_element(xtmp.begin(),xtmp.end())); return wtmp; } float proc_arc::phys_w(){ vector xtmp; xtmp.push_back(phys_x1()); xtmp.push_back(phys_x2()); xtmp.push_back(phys_x3()); xtmp.push_back(phys_x4()); xtmp.push_back(phys_xstart()); xtmp.push_back(phys_xend()); float wtmp=(*max_element(xtmp.begin(),xtmp.end())) - (*min_element(xtmp.begin(),xtmp.end())); return wtmp; } float proc_arc::visual_h(){ vector ytmp; ytmp.push_back(visual_y1()); ytmp.push_back(visual_y2()); ytmp.push_back(visual_y3()); ytmp.push_back(visual_y4()); ytmp.push_back(visual_ystart()); ytmp.push_back(visual_yend()); float htmp= (*max_element(ytmp.begin(),ytmp.end())) - (*min_element(ytmp.begin(),ytmp.end())); return htmp; } float proc_arc::h(){ vector ytmp; ytmp.push_back(y1()); ytmp.push_back(y2()); ytmp.push_back(y3()); ytmp.push_back(y4()); ytmp.push_back(ystart()); ytmp.push_back(yend()); float htmp= (*max_element(ytmp.begin(),ytmp.end())) - (*min_element(ytmp.begin(),ytmp.end())); return htmp; } float proc_arc::phys_h(){ vector ytmp; ytmp.push_back(phys_y1()); ytmp.push_back(phys_y2()); ytmp.push_back(phys_y3()); ytmp.push_back(phys_y4()); ytmp.push_back(phys_ystart()); ytmp.push_back(phys_yend()); float htmp= (*max_element(ytmp.begin(),ytmp.end())) - (*min_element(ytmp.begin(),ytmp.end())); return htmp; } float proc_arc::xstart(){ if(cairo_t_singleton::can_export()){ return phys_xstart(); }else{ return visual_xstart(); } } float proc_arc::visual_xstart(){ return phys_xstart() * __pref.getZoom(); } float proc_arc::phys_xstart(){ return _xstart; } float proc_arc::ystart(){ if(cairo_t_singleton::can_export()){ return phys_ystart(); }else{ return visual_ystart(); } } float proc_arc::visual_ystart(){ return phys_ystart() * __pref.getZoom(); } float proc_arc::phys_ystart(){ return _ystart; } float proc_arc::xend(){ if(cairo_t_singleton::can_export()){ return phys_xend(); }else{ return visual_xend(); } } float proc_arc::visual_xend(){ return phys_xend() * __pref.getZoom(); } float proc_arc::phys_xend(){ return _xend; } float proc_arc::yend(){ if(cairo_t_singleton::can_export()){ return phys_yend(); }else{ return visual_yend(); } } float proc_arc::visual_yend(){ return phys_yend() * __pref.getZoom(); } float proc_arc::phys_yend(){ return _yend; } float proc_arc::x1(){ if(cairo_t_singleton::can_export()){ return phys_x1(); }else{ return visual_x1(); } } float proc_arc::visual_x1(){ return phys_x1() * __pref.getZoom(); } float proc_arc::phys_x1(){ return _x1; } float proc_arc::y1(){ if(cairo_t_singleton::can_export()){ return phys_y1(); }else{ return visual_y1(); } } float proc_arc::visual_y1(){ return phys_y1() * __pref.getZoom(); } float proc_arc::phys_y1(){ return _y1; } float proc_arc::x2(){ if(cairo_t_singleton::can_export()){ return phys_x2(); }else{ return visual_x2(); } } float proc_arc::visual_x2(){ return phys_x2() * __pref.getZoom(); } float proc_arc::phys_x2(){ return _x2; } float proc_arc::y2(){ if(cairo_t_singleton::can_export()){ return phys_y2(); }else{ return visual_y2(); } } float proc_arc::visual_y2(){ return phys_y2() * __pref.getZoom(); } float proc_arc::phys_y2(){ return _y2; } float proc_arc::x3(){ if(cairo_t_singleton::can_export()){ return phys_x3(); }else{ return visual_x3(); } } float proc_arc::visual_x3(){ return phys_x3() * __pref.getZoom(); } float proc_arc::phys_x3(){ return _x3; } float proc_arc::y3(){ if(cairo_t_singleton::can_export()){ return phys_y3(); }else{ return visual_y3(); } } float proc_arc::visual_y3(){ return phys_y3() * __pref.getZoom(); } float proc_arc::phys_y3(){ return _y3; } float proc_arc::x4(){ if(cairo_t_singleton::can_export()){ return phys_x4(); }else{ return visual_x4(); } } float proc_arc::visual_x4(){ return phys_x4() * __pref.getZoom(); } float proc_arc::phys_x4(){ return _x4; } float proc_arc::y4(){ if(cairo_t_singleton::can_export()){ return phys_y4(); }else{ return visual_y4(); } } float proc_arc::visual_y4(){ return phys_y4() * __pref.getZoom(); } float proc_arc::phys_y4(){ return _y4; } int proc_arc::cr(){ return _cr; } int proc_arc:: cg(){ return _cg; } int proc_arc::cb(){ return _cb; } float proc_arc::xpivot(){ return _xpivot; } float proc_arc::ypivot(){ return _ypivot; } float proc_arc::angolorot(){ return _angolorot; } int proc_arc::spessore(){ return _spessore; } int proc_arc::dash(){ return _dash; } /*setta i valori*/ void proc_arc::id(int nw){ _id=nw; } void proc_arc::posx(float nw){ trasla(nw-phys_posx(),0); } void proc_arc::posy(float nw){ trasla(0,nw-phys_posy()); } void proc_arc::w(float nw){ xend(phys_xend()*nw); x2(phys_x2()*nw); x4(phys_x4()*nw); } void proc_arc::h(float nw){ ystart(phys_ystart()*nw); yend(phys_yend()*nw); y1(phys_y1()*nw); y2(phys_y2()*nw); } void proc_arc::xstart(float nw){ _xstart=nw; } void proc_arc::ystart(float nw){ _ystart=nw; } void proc_arc::xend(float nw){ _xend=nw; } void proc_arc::yend(float nw){ _yend=nw; } void proc_arc::x1(float nw){ _x1=nw; } void proc_arc::y1(float nw){ _y1=nw; } void proc_arc::x2(float nw){ _x2=nw; } void proc_arc::y2(float nw){ _y2=nw; } void proc_arc::x3(float nw){ _x3=nw; } void proc_arc::y3(float nw){ _y3=nw; } void proc_arc::x4(float nw){ _x4=nw; } void proc_arc::y4(float nw){ _y4=nw; } void proc_arc::cr(int nw){ _cr=nw; } void proc_arc::cg(int nw){ _cg=nw; } void proc_arc::cb(int nw){ _cb=nw; } void proc_arc::xpivot(float nw){ _xpivot=nw; } void proc_arc::ypivot(float nw){ _ypivot=nw; } void proc_arc::angolorot(float nw){ _angolorot=nw; } void proc_arc::spessore(int nw){ _spessore=nw; } void proc_arc::dash(int nw){ _dash=nw; } int proc_arc::sotto_mouse(int posx_m, int posy_m){ // float ics_e=posx() + ( (w() - w()/scala_bb)/2 ); // float ips_e=posy() + ( (h() - h()/scala_bb)/2 ); // float w_e=(w() - w()/scala_bb); // float h_e= (h() - h()/scala_bb); pair ld; pair ru; get_bounding_box(ld, ru); if(posx_m > ld.first && posx_m < ru.first && posy_m > ld.second && posy_m < ru.second){ return id(); }else{ return -1; } } int proc_arc::control_point_under_mouse(int posx_m, int posy_m){ if(similar_to(xstart(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(ystart(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=start; return id(); }else if(similar_to(xend(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(yend(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=end; return id(); }else if(similar_to(x1(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(y1(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=lb; return id(); }else if(similar_to(x2(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(y2(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=rb; return id(); }else if(similar_to(x3(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(y3(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=lu; return id(); }else if(similar_to(x4(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(y4(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=ru; return id(); }else{ return -1; } } void proc_arc::unset_edit_control_point(){ _edited_cp=none; } void proc_arc::control_point_transl(float dx, float dy){ if(_edited_cp==start){ xstart(descale(xstart() +dx)); ystart(descale(ystart() +dy)); }else if(_edited_cp==end){ xend(descale(xend() +dx)); yend(descale(yend() +dy)); }else if(_edited_cp==ru){ x4(descale(x4() +dx)); y4(descale(y4() +dy)); }else if(_edited_cp==lu){ x3(descale(x3() +dx)); y3(descale(y3() +dy)); }else if(_edited_cp==lb){ x1(descale(x1() +dx)); y1(descale(y1() +dy)); }else if(_edited_cp==rb){ x2(descale(x2() +dx)); y2(descale(y2() +dy)); } } bool proc_arc::dentro_bb(float x, float y, float w , float h){ float xcent=xstart()+((xend()-xstart())/2); float ycent=ystart()+((yend()-ystart())/2); if(xcent>x && xcenty && ycent& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(x1()); x.push_back(x2()); x.push_back(x3()); x.push_back(x4()); x.push_back(xstart()); x.push_back(xend()); y.push_back(y1()); y.push_back(y2()); y.push_back(y3()); y.push_back(y4()); y.push_back(ystart()); y.push_back(yend()); calc_bb_gen(x,y,ld,ru); } void proc_arc::get_visual_bounding_box(std::pair& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(visual_x1()); x.push_back(visual_x2()); x.push_back(visual_x3()); x.push_back(visual_x4()); x.push_back(visual_xstart()); x.push_back(visual_xend()); y.push_back(visual_y1()); y.push_back(visual_y2()); y.push_back(visual_y3()); y.push_back(visual_y4()); y.push_back(visual_ystart()); y.push_back(visual_yend()); calc_bb_gen(x,y,ld,ru); } void proc_arc::get_phys_bounding_box(std::pair& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(phys_x1()); x.push_back(phys_x2()); x.push_back(phys_x3()); x.push_back(phys_x4()); x.push_back(phys_xstart()); x.push_back(phys_xend()); y.push_back(phys_y1()); y.push_back(phys_y2()); y.push_back(phys_y3()); y.push_back(phys_y4()); y.push_back(phys_ystart()); y.push_back(phys_yend()); calc_bb_gen(x,y,ld,ru); } void proc_arc::disegna(){ // fl_color(255, 0, 0); // ( (w() - w()/scala_bb)/2 ) /* fl_rect( static_cast(rintf(posx() - ( (w() - w()/scala_bb)/2 ) )), static_cast(rintf(posy()- ( (h() - h()/scala_bb)/2 ) )), static_cast(rintf( (w() - w()/scala_bb) )) , static_cast(rintf( (h() - h()/scala_bb) ))) ; fl_pie( static_cast(rintf(x1())), static_cast(rintf(y1())), 4,4,0,360); fl_pie( static_cast(rintf(x2())), static_cast(rintf(y2())), 4,4,0,360); fl_pie( static_cast(rintf(x3())), static_cast(rintf(y3())), 4,4,0,360); fl_pie( static_cast(rintf(x4())), static_cast(rintf(y4())), 4,4,0,360); */ if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); if(dash()>0){ const double dash_gap[1]={dash()}; cairo_set_dash(cn,dash_gap,1,0); } cairo_set_line_width(cn,spessore()); cairo_set_source_rgb(cn,remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb()) ); cairo_move_to(cn,xstart(),ystart()); cairo_curve_to(cn,x1(),y1(), x2(),y2(), xend(),yend()); cairo_stroke(cn); //context->clear_path(); cairo_move_to(cn,xend(),yend()); cairo_curve_to(cn,x4(),y4(), x3(),y3(), xstart(),ystart()); cairo_stroke(cn); //context->clear_path(); //context->set_line_width(1); cairo_restore(cn); }else{ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float the_zoom=__pref.getZoom(); int vero_spessore=static_cast(rintf(spessore()*the_zoom)); //float dx_sc=posx()+w()/2; //float dy_sc=posy()+h()/2; if(vero_spessore<=0){ vero_spessore=1; } //fl_color(255, 0, 0); //fl_pie((int)posx()+dx_scroll,(int)posy()+dy_scroll,3,3,0,360); //fl_color(0, 0, 255); //fl_pie((int)visual_posx()+dx_scroll,(int)visual_posy()+dy_scroll,3,3,0,360); /* float v_xstart=xstart()*the_zoom; float v_ystart=ystart()*the_zoom; float v_xend=xend()*the_zoom; float v_yend=yend()*the_zoom; float v_x1=x1()*the_zoom; float v_y1=y1()*the_zoom; float v_x2=x2()*the_zoom; float v_y2=y2()*the_zoom; float v_x3=x3()*the_zoom; float v_y3=y3()*the_zoom; float v_x4=x4()*the_zoom; float v_y4=y4()*the_zoom; */ fl_color(cr(), cg(), cb()); char gap_dash[2]={dash(),0}; fl_line_style(FL_SOLID, vero_spessore,gap_dash); fl_begin_line(); fl_curve(xstart()+dx_scroll, ystart()+dy_scroll, x1()+dx_scroll, y1()+dy_scroll, x2()+dx_scroll,y2()+dy_scroll, xend()+dx_scroll, yend()+dy_scroll); fl_end_line(); fl_begin_line(); fl_curve(xstart()+dx_scroll, ystart()+dy_scroll, x3()+dx_scroll, y3()+dy_scroll, x4()+dx_scroll,y4()+dy_scroll, xend()+dx_scroll, yend()+dy_scroll); fl_end_line(); fl_line_style(0); draw_shadowed_point(x1()+dx_scroll, y1()+dy_scroll,255,0,0); draw_shadowed_point(x2()+dx_scroll, y2()+dy_scroll,255,0,0); draw_shadowed_point(x3()+dx_scroll, y3()+dy_scroll,255,0,0); draw_shadowed_point(x4()+dx_scroll, y4()+dy_scroll,255,0,0); } } void proc_arc::trasla(float dx, float dy){ //cout << "TRTRT" << endl; xstart(descale(xstart()+dx)); ystart(descale(ystart()+dy)); xend(descale(xend()+dx)); yend(descale(yend()+dy)); x1(descale(x1()+dx)); y1(descale(y1()+dy)); x2(descale(x2()+dx)); y2(descale(y2()+dy)); x3(descale(x3()+dx)); y3(descale(y3()+dy)); x4(descale(x4()+dx)); y4(descale(y4()+dy)); } void proc_arc::phys_translate(float dx, float dy){ xstart(phys_xstart()+dx); ystart(phys_ystart()+dy); xend(phys_xend()+dx); yend(phys_yend()+dy); x1(phys_x1()+dx); y1(phys_y1()+dy); x2(phys_x2()+dx); y2(phys_y2()+dy); x3(phys_x3()+dx); y3(phys_y3()+dy); x4(phys_x4()+dx); y4(phys_y4()+dy); } /** *Scala l'oggetto * *\param sc il fattore di scala */ void proc_arc::scale(float sc){ xstart(phys_xstart()*sc); ystart(phys_ystart()*sc); xend(phys_xend()*sc); yend(phys_yend()*sc); x1(phys_x1()*sc); y1(phys_y1()*sc); x2(phys_x2()*sc); y2(phys_y2()*sc); x3(phys_x3()*sc); y3(phys_y3()*sc); x4(phys_x4()*sc); y4(phys_y4()*sc); } /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in radianti */ void proc_arc::ruota(float xpiv, float ypiv, float angl){ xpivot(xpiv/__pref.getZoom()); ypivot(ypiv/__pref.getZoom()); angolorot(angl); //cout << "RUOTA: " < xtmp; xtmp.push_back(x1()); xtmp.push_back(x2()); xtmp.push_back(x3()); xtmp.push_back(x4()); xtmp.push_back(xstart()); xtmp.push_back(xend()); return (*min_element(xtmp.begin(),xtmp.end())); } float proc_arc::minima_y(){ vector ytmp; ytmp.push_back(y1()); ytmp.push_back(y2()); ytmp.push_back(y3()); ytmp.push_back(y4()); ytmp.push_back(ystart()); ytmp.push_back(yend()); return (*min_element(ytmp.begin(),ytmp.end())); } void proc_arc::write_native_format(std::ostream& stream, std::string indent){ stream << indent << ETIC_ARC << " " << APRI << indent << "\t" << id() << SEP << phys_xstart() << std::endl << indent << "\t" << SEP << phys_ystart() << SEP << phys_xend() << std::endl << indent << "\t" << SEP << phys_yend() << SEP << phys_x1() << std::endl << indent << "\t" << SEP << phys_y1() << SEP << phys_x2() << std::endl << indent << "\t" << SEP << phys_y2() << SEP << phys_x3() << std::endl << indent << "\t" << SEP << phys_y3() << SEP << phys_x4() << std::endl << indent << "\t" << SEP << phys_y4() << SEP << cr() << std::endl << indent << "\t" << SEP << cg() << SEP << cb() << std::endl << indent << "\t" << SEP << xpivot() << SEP << ypivot() << std::endl << indent << "\t" << SEP << angolorot() << SEP << spessore() << std::endl << indent << "\t" << SEP << dash() << CHIUDI << std::endl; } const float proc_arc::scala_bb=2; /*********************proc_arrow*******************/ proc_arrow::proc_arrow() :procedura(PROC_ARROW), _arr_w(__pref.get_arr_w()), _arr_h(__pref.get_arr_h()), _arr_gap(__pref.get_arr_gap()), _edited_cp(none) { } proc_arrow::proc_arrow(const proc_arrow* altro) :procedura(*altro), _id(altro->_id), _posx(altro->_posx), _posy(altro->_posy), _eposx(altro->_eposx), _eposy(altro->_eposy), _cr(altro->_cr), _cb(altro->_cb), _cg(altro->_cg), _xpivot(altro->_xpivot), _ypivot(altro->_ypivot), _angolorot(altro->_angolorot), _spessore(altro->_spessore), _dash(altro->_dash), _punte(altro->_punte), _arr_w(altro->_arr_w), _arr_h(altro->_arr_h), _arr_gap(altro->_arr_gap), _edited_cp(altro->_edited_cp) { } proc_arrow::proc_arrow(int id,float posx, float posy, float eposx,float eposy, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt, int punte, float arr_w, float arr_h, float arr_gap) :procedura(PROC_ARROW), _id(id), _posx(posx), _posy(posy), _eposx(eposx), _eposy(eposy), _cr(cr), _cb(cb), _cg(cg), _xpivot(xpiv), _ypivot(ypiv), _angolorot(anglrot), _spessore(spess), _dash(tratt), _punte(punte), _arr_w(arr_w), _arr_h(arr_h), _arr_gap(arr_gap), _edited_cp(none) { } proc_arrow::~proc_arrow(){ #ifdef DEBUG cout << "distruzione arrow" << endl; #endif } void proc_arrow::init(){ ruota(xpivot(),ypivot(),angolorot()); } /*ritorna i valori*/ int proc_arrow::id(){ return _id; } float proc_arrow::posx(){ if(cairo_t_singleton::can_export()){ return phys_posx(); }else{ return visual_posx(); } } float proc_arrow::visual_posx(){ return phys_posx() * __pref.getZoom(); } float proc_arrow::phys_posx(){ return _posx; } float proc_arrow::posy(){ if(cairo_t_singleton::can_export()){ return phys_posy(); }else{ return visual_posy(); } } float proc_arrow::visual_posy(){ return phys_posy() * __pref.getZoom(); } float proc_arrow::phys_posy(){ return _posy; } float proc_arrow::eposx(){ if(cairo_t_singleton::can_export()){ return phys_eposx(); }else{ return visual_eposx(); } } float proc_arrow::visual_eposx(){ return phys_eposx() * __pref.getZoom(); } float proc_arrow::phys_eposx(){ return _eposx; } float proc_arrow::eposy(){ if(cairo_t_singleton::can_export()){ return phys_eposy(); }else{ return visual_eposy(); } } float proc_arrow::visual_eposy(){ return phys_eposy() * __pref.getZoom(); } float proc_arrow::phys_eposy(){ return _eposy; } float proc_arrow::w(){ if(cairo_t_singleton::can_export()){ return phys_w(); }else{ return visual_w(); } } float proc_arrow::visual_w(){ return visual_eposx() - visual_posx(); } float proc_arrow::phys_w(){ return phys_eposx() - phys_posx(); } void proc_arrow::arrows_points(std::vector& x, std::vector& y){ switch(punte()){ case ARR_OMOL_PUNT: calculate_arrow_points(posx(),posy(), eposx(),eposy(),spessore(),arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(),x,y ); break; case ARR_ETEROL_PUNT: calculate_arrow_points(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(),x,y, true); calculate_arrow_points(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(),x,y, false); break; case ARR_EQ: calculate_equilibrium_arrows(x,y); break; case ARR_DOUBLE: calculate_arrow_points(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, true); calculate_arrow_points(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, false); calculate_arrow_points(eposx(),eposy(), posx(),posy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, true); calculate_arrow_points(eposx(),eposy(), posx(),posy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, false); break; case ARR_BLOC: { calculate_arrow_points(posx(),posy(),eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, true); calculate_arrow_points(posx(),posy(),eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, false); } break; default: break; } } float proc_arrow::h(){ if(cairo_t_singleton::can_export()){ return phys_h(); }else{ return visual_h(); } } float proc_arrow::visual_h(){ return visual_eposy() - visual_posy(); } float proc_arrow::phys_h(){ return phys_eposy() - phys_posy(); } int proc_arrow::cr(){ return _cr; } int proc_arrow::cb(){ return _cb; } int proc_arrow::cg(){ return _cg; } float proc_arrow::xpivot(){ return _xpivot; } float proc_arrow::ypivot(){ return _ypivot; } float proc_arrow::angolorot(){ return _angolorot; } int proc_arrow::spessore(){ return _spessore; } int proc_arrow::dash(){ return _dash; } int proc_arrow::punte(){ return _punte; } float proc_arrow::arr_w(){ return _arr_w; } float proc_arrow::arr_h(){ return _arr_h; } float proc_arrow::arr_gap(){ return _arr_gap; } /*setta i valori*/ void proc_arrow::id(int nw){ _id=nw; } void proc_arrow::posx(float nw){ _posx=nw; } void proc_arrow::posy(float nw){ _posy=nw; } void proc_arrow::eposx(float nw){ _eposx=nw; } void proc_arrow::eposy(float nw){ _eposy=nw; } void proc_arrow::cr(int nw){ _cr=nw; } void proc_arrow::cb(int nw){ _cb=nw; } void proc_arrow::cg(int nw){ _cg=nw; } void proc_arrow::xpivot(float nw){ _xpivot=nw; } void proc_arrow:: ypivot(float nw){ _ypivot=nw; } void proc_arrow::angolorot(float nw){ _angolorot=nw; } void proc_arrow::spessore(int nw){ _spessore=nw; } void proc_arrow::dash(int nw){ _dash=nw; } void proc_arrow::punte(int nw){ _punte=nw; } void proc_arrow::w(float nw){ } void proc_arrow::h(float nw){ } void proc_arrow::arr_w(float nw){ _arr_w=nw; } void proc_arrow::arr_h(float nw){ _arr_h=nw; } void proc_arrow::arr_gap(float nw){ if(nw<0){ nw=0; } if(nw>1){ nw=1; } _arr_gap=nw; } int proc_arrow::sotto_mouse(int posx_m, int posy_m){ int sensleg=__pref.get_sensib_leg(); bool res=line_belongs(posx_m, posy_m, posx(),posy(), eposx(),eposy(), sensleg+spessore()); if(res){ return id(); }else{ return -1; } } bool proc_arrow::dentro_bb(float x, float y, float w , float h){ if(posx()>x && posx()y && posy()x && eposx()y && eposy()& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(posx()); x.push_back(eposx()); y.push_back(posy()); y.push_back(eposy()); calc_bb_gen(x,y,ld,ru); } void proc_arrow::get_visual_bounding_box(std::pair& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(visual_posx()); x.push_back(visual_eposx()); y.push_back(visual_posy()); y.push_back(visual_eposy()); calc_bb_gen(x,y,ld,ru); } void proc_arrow::get_phys_bounding_box(std::pair& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(phys_posx()); x.push_back(phys_eposx()); y.push_back(phys_posy()); y.push_back(phys_eposy()); /* for(unsigned int i=0;i(posx_m),_tolerance_hit_control_point) && similar_to(posy(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=beg; return id(); }else if(similar_to(eposx(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(eposy(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=end; return id(); }else{ return -1; } } void proc_arrow::unset_edit_control_point(){ _edited_cp=none; } void proc_arrow::control_point_transl(float dx, float dy){ if(_edited_cp==beg){ posx(descale(posx()+dx)); posy(descale(posy()+dy)); }else if(_edited_cp==end){ eposx(descale(eposx()+dx)); eposy(descale(eposy()+dy)); } } void proc_arrow::disegna(){ char gap_dash[2]={dash(),0}; float the_zoom=__pref.getZoom(); int vero_spessore=static_cast(rintf(spessore()*the_zoom)); if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb()) ); cairo_set_line_width(cn,spessore()); if(dash()>0){ const double dash_gap[1]={dash()}; cairo_set_dash(cn,dash_gap,1,0); } cairo_move_to(cn,posx(),posy()); cairo_line_to(cn,eposx(),eposy()); cairo_stroke(cn); cairo_restore(cn); }else{ //float dx_sc=posx()+w()/2; //float dy_sc=posy()+h()/2; if(vero_spessore<=0){ vero_spessore=1; } //trasla(-dx_sc,-dy_sc); //trasla(dx_sc,dy_sc); int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); fl_color(cr(), cg(), cb()); fl_line_style(FL_SOLID, vero_spessore,gap_dash); float v_posx=posx();//*the_zoom; float v_posy=posy();//*the_zoom; float v_eposx=eposx();//*the_zoom; float v_eposy=eposy();//*the_zoom; fl_line(static_cast( rintf( v_posx+dx_scroll ) ), static_cast( rintf( v_posy+dy_scroll ) ), static_cast( rintf( v_eposx+dx_scroll ) ), static_cast( rintf( v_eposy+dy_scroll ) ) ); fl_line_style(0); } switch(punte()){ case ARR_OMOL_PUNT: draw_arrow(posx(),posy(), eposx(),eposy(),spessore(),arr_w(),arr_h(),arr_gap(), cr(),cg(),cb() ); break; case ARR_ETEROL_PUNT: draw_arrow(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(), true); draw_arrow(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(), false); break; case ARR_EQ: disegna_equilibrio(); break; case ARR_DOUBLE: draw_arrow(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(posx(),posy(), eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); draw_arrow(eposx(),eposy(), posx(),posy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(eposx(),eposy(), posx(),posy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); break; case ARR_BLOC: { fl_line_style(FL_SOLID, vero_spessore,gap_dash); draw_arrow(posx(),posy(),eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(posx(),posy(),eposx(),eposy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); fl_line_style(FL_SOLID, vero_spessore); float xmezzo=(eposx()-posx())/2.0; float ymezzo=(eposy()-posy())/2.0; float lungfr=sqrt( pow(eposx()-posx(),2.0f) + pow(eposy()-posy(),2.0f) ); float angl=atan2(eposy()-posy(),eposx()-posx())+M_PI/4.0; for(int i=0;i<4;i++,angl+=M_PI/2){ if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb()) ); cairo_set_line_width(cn,spessore()); cairo_move_to(cn,xmezzo+posx(),ymezzo+posy()); cairo_line_to(cn,(lungfr/4.0) * cos(angl) + xmezzo +posx(), (lungfr/4.0) * sin(angl) + ymezzo +posy()); cairo_stroke(cn); cairo_restore(cn); }else{ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float p1x=xmezzo; float p1y=ymezzo; float p2x=(lungfr/4.0) * cos(angl) + xmezzo; float p2y=(lungfr/4.0) * sin(angl) + ymezzo; fl_line(static_cast(rintf((p1x+posx())))+dx_scroll, static_cast(rintf((p1y+posy())))+dy_scroll, static_cast(rintf((p2x+posx())))+dx_scroll, static_cast(rintf((p2y+posy())))+dy_scroll); } } break; } default: break; } if(!cairo_t_singleton::can_export()){ fl_line_style(0); } } void proc_arrow::disegna_equilibrio(){ char gap_dash[2]={dash(),0}; float the_zoom=__pref.getZoom(); int vero_spessore= cairo_t_singleton::can_export()? spessore() : static_cast(rintf(spessore()*the_zoom)); float eq_spacing=cairo_t_singleton::can_export() ? EQU_SPACING : EQU_SPACING *the_zoom; if(vero_spessore<=0){ vero_spessore=1; } fl_line_style(FL_SOLID,vero_spessore,gap_dash); float m; float q; bool risultato=rett_eqn(0,0, eposx()-posx(),eposy()-posy(), m,q); if(risultato){ m=-1/m; float disx=eq_spacing*cos(atan(m)); float disy=eq_spacing*sin(atan(m)); if(cairo_t_singleton::get_context()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb()) ); cairo_set_line_width(cn,spessore()); if(dash()>0){ double dash_gap[1]={dash()}; cairo_set_dash(cn,dash_gap,1,0); } cairo_move_to(cn,posx() + disx, posy() + disy); cairo_line_to(cn,eposx() + disx, eposy() + disy); cairo_stroke(cn); cairo_restore(cn); draw_arrow(posx(),posy(),eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(posx(),posy(),eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); draw_arrow(eposx()+ disx,eposy()+disy,posx()+ disx, posy()+disy,vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(eposx()+ disx,eposy()+disy,posx()+ disx, posy()+disy,vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); }else{ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float p1x=posx() + disx; float p1y=posy() + disy; float p2x=eposx() + disx; float p2y=eposy() + disy; fl_line(static_cast( rintf(p1x)+dx_scroll), static_cast( rintf(p1y)+dy_scroll), static_cast( rintf(p2x)+dx_scroll), static_cast( rintf(p2y)+dy_scroll)); draw_arrow(posx(),posy(), eposx(),eposy(), vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(posx(),posy(), eposx(),eposy(), vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); draw_arrow(p2x,p2y, p1x,p1y, vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(p2x,p2y, p1x,p1y, vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); } }else{ //if(risultato) == false if(cairo_t_singleton::get_context()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb()) ); cairo_set_line_width(cn,spessore()); if(dash()>0){ double dash_gap[1]={dash()}; cairo_set_dash(cn,dash_gap,1,0); } cairo_move_to(cn,posx() + eq_spacing , posy()); cairo_line_to(cn,eposx() + eq_spacing , eposy()); cairo_stroke(cn); cairo_restore(cn); }else{ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); fl_line(static_cast( rintf( posx()+dx_scroll+ eq_spacing) ), static_cast( rintf( posy()+dy_scroll ) ), static_cast( rintf( eposx()+dx_scroll + eq_spacing) ), static_cast( rintf( eposy()+dy_scroll ) ) ); } if(posy()>eposy()){ draw_arrow(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); draw_arrow(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),true); draw_arrow(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),false); }else{ draw_arrow(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), true); draw_arrow(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), false); draw_arrow(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),true); draw_arrow(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),false); } } if(! cairo_t_singleton::can_export()){ fl_line_style(0); } } //////// void proc_arrow::calculate_equilibrium_arrows(vector& x, vector& y){ char gap_dash[2]={dash(),0}; float the_zoom=__pref.getZoom(); int vero_spessore= cairo_t_singleton::can_export()? spessore() : static_cast(rintf(spessore()*the_zoom)); float eq_spacing=cairo_t_singleton::can_export() ? EQU_SPACING : EQU_SPACING *the_zoom; if(vero_spessore<=0){ vero_spessore=1; } fl_line_style(FL_SOLID,vero_spessore,gap_dash); float m; float q; bool risultato=rett_eqn(0,0, eposx()-posx(),eposy()-posy(), m,q); if(risultato){ m=-1/m; float disx=eq_spacing*cos(atan(m)); float disy=eq_spacing*sin(atan(m)); float p1x=posx() + disx; float p1y=posy() + disy; float p2x=eposx() + disx; float p2y=eposy() + disy; calculate_arrow_points(posx(),posy(), eposx(),eposy(), vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), x,y, true); calculate_arrow_points(posx(),posy(), eposx(),eposy(), vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), x,y, false); calculate_arrow_points(p2x,p2y, p1x,p1y, vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), x,y, true); calculate_arrow_points(p2x,p2y, p1x,p1y, vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), x,y, false); }else{ //if(risultato) == false if(posy()>eposy()){ calculate_arrow_points(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), x,y, true); calculate_arrow_points(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(), x,y, false); calculate_arrow_points(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y,true); calculate_arrow_points(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y,false); }else{ calculate_arrow_points(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, true); calculate_arrow_points(posx(),posy(), eposx(),eposy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y, false); calculate_arrow_points(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y,true); calculate_arrow_points(eposx()+ eq_spacing ,eposy(), posx()+ eq_spacing ,posy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y,false); } } } void proc_arrow::trasla(float dx, float dy){ posx(descale(posx()+dx)); posy(descale(posy()+dy)); eposx(descale(eposx()+dx)); eposy(descale(eposy()+dy)); } void proc_arrow::phys_translate(float dx, float dy){ posx(phys_posx()+dx); posy(phys_posy()+dy); eposx(phys_eposx()+dx); eposy(phys_eposy()+dy); } /** *Scala l'oggetto * *\param sc il fattore di scala */ void proc_arrow::scale(float sc){ posx(phys_posx()*sc); posy(phys_posy()*sc); eposx(phys_eposx()*sc); eposy(phys_eposy()*sc); } /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in radianti */ void proc_arrow::ruota(float xpiv, float ypiv, float angl){ xpivot(xpiv/__pref.getZoom()); ypivot(ypiv/__pref.getZoom()); angolorot(angl); //cout << "RUOTA: " <_id), _ix(altro->_ix), _iy(altro->_iy), _tan1x(altro->_tan1x), _tan1y(altro->_tan1y), _tan2x(altro->_tan2x), _tan2y(altro->_tan2y), _ex(altro->_ex), _ey(altro->_ey), _cr(altro->_cr), _cb(altro->_cb), _cg(altro->_cg), _xpivot(altro->_xpivot), _ypivot(altro->_ypivot), _angolorot(altro->_angolorot), _spessore(altro->_spessore), _dash(altro->_dash), _punte(altro->_punte), _arr_w(altro->_arr_w), _arr_h(altro->_arr_h), _arr_gap(altro->_arr_gap), _edited_cp(altro->_edited_cp) { } /** * *Costruisce l'oggetto freccia. *\param id id della procedura, la identifica univocamente *\param ix ascissa del punto di partenza della curva *\param iy ordinata del punto di partenza della curva * *\param tan1x ascissa della prima tangente. *\param tan1y ordinata della prima tangente. * *\param tan2x ascissa della seconda tangente. *\param tan2y ordinata della seconda tangente. * *\param ex ascissa del punto di arrivo della curva *\param ex ordinata del punto di arrivo della curva * *\param cr componente rossa del colore della procedura *\param cg componente verde del colore della procedura *\param cb componente blu del colore della procedura *\param xpiv ascissa dell'asse di rotazione. *\param ypiv ordinata dell'asse di rotazione *\param anglrot l'angolo di rotazione in radianti ed in senso orario *\param spess spessore in px della "penna" *\param tratt lunghezza del tratteggio (nota: 0 nessun tratteggio). *\param punte numero di punte delle freccie, puo' assumere i valori: * *
    * *
  • ARR_NO_PUNT nessuna punta * *
  • ARR_OMOL_PUNT scissione omolitica * *
  • ARR_ETEROL_PUNT scissione eterolitica * *
* */ proc_bezier::proc_bezier(int id,float ix, float iy, float tang1x, float tang1y, float tang2x, float tang2y, float ex, float ey, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt, int punte, float arr_w, float arr_h, float arr_gap) :procedura(PROC_BEZIER), _id(id), _ix(ix), _iy(iy), _tan1x(tang1x), _tan1y(tang1y), _tan2x(tang2x), _tan2y(tang2y), _ex(ex), _ey(ey), _cr(cr), _cb(cb), _cg(cg), _xpivot(xpiv), _ypivot(ypiv), _angolorot(anglrot), _spessore(spess), _dash(tratt), _punte(punte), _arr_w(arr_w), _arr_h(arr_h), _arr_gap(arr_gap), _edited_cp(none) { } /** *Distruttore */ proc_bezier::~proc_bezier(){ //cout << "eliminata bezier" << endl; } void proc_bezier::init(){ ruota(xpivot(),ypivot(),angolorot()); } /*ritorna i valori*/ int proc_bezier::id(){ return _id; } float proc_bezier::ix(){ if(cairo_t_singleton::can_export()){ return phys_ix(); }else{ return visual_ix(); } } float proc_bezier::visual_ix(){ return phys_ix() * __pref.getZoom(); } float proc_bezier::phys_ix(){ return _ix; } float proc_bezier::iy(){ if(cairo_t_singleton::can_export()){ return phys_iy(); }else{ return visual_iy(); } } float proc_bezier::visual_iy(){ return phys_iy() * __pref.getZoom(); } float proc_bezier::phys_iy(){ return _iy; } float proc_bezier::tan1x(){ if(cairo_t_singleton::can_export()){ return phys_tan1x(); }else{ return visual_tan1x(); } } float proc_bezier::visual_tan1x(){ return phys_tan1x() * __pref.getZoom(); } float proc_bezier::phys_tan1x(){ return _tan1x; } float proc_bezier::tan1y(){ if(cairo_t_singleton::can_export()){ return phys_tan1y(); }else{ return visual_tan1y(); } } float proc_bezier::visual_tan1y(){ return phys_tan1y() * __pref.getZoom(); } float proc_bezier::phys_tan1y(){ return _tan1y; } float proc_bezier::tan2x(){ if(cairo_t_singleton::can_export()){ return phys_tan2x(); }else{ return visual_tan2x(); } } float proc_bezier::visual_tan2x(){ return phys_tan2x() * __pref.getZoom(); } float proc_bezier::phys_tan2x(){ return _tan2x; } float proc_bezier::tan2y(){ if(cairo_t_singleton::can_export()){ return phys_tan2y(); }else{ return visual_tan2y(); } } float proc_bezier::visual_tan2y(){ return phys_tan2y() * __pref.getZoom(); } float proc_bezier::phys_tan2y(){ return _tan2y; } float proc_bezier::ex(){ if(cairo_t_singleton::can_export()){ return phys_ex(); }else{ return visual_ex(); } } float proc_bezier::visual_ex(){ return phys_ex() * __pref.getZoom(); } float proc_bezier::phys_ex(){ return _ex; } float proc_bezier::ey(){ if(cairo_t_singleton::can_export()){ return phys_ey(); }else{ return visual_ey(); } } float proc_bezier::visual_ey(){ return phys_ey() * __pref.getZoom(); } float proc_bezier::phys_ey(){ return _ey; } float proc_bezier::w(){ vector xtmp; xtmp.push_back(ix()); xtmp.push_back(ex()); xtmp.push_back(tan1x()); xtmp.push_back(tan2x()); float wtmp=(*max_element(xtmp.begin(),xtmp.end())) - (*min_element(xtmp.begin(),xtmp.end())); return wtmp; } float proc_bezier::visual_w(){ vector xtmp; xtmp.push_back(visual_ix()); xtmp.push_back(visual_ex()); xtmp.push_back(visual_tan1x()); xtmp.push_back(visual_tan2x()); float wtmp=(*max_element(xtmp.begin(),xtmp.end())) - (*min_element(xtmp.begin(),xtmp.end())); return wtmp; } float proc_bezier::phys_w(){ vector xtmp; xtmp.push_back(phys_ix()); xtmp.push_back(phys_ex()); xtmp.push_back(phys_tan1x()); xtmp.push_back(phys_tan2x()); float wtmp=(*max_element(xtmp.begin(),xtmp.end())) - (*min_element(xtmp.begin(),xtmp.end())); return wtmp; } float proc_bezier::h(){ vector ytmp; ytmp.push_back(visual_iy()); ytmp.push_back(visual_ey()); ytmp.push_back(visual_tan1y()); ytmp.push_back(visual_tan2y()); float wtmp=(*max_element(ytmp.begin(),ytmp.end())) - (*min_element(ytmp.begin(),ytmp.end())); return wtmp; } float proc_bezier::visual_h(){ vector ytmp; ytmp.push_back(visual_iy()); ytmp.push_back(visual_ey()); ytmp.push_back(visual_tan1y()); ytmp.push_back(visual_tan2y()); float wtmp=(*max_element(ytmp.begin(),ytmp.end())) - (*min_element(ytmp.begin(),ytmp.end())); return wtmp; } float proc_bezier::phys_h(){ vector ytmp; ytmp.push_back(phys_iy()); ytmp.push_back(phys_ey()); ytmp.push_back(phys_tan1y()); ytmp.push_back(phys_tan2y()); float wtmp=(*max_element(ytmp.begin(),ytmp.end())) - (*min_element(ytmp.begin(),ytmp.end())); return wtmp; } int proc_bezier::cr(){ return _cr; } int proc_bezier::cb(){ return _cb; } int proc_bezier::cg(){ return _cg; } float proc_bezier::xpivot(){ return _xpivot; } float proc_bezier::ypivot(){ return _ypivot; } float proc_bezier::angolorot(){ return _angolorot; } int proc_bezier::spessore(){ return _spessore; } int proc_bezier::dash(){ return _dash; } int proc_bezier::punte(){ return _punte; } float proc_bezier::arr_w(){ return _arr_w; } float proc_bezier::arr_h(){ return _arr_h; } float proc_bezier::arr_gap(){ return _arr_gap; } float proc_bezier::posx(){ vector xtmp; xtmp.push_back(ix()); xtmp.push_back(ex()); xtmp.push_back(tan1x()); xtmp.push_back(tan2x()); return (*min_element(xtmp.begin(),xtmp.end())); } float proc_bezier::visual_posx(){ vector xtmp; xtmp.push_back(visual_ix()); xtmp.push_back(visual_ex()); xtmp.push_back(visual_tan1x()); xtmp.push_back(visual_tan2x()); return (*min_element(xtmp.begin(),xtmp.end())); } float proc_bezier::phys_posx(){ vector xtmp; xtmp.push_back(phys_ix()); xtmp.push_back(phys_ex()); xtmp.push_back(phys_tan1x()); xtmp.push_back(phys_tan2x()); return (*min_element(xtmp.begin(),xtmp.end())); } float proc_bezier::posy(){ vector ytmp; ytmp.push_back(iy()); ytmp.push_back(ey()); ytmp.push_back(tan1y()); ytmp.push_back(tan2y()); return (*min_element(ytmp.begin(),ytmp.end())); } float proc_bezier::visual_posy(){ vector ytmp; ytmp.push_back(visual_iy()); ytmp.push_back(visual_ey()); ytmp.push_back(visual_tan1y()); ytmp.push_back(visual_tan2y()); return (*min_element(ytmp.begin(),ytmp.end())); } float proc_bezier::phys_posy(){ vector ytmp; ytmp.push_back(phys_iy()); ytmp.push_back(phys_ey()); ytmp.push_back(phys_tan1y()); ytmp.push_back(phys_tan2y()); return (*min_element(ytmp.begin(),ytmp.end())); } /*set values*/ void proc_bezier::id(int nw){ _id=nw; } void proc_bezier::ix(float nw){ _ix=nw; } void proc_bezier::iy(float nw){ _iy=nw; } void proc_bezier::tan1x(float nw){ _tan1x=nw; } void proc_bezier::tan1y(float nw){ _tan1y=nw; } void proc_bezier::tan2x(float nw){ _tan2x=nw; } void proc_bezier::tan2y(float nw){ _tan2y=nw; } void proc_bezier::ex(float nw){ _ex=nw; } void proc_bezier::ey(float nw){ _ey=nw; } void proc_bezier::cr(int nw){ _cr=nw; } void proc_bezier::cb(int nw){ _cb=nw; } void proc_bezier::cg(int nw){ _cg=nw; } void proc_bezier::xpivot(float nw){ _xpivot=nw; } void proc_bezier::ypivot(float nw){ _ypivot=nw; } void proc_bezier::angolorot(float nw){ _angolorot=nw; } void proc_bezier::spessore(int nw){ _spessore=nw; } void proc_bezier::dash(int nw){ _dash=nw; } void proc_bezier::punte(int nw){ _punte=nw; } void proc_bezier::arr_w(float nw){ _arr_w=nw; } void proc_bezier::arr_h(float nw){ _arr_h=nw; } void proc_bezier::arr_gap(float nw){ if(nw<0){ nw=0; } if(nw>1){ nw=1; } _arr_gap=nw; } int proc_bezier::sotto_mouse(int posx_m, int posy_m){ vector xtmp; xtmp.push_back(ix()); xtmp.push_back(ex()); xtmp.push_back(tan1x()); xtmp.push_back(tan2x()); float minx=(*min_element(xtmp.begin(),xtmp.end())); vector ytmp; ytmp.push_back(iy()); ytmp.push_back(ey()); ytmp.push_back(tan1y()); ytmp.push_back(tan2y()); float miny=(*min_element(ytmp.begin(),ytmp.end())); float ics_e= minx + (w()/(scala_bb*2.0)); float ips_e=miny + (h()/(scala_bb*2.0)); float w_e=(w() - w()/scala_bb); float h_e= (h() - h()/scala_bb); if(posx_m > ics_e && posx_m < ics_e+w_e && posy_m > ips_e && posy_m < ips_e+h_e){ return id(); }else{ return -1; } } void proc_bezier::control_point_transl(float dx, float dy){ if(_edited_cp==beg){ ix(descale(ix()+dx)); iy(descale(iy()+dy)); }else if(_edited_cp==tan1){ tan1x(descale(tan1x()+dx)); tan1y(descale(tan1y()+dy)); }else if(_edited_cp==tan2){ tan2x(descale(tan2x()+dx)); tan2y(descale(tan2y()+dy)); }else if(_edited_cp==end){ ex(descale(ex()+dx)); ey(descale(ey()+dy)); } } void proc_bezier::unset_edit_control_point(){ _edited_cp=none; } int proc_bezier::control_point_under_mouse(int posx_m, int posy_m){ if(similar_to(ix(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(iy(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=beg; return id(); }else if(similar_to(tan1x(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(tan1y(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=tan1; return id(); }else if(similar_to(tan2x(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(tan2y(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=tan2; return id(); }else if(similar_to(ex(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(ey(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=end; return id(); }else{ return -1; } } bool proc_bezier::dentro_bb(float x, float y, float w , float h){ float xcent=ix()+((ex()-ix())/2); float ycent=iy()+((ey()-iy())/2); if(xcent>x && xcenty && ycent& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(ix()); x.push_back(tan1x()); x.push_back(tan2x()); x.push_back(ex()); y.push_back(iy()); y.push_back(tan1y()); y.push_back(tan2y()); y.push_back(ey()); calc_bb_gen(x,y,ld,ru); } void proc_bezier::get_visual_bounding_box(std::pair& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(visual_ix()); x.push_back(visual_tan1x()); x.push_back(visual_tan2x()); x.push_back(visual_ex()); y.push_back(visual_iy()); y.push_back(visual_tan1y()); y.push_back(visual_tan2y()); y.push_back(visual_ey()); calc_bb_gen(x,y,ld,ru); } void proc_bezier::get_phys_bounding_box(std::pair& ld, std::pair& ru){ std::vector x; std::vector y; x.push_back(phys_ix()); x.push_back(phys_tan1x()); x.push_back(phys_tan2x()); x.push_back(phys_ex()); y.push_back(phys_iy()); y.push_back(phys_tan1y()); y.push_back(phys_tan2y()); y.push_back(phys_ey()); calc_bb_gen(x,y,ld,ru); } void proc_bezier::disegna(){ float the_zoom=__pref.getZoom(); int vero_spessore= cairo_t_singleton::can_export()? spessore() : static_cast(rintf(spessore()*the_zoom)); if(vero_spessore<=0){ vero_spessore=1; } if(cairo_t_singleton::get_context()){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb()) ); cairo_set_line_width(cn,spessore()); if(dash()>0){ double dash_gap[1]={dash()}; cairo_set_dash(cn,dash_gap,1,0); } cairo_move_to(cn,ix(),iy()); cairo_curve_to(cn,tan1x(),tan1y(), tan2x(),tan2y(), ex(),ey()); cairo_stroke(cn); cairo_restore(cn); }else{ char gap_dash[2]={dash(),0}; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); fl_color(cr(), cg(), cb()); fl_line_style(FL_SOLID, vero_spessore,gap_dash); fl_begin_line(); fl_curve(visual_ix()+dx_scroll, visual_iy()+dy_scroll, visual_tan1x()+dx_scroll, visual_tan1y()+dy_scroll, visual_tan2x()+dx_scroll, visual_tan2y()+dy_scroll, visual_ex()+dx_scroll, visual_ey()+dy_scroll); fl_end_line(); draw_shadowed_point(visual_tan1x()+dx_scroll, visual_tan1y()+dy_scroll,255,0,0); draw_shadowed_point(visual_tan2x()+dx_scroll, visual_tan2y()+dy_scroll,255,0,0); fl_line_style(0); fl_color(cr(), cg(), cb()); } switch(punte()){ case ARR_OMOL_PUNT: { if(cairo_t_singleton::can_export()){ std::pair intersection=correct_arrow_ps(true); draw_arrow(intersection.first, intersection.second, ex(),ey(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(), false); }else{ std::pair pt=poly_bezier(visual_ix(), visual_iy(), visual_tan1x(), visual_tan1y(), visual_tan2x(), visual_tan2y(), visual_ex(), visual_ey(), 1-PROC_BEZIER_OFFSETT_TANGENT_FOR_ARROW); draw_arrow(pt.first,pt.second, visual_ex(),visual_ey(), vero_spessore, arr_w(),arr_h(),arr_gap(), cr(),cg(),cb()); } break; } case ARR_DOUBLE: if(cairo_t_singleton::can_export()){ std::pair intersection=correct_arrow_ps(false); draw_arrow(intersection.first,intersection.second, ix(),iy(),spessore(),arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(), true); draw_arrow(intersection.first,intersection.second, ix(),iy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb()); }else{ std::pair tan_correct=poly_bezier(visual_ix(), visual_iy(), visual_tan1x(), visual_tan1y(), visual_tan2x(), visual_tan2y(), visual_ex(), visual_ey(), PROC_BEZIER_OFFSETT_TANGENT_FOR_ARROW); draw_arrow(tan_correct.first,tan_correct.second, visual_ix(),visual_iy(),vero_spessore, arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(), true); draw_arrow(tan_correct.first,tan_correct.second, visual_ix(),visual_iy(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb()); } case ARR_ETEROL_PUNT: if(cairo_t_singleton::can_export()){ std::pair intersection=correct_arrow_ps(true); draw_arrow(intersection.first, intersection.second, ex(),ey(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(), true); draw_arrow(intersection.first, intersection.second, ex(),ey(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb()); }else{ std::pair tan_correct=poly_bezier(visual_ix(), visual_iy(), visual_tan1x(), visual_tan1y(), visual_tan2x(), visual_tan2y(), visual_ex(), visual_ey(), 1-PROC_BEZIER_OFFSETT_TANGENT_FOR_ARROW); draw_arrow(tan_correct.first,tan_correct.second, visual_ex(),visual_ey(),vero_spessore, arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(), true); draw_arrow(tan_correct.first,tan_correct.second, visual_ex(),visual_ey(),vero_spessore, arr_w(),arr_h(),arr_gap(),cr(),cg(),cb()); } break; case ARR_BLOC: break; default: break; } if(!cairo_t_singleton::can_export()){ fl_line_style(0); } } void proc_bezier::arrows_points(std::vector& x, std::vector& y){ switch(punte()){ case ARR_OMOL_PUNT: { std::pair intersection=correct_arrow_ps(true); calculate_arrow_points(intersection.first, intersection.second, ex(),ey(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(),x,y, false); } break; case ARR_DOUBLE: { std::pair intersection=correct_arrow_ps(false); calculate_arrow_points(intersection.first,intersection.second, ix(),iy(),spessore(),arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(),x,y, true); calculate_arrow_points(intersection.first,intersection.second, ix(),iy(),spessore(), arr_w(),arr_h(),arr_gap(),cr(),cg(),cb(),x,y); } case ARR_ETEROL_PUNT: { std::pair intersection=correct_arrow_ps(true); calculate_arrow_points(intersection.first, intersection.second, ex(),ey(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(),x,y, true); calculate_arrow_points(intersection.first, intersection.second, ex(),ey(),spessore(), arr_w(),arr_h(),arr_gap(), cr(),cg(),cb(),x,y); } break; case ARR_BLOC: break; default: break; } } void proc_bezier::trasla(float dx, float dy){ ix(descale(ix()+dx)); iy(descale(iy()+dy)); tan1x(descale(tan1x()+dx)); tan1y(descale(tan1y()+dy)); tan2x(descale(tan2x()+dx)); tan2y(descale(tan2y()+dy)); ex(descale(ex()+dx)); ey(descale(ey()+dy)); } void proc_bezier::phys_translate(float dx, float dy){ ix(phys_ix()+dx); iy(phys_iy()+dy); tan1x(phys_tan1x()+dx); tan1y(phys_tan1y()+dy); tan2x(phys_tan2x()+dx); tan2y(phys_tan2y()+dy); ex(phys_ex()+dx); ey(phys_ey()+dy); } /** *Scala l'oggetto * *\param sc il fattore di scala */ void proc_bezier::scale(float sc){ ix(phys_ix()*sc); iy(phys_iy()*sc); tan1x(phys_tan1x()*sc); tan1y(phys_tan1y()*sc); tan2x(phys_tan2x()*sc); tan2y(phys_tan2y()*sc); ex(phys_ex()*sc); ey(phys_ey()*sc); } /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in radianti */ void proc_bezier::ruota(float xpiv, float ypiv, float angl){ xpivot(xpiv/__pref.getZoom()); ypivot(ypiv/__pref.getZoom()); angolorot(angl); //cout << "RUOTA: " < proc_bezier::correct_arrow_ps(bool end_curve){ float width_segment_arrow_gap=arr_w() - arr_gap() * arr_w(); static const float rotation_segment_arrow_rate=1E-2; static const float tol_intersect_arrow_seg_bezier=1E-1; static const float tol_l_r=0.00001f; float trasl_x=end_curve ? ex() : ix(); float trasl_y=end_curve ? ey() : iy(); float ix_t=ix()-trasl_x; float iy_t=iy()-trasl_y; float tan1x_t=tan1x()-trasl_x; float tan1y_t=tan1y()-trasl_y; float tan2x_t=tan2x()-trasl_x; float tan2y_t=tan2y()-trasl_y; float ex_t=ex()-trasl_x; float ey_t=ey()-trasl_y; pair intersection; bool intersection_found=false; for(float ang=0;ang<=3*M_PI;ang+=rotation_segment_arrow_rate){ bool binary_can_run=true; std::pair rotated_seg_pair=rotate_point(0, width_segment_arrow_gap, ang); //std::cerr << "ang : " << ang << std::endl; float l_th=0; float r_th=1; std::pair curve_l=poly_bezier(ix_t,iy_t, tan1x_t,tan1y_t, tan2x_t,tan2y_t, ex_t,ey_t, l_th); std::pair curve_r=poly_bezier(ix_t,iy_t, tan1x_t,tan1y_t, tan2x_t,tan2y_t, ex_t,ey_t, r_th); std::pair curve_m; while(binary_can_run){ float m = l_th + ((r_th - l_th)/2.0); curve_m=poly_bezier(ix_t,iy_t, tan1x_t,tan1y_t, tan2x_t,tan2y_t, ex_t,ey_t, m); /* cerr << "curve_m.first=" << curve_m.first << std::endl; cerr << "curve_l.first=" << curve_l.first << std::endl; cerr << "curve_r.first=" << curve_r.first << std::endl; cerr << "m " << m << std::endl; cerr << "r_th " << r_th << std::endl; cerr << "l_th " << l_th << std::endl; */ if(curve_m.first > rotated_seg_pair.first){ r_th=m; //cerr << "set m= r_th" << std::endl; }else{ //cerr << "set m= l_th" << std::endl; l_th=m; } curve_l=poly_bezier(ix_t,iy_t, tan1x_t,tan1y_t, tan2x_t,tan2y_t, ex_t,ey_t, l_th); curve_r=poly_bezier(ix_t,iy_t, tan1x_t,tan1y_t, tan2x_t,tan2y_t, ex_t,ey_t, r_th); /* std::cerr << "l: " << l_th << " r: " < proc_bezier::correct_arrow_ps(bool end_curve){ // //float width_segment_arrow=__pref.get_arr_w(); // float width_segment_arrow_gap=arr_w() - arr_gap() * arr_w(); // static const float rotation_segment_arrow_rate=1E-2; // static const float tol_intersect_arrow_seg_bezier=1E-1; // static const float dt_bezier=1E-4; // static const float tol_l_r=0.00001f; // float trasl_x=end_curve ? ex() : ix(); // float trasl_y=end_curve ? ey() : iy(); // float ix_t=ix()-trasl_x; // float iy_t=iy()-trasl_y; // float tan1x_t=tan1x()-trasl_x; // float tan1y_t=tan1y()-trasl_y; // float tan2x_t=tan2x()-trasl_x; // float tan2y_t=tan2y()-trasl_y; // float ex_t=ex()-trasl_x; // float ey_t=ey()-trasl_y; // pair intersection; // bool intersection_found=false; // for(float ang=0;ang<=3*M_PI;ang+=rotation_segment_arrow_rate){ // std::pair rotated_seg_pair=rotate_point(0, // width_segment_arrow_gap, // ang); // for(float t=0;t<=1;t+=dt_bezier){ // std::pair curve=poly_bezier(ix_t,iy_t, // tan1x_t,tan1y_t, // tan2x_t,tan2y_t, // ex_t,ey_t, // t); // if(similar_to(rotated_seg_pair.first, // curve.first, // tol_intersect_arrow_seg_bezier) && // similar_to(rotated_seg_pair.second, // curve.second, // tol_intersect_arrow_seg_bezier)){ // intersection=curve; // intersection_found=true; // break; // } // } // if(intersection_found){ // break; // } // } // intersection.first+=trasl_x; // intersection.second+=trasl_y; // if(!intersection_found){ // intersection failed using another method // // here // float dt_bez=end_curve? 1-PROC_BEZIER_OFFSETT_TANGENT_FOR_ARROW : PROC_BEZIER_OFFSETT_TANGENT_FOR_ARROW; // intersection=poly_bezier(ix(), iy(), // tan1x(), tan1y(), // tan2x(), tan2y(), // ex(), ey(), // dt_bez); // //std::cout << "123 non found" << std::endl; // //abort(); // } // return intersection; // } /******BOX*******/ BoxProc::BoxProc() :procedura(PROC_BOX), _edited_cp(none) { } BoxProc::BoxProc(const BoxProc* other) :procedura::procedura(other), _id(other->_id), _ld(other->_ld), _ru(other->_ru), _cr(other->_cr), _cg(other->_cg), _cb(other->_cb), _xpivot(other->_xpivot), _ypivot(other->_ypivot), _angolorot(other->_angolorot), _thickness(other->_thickness), _dash(other->_dash), _box_type(other->_box_type), _edited_cp(other->_edited_cp) { } BoxProc::BoxProc(int id,float ld_x, float ld_y, float ru_x, float ru_y, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int thick, int dash, box_type type) :procedura::procedura(PROC_BOX), _id(id), _cr(cr), _cg(cg), _cb(cb), _xpivot(xpiv), _ypivot(ypiv), _angolorot(anglrot), _thickness(thick), _dash(dash), _box_type(type) { _ld.first=ld_x; _ld.second=ld_y; _ru.first=ru_x; _ru.second=ru_y; } BoxProc::~BoxProc(){ } void BoxProc::init(){ ruota(xpivot(),ypivot(),angolorot()); } int BoxProc::id(){ return _id; } float BoxProc::w(){ if(cairo_t_singleton::can_export()){ return phys_w(); }else{ return visual_w(); } } float BoxProc::visual_w(){ return phys_w() * __pref.getZoom(); } float BoxProc::phys_w(){ return _ru.first - _ld.first; } float BoxProc::h(){ if(cairo_t_singleton::can_export()){ return phys_h(); }else{ return visual_h(); } } float BoxProc::visual_h(){ return phys_h() * __pref.getZoom(); } float BoxProc::phys_h(){ return _ru.second - _ld.second; } float BoxProc::visual_posx(){ return phys_posx() * __pref.getZoom(); } float BoxProc::phys_posx(){ return _ld.first; } float BoxProc::posx(){ if(cairo_t_singleton::can_export()){ return phys_posx(); }else{ return visual_posx(); } } float BoxProc::posy(){ if(cairo_t_singleton::can_export()){ return phys_posy(); }else{ return visual_posy(); } } float BoxProc::visual_posy(){ return phys_posy() * __pref.getZoom(); } float BoxProc::phys_posy(){ return _ld.second; } float BoxProc::ld_x(){ if(cairo_t_singleton::can_export()){ return phys_ld_x(); }else{ return visual_ld_x(); } } float BoxProc::ld_y(){ if(cairo_t_singleton::can_export()){ return phys_ld_y(); }else{ return visual_ld_y(); } } float BoxProc::ru_x(){ if(cairo_t_singleton::can_export()){ return phys_ru_x(); }else{ return visual_ru_x(); } } float BoxProc::ru_y(){ if(cairo_t_singleton::can_export()){ return phys_ru_y(); }else{ return visual_ru_y(); } } float BoxProc::phys_ld_x(){ return _ld.first; } float BoxProc::phys_ld_y(){ return _ld.second; } float BoxProc::phys_ru_x(){ return _ru.first; } float BoxProc::phys_ru_y(){ return _ru.second; } float BoxProc::visual_ld_x(){ return phys_ld_x() * __pref.getZoom(); } float BoxProc::visual_ld_y(){ return phys_ld_y() * __pref.getZoom(); } float BoxProc::visual_ru_x(){ return phys_ru_x() * __pref.getZoom(); } float BoxProc::visual_ru_y(){ return phys_ru_y() * __pref.getZoom(); } void BoxProc::trasla(float dx, float dy){ ld_x(descale(ld_x()+dx)); ld_y(descale(ld_y()+dy)); ru_x(descale(ru_x()+dx)); ru_y(descale(ru_y()+dy)); } void BoxProc::phys_translate(float dx, float dy){ _ld.first+=dx; _ld.second+=dy; _ru.first+=dx; _ru.second+=dy; } int BoxProc::cr(){ return _cr; } int BoxProc:: cg(){ return _cg; } int BoxProc::cb(){ return _cb; } float BoxProc::xpivot(){ return _xpivot; } float BoxProc::ypivot(){ return _ypivot; } float BoxProc::angolorot(){ return _angolorot; } int BoxProc::spessore(){ return _thickness; } int BoxProc::dash(){ return _dash; } box_type BoxProc::b_type(){ return _box_type; } bool BoxProc::dentro_bb(float x, float y, float w , float h){ if(ld_x()>x && ld_x()y && ru_y()& ld, std::pair& ru){ if(cairo_t_singleton::can_export()){ get_phys_bounding_box(ld,ru); }else{ get_visual_bounding_box(ld,ru); } } void BoxProc::get_phys_bounding_box(std::pair& ld, std::pair& ru){ ld=_ld; ru=_ru; int actual_thickness=spessore(); int shadow_thickness=0; if(b_type()==SHADOWED){ shadow_thickness=actual_thickness*BoxProc::shadow_thickness_factor; } ru.first+=actual_thickness + shadow_thickness; ru.second+=actual_thickness + shadow_thickness; } void BoxProc::get_visual_bounding_box(std::pair& ld, std::pair& ru){ ld.first=visual_ld_x(); ld.second=visual_ld_y(); ru.first=visual_ru_x(); ru.second=visual_ru_y(); } int BoxProc::sotto_mouse(int posx_m, int posy_m){ if(posx_m > ld_x() && posx_m < ru_x() && posy_m > ld_y() && posy_m < ru_y()){ return id(); }else{ return -1; } } int BoxProc::control_point_under_mouse(int posx_m, int posy_m){ int res=-1; if(similar_to(ld_x(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(ld_y(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=ld; res=id(); }else if(similar_to(ru_x(),static_cast(posx_m),_tolerance_hit_control_point) && similar_to(ru_y(),static_cast(posy_m),_tolerance_hit_control_point)){ _edited_cp=ru; res=id(); } return res; } void BoxProc::unset_edit_control_point(){ _edited_cp=none; } void BoxProc::control_point_transl(float dx, float dy){ if(_edited_cp==ld){ ld_x(descale(ld_x()+dx)); ld_y(descale(ld_y()+dy)); }else if(_edited_cp==ru){ ru_x(descale(ru_x()+dx)); ru_y(descale(ru_y()+dy)); } if(ru_x() <= ld_x()){ std::pair svru=_ru; std::pair svld=_ld; _ld.first=svru.first; _ru.first=svld.first; _edited_cp=ld; } if(ld_x() >= ru_x()){ std::pair svru=_ru; std::pair svld=_ld; _ld.first=svru.first; _ru.first=svld.first; _edited_cp=ru; } if(ru_y() <= ld_y()){ std::pair svru=_ru; std::pair svld=_ld; _ld.second=svru.second; _ru.second=svld.second; _edited_cp=ru; } if(ld_y() >= ru_y()){ std::pair svru=_ru; std::pair svld=_ld; _ld.second=svru.second; _ru.second=svld.second; _edited_cp=ld; } } void BoxProc::id(int nw){ _id=nw; } void BoxProc::w(float nw){ _ru.first=nw; } void BoxProc::h(float nw){ _ru.second=nw; } void BoxProc::posx(float nw){ _ld.first=nw; } void BoxProc::posy(float nw){ _ld.second=nw; } void BoxProc::cr(int nw){ _cr=nw; } void BoxProc::cb(int nw){ _cb=nw; } void BoxProc::cg(int nw){ _cg=nw; } void BoxProc::xpivot(float nw){ _xpivot=nw; } void BoxProc::ypivot(float nw){ _ypivot=nw; } void BoxProc::angolorot(float nw){ _angolorot=nw; } void BoxProc::spessore(int nw){ _thickness=nw; } void BoxProc::dash(int nw){ _dash=nw; } void BoxProc::ld_x(float nw){ _ld.first=nw; } void BoxProc::ld_y(float nw){ _ld.second=nw; } void BoxProc::ru_x(float nw){ _ru.first=nw; } void BoxProc::ru_y(float nw){ _ru.second=nw; } void BoxProc::b_type(box_type type){ _box_type=type; } void BoxProc::disegna(){ float the_zoom=__pref.getZoom(); int actual_thickness= cairo_t_singleton::can_export()? spessore() : static_cast(rintf(spessore()*the_zoom)); if(actual_thickness<=0){ actual_thickness=1; } int shadow_thickness=actual_thickness*BoxProc::shadow_thickness_factor; float weight_col=0.5; float weight_col_1=1- weight_col; float melting_col=0; if(cr()==0 && cg()==0 && cb()==0){ melting_col=255; } if(cairo_t_singleton::can_export()){ cairo_t* cn=cairo_t_singleton::get_context(); if(b_type()==SHADOWED){ cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(weight_col* cr() + weight_col_1 * melting_col), remap_color_1(weight_col* cg() + weight_col_1 * melting_col), remap_color_1(weight_col* cb() + weight_col_1 * melting_col) ); cairo_set_line_width(cn,shadow_thickness); cairo_move_to(cn, phys_ru_x()+actual_thickness, phys_ld_y()+actual_thickness); cairo_line_to(cn, phys_ru_x()+actual_thickness, phys_ru_y()+actual_thickness + (shadow_thickness/2) ); cairo_move_to(cn, phys_ru_x()+actual_thickness, phys_ru_y()+actual_thickness); cairo_line_to(cn, phys_ld_x()+actual_thickness, phys_ru_y()+actual_thickness); cairo_stroke(cn); cairo_restore(cn); } cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb()) ); cairo_set_line_width(cn,spessore()); if(dash()>0){ double dash_gap[1]={dash()}; cairo_set_dash(cn,dash_gap,1,0); } cairo_rectangle(cn, phys_ld_x(), phys_ld_y(), phys_w(), phys_h()); cairo_stroke(cn); cairo_restore(cn); }else{ char gap_dash[2]={dash(),0}; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); fl_line_style(FL_SOLID, actual_thickness,gap_dash); if(b_type()==SHADOWED){ fl_line_style(FL_SOLID, actual_thickness*BoxProc::shadow_thickness_factor); fl_color(weight_col* cr() + weight_col_1 * melting_col, weight_col* cg() + weight_col_1 * melting_col, weight_col* cb() + weight_col_1 * melting_col ); fl_begin_line(); fl_vertex(ru_x()+actual_thickness+dx_scroll, ld_y()+actual_thickness+dy_scroll); fl_vertex(ru_x()+actual_thickness+dx_scroll, ru_y()+actual_thickness+dy_scroll); fl_vertex(ru_x()+actual_thickness+dx_scroll, ru_y()+actual_thickness+dy_scroll); fl_vertex(ld_x()+actual_thickness+dx_scroll, ru_y()+actual_thickness+dy_scroll); fl_end_line(); fl_line_style(FL_SOLID, actual_thickness,gap_dash); } fl_color(cr(), cg(), cb()); fl_begin_line(); fl_rect(ld_x()+dx_scroll, ld_y()+dy_scroll, w(), h()); fl_end_line(); draw_shadowed_point(visual_ld_x()+dx_scroll, visual_ld_y()+dy_scroll,255,0,0); draw_shadowed_point(visual_ru_x()+dx_scroll, visual_ru_y()+dy_scroll,255,0,0); fl_line_style(0); fl_color(cr(), cg(), cb()); } } void BoxProc::scale(float sc){ ld_x(phys_ld_x()*sc); ld_y(phys_ld_y()*sc); ru_x(phys_ru_x()*sc); ru_y(phys_ru_y()*sc); } void BoxProc::ruota(float xpiv, float ypiv,float angl){ // TO DO } void BoxProc::write_native_format(std::ostream& stream, std::string indent){ /* 'BOX' APRI ID_PROC SEP LD_X SEP LD_Y SEP RU_X SEP RU_Y SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP BOX_TYPE CHIUDI */ stream << indent << ETIC_BOX << " " << APRI << std::endl << indent << "\t" << id() << SEP << phys_ld_x() << SEP << phys_ld_y() << SEP <(b_type()) << std::endl << indent << CHIUDI << std::endl; } const int BoxProc::shadow_thickness_factor=3; bist-0.5.2/src/bezier_prop.cpp0000644000175000017500000001637511412200237014656 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; void bezier_prop_type_cb(Fl_Widget* w, void* d){ bezier_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); Fl_Menu_Button* the_menu=dynamic_cast(w); const Fl_Menu_Item* the_type=the_menu->mvalue(); BEZIER_PROP_SIZE_USER_DATA_MENU type_arrow=reinterpret_cast(the_type->user_data()); arrp->_bezier->punte(type_arrow); ed->redraw(); } void bezier_prop_color_cb(Fl_Widget* w, void* d){ unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); editor* ed=dynamic_cast(MainWindow); bezier_prop* propr=dynamic_cast(w->parent()); if(pushd){ propr->_bezier->cr(r); propr->_bezier->cg(g); propr->_bezier->cb(b); ed->redraw(); } } void bezier_prop_ok_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void bezier_prop_cancel_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void bezier_prop_width_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); bezier_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_bezier->spessore(static_cast(sl->value())); ed->redraw(); } void bezier_prop_tick_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); bezier_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_bezier->dash(static_cast(sl->value())); ed->redraw(); } void bezier_prop_width_arr_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); bezier_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_bezier->arr_w(static_cast(sl->value())); ed->redraw(); } void bezier_prop_height_arr_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); bezier_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_bezier->arr_h(static_cast(sl->value())); ed->redraw(); } void bezier_prop_gap_arr_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); bezier_prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->_bezier->arr_gap(sl->value()); ed->redraw(); } bezier_prop::~bezier_prop(){ //TODO } bezier_prop::bezier_prop(proc_bezier* arr) :Fl_Double_Window(455, 275), _bezier(arr) { { Fl_Box* o = new Fl_Box(5, 20, 445, 200, _("Bezier properties")); o->box(FL_ENGRAVED_BOX); o->align(FL_ALIGN_TOP_LEFT); } { Fl_Value_Slider* o = new Fl_Value_Slider(200, 25, 210, 25, _("Dash step:")); o->type(1); o->step(0.01); o->align(FL_ALIGN_LEFT); o->range(0, 30); o->precision(0); o->value(_bezier->dash()); o->callback(bezier_prop_tick_cb); } { Fl_Value_Slider* o = new Fl_Value_Slider(200, 52, 210, 25, _("Thickness:")); o->type(1); o->step(0.01); o->align(FL_ALIGN_LEFT); o->range(0, 10); o->precision(0); o->value(_bezier->spessore()); o->callback(bezier_prop_width_cb); } Fl_Value_Slider* arr_w = new Fl_Value_Slider(200, 79, 210, 25, _("Arrow width:")); arr_w->type(FL_HORIZONTAL); arr_w->step(1); arr_w->align(FL_ALIGN_LEFT); arr_w->range(0, 50); arr_w->precision(0); arr_w->value(_bezier->arr_w()); arr_w->callback(bezier_prop_width_arr_cb); Fl_Value_Slider* arr_h = new Fl_Value_Slider(200, 107, 210, 25, _("Arrow height:")); arr_h->type(FL_HORIZONTAL); arr_h->step(1); arr_h->align(FL_ALIGN_LEFT); arr_h->range(0, 50); arr_h->precision(0); arr_h->value(_bezier->arr_h()); arr_h->callback(bezier_prop_height_arr_cb); Fl_Value_Slider* arr_gap = new Fl_Value_Slider(200, 134, 210, 25, _("Arrow gap:")); arr_gap->type(FL_HORIZONTAL); arr_gap->step(0.01); arr_gap->align(FL_ALIGN_LEFT); arr_gap->range(0, 0.99); arr_gap->precision(2); arr_gap->value(_bezier->arr_gap()); arr_gap->callback(bezier_prop_gap_arr_cb); /* #define ARR_NO_PUNT 1 #define ARR_OMOL_PUNT 2 #define ARR_ETEROL_PUNT 3 #define ARR_DOUBLE 4 #define ARR_BLOC 5 #define ARR_EQ 6 */ Fl_Menu_Item bezier_prop_type_of_arrow_menu_item[] = { {_("none"), 0, 0, reinterpret_cast(ARR_NO_PUNT)}, {_("homolitic"), 0, 0, reinterpret_cast(ARR_OMOL_PUNT)}, {_("heterolitic"), 0, 0, reinterpret_cast(ARR_ETEROL_PUNT)}, {_("double"), 0, 0, reinterpret_cast(ARR_DOUBLE)}, {0} }; Fl_Menu_Button* type_arr=new Fl_Menu_Button(w()/2-77, 170, 77, 30, _("Type")); type_arr->copy(bezier_prop_type_of_arrow_menu_item); type_arr->callback(bezier_prop_type_cb); type_arr->align(FL_ALIGN_LEFT | FL_ALIGN_INSIDE); add(type_arr); Fl_Button* colore=new Fl_Button(w()/2, 170, 55, 30, _("Color")); colore->callback(bezier_prop_color_cb); add(colore); Fl_Return_Button* ok=new Fl_Return_Button(w()/2-65/2, 235, 65, 30, _("OK")); ok->callback(bezier_prop_ok_cb); add(ok); end(); set_modal(); dialog_position(this); } void bezier_win(proc_bezier* at){ bezier_prop p(at); p.show(); while(p.shown()){ Fl::wait(); } } bist-0.5.2/src/newton_integ.cpp0000644000175000017500000000721611256432537015050 0ustar cagecage#include #include <2D_vector.hpp> #include #include newton_integ::newton_integ() :_dt(1e-1), _thrs_pos(1e-6), _m(1) { } newton_integ::newton_integ(newton_integ &other) :_dt(other._dt), _thrs_pos(other._thrs_pos), _m(other._m), _accel(other._accel), _velo(other._velo), _pos(other._pos) { } newton_integ::~newton_integ(){ } void newton_integ::pos(std::vector nw){ _pos=nw; _accel.empty(); _accel.resize(_pos.size(),0.0f); _velo.empty(); _velo.resize(_pos.size(),0.0f); } std::vector newton_integ::pos(){ return _pos; } void newton_integ::dt(float nw){ _dt=nw; } float newton_integ::dt(){ return _dt; } void newton_integ::m(float nw){ _m=nw; } float newton_integ::m(){ return _m; } void newton_integ::thrs_pos(float nw){ _thrs_pos=nw; } float newton_integ::thrs_pos(){ return _thrs_pos; } bool newton_integ::update(){ _savedpos=_pos; std::vector f=force(); for(unsigned int i=0; i < f.size(); i++){ _accel[i]=f[i]/m(); } for(unsigned int i=0; i < f.size(); i++){ _velo[i]=_accel[i] * _dt; } for(unsigned int i=0; i < f.size(); i++){ _pos[i]+=_velo[i] * _dt; //std::cerr << _velo[i] * _dt << std::endl; } bool can_continue=false; //std::cerr << "saved " << _savedpos[0] << " " << _savedpos[1] << std::endl; //std::cerr << _pos[0] << " " << _pos[1] << std::endl; for(unsigned int i=0;i<_pos.size();i++){ if( ! similar_to(_pos[i],_savedpos[i],_thrs_pos) ) { can_continue=true; } } return can_continue; } bidimensional_vinculated_particle::bidimensional_vinculated_particle() :_k_spring(1) { } bidimensional_vinculated_particle::bidimensional_vinculated_particle(bidimensional_vinculated_particle& other) :newton_integ::newton_integ(other), _particles(other._particles), _center(other._center), _k_spring(other._k_spring) { } bidimensional_vinculated_particle::~bidimensional_vinculated_particle(){ } void bidimensional_vinculated_particle::add_particle(std::pair particle){ _particles.push_back(particle); } void bidimensional_vinculated_particle::add_center(std::pair center){ _center=center; } void bidimensional_vinculated_particle::k_spring(float nw){ _k_spring=nw; } float bidimensional_vinculated_particle::k_spring(){ return _k_spring; } std::vector bidimensional_vinculated_particle::force(){ std::vector< std::pair > diff_f; std::pair pos2(_pos[0],_pos[1]); for(unsigned int i=0;i<_particles.size();i++){ std::pair ppos=_particles[i]; std::pair ppos_diff=bidimensional_vector::diff(ppos,_center); std::pair ppos_scal=bidimensional_vector::normalize(ppos_diff); ppos_scal=bidimensional_vector::translate(ppos_scal,_center.first, _center.second); std::pair tmp=bidimensional_vector::diff(pos2,ppos_scal); diff_f.push_back(tmp); } for(unsigned int i=0;i sum; for(unsigned int i=0;i rad=bidimensional_vector::diff(pos2, _center); std::pair f_tang=bidimensional_vector::project_perp(sum,rad); vector res; res.push_back(f_tang.first); res.push_back(f_tang.second); return res; } bist-0.5.2/src/set_conf.cpp0000644000175000017500000000506611210263710014132 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern Preferences __pref; void setup_conf(){ struct stat bistconf; string home=getenv("HOME"); string bistdir=home+"/"+CONFIG_DIR+"/"; int res_stat = stat(bistdir.c_str(),&bistconf); if(res_stat==-1 && errno==ENOENT){ int ris=mkdir(bistdir.c_str(),S_IRWXU); if(ris<0){ string err=strerror(errno); fl_alert(_("I could not create directory: \"%s\""),(bistdir + ".\n" + err).c_str()); } } //check for template directory std::string templ_path=home + std::string(LIB_PATH_HOME); res_stat = stat(bistdir.c_str(),&bistconf); if(res_stat==0){ //exist parent directory res_stat = stat(templ_path.c_str(),&bistconf); if(res_stat==-1 && errno==ENOENT){ int repl_ring=mkdir(templ_path.c_str(),S_IRWXU); if(repl_ring<0){ string err=strerror(errno); fl_alert(_("I could not create directory: \"%s\""),templ_path.c_str()); } } } string saveconf=home+ "/" +CONFIG_DIR+ "/" +CONFIG_FILE; res_stat=stat(saveconf.c_str(),&bistconf); __pref.setSaveFile(saveconf.c_str()); __pref.setFile(saveconf.c_str(), false); if(res_stat==-1 && errno==ENOENT){ __pref.setSaveFile(saveconf.c_str()); __pref.SavePrefs(); }else{ //cout << "ttt" << "carica" << saveconf << endl; __pref.LoadPrefs(); } } bist-0.5.2/src/immagine_cml.cpp0000644000175000017500000004012111406210753014750 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; immagine_cml::immagine_cml() :immagine() { } immagine_cml::immagine_cml(string path) :immagine(path) { } immagine_cml::immagine_cml(const immagine_cml& altra) :immagine::immagine(altra) { } immagine_cml::~immagine_cml(){ } void immagine_cml::filebist(string path){ reset_all(); _filebist=path; if(path==""){ return; } } void immagine_cml::start(){ setlocale(LC_ALL,"C"); FILE* inp=fopen(_filebist.c_str(),"r"); const int buffsize=8192; char buff[buffsize]; XML_Parser p = XML_ParserCreate(NULL); if (! p) { fl_alert( _("Couldn't allocate memory for parser")); XML_ParserFree(p); return; } XML_SetElementHandler(p, start_tags, end_tags); XML_SetCharacterDataHandler(p,text_hand); for (;;) { int done; int len; len = fread(buff, 1, buffsize, inp); if (ferror(inp)) { fl_alert( _("Read error") ); return; } done = feof(inp); if (XML_Parse(p, buff, len, done) == XML_STATUS_ERROR) { ostringstream eout; eout <<"cml: parse error at line" << XML_GetCurrentLineNumber(p) << "\n" << XML_ErrorString(XML_GetErrorCode(p)); _error.push_back(eout.str()); return; } if (done) break; } XML_ParserFree(p); for(unsigned int i=0;i<_gruppi_static.size();i++){ _gruppi.push_back(_gruppi_static[i]); } #ifdef DEBUG dump_tmp_atom(); #endif _gruppi_static.clear(); // _tag_static.clear(); _genitore_attrb_cml_static.clear(); _atomref_static.first=-1; _atomref_static.second=-1; _bnd_order_static=-1; _id_leg_fallback=0; setlocale(LC_ALL,""); } void immagine_cml::start_tags(void *userData, const XML_Char *name, const XML_Char **atts){ map mapa=costruct_map_attrb(atts); if(string(MOLECULE_CML)==name){ int id_gruppo= create_hash(mapa[ID_CML]); gruppo tmp; tmp.id_gruppo(id_gruppo); _gruppi_static.push_back(tmp); }else if(string(ATOM_CML)==name){ _genitore_cml_static=(_tag_static.top()).first; _genitore_attrb_cml_static=(_tag_static.top()).second; atomo tmp; int id_atomo= create_hash(mapa[ID_CML]); tmp.id(id_atomo); (_gruppi_static.back()).add_atomo(tmp); }else if(string(STRING_ARRAY)==name){ }else if(string(FLOAT_ARRAY)==name){ }else if(string(STRING_CML)==name){ _genitore_cml_static=(_tag_static.top()).first; _genitore_attrb_cml_static=(_tag_static.top()).second; }else if(string(COORDINATE2_CML)==name) { //245.301 289.5 }else if(name==string(BOND_CML)){ //int leg_id=create_hash(mapa[ID_CML]); //string delim=" "; if(mapa.count(ATOMREFS_CML)){ /* string_tokenizer tok(mapa[ATOMREFS_CML],delim); int atomid1=create_hash(tok.next_token()); int atomid2=create_hash(tok.next_token()); atomo* adding1=(_gruppi_static.back()).find_atomo_id(atomid1); atomo* adding2=(_gruppi_static.back()).find_atomo_id(atomid2); // void atomo::aggiungi_legame(int nw_leg_id_atomo, int nw_leg_id_legame, // int nw_leg_tipo_legame,int nwcr, // int nwcg , int nwcb){ adding1->aggiungi_legame(atomid2,leg_id,0,0,0,0); adding1->costruisci_arrivati(); adding2->aggiungi_legame(atomid1,leg_id,0,0,0,0); adding2->costruisci_arrivati(); */ } } pair< string, map > tmp; tmp.first=string(name); tmp.second=mapa; _tag_static.push(tmp); } void immagine_cml::end_tags(void *userData, const XML_Char *s){ map mapa=_tag_static.top().second; string name=_tag_static.top().first; if(s==string(STRING_CML)){ }else if(string(COORDINATE2_CML)==s){ }else if(s==string(INTEGER_CML)){ }else if(s==string(FLOAT_CML)){ }else if(s==string(BOND_CML)){ int leg_id=_id_leg_fallback; if(mapa.count(ID_CML)){ int leg_id=create_hash(mapa[ID_CML]); _id_leg_fallback=leg_id; } //superbug!!! leg_id e' sempre lo stesso!!! cout << "xxxx " << leg_id << endl; atomo* adding1=(_gruppi_static.back()).find_atomo_id(_atomref_static.first); atomo* adding2=(_gruppi_static.back()).find_atomo_id(_atomref_static.second); //cout << "order: " << adding1<< " " << adding2 << " " << _bnd_order_static <aggiungi_legame(adding2->id(),leg_id,_bnd_order_static,0,0,0); adding1->costruisci_arrivati(); adding2->aggiungi_legame(adding1->id(),leg_id,_bnd_order_static,0,0,0); adding2->costruisci_arrivati(); /* for(unsigned int ctatm=0;ctatm<2;ctatm++){ vector::iterator primo=att_atm[ctatm]->primo_leg(); vector::iterator ultimo=att_atm[ctatm]->ultimo_leg(); while(primo!=ultimo){ if((*primo).id_atomo()==att_atm[(ctatm+1)%2]->id()){ att_atm[ctatm]->modifica_legame((*primo).id_atomo(), (*primo).id_atomo(), (*primo).id_legame(), _bnd_order_static, (*primo).cr(), (*primo).cg(), (*primo).cb()); } primo++; } } */ _id_leg_fallback++; _atomref_static.first=-1; _atomref_static.second=-1; _bnd_order_static=-1; _tag_static.pop(); }else if(s==string(STRING_ARRAY)){ _tag_static.pop(); }else if(s==string(FLOAT_ARRAY)){ _tag_static.pop(); }else{ _tag_static.pop(); } } void immagine_cml::text_hand(void *userData, const XML_Char *s, int len){ string text; for(unsigned int i=0;i(len);i++){ text+=s[i]; } string name=(_tag_static.top()).first; map mapa = (_tag_static.top()).second; if(name==string(STRING_CML)){ //string non puo' avere figli _tag_static.pop(); string name_p = (_tag_static.top()).first; map mapa_p = (_tag_static.top()).second; if(name_p==string(ATOM_CML)){ //il genitore e' un atomo atomo* no_etic=(_gruppi_static.back()). find_atomo_id( create_hash( mapa_p[ID_CML]) ); if(mapa[BUILTIN_CML]==ELEMENT_TYPE_CML){ etichetta tmp; if(text=="" || text==" " || text=="c" || text=="C"){ text="#"; } tmp.aggiungi(text,ET_STR); no_etic->etich(tmp); }else { //altri stringbuiltin residue ecc... da fare } }else if(name_p==string(BOND_CML)){ //il genitore e' un legame /* map::iterator primo=mapa.begin(); map::iterator fin=mapa.end(); while(primo!=fin){ cout << (*primo).first << " " << (*primo).second << " " << mapa_p.count(ATOMREF_CML) << endl; primo++; } */ if(mapa_p.count(ATOMREFS_CML)){ //cout << "atomref" < mapa_p = (_tag_static.top()).second; if(name_p==string(ATOM_CML)){ //il genitore e' un atomo atomo* no_etic=(_gruppi_static.back()). find_atomo_id( create_hash( mapa_p[ID_CML]) ); if(mapa[BUILTIN_CML]==XY2_CML){ string delim=" "; string_tokenizer tok(text,delim); float pos=strtof(tok.next_token().c_str(),NULL); no_etic->pos_x(pos); pos=strtof(tok.next_token().c_str(),NULL); no_etic->pos_y(pos); } } }else if(name==string(INTEGER_CML)){ _tag_static.pop(); string name_p = (_tag_static.top()).first; map mapa_p = (_tag_static.top()).second; if(name_p==string(ATOM_CML)){ //il genitore e' un atomo atomo* no_etic=(_gruppi_static.back()). find_atomo_id( create_hash( mapa_p[ID_CML]) ); if(mapa[BUILTIN_CML]==FORMAL_CHARGE_CML){ float charge=strtof(text.c_str(),NULL); no_etic->cariche(static_cast(charge)); } } }else if(name==string(FLOAT_CML)){ _tag_static.pop(); string name_p = (_tag_static.top()).first; // cout << "textfloat"<< text <<" " << name_p < mapa_p = (_tag_static.top()).second; if(name_p==string(ATOM_CML)){ //il genitore e' un atomo atomo* no_etic=(_gruppi_static.back()). find_atomo_id( create_hash( mapa_p[ID_CML]) ); if(mapa[BUILTIN_CML]==X2_CML){ //cout << "x2 " << text <pos_x(pos); }else if(mapa[BUILTIN_CML]==Y2_CML){ //cout << "y2 " << text <pos_y(pos); } } }else if(name==string(STRING_ARRAY)){ string name_p = (_tag_static.top()).first; map mapa_p = (_tag_static.top()).second; if(mapa[BUILTIN_CML]==ATOMARRAY_ID_CML){ //cout << "string_array"<< text <<" " << name_p <id(id_atomo); //cout << "rrrrr" << tmp->id() << endl; (_gruppi_static.back()).add_atomo(*tmp,false); delete tmp; } }else if(mapa[BUILTIN_CML]==ELEMENT_TYPE_CML){ vector::iterator primo=(_gruppi_static.back()).iniz_atom(); vector::iterator ultimo=(_gruppi_static.back()).fin_atom(); string delim=" "; string_tokenizer tok(text,delim); while(!tok && primo!=ultimo){ etichetta tmp; string resid=tok.next_token(); if(resid=="" || resid==" " || resid=="c" || resid=="C"){ text="#"; } tmp.aggiungi(resid,ET_STR); //cout << "rrrr aggiungo etichetta:" << resid << " " << (*primo).id() << endl; (*primo).etich(tmp); primo++; } }else if(mapa[BUILTIN_CML]==ORDER_CML){ if(_atomref_array_1_static!="" && _atomref_array_2_static!=""){ /* cout << "rrr" << _atomref_array_1_static << "----" << _atomref_array_2_static << endl; cout << "rrrr" << text << endl; */ string delim=" "; string_tokenizer tok_1(_atomref_array_1_static,delim); string_tokenizer tok_2(_atomref_array_2_static,delim); string_tokenizer tok_order(text,delim); if(tok_1.count()==tok_2.count()){ while(!tok_1){ /* time_t t_now=time(0); struct tm* ora=localtime(&t_now); */ int leg_id=_id_leg_fallback;//create_hash(asctime(ora)); string id_1=tok_1.next_token(); string id_2=tok_2.next_token(); int order_bond=conv_order_cml(tok_order.next_token()); atomo* adding1=(_gruppi_static.back()).find_atomo_id(create_hash(id_1)); atomo* adding2=(_gruppi_static.back()).find_atomo_id(create_hash(id_2)); /* cout << "rrrrr" << "creo legame " << id_1 << "(" << create_hash(id_1) << ")" << "->" << id_2 << "(" << create_hash(id_2) << ")" << endl; */ /* void atomo::aggiungi_legame(int nw_leg_id_atomo, int nw_leg_id_legame, int nw_leg_tipo_legame,int nwcr, int nwcg , int nwcb){ */ adding1->aggiungi_legame(adding2->id(),leg_id,order_bond,0,0,0); adding1->costruisci_arrivati(); adding2->aggiungi_legame(adding1->id(),leg_id,order_bond,0,0,0); adding2->costruisci_arrivati(); _id_leg_fallback++; } } _atomref_array_1_static=""; _atomref_array_2_static=""; (_gruppi_static.back()).ordina(); } }else if(mapa[BUILTIN_CML]==ATOMREF_CML){ if(_atomref_array_1_static==""){ _atomref_array_1_static=text; }else{ _atomref_array_2_static=text; } } }else if(name==string(FLOAT_ARRAY)){ if(mapa[BUILTIN_CML]==X2_CML || mapa[BUILTIN_CML]==Y2_CML){ vector::iterator primo=(_gruppi_static.back()).iniz_atom(); vector::iterator ultimo=(_gruppi_static.back()).fin_atom(); string delim=" "; string_tokenizer tok(text,delim); while(!tok && primo!=ultimo){ string pos_str=tok.next_token(); float pos=strtof(pos_str.c_str(),NULL); if(mapa[BUILTIN_CML]==X2_CML){ (*primo).pos_x(pos); }else{ (*primo).pos_y(pos); } primo++; } } } // if(_genitore_cml_static==string(ATOM_CML)){ // //il genitore e' un atomo // atomo* no_etic=(_gruppi_static.back()). // find_atomo_id( // create_hash( // _genitore_attrb_cml_static[ID_CML]) // ); // if(string(STRING_CML)==name){ // if(mapa[BUILTIN_CML]==ELEMENT_TYPE_CML){ // etichetta tmp; // tmp.aggiungi(text,ET_STR); // no_etic->etich(tmp); // }else { // //altri stringbuiltin residue ecc... da fare // } // }else if(string(COORDINATE2_CML)==name){ // if(mapa[BUILTIN_CML]==XY2_CML){ // string delim=" "; // string_tokenizer tok(text,delim); // float pos=strtof(tok.next_token().c_str(),NULL); // no_etic->pos_x(pos); // pos=strtof(tok.next_token().c_str(),NULL); // no_etic->pos_y(pos); // } // } // } } vector immagine_cml::_gruppi_static; map immagine_cml::costruct_map_attrb(const XML_Char **atts){ map risul; unsigned int i=0; while(atts[i]!=NULL){ pair p; p.first=string(atts[i]); p.second=string(atts[i+1]); risul.insert(p); i+=2; } return risul; } int immagine_cml::conv_order_cml(string order_cml){ int order=static_cast(strtof(order_cml.c_str(),NULL)); switch (order){ case 1: case 2: case 3: return order - 1; default: return 1; } } stack< pair< string, map > > immagine_cml::_tag_static; string immagine_cml::_genitore_cml_static; map immagine_cml::_genitore_attrb_cml_static; pair immagine_cml::_atomref_static(-1,-1); int immagine_cml::_bnd_order_static; string immagine_cml::_atomref_array_1_static; string immagine_cml::_atomref_array_2_static; int immagine_cml::_id_leg_fallback=0; bist-0.5.2/src/multiline_label.cpp0000644000175000017500000011463011406210753015477 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* #include #include #include #include #include #include #include #include */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; multiline_label::multiline_label() :etichetta(), _treat_as_a_whole(true), _pointer_to_currline(0), _interline_space(multiline_label::_default_interline_space), _layout_lines(MULTILINE_LABEL_ALIGN_LEFT_TEXT_LAYOUT) { //std::cerr << "creo multiline " << __FUNCTION__ << std::endl; update_vec_str(); } multiline_label::multiline_label(const multiline_label& other) :etichetta(other), _treat_as_a_whole(true), _pointer_to_currline(other._pointer_to_currline), _interline_space(other._interline_space), _layout_lines(other._layout_lines) { //std::cerr << "ricopio multiline " << __FUNCTION__ << std::endl; for(unsigned int i=0;i< (other._lines_of_text.size()) ;i++){ etichetta* tmp=new etichetta(other._lines_of_text[i]); _lines_of_text.push_back(tmp); } format_paragraph(); } multiline_label::multiline_label(const multiline_label* other) :etichetta(other), _treat_as_a_whole(other->_treat_as_a_whole), _pointer_to_currline(other->_pointer_to_currline), _interline_space(other->_interline_space), _layout_lines(other->_layout_lines) { //std::cerr << "ricopio multiline " << __FUNCTION__ << std::endl; for(unsigned int i=0;i< (other->_lines_of_text.size()) ;i++){ etichetta* tmp=new etichetta(other->_lines_of_text[i]); _lines_of_text.push_back(tmp); } //update_vec_str(); format_paragraph(); } multiline_label& multiline_label::operator=(const multiline_label& other){ // std::cerr << __FUNCTION__ << std::endl; _treat_as_a_whole=_treat_as_a_whole; _pointer_to_currline=other._pointer_to_currline; _interline_space=other._interline_space; _layout_lines=other._layout_lines; _cr=other._cr; _cg=other._cg; _cb=other._cb; _allineamento=other._allineamento; _vec_str=other._vec_str; _font=other._font; _dim=other._dim; _x=other._x; _y=other._y; _v_offset=other._v_offset; _cursor_pos=other._cursor_pos; _draw_cursor=other._draw_cursor; _draw_negative=other._draw_negative; genitore::_il_genitore=other._il_genitore; for(unsigned int i=0;i< (other._lines_of_text.size()) ;i++){ etichetta* tmp=new etichetta(other._lines_of_text[i]); _lines_of_text.push_back(tmp); } //update_vec_str(); format_paragraph(); return (*this); } multiline_label::~multiline_label(){ for(unsigned int i=0;i< _lines_of_text.size(); i++){ //std::cerr << "eliminata " << _lines_of_text[i] << std::endl; delete _lines_of_text[i]; } } void multiline_label::update_vec_str(){ if(ptr_line_less_lines_text()){ _vec_str=(_lines_of_text[_pointer_to_currline])->vec_str(); _cr=(_lines_of_text[_pointer_to_currline])->cr(); _cg=(_lines_of_text[_pointer_to_currline])->cg(); _cb=(_lines_of_text[_pointer_to_currline])->cb(); _font=(_lines_of_text[_pointer_to_currline])->font(); _dim=(_lines_of_text[_pointer_to_currline])->phys_dim(); _x=(_lines_of_text[_pointer_to_currline])->phys_x(); _y=(_lines_of_text[_pointer_to_currline])->phys_y(); std::pair nw_curpos(0,0); _cursor_pos=nw_curpos; _draw_cursor=false; } } void multiline_label::update_lines_of_text(){ if(ptr_line_less_lines_text()){ (_lines_of_text[_pointer_to_currline])->subst_vec_str(_vec_str); (_lines_of_text[_pointer_to_currline])->cr(_cr); (_lines_of_text[_pointer_to_currline])->cr(_cg); (_lines_of_text[_pointer_to_currline])->cr(_cb); (_lines_of_text[_pointer_to_currline])->font(_font); (_lines_of_text[_pointer_to_currline])->dim(_dim); (_lines_of_text[_pointer_to_currline])->x(_x); (_lines_of_text[_pointer_to_currline])->y(_y); } } int multiline_label::cr(){ int res=0; if(treat_as_a_whole()){ res=_cr; }else{ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->cr(); } } return res; } int multiline_label::cg(){ int res=0; if(treat_as_a_whole()){ res=_cg; }else{ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->cg(); } } return res; } int multiline_label::cb(){ int res=0; if(treat_as_a_whole()){ res=_cb; }else{ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->cb(); } } return res; } void multiline_label::cr(int nw){ if(treat_as_a_whole()){ _cr=nw; for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->cr(nw); } }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->cr(nw); } } } void multiline_label::cg(int nw){ if(treat_as_a_whole()){ _cg=nw; for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->cg(nw); } }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->cg(nw); } } } void multiline_label::cb(int nw){ if(treat_as_a_whole()){ _cb=nw; for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->cb(nw); } }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->cb(nw); } } } int multiline_label::font(){ int res=_font; if(!treat_as_a_whole()){ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->font(); } } return res; } int multiline_label::dim(){ int res=5; if(cairo_t_singleton::can_export()){ res=phys_dim(); }else{ res=visual_dim(); } return res; } int multiline_label::phys_dim(){ int res=_dim; if(!treat_as_a_whole()){ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->phys_dim(); }else{ res=0; } } return res; } int multiline_label::visual_dim(){ int res=static_cast(rintf(phys_dim()*__pref.getZoom())); if(res<5){ res=5; } return res; } void multiline_label::dim(int nw){ if(treat_as_a_whole()){ _dim=nw; for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->dim(nw); } }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->dim(nw); } } } float multiline_label::x(){ float res=0; if( cairo_t_singleton::can_export()){ res=phys_x(); }else{ res=visual_x(); } return res; } float multiline_label::visual_x(){ //int res=static_cast(rintf(phys_x()*__pref.getZoom())); float res=phys_x()*__pref.getZoom(); return res; } float multiline_label::phys_x(){ float res=_x; if(!treat_as_a_whole()){ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->phys_x(); }else{ res=0; } } return res; } float multiline_label::y(){ float res=0; if(cairo_t_singleton::can_export()){ res=phys_y(); }else{ res=visual_y(); } return res; } float multiline_label::visual_y(){ // int res=static_cast(rintf(phys_y()*__pref.getZoom())); float res=phys_y()*__pref.getZoom(); return res; } float multiline_label::phys_y(){ float res=_y; if(!treat_as_a_whole()){ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->phys_y(); }else{ res=0; } } return res; } void multiline_label::font(int nw){ if(treat_as_a_whole()){ _font=nw; for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->font(nw); } }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->font(nw); } } } void multiline_label::x(float nw){ if(treat_as_a_whole()){ _x=nw; }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->x(nw); } } } void multiline_label::y(float nw){ if(treat_as_a_whole()){ _y=nw; }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->y(nw); } } } void multiline_label::misura(float& altris,float& larris ){ if(cairo_t_singleton::can_export()){ phys_misura(altris,larris); }else{ visual_misura(altris,larris); } } /** *Misura l'altezza e la larghezza di questa etichetta tenendo conto dello zoom *\param altris l'altezza dell'etichetta *\param larris la larghezza dell'etichetta */ void multiline_label::visual_misura(float& altris,float& larris ){ if(treat_as_a_whole()){ phys_misura_as_a_whole(altris,larris); altris*=__pref.getZoom(); larris*=__pref.getZoom(); }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->visual_misura(altris,larris); } } } void multiline_label::phys_misura(float& altris,float& larris ){ if(treat_as_a_whole()){ if(cairo_t_singleton::can_export()){ multiline_label cp(*this); cp.merge_labels_amap(); cp.format_paragraph(); cp.phys_misura_as_a_whole(altris,larris); }else{ phys_misura_as_a_whole(altris,larris); } }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->phys_misura(altris,larris); } } } void multiline_label::phys_misura_as_a_whole(float& altris,float& larris ){ if(static_cast(size_lines_of_text())>0){ format_paragraph(); float ypos_max=-1; float ypos_min=10000000; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->phys_y() < ypos_min){ ypos_min=_lines_of_text[i]->phys_y(); } if(_lines_of_text[i]->phys_y() + _lines_of_text[i]->phys_h() > ypos_max){ ypos_max=_lines_of_text[i]->phys_y() + _lines_of_text[i]->phys_h(); } } float xpos_max=-1; float xpos_min=10000000; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->phys_x() < xpos_min){ xpos_min=_lines_of_text[i]->phys_x(); } if(_lines_of_text[i]->phys_x() + _lines_of_text[i]->phys_w() > xpos_max){ xpos_max=_lines_of_text[i]->phys_x()+ _lines_of_text[i]->phys_w(); } } altris=ypos_max - ypos_min; larris=xpos_max - xpos_min; if(layout_lines()!=MULTILINE_LABEL_ALIGN_SINGLE_LINE_TEXT_LAYOUT){ altris+= phys_interline_space(); } }else{ altris=0; larris=0; } } float multiline_label::h(){ float h=0; float w=0; if( cairo_t_singleton::can_export()){ phys_misura(h,w); }else{ visual_misura(h,w); } return h; } float multiline_label::visual_h(){ float h=0; float w=0; if(treat_as_a_whole()){ visual_misura(h,w); }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->visual_misura(h,w); } } return h; } float multiline_label::phys_h(){ float h=0; float w=0; if(treat_as_a_whole()){ phys_misura(h,w); }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->phys_misura(h,w); } } return h; } float multiline_label::w(){ float h=0; float w=0; if( cairo_t_singleton::can_export()){ phys_misura(h,w); }else{ visual_misura(h,w); } return w; } float multiline_label::visual_w(){ float h=0; float w=0; if(treat_as_a_whole()){ visual_misura(h,w); }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->visual_misura(h,w); } } return w; } float multiline_label::phys_w(){ float h=0; float w=0; if(treat_as_a_whole()){ phys_misura(h,w); }else{ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->phys_misura(h,w); } } return w; } float multiline_label::interline_space(){ float res=0; if(cairo_t_singleton::can_export()){ res=phys_interline_space(); }else{ res=visual_interline_space(); } return res; } int multiline_label::interline_space(int nw){ int old=_interline_space; _interline_space=nw; return old; } float multiline_label::phys_interline_space(){ return _interline_space; } float multiline_label::visual_interline_space(){ return _interline_space * __pref.getZoom(); } std::vector< std::pair > multiline_label::vec_str(){ std::vector< std::pair > res=etichetta::vec_str(); if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->vec_str(); } return res; } void multiline_label::aggiungi(std::string nw, int tipo){ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->aggiungi(nw,tipo); } } void multiline_label::add_line(etichetta new_line){ etichetta* tmp=new etichetta(new_line); add_line(tmp); } void multiline_label::add_line(etichetta* new_line){ _lines_of_text.push_back(new_line); _pointer_to_currline=_lines_of_text.size()-1; } void multiline_label::add_line(etichetta new_line,int pos){ if(pos>=0 && static_cast(pos) < _lines_of_text.size()){ etichetta* tmp=new etichetta(new_line); add_line(tmp,pos); } } void multiline_label::add_line(etichetta* new_line, int pos){ if(pos>=0 && static_cast(pos) < _lines_of_text.size()){ if(static_cast(pos)==_lines_of_text.size()-1){ add_line(new_line); }else{ std::vector::iterator beg=_lines_of_text.begin() + pos + 1; _lines_of_text.insert(beg,new_line); _pointer_to_currline=pos+1; } } } void multiline_label::insert(std::string nw, int type, int pos){ if(ptr_line_less_lines_text()){ _lines_of_text[_pointer_to_currline]->insert(nw,type,pos); } } void multiline_label::insert_line(etichetta new_line, int pos){ std::vector ::iterator pos_iter=_lines_of_text.begin()+pos; if(pos>=0 && pos_iter<_lines_of_text.end()){ etichetta* tmp=new etichetta(new_line); insert_line(tmp,pos); } } void multiline_label::insert_line(etichetta* new_line, int pos){ std::vector ::iterator pos_iter=_lines_of_text.begin()+pos; if(pos >=0 && pos_iter<_lines_of_text.end()){ _lines_of_text.insert(pos_iter,new_line); } } void multiline_label::delete_line(int pos, bool reset_pointer_currline){ etichetta* to_delete=0; std::vector ::iterator pos_iter=_lines_of_text.begin()+pos; if(pos>=0 && static_cast(pos) < _lines_of_text.size()){ to_delete=*pos_iter; _lines_of_text.erase(pos_iter); if(reset_pointer_currline){ reset_pointer_to_currline(); } } delete to_delete; } void multiline_label::subst_line(etichetta* nw, int pos){ delete_line(pos,false); if(static_cast(pos)!=_lines_of_text.size()){ insert_line(nw,pos); }else{ _lines_of_text.push_back(nw); } } etichetta multiline_label::get_line_copy(int pos) throw (out_of_range){ if(pos>=0 && pos < static_cast(_lines_of_text.size())){ etichetta rt(_lines_of_text[pos]); return rt; }else{ string exc="Errore _pointer_to_currline out of bound: " + string(__FUNCTION__); throw out_of_range(exc); } } int multiline_label::elimina(std::string ricercata){ int res=0; if(treat_as_a_whole()){ for(unsigned int i=0;i<_lines_of_text.size();i++){ int tmp_res=_lines_of_text[i]->elimina(ricercata); if(tmp_res == 1){ res=tmp_res; } } }else{ if(ptr_line_less_lines_text()){ res=_lines_of_text[_pointer_to_currline]->elimina(ricercata); } } return res; } void multiline_label::elimina(){ for(unsigned int i=0;i< _lines_of_text.size(); i++){ delete _lines_of_text[i]; } _lines_of_text.erase(_lines_of_text.begin(),_lines_of_text.end()); //std::cerr << "multiline_label::elimina()" << std::endl; } float multiline_label::calculate_last_line_y(bool add_interline){ return 0; } bool multiline_label::treat_as_a_whole(){ return _treat_as_a_whole; } bool multiline_label::treat_as_a_whole(bool nw){ bool old=treat_as_a_whole(); _treat_as_a_whole=nw; return old; } void multiline_label::format_paragraph(){ switch(layout_lines()){ case MULTILINE_LABEL_ALIGN_LEFT_TEXT_LAYOUT: { format_lines_align_left(); } break; case MULTILINE_LABEL_ALIGN_RIGHT_TEXT_LAYOUT: { format_lines_align_right(); } break; case MULTILINE_LABEL_ALIGN_CENTER_TEXT_LAYOUT: { format_lines_align_center(); } break; case MULTILINE_LABEL_ALIGN_SINGLE_LINE_TEXT_LAYOUT: { for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->y(_y); int total_w=0; for(unsigned int j=0;jphys_w(); } _lines_of_text[i]->x(_x+total_w); } } break; default: format_lines_align_center(); break; } } void multiline_label::draw_cursor(bool draw){ if(treat_as_a_whole()){ _draw_cursor=draw; for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->draw_cursor(draw); } }else if(pointer_to_currline()>=0 && _lines_of_text.size()>0){ _lines_of_text[pointer_to_currline()]->draw_cursor(draw); } } void multiline_label::disegna(){ if(cairo_t_singleton::can_export()){ multiline_label cp(*this); cp.merge_labels_amap(); cp.format_paragraph(); cp.draw_label_export(); }else{ format_paragraph(); bool old_t=treat_as_a_whole(true); if(_draw_cursor){ draw_cursor(false); treat_as_a_whole(false); draw_cursor(true); } treat_as_a_whole(old_t); int max_desc=-1; int max_h=-1; for(unsigned int ct=0;ct<_lines_of_text.size();ct++){ if(_lines_of_text[ct]->get_fltk_baseline() > max_desc){ max_desc=_lines_of_text[ct]->get_fltk_baseline(); max_h=_lines_of_text[ct]->h(); } } for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->h() < max_h){ //_lines_of_text[i]->trasla(0, // _lines_of_text[i]->get_fltk_baseline()-max_desc ); } /* int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); fl_rect(_lines_of_text[i]->x()+dx_scroll, _lines_of_text[i]->y()+dy_scroll, _lines_of_text[i]->w(), _lines_of_text[i]->h()); */ _lines_of_text[i]->disegna(); } /* std::cerr << "x: " << x() << " y: " << y() << std::endl; std::cerr << "w: " << w << " h: " << h << std::endl; */ //int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); // int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); old_t=treat_as_a_whole(true); //int h; //int w; //misura(h,w); //std::cerr << h << std::endl; //fl_rect(x()+dx_scroll, y()+dy_scroll,w,h); treat_as_a_whole(old_t); } } void multiline_label::draw_label_export(){ int baseline_max_h=-1; float y_max_h=-1; //find max height int max_h=-1; for(unsigned int ct=0;ct<_lines_of_text.size();ct++){ if(_lines_of_text[ct]->phys_h() > max_h){ max_h=_lines_of_text[ct]->phys_h(); baseline_max_h=_lines_of_text[ct]->get_pango_baseline(); y_max_h=_lines_of_text[ct]->y(); } } for(unsigned int i=0;i<_lines_of_text.size();i++){ //if(i==0){ //int y=_lines_of_text[i]->get_pango_logical_y(); //_lines_of_text[i]->phys_translate(0,-y); //y_max_h=_lines_of_text[i]->y(); //} int baseline_curr=_lines_of_text[i]->get_pango_baseline(); float diff= (y_max_h + baseline_max_h) -(_lines_of_text[i]->y()+baseline_curr) ; if(_layout_lines==MULTILINE_LABEL_ALIGN_SINGLE_LINE_TEXT_LAYOUT){ _lines_of_text[i]->phys_translate(0,diff); } /* cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); int yy=_lines_of_text[i]->y(); cairo_set_source_rgb(cn,0,1,0); cairo_move_to(cn,_lines_of_text[i]->x(),yy); cairo_line_to(cn,_lines_of_text[i]->x()+500,yy); cairo_stroke(cn); yy=_y; cairo_set_source_rgb(cn,0,1,1); cairo_move_to(cn,_lines_of_text[0]->x(),yy); cairo_line_to(cn,_lines_of_text[0]->x()+100,yy); cairo_stroke(cn); cairo_restore(cn); */ _lines_of_text[i]->disegna(); } } void multiline_label::trasla(float dx, float dy){ if(treat_as_a_whole()){ x(descale(x()+dx)); y(descale(y()+dy)); }else{ } } void multiline_label::phys_translate(float dx, float dy){ if(treat_as_a_whole()){ x(x()+dx); y(y()+dy); }else{ } } void multiline_label::scale(float sc){ if(sc<1){ if(phys_dim()>6){ for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->dim(_lines_of_text[i]->phys_dim()-1); } } }else{ for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->dim(_lines_of_text[i]->phys_dim()+1); } } } void multiline_label::ruota(float xpiv, float ypiv,float angl){ not_impl(); } bool multiline_label::dentro_bb(float x_bb, float y_bb, float w_bb , float h_bb){ //std::cerr << "ooooooo" << std::endl; if(x() > x_bb && x()+w() y_bb && y()+h() ics_e && posx_m < ics_e+w_e && posy_m > ips_e && posy_m < ips_e+h_e){ return 0; }else{ return -1; } } */ void multiline_label::pointer_to_currline(int nw){ if(static_cast(nw)<_lines_of_text.size()){ _pointer_to_currline=nw; } } int multiline_label::pointer_to_currline(){ return _pointer_to_currline; } int multiline_label::pointer_to_currline_transl(int delta){ int nw=pointer_to_currline()+delta; int old=pointer_to_currline(); if(nw>=0 && static_cast(nw) < _lines_of_text.size()){ pointer_to_currline(nw); } return old; } bool multiline_label::cursor_one_step_back(int &curr_type){ int ptr_line=pointer_to_currline(); bool has_more=true; if(ptr_line>=0 && ptr_line_less_lines_text()){ int currt=0; bool not_beg = _lines_of_text[ptr_line]->cursor_one_step_back(currt); if(!not_beg){ pointer_to_currline_transl(-1); ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ std::vector < std::pair > the_vec_str= _lines_of_text[ptr_line]->vec_str(); int size_f=the_vec_str.size()-1; int size_s=(the_vec_str.back().first).size(); _lines_of_text[ptr_line]->set_cursor_position(size_f,size_s); } } }else{ has_more=false; } return has_more; } int multiline_label::set_cursor_position(int limit){ int res=-1; int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->set_cursor_position(limit); } return res; } /** *set cursor pos */ void multiline_label::set_cursor_position( int pos_in_vec, string::size_type pos_in_string){ std::pair pos(pos_in_vec,pos_in_string); set_cursor_position(pos); } void multiline_label::set_cursor_position(std::pair pos){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->set_cursor_position(pos); } } void multiline_label::set_cursor_position_abs(int line, int pos_in_vec, string::size_type pos_in_string){ if(line >=0 && line < static_cast(size_lines_of_text())){ pointer_to_currline(line); _lines_of_text[pointer_to_currline()]->set_cursor_position(pos_in_vec,pos_in_string); } } void multiline_label::set_cursor_position_abs(int line, std::pair pos){ if(line >=0 && line < static_cast(size_lines_of_text())){ pointer_to_currline(line); _lines_of_text[pointer_to_currline()]->set_cursor_position(pos.first,pos.second); } } void multiline_label::go_to_end_of_label(){ if(size_lines_of_text()>0){ for(unsigned int i=0;igo_to_end_of_label(); } pointer_to_currline(size_lines_of_text()-1); } } void multiline_label::go_to_end_of_line(){ if(size_lines_of_text()>0 && pointer_to_currline()>=0 && ptr_line_less_lines_text()){ _lines_of_text[pointer_to_currline()]->go_to_end_of_line(); } } void multiline_label::go_to_start_of_label(){ if(size_lines_of_text()>0){ for(unsigned int i=0;igo_to_start_of_label(); } pointer_to_currline(0); } } void multiline_label::go_to_start_of_line(){ if(size_lines_of_text()>0 && pointer_to_currline()>=0 && ptr_line_less_lines_text()){ _lines_of_text[pointer_to_currline()]->go_to_start_of_line(); } } int multiline_label::get_cursor_position(std::pair* pos){ int res=-1; int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->get_cursor_position(pos); } return res; } bool multiline_label::cursor_one_step_fwd(int &curr_type){ int ptr_line=pointer_to_currline(); bool has_more=true; if(ptr_line>=0 && ptr_line_less_lines_text()){ int currt=0; bool not_end = _lines_of_text[ptr_line]->cursor_one_step_fwd(currt); if(!not_end){ pointer_to_currline_transl(1); ptr_line=pointer_to_currline(); if(ptr_line>0 && ptr_line_less_lines_text() //&& //static_cast(ptr_line) < _lines_of_text.size()-1){ ){ _lines_of_text[ptr_line]->set_cursor_position(0,0); } } }else{ has_more=false; } return has_more; } void multiline_label::insert_string_in_curr_pos(std::string str,int type){ int ptr_line=pointer_to_currline(); //std::cerr << "ptr_line " << ptr_line << std::endl; if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->insert_string_in_curr_pos(str,type); }else if(_lines_of_text.size()==0){ etichetta* tmp=new etichetta(); tmp->aggiungi(str,ET_STR); tmp->set_cursor_position(0,str.size()); tmp->reset_cursor_if_outside_limits(); add_line(tmp); } } bool multiline_label::ptr_line_less_lines_text(){ bool res=false; if(static_cast(pointer_to_currline()) < _lines_of_text.size()){ res=true; } return res; } bool multiline_label::ptr_line_is_last_line(){ return pointer_to_currline() == static_cast((_lines_of_text.size()-1)); } void multiline_label::reset_cursor_if_outside_limits(){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->reset_cursor_if_outside_limits(); } } void multiline_label::reset_pointer_to_currline(){ if(_lines_of_text.size() == 0){ _pointer_to_currline=-1; }else if(static_cast(_pointer_to_currline) >= _lines_of_text.size()){ _pointer_to_currline=_lines_of_text.size()-1; } } bool multiline_label::check_if_type_etic(int typ) throw (out_of_range){ bool res=false; int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->check_if_type_etic(typ); } return res; } bool multiline_label::check_if_type_etic(int typ,int pos) throw (out_of_range){ bool res=false; int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->check_if_type_etic(typ,pos); } return res; } bool multiline_label::check_if_type_etic_next_chunk(int equal,bool &res_next_exist){ bool res=false; int ptr_line=pointer_to_currline(); res_next_exist=false; if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->check_if_type_etic_next_chunk(equal,res_next_exist); } return res; } bool multiline_label::check_if_type_etic_previous_chunk(int equal,bool &res_prev_exist){ bool res=false; int ptr_line=pointer_to_currline(); res_prev_exist=false; if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->check_if_type_etic_previous_chunk(equal,res_prev_exist); } return res; } int multiline_label::type_etic_at_cur_pos(){ int res=-1; int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->type_etic_at_cur_pos(); } return res; } void multiline_label::delete_char_curr_pos(bool before){ int ptr_line=pointer_to_currline(); std::pair curpos; get_cursor_position(&curpos); if(_lines_of_text.size()>0){ std::vector < std::pair > the_vec_str= _lines_of_text[ptr_line]->vec_str(); if(curpos.first==0 && curpos.second==0 && before){ int currtype=0; cursor_one_step_back(currtype); }else if(curpos.first==static_cast(the_vec_str.size()-1) && curpos.second==(the_vec_str[curpos.first]).first.size() && !ptr_line_is_last_line() && ! before){ int currtype=0; //i have to statically set the function to avoid infinite //recursion in inerithed classes of multiline_label //(i.e. multifont_label::cursor_one_step_fwd) multiline_label::cursor_one_step_fwd(currtype); delete_char_curr_pos(before); }else{ if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->delete_char_curr_pos(before); } if(_lines_of_text.size()>0 && _lines_of_text[ptr_line]->size_str()==0){ delete_line(ptr_line,true); } } } } void multiline_label::manage_sub_super(int check, int troublesome,std::string car){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->manage_sub_super(check,troublesome,car); } } bool multiline_label::manage_add_sub_super_next_normal_str(int type){ int ptr_line=pointer_to_currline(); bool res=false; if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->manage_add_sub_super_next_normal_str(type); } return res; } bool multiline_label::manage_add_sub_next_super(int type){ int ptr_line=pointer_to_currline(); bool res=false; if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->manage_add_sub_next_super(type); } return res; } void multiline_label::insert_char_in_curr_pos(char add, int type){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->insert_char_in_curr_pos(add,type); } } void multiline_label::break_string_at_cur_pos(int breaking_type){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->break_string_at_cur_pos(breaking_type); } } void multiline_label::break_sub_super(int me, int type_to_insert,bool is_after){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->break_sub_super(me,type_to_insert,is_after); } } void multiline_label::break_sub_or_super(int me, int type_to_insert){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->break_sub_or_super(me,type_to_insert); } } void multiline_label::break_normal_str(int type_to_insert){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->break_normal_str(type_to_insert); } } bool multiline_label::break_and_split_normal_str(etichetta** left , etichetta** right){ int ptr_line=pointer_to_currline(); bool res=false; if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->break_and_split_normal_str(left,right); } return res; } std::vector multiline_label::get_lines_text(){ return _lines_of_text; } bool multiline_label::dump_label(){ std::cerr << __FUNCTION__ << std::endl; std::cerr << __FUNCTION__ << " x() " << x() << std::endl; std::cerr << __FUNCTION__ << " y() " << y() << std::endl; std::cerr << __FUNCTION__ << " interline_space() " << interline_space() << std::endl; for(unsigned int i =0;i< _lines_of_text.size();i++){ std::cerr << __FUNCTION__ << "str " << _lines_of_text[i]->to_raw_string() << std::endl; } return true; } int multiline_label::layout_lines(){ return _layout_lines; } void multiline_label::layout_lines(int nw){ _layout_lines=nw; } void multiline_label::format_lines_align_left(){ for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->x(_x); int total_h=0; for(unsigned int j=0;jphys_h(); total_h+=phys_interline_space(); } _lines_of_text[i]->y(_y+total_h); } } void multiline_label::format_lines_align_right(){ float w_max=0; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->w() > w_max){ w_max=_lines_of_text[i]->w(); } } for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->x(_x + (w_max - _lines_of_text[i]->w()) ); int total_h=0; for(unsigned int j=0;jphys_h(); total_h+=phys_interline_space(); } _lines_of_text[i]->y(_y+total_h); } } void multiline_label::format_lines_align_center(){ float w_max=0; for(unsigned int i=0;i<_lines_of_text.size();i++){ if(_lines_of_text[i]->w() > w_max){ w_max=_lines_of_text[i]->w(); } } for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->x(_x + w_max/2 - _lines_of_text[i]->w()/2 ); int total_h=0; for(unsigned int j=0;jphys_h(); total_h+=phys_interline_space(); } _lines_of_text[i]->y(_y+total_h); } } void multiline_label::increase_highlighted(){ std::vector::iterator beg=_lines_of_text.begin()+pointer_to_currline(); std::vector::iterator end=_lines_of_text.end(); if(begdraw_negative()==true ){ beg++; } if(beg!=end){ (*beg)->draw_negative(true); } } } void multiline_label::decrease_highlighted(){ int i=_lines_of_text.size()-1; for(;i>=0;i--){ if(_lines_of_text[i]->draw_negative()==true){ _lines_of_text[i]->draw_negative(false); break; } } } void multiline_label::de_highlight(){ for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->draw_negative(false); } } void multiline_label::draw_negative(bool nw){ if(treat_as_a_whole()){ for(unsigned int i=0;i<_lines_of_text.size();i++){ _lines_of_text[i]->draw_negative(nw); } }else{ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ _lines_of_text[ptr_line]->draw_negative(nw); } } } bool multiline_label::draw_negative(){ bool res=_draw_negative; if(!treat_as_a_whole()){ int ptr_line=pointer_to_currline(); if(ptr_line>=0 && ptr_line_less_lines_text()){ res=_lines_of_text[ptr_line]->draw_negative(); } } return res; } unsigned int multiline_label::size_lines_of_text(){ return _lines_of_text.size(); } void multiline_label::merge_labels_amap(){ if(_lines_of_text.size()>1){ std::vector merged; for(unsigned int i=0;i< _lines_of_text.size();){ etichetta* tmp=new etichetta(_lines_of_text[i]); //std::cerr << "i primo ciclo " << i << std::endl; bool found_join=false; //DEBUG_TO_CERR(tmp->to_raw_string()); for(unsigned int j=i+1;j< _lines_of_text.size();j++) { //std::cerr << "i " << i << " j " << j << std::endl; if(tmp->font()==_lines_of_text[j]->font() && tmp->dim()==_lines_of_text[j]->dim()){ //std::cerr << "aggiungo " << _lines_of_text[j]->to_raw_string() << std::endl; found_join=true; vector < pair > vec=_lines_of_text[j]->vec_str(); for(unsigned int ct=0;ctaggiungi(vec[ct].first,vec[ct].second); } i=j+1; }else{ //std::cerr << "esco ma aggiungo " << _lines_of_text[j]->to_raw_string() << std::endl; break; } } if(!found_join){ i++; } //std::cerr << "alla fine i=" << i << std::endl; merged.push_back(tmp); } for(unsigned int i=0;imelt_similar(0); //std::cerr << "merged: "<< i << " " << merged[i]->to_raw_string() << std::endl; } //delete old lines for(unsigned int i=0;i< _lines_of_text.size(); i++){ //std::cerr << "eliminata merged" << _lines_of_text[i] << std::endl; delete _lines_of_text[i]; } //_lines_of_text.erase(_lines_of_text.begin(),_lines_of_text.end()); _lines_of_text=merged; reset_cursor_if_outside_limits(); reset_pointer_to_currline(); } } const int multiline_label::_default_interline_space=5; bist-0.5.2/src/immagine.cpp0000644000175000017500000053315711733641566014152 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include <2D_vector.hpp> #include extern finestra_pr* MainWindow; extern Preferences __pref; bool ordina_id_decr_elem_selected( pair < int, pair > uno , pair < int, pair > altro){ int ui=(uno.second).second; int ai=(altro.second).second; return ui > ai; } /***********immagine***************/ immagine::immagine(bool preview) :_trovato_apice(false), _trovato_pedice(false), _has_error(false), _punt_mol(0), _filebist(""), _is_preview(preview) { /* cout << "GRUPPI.SIZE() " << _gruppi.size() << endl; cout <<"costr: _legami_selected " << _legami_selected.size() << endl; cout << "GRPSZ: " << _gruppi.size() << endl; cout << "ETCHSZ " << _stringhe.size() << endl; */ create_progressw(); } immagine::~immagine(){ #ifdef DEBUG cout << "immagine distruttore " << this << endl; cout <<"distr: _legami_selected " << _legami_selected.size() << " " << this << endl; #endif for(unsigned int i=0; i<_legami_selected.size();i++){ delete [] _legami_selected[i]; } for(unsigned int i=0; i<_stringhe.size();i++){ // std::cerr << "elimino stringa " << _stringhe[i] << std::cerr; delete _stringhe[i]; } delete _export_progressw; //no need to free _export_progressw_bar, done from parent //delete _export_progressw_bar; } immagine::immagine(const immagine& altra) :_trovato_apice(altra._trovato_apice), _trovato_pedice(altra._trovato_pedice), _has_error(false), _punt_mol(0), _filebist(altra._filebist), _molecule(""), //sparagnamo memoria? _gruppi(altra._gruppi), _elem_selected(altra._elem_selected), _is_preview(altra._is_preview) { create_progressw(); for(unsigned int i=0;i(altra._stringhe[i]); multiline_label* tmp=new multiline_label(mll); if(mll){ _stringhe.push_back(tmp); } }else if( typeid(*(altra._stringhe[i])) == typeid(paragraph_text) ){ paragraph_text* mll=dynamic_cast(altra._stringhe[i]); paragraph_text* tmp=new paragraph_text(mll); if(mll){ _stringhe.push_back(tmp); } }else if(typeid(*(altra._stringhe[i]))==typeid(etichetta)){ etichetta* tmp=new etichetta(altra._stringhe[i]); _stringhe.push_back(tmp); } } } immagine::immagine(const immagine* altra) :_trovato_apice(altra->_trovato_apice), _trovato_pedice(altra->_trovato_pedice), _has_error(false), _punt_mol(0), _filebist(altra->_filebist), _molecule(""), _gruppi(altra->_gruppi), _elem_selected(altra->_elem_selected), _is_preview(altra->_is_preview) { create_progressw(); for(unsigned int i=0;i_legami_selected.size();i++){ int* val=new int[3]; for(int i2=0;i2<3;i2++){ val[i2]=(altra->_legami_selected[i])[i2]; } _legami_selected.push_back(val); } for(unsigned int i=0;i < (altra->_stringhe.size()) ;i++){ if( typeid(*(altra->_stringhe[i])) == typeid(multiline_label) ){ multiline_label* mll=dynamic_cast(altra->_stringhe[i]); multiline_label* tmp=new multiline_label(mll); if(mll){ _stringhe.push_back(tmp); } }else if( typeid(*(altra->_stringhe[i])) == typeid(paragraph_text) ){ paragraph_text* mll=dynamic_cast(altra->_stringhe[i]); paragraph_text* tmp=new paragraph_text(mll); if(mll){ _stringhe.push_back(tmp); } }else if(typeid(*(altra->_stringhe[i]))==typeid(etichetta)){ etichetta* tmp=new etichetta(altra->_stringhe[i]); _stringhe.push_back(tmp); } } } immagine& immagine::operator=(const immagine& altra){ _trovato_apice=altra._trovato_apice; _trovato_pedice=altra._trovato_pedice; _has_error=false; _punt_mol=0; _filebist=altra._filebist; _molecule=""; //sparagnamo memoria? _gruppi=altra._gruppi; _elem_selected=altra._elem_selected; _is_preview=altra._is_preview; create_progressw(); for(unsigned int i=0;i(altra._stringhe[i]); multiline_label* tmp=new multiline_label(mll); if(mll){ _stringhe.push_back(tmp); } }else if( typeid(*(altra._stringhe[i])) == typeid(paragraph_text) ){ paragraph_text* mll=dynamic_cast(altra._stringhe[i]); paragraph_text* tmp=new paragraph_text(mll); if(mll){ _stringhe.push_back(tmp); } }else if(typeid(*(altra._stringhe[i]))==typeid(etichetta)){ etichetta* tmp=new etichetta(altra._stringhe[i]); _stringhe.push_back(tmp); } } return (*this); } immagine& immagine::operator=(const immagine* altra){ _trovato_apice=altra->_trovato_apice; _trovato_pedice=altra->_trovato_pedice; _has_error=false; _punt_mol=0; _filebist=altra->_filebist; _molecule=""; _gruppi=altra->_gruppi; _elem_selected=altra->_elem_selected; _is_preview=altra->_is_preview; create_progressw(); for(unsigned int i=0;i_legami_selected.size();i++){ int* val=new int[3]; for(int i2=0;i2<3;i2++){ val[i2]=(altra->_legami_selected[i])[i2]; } _legami_selected.push_back(val); } for(unsigned int i=0;i < (altra->_stringhe.size()) ;i++){ if( typeid(*(altra->_stringhe[i])) == typeid(multiline_label) ){ multiline_label* mll=dynamic_cast(altra->_stringhe[i]); multiline_label* tmp=new multiline_label(mll); if(mll){ _stringhe.push_back(tmp); } }else if( typeid(*(altra->_stringhe[i])) == typeid(paragraph_text) ){ paragraph_text* mll=dynamic_cast(altra->_stringhe[i]); paragraph_text* tmp=new paragraph_text(mll); if(mll){ _stringhe.push_back(tmp); } }else if(typeid(*(altra->_stringhe[i]))==typeid(etichetta)){ etichetta* tmp=new etichetta(altra->_stringhe[i]); _stringhe.push_back(tmp); } } return (*this); } void immagine::paste(int xt,int yt){ /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP *vector< pair < int, pair > > _elem_selected; */ vector nuovi_gruppi; vector id_gruppi_trovati; //troviamo i gruppi diversi for(unsigned int i=0;i<_elem_selected.size();i++){ int id_gr_att=(_elem_selected[i].second).first; if(id_gr_att!=NO_VALID_GROUP){ if(find(id_gruppi_trovati.begin(),id_gruppi_trovati.end(),id_gr_att)== id_gruppi_trovati.end() || id_gruppi_trovati.size()<=0){ gruppo tmp; nuovi_gruppi.push_back(tmp); id_gruppi_trovati.push_back(id_gr_att); } } } // cout << "iio" << nuovi_gruppi.size() << endl; for(unsigned int i=0;iid() << " in gruppo " << tmp->id_gruppo() // << endl; break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: case PROC_BOX: { procedura* adding=_gruppi[grp].find_proc_id((_elem_selected[ct_atom].second).second); nuovi_gruppi[i].aggiungi_procedura(adding); break; } } } } } } } float ref_x_etic=0; float ref_y_etic=0; bool etich_found=false; float xtrasl=0; float ytrasl=0; //trasliamo if(nuovi_gruppi.size()>0){ xtrasl=nuovi_gruppi[0].posx(); ytrasl=nuovi_gruppi[0].posy(); for(unsigned int i=0;i(tmp_ptr)); }else if(typeid(*tmp_ptr)==typeid(multiline_label)){ to_add=new multiline_label(dynamic_cast(tmp_ptr)); } if(to_add!=NULL){ //trasliamo if(!etich_found){ ref_x_etic=xt - tmp_ptr->visual_x(); ref_y_etic=yt - tmp_ptr->visual_y(); xtrasl=xt - to_add->visual_x(); ytrasl=yt - to_add->visual_y(); etich_found=true; }else{ xtrasl=ref_x_etic; ytrasl=ref_y_etic; } /* std::cerr << "PIPOO xtrasl=" << xtrasl << " xt=" << xt << " - " << to_add.visual_x() << " = "<< xt - to_add.visual_x() << " descale(xt - to_add.visual_x())= " << descale(xt - to_add.visual_x())<< " " <trasla(xtrasl,ytrasl); add_etich(to_add); } } } //ripuliamo dai legami ad atomi inesistenti for(unsigned int i=0;i::iterator inatom=nuovi_gruppi[i].iniz_atom(); vector::iterator finatom=nuovi_gruppi[i].fin_atom(); while(inatom!=finatom){ vector::iterator primo=(*inatom).primo_leg(); vector::iterator ultimo=(*inatom).ultimo_leg(); while(primo!=ultimo){ int id_atom_legato=(*primo).id_atomo(); //cout << " iio cerco " << id_atom_legato << "in " << (*inatom).id() << endl; if(nuovi_gruppi[i].find_atomo_id(id_atom_legato)==0){ (*inatom).elimina_legame(id_atom_legato); //cout << "iio eliminato legame " << (*inatom).id() << "->" << id_atom_legato << endl; } primo++; } inatom++; } } //rimappiamo gli id in modo da evitare conflitti if(_gruppi.size()>0){ int strt=(_gruppi.back()).id_gruppo()+1; for(unsigned int i=0;i=0){ _gruppi.push_back(nuovi_gruppi[i]); } } /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP *vector< pair < int, pair > > _elem_selected; */ /* LASCIARE O TOGLIERE??? elimina_elem_selected(); elimina_legami_selected(); */ #ifdef DEBUG dump_tmp_atom(); #endif } /** *Disegna l'oggetto. */ void immagine::disegna(){ float _progress_value_incr=1./(static_cast(_gruppi.size())+_stringhe.size()); float _progress_value_mult=1; if(cairo_t_singleton::can_export()){ //exporting here do calculation for progressbar _export_progressw_bar->value(0); _export_progressw->show(); Fl::check(); } for (unsigned int i=0;i<_gruppi.size();i++){ _gruppi[i].disegna(); if(cairo_t_singleton::can_export()){ _export_progressw_bar->value(_progress_value_mult*_progress_value_incr); _progress_value_mult++; Fl::check(); } } for(unsigned int sct=0;sct<_stringhe.size();sct++){ _stringhe[sct]->disegna(); if(cairo_t_singleton::can_export()){ _export_progressw_bar->value(_progress_value_mult*_progress_value_incr); _progress_value_mult++; Fl::check(); } } if(!cairo_t_singleton::can_export()){ highlight_selected(); }else{ _export_progressw->hide(); } } void immagine::ruota(float xpiv, float ypiv,float angl){ for (unsigned int i=0;i<_gruppi.size();i++){ _gruppi[i].ruota(xpiv,ypiv,angl); } } void immagine::ruota(){ for (unsigned int i=0;i<_gruppi.size();i++){ _gruppi[i].ruota(); } } void immagine::trasla(float dx, float dy){ for (unsigned int i=0;i<_gruppi.size();i++){ _gruppi[i].trasla(dx,dy); } for(unsigned int ie=0;ie<_stringhe.size();ie++){ _stringhe[ie]->trasla(dx,dy); } } void immagine::scale(float sc){ for (unsigned int i=0;i<_gruppi.size();i++){ _gruppi[i].scale(sc); } for(unsigned int ie=0;ie<_stringhe.size();ie++){ _stringhe[ie]->scale(sc); } /* for (int i=0;i<_gruppi.size();i++){ //trasliamo vector::iterator proc_st=_gruppi[i].iniz_procedure(); vector::iterator proc_fin=_gruppi[i].fin_procedure(); while(proc_st!=proc_fin){ (*proc_st)->scale(sc); proc_st++; } } */ } float immagine::w(){ vector x; for(unsigned int i=0;i<_gruppi.size();i++){ x.push_back(_gruppi[i].posx()+_gruppi[i].w()); } for(unsigned int j=0;j<_stringhe.size();j++){ x.push_back(_stringhe[j]->x()+_stringhe[j]->w()); } return x.begin()!=x.end() ? (*max_element(x.begin(),x.end())) : 0; } float immagine::visual_w(){ vector x; for(unsigned int i=0;i<_gruppi.size();i++){ x.push_back(_gruppi[i].visual_posx()+_gruppi[i].visual_w()); } for(unsigned int j=0;j<_stringhe.size();j++){ x.push_back(_stringhe[j]->visual_x()+_stringhe[j]->visual_w()); } return x.begin()!=x.end() ? (*max_element(x.begin(),x.end())) : 0; } float immagine::phys_w(){ vector x; for(unsigned int i=0;i<_gruppi.size();i++){ x.push_back(_gruppi[i].phys_posx()+_gruppi[i].phys_w()); } for(unsigned int j=0;j<_stringhe.size();j++){ x.push_back(_stringhe[j]->phys_x()+_stringhe[j]->phys_w()); } return x.begin()!=x.end() ? (*max_element(x.begin(),x.end())) : 0; } float immagine::h(){ vector y; for(unsigned int i=0;i<_gruppi.size();i++){ y.push_back(_gruppi[i].posy()+_gruppi[i].h()); } for(unsigned int j=0;j<_stringhe.size();j++){ y.push_back(_stringhe[j]->y()+_stringhe[j]->h()); } return y.begin()!=y.end() ? (*max_element(y.begin(),y.end())) : 0; } float immagine::visual_h(){ vector y; for(unsigned int i=0;i<_gruppi.size();i++){ y.push_back(_gruppi[i].visual_posy()+_gruppi[i].visual_h()); } for(unsigned int j=0;j<_stringhe.size();j++){ y.push_back(_stringhe[j]->visual_y()+_stringhe[j]->visual_h()); } return y.begin()!=y.end() ? (*max_element(y.begin(),y.end())) : 0; } float immagine::phys_h(){ vector y; for(unsigned int i=0;i<_gruppi.size();i++){ y.push_back(_gruppi[i].phys_posy()+_gruppi[i].phys_h()); } for(unsigned int j=0;j<_stringhe.size();j++){ y.push_back(_stringhe[j]->phys_y()+_stringhe[j]->phys_h()); } return y.begin()!=y.end() ? (*max_element(y.begin(),y.end())) : 0; } /** *Costruisce, l'oggetto parsando il file passato come argomento. */ immagine::immagine(string path) :_trovato_apice(false), _trovato_pedice(false), _has_error(false), _punt_mol(0) { create_progressw(); filebist(path); } /** *Cancella tutta l'immagine ma senza deallocarla, non e' un distuttore. */ void immagine::reset_all(){ _has_error=false; _gruppi.erase(_gruppi.begin(),_gruppi.end()); _stringhe.erase(_stringhe.begin(),_stringhe.end()); elimina_err(); elimina_warn(); _molecule=""; _punt_mol=0; } void immagine::aggiungi_template(string templ_file){ struct stat attrb; stat(templ_file.c_str(),&attrb); if(!S_ISDIR(attrb.st_mode)){ _has_error=false; elimina_err(); elimina_warn(); _molecule=""; _punt_mol=0; _filebist=templ_file; if(templ_file==""){ return; } ifstream inf(_filebist.c_str(),ios::in); if(!inf){ _has_error=true; string error="Error: file " + _filebist + " do not exist."; _error.push_back(error); }else{ while(!inf.eof()){ string linea; getline(inf,linea,'\n'); if(static_cast(linea.find("#"))!=0 || linea.find("#")==string::npos ){ _molecule+=linea; } } clean_molecule_from_nullchars(); // string::size_type globpos=0; // while(globpos < _molecule.size()){ // string::size_type canc=_molecule.find_first_of(NULL_CHAR,globpos); // if(canc!=string::npos){ // char esc=' '; // try{ // esc=_molecule.at(globpos-1); // std::cerr << " esc->" << esc << std::endl; // if(string(1,esc)!=string(ESCAPE_CHAR)){ // globpos=canc; // _molecule.erase(globpos,1); // }else{ // std::cerr << "trovato escape! " << std::endl; // globpos+=2; // } // }catch (out_of_range e){ // std::cerr << " exception" << std::endl; // globpos=canc; // _molecule.erase(globpos,1); // } // }else{ // break; // } // } //cout << _molecule << endl; } inf.close(); start(); } } /** * */ void immagine::filebist(string path){ struct stat attrb; stat(path.c_str(),&attrb); if(!S_ISDIR(attrb.st_mode)){ reset_all(); _filebist=path; if(path==""){ return; } ifstream inf(_filebist.c_str(),ios::in); if(!inf){ _has_error=true; string error="Error: file " + _filebist + " do not exist."; _error.push_back(error); }else{ while(!inf.eof()){ string linea; getline(inf,linea,'\n'); if(static_cast(linea.find("#"))!=0 || linea.find("#")==string::npos ){ _molecule+=linea; } } clean_molecule_from_nullchars(); } inf.close(); } } bool immagine::has_error(){ return _has_error; } void immagine::start(){ /* cout << "GRPSZ: " << _gruppi.size() << endl; cout << "ETCHSZ " << _stringhe.size() << endl; */ if(!_has_error){ setlocale(LC_ALL,"C"); p_gruppo(); //inizializziamo tutte le procedure //cout << "GRPSZ: " << _gruppi.size() << endl; for (unsigned int i=0;i<_gruppi.size();i++){ vector::iterator st_prc=_gruppi[i].iniz_procedure(); vector::iterator en_prc=_gruppi[i].fin_procedure(); while(st_prc!=en_prc){ (*st_prc)->init(); st_prc++; } } //ordiniamo i gruppi sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); #ifdef DEBUG dump_tmp_atom(); #endif //DEBUG p_stringhe(); #ifdef DEBUG for(unsigned int ct=0;ct<_stringhe.size();ct++){ vector < pair > tmp_str_et=_stringhe[ct].vec_str(); cout << " *** etichetta: " << endl; for(unsigned int i2=0;i2::iterator st=_gruppi[i].iniz_atom(); vector::iterator en=_gruppi[i].fin_atom(); cout << "ID: " << (_gruppi[i]).id_gruppo() << endl; cout << "ANGOLOROT: " << (_gruppi[i]).angolorot() << endl; cout << "ROT_XPIVOT: " << (_gruppi[i]).xpivot() << endl; cout << "ROT_YPIVOT: " << (_gruppi[i]).ypivot() << endl; while(st!=en){ cout << (*st).id() << endl; st++; } vector::iterator iniz=(_gruppi[i]).iniz_atom(); vector::iterator fin=(_gruppi[i]).fin_atom(); while(iniz!=fin){ etichetta tmp_et=(*iniz).etich(); vector < pair > tmp_str_et=tmp_et.vec_str(); cout << "Atomo:" << (*iniz).id() << " "; cout << "Tipo:"<< (*iniz).tipo_atomo() << endl; cout << "***etichetta:" << endl; for(unsigned int i2=0;i2::iterator inizl=(*iniz).primo_leg(); vector::iterator finl=(*iniz).ultimo_leg(); while(inizl!=finl){ cout << "\tid_atomo: " << (*inizl).id_atomo() << endl; cout << "\tid_legame: " << (*inizl).id_legame() << endl; cout << "\ttipo_legame " << (*inizl).tipo_legame() << endl; cout << "\tcr " << (*inizl).cr() << endl; cout << "\tcg " << (*inizl).cg() << endl; cout << "\tcb " << (*inizl).cb() << endl; inizl++; } cout << "*** fine legami ***" << endl; iniz++; } vector::iterator st2=_gruppi[i].iniz_procedure(); vector::iterator en2=_gruppi[i].fin_procedure(); while(st2!=en2){ cout << (_gruppi[i]).id_gruppo() <<"-- "<< (*st2) << " tipo: " <<(*st2)->tipo()<< endl; switch((*st2)->tipo()){ case PROC_ARC: { proc_arc* arc=dynamic_cast(*st2); cout << "TIPO " << arc->tipo() << endl; cout << "ARC_ID " << arc->id() << endl; cout << "ARC_XSTART " << arc->xstart()<< endl; cout << "ARC_YSTART " << arc->ystart()<< endl; cout << "ARC_XEND " << arc->xend()<< endl; cout << "ARC_YEND " << arc->yend()<< endl; cout << "ARC_X1 " << arc->x1()<< endl; cout << "ARC_Y1 " << arc->y1()<< endl; cout << "ARC_X2 " << arc->x2()<< endl; cout << "ARC_Y2 " << arc->y2()<< endl; cout << "ARC_X3 " << arc->x3()<< endl; cout << "ARC_Y3 " << arc->y3()<< endl; cout << "ARC_X4 " << arc->x4()<< endl; cout << "ARC_Y4 " << arc->y4()<< endl; cout << "ARC_CB " << arc->cb()<< endl; cout << "ARC_CR " << arc->cr()<< endl; cout << "ARC_CG " << arc->cg()<< endl; cout << "ARC_XPIV " << arc->xpivot() << endl; cout << "ARC_YPIV " << arc->ypivot() << endl; cout << "ARC_ANGOLOROT " << arc->angolorot() << endl; cout << "ARC_SPESSORE " << arc->spessore() << endl; cout << "ARC_DASH " << arc->dash() << endl; break; } case PROC_ARROW: { proc_arrow* arr=dynamic_cast(*st2); cout << "TIPO " << arr->tipo() << endl; cout << "ARR_ID " << arr->id() << endl; cout << "ARR_POSX " << arr->posx()<< endl; cout << "ARR_POSY " << arr->posy()<< endl; cout << "ARR_EPOSX " << arr->eposx() << endl; cout << "ARR_EPOSY " << arr->eposy() << endl; cout << "ARR_W " << arr->w()<< endl; cout << "ARR_H " << arr->h()<< endl; cout << "ARR_CB " << arr->cb()<< endl; cout << "ARR_CR " << arr->cr()<< endl; cout << "ARR_CG " << arr->cg()<< endl; cout << "ARR_XPIV " << arr->xpivot() << endl; cout << "ARR_YPIV " << arr->ypivot() << endl; cout << "ARR_ANGOLOROT " << arr->angolorot() << endl; cout << "ARR_SPESSORE " << arr->spessore() << endl; cout << "ARR_DASH " << arr->dash() << endl; cout << "ARR_ARR_W " << arr->arr_w() << endl; cout << "ARR_ARR_H " << arr->arr_h() << endl; cout << "ARR_ARR_GAP " << arr->arr_gap() << endl; cout << "ARR_PUNTE "; switch(arr->punte()){ case ARR_NO_PUNT: cout << "Nessuna freccia."<< endl; break; case ARR_OMOL_PUNT: cout << "Scissione omolitica."<< endl; break; case ARR_ETEROL_PUNT: cout << "Scissione eterolitica."<< endl; break; case ARR_DOUBLE: cout << "Risonanza."<< endl; break; case ARR_BLOC: cout << "Fraccia sbarrata."<< endl; break; } break; } case PROC_BEZIER: { proc_bezier* bez=dynamic_cast(*st2); cout << "TIPO " << bez->tipo() << endl; cout << "BEZIER_ID " << bez->id() << endl; cout << "BEZIER_I_POSX " << bez->ix()<< endl; cout << "BEZIER_I_POSY " << bez->iy()<< endl; cout << "BEZIER_T1_POSX " << bez->tan1x()<< endl; cout << "BEZIER_T1_POSY " << bez->tan1y()<< endl; cout << "BEZIER_T2_POSX " << bez->tan2x()<< endl; cout << "BEZIER_T2_POSY " << bez->tan2y()<< endl; cout << "BEZIER_E_X " << bez->ex() << endl; cout << "BEZIER_E_Y " << bez->ey() << endl; cout << "BEZIER_W " << bez->w()<< endl; cout << "BEZIER_H " << bez->h()<< endl; cout << "BEZIER_CB " << bez->cb()<< endl; cout << "BEZIER_CR " << bez->cr()<< endl; cout << "BEZIER_CG " << bez->cg()<< endl; cout << "BEZIER_XPIV " << bez->xpivot() << endl; cout << "BEZIER_YPIV " << bez->ypivot() << endl; cout << "BEZIER_ANGOLOROT " << bez->angolorot() << endl; cout << "BEZIER_SPESSORE " << bez->spessore() << endl; cout << "BEZIER_DASH " << bez->dash() << endl; cout << "BEZIER_PUNTE "; switch(bez->punte()){ case ARR_NO_PUNT: cout << "Nessuna freccia."<< endl; break; case ARR_OMOL_PUNT: cout << "Scissione omolitica."<< endl; break; case ARR_ETEROL_PUNT: cout << "Scissione eterolitica."<< endl; break; case ARR_DOUBLE: cout << "Risonanza."<< endl; break; case ARR_BLOC: cout << "Fraccia sbarrata."<< endl; break; default: cout << "c'e' qualcosa che non va " << endl; break; } break; } case PROC_BOX: { BoxProc* box=dynamic_cast(*st2); cout << "TIPO " << box->tipo() << endl; cout << "BOX_ID " << box->id() << endl; cout << "BOX_POSX " << box->posx()<< endl; cout << "BOX_POSY " << box->posy()<< endl; cout << "BOX_W " << box->w()<< endl; cout << "BOX_H " << box->h()<< endl; cout << "BOX_CB " << box->cb()<< endl; cout << "BOX_CR " << box->cr()<< endl; cout << "BOX_CG " << box->cg()<< endl; cout << "BOX_XPIV " << box->xpivot() << endl; cout << "BOX_YPIV " << box->ypivot() << endl; cout << "BOX_ANGOLOROT " << box->angolorot() << endl; cout << "BOX_SPESSORE " << box->spessore() << endl; cout << "BOX_DASH " << box->dash() << endl; break; } } st2++; } } } /* ATOMO := "atomo" ID_ATOMO ":" "tipo_atomo" TIPO_ATOMO APRI "elemento" APRI ETICHETTA SEP CARICHE SEP DOPPIETTI SEP EL_SPAIATI SEP MASSA SEP COLORE SEP COLORE SEP COLORE SEP POSX SEP POSY CHIUDI LISTA_DI_ADIACENZA CHIUDI */ void immagine::p_atomo(){ if(_molecule.substr(_punt_mol,string(ETIC_ATOMO).size())==ETIC_ATOMO){ atomo buff_atom; _tmp_atom.push_back(buff_atom); _punt_mol+=string(ETIC_ATOMO).size(); string::size_type dp=_molecule.find(DP,_punt_mol); if(dp==string::npos){ _has_error=true; _error.push_back(gen_err_miss_string(string(DP),_punt_mol,string(DP).size())); }else{ /*Parsiamo un numero*/ string s_num=_molecule.substr(_punt_mol,dp-_punt_mol); int num=p_int(s_num); if(_has_error){ _error.push_back(gen_err_miss_number(_punt_mol,dp-_punt_mol)); return; }else{ //abbiamo l'id _punt_mol+=dp-_punt_mol+1; (_tmp_atom.back()).id(num); } if(_molecule.substr(_punt_mol,string(ETIC_TIPO_ATOMO).size())== ETIC_TIPO_ATOMO){ _punt_mol+=string(ETIC_TIPO_ATOMO).size(); /*cerchiamo l'inizio del blocco*/ string::size_type iniz_b=trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI),_punt_mol, string(APRI).size())); return; }else{ //cerchiamo il tipo di atomo string s_num=_molecule.substr(_punt_mol,iniz_b-_punt_mol); int num=p_int(s_num); if(_has_error){ _error.push_back(gen_err_miss_number(_punt_mol,iniz_b-_punt_mol)); return; }else{ _punt_mol=_punt_mol+(iniz_b-_punt_mol)+1; (_tmp_atom.back()).tipo_atomo(num); } //cerchiamo l'elemento e sue caratteristiche p_elemento(); //ed infine la lista di adiacenza (i legami) p_lista(); //controlliamo che il blocco si sia chiuso chk_chiusura_blocco(); (_tmp_atom.back()).costruisci_arrivati(); if(_tmp_atom.size()>=2){ vector::iterator exist=find(_tmp_atom.begin(),_tmp_atom.end()-1,_tmp_atom.back()); if(exist==_tmp_atom.end()-2){ _warning.push_back(gen_warn_id_conflict("atomo", (_tmp_atom.back()).id())); _tmp_atom.erase(_tmp_atom.end()-1); } } //aggiungiamo l'atomo temporaneo al vettore di atomi //_atomi.push_back(_tmp_atom); //ripuliamo l'atomo usato come buffer //_tmp_atom.elimina_legami(); //e poi si ricomincia!! p_atomo(); } }else{ _has_error=true; _error.push_back(gen_err_miss_string(ETIC_TIPO_ATOMO,_punt_mol, string(ETIC_TIPO_ATOMO).size())); return; } } }else{ return; } } // "elemento" // APRI // ETICHETTA SEP CARICHE // SEP DOPPIETTI SEP EL_SPAIATI SEP // POS_X SEP POS_Y //CHIUDI void immagine::p_elemento(){ string et_elemento=_molecule.substr(_punt_mol, string(ETIC_ELEMENTO).size()); if(et_elemento==ETIC_ELEMENTO){ _punt_mol+=string(ETIC_ELEMENTO).size(); /*cerchiamo l'inizio del blocco*/ /*string::size_type iniz_b=*/ trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI), _punt_mol,string(APRI).size())); return; }else{ _punt_mol++; etichetta risul=p_etichetta(); /* vector < pair > tmp_str_et=risul.vec_str(); cout << "#@#@etichetta:" << endl; for(int i2=0;i2::iterator exist=find((_tmp_atom.back()).primo_leg(), (_tmp_atom.back()).ultimo_leg(), tmp_leg); if((_tmp_atom.back()).primo_leg()!=(_tmp_atom.back()).ultimo_leg()&& exist!=(_tmp_atom.back()).ultimo_leg()){ _warning.push_back(gen_warn_id_conflict("legame", tmp_leg.id_legame() )); }else{ (_tmp_atom.back()).aggiungi_legame(id_atomico,id_leg,tipo_leg,col_r,col_g,col_b); } //(_tmp_atom.back()).aggiungi_legame(id_atomico,id_leg,tipo_leg,col_r,col_g,col_b); p_legami(); } }else{ //finito; return; //errore, manca l'etichetta //_has_error=true; //_error.push_back(gen_err_miss_string(string(ETIC_LISTA), // _punt_mol, // string(ETIC_LISTA).size() ) // ); //return; } } /* GRUPPO := "gruppo" ID_GRUPPO ":" "tipo_gruppo" TIPO_GRUPPO APRI ATOMO? PROCEDURA* CHIUDI */ void immagine::p_gruppo(){ //ordiniamo i gruppi sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); if(_molecule.substr(_punt_mol,string(ETIC_GRUPPO).size())==ETIC_GRUPPO){ gruppo buff_gruppo; _gruppi.push_back(buff_gruppo); _punt_mol+=string(ETIC_GRUPPO).size(); string::size_type dp=_molecule.find(DP,_punt_mol); if(dp==string::npos){ _has_error=true; _error.push_back(gen_err_miss_string(string(DP),_punt_mol,string(DP).size())); }else{ //Parsiamo un numero string s_num=_molecule.substr(_punt_mol,dp-_punt_mol); int num=p_int(s_num); if(_has_error){ _error.push_back(gen_err_miss_number(_punt_mol,dp-_punt_mol)); return; }else{ //abbiamo l'id _punt_mol+=dp-_punt_mol+1; (_gruppi.back()).id_gruppo(num); //cout << (_gruppi.back()).id_gruppo() << endl; } if(_molecule.substr(_punt_mol,string(ETIC_TIPO_GRUPPO).size())== ETIC_TIPO_GRUPPO){ _punt_mol+=string(ETIC_TIPO_GRUPPO).size(); //cerchiamo l'inizio del blocco string::size_type iniz_b=trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI),_punt_mol, string(APRI).size())); return; }else{ _punt_mol+=string(APRI).size(); //cerchiamo il tipo di gruppo string s_num=_molecule.substr(_punt_mol,iniz_b-_punt_mol); int num=p_int(s_num); if(_has_error){ _error.push_back(gen_err_miss_number(_punt_mol,iniz_b-_punt_mol)); return; }else{ _punt_mol=_punt_mol+(iniz_b-_punt_mol)+1; (_gruppi.back()).tipo_gruppo(num); } //cerchiamo le rotazioni p_grot(_gruppi.back()); //cerchiamo gli atomi p_atomo(); //cerchiamo le eventuali procedure p_procedure(); //controlliamo che il blocco si sia chiuso chk_chiusura_blocco(); //copiamo i valori dal buffer al vettore effettivo for(unsigned int i=0;i<_tmp_atom.size();i++){ //cout << "di suo il gruppo e' " << &_gruppi.back() << " "; _tmp_atom[i].aggiungi_genitore(&_gruppi.back()); //cout << "ritornato: " << _tmp_atom[i].id_gruppo() << " " << &_gruppi.back() << endl; (_gruppi.back()).add_atomo(_tmp_atom[i]); } //svuotiamo il buffer _tmp_atom.erase(_tmp_atom.begin(),_tmp_atom.end()); //e poi si ricomincia!! if(_gruppi.size()>=2){ // cambiare con >1? vector::iterator exist=find(_gruppi.begin(),_gruppi.end()-1,_gruppi.back()); if(exist!=_gruppi.end()-1){ //_warning.push_back(gen_warn_id_conflict("gruppo", (_gruppi.back()).id_gruppo())); //_gruppi.erase(_gruppi.end()-1); (_gruppi.back()).id_gruppo(_gruppi[_gruppi.size()-2].id_gruppo()+1); /* int max=-1; for(int ct=0;ct<_gruppi.size()-1;ct++){ if(max<_gruppi[ct].id_gruppo()){ max=_gruppi[ct].id_gruppo(); } } */ //cout << "NUOVO ID" << max+1 << endl; //(_gruppi.back()).id_gruppo(max+1); } } if(!_is_preview){ //adesso facciamo in modo che il gruppo sia selezionato //dall'interfaccia utente aggiungi_tutto_selected(_gruppi.back()); } p_gruppo(); } }else{ _has_error=true; _error.push_back(gen_err_miss_string(ETIC_TIPO_GRUPPO,_punt_mol, string(ETIC_TIPO_GRUPPO).size())); return; } } }else{ #ifdef DEBUG cout << "Parsing dei gruppi completato" << endl; #endif return; } } void immagine::p_grot(gruppo& grp){ if(_molecule.substr(_punt_mol,string(ETIC_ROT).size())==ETIC_ROT){ _punt_mol+=string(ETIC_ROT).size(); /*string::size_type iniz_b=*/trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI),_punt_mol, string(APRI).size())); return; }else{ _punt_mol+=string(APRI).size(); grp.angolorot(trova_campo_etic_float(SEP)); if(_has_error){ return; } grp.xpivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } grp.ypivot(trova_campo_etic_float(CHIUDI)); if(_has_error){ return; } } }else{ return; } } void immagine::p_procedure(){ if(_molecule.substr(_punt_mol,string(ETIC_ARC).size())==ETIC_ARC){ proc_arc* tmp_arc=new proc_arc(); tmp_arc->aggiungi_genitore(&_gruppi.back()); //cout << "arco" << tmp_arc << "id " << _gruppi.back().id_gruppo() << endl; _punt_mol+=string(ETIC_ARC).size(); //cout <<"-->" << _molecule.substr(_punt_mol) << endl; /*cerchiamo l'inizio del blocco*/ /*string::size_type iniz_b=*/trova_apri(); //cout <<"-->" << _molecule.substr(_punt_mol) << endl; if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI),_punt_mol, string(APRI).size())); return; }else{ _punt_mol++; tmp_arc->id(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arc->xstart(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->ystart(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->xend(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->yend(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->x1(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->y1(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->x2(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->y2(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->x3(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->y3(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->x4(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->y4(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->cr(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arc->cg(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arc->cb(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arc->xpivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->ypivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->angolorot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arc->spessore(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arc->dash(trova_campo_etic_int(CHIUDI)); if(_has_error){ return; } //controlliamo che il blocco si sia chiuso //chk_chiusura_blocco(); bool trovato=find_proc(tmp_arc); if(trovato){ _warning.push_back(gen_warn_id_conflict("procedura", tmp_arc->id())); }else{ (_gruppi.back()).aggiungi_procedura(tmp_arc); } //e poi si ricomincia p_procedure(); } }else if(_molecule.substr(_punt_mol,string(ETIC_ARROW).size())==ETIC_ARROW){ /* 'ARROW' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH CHIUDI */ proc_arrow* tmp_arrow=new proc_arrow(); tmp_arrow->aggiungi_genitore(&_gruppi.back()); _punt_mol+=string(ETIC_ARROW).size(); //cout <<"-->" << _molecule.substr(_punt_mol) << endl; /*cerchiamo l'inizio del blocco*/ /*string::size_type iniz_b=*/trova_apri(); //cout <<"-->" << _molecule.substr(_punt_mol) << endl; if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI),_punt_mol, string(APRI).size())); return; }else{ _punt_mol++; tmp_arrow->id(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arrow->posx(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->posy(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->eposx(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->eposy(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->cr(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arrow->cg(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arrow->cb(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arrow->xpivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->ypivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->angolorot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->spessore(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arrow->dash(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arrow->punte(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_arrow->arr_w(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->arr_h(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_arrow->arr_gap(trova_campo_etic_float(CHIUDI)); if(_has_error){ return; } //controlliamo che il blocco si sia chiuso //chk_chiusura_blocco(); bool trovato=find_proc(tmp_arrow); if(trovato){ _warning.push_back(gen_warn_id_conflict("procedura", tmp_arrow->id())); }else{ (_gruppi.back()).aggiungi_procedura(tmp_arrow); } //e poi si ricomincia p_procedure(); } }else if(_molecule.substr(_punt_mol,string(ETIC_BEZIER).size())==ETIC_BEZIER){ /* 'BEZIER' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE CHIUDI */ proc_bezier* tmp_bezier=new proc_bezier(); tmp_bezier->aggiungi_genitore(&_gruppi.back()); _punt_mol+=string(ETIC_BEZIER).size(); //cout <<"bez-->" << tmp_bezier << endl; /*cerchiamo l'inizio del blocco*/ /*string::size_type iniz_b=*/trova_apri(); //cout <<"-->" << _molecule.substr(_punt_mol) << endl; if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI),_punt_mol, string(APRI).size())); return; }else{ _punt_mol++; tmp_bezier->id(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_bezier->ix(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->iy(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->tan1x(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->tan1y(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->tan2x(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->tan2y(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->ex(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->ey(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->cr(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_bezier->cg(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_bezier->cb(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_bezier->xpivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->ypivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->angolorot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->spessore(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_bezier->dash(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_bezier->punte(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_bezier->arr_w(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->arr_h(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_bezier->arr_gap(trova_campo_etic_float(CHIUDI)); if(_has_error){ return; } //controlliamo che il blocco si sia chiuso //chk_chiusura_blocco(); bool trovato=find_proc(tmp_bezier); if(trovato){ _warning.push_back(gen_warn_id_conflict("procedura", tmp_bezier->id())); }else{ (_gruppi.back()).aggiungi_procedura(tmp_bezier); } //e poi si ricomincia p_procedure(); } }else if(_molecule.substr(_punt_mol,string(ETIC_BOX).size())==ETIC_BOX){ /* 'BOX' APRI ID_PROC SEP LD_X SEP LD_Y SEP RU_X SEP RU_Y SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP BOX_TYPE CHIUDI */ BoxProc* tmp_box=new BoxProc(); tmp_box->aggiungi_genitore(&_gruppi.back()); _punt_mol+=string(ETIC_BOX).size(); //cout <<"-->" << _molecule.substr(_punt_mol) << endl; /*cerchiamo l'inizio del blocco*/ /*string::size_type iniz_b=*/trova_apri(); //cout <<"-->" << _molecule.substr(_punt_mol) << endl; if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI),_punt_mol, string(APRI).size())); return; }else{ _punt_mol++; tmp_box->id(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_box->ld_x(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_box->ld_y(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_box->ru_x(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_box->ru_y(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_box->cr(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_box->cg(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_box->cb(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_box->xpivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_box->ypivot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_box->angolorot(trova_campo_etic_float(SEP)); if(_has_error){ return; } tmp_box->spessore(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_box->dash(trova_campo_etic_int(SEP)); if(_has_error){ return; } tmp_box->b_type(static_cast(trova_campo_etic_int(CHIUDI))); if(_has_error){ return; } bool trovato=find_proc(tmp_box); if(trovato){ _warning.push_back(gen_warn_id_conflict("procedura", tmp_box->id())); }else{ (_gruppi.back()).aggiungi_procedura(tmp_box); } //e poi si ricomincia p_procedure(); } }else{ return; } } bool immagine::find_proc(procedura* proc){ vector::iterator inizp=(_gruppi.back()).iniz_procedure(); vector::iterator finp=(_gruppi.back()).fin_procedure(); bool found=false; while(inizp!=finp){ if((*inizp)->id()==proc->id()){ found=true; break; } inizp++; } return found; } void immagine::chk_chiusura_blocco(){ if(_punt_mol>=_molecule.size() || _molecule[_punt_mol]!=(string(CHIUDI))[0]){ _has_error=true; _error.push_back(gen_err_miss_string(string(CHIUDI), _punt_mol,string(CHIUDI).size())); }else{ _punt_mol+=string(CHIUDI).size(); } } /* ETICHETTA := "etichetta" APRI VALORE SEP FONT SEP DIMENSIONE_FONT SEP X SEP Y CHIUDI VALORE := CHAR? VALORE* | '_{ CHAR? '}' | '^{ CHAR? '}' | "nada" | "alto" */ etichetta immagine::p_etichetta(){ string et_etic=_molecule.substr(_punt_mol, string(ETIC_ETIC).size()); etichetta tmp_etic; if(et_etic==ETIC_ETIC){ _punt_mol+=string(ETIC_ETIC).size(); /*cerchiamo l'inizio del blocco*/ /*string::size_type iniz_b=*/trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI), _punt_mol,string(APRI).size())); return tmp_etic; }else{ _punt_mol++; p_valore(tmp_etic); tmp_etic.font(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.dim(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.x(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.y(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.cr(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.cg(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.cb(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.allineamento(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_etic; } tmp_etic.v_offset(trova_campo_etic_int(CHIUDI)); if(_has_error){ return tmp_etic; } //abbiamo parsato con successo l'etichetta, ritorniamola return tmp_etic; } }else{ _has_error=true; _error.push_back(gen_err_miss_string(string(ETIC_ETIC),_punt_mol, string(ETIC_ETIC).size())); return tmp_etic; } } void immagine::p_stringhe(){ if(_has_error || !(_punt_mol<_molecule.size()) ){ #ifdef DEBUG cout << "Parsing delle stringhe completato" << endl; #endif return; } string et_etic=""; string et_multiline_lb=""; string et_paragraph=""; if((_punt_mol + string(ETIC_ETIC).size()) < _molecule.size()){ et_etic=_molecule.substr(_punt_mol, string(ETIC_ETIC).size()); } if((_punt_mol + string(ETIC_MULTILINE_LABEL).size()) < _molecule.size()){ et_multiline_lb=_molecule.substr(_punt_mol, string(ETIC_MULTILINE_LABEL).size()); } if((_punt_mol + string(ETIC_PARAGRAPH).size()) < _molecule.size()){ et_paragraph=_molecule.substr(_punt_mol, string(ETIC_PARAGRAPH).size()); } etichetta* tmp=0; if(et_etic==ETIC_ETIC){ tmp=new etichetta(p_etichetta()); }else if(et_multiline_lb==ETIC_MULTILINE_LABEL){ tmp=new multiline_label(p_multiline_label()); //dynamic_cast(tmp)->dump_label(); }else if(et_paragraph==ETIC_PARAGRAPH){ tmp=new paragraph_text(p_paragraph_text()); } if(tmp!=0){ _stringhe.push_back(tmp); if(!_is_preview){ aggiungi_elem_selected(ETICHETTA,NO_VALID_GROUP,_stringhe.size()-1); } p_stringhe(); } } /* PARAGRAPH := "paragraph" APRI POSX SEP POSY SEP INTERLINE SEP LAYOUT SEP MULTIFONT_LABEL* CHIUDI */ paragraph_text immagine::p_paragraph_text(){ string et_multi=_molecule.substr(_punt_mol, string(ETIC_PARAGRAPH).size()); paragraph_text tmp_label; if(et_multi==ETIC_PARAGRAPH){ _punt_mol+=string(ETIC_PARAGRAPH).size(); trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI), _punt_mol,string(APRI).size())); return tmp_label; }else{ _punt_mol++; tmp_label.x(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_label; } tmp_label.y(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_label; } tmp_label.interline_space(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_label; } tmp_label.layout_lines(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_label; } string et_etic=_molecule.substr(_punt_mol, string(ETIC_MULTIFONT_LABEL).size()); while(et_etic==ETIC_MULTIFONT_LABEL){ multifont_label* line=new multifont_label(p_multifont_label()); line->go_to_end_of_label(); tmp_label.add_line(line); et_etic=_molecule.substr(_punt_mol, string(ETIC_MULTIFONT_LABEL).size()); } if(_punt_mol< _molecule.size() && string(1,_molecule[_punt_mol])!=CHIUDI){ _has_error=true; }else{ _punt_mol++; } tmp_label.go_to_end_of_label(); return tmp_label; } }else{ _has_error=true; _error.push_back(gen_err_miss_string(string(ETIC_PARAGRAPH),_punt_mol, string(ETIC_PARAGRAPH).size())); return tmp_label; } } /* MULTIFONT_LABEL:= "multifont_label" APRI POSX SEP POSY SEP INTERLINE SEP ETICHETTA* CHIUDI */ multifont_label immagine::p_multifont_label(){ string et_multi=_molecule.substr(_punt_mol, string(ETIC_MULTIFONT_LABEL).size()); multifont_label tmp_label; if(et_multi==ETIC_MULTIFONT_LABEL){ _punt_mol+=string(ETIC_MULTIFONT_LABEL).size(); trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI), _punt_mol,string(APRI).size())); return tmp_label; }else{ _punt_mol++; tmp_label.x(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_label; } tmp_label.y(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_label; } tmp_label.interline_space(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_label; } string et_etic=_molecule.substr(_punt_mol, string(ETIC_ETIC).size()); while(et_etic==ETIC_ETIC){ etichetta* line=new etichetta(p_etichetta()); line->go_to_end_of_label(); tmp_label.add_line(line); et_etic=_molecule.substr(_punt_mol, string(ETIC_ETIC).size()); } if(_punt_mol< _molecule.size() && string(1,_molecule[_punt_mol])!=CHIUDI){ _has_error=true; }else{ _punt_mol++; } return tmp_label; } }else{ _has_error=true; _error.push_back(gen_err_miss_string(string(ETIC_MULTIFONT_LABEL),_punt_mol, string(ETIC_MULTIFONT_LABEL).size())); return tmp_label; } } multiline_label immagine::p_multiline_label(){ string et_multi=_molecule.substr(_punt_mol, string(ETIC_MULTILINE_LABEL).size()); multiline_label tmp_label; if(et_multi==ETIC_MULTILINE_LABEL){ _punt_mol+=string(ETIC_MULTILINE_LABEL).size(); trova_apri(); if(_has_error){ _error.push_back(gen_err_miss_string(string(APRI), _punt_mol,string(APRI).size())); return tmp_label; }else{ _punt_mol++; tmp_label.x(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_label; } tmp_label.y(trova_campo_etic_float(SEP)); if(_has_error){ return tmp_label; } tmp_label.interline_space(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_label; } tmp_label.layout_lines(trova_campo_etic_int(SEP)); if(_has_error){ return tmp_label; } string et_etic=_molecule.substr(_punt_mol, string(ETIC_ETIC).size()); while(et_etic==ETIC_ETIC){ etichetta* line=new etichetta(p_etichetta()); tmp_label.add_line(line); et_etic=_molecule.substr(_punt_mol, string(ETIC_ETIC).size()); } if(_punt_mol< _molecule.size() && string(1,_molecule[_punt_mol])!=CHIUDI){ _has_error=true; }else{ _punt_mol++; } return tmp_label; } }else{ _has_error=true; _error.push_back(gen_err_miss_string(string(ETIC_MULTILINE_LABEL),_punt_mol, string(ETIC_MULTILINE_LABEL).size())); return tmp_label; } } float immagine::trova_campo_etic_float(const char* conc){ string la_cifr; while(_punt_mol< _molecule.size() && (isdigit(_molecule[_punt_mol]) || _molecule[_punt_mol]=='.' || _molecule[_punt_mol]=='-' || _molecule[_punt_mol]=='e' || _molecule[_punt_mol]=='E' ) ){ la_cifr+=_molecule[_punt_mol]; _punt_mol++; } if(_punt_mol< _molecule.size() && string(1,_molecule[_punt_mol])==conc){ char* tail; float num=strtof(la_cifr.c_str(),&tail); if(*tail!='\0'){ _has_error=true; gen_err_miss_number(_punt_mol, la_cifr.size()); return -1; } _punt_mol++; return num; }else{ _has_error=true; _error.push_back(gen_err_miss_string(string(conc),_punt_mol, string(conc).size())); return -1; } } int immagine::trova_campo_etic_int(const char* conc){ string la_cifr; while(_punt_mol< _molecule.size() &&( isdigit(_molecule[_punt_mol]) || _molecule[_punt_mol]=='-' )){ la_cifr+=_molecule[_punt_mol]; _punt_mol++; } if(_punt_mol< _molecule.size() && string(1,_molecule[_punt_mol])==conc){ char* tail; int num=static_cast(strtol(la_cifr.c_str(),&tail,0)); if(*tail!='\0'){ _has_error=true; gen_err_miss_number(_punt_mol, la_cifr.size()); return -1; } _punt_mol++; return num; }else{ _has_error=true; _error.push_back(gen_err_miss_string(string(conc), _punt_mol,string(conc).size())); return -1; } } string immagine::check_escape_char(){ std::string res(""); if(string(1,_molecule[_punt_mol])==string(ESCAPE_CHAR)){ _punt_mol++; res=string(1,_molecule[_punt_mol]); } return res; } //VALORE := CHAR? VALORE* | APICE VALORE* | APICE PEDICE VALORE* // PEDICE VALORE* | PEDICE APICE VALORE* | "nada" | "alto" // #define ET_STR 0 // #define ET_APICE 1 // #define ET_PEDICE 2 void immagine::p_valore(etichetta& etic){ if(!(_punt_mol<_molecule.size())){ _has_error=true; _error.push_back(gen_err_eof()); return; } if(string(1,_molecule[_punt_mol])==SEP){ _trovato_pedice=false; _trovato_apice=false; _punt_mol++; return; }else if(string(1,_molecule[_punt_mol])==APICE){ if(!_trovato_apice){ _trovato_apice=true; }else{ _error.push_back("La stringa contiene due apici contigui."); return; } _punt_mol++; if(string(1,_molecule[_punt_mol])!=APRI){ _has_error=true; _error.push_back(gen_err_miss_string(string(APRI), _punt_mol,string(APRI).size())); return; }else{ _punt_mol++; string tmpstr(""); while(string(1,_molecule[_punt_mol]) != CHIUDI && string(1,_molecule[_punt_mol]) != SEP ){ string escaped(""); if((escaped=check_escape_char())==""){ tmpstr+=_molecule[_punt_mol]; }else{ tmpstr+=escaped; } // tmpstr+=_molecule[_punt_mol]; _punt_mol++; } if(string(1,_molecule[_punt_mol])==SEP){ _has_error=true; _error.push_back(gen_err_miss_string(string(CHIUDI), _punt_mol,string(CHIUDI).size())); return; }else{ etic.aggiungi(tmpstr, ET_APICE); _punt_mol++; p_valore(etic); } } }else if(string(1,_molecule[_punt_mol])==PEDICE){ if(!_trovato_pedice){ _trovato_pedice=true; }else{ _error.push_back("La stringa contiene due pedici contigui."); return; } _punt_mol++; if(string(1,_molecule[_punt_mol])!=APRI){ _has_error=true; _error.push_back(gen_err_miss_string(string(APRI), _punt_mol,string(APRI).size())); return; }else{ _punt_mol++; string tmpstr; while(string(1,_molecule[_punt_mol]) != CHIUDI && string(1,_molecule[_punt_mol]) != SEP ){ string escaped(""); if((escaped=check_escape_char())==""){ tmpstr+=_molecule[_punt_mol]; //cerr << "pedice " << _molecule[_punt_mol] << std::endl; }else{ tmpstr+=escaped; } //tmpstr+=_molecule[_punt_mol]; _punt_mol++; } if(string(1,_molecule[_punt_mol])==SEP){ _has_error=true; _error.push_back(gen_err_miss_string(string(CHIUDI), _punt_mol,string(CHIUDI).size())); return; }else{ etic.aggiungi(tmpstr, ET_PEDICE); _punt_mol++; p_valore(etic); } } }else{ _trovato_pedice=false; _trovato_apice=false; string tmpstr; while(string(1,_molecule[_punt_mol]) != APICE && string(1,_molecule[_punt_mol]) != PEDICE && string(1,_molecule[_punt_mol]) != SEP ){ string escaped=""; if((escaped=check_escape_char())==""){ tmpstr+=_molecule[_punt_mol]; }else{ tmpstr+=escaped; } _punt_mol++; } etic.aggiungi(tmpstr, ET_STR); p_valore(etic); } } int immagine::p_int(string num){ char* resto; long int risul=strtol(num.c_str(),&resto,0); if((*resto)|='\0'){ _has_error=true; return -1; }else{ return static_cast(risul); } } string::size_type immagine::trova_apri(){ string::size_type apri=_molecule.find(APRI,_punt_mol); if(apri==string::npos){ _has_error=true; _error.push_back(gen_err_miss_string(APRI,_punt_mol,string(APRI).size())); } return apri; } string::size_type immagine::trova_chiudi(){ string::size_type apri=_molecule.find(CHIUDI,_punt_mol); if(apri==string::npos){ _has_error=true; _error.push_back(gen_err_miss_string(CHIUDI,_punt_mol,string(CHIUDI).size())); } return apri; } string::size_type immagine::trova_sep(){ string::size_type apri=_molecule.find(SEP,_punt_mol); if(apri==string::npos){ _has_error=true; _error.push_back(gen_err_miss_string(SEP,_punt_mol,string(SEP).size())); } return apri; } string immagine::gen_err_miss_string(string missing, int start, int length){ ostringstream ostr; ostr << _punt_mol; string cite; int from=_punt_mol-CITE_ERROR_RG; int wide=2*CITE_ERROR_RG; if(_punt_mol-CITE_ERROR_RG < 0){ from=0; } if(_punt_mol + wide > _molecule.size()){ wide=_molecule.size()-(_punt_mol + wide); } if(static_cast(start + length) > _molecule.size()){ length=_molecule.size()-(_punt_mol + length); } return _molecule.substr(from,wide)+ _("***Position: ") + ostr.str() + _(" expected ") + missing + _(" found ") + "\"" +_molecule.substr(start,length) + "\""; } /** *Genera un messaggio d'errore dovuto al prematura raggiungimento *della fine del file. */ string immagine::gen_err_eof(){ return _("Unexpected end of file."); } string immagine::gen_err_miss_number(int start, int length){ ostringstream ostr; ostr << _punt_mol; string cite; int wide=2*CITE_ERROR_RG; if(_punt_mol + wide > _molecule.size()){ wide=_molecule.size()-(_punt_mol + wide); } if(static_cast(start + length) > _molecule.size()){ length=_molecule.size()-(_punt_mol + length); } return _molecule.substr(start,wide)+ " In posizione: " + ostr.str() + " era atteso un numero" + " trovato: " + "\""+ _molecule.substr(start,length) +"\""; } string immagine::gen_warn_id_conflict(string elem, int id){ ostringstream out; out << id; string warn="L'elemento " + elem + " con id: " + out.str() + " esiste gi"; return warn; } void immagine::print_warn(){ string warn; for(unsigned int i=0;i<_warning.size();i++){ warn += _warning[i] + "\n"; } if(warn!=""){ fl_alert("%s",warn.c_str()); } } void immagine::print_errors(){ string errori; for(unsigned int i=0;i<_error.size();i++){ errori+= _error[i] +"\n"; } if(errori!=""){ fl_alert("%s",errori.c_str()); } } void immagine::elimina_err(){ _error.erase(_error.begin(),_error.end()); } void immagine::elimina_warn(){ _warning.erase(_warning.begin(),_warning.end()); } void immagine::copy_flip_group(int id_group , bool hor){ gruppo* group_ptr=find_group_id(id_group); if(group_ptr!=NULL){ gruppo nw(*group_ptr); aggiungi_gruppo(nw); int id_nw=ritorna_ultimo_gruppo().id(); flip_group(id_nw,hor); if(hor){ ritorna_ultimo_gruppo().phys_translate(0,ritorna_ultimo_gruppo().phys_h()); }else{ ritorna_ultimo_gruppo().phys_translate(ritorna_ultimo_gruppo().phys_w(),0); } } } void immagine::flip_group(int id_group , bool hor){ gruppo* group_ptr=find_group_id(id_group); if(group_ptr!=NULL){ float h_2=0; if(hor){ h_2=group_ptr->phys_h()/2+group_ptr->phys_posy(); }else{ h_2=group_ptr->phys_w()/2+group_ptr->phys_posx(); } vector::iterator proc_beg=group_ptr->iniz_procedure(); vector::iterator proc_end=group_ptr->fin_procedure(); while(proc_beg!=proc_end){ switch((*proc_beg)->tipo()){ case PROC_ARROW: { procedura* to_flip_p=*proc_beg; proc_arrow* flipped=dynamic_cast(to_flip_p); if(flipped){ if(hor){ float dy=flipped->phys_posy()-h_2; float dye=flipped->phys_eposy()-h_2; flipped->posy(h_2-dy); flipped->eposy(h_2-dye); }else{ float dx=flipped->phys_posx()-h_2; float dxe=flipped->phys_eposx()-h_2; flipped->posx(h_2-dx); flipped->eposx(h_2-dxe); } } } break; case PROC_BEZIER: { procedura* to_flip_p=*proc_beg; proc_bezier* flipped=dynamic_cast(to_flip_p); if(flipped){ if(hor){ float diy=flipped->phys_iy()-h_2; float dtan1y=flipped->phys_tan1y()-h_2; float dtan2y=flipped->phys_tan2y()-h_2; float dey=flipped->phys_ey()-h_2; flipped->iy(h_2-diy); flipped->tan1y(h_2-dtan1y); flipped->tan2y(h_2-dtan2y); flipped->ey(h_2-dey); }else{ float dix=flipped->phys_ix()-h_2; float dtan1x=flipped->phys_tan1x()-h_2; float dtan2x=flipped->phys_tan2x()-h_2; float dex=flipped->phys_ex()-h_2; flipped->ix(h_2-dix); flipped->tan1x(h_2-dtan1x); flipped->tan2x(h_2-dtan2x); flipped->ex(h_2-dex); } } } break; case PROC_ARC: { procedura* to_flip_p=*proc_beg; proc_arc* flipped=dynamic_cast(to_flip_p); if(flipped){ if(hor){ float dystart=flipped->phys_ystart()-h_2; float dyend=flipped->phys_yend()-h_2; float dy1=flipped->phys_y1()-h_2; float dy2=flipped->phys_y2()-h_2; float dy3=flipped->phys_y3()-h_2; float dy4=flipped->phys_y4()-h_2; flipped->ystart(h_2-dystart); flipped->yend(h_2-dyend); flipped->y1(h_2-dy1); flipped->y2(h_2-dy2); flipped->y3(h_2-dy3); flipped->y4(h_2-dy4); }else{ float dxstart=flipped->phys_xstart()-h_2; float dxend=flipped->phys_xend()-h_2; float dx1=flipped->phys_x1()-h_2; float dx2=flipped->phys_x2()-h_2; float dx3=flipped->phys_x3()-h_2; float dx4=flipped->phys_x4()-h_2; flipped->xstart(h_2-dxstart); flipped->xend(h_2-dxend); flipped->x1(h_2-dx1); flipped->x2(h_2-dx2); flipped->x3(h_2-dx3); flipped->x4(h_2-dx4); } } } break; case PROC_BOX: { } break; } proc_beg++; } vector::iterator atm_beg=group_ptr->iniz_atom(); vector::iterator atm_end=group_ptr->fin_atom(); while(atm_beg!=atm_end){ if(hor){ float dy=(*atm_beg).phys_pos_y()-h_2; (*atm_beg).pos_y(h_2-dy); }else{ float dx=(*atm_beg).phys_pos_x()-h_2; (*atm_beg).pos_x(h_2-dx); } atm_beg++; } } } void immagine::flip(int x, int y, bool hor){ elimina_elem_selected(); elimina_legami_selected(); click_gruppo(x, y); int id_gruppo=(_elem_selected[0].second).first; flip_group(id_gruppo,hor); } void immagine::copy_flip(int x, int y, bool hor){ elimina_elem_selected(); elimina_legami_selected(); click_gruppo(x, y); int id_gruppo=(_elem_selected[0].second).first; copy_flip_group(id_gruppo,hor); } bool immagine::click_gruppo(int x, int y, bool erase_previous){ if(erase_previous){ elimina_legami_selected(); elimina_elem_selected(); } bool res=true; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; //cliccato atomo aggiungiamo tutti gli atomi i legami e le procedure for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fi= _gruppi[i].fin_atom(); while(in!=fi){ int click=(*in).sotto_mouse(x,y); if(click!=-1){ aggiungi_tutto_selected(_gruppi[i]); return res; } in++; } } // cliccata procedura aggiungiamo tutti gli atomi i legami e le procedure for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_procedure(); vector::iterator fi= _gruppi[i].fin_procedure(); while(in!=fi){ int click=(*in)->sotto_mouse(x,y); if(click!=-1){ aggiungi_tutto_selected(_gruppi[i]); return res; } in++; } } //cliccato legame? aggiungiamo tutto for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fin=_gruppi[i].fin_atom(); int gruppoapp=-1; if(in!=fin){ _gruppi[i].generic_depth_search(&(*in), &gruppoapp, &x ,&y,quale_gruppo); } if(gruppoapp!=-1){ //cout << "gruppoapp" << gruppoapp << endl; aggiungi_tutto_selected(_gruppi[i]); return res; } } return !res; } /** *\return l'ennesimo gruppo del vettore dei gruppi */ gruppo& immagine::ritorna_gruppo(int i){ return _gruppi[i]; } gruppo& immagine::ritorna_ultimo_gruppo(){ unsigned int sz=_gruppi.size(); return _gruppi[sz-1]; } gruppo* immagine::find_group_id(int id){ for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()==id){ return &_gruppi[i]; break; } } return 0; } std::vector::iterator immagine::first_gruppo(){ return _gruppi.begin(); } std::vector::iterator immagine::end_gruppo(){ return _gruppi.end(); } /** *\return l'ennesima etichetta del vettore */ etichetta* immagine::ritorna_etich(int i){ return _stringhe[i]; } etichetta* immagine::ritorna_etich_pointer(int i){ return _stringhe[i]; } void immagine::elimina_elem_selected(){ #ifdef DEBUG cout << "============SELEZIONATI ATOMI ELIMINATI=====================" << endl; for(unsigned int i=0;i<_elem_selected.size();i++){ pair eleme; cout << " tipo: " << _elem_selected[i].first << " gruppo: " << eleme.first << " id: " << eleme.second << endl; } cout << "============ FINE SELEZIONATI ELIMINATI=====================" << endl; #endif _elem_selected.erase(_elem_selected.begin(), _elem_selected.end()); } bool immagine::aggiungi_elem_selected(int tipo,int grp,int id){ //cout << "actual imm " << this << " " << _elem_selected.size() << endl; //cout << "aggiungi_elem_selected " << tipo << " " << grp << " " << id << endl; bool no_exists=true; /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ //vector< pair < int, pair > > _elem_selected; //checking if element exists in vector _elem_selected for(unsigned int i=0;i<_elem_selected.size();i++){ if(_elem_selected[i].first==tipo && _elem_selected[i].second.first==grp && _elem_selected[i].second.second==id){ no_exists=false; break; } } if(no_exists){ pair el_elem; el_elem.first=grp; el_elem.second=id; pair < int , pair > vec_elem; vec_elem.first=tipo; vec_elem.second=el_elem; _elem_selected.push_back(vec_elem); } return no_exists; } void immagine::elimina_legami_selected(){ #ifdef DEBUG cout << "============SELEZIONATI LEGAMI ELIMINATI=====================" << endl; for(unsigned int i=0;i<_legami_selected.size();i++){ cout << "gruppo: " << _legami_selected[i][0] << " atomo: " << _legami_selected[i][1] << " id: " << _legami_selected[i][2] << endl; } cout << "============ FINE SELEZIONATI ELIMINATI=====================" << endl; #endif for(unsigned int i=0; i<_legami_selected.size();i++){ delete [] _legami_selected[i]; } _legami_selected.erase(_legami_selected.begin(),_legami_selected.end()); } void immagine::aggiungi_legami_selected(int gruppo, int id_atomo_app, int id_legame){ //cout <<"_legami_selected " << _legami_selected.size() << endl; int* valori=new int[3]; valori[0]=gruppo; valori[1]=id_atomo_app; valori[2]=id_legame; _legami_selected.push_back(valori); } void immagine::aggiungi_se_dentro_bb(float x, float y, float w , float h){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_procedure(); vector::iterator fi= _gruppi[i].fin_procedure(); while(in!=fi){ bool dentro=(*in)->dentro_bb(x,y,w,h); if(dentro){ int tipo_proc=-1; if(typeid( *(*in))==typeid(proc_arc)){ tipo_proc=PROC_ARC; }else if(typeid( *(*in))==typeid(proc_arrow)){ tipo_proc=PROC_ARROW; }else if(typeid( *(*in))==typeid(proc_bezier)){ tipo_proc=PROC_BEZIER; }else if(typeid( *(*in))==typeid(BoxProc)){ tipo_proc=PROC_BOX; } aggiungi_elem_selected(tipo_proc,_gruppi[i].id(),(*in)->id()); } in++; } vector::iterator inatm=_gruppi[i].iniz_atom(); vector::iterator fiatm= _gruppi[i].fin_atom(); while(inatm!=fiatm){ bool dentro=(*inatm).dentro_bb(x,y,w,h); if(dentro){ aggiungi_elem_selected(ATOMO,_gruppi[i].id(),(*inatm).id()); } inatm++; } inatm=_gruppi[i].iniz_atom(); fiatm= _gruppi[i].fin_atom(); int x_y[2]={static_cast(x),static_cast(y)}; int w_h[2]={static_cast(w),static_cast(h)}; if(inatm!=fiatm){ //appartiene_legame_bb(atomo* da , atomo* fino, void* data, void* data2 ,void* data3) _gruppi[i].generic_depth_search(&(*inatm), this, x_y ,w_h,appartiene_legame_bb); } } for(unsigned int i=0;i<_stringhe.size();i++){ // float xcent=_stringhe[i]->x()+((_stringhe[i]->x()+_stringhe[i]->w()-_stringhe[i]->x())/2); // float ycent=_stringhe[i]->y()+((_stringhe[i]->y()+_stringhe[i]->h()-_stringhe[i]->y())/2); // if(xcent>x && xcenty && ycentdentro_bb(x,y,w,h); if(dentro){ aggiungi_elem_selected(ETICHETTA,NO_VALID_GROUP,i); } } } atomo* immagine::ritorna_atomo_ident(int gr_id, int atm_id){ for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()==gr_id){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fi= _gruppi[i].fin_atom(); while(in!=fi){ if((*in).id()==atm_id){ return &(*in); } in++; } } } return 0; } int immagine::prova_click_atomo(atomo** ris, int x, int y){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fi= _gruppi[i].fin_atom(); while(in!=fi){ int click=(*in).sotto_mouse(x,y); if(click!=-1){ //fl_message("Cliccato atomo %d del gruppo %d", click, _gruppi[i].id()); *ris=&(*in); ritorna_atomo_ident(_gruppi[i].id(),click); aggiungi_elem_selected(ATOMO,_gruppi[i].id(),click); //cout << ris << endl; return click; } in++; } } ris=0; return -1; } bool immagine::check_exists_in_elem_selected(int x_m,int y_m,bool& exists){ exists=false; bool res=false; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x_m-=dx_scroll; y_m-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fi= _gruppi[i].fin_atom(); while(in!=fi){ int click=(*in).sotto_mouse(x_m,y_m); if(click!=-1){ for(unsigned int i=0;i<_elem_selected.size();i++){ if(_elem_selected[i].first==ATOMO && _elem_selected[i].second.first==(*in).id_gruppo() && _elem_selected[i].second.second==(*in).id()){ exists=true; res=true; return res; }else{ exists=false; res=false; } } } in++; if(res){ return res; } } } for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_procedure(); vector::iterator fi= _gruppi[i].fin_procedure(); while(in!=fi){ int click=(*in)->sotto_mouse(x_m,y_m); if(click!=-1){ for(unsigned int i=0;i<_elem_selected.size();i++){ if((_elem_selected[i].first==PROC_ARC || _elem_selected[i].first==PROC_ARROW || _elem_selected[i].first==PROC_BEZIER || _elem_selected[i].first==PROC_BOX ) && _elem_selected[i].second.first==(*in)->id_gruppo() && _elem_selected[i].second.second==(*in)->id()){ exists=true; res=true; return res; }else{ exists=true; res=false; } } } in++; if(res){ return res; } } } for (unsigned int i=0;i<_stringhe.size();i++){ int click=_stringhe[i]->sotto_mouse(x_m,y_m); if(click!=-1){ exists=true; res=false; for(unsigned int i2=0;i2<_elem_selected.size();i2++){ if((_elem_selected[i2].second.first)== NO_VALID_GROUP){ for(unsigned int i3=0;i3<_stringhe.size();i3++){ if(static_cast(i3)==_elem_selected[i2].second.second){ res=true; return res; } } } } } } return res; } bool immagine::check_selected_group_bond_coincidence(atomo** selected_1, atomo** selected_2, atomo** hook_1 , atomo** hook_2){ *selected_1=NULL; *selected_2=NULL; *hook_1=NULL; *hook_2=NULL; bool res=false; if(_elem_selected.size()>0 && _elem_selected[0].second.first!=NO_VALID_GROUP && _elem_selected[0].first==ATOMO){ int id_sel_grp=_elem_selected[0].second.first; gruppo* sel=find_group_id(id_sel_grp); std::vector< std::pair< std::pair, std::pair > > results; sel->generic_depth_search(sel->find_atomo_id(sel->iniz_atom()->id()), static_cast(&results), NULL, NULL, glue_find_line_near_sel); std::vector res_v; bool found=false; unsigned int res_v_pos=0; for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].has_atoms()){ if(_gruppi[i].id()!=sel->id()){ if(_gruppi[i].find_atomo_id(_gruppi[i].iniz_atom()->id())!=NULL){ _gruppi[i].generic_depth_search(_gruppi[i].find_atomo_id(_gruppi[i].iniz_atom()->id()), static_cast(&results), static_cast(&res_v), static_cast(&found), glue_find_line_near_hook); if(found){ res_v_pos=i; break; } } } } } if(found){ std::pair atms=results[res_v[0]].first; *selected_1=atms.first; *selected_2=atms.second; *hook_1=_gruppi[res_v_pos].find_atomo_id(res_v[1]); *hook_2=_gruppi[res_v_pos].find_atomo_id(res_v[2]); res=found; } } return res; } bool immagine::check_selected_group_atom_coincidence(atomo** selected, atomo** hook){ static float dist_tolerance=5; *selected=NULL; *hook=NULL; bool res=false; int id_sel_grp=_elem_selected[0].second.first; gruppo* sel=find_group_id(id_sel_grp); if(_elem_selected.size()>0 && _elem_selected[0].second.first!=NO_VALID_GROUP && _elem_selected[0].first==ATOMO){ for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()!=sel->id() && sel->has_atoms()){ vector::iterator beg=_gruppi[i].iniz_atom(); vector::iterator end=_gruppi[i].fin_atom(); std::pair found(false,-1); while(beg!=end){ sel->generic_depth_search(sel->find_atomo_id(sel->iniz_atom()->id()), static_cast(&dist_tolerance), static_cast(&(*beg)), static_cast(&found), glue_find_first_near); if(found.first){ *selected=sel->find_atomo_id(found.second); *hook=&(*beg); res=true; break; } beg++; } } } } return res; } bool immagine::prova_click(int x, int y , bool& exists, bool erase_previous){ if(erase_previous){ elimina_legami_selected(); elimina_elem_selected(); } exists=false; bool res=false; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fi= _gruppi[i].fin_atom(); while(in!=fi){ int click=(*in).sotto_mouse(x,y); if(click!=-1){ //fl_message("Cliccato atomo %d del gruppo %d", click, _gruppi[i].id()); bool no_exists=aggiungi_elem_selected(ATOMO,_gruppi[i].id(),click); exists=!no_exists; res=true; return res; } in++; } } for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_procedure(); vector::iterator fi= _gruppi[i].fin_procedure(); while(in!=fi){ int click=(*in)->sotto_mouse(x,y); if(click!=-1){ //fl_message("Cliccato procedura %d del gruppo %d", click, (*in)->id_gruppo()); int tipo_proc=-1; if(typeid( *(*in))==typeid(proc_arc)){ tipo_proc=PROC_ARC; }else if(typeid( *(*in))==typeid(proc_arrow)){ tipo_proc=PROC_ARROW; }else if(typeid( *(*in))==typeid(proc_bezier)){ tipo_proc=PROC_BEZIER; }else if(typeid( *(*in))==typeid(BoxProc)){ tipo_proc=PROC_BOX; } bool no_exists=aggiungi_elem_selected(tipo_proc,_gruppi[i].id(),click); exists=!no_exists; res=true; return res; } in++; } } for (unsigned int i=0;i<_stringhe.size();i++){ int click=_stringhe[i]->sotto_mouse(x,y); if(click!=-1 && !_stringhe[i]->can_highlight()){ //fl_message("Cliccata etichetta %d ",i ); bool no_exists=aggiungi_elem_selected(ETICHETTA,NO_VALID_GROUP,i); exists=!no_exists; res=true; return res; } } for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fin=_gruppi[i].fin_atom(); if(in!=fin){ _gruppi[i].generic_depth_search(&(*in), this, &x ,&y,appartiene_legame); } } if(_legami_selected.size()>0){ res=true; } return res; } bool immagine::check_click_bond(int x, int y, bool& exists, bool erase_previous){ if(erase_previous){ elimina_legami_selected(); elimina_elem_selected(); } exists=false; bool res=false; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fin=_gruppi[i].fin_atom(); if(in!=fin){ _gruppi[i].generic_depth_search(&(*in), this, &x ,&y,appartiene_legame); } } if(_legami_selected.size()>0){ res=true; } return res; } bool immagine::check_click_etichetta(int x, int y , bool& exists, bool erase_previous){ if(erase_previous){ elimina_legami_selected(); elimina_elem_selected(); } exists=false; bool res=false; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for (unsigned int i=0;i<_stringhe.size();i++){ int click=_stringhe[i]->sotto_mouse(x,y); if(click!=-1){ //fl_message("Cliccata etichetta %d ",i ); bool no_exists=aggiungi_elem_selected(ETICHETTA,NO_VALID_GROUP,i); exists=!no_exists; res=true; break; } } return res; } bool immagine::check_control_point_procedura_under_mouse(int x_m,int y_m){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x_m-=dx_scroll; y_m-=dy_scroll; procedura* hitted=0; bool found=false; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator beg_p=_gruppi[i].iniz_procedure(); vector::iterator end_p=_gruppi[i].fin_procedure(); while(beg_p!=end_p){ if((*beg_p)->control_point_under_mouse(x_m,y_m)>=0){ hitted=(*beg_p); break; } beg_p++; } if(hitted){ found=true; break; } } return found; } void immagine::translate_control_points(float dx, float dy){ for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator beg_p=_gruppi[i].iniz_procedure(); vector::iterator end_p=_gruppi[i].fin_procedure(); while(beg_p!=end_p){ (*beg_p)->control_point_transl(dx,dy); beg_p++; } } } void immagine::unset_selected_control_points(){ for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator beg_p=_gruppi[i].iniz_procedure(); vector::iterator end_p=_gruppi[i].fin_procedure(); while(beg_p!=end_p){ (*beg_p)->unset_edit_control_point(); beg_p++; } } } void immagine::cambia_colore_sel_etich(int r, int g, int b){ for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ (*in).etich_ref().cr(r); (*in).etich_ref().cg(g); (*in).etich_ref().cb(b); } in++; } } } } } } void immagine::cambia_colore_sel(int r, int g, int b){ for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ (*in).cr(r); (*in).cg(g); (*in).cb(b); } in++; } }else{ vector::iterator in=_gruppi[ctgrp].iniz_procedure(); vector::iterator fi= _gruppi[ctgrp].fin_procedure(); while(in!=fi){ if((*in)->id()==tmp_elem.second){ (*in)->cr(r); (*in)->cg(g); (*in)->cb(b); } in++; } } } } }else{ _stringhe[tmp_elem.second]->cr(r); _stringhe[tmp_elem.second]->cg(g); _stringhe[tmp_elem.second]->cb(b); } } //cambiamo_colore ai legami selezionati for (unsigned int i=0;i<_legami_selected.size();i++){ for(unsigned int gct=0;gct<_gruppi.size();gct++){ //cerchiamo tra i gruppi if(_gruppi[gct].id()==_legami_selected[i][0]){ vector::iterator inat=_gruppi[gct].iniz_atom(); vector::iterator finat=_gruppi[gct].fin_atom(); while(inat!=finat){//cerchiamo tra gli atomi if((*inat).id()==_legami_selected[i][1]){ vector::iterator inleg=(*inat).primo_leg(); vector::iterator finleg=(*inat).ultimo_leg(); while(inleg!=finleg){//cerchiamo tra i legami if((*inleg).id_legame()==_legami_selected[i][2]){ //cout << "(*inleg).id_legame()" << (*inleg).id_legame() << endl; (*inleg).cr(r); (*inleg).cg(g); (*inleg).cb(b); } inleg++; } } inat++; } } } } } void immagine::phys_translate_selected(int xn, int yn){ for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ (*in).phys_translate(xn,yn); } in++; } }else{ vector::iterator in=_gruppi[ctgrp].iniz_procedure(); vector::iterator fi= _gruppi[ctgrp].fin_procedure(); while(in!=fi){ if((*in)->id()==tmp_elem.second){ (*in)->phys_translate(xn,yn); } in++; } } } } }else{ _stringhe[tmp_elem.second]->phys_translate(xn,yn); } } } void immagine::trasla_selected(int xn, int yn){ for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ (*in).trasla(xn,yn); } in++; } }else{ vector::iterator in=_gruppi[ctgrp].iniz_procedure(); vector::iterator fi= _gruppi[ctgrp].fin_procedure(); while(in!=fi){ if((*in)->id()==tmp_elem.second){ (*in)->trasla(xn,yn); } in++; } } } } }else{ //std::cout << "pippo trasla" << std::endl; _stringhe[tmp_elem.second]->trasla(xn,yn); } } } void immagine::ruota_selected(float angl,int xpivot,int ypivot){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); xpivot-=dx_scroll; ypivot-=dy_scroll; for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ (*in).ruota(xpivot,ypivot,angl); } in++; } }else{ vector::iterator in=_gruppi[ctgrp].iniz_procedure(); vector::iterator fi= _gruppi[ctgrp].fin_procedure(); while(in!=fi){ if((*in)->id()==tmp_elem.second){ (*in)->ruota(xpivot,ypivot,angl); } in++; } } } } }else{ cerr << "per ora le stringhe non possono essere ruotate" << endl; //_stringhe[tmp_elem.second].ruota(xpivot,ypivot,angl); } } } void immagine::rotate_selected_3d(bool axis, float angle){ //costruiamo la bounding box // //Eventualmente mettere in una funziona a parte che puo' tornare //sempre utile!!!!! /* (0,0) left_bottom----------+ | | | | | | | | | | | | +----------right_top */ matrix right_top(1,2); right_top(0,0)=-1E10; right_top(0,1)=-1E10; matrix left_bottom(1,2); left_bottom(0,0)=1E10; left_bottom(0,1)=1E10; for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ //trovato try{ if((*in).phys_pos_x()>right_top(0,0)){ right_top(0,0)=(*in).phys_pos_x(); } if((*in).phys_pos_y()>right_top(0,1)){ right_top(0,1)=(*in).phys_pos_y(); } if((*in).phys_pos_x() midpoint(1,2); midpoint(0,0)= left_bottom(0,0) + ( right_top(0,0) - left_bottom(0,0) ) / 2.0; midpoint(0,1)= left_bottom(0,1) + ( right_top(0,1) - left_bottom(0,1) ) / 2.0; //cout << "midpoint: " << midpoint << endl; ///////////////////////////////// matrix rotation(3,3); try{ if(axis){//asse x rotation(0,0)=1; rotation(0,1)=0; rotation(0,2)=0; rotation(1,0)=0; rotation(1,1)=cos(angle); rotation(1,2)=sin(angle); rotation(2,0)=0; rotation(2,1)=-sin(angle); rotation(2,2)=cos(angle); }else{//asse y rotation(0,0)=cos(angle); rotation(0,1)=0; rotation(0,2)=-sin(angle); rotation(1,0)=0; rotation(1,1)=1; rotation(1,2)=0; rotation(2,0)=sin(angle); rotation(2,1)=0; rotation(2,2)=cos(angle); } }catch (matrix_error ex){ cerr << "exception in " << __LINE__ << " " << __FILE__ << ex.what() << endl; } //int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); //int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); /* xpivot-=dx_scroll; ypivot-=dy_scroll; */ for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ try{ matrix vec_3(1,3); vec_3(0,0)=(*in).phys_pos_x() - midpoint(0,0); vec_3(0,1)=(*in).phys_pos_y() - midpoint(0,1); vec_3(0,2)=(*in).phys_pos_z(); //hummmmmm.... matrix rotated= vec_3 * rotation; (*in).pos_x(rotated(0,0) + midpoint(0,0) ); (*in).pos_y(rotated(0,1) + midpoint(0,1) ); (*in).pos_z(rotated(0,2)); }catch (matrix_error ex){ cerr << "exception in " << __LINE__ << " " << __FILE__ << " " << ex.what() << endl; } } in++; } } } } } } } void immagine::scala_selected(float fat){ //calcoliamo la bounding box degli elementi selezionati float min_xbb=1E20; float min_ybb=1E20; float max_xbb=1E-20; float max_ybb=1E-20; for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ if((*in).phys_pos_x() < min_xbb){ min_xbb=(*in).phys_pos_x(); } if((*in).phys_pos_y() < min_ybb){ min_ybb=(*in).phys_pos_y(); } if((*in).phys_pos_x() > max_xbb){ max_xbb=(*in).phys_pos_x(); } if((*in).phys_pos_y() > max_ybb){ max_ybb=(*in).phys_pos_y(); } } in++; } }else{ vector::iterator in=_gruppi[ctgrp].iniz_procedure(); vector::iterator fi= _gruppi[ctgrp].fin_procedure(); while(in!=fi){ if((*in)->id()==tmp_elem.second){ if((*in)->posx() < min_xbb){ min_xbb=(*in)->phys_posx(); } if((*in)->posy() < min_ybb){ min_ybb=(*in)->phys_posy(); } if((*in)->posx() > max_xbb){ max_xbb=(*in)->phys_posx(); } if((*in)->posy() > max_ybb){ max_ybb=(*in)->phys_posy(); } } in++; } } } } }else{ if(_stringhe[tmp_elem.second]->x() < min_xbb){ min_xbb=_stringhe[tmp_elem.second]->phys_x(); } if(_stringhe[tmp_elem.second]->y() < min_ybb){ min_ybb=_stringhe[tmp_elem.second]->phys_y(); } if(_stringhe[tmp_elem.second]->x() > max_xbb){ max_xbb=_stringhe[tmp_elem.second]->phys_x(); } if(_stringhe[tmp_elem.second]->y() > max_ybb){ max_ybb=_stringhe[tmp_elem.second]->phys_y(); } } } //trasliamo il sistema di coordinate facendolo cooincidere con il centro della bb float w_sc=max_xbb-min_xbb; float h_sc=max_ybb-min_ybb; float dx_sc=min_xbb+w_sc/2; float dy_sc=min_ybb+h_sc/2; /* cout << "rrr min_xbb " << min_xbb << " " << "min_ybb " << min_ybb << "max_xbb " << max_xbb << "max_ybb " << max_ybb << "trx " << dx_sc << "try " << dy_sc <(rintf(-dx_sc)), static_cast(rintf(-dy_sc))); //scaliamo for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ (*in).scale(fat); } in++; } }else{ vector::iterator in=_gruppi[ctgrp].iniz_procedure(); vector::iterator fi= _gruppi[ctgrp].fin_procedure(); while(in!=fi){ if((*in)->id()==tmp_elem.second){ (*in)->scale(fat); } in++; } } } } }else{ _stringhe[tmp_elem.second]->scale(fat); } } //trasliamo il sistema di coordinate facendolo cooincidere con l'origine dell'immagine phys_translate_selected(static_cast(rintf(dx_sc)), static_cast(rintf(dy_sc))); } void immagine::scale_label_of_atom_selected(float fat){ for(unsigned int i=0;i<_elem_selected.size();i++){ pair tmp_elem=_elem_selected[i].second; int tipo_elem=_elem_selected[i].first; if(tmp_elem.first!=NO_VALID_GROUP){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(tmp_elem.first==_gruppi[ctgrp].id()){ if(tipo_elem==ATOMO){ vector::iterator in=_gruppi[ctgrp].iniz_atom(); vector::iterator fi= _gruppi[ctgrp].fin_atom(); while(in!=fi){ if((*in).id()==tmp_elem.second){ //here, scale here! etichetta* et=(*in).etich_punt(); et->scale(fat); } in++; } } } } } } } void immagine::shift_type_bond_selected(){ /* *Contiene triplette: gruppo, atomo di appartenenza e id dei legami selezionati */ if(_legami_selected.size()>0){ int id_grp=(_legami_selected[0])[0]; gruppo* selgrp=find_group_id(id_grp); atomo* atm1=selgrp->find_atomo_id( (_legami_selected[0])[1] ); legame* b_atm1=atm1->find_leg((_legami_selected[0])[2]); atomo* atm2=selgrp->find_atomo_id( b_atm1->id_atomo() ); legame* b_atm2=NULL; vector::iterator first=atm2->primo_leg(); vector::iterator last=atm2->ultimo_leg(); while(first!=last){ if((*first).id_atomo()==atm1->id()){ b_atm2=atm2->find_leg( (*first).id_legame() ); break; } first++; } if(b_atm1!=NULL && b_atm2!=NULL){ bond_type curr=static_cast(b_atm1->tipo_legame()); bond_type nw=shift_bond_type(curr); b_atm1->tipo_legame(nw); b_atm2->tipo_legame(nw); } } } bool immagine::cambia_prop_bezier(int x , int y){ // cout << "cambia_prop_bezier" << endl; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator arriniz=_gruppi[i].iniz_procedure(); vector::iterator arrfin=_gruppi[i].fin_procedure(); while(arriniz!=arrfin){ if((*arriniz)->sotto_mouse(x,y)!=-1 && typeid( *(*arriniz))==typeid(proc_bezier) ){ bezier_win(dynamic_cast(*arriniz)); return true; } arriniz++; } } return false; } bool immagine::cambia_prop_arc(int x , int y){ //cout << "cambia_prop_arc" << endl; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator arriniz=_gruppi[i].iniz_procedure(); vector::iterator arrfin=_gruppi[i].fin_procedure(); while(arriniz!=arrfin){ if((*arriniz)->sotto_mouse(x,y)!=-1 && typeid( *(*arriniz))==typeid(proc_arc) ){ arc_win(dynamic_cast(*arriniz)); return true; } arriniz++; } } return false; } bool immagine::change_prop_box(int x , int y){ //cout << "cambia_prop_arc" << endl; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator arriniz=_gruppi[i].iniz_procedure(); vector::iterator arrfin=_gruppi[i].fin_procedure(); while(arriniz!=arrfin){ if((*arriniz)->sotto_mouse(x,y)!=-1 && typeid( *(*arriniz))==typeid(BoxProc) ){ box_win(dynamic_cast(*arriniz)); return true; } arriniz++; } } return false; } bool immagine::cambia_prop_frecce(int x , int y){ //cout << "cambia_prop_frecce" << endl; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator arriniz=_gruppi[i].iniz_procedure(); vector::iterator arrfin=_gruppi[i].fin_procedure(); while(arriniz!=arrfin){ if((*arriniz)->sotto_mouse(x,y)!=-1 && typeid( *(*arriniz))==typeid(proc_arrow) ){ arrow_win(dynamic_cast(*arriniz)); return true; } arriniz++; } } return false; } void immagine::cambia_prop_legami(int x , int y){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; /** *Crea la finetra e ritorna un vettore che contiene nell'ordine: * componente r g b del colore el legame e tipo di legame; */ int fatto=0; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fin=_gruppi[i].fin_atom(); if(in!=fin){ _gruppi[i].generic_depth_search(&(*in), &fatto, &x ,&y,appartiene_legame_prop); } } #ifdef DEBUG cout << "Dump proveniente da cambia_prop_legami" << endl; dump_tmp_atom(); #endif } bool immagine::cambia_prop_atomo(int x, int y){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator atminiz=_gruppi[i].iniz_atom(); vector::iterator atmfin=_gruppi[i].fin_atom(); while(atminiz!=atmfin){ if((*atminiz).sotto_mouse(x,y)!=-1){ //cout << "ff " <<(*atminiz).id()<< endl; atom_win(&(*(atminiz))); return true; //break; } atminiz++; } } return false; } bool immagine::cambia_prop_etichetta(int x, int y){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); x-=dx_scroll; y-=dy_scroll; bool res=false; for(unsigned int i=0;i<_stringhe.size();i++){ if(_stringhe[i]->sotto_mouse(x,y)!=-1){ elimina_legami_selected(); elimina_elem_selected(); aggiungi_elem_selected(ETICHETTA,NO_VALID_GROUP,i); highlight_selected(); if(typeid(*_stringhe[i])==typeid(etichetta)){ string_prop p(_stringhe[i]); p.show(); while(p.shown()){ Fl::wait(); } }else if(typeid(*_stringhe[i])==typeid(multiline_label)){ multiline_label* mll=dynamic_cast(_stringhe[i]); if(mll){ multiline_label_prop p(mll); p.show(); while(p.shown()){ Fl::wait(); } } }else if(typeid(*_stringhe[i])==typeid(paragraph_text)){ paragraph_text* mll=dynamic_cast(_stringhe[i]); if(mll){ elimina_elem_selected(); elimina_legami_selected(); paragraph_text_prop p(mll); p.show(); while(p.shown()){ Fl::wait(); } } } elimina_legami_selected(); elimina_elem_selected(); res=true; break; } } return res; } void immagine::aggiungi_tutto_selected(gruppo added){ //fl_message("added Cliccato gruppo %d", added.id()); vector::iterator iniz=added.iniz_procedure(); vector::iterator fin=added.fin_procedure(); while(iniz!=fin){ int tipo_proc=-1; if(typeid( *(*iniz))==typeid(proc_arc)){ tipo_proc=PROC_ARC; }else if(typeid( *(*iniz))==typeid(proc_arrow)){ tipo_proc=PROC_ARROW; }else if(typeid( *(*iniz))==typeid(proc_bezier)){ tipo_proc=PROC_BEZIER; }else if(typeid( *(*iniz))==typeid(BoxProc)){ tipo_proc=PROC_BOX; } aggiungi_elem_selected(tipo_proc,added.id(),(*iniz)->id()); iniz++; } vector::iterator iniz2=added.iniz_atom(); vector::iterator fin2=added.fin_atom(); while(iniz2!=fin2){ aggiungi_elem_selected(ATOMO,added.id(),(*iniz2).id()); vector::iterator inizleg=(*iniz2).primo_leg(); vector::iterator finleg=(*iniz2).ultimo_leg(); while(inizleg!=finleg){ /* cout << "AGGIUNTO: " << added.id() << " " << (*inizleg).id_atomo() << " " << (*inizleg).id_legame() << endl; */ aggiungi_legami_selected(added.id(), (*iniz2).id(), (*inizleg).id_legame()); inizleg++; } iniz2++; } } void immagine::highlight_selected(){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); for(unsigned int i=0;i<_elem_selected.size();i++){ pair grp_id=_elem_selected[i].second; switch(_elem_selected[i].first){ case ETICHETTA: { etichetta* etic=_stringhe[grp_id.second]; int w=etic->w(); int h=etic->h(); int x=dx_scroll+static_cast(rintf(etic->x())); int y=dy_scroll+static_cast(rintf(etic->y())); draw_frame(x,y,w,h); break; } case ATOMO: { for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()==grp_id.first){ vector::iterator in=_gruppi[i].iniz_atom(); vector::iterator fi= _gruppi[i].fin_atom(); while(in!=fi){ if((*in).id()==grp_id.second){ etichetta etic=(*in).etich(); _gruppi[i].allinea_etichetta(etic,(*in)); int w=etic.w(); int h=etic.h(); float x=0; float y=0; //get_bb_etic(etic, x, y); x+=dx_scroll+etic.x(); //+static_cast(rintf((*in).pos_x()+etic.x()-w/2)); y+=dy_scroll+etic.y(); //+static_cast(rintf((*in).pos_y()+etic.y()-h/2)); draw_frame(static_cast(rintf(x)), static_cast(rintf(y)), w,h); } in++; } } } break; } default: for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()==grp_id.first){ vector::iterator in=_gruppi[i].iniz_procedure(); vector::iterator fi= _gruppi[i].fin_procedure(); while(in!=fi){ if((*in)->id()==grp_id.second){ int w=static_cast(rintf((*in)->w())); int h=static_cast(rintf((*in)->h())); int x=dx_scroll+static_cast(rintf((*in)->posx())); int y=dy_scroll+static_cast(rintf((*in)->posy())); draw_frame(x,y,w,h); } in++; } } } } } /** *Contiene triplette: gruppo, atomo di appartenenza e id dei legami selezionati */ // vector _legami_selected; for(unsigned int i=0;i<_legami_selected.size();i++){ for(unsigned int ctg=0;ctg<_gruppi.size();ctg++){ if(_legami_selected[i][0]==_gruppi[ctg].id()){ vector::iterator inatm=_gruppi[ctg].iniz_atom(); vector::iterator finatm=_gruppi[ctg].fin_atom(); while(inatm!=finatm){ if(_legami_selected[i][1]==(*inatm).id()){ draw_point(static_cast(rintf((*inatm).pos_x()))+dx_scroll, static_cast(rintf((*inatm).pos_y()))+dy_scroll); vector::iterator inleg=(*inatm).iniz_leg(); vector::iterator finleg=(*inatm).fin_leg(); while(inleg!=finleg){ if(_legami_selected[i][2]==(*inleg).id_legame()){ vector::iterator inatm2=_gruppi[ctg].iniz_atom(); vector::iterator finatm2=_gruppi[ctg].fin_atom(); while(inatm2!=finatm2){ if((*inleg).id_atomo()==(*inatm2).id()){ draw_point(static_cast(rintf((*inatm2).pos_x()))+dx_scroll, static_cast(rintf((*inatm2).pos_y()))+dy_scroll); } inatm2++; } } inleg++; } } inatm++; } } } } } void immagine::delete_etichetta_at(unsigned int i){ vector::iterator beg=_stringhe.begin(); beg+=i; delete_etichetta_at(beg); } void immagine::delete_etichetta_at(vector::iterator i){ vector::iterator the_end=_stringhe.end(); if(i::iterator inatom=_gruppi[ctg].iniz_atom(); vector::iterator finatom=_gruppi[ctg].fin_atom(); while(inatom!=finatom){ if((*inatom).id()==((_elem_selected[i]).second).second){ //trovato atomo vector::iterator inleg=(*inatom).iniz_leg(); vector::iterator finleg=(*inatom).fin_leg(); while(inleg!=finleg){ vector::iterator inatom2=_gruppi[ctg].iniz_atom(); vector::iterator finatom2=_gruppi[ctg].fin_atom(); while(inatom2!=finatom2){ if((*inleg).id_atomo()==(*inatom2).id()){ //trovato l'atomo al quale e' legato quello //selezionato; cancellare l'uno e l'altro. (*inatom).elimina_legame((*inatom2).id()); (*inatom2).elimina_legame((*inatom).id()); } inatom2++; } inleg++; } } inatom++; } } } //adesso si devono eliminare tutti gli atomi che non hanno //legami for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator inatom=_gruppi[i].iniz_atom(); vector::iterator finatom=_gruppi[i].fin_atom(); while(inatom!=finatom){ vector::iterator inleg=(*inatom).iniz_leg(); vector::iterator finleg=(*inatom).fin_leg(); if(inleg==finleg){ //atomo senza legami: cancellare _gruppi[i].elimina_atomo((*inatom).id()); inatom=_gruppi[i].iniz_atom(); finatom=_gruppi[i].fin_atom(); }else{ inatom++; } } } /* for(int i=0;i<_gruppi.size();i++){ vector::iterator inatom=_gruppi[i].iniz_atom(); vector::iterator finatom=_gruppi[i].fin_atom(); while(inatom!=finatom){ cout << "id_gr " << _gruppi[i].id() << " id_atm" << (*inatom).id() << endl; inatom++; } } */ break; } case ETICHETTA: { if(static_cast(((_elem_selected[i]).second).second)<=_stringhe.size()-1){ vector::iterator instr=_stringhe.begin(); instr+=((_elem_selected[i]).second).second; delete_etichetta_at(instr); }else{ cerr << "Attenzione: eliminando l'etichetta " << _elem_selected[i].first << " in posizione " << ((_elem_selected[i]).second).second << "> " << "_stringhe.size() " << _stringhe.size() << endl; } break; } case PROC_ARC: case PROC_ARROW: case PROC_BEZIER: case PROC_BOX: { //cout << ",,, " << ((_elem_selected[i]).second).first << " " // << ((_elem_selected[i]).second).second <::iterator prcin=_gruppi[ctproc2].iniz_procedure(); vector::iterator prcfin=_gruppi[ctproc2].fin_procedure(); while(prcin!=prcfin){ //cout << "(*prcin)->id() "<< flush << (*prcin)->id() << endl; if((*prcin)->id()==((_elem_selected[i]).second).second){ //cout << "+++++ " << ((_elem_selected[i]).second).first << " " //<< ((_elem_selected[i]).second).second <id()); prcin=_gruppi[ctproc2].iniz_procedure(); prcfin=_gruppi[ctproc2].fin_procedure(); }else{ prcin++; } } } } break; } } } //ok abbiamo eliminato atomi e procedure abbiamo spezzato le molecole //formando i gruppi figli e abbiamo eliminato le etichette //adesso tocca ai legami /** *Contiene triplette: gruppo, atomo di appartenenza e id dei legami selezionati */ /* cout << "contenuto vettore" << endl; for(int i=0;i<_legami_selected.size();i++){ cout<< "<>>>>>>>" << endl; cout << _legami_selected[i][0] << "," << _legami_selected[i][1] << "," << _legami_selected[i][2] << endl; } */ for(unsigned int i=0;i<_legami_selected.size();i++){ for(unsigned int ctgrp=0;ctgrp<_gruppi.size();ctgrp++){ if(_legami_selected[i][0]==_gruppi[ctgrp].id_gruppo()){ //trovato gruppo vector::iterator inatom=_gruppi[ctgrp].iniz_atom(); vector::iterator finatom=_gruppi[ctgrp].fin_atom(); while(inatom!=finatom){ if((*inatom).id()==_legami_selected[i][1]){ //trovato atomo vector::iterator inleg=(*inatom).iniz_leg(); vector::iterator finleg=(*inatom).fin_leg(); while(inleg!=finleg){ if((*inleg).id_legame()==_legami_selected[i][2]){ //trovato id_legame vector::iterator inatom2=_gruppi[ctgrp].iniz_atom(); vector::iterator finatom2=_gruppi[ctgrp].fin_atom(); while(inatom2!=finatom2){ /* cout << "legame di " << (*inatom).id() << "con id " << _legami_selected[i][2] << " porta id atomo: " << (*inleg).id_atomo() << endl; */ if((*inleg).id_atomo()==(*inatom2).id()){ //trovato l'atomo al quale e' legato quello //selezionato; cancellare l'uno e l'altro. //cout << "cancello: " << (*inatom2).id() << " " << (*inatom).id()<< endl; (*inatom).elimina_legame((*inatom2).id()); (*inatom2).elimina_legame((*inatom).id()); break; } inatom2++; } } inleg++; } } inatom++; } } } } //adesso si devono eliminare tutti gli atomi che non hanno //legami for(unsigned int i=0;i<_gruppi.size();i++){ vector::iterator inatom=_gruppi[i].iniz_atom(); vector::iterator finatom=_gruppi[i].fin_atom(); while(inatom!=finatom){ vector::iterator inleg=(*inatom).iniz_leg(); vector::iterator finleg=(*inatom).fin_leg(); if(inleg==finleg){ //atomo senza legami: cancellare _gruppi[i].elimina_atomo((*inatom).id()); inatom=_gruppi[i].iniz_atom(); finatom=_gruppi[i].fin_atom(); }else{ inatom++; } } } // e poi si devono crere altri gruppi se si sono spezzate le //molecole. spezza_gruppo(); //cout << "?????????????????????????????????????????????????" << endl; #ifdef DEBUG dump_tmp_atom(); #endif } void immagine::spezza_gruppo(){ vector ::iterator globgruppoiniz=_gruppi.begin(); vector ::iterator globgruppofin=_gruppi.end(); while(globgruppoiniz!=globgruppofin){ vector < vector > matr; vector::iterator inatom=(*globgruppoiniz).iniz_atom(); vector::iterator finatom=(*globgruppoiniz).fin_atom(); vector visti; while(inatom!=finatom){ stack pila; vector molecola; //molecola.push_back(*inatom); pila.push(&(*inatom)); while(pila.size()>0){ //cout << "size " << pila.size() << endl; atomo* cima=pila.top(); pila.pop(); //cout << "estratto " << cima->id()<id() ; if(visti[i2]==cima->id()){ e_visto=true; //cout << " evisto: " << e_visto << endl; break; } //cout << " evisto: " << e_visto << endl; } /** cout << "\n------------------"<< endl; for(int i3=0;i3id() << " " << e_visto<< endl; */ //cout << "gruppo: " << id() << endl; if(!e_visto){ molecola.push_back((*cima)); vector::iterator primo=cima->primo_leg(); vector::iterator ultimo=cima->ultimo_leg(); //cout << ultimo -primo << " "<< endl; while(primo!=ultimo){ //cout << cima->id() << " " << (*primo).id_atomo() << endl; vector::iterator inatom2=(*globgruppoiniz).iniz_atom(); vector::iterator finatom2=(*globgruppoiniz).fin_atom(); while(inatom2!=finatom2){ if((*inatom2).id()==(*primo).id_atomo()){ pila.push(&(*inatom2)); } inatom2++; } primo++; } //cout << "--------------" << endl; } visti.push_back(cima->id()); } if(molecola.size()>0){ matr.push_back(molecola); } inatom++; } //cout << "gruppo: " << (*globgruppoiniz).id() // <<" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" << endl; /* for(unsigned int idu=0;idu1){ gruppo vecchio=(*globgruppoiniz); globgruppoiniz=_gruppi.erase(globgruppoiniz); for(unsigned int matct=0;matct 0 ? tmp.id_gruppo(_gruppi.back().id_gruppo()+1) : tmp.id_gruppo(10); for(unsigned int atomct=0;atomct::iterator prcin=vecchio.iniz_procedure(); vector::iterator prcfin=vecchio.fin_procedure(); while(prcin!=prcfin){ switch(((*prcin))->tipo()){ case PROC_ARC: { proc_arc* arc=dynamic_cast((*prcin)); proc_arc* arcnw=new proc_arc(); arcnw->id( arc->id() ); arcnw->posx(arc->posx()); arcnw->posy(arc->posy()); arcnw->w(arc->w()); arcnw->h(arc->h()); arcnw->xstart(arc->xstart()); arcnw->ystart(arc->ystart()); arcnw->xend(arc->xend()); arcnw->yend(arc->yend()); arcnw->x1(arc->x1()); arcnw->y1(arc->y1()); arcnw->x2(arc->x2()); arcnw->y2(arc->y2()); arcnw->x3(arc->x3()); arcnw->y3(arc->y3()); arcnw->x4(arc->x4()); arcnw->y4(arc->y4()); arcnw->cb(arc->cb()); arcnw->cr(arc->cr()); arcnw->cg(arc->cg()); arcnw->xpivot(arc->xpivot()); arcnw->ypivot(arc->ypivot()); arcnw->angolorot(arc->angolorot()); arcnw->spessore(arc->spessore()); arcnw->dash(arc->dash()); tmp.aggiungi_procedura(arcnw); break; } case PROC_ARROW: { proc_arrow* arr=dynamic_cast((*prcin)); proc_arrow* arrnw=new proc_arrow(); arrnw->id( arr->id() ); arrnw->posx(arr->posx()); arrnw->posy(arr->posy()); arrnw->eposx(arr->eposx()); arrnw->eposy(arr->eposy()); arrnw->cb(arr->cb()); arrnw->cr(arr->cr()); arrnw->cg(arr->cg()); arrnw->xpivot(arr->xpivot()); arrnw->ypivot(arr->ypivot()); arrnw->angolorot(arr->angolorot()); arrnw->spessore(arr->spessore()); arrnw->dash(arr->dash()); arrnw->punte(arr->punte()); tmp.aggiungi_procedura(arrnw); break; } case PROC_BEZIER: { proc_bezier* bez=dynamic_cast((*prcin)); proc_bezier* beznw= new proc_bezier(); beznw->id( bez->id() ); beznw->ix(bez->ix()); beznw->iy(bez->iy()); beznw->tan1x(bez->tan1x()); beznw->tan1y(bez->tan1y()); beznw->tan2x(bez->tan2x()); beznw->tan2y(bez->tan2y()); beznw->ex(bez->ex()); beznw->ey(bez->ey()); beznw->cb(bez->cb()); beznw->cr(bez->cr()); beznw->cg(bez->cg()); beznw->xpivot(bez->xpivot()); beznw->ypivot(bez->ypivot()); beznw->angolorot(bez->angolorot()); beznw->spessore(bez->spessore()); beznw->dash(bez->dash()); beznw->punte(bez->punte()); tmp.aggiungi_procedura(beznw); break; } case PROC_BOX: { BoxProc* box=dynamic_cast((*prcin)); BoxProc* boxnw=new BoxProc(); boxnw->id( box->id() ); boxnw->ld_x(box->ld_x()); boxnw->ld_y(box->ld_y()); boxnw->ru_x(box->ru_x()); boxnw->ru_y(box->ru_y()); boxnw->cb(box->cb()); boxnw->cr(box->cr()); boxnw->cg(box->cg()); boxnw->xpivot(box->xpivot()); boxnw->ypivot(box->ypivot()); boxnw->angolorot(box->angolorot()); boxnw->spessore(box->spessore()); boxnw->dash(box->dash()); tmp.aggiungi_procedura(boxnw); break; } } prcin++; } } _gruppi.push_back(tmp); globgruppoiniz=_gruppi.begin(); globgruppofin=_gruppi.end(); sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); } }else{ globgruppoiniz++; } } } int immagine::create_empty_group(){ gruppo nuovo; int id_nuovo=0; if(_gruppi.size()>0){ id_nuovo=_gruppi.back().id_gruppo()+1; } nuovo.id_gruppo(id_nuovo); nuovo.tipo_gruppo(DEFAULT_TYPE_GROUP); _gruppi.push_back(nuovo); sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); return id_nuovo; } void immagine::aggiungi_gruppo(gruppo& added){ if(_gruppi.size()>0){ sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); added.id_gruppo((_gruppi.back().id())+1); _gruppi.push_back(added); sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); }else{ added.id_gruppo(0); _gruppi.push_back(added); } } void immagine::remove_gruppo_id(int gid){ if(_gruppi.size()>0){ std::vector::iterator b=first_gruppo(); std::vector::iterator e=end_gruppo(); while(b!=e){ if((*b).id()==gid){ _gruppi.erase(b); break; } b++; } std::sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); } } void immagine::crea_freccia_nuova(int dax, int day, int ax, int ay){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float arr_w=__pref.get_arr_w(); float arr_h=__pref.get_arr_h(); float arr_gap=__pref.get_arr_gap(); create_empty_group(); /* proc_arrow(int id,float posx, float posy, float eposx,float eposy, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt, int punte) */ proc_arrow* agg=new proc_arrow(0,descale(dax-dx_scroll), descale(day-dy_scroll), descale(ax-dx_scroll), descale(ay-dy_scroll), 0,0,0,0,0,0,2,0,ARR_ETEROL_PUNT, arr_w,arr_h,arr_gap); agg->aggiungi_genitore(&_gruppi.back()); _gruppi.back().aggiungi_procedura(agg); #ifdef DEBUG cout << "Dump proveniente da crea_freccia_nuova" << endl; dump_tmp_atom(); #endif } void immagine::crea_ellisse_nuova(int xc,int yc, int w, int h){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); // xc=descale(xc); //yc=descale(yc); create_empty_group(); /* proc_arc::proc_arc(int id, float xst, float yst, float xen, float yen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt) */ proc_arc* agg=new proc_arc(0, descale(xc-dx_scroll), descale(yc+h/2-dy_scroll), descale(xc+w-dx_scroll), descale(yc+h/2-dy_scroll), descale(xc-dx_scroll), descale(yc-dy_scroll), descale(xc+w-dx_scroll),descale(yc-dy_scroll), descale(xc-dx_scroll),descale(yc+h-dy_scroll), descale(xc+w-dx_scroll), descale(yc+h-dy_scroll), 0, 0, 0 , 0, 0, 0, 1, 0); agg->aggiungi_genitore(&_gruppi.back()); _gruppi.back().aggiungi_procedura(agg); #ifdef DEBUG cout << "Dump proveniente da crea_ellisse_nuova" << endl; dump_tmp_atom(); #endif } void immagine::crea_bezier_nuova(vector< pair > punti){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float arr_w=__pref.get_arr_w(); float arr_h=__pref.get_arr_h(); float arr_gap=__pref.get_arr_gap(); create_empty_group(); proc_bezier* agg=new proc_bezier(0, descale(punti[0].first-dx_scroll), descale(punti[0].second-dy_scroll), descale(punti[1].first-dx_scroll), descale(punti[1].second-dy_scroll), descale(punti[2].first-dx_scroll), descale(punti[2].second-dy_scroll), descale(punti[3].first-dx_scroll), descale(punti[3].second-dy_scroll), 0,0,0,0,0,0,1,0,ARR_NO_PUNT, arr_w,arr_h,arr_gap); agg->aggiungi_genitore(&_gruppi.back()); _gruppi.back().aggiungi_procedura(agg); } void immagine::create_new_box(int ld_x, int ld_y, int ru_x, int ru_y){ int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); create_empty_group(); /* BoxProc::BoxProc(int id,float ld_x, float ld_y, float ru_x, float ru_y, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int thick, int dash, box_type type){ */ BoxProc* agg=new BoxProc(0,descale(ld_x-dx_scroll), descale(ld_y-dy_scroll), descale(ru_x-dx_scroll), descale(ru_y-dy_scroll), 0,0,0, 0,0,0, 2,0,NORMAL); agg->aggiungi_genitore(&_gruppi.back()); _gruppi.back().aggiungi_procedura(agg); } atomo* immagine::crea_legame_nuovo(float x1,float y1,float x2, float y2, int tipo){ create_empty_group(); try{ _gruppi.back().genera_seme(x1, y1, x2, y2,tipo); #ifdef DEBUG cout << "Dump proveniente da crea_legame_nuovo" << endl; dump_tmp_atom(); #endif return &(*((_gruppi.back()).fin_atom()-1)); }catch (range_error e){ cerr << e.what() << endl; return 0; } } atomo* immagine::crea_legame_nuovo(atomo* gen, float x, float y, int tipo){ int gruppogen=gen->id_gruppo(); int genid=gen->id(); atomo nuovo; nuovo.pos_x(descale(x)); nuovo.pos_y(descale(y)); //id e' diverso da posizione nel vettore int gruppogen_pos=-1; for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()==gruppogen){ gruppogen_pos=i; break; } } //cout << "gruppogen_pos " << gruppogen_pos << "gruppogen "<< gruppogen<aggiungi(NO_ETIC, ET_STR); nuovo.aggiungi_legame(gen->id(),tipo,0,0,0); nuovo.costruisci_arrivati(); _gruppi[gruppogen_pos].add_atomo_id(nuovo); //il puntatore a gen non e' piu' valido da questo punto! atomo* nuovogen=ritorna_atomo_ident(gruppogen, genid); if(tipo==LEGAME_INTERNO || tipo== LEGAME_ESTERNO || tipo==LEGAME_INTERNO_OPP || tipo==LEGAME_ESTERNO_OPP){ tipo=-tipo; } nuovogen->aggiungi_legame((*(_gruppi[gruppogen_pos].fin_atom()-1)).id() ,tipo,0,0,0); nuovogen->costruisci_arrivati(); #ifdef DEBUG cout << "Dump proveniente da crea_legame_nuovo(atomo*, float x, float y, int tipo)" << endl; dump_tmp_atom(); #endif return &(*(_gruppi[gruppogen_pos].fin_atom()-1)); } void immagine::crea_legame_nuovo(atomo* st, atomo* arr, int tipo){ if(st->id_gruppo()==arr->id_gruppo()){ st->aggiungi_legame(arr->id(),tipo,0,0,0); st->costruisci_arrivati(); if(tipo==LEGAME_INTERNO || tipo== LEGAME_ESTERNO || tipo==LEGAME_INTERNO_OPP || tipo==LEGAME_ESTERNO_OPP){ tipo=-tipo; } arr->aggiungi_legame(st->id(),tipo,0,0,0); arr->costruisci_arrivati(); //cout << "crea_legame_nuovo non funzia!!!" << endl; }else{ //cout << "cerco di legare " << st->id() << " " << arr->id() << endl; //cout << "crea_legame_nuovo FUNZICA" << endl; //fare il join di due gruppi diversi int id_atom_arr_bk=arr->id(); int id_gruppo_st_bk=st->id_gruppo(); int id_atom_st_bk=st->id(); int pos_gruppo_st=0; int id_nuovo_arr=arr->id();; for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()==st->id_gruppo()){ pos_gruppo_st=i; break; } } //cout << "st " << st->id_gruppo() << " " << "arr " << arr->id_gruppo() << endl; int pos_gruppo_arr=0; for(unsigned int i=0;i<_gruppi.size();i++){ if(_gruppi[i].id()==arr->id_gruppo()){ pos_gruppo_arr=i; break; } } //id del piu' grande degli id del gruppo cui st appartiene int id_st_max=(*(_gruppi[pos_gruppo_st].fin_atom()-1)).id(); //cerchiamo se nel gruppo di arr esiste id_st_max bool exist_in_arr=false; vector::iterator inatm=_gruppi[pos_gruppo_arr].iniz_atom(); vector::iterator finatm=_gruppi[pos_gruppo_arr].fin_atom(); while(inatm!=finatm){ if((*inatm).id()==id_st_max){ exist_in_arr=true; //cout << "esiste " << (*inatm).id() << endl; /* if(id_atom_arr_bk!=(*inatm).id()){ id_nuovo_arr=arr->id(); cout << "non qua?" << endl; } */ break; } inatm++; } //cout << "id_nuovo_arr " << id_nuovo_arr << endl; if(exist_in_arr){ /* vector::iterator inatm=_gruppi[pos_gruppo_arr].iniz_atom(); vector::iterator finatm=_gruppi[pos_gruppo_arr].fin_atom(); while(inatm!=finatm){ if((*inatm).id()==id_st_max){ (*inatm).id(-1); } vector::iterator inleg=(*inatm).iniz_leg(); vector::iterator finleg=(*inatm).fin_leg(); while(inleg!=finleg){ if((*inleg).id_atomo()==id_st_max){ (*inleg).id_atomo(-1); } inleg++; } inatm++; } */ }else{ if(id_nuovo_arr==-1){ id_nuovo_arr=id_atom_arr_bk; } } id_st_max++; //cout << "id_st_max++=="<< id_st_max << endl; int id_legato=_gruppi[pos_gruppo_arr].rimappa_da(id_st_max,id_nuovo_arr); /* cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl; dump_tmp_atom(); cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl; cout << "id_legato " << id_legato << endl; */ vector::iterator inatm2=_gruppi[pos_gruppo_arr].iniz_atom(); vector::iterator finatm2=_gruppi[pos_gruppo_arr].fin_atom(); while(inatm2!=finatm2){ /* cout << "ppp aggiungi genitore " << &_gruppi[pos_gruppo_st] << " " << pos_gruppo_st << " id " << _gruppi[pos_gruppo_st].id_gruppo() <::iterator inproc=_gruppi[pos_gruppo_arr].iniz_procedure(); vector::iterator finproc=_gruppi[pos_gruppo_arr].fin_procedure(); while(inproc!=finproc){ _gruppi[pos_gruppo_st].aggiungi_procedura((*inproc)); inproc++; } ///////////////////////////////////// //cout << "st->id_gruppo() " << st->id_gruppo() << endl; vector::iterator ctgin=_gruppi.begin()+pos_gruppo_arr; _gruppi.erase(ctgin); //st non e' piu' valido for(unsigned int i=0;i<_gruppi.size();i++){ //cout << "ii" << i << endl; if(_gruppi[i].id()==id_gruppo_st_bk){ //cout << "esce " << endl; pos_gruppo_st=i; break; } } /* cout << "" << endl; cout << "PPPPP " << pos_gruppo_st << endl; // << " " << pos_gruppo_arr << endl; vector::iterator inatm4=_gruppi[pos_gruppo_st].iniz_atom(); vector::iterator finatm4=_gruppi[pos_gruppo_st].fin_atom(); cout << "dddddd " << finatm4 - inatm4 << endl; while(inatm4!=finatm4){ cout << "ii " << (*inatm4).id() << endl; inatm4++; } */ vector::iterator inatm4=_gruppi[pos_gruppo_st].iniz_atom(); vector::iterator finatm4=_gruppi[pos_gruppo_st].fin_atom(); atomo* nuovoarr=0; atomo* nuovost=0; while(inatm4!=finatm4){ //cout << "oo" << (*inatm4).id() << endl; if((*inatm4).id()==id_legato){ nuovoarr=&(*inatm4); } if((*inatm4).id()==id_atom_st_bk){ nuovost=&(*inatm4); } inatm4++; } //cout << "iiiii " << nuovoarr << endl; //cout << nuovost->id_gruppo() << "==" << nuovoarr->id_gruppo() << endl; crea_legame_nuovo(nuovost, nuovoarr, tipo); vector::iterator inatm3=_gruppi[pos_gruppo_st].iniz_atom(); vector::iterator finatm3=_gruppi[pos_gruppo_st].fin_atom(); while(inatm3!=finatm3){ (*inatm3).costruisci_arrivati(); inatm3++; } } sort(_gruppi.begin(),_gruppi.end(),ordina_gruppo_id); #ifdef DEBUG cout << "Dump proveniente da crea_legame_nuovo(atomo* st, atomo* arr,int tipo)" << endl; dump_tmp_atom(); #endif } void immagine::w_immagine(string path){ ofstream file_o(path.c_str()); if(!file_o){ fl_alert("Errore: il file %s non puo' essere scritto.",path.c_str()); }else{ for(unsigned int i=0;i<_gruppi.size();i++){ w_gruppo(i,file_o); } } for(unsigned int i=0;i<_stringhe.size();i++){ w_etichetta(_stringhe[i],file_o); file_o << std::endl; } file_o << std::endl; file_o.close(); } void immagine::w_gruppo(int pos,ofstream& out){ /* GRUPPO := "gruppo" ID_GRUPPO ":" "tipo_gruppo" TIPO_GRUPPO APRI ROT* ATOMO* PROCEDURA* CHIUDI */ /* ROT := APRI XPIVOT SEP YPIVOT SEP ANGOLOROT CHIUDI */ gruppo scriv=_gruppi[pos]; out << ETIC_GRUPPO << " " << scriv.id() << " " << DP << " " << ETIC_TIPO_GRUPPO << " " << scriv.tipo_gruppo() << APRI << endl << "\t" << ETIC_ROT << " " << APRI << scriv.xpivot() << SEP << scriv.xpivot() << SEP << scriv.angolorot() << CHIUDI << endl; vector::iterator inatm=scriv.iniz_atom(); vector::iterator finatm=scriv.fin_atom(); while(inatm!=finatm){ w_atomo(*inatm,out); inatm++; } vector::iterator inproc=scriv.iniz_procedure(); vector::iterator finproc=scriv.fin_procedure(); while(inproc!=finproc){ out << "\t"; switch((*inproc)->tipo()){ case PROC_ARC: /* PROCEDURA := 'ARC' APRI ID_PROC SEP XSTART SEP YSTART SEP XEND SEP YEND SEP X1 SEP Y1 SEP X2 SEP X2 SEP X3 SEP Y3 SEP X4 SEP Y4 SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH CHIUDI | */ { proc_arc* arc=dynamic_cast(*inproc); arc->write_native_format(out,"\t"); break; } case PROC_ARROW: /* 'ARROW' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE CHIUDI | */ { proc_arrow* arrow=dynamic_cast(*inproc); arrow->write_native_format(out,"\t"); break; } case PROC_BEZIER: /* 'BEZIER' APRI ID_PROC SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP POSX SEP POSY SEP COLORE SEP COLORE SEP COLORE SEP XPIVOT SEP YPIVOT SEP ANGOLOROT SEP SPESSORE SEP DASH SEP NUMPUNTE CHIUDI */ { proc_bezier* bez=dynamic_cast(*inproc); bez->write_native_format(out,"\t"); break; } case PROC_BOX: { BoxProc* boxp=dynamic_cast(*inproc); boxp->write_native_format(out,"\t"); } break; } inproc++; } //scrivere le procedure out << CHIUDI << endl; } void immagine::w_atomo(atomo& atm,ofstream& out){ /* "atomo" ID_ATOMO ":" "tipo_atomo" TIPO_ATOMO APRI "elemento" APRI ETICHETTA SEP CARICHE SEP POS_CARICHE SEP DOPPIETTI SEP EL_SPAIATI SEP MASSA SEP COLORE SEP COLORE SEP COLORE SEP POSX SEP POSY CHIUDI LISTA_DI_ADIACENZA CHIUDI */ out << "\t"; out << ETIC_ATOMO << " " << atm.id() << " " << DP << " " << ETIC_TIPO_ATOMO << " " << atm.tipo_atomo() << APRI << endl; out << "\t\t"; out << ETIC_ELEMENTO << " " << APRI << endl; etichetta sy=atm.etich(); out << "\t\t\t"; w_etichetta(sy,out); out << SEP << atm.cariche() << SEP << atm.position_charge() << SEP << atm.doppietti() << SEP << atm.el_spaiati() << SEP << atm.massa() << SEP << atm.cr() << SEP << atm.cg() << SEP << atm.cb() << SEP << atm.phys_pos_x() << SEP << atm.phys_pos_y() << endl; out << "\t\t" << CHIUDI << endl; /* LISTA_DI_ADIACENZA := "lista" APRI ( "legame" APRI ID_ATOMO SEP ID_LEGAME SEP TIPO_LEGAME SEP COLORE SEP COLORE SEP COLORE CHIUDI )? CHIUDI */ out << "\t\t" << ETIC_LISTA << " " << APRI << endl; vector::iterator leginiz=atm.primo_leg(); vector::iterator legfin=atm.ultimo_leg(); while(leginiz!=legfin){ out << "\t\t\t" << ETIC_LEGAME << APRI << (*leginiz).id_atomo() << SEP << (*leginiz).id_legame() << SEP << (*leginiz).tipo_legame() << SEP << (*leginiz).cr() << SEP << (*leginiz).cg() << SEP << (*leginiz).cb() << CHIUDI; out << endl; leginiz++; } out << "\t\t" << CHIUDI << endl; out << "\t" << CHIUDI << endl; } void immagine::w_etichetta(etichetta& sy,ofstream& out){ /* "etichetta" APRI VALORE SEP FONT SEP DIMENSIONE_FONT SEP POSX SEP POSY SEP CR SEP CG SEP CG SEP ALLINEAMENTO SEP VALIGN CHIUDI */ out << ETIC_ETIC << " " << APRI; vector < pair > coppie=sy.vec_str(); for(unsigned int i=0;i > coppie=sy->vec_str(); for(unsigned int i=0;ifont() << SEP << sy->phys_dim() << SEP << sy->phys_x() << SEP << sy->phys_y() << SEP << sy->cr() << SEP << sy->cg() << SEP << sy->cb() << SEP << sy->allineamento() << SEP << sy->v_offset() << CHIUDI; }else if(typeid(*sy)==typeid(multiline_label)){ w_multiline_label(dynamic_cast(sy),out); }else if(typeid(*sy)==typeid(paragraph_text)){ w_paragraph_text(dynamic_cast(sy),out); } } /* PARAGRAPH := "paragraph" APRI POSX SEP POSY SEP INTERLINE SEP LAYOUT SEP MULTIFONT_LABEL* CHIUDI */ void immagine::w_paragraph_text(paragraph_text* sy,ofstream& out){ std::vector lines=sy->get_lines_text(); out << ETIC_PARAGRAPH << APRI << std::endl; out << sy->phys_x() << SEP << sy->phys_y() << SEP << static_cast(rintf(sy->phys_interline_space())) << SEP << sy->layout_lines() << SEP << std::endl; for(unsigned i=0;i lines=sy->get_lines_text(); out << ETIC_MULTIFONT_LABEL << APRI << std::endl; out << sy->phys_x() << SEP << sy->phys_y() << SEP << static_cast(rintf(sy->phys_interline_space())) << SEP << std::endl; for(unsigned i=0;i lines=sy->get_lines_text(); out << ETIC_MULTILINE_LABEL << APRI << std::endl; out << sy->phys_x() << SEP << sy->phys_y() << SEP << static_cast(rintf(sy->phys_interline_space())) << SEP << sy->layout_lines() << SEP << std::endl; for(unsigned i=0;iset_modal(); _export_progressw_bar=new Fl_Progress(5,5,400,50); _export_progressw_bar->minimum(0); _export_progressw_bar->maximum(1); _export_progressw->add(_export_progressw_bar); _export_progressw->end(); //export_progressw->show(); } void immagine::clean_molecule_from_nullchars(){ string::size_type globpos=0; while(globpos < _molecule.size()){ string::size_type canc=_molecule.find_first_of(NULL_CHAR,globpos); if(canc!=string::npos){ char esc=' '; try{ esc=_molecule.at(canc-1); if(string(1,esc)!=string(ESCAPE_CHAR)){ globpos=canc; _molecule.erase(globpos,1); }else{ globpos+=2; } }catch (out_of_range e){ std::cerr << " exception " << e.what() << "carattere: " <<_molecule[ globpos] << std::endl; globpos=canc; _molecule.erase(globpos,1); } }else{ break; } } } /***********************************************************************************/ int appartiene_legame_prop(atomo* da , atomo* fino, void* data, void* data2 ,void* data3){ int* x_m=static_cast(data2); int* y_m=static_cast(data3); int* fatto=static_cast(data); int sensleg=__pref.get_sensib_leg(); if(*fatto) return -1; /* cout << "calcolo: " << da->id() << " " << fino->id() << " " << da->pos_x() << " " << da->pos_y() << " " << fino->pos_x() << " " << fino->pos_y() <<" " << *x_m << " " << *y_m ; */ if(line_belongs(*x_m, *y_m, static_cast(rintf(da->pos_x())), static_cast(rintf(da->pos_y())), static_cast(rintf(fino->pos_x())), static_cast(rintf(fino->pos_y())), sensleg)){ int x_a=static_cast(da->pos_x()<=fino->pos_x() ? da->pos_x() : fino->pos_x()); int y_a=static_cast(da->pos_y()<=fino->pos_y() ? da->pos_y() : fino->pos_y()); int x_max=static_cast(da->pos_x()>=fino->pos_x() ? da->pos_x() : fino->pos_x()); int y_max=static_cast(da->pos_y()>=fino->pos_y() ? da->pos_y() : fino->pos_y()); //cout << (*y_m >= y_a) << " " << (*y_m <= y_max) << endl; if((*x_m >= x_a && *x_m <= x_max) || (*y_m >= y_a && *y_m <= y_max) ){ std::vector propert; std::vector::iterator in=da->primo_leg(); std::vector::iterator fin=da->ultimo_leg(); int tipoprec=-100; while(in!=fin){ if((*in).id_atomo()==fino->id()){ propert=bond_win(in->tipo_legame()); if(propert[0]!=-1){ in->cr(static_cast(propert[0])); in->cg(static_cast(propert[1])); in->cb(static_cast(propert[2])); } if(propert[3]!=-1){ in->tipo_legame(static_cast(propert[3])); } tipoprec=in->tipo_legame(); break; } in++; } vector::iterator in2=fino->primo_leg(); vector::iterator fin2=fino->ultimo_leg(); while(in2!=fin2){ if((*in2).id_atomo()==da->id()){ if(propert[0]!=-1){ in2->cr(static_cast(propert[0])); in2->cg(static_cast(propert[1])); in2->cb(static_cast(propert[2])); } if(propert[3]!=-1){ if(tipoprec==LEGAME_INTERNO || tipoprec==LEGAME_INTERNO_OPP || tipoprec==LEGAME_ESTERNO || tipoprec==LEGAME_ESTERNO_OPP){ in2->tipo_legame(-tipoprec); }else{ in2->tipo_legame(static_cast(propert[3])); } } *fatto=1; break; } in2++; } //now scaling double scaling_value=propert[4]; if(!similar_to(scaling_value,1.,0.01)){ float displx=fino->pos_x() - da->pos_x(); float disply=fino->pos_y() - da->pos_y(); float dx=-displx + displx * scaling_value; float dy=-disply + disply * scaling_value; gruppo* the_group=dynamic_cast(da->ritorna_genitore()); trasl_subgroup_as_subtree(the_group, da, fino, dx, dy); } } } return 0; } int appartiene_legame(atomo* da , atomo* fino, void* data, void* data2 ,void* data3){ int* x_m=static_cast(data2); int* y_m=static_cast(data3); immagine* evet=static_cast(data); int sensleg=__pref.get_sensib_leg(); if(line_belongs(*x_m, *y_m, static_cast(rintf(da->pos_x())), static_cast(rintf(da->pos_y())), static_cast(rintf(fino->pos_x())), static_cast(rintf(fino->pos_y())), sensleg)){ gruppo* par=dynamic_cast(da->ritorna_genitore()); float x_lu=da->pos_x(); float y_lu=da->pos_y(); etichetta lb_da=da->etich(); par->allinea_etichetta(lb_da,*da); if(true || (lb_da.vec_str())[0].first!=string(NO_ETIC)){ par->clip_leg(lb_da.x(), lb_da.y(), lb_da.w(), lb_da.h(), *da , *fino, x_lu, y_lu); } float x_rb=fino->pos_x(); float y_rb=fino->pos_y(); etichetta lb_fino=fino->etich(); par->allinea_etichetta(lb_fino,*fino); if(true || (lb_fino.vec_str())[0].first!=string(NO_ETIC)){ par->clip_leg(lb_fino.x(), lb_fino.y(), lb_fino.w(), lb_fino.h(), *fino , *da, x_rb, y_rb); } x_lu=static_cast(x_lu(y_lu>y_rb ? y_lu : y_rb); x_rb=static_cast(x_lu>x_rb ? x_lu : x_rb); y_rb=static_cast(y_lu(y_lu,y_lu,1)){ more_sens_y=__pref.get_sensib_leg(); } if((*x_m >= static_cast(x_lu - more_sens_x ) && *x_m <= static_cast(x_rb + more_sens_x )) && (*y_m <= static_cast(y_lu + more_sens_y ) && *y_m >= static_cast(y_rb - more_sens_y)) ){ vector::iterator in=da->primo_leg(); vector::iterator fin=da->ultimo_leg(); while(in!=fin){ if((*in).id_atomo()==fino->id()){ evet->aggiungi_legami_selected(da->id_gruppo(),da->id(),(*in).id_legame()); break; } in++; } //int* valori2=new int[3]; vector::iterator in2=fino->primo_leg(); vector::iterator fin2=fino->ultimo_leg(); while(in2!=fin2){ if((*in2).id_atomo()==da->id()){ //cout << "@#@#" << da->id() << " " << (*in2).id_atomo()<aggiungi_legami_selected(fino->id_gruppo(),fino->id(),(*in2).id_legame()); break; } in2++; } } } return 0; } int appartiene_legame_bb(atomo* da , atomo* fino, void* data, void* data2 ,void* data3){ int* x_m=static_cast(data2); //x,y int* y_m=static_cast(data3); //w,h immagine* evet=static_cast(data); int xcent=static_cast(da->pos_x()+((fino->pos_x()-da->pos_x())/2)); int ycent=static_cast(da->pos_y()+((fino->pos_y()-da->pos_y())/2)); if(xcent>x_m[0] && xcentx_m[1] && ycent::iterator in=da->primo_leg(); vector::iterator fin=da->ultimo_leg(); // cout << "@#@#" << da->id() << " " << (*in).id_legame()<id()){ evet->aggiungi_legami_selected(da->id_gruppo(),da->id(),(*in).id_legame()); break; } in++; } } return 0; } int quale_gruppo(atomo* da , atomo* fino, void* data, void* data2 ,void* data3){ int* x_m=static_cast(data2); int* y_m=static_cast(data3); int* gruppo=static_cast(data); if( line_belongs(*x_m, *y_m, da->pos_x(), da->pos_y(), fino->pos_x(), fino->pos_y(), 5)){ *gruppo=da->id_gruppo(); } return 0; } void trasl_subgroup_as_subtree(gruppo* the_group, atomo* root, atomo* start, float dx, float dy){ stack the_stack; vector seen; the_stack.push(start); while(the_stack.size()>0){ atomo* upper=the_stack.top(); the_stack.pop(); if(root->id()!=upper->id()){ bool e_visto=false; for(unsigned int i=0;iid()){ e_visto=true; break; } } if(!e_visto){ upper->trasla(dx,dy); vector::iterator primo=upper->primo_leg(); vector::iterator ultimo=upper->ultimo_leg(); while(primo!=ultimo){ the_stack.push((the_group->find_atomo_id((*primo).id_atomo()))); primo++; } } seen.push_back(upper->id()); } } } int glue_find_first_near(atomo* from , atomo* to, void* dist, void* atom_other, void* res){ float* tol_dist=static_cast(dist); atomo* check_atom=static_cast(atom_other); std::pair* results=static_cast*>(res); std::pair a(from->pos_x(),from->pos_y()); std::pair b(check_atom->pos_x(),check_atom->pos_y()); std::pair dff= bidimensional_vector::diff(a,b); float magnitude=bidimensional_vector::magn(dff); if(magnitude < *tol_dist){ results->first=true; results->second=from->id(); } return 1; } /** *\param res_sel_ std::vector< std::pair< std::pair, std::pair > > */ int glue_find_line_near_sel(atomo* from , atomo* to, void* res, void* d, void* d1){ float m=0; float q=0; std::vector< std::pair< std::pair, std::pair > >* results= static_cast, std::pair > >*>(res); bool eqn_res=rett_eqn(from->pos_x(), from->pos_y(), to->pos_x(), to->pos_y(), m, q); if(!eqn_res){ q=from->pos_x(); m=INFINITY; } std::pair atm(from,to); std::pair mq(m,q); std::pair< std::pair, std::pair > r(atm,mq); results->push_back(r); return 1; } /** *\param res_sel_ std::vector< std::pair< std::pair, std::pair > > *\param res std::vector where res_sel[res[0]] are pointers to atom in selected group for bond * and res[1] , res[2] are id of atoms in the other group */ int glue_find_line_near_hook(atomo* from , atomo* to, void* res_sel, void* res, void* found){ float m=0; float q=0; bool* is_found=static_cast(found); if(!(*is_found)){ std::vector< std::pair< std::pair, std::pair > >* sel= static_cast, std::pair > >*>(res_sel); std::vector* res_v=static_cast*>(res); for(unsigned int i=0;isize();i++){ bool eqn_res=rett_eqn(from->pos_x(), from->pos_y(), to->pos_x(), to->pos_y(), m, q); if(!eqn_res){ q=from->pos_x(); m=INFINITY; } std::pair sel_mq=(*sel)[i].second; float sel_m=sel_mq.first; float sel_q=sel_mq.second; atomo* selected_1=(*sel)[i].first.first; atomo* selected_2=(*sel)[i].first.second; std::pair sel1_v(selected_1->pos_x(),selected_1->pos_y()); std::pair sel2_v(selected_2->pos_x(),selected_2->pos_y()); if(similar_to(m,sel_m,10)){ if(similar_to(q,sel_q,1) && similar_to((from)->pos_y(),(to)->pos_y(),1)){ if(((selected_1)->pos_x() >= std::min((from)->pos_x(),(to)->pos_x()) && (selected_1)->pos_x() <= std::max((from)->pos_x(),(to)->pos_x())) || ((selected_2)->pos_x() >= std::min((from)->pos_x(),(to)->pos_x()) && (selected_2)->pos_x() <= std::max((from)->pos_x(),(to)->pos_x()))){ res_v->push_back(i); res_v->push_back(from->id()); res_v->push_back(to->id()); *is_found=true; break; } }else if(similar_to(q,sel_q,1) && similar_to((from)->pos_x(),(to)->pos_x(),1)){ if(((selected_1)->pos_y() >= std::min((from)->pos_y(),(to)->pos_y()) && (selected_1)->pos_y() <= std::max((from)->pos_y(),(to)->pos_y())) || ((selected_2)->pos_y() >= std::min((from)->pos_y(),(to)->pos_y()) && (selected_2)->pos_y() <= std::max((from)->pos_y(),(to)->pos_y()))){ res_v->push_back(i); res_v->push_back(from->id()); res_v->push_back(to->id()); *is_found=true; break; } }else if(similar_to(q,sel_q,100)){ if(((selected_1)->pos_x() <= std::max((from)->pos_x(),(to)->pos_x()) && (selected_1)->pos_x() >= std::min((from)->pos_x(),(to)->pos_x()) && (selected_1)->pos_y() <= std::max((from)->pos_y(),(to)->pos_y()) && (selected_1)->pos_y() >= std::min((from)->pos_y(),(to)->pos_y())) || ((selected_2)->pos_x() <= std::max((from)->pos_x(),(to)->pos_x()) && (selected_2)->pos_x() >= std::min((from)->pos_x(),(to)->pos_x()) && (selected_2)->pos_y() <= std::max((from)->pos_y(),(to)->pos_y()) && (selected_2)->pos_y() >= std::min((from)->pos_y(),(to)->pos_y()))){ res_v->push_back(i); res_v->push_back(from->id()); res_v->push_back(to->id()); *is_found=true; break; } } } } } return 1; } void export_image_to_vector_file(immagine imm,std::string output_file, bool graphics){ int can_write=1; struct stat dummy; int res_stat=stat(output_file.c_str(),&dummy); if(res_stat==0){ can_write=0; if(graphics){ can_write=ask_overwrite_file(output_file); }else{ can_write=ask_overwrite_file_console(output_file); } }else if(errno==ENOENT){ can_write=1; }else{ if(graphics){ fl_message("%s",strerror(errno)); }else{ perror(NULL); } } if(can_write){ string filename=output_file; string format=filename.substr(filename.rfind(".")+1); if(format_supported(format)){ if(format==EXPORT_FORMAT_PS){ export_image_to_EPS_file_cairo(imm,output_file); }else if(format==EXPORT_FORMAT_SVG){ export_image_to_SVG_file_cairo(imm,output_file); }else if(format==EXPORT_FORMAT_PNG){ export_image_to_PNG_file_cairo(imm,output_file); } }else{ export_image_to_EPS_file_cairo(imm,output_file); } } } void export_image_to_EPS_file_cairo(immagine imm,std::string output_file){ std::vector x; std::vector y; x.push_back(0); y.push_back(0); for(int i=0;iphys_x()+et->phys_w()); y.push_back(et->phys_y()+et->phys_h()); } pair ld; pair ru; calc_bb_gen(x,y,ld,ru); float wb=ru.first-ld.first + __pref.get_width_single_bond() * 2; float hb=ru.second-ld.second + __pref.get_width_single_bond() * 2; //std::cerr << wb << " " << hb << std::endl; cairo_surface_t *surface=cairo_ps_surface_create(output_file.c_str(),wb,hb); setlocale (LC_ALL, "C"); cairo_ps_surface_set_eps(surface,TRUE); cairo_t* cr=cairo_t_singleton::get_context(surface); cairo_set_source_rgba(cr, 0, 0, 0, 1.0); cairo_set_line_width (cr, __pref.get_width_single_bond()); cairo_move_to(cr,0,0); cairo_translate(cr, __pref.get_width_single_bond(), __pref.get_width_single_bond()); imm.disegna(); cairo_stroke(cr); cairo_show_page(cr); cairo_surface_destroy(surface); cairo_t_singleton::destroy(); setlocale (LC_ALL, ""); } void export_image_to_SVG_file_cairo(immagine imm,std::string output_file){ std::vector x; std::vector y; //x.push_back(0); //y.push_back(0); for(int i=0;iphys_x()); y.push_back(et->phys_y()); x.push_back(et->phys_x()+et->phys_w()); y.push_back(et->phys_y()+et->phys_h()); } pair ld; pair ru; calc_bb_gen(x,y,ld,ru); float wb=ru.first-ld.first + __pref.get_width_single_bond()*2; float hb=ru.second-ld.second + __pref.get_width_single_bond()*2; std::cerr << wb << " " << hb << std::endl; cairo_surface_t *surface=cairo_svg_surface_create(output_file.c_str(),wb,hb); setlocale (LC_ALL, "C"); cairo_t* cr=cairo_t_singleton::get_context(surface); cairo_set_source_rgba(cr, 0, 0, 0, 1.0); cairo_set_line_width (cr, __pref.get_width_single_bond()); cairo_move_to(cr,0,0); cairo_translate(cr, -ld.first+__pref.get_width_single_bond(), -ld.second+__pref.get_width_single_bond()); cairo_save(cr); imm.disegna(); cairo_stroke(cr); cairo_show_page(cr); cairo_surface_destroy(surface); cairo_t_singleton::destroy(); setlocale (LC_ALL, ""); } void export_image_to_PNG_file_cairo(immagine imm,std::string output_file){ std::vector x; std::vector y; x.push_back(0); y.push_back(0); for(int i=0;iphys_x()+et->phys_w()); y.push_back(et->phys_y()+et->phys_h()); } pair ld; pair ru; calc_bb_gen(x,y,ld,ru); float wb=ru.first-ld.first+ __pref.get_width_single_bond()*2; float hb=ru.second-ld.second + __pref.get_width_single_bond()*2; cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, wb, hb); x.erase(x.begin(),x.end()); y.erase(y.begin(),y.end()); for(int i=0;iphys_x()); y.push_back(et->phys_y()); x.push_back(et->phys_x()+et->phys_w()); y.push_back(et->phys_y()+et->phys_h()); } pair ld_min; pair ru_min; calc_bb_gen(x,y,ld_min,ru_min); float wb_min=ru_min.first-ld_min.first + __pref.get_width_single_bond()*2; float hb_min=ru_min.second-ld_min.second + __pref.get_width_single_bond()*2; cairo_t* cr=cairo_t_singleton::get_context(surface); cairo_set_source_rgba(cr, 0, 0, 0, 1.0); cairo_set_line_width (cr, __pref.get_width_single_bond()); cairo_move_to(cr,0,0); cairo_translate(cr, __pref.get_width_single_bond(), __pref.get_width_single_bond()); cairo_save(cr); imm.disegna(); cairo_show_page(cr); cairo_surface_t* surfacedest = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, wb_min + RAGGIO_EL *2, hb_min + RAGGIO_EL *2); cairo_t* context_dest=cairo_create(surfacedest); cairo_set_source_surface (context_dest, surface, RAGGIO_EL-ld_min.first, RAGGIO_EL-ld_min.second); cairo_rectangle (context_dest,RAGGIO_EL,RAGGIO_EL, wb, hb); cairo_set_operator (context_dest, CAIRO_OPERATOR_SOURCE); cairo_fill (context_dest); cairo_stroke(context_dest); cairo_show_page(context_dest); cairo_surface_write_to_png(surfacedest, output_file.c_str()); cairo_surface_destroy(surface); cairo_t_singleton::destroy(); cairo_surface_destroy(surfacedest); cairo_destroy(context_dest); } void immagine::aabb_elem_selected(pair& ld, pair& ru){ std::vector x; std::vector y; for(unsigned int i=0;i<_elem_selected.size();i++){ switch(_elem_selected[i].first){ case ATOMO: { gruppo* grp=find_group_id((_elem_selected[i].second).first); atomo* start=grp->find_atomo_id((_elem_selected[i].second).second); x.push_back(start->pos_x()); y.push_back(start->pos_y()); } break; case ETICHETTA: { etichetta* laet=ritorna_etich_pointer((_elem_selected[i].second).second); x.push_back(laet->x()); y.push_back(laet->y()); } break; case PROC_ARC: case PROC_ARROW: case PROC_BEZIER: case PROC_BOX: { gruppo* the_grp=find_group_id((_elem_selected[i].second).first); procedura* proc=the_grp->find_proc_id((_elem_selected[i].second).second); x.push_back(proc->posx()); y.push_back(proc->posy()); } break; } } calc_bb_gen(x, y, ld, ru); } bist-0.5.2/src/atom_prop.cpp0000644000175000017500000005377211653002572014351 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //da levare e mettere in editor extern finestra_pr* MainWindow; Fl_Pixmap image_lb_subs(lb_subs_xpm); Fl_Pixmap image_lb_supers(lb_supers_xpm); Fl_Pixmap image_lb_select_font_color(lb_select_font_color_xpm); Fl_Pixmap image_lb_color_atom(lb_color_atom_xpm); Fl_Pixmap image_lb_normal_str_atom(lb_normal_str_xpm); Fl_Pixmap image_lb_align(lb_align_xpm); void atom_prop_ok_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atomo* atom=static_cast(d); atom_prop* propr=dynamic_cast(w->parent()); Fl_Input* valor= dynamic_cast(propr->child(12)); int caric=strtol(valor->value(),NULL,0); Fl_Round_Button* piu=dynamic_cast(dynamic_cast(propr->child(11))->child(0)); if(!piu->value()){ caric=-caric; } Fl_Round_Button* ch_pos_l_t=dynamic_cast(dynamic_cast(propr->child(13))->child(0)); Fl_Round_Button* ch_pos_r_t=dynamic_cast(dynamic_cast(propr->child(13))->child(1)); Fl_Round_Button* ch_pos_r_b=dynamic_cast(dynamic_cast(propr->child(13))->child(2)); if(ch_pos_l_t->value()){ atom->position_charge(L_TOP); }else if(ch_pos_r_t->value()){ atom->position_charge(R_TOP); }else if(ch_pos_r_b->value()){ atom->position_charge(R_BOTTOM); }else{ atom->position_charge(L_BOTTOM); } Fl_Input* lone_p=dynamic_cast(propr->child(14)); Fl_Input* lone_unp=dynamic_cast(propr->child(15)); int lone_p_int=strtol(lone_p->value(),NULL,0); int lone_unp_int=strtol(lone_unp->value(),NULL,0); etichetta* et=atom->etich_punt(); Fl_Choice* dimensioni=dynamic_cast(propr->child(3)); Fl_Choice* i_font=dynamic_cast(propr->child(2)); int font_ch=i_font->value(); et->font(font_ch); et->dim(strtol(dimensioni->mvalue()->text,NULL,0) ); atom->doppietti(lone_p_int); atom->el_spaiati(lone_unp_int); atom->cariche(caric); if(propr->_r!=-1){ et->cr(propr->_r); et->cg(propr->_g); et->cb(propr->_b); } if(propr->_ra!=-1){ atom->cr(propr->_ra); atom->cg(propr->_ga); atom->cb(propr->_ba); } string prs_stringa; for(unsigned int i=0;ivec_str().size();i++){ prs_stringa +=((et->vec_str())[i]).first; } Fl_Check_Button* parse=dynamic_cast(propr->child(8)); if(parse->value()){ /***per provare*******************/ parse_residue parse(prs_stringa); if(!parse.has_error()){ gruppo pp=parse.return_fragment(); cout << "DIFF" << pp.fin_atom() - pp.iniz_atom() << endl; vector::iterator inatm3=pp.iniz_atom(); vector::iterator finatm3=pp.fin_atom(); while(inatm3!=finatm3){ (*inatm3).costruisci_arrivati(); inatm3++; } int id_atomo_frag_iniz=atom->id(); int id_atomo_frag_iniz_next=(atom->iniz_leg())->id_atomo(); int id_group_frag_iniz=atom->id_gruppo(); immagine* la_imm=ed->ritorna_immagine(); /*AGGIUNGIAMO, da questo momento i puntatori non sono piu' validi*/ la_imm->aggiungi_gruppo(pp); gruppo& last=la_imm->ritorna_ultimo_gruppo(); //atomo legato a dummy atomo* fst_of_fragment=last.find_atomo_id(1); //atomo dummy atomo* dummy=last.find_atomo_id(0); //gruppo con l'atomo da espandere gruppo* frag_iniz=la_imm->find_group_id(id_group_frag_iniz); //atomo da espandere atom=frag_iniz->find_atomo_id(id_atomo_frag_iniz); //atomo legato a quello da espandere atomo* next=frag_iniz->find_atomo_id(id_atomo_frag_iniz_next); //calcoliamo l'angolo che forma il legame tra l'atomo che andra' //espanso e un suo primo vicino //posiizioni frammento espanso float posx_a=fst_of_fragment->pos_x()-dummy->pos_x(); float posy_a=fst_of_fragment->pos_y()-dummy->pos_y();; //angolo in radianti del legame dummy--primo del frammento float angle_a=atan2f(posy_a,posx_a); //facciamo lo stesso con il legame puntodiespansione--un primo vicino float posx_b=next->pos_x() - atom->pos_x(); float posy_b=next->pos_y() - atom->pos_y(); float angle_b=atan2f(posy_b,posx_b); //calcoliamo la differenza, si fa cosi oppure per forza col prodotto //vettoriale? float delta_ang=angle_b-angle_a; last.ruota(-delta_ang, fst_of_fragment->phys_pos_x(), fst_of_fragment->phys_pos_y()); last.ruota(M_PI, dummy->phys_pos_x(), dummy->phys_pos_y()); last.trasla(atom->pos_x() - fst_of_fragment->pos_x(), atom->pos_y() - fst_of_fragment->pos_y()); //eliminiamo "atom" frag_iniz->purge_atom(id_atomo_frag_iniz); //puntatori non piu' validi next=frag_iniz->find_atomo_id(id_atomo_frag_iniz_next); //creiamo il nuovo legame la_imm->crea_legame_nuovo(next,fst_of_fragment,LEGAME_SINGOLO); //ora si tratta di eliminare "dummy" //cout << "*************************************************" << endl; #ifdef DEBUG la_imm->dump_tmp_atom(); #endif gruppo* dummyelim=la_imm->find_group_id(id_group_frag_iniz); inatm3=dummyelim->iniz_atom(); finatm3=dummyelim->fin_atom(); while(inatm3!=finatm3){ if(((*inatm3).etich()).to_raw_string()=="dummy"){ int id_dummynw=(*inatm3).id(); dummyelim->purge_atom(id_dummynw); break; } inatm3++; } } }// END: if(parse->value()) ed->redraw(); } void atom_prop_charge_sing_el(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atomo* atom=static_cast(d); atom_prop* propr=dynamic_cast(w->parent()); Fl_Input* lone_unp=dynamic_cast(propr->child(15)); int lone_unp_int=strtol(lone_unp->value(),NULL,0); atom->el_spaiati(lone_unp_int); ed->redraw(); } void atom_prop_charge_pair_el(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atomo* atom=static_cast(d); atom_prop* propr=dynamic_cast(w->parent()); Fl_Input* lone_p=dynamic_cast(propr->child(14)); int lone_p_int=strtol(lone_p->value(),NULL,0); atom->doppietti(lone_p_int); ed->redraw(); } void atom_prop_charge_pos_cb(Fl_Widget* w, void* d){ atom_prop_charge_cb(w->parent(),d); } void atom_prop_charge_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atomo* atom=static_cast(d); atom_prop* propr=dynamic_cast(w->parent()); Fl_Input* valor= dynamic_cast(propr->child(12)); int caric=strtol(valor->value(),NULL,0); Fl_Round_Button* piu=dynamic_cast(dynamic_cast(propr->child(11))->child(0)); if(!piu->value()){ caric=-caric; } Fl_Round_Button* ch_pos_l_t=dynamic_cast(dynamic_cast(propr->child(13))->child(0)); Fl_Round_Button* ch_pos_r_t=dynamic_cast(dynamic_cast(propr->child(13))->child(1)); Fl_Round_Button* ch_pos_r_b=dynamic_cast(dynamic_cast(propr->child(13))->child(2)); if(ch_pos_l_t->value()){ atom->position_charge(L_TOP); }else if(ch_pos_r_t->value()){ atom->position_charge(R_TOP); }else if(ch_pos_r_b->value()){ atom->position_charge(R_BOTTOM); }else{ atom->position_charge(L_BOTTOM); } atom->cariche(caric); ed->redraw(); } void atom_prop_select_current_font_dimension(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atomo* atom=static_cast(d); etichetta* et=atom->etich_punt(); atom_prop* propr=dynamic_cast(w->parent()); Fl_Choice* dimensioni=dynamic_cast(propr->child(3)); et->dim(strtol(dimensioni->mvalue()->text,NULL,0) ); ed->redraw(); } void atom_prop_select_current_font(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atomo* atom=static_cast(d); etichetta* et=atom->etich_punt(); atom_prop* propr=dynamic_cast(w->parent()); Fl_Choice* i_font=dynamic_cast(propr->child(2)); int font_ch=i_font->value(); et->font(font_ch); ed->redraw(); } void atom_prop_select_valign_atom_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atom_prop* propr=dynamic_cast(w->parent()); Fl_Counter* count=dynamic_cast(w); (propr->_atom->etich_punt())->v_offset(static_cast(count->value())); ed->redraw(); } void atom_prop_select_align_atom_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); atom_prop* propr=dynamic_cast(w->parent()); if(propr!=NULL){ int nwpropr=(propr->_align + 1)%3; propr->_align=nwpropr; (propr->_atom->etich_punt())->allineamento(propr->_align); } ed->redraw(); } void atom_prop_cancel_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void atom_prop_select_atom_color_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); atom_prop* propr=dynamic_cast(w->parent()); if(pushd){ propr->_ra=r; propr->_ga=g; propr->_ba=b; atomo* atom=static_cast(d); atom->cr(propr->_ra); atom->cg(propr->_ga); atom->cb(propr->_ba); } ed->redraw(); } void atom_prop_select_string_color_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); atom_prop* propr=dynamic_cast(w->parent()); if(pushd){ propr->_r=r; propr->_g=g; propr->_b=b; atomo* atom=static_cast(d); etichetta* et=atom->etich_punt(); et->cr(r); et->cg(g); et->cb(b); } ed->redraw(); } Fl_Menu_Item voci_font_dim_atom[NUM_FONT_DIM]; Fl_Menu_Item a_voci_font_face[] = { {"helvetica", 0, 0, 0,}, {"helvetica bold", 0, 0, 0,}, {"helvetica italic", 0, 0, 0,}, {"helvetica bold italic", 0, 0, 0,}, {"courier", 0, 0, 0,}, {"courier bold", 0, 0, 0,}, {"courier italic", 0, 0, 0,}, {"courier bold italic", 0, 0, 0,}, {"times", 0, 0, 0,}, {"times bold", 0, 0, 0,}, {"times italic", 0, 0, 0,}, {"times bold italic", 0, 0, 0,}, {"symbol", 0, 0, 0,}, {"screen", 0, 0, 0,}, {"screen bold", 0, 0, 0,}, {"zapf dingbats", 0, 0, 0,}, {0} }; bool atom_prop::check_if_type_etic(int typ){ etichetta* etic=_atom->etich_punt(); vector < pair > stringhe=etic->vec_str(); pair pt= stringhe.back(); if(pt.second==typ){ return true; }else{ return false; } return true; } bool atom_prop::check_if_type_etic(int typ,int pos) throw (out_of_range){ etichetta* etic=_atom->etich_punt(); vector < pair > stringhe=etic->vec_str(); if(etic->vec_str().size()< static_cast(pos)){ pos=0; } if(pos >=0){ vector < pair >::iterator it= stringhe.begin(); pair pt= *(it+pos); if(pt.second==typ){ return true; }else{ return false; } }else{ string exc=_("error where < _vec_str.size() in class etichetta."); throw out_of_range(exc); } } int atom_prop::handle(int e){ Fl_Window::handle(e); editor* editor_pr=dynamic_cast(MainWindow); switch(e){ case FL_FOCUS: return 0; case FL_KEYDOWN: { Fl_Button* apic=dynamic_cast(child(5)); Fl_Button* pedic=dynamic_cast(child(6)); etichetta* etic=_atom->etich_punt(); string car; if(Fl::event_state(FL_SHIFT)){ car=toupper(Fl::event_text()[0]); }else{ car=Fl::event_text()[0]; } if( !isalpha(car[0]) && !ispunct(car[0]) && !isdigit(car[0]) && !isblank(car[0]) && car[0]!='\b'){ return 0; } if(car=="\b"){//cancellare l'ultimo int misur=etic->size_str()-1; vector < pair > stringhe=etic->vec_str(); vector < pair >::iterator it= stringhe.begin() + misur; pair pt= *(it); int tipo=pt.second; if(pt.first.length()==1){ if(stringhe.size()>1){ etic->elimina(misur); if(apic->value()){ _apici=""; }else if(pedic->value()){ _pedici=""; } }else{ etic->sostituisci(NO_ETIC,ET_STR,misur); stringhe=etic->vec_str(); } }else{ string nuova=(pt.first).substr(0,pt.first.length()-1); etic->sostituisci(nuova,tipo,misur); if(apic->value()){ _apici=nuova; }else if(pedic->value()){ _pedici=nuova; } } }else{ if(apic->value()){//dovremmo aggiungere un apice if(check_if_type_etic(ET_APICE)){ //l'ultimo e' un apice _apici+=car; etic->sostituisci(_apici,ET_APICE , etic->size_str()-1); }else if(check_if_type_etic(ET_STR)){//l'ultimo e' una stringa _apici+=car; etic->aggiungi(_apici,ET_APICE); }else{ //l'ultimo e' un pedice try{ if(check_if_type_etic(ET_STR,etic->size_str()-2)){ //il precedente e' una stringa cout << "PEDICI" << endl; _apici=car; etic->aggiungi(_apici,ET_APICE); }else{ //il precedente non puo' che essere un apice _apici+=car; etic->sostituisci(_apici,ET_APICE , etic->size_str()-2); } }catch(out_of_range e){ cout << "Eccezione: " << e.what() << endl; } } }else if(pedic->value()){//dovremmo aggiungere un pedice if(check_if_type_etic(ET_PEDICE)){ _pedici+=car; etic->sostituisci(_pedici,ET_PEDICE , etic->size_str()-1); }else if(check_if_type_etic(ET_STR)){//l'ultimo e' una stringa _pedici+=car; etic->aggiungi(_pedici,ET_PEDICE); }else{//l'ultimo e' un apice if(check_if_type_etic(ET_STR,etic->size_str()-2)){ //il precedente e' una stringa _pedici=car; etic->aggiungi(_pedici,ET_PEDICE); }else{ //il precedente non puo' che essere un pedice _pedici+=car; etic->sostituisci(_pedici,ET_PEDICE , etic->size_str()-2); } } }else{ _apici=""; _pedici=""; if((*(etic->vec_str().begin())).first==NO_ETIC || (*(etic->vec_str().begin())).first==ETIC_IDR_UP){ etic->sostituisci(car,ET_STR , etic->size_str()-1); }else{ etic->aggiungi(car,ET_STR); } } } editor_pr->redraw(); return 1; } default: return 0; } return 0; } atom_prop::atom_prop(atomo* at) :Fl_Window(600, 290,_("Atom Properties")), _atom(at), _r(-1), _g(-1), _b(-1), _ra(-1), _ga(-1), _ba(-1), _align((_atom->etich()).allineamento()) { { Fl_Box* o = new Fl_Box(10, 25, w()-10, 115, _("String")); //0 o->box(FL_ENGRAVED_BOX); o->align(FL_ALIGN_TOP_LEFT); } { Fl_Button* o = new Fl_Button(155, 65, 30, 30); //1 o->image(image_lb_select_font_color); o->align(FL_ALIGN_CLIP); o->callback(atom_prop_select_string_color_cb,_atom); } { Fl_Choice* o = new Fl_Choice(65, 33, 129, 22, _("Face:")); //2 o->down_box(FL_BORDER_BOX); o->menu(a_voci_font_face); o->callback(atom_prop_select_current_font,_atom); } { Fl_Choice* p = new Fl_Choice(w()-10-115, 33, 115, 22, _("Dimension:")); //3 p->down_box(FL_BORDER_BOX); for(int i=0;imenu(voci_font_dim_atom); p->value(8); p->callback(atom_prop_select_current_font_dimension,_atom); } { Fl_Button* o = new Fl_Button(125, 65, 30, 30); //4 o->image(image_lb_color_atom); o->callback(atom_prop_select_atom_color_cb,_atom); } { Fl_Button* o = new Fl_Button(185, 65, 30, 30); //5 o->image(image_lb_supers); o->type(FL_RADIO_BUTTON); } { Fl_Button* o = new Fl_Button(215, 65, 30, 30);//6 o->image(image_lb_subs); o->type(FL_RADIO_BUTTON); } { Fl_Button* o = new Fl_Button(245, 65, 30, 30);//7 o->image(image_lb_normal_str_atom); o->type(FL_RADIO_BUTTON); } { Fl_Check_Button* o= new Fl_Check_Button(20,97, 129,22, _("Parse string"));//8 o->value(0); } { Fl_Counter* o=new Fl_Counter(w()-10-132,97 , 129, 22, _("Vertical align")); // 9!! o->type(FL_SIMPLE_COUNTER); o->step(1.0); o->bounds(-5,5); o->value(at->etich().v_offset()); o->callback(atom_prop_select_valign_atom_cb); } { Fl_Box* o = new Fl_Box(10, 155, w()-10, 75, _("Electrons and other"));//10 o->box(FL_ENGRAVED_BOX); o->align(FL_ALIGN_TOP_LEFT); } ostringstream carichestr; bool piumen=true; carichestr << _atom->cariche(); string num=carichestr.str(); if (num[0]=='-'){ piumen=false; num=carichestr.str().substr(1); } { Fl_Group* o = new Fl_Group(20, 180, 55, 60, _("Charge"));//11 o->align(FL_ALIGN_TOP_LEFT); { Fl_Round_Button* o = new Fl_Round_Button(30, 180, 50, 20, "+");//0 o->type(FL_RADIO_BUTTON); o->down_box(FL_ROUND_DOWN_BOX); if(piumen) o->set(); } { Fl_Round_Button* o = new Fl_Round_Button(30, 205, 50, 20, "-");//1 o->type(FL_RADIO_BUTTON); o->down_box(FL_ROUND_DOWN_BOX); if(!piumen) o->set(); } o->end(); } { Fl_Input* o = new Fl_Input(60, 192, 85, 25); //cariche n12 o->type(2); o->value(num.c_str()); o->when(FL_WHEN_CHANGED); o->callback(atom_prop_charge_cb,_atom); } //charge position { /* 0 1 +------------------+ | | | | | | 3+------------------+2 */ int pos=at->position_charge(); int w_chg_pos=85; int h_chg_pos=125; int x_chg_pos=155; int w_button=20; int h_button=20; int x_button_left=x_chg_pos + w_chg_pos/2 - w_button; int y_button_left=180; Fl_Group* o = new Fl_Group(x_chg_pos, 180, w_chg_pos, h_chg_pos, _("Charge position"));//12 o->align(FL_ALIGN_CENTER | FL_ALIGN_TOP); { Fl_Round_Button* o = new Fl_Round_Button(x_button_left, y_button_left, w_button,h_button);//0 o->type(FL_RADIO_BUTTON); o->down_box(FL_ROUND_DOWN_BOX); if(pos==L_TOP){ o->setonly(); } o->callback(atom_prop_charge_pos_cb,_atom); } { Fl_Round_Button* o = new Fl_Round_Button(x_button_left+w_button, y_button_left, w_button,h_button);//1 o->type(FL_RADIO_BUTTON); o->down_box(FL_ROUND_DOWN_BOX); if(pos==R_TOP){ o->setonly(); } o->callback(atom_prop_charge_pos_cb,_atom); } { Fl_Round_Button* o = new Fl_Round_Button(x_button_left+w_button, y_button_left+w_button, w_button,h_button);//2 o->type(FL_RADIO_BUTTON); o->down_box(FL_ROUND_DOWN_BOX); if(pos==R_BOTTOM){ o->setonly(); } o->callback(atom_prop_charge_pos_cb,_atom); } { Fl_Round_Button* o = new Fl_Round_Button(x_button_left, y_button_left+w_button, w_button,h_button);//3 o->type(FL_RADIO_BUTTON); o->down_box(FL_ROUND_DOWN_BOX); if(pos==L_BOTTOM){ o->setonly(); } o->callback(atom_prop_charge_pos_cb,_atom); } o->end(); } { Fl_Input* o = new Fl_Input(w()-10-55, 195, 55, 25, _("Lone pair:"));//14 o->type(2); ostringstream ostr; ostr << _atom->doppietti(); o->value(ostr.str().c_str()); o->when(FL_WHEN_CHANGED); o->callback(atom_prop_charge_pair_el,_atom); } { Fl_Input* o = new Fl_Input(w()-10-55, 166, 55, 25, _("Lone unpair:"));//15 o->type(2); ostringstream ostr; ostr << _atom->el_spaiati(); o->value(ostr.str().c_str()); o->when(FL_WHEN_CHANGED); o->callback(atom_prop_charge_sing_el,_atom); } { Fl_Button* o = new Fl_Button(w()/2-LARG_BUTTON_DEFAULT*3.0, 240, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Close"));//16 o->callback(atom_prop_cancel_cb); } { Fl_Return_Button* o = new Fl_Return_Button(w()/2, 240, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Apply"));//17 o->callback(atom_prop_ok_cb,_atom); } { Fl_Button* o = new Fl_Button(275, 65, 30, 30);//18 o->image(image_lb_align); o->callback(atom_prop_select_align_atom_cb); } end(); set_modal(); dialog_position(this); } atom_prop::~atom_prop(){ } void atom_win(atomo* at){ atom_prop p(at); p.show(); while(p.shown()){ Fl::wait(); } } bist-0.5.2/src/parse_residual.cpp0000644000175000017500000010257311523577203015351 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; parse_residue::parse_residue(string res) :_res(res), _pt_res(0), _length_leg(static_cast(__pref.getBond_fixedlength())), _stop(false), _pivot_unknown(false), _has_error(false) { create_starter(); chain(); } bool parse_residue::has_error(){ return _has_error; } void parse_residue::dump(){ /***********************************/ cout << "parse: GRUPPI:" << endl; vector::iterator st=_fragments.top().iniz_atom(); vector::iterator en=_fragments.top().fin_atom(); cout << "parse: ID: " << (_fragments.top()).id_gruppo() << endl; cout << "parse: ANGOLOROT: " << (_fragments.top()).angolorot() << endl; cout << "parse: ROT_XPIVOT: " << (_fragments.top()).xpivot() << endl; cout << "parse: ROT_YPIVOT: " << (_fragments.top()).ypivot() << endl; while(st!=en){ cout << (*st).id() << endl; st++; } vector::iterator iniz=(_fragments.top()).iniz_atom(); vector::iterator fin=(_fragments.top()).fin_atom(); while(iniz!=fin){ etichetta tmp_et=(*iniz).etich(); vector < pair > tmp_str_et=tmp_et.vec_str(); cout << "parse: Atomo:" << (*iniz).id() << " " << endl; cout << "parse: attach: " << (*iniz).can_attach() << endl; cout << "parse: Tipo:"<< (*iniz).tipo_atomo() << endl; cout << "parse: ***etichetta:" << endl; for(unsigned int i2=0;i2::iterator inizl=(*iniz).primo_leg(); vector::iterator finl=(*iniz).ultimo_leg(); while(inizl!=finl){ cout << "parse: \tid_atomo: " << (*inizl).id_atomo() << endl; cout << "parse: \tid_legame: " << (*inizl).id_legame() << endl; cout << "parse: \ttipo_legame " << (*inizl).tipo_legame() << endl; cout << "parse: \tcr " << (*inizl).cr() << endl; cout << "parse: \tcg " << (*inizl).cg() << endl; cout << "parse: \tcb " << (*inizl).cb() << endl; inizl++; } cout << "parse: *** fine legami ***" << endl; iniz++; } } gruppo parse_residue::return_fragment() { return _fragments.top(); } parse_residue::~parse_residue(){ } atomo* parse_residue::search_for_attach(gruppo* the_mol){ vector::iterator inatom=the_mol->iniz_atom(); vector::iterator finatom=the_mol->fin_atom(); while(inatom!=finatom){ if((*inatom).can_attach()){ return &(*inatom); } inatom++; } return 0; } string parse_residue::etich_sticky_atom(gruppo* mol){ atomo* atm=search_for_attach(mol); etichetta et=atm->etich(); string prs_stringa; for(unsigned int i=0;iaggiungi(et, ET_STR); tmp.costruisci_arrivati(); mol->add_atomo_id(tmp); }else{ //cout << "parse :: cerco attach" << to_attach << " " << to_attach->id() << endl; atomo tmp; tmp.aggiungi_genitore(mol); tmp.etich_punt()->aggiungi(et, ET_STR); tmp.costruisci_arrivati(); tmp.pos_x(-1); tmp.pos_y(-1); int id_ul=mol->add_atomo_id(tmp); // aggiungi_legame(int nw_leg_id_atomo, // int nw_leg_tipo_legame,int nwcr, // int nwcg , int nwcb) to_attach=search_for_attach(mol); atomo* attached=mol->find_atomo_id(id_ul); to_attach->aggiungi_legame(attached->id(),tipo,0,0,0); attached->aggiungi_legame(to_attach->id(),tipo,0,0,0); if(new_sticky){ search_for_attach(mol)->can_attach(false); attached->can_attach(true); } } } void parse_residue::chain(){ // while(!_stop){ frammento(); //} /* cout << "PARSING TERMINATO" << endl; cout << "_res " << _res << " _res.size() " << _res.size() << " _pt_res " << _pt_res << endl; */ if(!has_error()){ atomo* not_to_attach; if((not_to_attach=search_for_attach(&_fragments.top()))!=0){ not_to_attach->can_attach(false); } atomo* dum=_fragments.top().find_atomo_id(0); vector::iterator primo=dum->primo_leg(); atomo* primo_carb=_fragments.top().find_atomo_id((*primo).id_atomo()); float xcomp=_length_leg*cos(_angle_exa); float ycomp=_length_leg*sin(_angle_exa); primo_carb->pos_x(xcomp); primo_carb->pos_y(ycomp); /*cout << "primo_carb " << primo_carb->id() << " " << primo_carb->pos_x() << " " << primo_carb->pos_y() << endl; */ //dump(); int leafs=0; _fragments.top().cancel_visitato_all(); no_of_leaf(_fragments.top(), *(_fragments.top().iniz_atom()), leafs); leafs--; //cout << "foglie: " << leafs << endl; _fragments.top().cancel_visitato_all(); (*(_fragments.top().iniz_atom())).visitato(true); clean(_fragments.top(),*(_fragments.top().iniz_atom()+1)); _fragments.top().cancel_visitato_all(); float distmax=_length_leg*leafs; int level=0; int xst=90; clean_as_tree(_fragments.top(), *(_fragments.top().iniz_atom()+1), distmax, level, xst); } } void parse_residue::create_aa_bb(gruppo grp, int st, int child, res_aa_bb& res){ cout << "clean_as_tree: create aa_bb " << st << " " << child << endl; cout << "clean_as_tree:\t parto da: " << endl << "clean_as_tree:\t aa_b rx " << res.r_x << endl << "clean_as_tree:\t aa_b ry " << res.r_y << endl << "clean_as_tree:\t aa_b sx " << res.s_x << endl << "clean_as_tree:\t aa_b sy " << res.s_y << endl; atomo* par=grp.find_atomo_id(st); par->visitato(true); atomo* chld=grp.find_atomo_id(child); chld->visitato(true); cout << "clean_as_tree: inserisco chld: " << chld->id() << endl; if(chld->phys_pos_x() < res.s_x){ res.s_x=chld->phys_pos_x(); } if (chld->phys_pos_x() > res.r_x){ res.r_x=chld->phys_pos_x(); } if(chld->phys_pos_y() < res.r_y){ res.r_y=chld->phys_pos_y(); } if (chld->phys_pos_y() > res.s_y){ res.s_y=chld->phys_pos_y(); } vector::iterator primo=chld->primo_leg(); vector::iterator ultimo=chld->ultimo_leg(); while(primo != ultimo){ atomo* legato=grp.find_atomo_id((*primo).id_atomo()); if(! legato->visitato()){ //ampliamo eventualmente la aa_bb cout << "clean_as_tree: legato posx " << legato->phys_pos_x() << "posy: " << legato->phys_pos_y() << "id" << legato->id()<< endl; if(legato->phys_pos_x() < res.s_x){ cout <<"clean_as_tree: sx " << res.s_x << " -> " << legato->phys_pos_x() << endl; res.s_x=legato->phys_pos_x(); }else if (legato->phys_pos_x() > res.r_x){ cout <<"clean_as_tree: rx " << res.r_x << " -> " << legato->phys_pos_x() << endl; res.r_x=legato->phys_pos_x(); } if(legato->phys_pos_y() < res.r_y){ cout <<"clean_as_tree: ry " << res.r_y << " -> " << legato->phys_pos_y() << endl; res.r_y=legato->phys_pos_y(); }else if (legato->phys_pos_y() > res.s_y){ cout <<"clean_as_tree: sy " << res.s_y << " -> " << legato->phys_pos_y() << endl; res.s_y=legato->phys_pos_y(); } //ricorsione create_aa_bb(grp,st,legato->id(),res); }else{ cout << "attenzione " << (*primo).id_atomo() << "gia' visitato" << endl; } primo++; } } void parse_residue::frammento(){ pivot(); figlio(); if(!_stop){ frammento(); } } void parse_residue::pivot(){ try{ string tmp; tmp+=_res.at(_pt_res); if(tmp==carb){ _pivot_unknown=false; _the_pivot=carb; add_atoms(&_fragments.top(),NO_ETIC,LEGAME_SINGOLO, true); //cout << "pivot : " << _the_pivot << endl; _pt_res++; //AVANZIAMO di UNO }else if(tmp==oxyg){ _pivot_unknown=false; _the_pivot=oxyg; add_atoms(&_fragments.top(),oxyg,LEGAME_SINGOLO, true); //cout << "pivot : " << _the_pivot << endl; _pt_res++; //AVANZIAMO di UNO }else if (tmp==sulf){ _pivot_unknown=false; _the_pivot=sulf; add_atoms(&_fragments.top(),sulf,LEGAME_SINGOLO, true); //cout << "pivot : " << _the_pivot << endl; _pt_res++; //AVANZIAMO di UNO }else if (tmp==nytr){ _pivot_unknown=false; _the_pivot=nytr; add_atoms(&_fragments.top(),nytr,LEGAME_SINGOLO, true); //cout << "pivot : " << _the_pivot << endl; _pt_res++; //AVANZIAMO di UNO }else{ //cout << "pivot sconosciuto: " << _res.at(_pt_res) << endl; _pivot_unknown=true; //_stop=true; //errore } }catch(std::out_of_range exc){ _stop=true; //stringa finita } } void parse_residue::figlio(){ try{ string tmp; tmp+=_res.at(_pt_res); if(tmp==hidr){ //atomo e' idrogeno //cout << "\tatomo " << hidr ; unsigned int preso=1; _pt_res++; //AVANZIAMO di UNO number(preso); if(preso==0) preso++; //niente numero //cout << " preso: " << preso << " volta/e" << endl; if(_the_pivot!=carb){ for(unsigned int i=0;ican_attach(false); } if(_res.at(_pt_res)!=par_c[0]){ _stop=true; }else{ //cout << "parentesi chiusa:" << endl; _pt_res++; //AVANZIAMO di UNO unsigned int preso=1; number(preso); if(preso==0) preso++; cout << "\t branch preso " << preso << " volta/e" << endl; //qua si deve recuperare la testa della pila e appiccicarla al //suo successivo MIZZICA... gruppo the_branch=_fragments.top(); _fragments.pop(); //lo eliminiamo the_branch.elimina_atomo(0); //eliminiamo il dummy del gruppo di //arrivo atomo* hole=the_branch.find_atomo_id(1); // atomo id 1 atomo* hook=search_for_attach(&_fragments.top()); //atomo che //aggancia //ora eliminiamo i legami di hole che referenziano il dummy //estinto hole->elimina_legame(0); assert(hook); for(unsigned int i=0;i3){ //orrenda patch!!! //cout << "RES >3" << std::endl; res=3; } return true; } void parse_residue::create_starter(){ gruppo starter; atomo tmp; tmp.can_attach(true); tmp.aggiungi_genitore(&starter); tmp.etich_punt()->aggiungi("dummy", ET_STR); tmp.costruisci_arrivati(); tmp.visitato(true); starter.add_atomo_id(tmp); _fragments.push(starter); } void parse_residue::transl_branch(gruppo& group,atomo* start, atomo* parent, float dx, float dy){ stack the_st; vector visited; the_st.push(start); visited.push_back(parent->id()); while(the_st.size()>0){ atomo* cima=the_st.top(); the_st.pop(); //cout << "trsl: estratto " << cima->id()<::iterator exist_it=find(visited.begin(), visited.end(), cima->id()); if(exist_it==visited.end()){ //non e' stato visitato vector::iterator primo=cima->primo_leg(); vector::iterator ultimo=cima->ultimo_leg(); //cout << ultimo -primo << " "<< endl; /* if((*primo).id_atomo()!=parent->id()){ group.find_atomo_id((*primo).id_atomo())->trasla(dx,dy); cout << "trsl: traslato " << (*primo).id_atomo() << "" "startid" << " " <id() <id() << "visitato" << endl; } //cout << "--------------" << endl; if(exist_it==visited.end()){ cima->trasla(dx,dy); //cout << "trsl: traslato " << cima->id() << endl; } visited.push_back(cima->id()); } } bool parse_residue::aa_bb_intersects(gruppo& grp, atomo start){ vector the_bb; vector::iterator primo=start.primo_leg(); vector::iterator ultimo=start.ultimo_leg(); cout << "clean_as_tree: controllo le aa_bb di " << start.id() << endl; while(primo!=ultimo){ gruppo nuovo_g=grp; nuovo_g.cancel_visitato_all(); atomo *son=nuovo_g.find_atomo_id( (*primo).id_atomo() ); cout << "clean_as_tree: figlio id " << (*primo).id_atomo() << " " << son->id() << endl; res_aa_bb a_aa_bb; a_aa_bb.r_x=-1E10; a_aa_bb.r_y=1E10; a_aa_bb.s_x=1E10; a_aa_bb.s_y=-1E10; if(son->id()>start.id()){ cout << "clean_as_tree: lato "<< start.id() << " " << son->id() << endl; create_aa_bb(nuovo_g, start.id(), son->id(), a_aa_bb); } the_bb.push_back(a_aa_bb); cout << "clean_as_tree: fin aa_b rx " << a_aa_bb.r_x << endl << "clean_as_tree: fin aa_b ry " << a_aa_bb.r_y << endl << "clean_as_tree: fin aa_b sx " << a_aa_bb.s_x << endl << "clean_as_tree: fin aa_b sy " << a_aa_bb.s_y << endl; primo++; } bool intersect=true; for(unsigned int i=0;i the_bb[i2].r_x ){ intersect=false; cout << "clean_as_tree: non si intersecano " << "the_bb[i].s_x > the_bb[i2].r_x " << the_bb[i].s_x << " " << the_bb[i2].r_x << endl; }else if(the_bb[i].r_y > the_bb[i2].s_y){ intersect=false; cout << "clean_as_tree: non si intersecano " << "the_bb[i].r_y > the_bb[i2].s_y " << the_bb[i].r_y << " " << the_bb[i2].s_y << endl; }else if(the_bb[i].s_y < the_bb[i2].r_y){ cout << "clean_as_tree: non si intersecano " << "the_bb[i].s_y < the_bb[i2].r_y " << the_bb[i].s_y << " " << the_bb[i2].r_y << endl; intersect=false; }else{ cout << "clean_as_tree: si intersecano!" << endl; return true; //break; } } } } return intersect; } void parse_residue::clean_as_tree(gruppo& group, atomo& start, float distmax, int level, int xst){ //static bool un_stop=false; cout << "clean_as_tree: inizio: " << "start id: " << start.id() << endl; start.visitato(true); vector::iterator primo=start.primo_leg(); vector::iterator ultimo=start.ultimo_leg(); int numleg=ultimo-primo -1; cout << "clean_as_tree: numleg=" << numleg <visitato()){ cout << "clean_as_tree: " << "scendo in " << son->id() << " da " << start.id() <::iterator primo_s=start.primo_leg(); vector::iterator ultimo_s=start.ultimo_leg(); cout << "clean_as_tree numleg son: " << ultimo_s - primo_s << endl; while(primo_s!=ultimo_s){ atomo *son=group.find_atomo_id( (*primo_s).id_atomo() ); float dx=(son->phys_pos_x() - start.phys_pos_x())*0.5; float dy=(son->phys_pos_y() - start.phys_pos_y())*0.5; cout << "clean_as_tree traslo " << son->id() << " figlio di " << start.id() << "di " << dx << " e " << dy << endl; transl_branch(group,son,&start,dx,dy); //un_stop=true; primo_s++; } //shdst=true; } } /* cout << "tree: iniz " << " level " << level << " id start" << " " << start.id() << "visitato " << start.visitato() <::iterator primo=start.primo_leg(); vector::iterator ultimo=start.ultimo_leg(); int numleg=ultimo-primo; cout << "numleg " << numleg << endl; if(!start.visitato()){ vector the_bb; while(primo!=ultimo){ gruppo nuovo_g=group; nuovo_g.cancel_visitato_all(); atomo *son=nuovo_g.find_atomo_id( (*primo).id_atomo() ); res_aa_bb a_aa_bb; a_aa_bb.r_x=-1E10; a_aa_bb.r_y=1E10; a_aa_bb.s_x=1E10; a_aa_bb.s_y=-1E10; if(son->id()>0){ cout << "WW" << endl; create_aa_bb(nuovo_g, start.id(), son->id(), a_aa_bb); } the_bb.push_back(a_aa_bb); cout << "aa_b rx " << a_aa_bb.r_x << endl << "aa_b ry " << a_aa_bb.r_y << endl << "aa_b sx " << a_aa_bb.s_x << endl << "aa_b sy " << a_aa_bb.s_y << endl; primo++; } bool intersect=true; bool real_clean=true; for(unsigned int i=0;i the_bb[i2].r_x ){ intersect=false; }else if(the_bb[i].r_y > the_bb[i2].s_y){ intersect=false; }else if(the_bb[i].s_y < the_bb[i2].r_y){ intersect=false; }else{ intersect=true; } } } } if(!intersect){ cout << "do not intersect!" << endl; return; }else if(the_bb.size() > 1){ cout << "intersect!" << endl; }else{ cout << "do not intersect! again ;-)" << endl; real_clean=false; } primo=start.primo_leg(); ultimo=start.ultimo_leg(); start.visitato(true); if(numleg>=2){ numleg--; }else if(level==0){ numleg=1; }else{ cout << "uscito"<< endl; return; } cout << "tree: " << " id: " << start.id() << " numleg " << numleg << endl; float inc=0; if(numleg==1){ inc=0; }else{ inc=distmax/(numleg -1); } float ystart=start.pos_y(); if(numleg==2 || numleg ==3){ ystart-= distmax/2; } while(primo!=ultimo){ int legato=(*primo).id_atomo(); vector::iterator inatom=group.iniz_atom(); vector::iterator finatom=group.fin_atom(); while(inatom!=finatom){ //cout << "cerco: " << (*inatom).id() << " " << legato << endl; if((*inatom).id()==legato && !(*inatom).visitato()){ if(real_clean){ float old_posx=(*inatom).pos_x(); float old_posy=(*inatom).pos_y(); (*inatom).pos_y(ystart); (*inatom).pos_x(xst*(level+1)); vector::iterator primo_tr=(*inatom).primo_leg(); vector::iterator ultimo_tr=(*inatom).ultimo_leg(); while(primo_tr!=ultimo_tr){ if((*primo_tr).id_atomo()!= (*inatom).id() && (*primo_tr).id_atomo() !=start.id()){ cout << "trsl: transl_branch!" << " " << level << "startid " << (*primo_tr).id_atomo() << "parent " << group.find_atomo_id((*inatom).id())->id() < angl; vector::iterator primo=start.primo_leg(); vector::iterator ultimo=start.ultimo_leg(); int numleg=ultimo-primo; //cout << "numleg: " << numleg << endl; if(numleg==2){ angl=trova_pos_libere(group,start,2); }else if(numleg==3){ angl=trova_pos_libere(group,start,3); }else { //cout << "OK" << endl; angl=trova_pos_libere(group,start,4); } while(primo!=ultimo){ int legato=(*primo).id_atomo(); vector::iterator inatom=group.iniz_atom(); vector::iterator finatom=group.fin_atom(); while(inatom!=finatom){ if((*inatom).id()==legato){ if(!(*inatom).visitato()){ //ripulisci //cout << "ripulisci: " << angl[0] << endl; (*inatom).pos_x(start.phys_pos_x()+_length_leg*cos(angl[0])); (*inatom).pos_y(start.phys_pos_y()+_length_leg*sin(angl[0])); angl.erase(angl.begin()); clean(group,(*inatom)); } } inatom++; } primo++; } } } vector trova_pos_libere(gruppo& grp, atomo& atm, int numleg){ /* cout << "scansione atomo->id " << atm.id()<< " " << atm.pos_x() << " " << atm.pos_y() << endl; */ static float length_leg=static_cast(__pref.getBond_fixedlength()); static const float angle_exa=.523598775598298873078; //troviamo i legami //cerchiamo la posizione del legame precedente float res_angl=0; bool stop_search=false; atomo* res_atm=0; for(float i=0;i<=2*M_PI;i+=angle_exa){ if(stop_search) break; //float tmp_x=length_leg*cos(i);// + atm.pos_x(); //float tmp_y=length_leg*sin(i);// + atm.phys_pos_y(); vector:: iterator legin=atm.iniz_leg(); vector:: iterator legfin=atm.fin_leg(); cout << "i: " << i << endl; while(legin!=legfin){ //cout << "cerco atomo: " << (*legin).id_atomo() << endl; atomo* q=grp.find_atomo_id((*legin).id_atomo()); float angle_ref=atan2f(q->phys_pos_y() - atm.phys_pos_y(), q->phys_pos_x() - atm.phys_pos_x()); if(angle_ref<0){ // cout << "angle_ref < 0" << angle_ref << "->" << angle_ref+=2*M_PI; } /* cout << static_cast(rintf(q->pos_x())) <<" -> " << q->pos_x() << " " << " " << static_cast(rintf(q->pos_y())) << "-> " << q->pos_y() << " " <(rintf(tmp_x)) << "->" << tmp_x << " " << static_cast(rintf(tmp_y)) << "->" << tmp_y <visitato() && check_if_inside_arc(angle_ref,i,0.34)){ //cout << "trovato!!" << endl; res_angl=i/angle_exa; res_atm=q; stop_search=true; break; }else{ if(!q->visitato()){ /* cout << "atomo id(" << q->id() <<") non visitato, scarto..." << endl; */ } } legin++; } } vector result; /* cout << "res_angl " << res_angl << " " << static_cast(rintf(res_angl)) << endl; */ switch(static_cast(rintf(res_angl))){ case 0: place_bonds(result,*res_atm, length_leg, 0,numleg ,angle_exa); break; case 2: place_bonds(result,*res_atm, length_leg, angle_exa*2,numleg ,angle_exa); break; case 7: place_bonds(result,*res_atm, length_leg, angle_exa*7,numleg ,angle_exa); break; case 11: place_bonds(result,*res_atm, length_leg, angle_exa*11,numleg ,angle_exa); break; case 5: place_bonds(result,*res_atm, length_leg, angle_exa*5,numleg ,angle_exa); break; case 1: place_bonds(result,*res_atm, length_leg, angle_exa,numleg ,angle_exa); break; case 9: place_bonds(result,*res_atm, length_leg, angle_exa*9,numleg ,angle_exa); break; case 3: place_bonds(result,*res_atm, length_leg, angle_exa*3,numleg ,angle_exa); break; case 4: place_bonds(result,*res_atm, length_leg, angle_exa*4,numleg ,angle_exa); break; case 10: place_bonds(result,*res_atm, length_leg, angle_exa*10,numleg ,angle_exa); break; case 8: place_bonds(result,*res_atm, length_leg, angle_exa*8,numleg ,angle_exa); break; case 6: place_bonds(result,*res_atm, length_leg, angle_exa*6,numleg ,angle_exa); break; } // cout << "risultati scanning " << result[0] << endl; return result; } bool check_if_inside_arc(float angle_ref, float angle_probe, float tolerance){ if(angle_probe <=angle_ref+tolerance && angle_probe >=angle_ref-tolerance){ return true; }else{ return false; } } void place_bonds(vector& result, atomo atm,float length_leg, float start_angle,int numleg ,float step){ float f=start_angle + step * 4; float f2=start_angle + step * 8; if(numleg==3){ result.push_back(f); result.push_back(f2); }else if(numleg==2){ float dist_a= sqrt( pow(atm.phys_pos_x() + length_leg * cos(f) ,2) + pow(atm.phys_pos_y() + length_leg * sin(f),2)); float dist_b= sqrt( pow(atm.phys_pos_x() + length_leg * cos(f2) ,2) + pow(atm.phys_pos_y() + length_leg * sin(f2),2)); if(dist_a>dist_b){ result.push_back(f); }else{ result.push_back(f2); } }else if(numleg==4){ result.push_back(start_angle + step * 3); result.push_back(start_angle + step * 6); result.push_back(start_angle + step * 9); } } void no_of_leaf(gruppo& grp, atomo& start , int& res){ //cout << "noleaf visitato" << start.visitato() << endl; if(!start.visitato()){ start.visitato(true); vector::iterator primo=start.primo_leg(); vector::iterator ultimo=start.ultimo_leg(); int numleg=ultimo-primo; //cout << "numleg: " << numleg << endl; if(numleg==1){ res++; } while(primo!=ultimo){ int legato=(*primo).id_atomo(); vector::iterator inatom=grp.iniz_atom(); vector::iterator finatom=grp.fin_atom(); while(inatom!=finatom){ if((*inatom).id()==legato){ if(!(*inatom).visitato()){ no_of_leaf(grp, (*inatom) , res); } } inatom++; } primo++; } } } const string parse_residue::par_a="("; const string parse_residue::par_c=")"; const string parse_residue::carb="C"; const string parse_residue::oxyg="O"; const string parse_residue::sulf="S"; const string parse_residue::nytr="N"; const string parse_residue::db_o="=O"; const string parse_residue::hidr="H"; const string parse_residue::clor="Cl"; const string parse_residue::iodine="I"; const string parse_residue::bromine="Br"; const string parse_residue::fluorine="F"; const float parse_residue::_angle_exa=.523598775598298873078; bist-0.5.2/src/pref_dialog.cpp0000644000175000017500000003102111653002572014603 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; void pref_reset_to_default_cb(Fl_Widget* w, void* d){ __pref.Defaults(); __pref.SavePrefs(); pref_dialog* pref=dynamic_cast(w->parent()); pref->hide(); } void pref_canc_cb(Fl_Widget* w, void* d){ pref_dialog* pref=dynamic_cast(w->parent()); pref->hide(); } void pref_write_conf_cb(Fl_Widget* w, void* d){ setlocale (LC_ALL, "C"); pref_dialog* pref=dynamic_cast(w->parent()); __pref.setPageWidth(static_cast(strtol(pref->_page_w.value(),NULL,0))); __pref.setPageHeight(static_cast(strtol(pref->_page_h.value(),NULL,0))); __pref.setGridSpacing(static_cast(strtol(pref->grsp.value(),NULL,0))); __pref.setBond_fixedlength(strtof(pref->bdl.value(),NULL)); __pref.setBond_fixedangle(deg2rad(strtof(pref->bda.value(),NULL))); __pref.set_sensib_leg(static_cast(strtol(pref->sens.value(),NULL,0))); __pref.set_arr_w(strtof(pref->arw.value(),NULL)); __pref.set_arr_h(strtof(pref->arh.value(),NULL)); __pref.set_arr_gap(strtof(pref->argap.value(),NULL)); __pref.setDoubleBondOffset(strtof(pref->dbs.value(),NULL)); __pref.set_tratteggio_legame(static_cast(strtol(pref->bndd.value(),NULL,0))); __pref.set_larg_max_cuneo(strtof(pref->lmaxc.value(),NULL)); __pref.set_multiple_bond_gap(strtof(pref->mbg.value(),NULL)); __pref.set_frequenza_stereo_scon(strtof(pref->freq.value(),NULL)); __pref.set_ampiezza_stereo_scon(strtof(pref->amp.value(),NULL)); __pref.set_num_barrette_stereo_down(static_cast(strtol(pref->numb.value(),NULL,0))); if(pref->o.value()){ __pref.setDrawGrid(1); }else{ __pref.setDrawGrid(0); } if(pref->_show_splash.value()){ __pref.setSplash(true); }else{ __pref.setSplash(false); } if(pref->quantize_pos.value()){ __pref.setMagnetic_point_gap(static_cast(strtol(pref->grsp.value(),NULL,0))); }else{ __pref.setMagnetic_point_gap(0); } __pref.set_sans_font(pref->sans_font.value()); __pref.set_mono_font(pref->mono_font.value()); __pref.set_serif_font(pref->serif_font.value()); __pref.set_sans_font_italic(pref->sans_font_italic.value()); __pref.set_mono_font_italic(pref->mono_font_italic.value()); __pref.set_serif_font_italic(pref->serif_font_italic.value()); __pref.set_sans_font_bold(pref->sans_font_bold.value()); __pref.set_mono_font_bold(pref->mono_font_bold.value()); __pref.set_serif_font_bold(pref->serif_font_bold.value()); __pref.set_sans_font_bold_italic(pref->sans_font_bold_italic.value()); __pref.set_mono_font_bold_italic(pref->mono_font_bold_italic.value()); __pref.set_serif_font_bold_italic(pref->serif_font_bold_italic.value()); __pref.set_symbol_font(pref->symbol_font.value()); __pref.set_dingbats_font(pref->dingbats_font.value()); __pref.SavePrefs(); pref->hide(); editor* ed=dynamic_cast(MainWindow); ed->canvas_resize(static_cast(strtol(pref->_page_w.value(),NULL,0)), static_cast(strtol(pref->_page_h.value(),NULL,0))); ed->redraw(); setlocale (LC_ALL, ""); } pref_dialog::pref_dialog() :Fl_Double_Window(750, 280, _("Set Preferences...")), ui_tab(0, 0, 750, 240), g1(0, 25, 620, 240, _("UI")), grsp(190, 30, 40, 25, _("Grid space:")), sens(190, 60, 40, 25, _("Click zone:")), _page_w(190, 90, 40, 25, _("Page width:")), _page_h(190, 120, 40, 25, _("Page height:")), _show_splash(5, 150, 90, 25, _("Show splashpage")), o(5, 177, 90, 25, _("Show grid")), quantize_pos(5, 202, 90, 25, _("\"Magnetic\" grid")), g2(0, 25, 740, 210, _("Bond")), bdl (190, 43, 30, 25, _("Bond length:")), bda (190, 71, 30, 25, _("Bond angle:")), arw (190, 101, 30, 25, _("Arrow width:")), arh (190, 130, 30, 25, _("Arrow height:")), argap(190, 158, 30, 25, _("Arrow gap:")), dbs (w()-35, 41, 30, 25, _("Double bond space:")), bndd (w()-35, 72, 30, 25, _("Bond dash:")), lmaxc(w()-35, 101, 30, 25, _("Width of wedge:")), mbg (w()-35, 130, 30, 25, _("Multiple Bond Gap")), freq (w()-35, 158, 30, 25, _("Unknown stereochemistry bond freq.:")), amp (w()-35, 185, 30, 25, _("Unknown stereochemistry bond amplitude:")), numb (w()-35, 211, 30, 25, _("No. of bars in stereochemistry down bond:")), g3(0, 25, 740, 210, _("Fonts")), sans_font (167, 43, 80, 25, _("Sans font:")), mono_font (167, 71, 80, 25, _("Mono font:")), serif_font (167, 101,80, 25, _("Serif font:")), sans_font_italic (167, 130, 80, 25, _("Sans font italic:")), mono_font_italic (167, 158, 80, 25, _("Mono font italic:")), serif_font_italic (167, 184, 80, 25, _("Serif font italic:")), sans_font_bold (167, 210, 80, 25, _("Sans font bold:")), mono_font_bold (w()-90,43, 80, 25, _("Mono font bold:")), serif_font_bold (w()-90,71, 80, 25, _("Serif font bold:")), sans_font_bold_italic (w()-90,101, 80, 25, _("Sans font bold italic:")), mono_font_bold_italic (w()-90,130, 80, 25, _("Mono font bold italic:")), serif_font_bold_italic (w()-90,158, 80, 25, _("Serif font bold italic:")), symbol_font (w()-90,184, 80, 25, _("Symbol font:")), dingbats_font (w()-90,210, 80, 25, _("Dingbats font:")), def(5, 250, 75, 25, _("Default")), canc(80, 250, 75, 25, _("Cancel")), ok(160, 250, 80, 25, _("OK")) { font_count=Fl::set_fonts(NULL); g1.hide(); ostringstream pout; pout << __pref.getGridSpacing(); grsp.value(pout.str().c_str()); g1.add(grsp); ostringstream pout4; pout4 << __pref.get_sensib_leg (); sens.value(pout4.str().c_str()); g1.add(sens); ostringstream poutw; poutw << __pref.getPageWidth(); _page_w.value(poutw.str().c_str()); g1.add(_page_w); ostringstream pouth; pouth << __pref.getPageHeight(); _page_h.value(pouth.str().c_str()); g1.add(_page_h); _show_splash.down_box(FL_DOWN_BOX); if(__pref.getSplash()){ _show_splash.set(); } g1.add(_show_splash); o.down_box(FL_DOWN_BOX); if(__pref.getDrawGrid()){ o.set(); } g1.add(o); g1.add(quantize_pos); if(__pref.getMagnetic_point_gap()>0){ quantize_pos.set(); } g1.end(); ostringstream pout2; pout2 << __pref.getBond_fixedlength(); bdl.value(pout2.str().c_str()); g2.add(bdl); ostringstream pout3; pout3 << rad2deg(__pref.getBond_fixedangle()); bda.value(pout3.str().c_str()); g2.add(bda); ostringstream pout5; pout5 << __pref.get_arr_w(); arw.value(pout5.str().c_str()); g2.add(arw); ostringstream pout6; pout6 << __pref.get_arr_h(); arh.value(pout6.str().c_str()); g2.add(arh); ostringstream pout_arr_gap; pout_arr_gap << __pref.get_arr_gap(); std::cerr << "arr_gap " << __pref.get_arr_gap() << std::endl; argap.value(pout_arr_gap.str().c_str()); g2.add(argap); ostringstream pout7; pout7 << __pref.getDoubleBondOffset(); dbs.value(pout7.str().c_str()); g2.add(dbs); ostringstream pout8; pout8 << __pref.get_tratteggio_legame(); bndd.value(pout8.str().c_str()); g2.add(bndd); ostringstream pout9; pout9 << __pref.get_larg_max_cuneo(); lmaxc.value(pout9.str().c_str()); g2.add(lmaxc); ostringstream pout10; pout10 << __pref.get_multiple_bond_gap(); mbg.value(pout10.str().c_str()); g2.add(mbg); ostringstream pout11; pout11 << __pref.get_frequenza_stereo_scon(); freq.value(pout11.str().c_str()); g2.add(freq); ostringstream pout12; pout12 << __pref.get_ampiezza_stereo_scon(); amp.value(pout12.str().c_str()); g2.add(amp); ostringstream pout13; pout13 << __pref.get_num_barrette_stereo_down(); numb.value(pout13.str().c_str()); g2.add(numb); g2.end(); g3.hide(); sans_font.value(__pref.get_sans_font().c_str()); add_font_names(sans_font); g3.add(sans_font); mono_font.value(__pref.get_mono_font().c_str()); add_font_names(mono_font); g3.add(mono_font); serif_font.value(__pref.get_serif_font().c_str()); add_font_names(serif_font); g3.add(serif_font); sans_font_italic.value(__pref.get_sans_font_italic().c_str()); add_font_names(sans_font_italic); g3.add(sans_font_italic); mono_font_italic.value(__pref.get_mono_font_italic().c_str()); add_font_names(mono_font_italic); g3.add(mono_font_italic); serif_font_italic.value(__pref.get_serif_font_italic().c_str()); add_font_names(serif_font_italic); g3.add(serif_font_italic); sans_font_bold.value(__pref.get_sans_font_bold().c_str()); add_font_names(sans_font_bold); g3.add(sans_font_bold); mono_font_bold.value(__pref.get_mono_font_bold().c_str()); add_font_names(mono_font_bold); g3.add(mono_font_bold); serif_font_bold.value(__pref.get_serif_font_bold().c_str()); add_font_names(serif_font_bold); g3.add(serif_font_bold); sans_font_bold_italic.value(__pref.get_sans_font_bold_italic().c_str()); add_font_names(sans_font_bold_italic); g3.add(sans_font_bold_italic); mono_font_bold_italic.value(__pref.get_mono_font_bold_italic().c_str()); add_font_names(mono_font_bold_italic); g3.add(mono_font_bold_italic); serif_font_bold_italic.value(__pref.get_serif_font_bold_italic().c_str()); add_font_names(serif_font_bold_italic); g3.add(serif_font_bold_italic); symbol_font.value(__pref.get_symbol_font().c_str()); add_font_names(symbol_font); g3.add(symbol_font); dingbats_font.value(__pref.get_dingbats_font().c_str()); add_font_names(dingbats_font); g3.add(dingbats_font); g3.end(); ui_tab.add(g1); ui_tab.add(g2); ui_tab.add(g3); ui_tab.end(); add(ui_tab); def.callback(pref_reset_to_default_cb); add(def); canc.callback(pref_canc_cb); add(canc); ok.callback(pref_write_conf_cb); add(ok); end(); set_modal(); } void pref_dialog::add_font_names(Fl_Input_Choice& choice){ for(int i=0;i(i)); choice.add(fnt.c_str()); } } bist-0.5.2/src/etichetta.cpp0000644000175000017500000016472211740120332014311 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; /******************etichetta****************/ etichetta::etichetta() : _cr(0), _cg(0), _cb(0), _allineamento(0), _font(FONT_STD), _dim(FONT_STD_DIM), _x(0), _y(0), _v_offset(0), _draw_cursor(false), _draw_negative(false), _can_highlight(false) { _cursor_pos.first=0; _cursor_pos.second=0; } etichetta::etichetta(const etichetta& altro) : _cr(altro._cr), _cg(altro._cg), _cb(altro._cb), _allineamento(altro._allineamento), _vec_str(altro._vec_str), _font(altro._font), _dim(altro._dim), _x(altro._x), _y(altro._y), _v_offset(altro._v_offset), _cursor_pos(altro._cursor_pos), _draw_cursor(altro._draw_cursor), _draw_negative(altro._draw_negative), _can_highlight(altro._can_highlight) { genitore::_il_genitore=altro._il_genitore; } etichetta::etichetta(const etichetta* altro) : _cr(altro->_cr), _cg(altro->_cg), _cb(altro->_cb), _allineamento(altro->_allineamento), _vec_str(altro->_vec_str), _font(altro->_font), _dim(altro->_dim), _x(altro->_x), _y(altro->_y), _v_offset(altro->_v_offset), _cursor_pos(altro->_cursor_pos), _draw_cursor(altro->_draw_cursor), _draw_negative(altro->_draw_negative), _can_highlight(altro->_can_highlight) { genitore::_il_genitore=altro->_il_genitore; } etichetta& etichetta::operator =(const etichetta& altro){ _cr=altro._cr; _cg=altro._cg; _cb=altro._cb; _allineamento=altro._allineamento; _vec_str=altro._vec_str; _font=altro._font; _dim=altro._dim; _x=altro._x; _y=altro._y; _v_offset=altro._v_offset; _cursor_pos=altro._cursor_pos; _draw_cursor=altro._draw_cursor; _draw_negative=altro._draw_negative; _can_highlight=altro._can_highlight; genitore::_il_genitore=altro._il_genitore; return *this; } etichetta::~etichetta(){ //TODO } bool etichetta::dentro_bb(float x_bb, float y_bb, float w_bb , float h_bb){ if(x() > x_bb && x()+w() y_bb && y()+h() ics_e && posx_m < ics_e+w_e && posy_m > ips_e && posy_m < ips_e+h_e){ return 0; }else{ return -1; } } string etichetta::costruct_plot_string(){ string risul; for(unsigned int i2=0;i2<_vec_str.size();i2++){ switch(_vec_str[i2].second){ case ET_STR: risul+=_vec_str[i2].first; break; case ET_APICE: if(i2+1<_vec_str.size()){ switch(_vec_str[i2+1].second){ case ET_PEDICE: risul+="\\mk\\sp"+_vec_str[i2].first+"\\ep\\rt"; break; default: risul+="\\sp"+_vec_str[i2].first+"\\ep"; break; } }else{ risul+="\\sp"+_vec_str[i2].first+"\\ep"; } break; case ET_PEDICE: if(i2+1<_vec_str.size()){ switch(_vec_str[i2+1].second){ case ET_APICE: risul+="\\mk\\sb"+_vec_str[i2].first+"\\eb\\rt"; break; default: risul+="\\sb"+_vec_str[i2].first+"\\eb"; break; } }else{ risul+="\\sb"+_vec_str[i2].first+"\\eb"; } break; } } return risul; } string etichetta::to_raw_string(){ string result(""); for(unsigned int i2=0;i2<_vec_str.size();i2++){ try{ result+=_vec_str[i2].first; }catch(length_error e){ cout << "error in etichetta::to_raw_string(): " << "i: " << i2 <(rintf(fl_width(_vec_str[i2].first.c_str()))); break; case ET_APICE: { fl_font(tipo_font,font_dim_std/scale_font); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); if(i2>0){ if(_vec_str[i2-1].second==ET_PEDICE){ float max_l=max( fl_width(_vec_str[i2].first.c_str()), fl_width(_vec_str[i2-1].first.c_str())); xatt-=fl_width(_vec_str[i2-1].first.c_str()); xatt+=static_cast(rintf(max_l)); }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } } break; case ET_PEDICE: { fl_font(tipo_font,font_dim_std/scale_font); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); if(i2>0){ if(_vec_str[i2-1].second==ET_APICE){ float max_l=max( fl_width(_vec_str[i2].first.c_str()) , fl_width(_vec_str[i2-1].first.c_str())); xatt-=fl_width(_vec_str[i2-1].first.c_str()); xatt+=static_cast(rintf(max_l)); }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } } break; } } altris-=std_desc; larris=xatt; } } void etichetta::misura(float& altris,float& larris ){ //fltk says: //void fl_draw(const char *, int x, int y, int w, int h); //The string is formatted and aligned *inside* the passed box if(cairo_t_singleton::can_export()){ phys_misura(altris,larris); }else{ string font_ps; int tipo_font; int h_f=0; int w_f=0; get_font_handle((*this), tipo_font, font_ps); fl_font(tipo_font,dim()-3); fl_font(tipo_font,dim()); int font_dim_std=dim(); int std_desc=fl_descent(); int xatt=0; float scale_font=SCALE_APICI; for(unsigned int i2=0;i2<_vec_str.size();i2++){ h_f=0; w_f=0; switch(_vec_str[i2].second){ case ET_STR: fl_font(tipo_font,font_dim_std); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); altris=h_f; xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); break; case ET_APICE: { fl_font(tipo_font,font_dim_std/scale_font); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); if(i2>0){ if(_vec_str[i2-1].second==ET_PEDICE){ float max_l=max( fl_width(_vec_str[i2].first.c_str()), fl_width(_vec_str[i2-1].first.c_str())); xatt-=fl_width(_vec_str[i2-1].first.c_str()); xatt+=static_cast(rintf(max_l)); }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } } break; case ET_PEDICE: { fl_font(tipo_font,font_dim_std/scale_font); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); if(i2>0){ if(_vec_str[i2-1].second==ET_APICE){ float max_l=max( fl_width(_vec_str[i2].first.c_str()) , fl_width(_vec_str[i2-1].first.c_str())); xatt-=fl_width(_vec_str[i2-1].first.c_str()); xatt+=static_cast(rintf(max_l)); }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } }else{ xatt+=static_cast(rintf(fl_width(_vec_str[i2].first.c_str()))); } } break; } } altris-=std_desc; larris=xatt; } } void etichetta::visual_misura(float& altris,float& larris ){ int old_dim=phys_dim(); int new_dim=visual_dim(); dim(new_dim); phys_misura(altris,larris); dim(old_dim); } float etichetta::w(){ float alt; float lar; misura(alt,lar); return lar; } float etichetta::visual_w(){ float alt; float lar; visual_misura(alt,lar); return lar; } float etichetta::phys_w(){ float alt; float lar; phys_misura(alt,lar); return lar; } float etichetta::h(){ float alt; float lar; misura(alt,lar); return alt; } float etichetta::visual_h(){ float alt; float lar; visual_misura(alt,lar); return alt; } float etichetta::phys_h(){ float alt; float lar; phys_misura(alt,lar); return alt; } void etichetta::cr(int nw){ _cr=nw; } void etichetta::cb(int nw){ _cb=nw; } void etichetta::cg(int nw){ _cg=nw; } void etichetta::allineamento(int nw){ _allineamento=nw; } void etichetta::v_offset(int nw){ _v_offset=nw; } int etichetta::cr(){ return _cr; } int etichetta::cg(){ return _cg; } int etichetta::cb(){ return _cb; } int etichetta::allineamento(){ return _allineamento; } int etichetta::v_offset(){ return _v_offset; } int etichetta::font(){ return _font; } int etichetta::dim(){ if(cairo_t_singleton::can_export()){ return phys_dim(); }else{ return visual_dim(); } } int etichetta::visual_dim(){ int zoomed_dim=static_cast(rintf(phys_dim()*__pref.getZoom())); if(zoomed_dim<5){ zoomed_dim=5; } return zoomed_dim; } int etichetta::phys_dim(){ return _dim; } float etichetta::x(){ if(cairo_t_singleton::can_export()){ return phys_x(); }else{ return visual_x(); } } float etichetta::visual_x(){ return phys_x() * __pref.getZoom(); } float etichetta::phys_x(){ return _x; } float etichetta::y(){ if(cairo_t_singleton::can_export()){ return phys_y(); }else{ return visual_y(); } } float etichetta::visual_y(){ return phys_y() * __pref.getZoom(); } float etichetta::phys_y(){ return _y; } vector < pair > etichetta::vec_str(){ return _vec_str; } /** *Ritorna la lunghezza del vettore contenente le stringhe */ int etichetta::size_str(){ return _vec_str.size(); } /** *Aggiunge un elemento al vettore * *\param nw la nuova etichetta *\param tipo il tipo si stringa: puo' assumere i valori: * *
    *
  • ET_STR *
  • ET_APICE *
  • ET_PEDICE *
*/ void etichetta::aggiungi(string nw, int tipo){ pair tmp_p(nw,tipo); _vec_str.push_back(tmp_p); } void etichetta::melt_similar(int start){ if(_vec_str.size()>1){ if(static_cast(start)<_vec_str.size()-1){ if(_vec_str[start].second==_vec_str[start+1].second){ std::string l=_vec_str[start].first; std::string r=_vec_str[start+1].first; string lpr=l+r; _vec_str[start].first=lpr; std::vector < std::pair >::iterator it=_vec_str.begin()+start+1; _vec_str.erase(it); melt_similar(start); } }else{ melt_similar(start+1); } } } void etichetta::insert(string nw, int type, int pos, bool reset_cur){ pair tmp_p(nw,type); if(pos<0){ pos=0; } vector < pair >::iterator beg=_vec_str.begin() + pos; if(beg< _vec_str.end()){ _vec_str.insert(beg,tmp_p); }else{ aggiungi(nw,type); } if(reset_cur){ reset_cursor_if_outside_limits(); } } void etichetta::reset_cursor_if_outside_limits(bool second_pos_not_end){ if(vec_str().size()==0){ _cursor_pos.first=0; _cursor_pos.second=0; }else{ if(static_cast(_cursor_pos.first)>=vec_str().size()){ _cursor_pos.first=vec_str().size()-1; }else if(_cursor_pos.first < 0){ _cursor_pos.first=0; } std::vector < pair > vec=vec_str(); if(_cursor_pos.second >= (vec[_cursor_pos.first].first).size()){ if(second_pos_not_end){ _cursor_pos.second=0; }else{ _cursor_pos.second=(vec[_cursor_pos.first].first).size(); } } } } /** *Elimina la stringa in una certa posizione. * *\param where l'elemento da eliminare. */ void etichetta::elimina(int where, bool reset_cur) throw (out_of_range){ if(static_cast(where) < _vec_str.size()){ vector < pair >::iterator iniz=_vec_str.begin(); iniz+=where; _vec_str.erase(iniz); if(reset_cur){ reset_cursor_if_outside_limits(); } }else{ string exc="Errore where < _vec_str.size() nella classe etichetta. Funzione: " + string(__FUNCTION__); throw out_of_range(exc); } } /** *sostituisci la stringa in una certa posizione. * *\param cosa la nuova stringa *\param tipo il tipo si strinag (apice pedice o normale) *\param where l'elemento da eliminare. */ void etichetta::sostituisci(string cosa, int tipo, int where, bool reset_cur) throw (out_of_range){ if(static_cast(where) < _vec_str.size()){ vector < pair >::iterator iniz=_vec_str.begin(); iniz+=where; (*iniz).first=cosa; (*iniz).second=tipo; if(reset_cur){ reset_cursor_if_outside_limits(); } }else{ string exc="Errore where < _vec_str.size() nella classe etichetta. Funzione: " + string(__FUNCTION__); throw out_of_range(exc); } } /** *Elimina la prima stringa uguale a ricercata. * *\param ricercata l'elemento da eliminare. */ int etichetta::elimina(string ricercata, bool reset_cur){ vector < pair >::iterator iniz=_vec_str.begin(); vector < pair >::iterator fin=_vec_str.end(); int risul=0; while(iniz!=fin){ if((*iniz).first!=ricercata){ iniz++; }else{ risul++; _vec_str.erase(iniz); iniz=fin; } } if(reset_cur){ reset_cursor_if_outside_limits(); } return risul; } /** *Elimina tutti gli apici. */ void etichetta::elimina_apici(bool reset_cur){ // #define ET_STR 0 // #define ET_APICE 1 // #define ET_PEDICE 2 vector < pair >::iterator iniz=_vec_str.begin(); vector < pair >::iterator fin=_vec_str.end(); while(iniz!=fin){ if((*iniz).second==ET_APICE){ _vec_str.erase(iniz); } iniz++; } if(reset_cur){ reset_cursor_if_outside_limits(); } } /** *Elimina tutti i pedici */ void etichetta::elimina_pedici(bool reset_cur){ vector < pair >::iterator iniz=_vec_str.begin(); vector < pair >::iterator fin=_vec_str.end(); while(iniz!=fin){ if((*iniz).second==ET_PEDICE){ _vec_str.erase(iniz); } iniz++; } if(reset_cur){ reset_cursor_if_outside_limits(); } } /** *Elimina tutta l'etichetta */ void etichetta::elimina(bool reset_cur){ _vec_str.erase(_vec_str.begin(),_vec_str.end()); if(reset_cur){ reset_cursor_if_outside_limits(); } } void etichetta::subst_vec_str(std::vector < std::pair > nw){ elimina(); _vec_str=nw; } void etichetta::font(int nw){ _font=nw; } void etichetta::dim(int nw){ _dim=nw; } void etichetta::x(float nw){ _x=nw; } void etichetta::y(float nw){ _y=nw; } void etichetta::disegna(){ string font_ps; int tipo_font; get_font_handle((*this), tipo_font, font_ps); if(cairo_t_singleton::can_export()){ draw_label_export(); }else{ draw_label_onscreen(); int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); if(_draw_cursor){ int x=-1; int y=-1; if(cursor_to_coordinate(x,y)){ draw_shadowed_point(x+dx_scroll,y+dy_scroll,255,0,0); } } } } void etichetta::measure_as_pango_layout(std::vector < std::pair > vec, float &w, float &h, int until){ std::vector ws; float hmax=-1; unsigned int limit_measure_pos=vec.size()-1; if(until>=0 && static_cast(until)(until); } for(unsigned int i=0;i<=limit_measure_pos;i++){ switch(vec[i].second){ case ET_STR: { float wlocal=0; float hlocal=0; float lbearing; float ascent; float descent; get_pango_logical_sizes(vec[i].first, vec[i].second,wlocal, hlocal,lbearing,ascent,descent); if(hlocal>=hmax){ hmax=hlocal; } ws.push_back(wlocal); } break; case ET_APICE: case ET_PEDICE: { float w=0; float h_discard=0; float lbearing; float ascent; float descent; get_pango_logical_sizes(vec[i].first, vec[i].second,w, h_discard, lbearing,ascent,descent); float wlocal=check_pango_max_between_sub_sup(vec,i); if(wlocal>0 && wlocal==w && wlocal!=ws.back()){ ws.push_back(wlocal); } } break; } } w=accumulate(ws.begin(),ws.end(),0); h=hmax; } float etichetta::check_pango_max_between_sub_sup(std::vector < std::pair > vec, unsigned int pos){ float res=0; if(pos< vec.size()){ std::vector sizes; unsigned int limit_left=pos; if(pos>0){ limit_left--; } unsigned int limit_right=pos; if(pos+1::iterator max_val=std::max_element(sizes.begin(), sizes.end()); res=*max_val; } return res; } float etichetta::get_fltk_baseline(){ string font_ps; int tipo_font; get_font_handle((*this), tipo_font, font_ps); fl_font(tipo_font,dim()); return fl_descent(); } float etichetta::get_fltk_phys_baseline(){ string font_ps; int tipo_font; get_font_handle((*this), tipo_font, font_ps); fl_font(tipo_font,phys_dim()); return fl_descent(); } float etichetta::get_pango_baseline(int type){ int res=-1; float scale_font=SCALE_APICI; if(_vec_str.size()>0){ cairo_t* cn=cairo_t_singleton::get_context(); float font_dim_std=phys_dim(); if(type==ET_APICE || type==ET_PEDICE){ font_dim_std/=scale_font; } int font_fltk; std::string font_pango; get_font_handle((*this), font_fltk,font_pango); cairo_save(cn); PangoFontDescription* desc=pango_font_description_new(); pango_font_description_set_family(desc, font_pango.c_str() ); pango_font_description_set_absolute_size(desc, font_dim_std*PANGO_SCALE); PangoLayout *layout = pango_cairo_create_layout(cn); pango_layout_set_text(layout, (_vec_str[0].first).c_str(), -1); pango_layout_set_font_description(layout, desc); pango_cairo_update_layout(cn, layout); PangoLayoutIter* itr=pango_layout_get_iter(layout); double d_res=pango_units_to_double(pango_layout_iter_get_baseline(itr)); //i do know why but fltk seems to make ceiling for baseline (i.e. //fl_descent()) of fonts...so i have to make the same here... //this hack below is inelegant and maybe i have to check the new //api in fltk 1.3 for fl_text_extents res=static_cast(ceil(d_res)); cairo_stroke(cn); cairo_restore(cn); g_object_unref(layout); pango_font_description_free(desc); } return res; } float etichetta::get_pango_logical_y(){ int res=-1; if(_vec_str.size()>0){ res=get_pango_logical_y(_vec_str[0].first, _vec_str[0].second); } return res; } float etichetta::get_pango_logical_y(std::string st, int type){ PangoRectangle rect; get_pango_logical_rectangle(st,type,&rect); return rect.y; } float etichetta::get_pango_ink_y(){ int res=-1; if(_vec_str.size()>0){ res=get_pango_logical_y(_vec_str[0].first, _vec_str[0].second); } return res; } float etichetta::get_pango_ink_y(std::string st, int type){ PangoRectangle rect; get_pango_ink_rectangle(st,type,&rect); return rect.y; } void etichetta::get_pango_logical_rectangle(std::string st, int type, PangoRectangle* rect){ cairo_t* cn=cairo_t_singleton::get_context(); float font_dim_std=phys_dim(); float font_dim_sub=phys_dim()/SCALE_APICI; int font_fltk; std::string font_pango; get_font_handle((*this), font_fltk,font_pango); PangoFontDescription* desc=pango_font_description_new(); pango_font_description_set_family(desc, font_pango.c_str() ); switch(type){ case ET_STR: pango_font_description_set_absolute_size(desc, font_dim_std*PANGO_SCALE); break; case ET_APICE: case ET_PEDICE: pango_font_description_set_absolute_size(desc, font_dim_sub*PANGO_SCALE); break; } PangoLayout *layout = pango_cairo_create_layout(cn); pango_layout_set_text(layout, st.c_str(), -1); pango_layout_set_font_description(layout, desc); pango_cairo_update_layout(cn, layout); pango_layout_get_extents(layout,NULL,rect); pango_extents_to_pixels(rect,NULL); } void etichetta::get_pango_ink_rectangle(std::string st, int type, PangoRectangle* rect){ cairo_t* cn=cairo_t_singleton::get_context(); float font_dim_std=phys_dim(); float font_dim_sub=phys_dim()/SCALE_APICI; int font_fltk; std::string font_pango; get_font_handle((*this), font_fltk,font_pango); PangoFontDescription* desc=pango_font_description_new(); pango_font_description_set_family(desc, font_pango.c_str() ); switch(type){ case ET_STR: pango_font_description_set_absolute_size(desc, font_dim_std*PANGO_SCALE); break; case ET_APICE: case ET_PEDICE: pango_font_description_set_absolute_size(desc, font_dim_sub*PANGO_SCALE); break; } PangoLayout *layout = pango_cairo_create_layout(cn); pango_layout_set_text(layout, st.c_str(), -1); pango_layout_set_font_description(layout, desc); pango_cairo_update_layout(cn, layout); pango_layout_get_extents(layout,rect,NULL); pango_extents_to_pixels(rect,NULL); } void etichetta::get_pango_logical_sizes(std::string st, int type, float& w_logical, float& h_logical, float& lbearing, float& ascent, float& descent){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); float font_dim_std=phys_dim(); float font_dim_sub=phys_dim()/SCALE_APICI; int font_fltk; std::string font_pango; get_font_handle((*this), font_fltk,font_pango); PangoFontDescription* desc=pango_font_description_new(); pango_font_description_set_family(desc, font_pango.c_str()); switch(type){ case ET_STR: pango_font_description_set_absolute_size(desc, font_dim_std*PANGO_SCALE); break; case ET_APICE: case ET_PEDICE: pango_font_description_set_absolute_size(desc, font_dim_sub*PANGO_SCALE); break; } PangoLayout *layout = pango_cairo_create_layout(cn); pango_layout_set_text(layout, st.c_str(), -1); pango_layout_set_font_description(layout, desc); pango_cairo_update_layout(cn, layout); PangoRectangle logc_r; pango_layout_get_extents(layout,NULL,&logc_r); pango_extents_to_pixels(&logc_r,NULL); w_logical=PANGO_RBEARING(logc_r); h_logical=get_pango_baseline(type); descent=PANGO_DESCENT(logc_r); ascent=PANGO_ASCENT(logc_r); lbearing=PANGO_LBEARING(logc_r); //manage with ending withespaces PangoContext* p_cn=pango_layout_get_context(layout); PangoFont* p_fnt=pango_context_load_font(p_cn,desc); PangoLanguage* def_locale=pango_language_get_default(); PangoFontMetrics* p_fnt_metrics=pango_font_get_metrics(p_fnt, def_locale); float char_width=pango_font_metrics_get_approximate_char_width(p_fnt_metrics) / PANGO_SCALE; for(int i=st.size()-1; i>=0 && isblank(st[i]);i--){ w_logical+=char_width; } g_object_unref(layout); pango_font_description_free(desc); cairo_restore(cn); } void etichetta::get_pango_ink_sizes(std::string st, int type, float& w_ink, float& h_ink, float& lbearing, float& ascent, float& descent){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); float font_dim_std=phys_dim(); float font_dim_sub=phys_dim()/SCALE_APICI; int font_fltk; std::string font_pango; get_font_handle((*this), font_fltk,font_pango); PangoFontDescription* desc=pango_font_description_new(); pango_font_description_set_family(desc, font_pango.c_str()); switch(type){ case ET_STR: pango_font_description_set_absolute_size(desc, font_dim_std*PANGO_SCALE); break; case ET_APICE: case ET_PEDICE: pango_font_description_set_absolute_size(desc, font_dim_sub*PANGO_SCALE); break; } PangoLayout *layout = pango_cairo_create_layout(cn); pango_layout_set_text(layout, st.c_str(), -1); pango_layout_set_font_description(layout, desc); pango_cairo_update_layout(cn, layout); PangoRectangle ink_r; pango_layout_get_extents(layout,&ink_r,NULL); pango_extents_to_pixels(&ink_r,NULL); w_ink=PANGO_RBEARING(ink_r); h_ink=get_pango_baseline(type); descent=PANGO_DESCENT(ink_r); ascent=PANGO_ASCENT(ink_r); lbearing=PANGO_LBEARING(ink_r); //manage with ending withespaces PangoContext* p_cn=pango_layout_get_context(layout); PangoFont* p_fnt=pango_context_load_font(p_cn,desc); PangoLanguage* def_locale=pango_language_get_default(); PangoFontMetrics* p_fnt_metrics=pango_font_get_metrics(p_fnt, def_locale); float char_width=pango_font_metrics_get_approximate_char_width(p_fnt_metrics) / PANGO_SCALE; for(int i=st.size()-1; i>=0 && isblank(st[i]);i--){ w_ink+=char_width; } g_object_unref(layout); pango_font_description_free(desc); cairo_restore(cn); } void etichetta::draw_pango_sub_superscript(std::string st, int hparent, int x ,int y, int type){ bool typeok=false; int nwy=y; float w_logical; float h_logical; float lbearing; float ascent; float descent; if(type==ET_APICE){ typeok=true; get_pango_logical_sizes(st, type, w_logical, h_logical, lbearing,ascent, descent); nwy-=hparent/2.0; nwy+=h_logical; }else if(type==ET_PEDICE){ typeok=true; get_pango_logical_sizes(st, type, w_logical, h_logical, lbearing,ascent, descent); nwy+=hparent; nwy+=- h_logical/2.0; } if(typeok){ draw_pango_string(st, x, nwy, type); } } void etichetta::draw_pango_string(std::string st,int x, int y, int type){ cairo_t* cn=cairo_t_singleton::get_context(); int font_dim_std=phys_dim(); float font_dim_sub=phys_dim()/SCALE_APICI; int font_fltk=0; std::string font_pango=""; get_font_handle((*this), font_fltk,font_pango); /* PangoFontDescription* desc=pango_font_description_new(); pango_font_description_set_family(desc,"courier 10 pitch bold"); */ PangoFontDescription* desc=pango_font_description_from_string(font_pango.c_str()); switch(type){ case ET_STR: pango_font_description_set_absolute_size(desc, font_dim_std*PANGO_SCALE); break; case ET_APICE: case ET_PEDICE: pango_font_description_set_absolute_size(desc, font_dim_sub*PANGO_SCALE); break; } cairo_move_to(cn, x, y); PangoLayout *layout = pango_cairo_create_layout(cn); pango_layout_set_width(layout,-1); pango_layout_set_text(layout, st.c_str(), -1); pango_layout_set_font_description(layout, desc); pango_cairo_update_layout(cn, layout); pango_cairo_show_layout(cn, layout); g_object_unref(layout); pango_font_description_free(desc); } void etichetta::draw_label_export(){ cairo_t* cn=cairo_t_singleton::get_context(); cairo_save(cn); cairo_set_source_rgb(cn, remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb())); int x_att=phys_x(); int y_att=phys_y(); for(unsigned int i=0;i<_vec_str.size();i++){ if(_vec_str[i].second==ET_STR){ draw_pango_string(_vec_str[i].first,x_att,y_att,_vec_str[i].second); float wlocal=0; float hlocal=0; measure_as_pango_layout(_vec_str, wlocal,hlocal,i); cairo_set_source_rgb(cn,remap_color_1(cr()), remap_color_1(cg()), remap_color_1(cb())); int threshold=0; if( (i+1) < _vec_str.size()){ draw_pango_sub_superscript(_vec_str[i+1].first, hlocal, phys_x()+wlocal,y_att,_vec_str[i+1].second); if(_vec_str[i+1].second==ET_APICE || _vec_str[i+1].second==ET_PEDICE){ threshold++; } } if( (i+2) < _vec_str.size()){ draw_pango_sub_superscript(_vec_str[i+2].first, hlocal, phys_x()+wlocal,y_att, _vec_str[i+2].second); if(_vec_str[i+2].second==ET_APICE || _vec_str[i+2].second==ET_PEDICE){ threshold++; } } measure_as_pango_layout(_vec_str, wlocal,hlocal,i+threshold); x_att=phys_x()+wlocal; } } cairo_stroke(cn); cairo_restore(cn); } void etichetta::draw_label_onscreen(){ int tipo_font; string font_ps; get_font_handle((*this), tipo_font, font_ps); int font_dim_std=visual_dim(); float xatt=visual_x(); float scale_font=SCALE_APICI; int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); float h_f_parent=0; if(draw_negative()){ fl_color(FL_BLACK); float h=0; float w=0; visual_misura(h,w); int x_bb=static_cast(rintf(visual_x()))+dx_scroll; int y_bb=static_cast(rintf(visual_y()))+dy_scroll; fl_rectf(x_bb,y_bb,w,h); fl_color(FL_WHITE); }else{ fl_color(cr(),cg(),cb()); } fl_font(tipo_font,visual_dim()); for(unsigned int i2=0;i2<_vec_str.size();i2++){ int w_f=0; int h_f=0; switch(_vec_str[i2].second){ case ET_STR: fl_font(tipo_font,font_dim_std); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); fl_draw(_vec_str[i2].first.c_str(), xatt+dx_scroll, static_cast(rintf(visual_y()+dy_scroll)), w_f, h_f, FL_ALIGN_CENTER); xatt+=fl_width(_vec_str[i2].first.c_str()); h_f_parent=h_f; break; case ET_APICE: fl_font(tipo_font,font_dim_std/scale_font); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); fl_draw(_vec_str[i2].first.c_str(), xatt+dx_scroll, static_cast(rintf(-h_f/2 + visual_y()+dy_scroll)), w_f, h_f, FL_ALIGN_CENTER); if((i2+1)<_vec_str.size()){ if(_vec_str[i2+1].second==ET_STR){ if(_vec_str[i2-1].second==ET_PEDICE){ float max_l=max( fl_width(_vec_str[i2].first.c_str()) , fl_width(_vec_str[i2-1].first.c_str())); xatt+=rintf(max_l); }else{ xatt+=fl_width(_vec_str[i2].first.c_str()); } } } break; case ET_PEDICE: fl_font(tipo_font,font_dim_std/scale_font); fl_measure(_vec_str[i2].first.c_str(), w_f, h_f); fl_draw(_vec_str[i2].first.c_str(), xatt+dx_scroll, static_cast(rintf(visual_y()+h_f_parent-h_f/2.0+dy_scroll)), w_f, h_f, FL_ALIGN_CENTER); if((i2+1)<_vec_str.size()){ if(_vec_str[i2+1].second==ET_STR){ if(_vec_str[i2-1].second==ET_APICE){ float max_l=max( fl_width(_vec_str[i2].first.c_str()) , fl_width(_vec_str[i2-1].first.c_str())); xatt+=rintf(max_l); }else{ xatt+=fl_width(_vec_str[i2].first.c_str()); } } } break; } } } /** *Scala l'oggetto * *\param sc il fattore di scala */ void etichetta::scale(float sc){ if(sc<1){ if(phys_dim()>6){ dim(phys_dim()-1); } }else{ dim(phys_dim()+1); } } /** *Ruota l'oggetto in senso orario. * *\param angl l'angolo di rotazione in radianti in senso orario *\param xpivot ascissa relativa all'asse di rotazione *\param ypivot ordinata relativa all'asse di rotazione * */ void etichetta::ruota(float xpiv, float ypiv,float angl){ not_impl(); } /** *Trasla l'oggetto. * *\param dx entita' dello spostamento lungo l'ascissa *\param dy entita' dello spostamento lungo l'ordinata */ void etichetta::trasla(float dx, float dy){ x(descale(x()+dx)); y(descale(y()+dy)); } void etichetta::phys_translate(float dx, float dy){ x(phys_x()+dx); y(phys_y()+dy); } void etichetta::set_cursor_position( int pos_in_vec, string::size_type pos_in_string){ _cursor_pos.first=pos_in_vec; _cursor_pos.second=pos_in_string; } void etichetta::set_cursor_position(std::pair pos){ set_cursor_position(pos.first,pos.second); } int etichetta::set_cursor_position(int limit){ set_cursor_position(0,0); int type_res=0; for(int i=0;i > the_vector_str=vec_str(); if(the_vector_str.size()>0){ _cursor_pos.second=(the_vector_str.back().first).size(); int fst=the_vector_str.size()? the_vector_str.size()-1 : 0; _cursor_pos.first=fst; }else{ _cursor_pos.second=0; _cursor_pos.first=0; } } void etichetta::go_to_end_of_line(){ go_to_end_of_label(); } void etichetta::go_to_start_of_label(){ _cursor_pos.first=0; _cursor_pos.second=0; } void etichetta::go_to_start_of_line(){ go_to_start_of_label(); } int etichetta::get_cursor_position(std::pair* pos){ ///DA CAMBIARE QUESTA FOLLIA! std::pair saved_curr_pos=_cursor_pos; if(pos!=0){ pos->first=saved_curr_pos.first; pos->second=saved_curr_pos.second; } int res=0; set_cursor_position(0,0); bool stop=false; while(!stop){ if(_cursor_pos.first==saved_curr_pos.first){ if(_cursor_pos.second==saved_curr_pos.second){ stop=true; } } if(!stop){ int dummy=0; cursor_one_step_fwd(dummy); res++; } } return res; } void etichetta::draw_cursor(bool draw){ _draw_cursor=draw; } bool etichetta::draw_cursor(){ return _draw_cursor; } bool etichetta::cursor_to_coordinate(int& x, int& y){ bool res=true; int type_str=type_etic_at_cur_pos(); etichetta copy_et=*this; if(_cursor_pos.first< copy_et.size_str()){ for(int i=_cursor_pos.first+1;i0){ if(type_etic_at_cur_pos()==ET_APICE || type_etic_at_cur_pos()==ET_PEDICE ){ bool exist=false; if(check_if_type_etic_previous_chunk(ET_PEDICE,exist)|| check_if_type_etic_previous_chunk(ET_APICE,exist) ){ copy_et.elimina(_cursor_pos.first-1); copy_et.set_cursor_position(_cursor_pos.first-1,_cursor_pos.second); copy_et.reset_cursor_if_outside_limits(); } } } std::vector < std::pair > the_vector_str=copy_et.vec_str(); if(_cursor_pos.second<=(the_vector_str.back().first).size()){ if(_cursor_pos.second==(the_vector_str.back().first).size()){ //draw here the cursor after the last char of the label //TODO }else{ std::string to_update=the_vector_str.back().first; to_update=to_update.substr(0,_cursor_pos.second); std::pair c_pos(0,0); copy_et.get_cursor_position(&c_pos); copy_et.sostituisci(to_update,type_str,c_pos.first); } //misuriamo il risultato x=copy_et.x()+copy_et.w(); y=copy_et.y(); int tipo_font; string font_ps; int h_f=0; int w_f=0; vector < pair > vec_str=copy_et.vec_str(); get_font_handle((*this), tipo_font, font_ps); fl_font(tipo_font,dim()/SCALE_APICI); fl_measure(vec_str[0].first.c_str(), w_f, h_f); fl_font(tipo_font,dim()); if(the_vector_str.back().second==ET_PEDICE){ y+=copy_et.h()+h_f; }else if(the_vector_str.back().second==ET_APICE){ y+=h_f/SCALE_APICI; }else if(the_vector_str.back().second==ET_STR){ if(copy_et.h()>=0){ y+=copy_et.h(); }else{ y+=dim(); } } }else{ res=false; } }else{ res=false; } return res; } bool etichetta::cursor_one_step_fwd(int &curr_type){ std::vector < std::pair > the_vec_str=vec_str(); bool res=true; if(_cursor_pos.second > the_vec_str=vec_str(); bool res=true; if(_cursor_pos.second>0){ _cursor_pos.second--; }else if(( (static_cast(_cursor_pos.first)-1) >=0)){ _cursor_pos.first--; _cursor_pos.second=the_vec_str[_cursor_pos.first].first.size(); }else{ res=false; } curr_type=the_vec_str[_cursor_pos.first].second; return res; } bool etichetta::check_if_type_etic(int typ) throw (out_of_range){ bool res=false; if(size_str()>0){ vector < pair > strings=vec_str(); pair pt= strings.back(); if(pt.second==typ){ res= true; }else{ res= false; } return res; }else{ std::string exc="Errore where < _vec_str.size() nella classe etichetta. " + std::string(__FUNCTION__); throw out_of_range(exc); } } bool etichetta::check_if_type_etic(int typ,int pos) throw (out_of_range){ vector < pair > stringhe=vec_str(); if(static_cast(pos) < vec_str().size() && pos >=0){ vector < pair >::iterator it= stringhe.begin(); pair pt= *(it+pos); if(pt.second==typ){ return true; }else{ return false; } }else{ string exc="Errore where < _vec_str.size() nella classe etichetta. Funzione: " + std::string(__FUNCTION__); throw out_of_range(exc); } } bool etichetta::check_if_type_etic_previous_chunk(int equal,bool &res_prev_exist){ vector < pair > stringhe=vec_str(); bool res=false; try{ if(check_if_type_etic(equal,_cursor_pos.first-1)){ res=true; res_prev_exist=true; }else{ res=false; res_prev_exist=true; } return res; }catch(out_of_range e){ res_prev_exist=false; res=false; return res; } } bool etichetta::check_if_type_etic_next_chunk(int equal,bool &res_next_exist){ vector < pair > stringhe=vec_str(); bool res=false; try{ if(check_if_type_etic(equal,_cursor_pos.first+1)){ res=true; res_next_exist=true; }else{ res=false; res_next_exist=true; } return res; }catch(out_of_range e){ res_next_exist=false; res=false; return res; } } int etichetta::type_etic_at_cur_pos(){ int res=-1; try{ if(check_if_type_etic(ET_STR,_cursor_pos.first)){ res=ET_STR; }else if(check_if_type_etic(ET_APICE,_cursor_pos.first)){ res=ET_APICE; }else if(check_if_type_etic(ET_PEDICE,_cursor_pos.first)){ res=ET_PEDICE; } }catch (out_of_range e){ return res; } return res; } void etichetta::manage_sub_super(int check, int troublesome,std::string car){ //poniamo sia un apice try{ if(check_if_type_etic(check,_cursor_pos.first)){ //ultimo e' apice aggiungere for(unsigned int i=0;i > the_vec_str=vec_str(); std::string str=the_vec_str[_cursor_pos.first].first; bool res=true; bool next_or_prev_exist=false; if((type_etic_at_cur_pos() >0 && type_etic_at_cur_pos()!=type)){ bool exist=false; if(check_if_type_etic_next_chunk(type,exist)){ _cursor_pos.first++; std::cerr << "+" << std::endl; next_or_prev_exist=true; }else if(check_if_type_etic_previous_chunk(type,exist)){ std::cerr << "-" << std::endl; _cursor_pos.first--; next_or_prev_exist=true; } if(next_or_prev_exist){ std::string tmp_str=the_vec_str[_cursor_pos.first].first; if(_cursor_pos.second > tmp_str.size()){ _cursor_pos.second = tmp_str.size(); } }else{ //next or previous but it is an ET_STR insert("",type,_cursor_pos.first); _cursor_pos.second = 0; } }else if(type_etic_at_cur_pos() <0){ res=false; #ifdef DEBUG std::cerr << __FUNCTION__ << " error in line " << __LINE__ << std::endl << "subscript or superscript (type: " << type << ") " << "without parent" << std::endl; #endif } return res; } bool etichetta::manage_add_sub_super_next_normal_str(int type){ std::vector < std::pair > the_vec_str=vec_str(); std::string str=the_vec_str[_cursor_pos.first].first; bool res=true; if(str.size() == _cursor_pos.second){ _cursor_pos.first++; _cursor_pos.second=0; if((type_etic_at_cur_pos() >0 && type_etic_at_cur_pos()!=type) || (type_etic_at_cur_pos() <0) ){ if(type_etic_at_cur_pos() >0){ _cursor_pos.second=(the_vec_str[_cursor_pos.first].first).size(); insert("",type,_cursor_pos.first,false); }else{ insert("",type,_cursor_pos.first,true); } } }else if(_cursor_pos.second==0){ _cursor_pos.first--; if(type_etic_at_cur_pos() >0 && type_etic_at_cur_pos()!=type){ insert("",type,_cursor_pos.first,false); }else if(type_etic_at_cur_pos() >0 && type_etic_at_cur_pos()==type){ str=the_vec_str[_cursor_pos.first].first; _cursor_pos.second=str.size(); }else if(type_etic_at_cur_pos() <0){ res=false; _cursor_pos.first++; } }else{ break_normal_str(type); } return res; } void etichetta::insert_char_in_curr_pos(char add, int type){ std::vector < std::pair > the_vec_str=vec_str(); if(the_vec_str.size()<=0){ //inizializza il vettore aggiungi(std::string(1,add),type); _cursor_pos.second=1; _cursor_pos.first=0; }else if(static_cast(_cursor_pos.first)0){ std::string to_update= the_vec_str[_cursor_pos.first].first; to_update.insert(_cursor_pos.second,std::string(1,add)); sostituisci(to_update,type,_cursor_pos.first); _cursor_pos.second++; }else{// ma vuota sostituisci(std::string(1,add),type,_cursor_pos.first); _cursor_pos.second=1; } }else{ // non vuota inserisci std::string to_update= the_vec_str[_cursor_pos.first].first; if(_cursor_pos.second0){ std::vector < std::pair > the_vec_str=vec_str(); try{ check_if_type_etic(ET_STR,_cursor_pos.first); check_if_type_etic(ET_APICE,_cursor_pos.first); check_if_type_etic(ET_PEDICE,_cursor_pos.first); std::string to_update= the_vec_str[_cursor_pos.first].first; int type=the_vec_str[_cursor_pos.first].second; if(before){ if(_cursor_pos.second<=to_update.size() && _cursor_pos.second>0){ to_update.erase(_cursor_pos.second-1,1); if(to_update!=""){ sostituisci(to_update,type,_cursor_pos.first); if(_cursor_pos.second < to_update.size()){ _cursor_pos.second--; } }else{ clean_string_after_delete(); } }else if(_cursor_pos.second==0 && ( (static_cast(_cursor_pos.first)-1) >=0)){ if(the_vec_str[_cursor_pos.first].first.size()==0){ elimina(_cursor_pos.first); _cursor_pos.second=the_vec_str[_cursor_pos.first].first.size(); }else{ int dummy=0; cursor_one_step_back(dummy); } } }else{ if(_cursor_pos.second > the_vec_str=vec_str(); int cur_type=type_etic_at_cur_pos(); bool res_exist=false; if(cur_type==ET_APICE){ if(check_if_type_etic_next_chunk(ET_PEDICE,res_exist) && res_exist){ break_sub_super(ET_APICE,breaking_type,true); }else if(check_if_type_etic_previous_chunk(ET_PEDICE,res_exist) && res_exist){ break_sub_super(ET_APICE,breaking_type,false); }else{ break_sub_or_super(ET_APICE,breaking_type); } }else if(cur_type==ET_PEDICE){ if(check_if_type_etic_next_chunk(ET_APICE,res_exist) && res_exist){ break_sub_super(ET_PEDICE,breaking_type,true); }else if(check_if_type_etic_previous_chunk(ET_APICE,res_exist) && res_exist){ break_sub_super(ET_PEDICE,breaking_type,false); }else{ break_sub_or_super(ET_PEDICE,breaking_type); } }else{ break_normal_str(breaking_type); } } bool etichetta::break_and_split_normal_str(etichetta** left , etichetta** right){ bool res=false; if((*left)!=0 && (*right)!=0){ delete (*left); delete (*right); } (*left)=new etichetta(); (*right)=new etichetta(); etichetta copy_lab(this); (*(*left))=copy_lab; (*(*right))=copy_lab; (*left)->elimina(); (*right)->elimina(); copy_lab.break_normal_str(ET_APICE); std::vector < std::pair > the_vec_str=copy_lab.vec_str(); std::pair c_pos(0,0); copy_lab.get_cursor_position(&c_pos); if(copy_lab.type_etic_at_cur_pos()==ET_APICE && the_vec_str[c_pos.first].first==""){ for(unsigned int i=0;i(c_pos.first)){ (*left)->aggiungi(the_vec_str[i].first,the_vec_str[i].second); }else if(i>static_cast(c_pos.first)){ (*right)->aggiungi(the_vec_str[i].first,the_vec_str[i].second); } } } if((*left)->size_str() > 0 && (*right)->size_str() >0){ res=true; } return res; } void etichetta::break_normal_str(int type_to_insert){ std::vector < std::pair > the_vec_str=vec_str(); int cur_type=type_etic_at_cur_pos(); if(cur_type==ET_STR){ if(type_to_insert==ET_APICE || type_to_insert==ET_PEDICE ){ std::string rem=the_vec_str[_cursor_pos.first].first; std::string new_chunk=the_vec_str[_cursor_pos.first].first; rem.erase(_cursor_pos.second); new_chunk=new_chunk.substr(_cursor_pos.second); elimina(_cursor_pos.first,false); insert(rem, ET_STR, _cursor_pos.first,false); _cursor_pos.first++; _cursor_pos.second=0; insert("", type_to_insert, _cursor_pos.first,false); insert(new_chunk, ET_STR, _cursor_pos.first+1,false); } } } void etichetta::break_sub_or_super(int me, int type_to_insert){ std::vector < std::pair > the_vec_str=vec_str(); if((me==ET_APICE || me==ET_PEDICE) && type_to_insert == ET_STR ){ std::string rem_me(the_vec_str[_cursor_pos.first].first); std::string new_chunk_me(the_vec_str[_cursor_pos.first].first); rem_me.erase(_cursor_pos.second); new_chunk_me=new_chunk_me.substr(_cursor_pos.second); elimina(_cursor_pos.first,false); if(rem_me!=""){ insert(rem_me,me,_cursor_pos.first,false); _cursor_pos.first++; } insert("", type_to_insert, _cursor_pos.first,false); if(new_chunk_me!=""){ insert(new_chunk_me,me,_cursor_pos.first+1,false); } } } void etichetta::break_sub_super(int me, int type_to_insert,bool is_after){ std::vector < std::pair > the_vec_str=vec_str(); if((me==ET_APICE || me==ET_PEDICE) && type_to_insert == ET_STR ){ int other=-1; if(me==ET_APICE){ other=ET_PEDICE; }else{ other=ET_APICE; } bool res_exist=false; bool next_ok=false; if(is_after){ next_ok=check_if_type_etic_next_chunk(other,res_exist); }else{ next_ok=check_if_type_etic_previous_chunk(other,res_exist); } if(next_ok){ int delta_first_pos_cur=0; if(is_after){ delta_first_pos_cur=1; }else{ delta_first_pos_cur=-1; } std::string rem_me(the_vec_str[_cursor_pos.first].first); std::string rem_other(the_vec_str[_cursor_pos.first+delta_first_pos_cur].first); std::string new_chunk_me(the_vec_str[_cursor_pos.first].first); std::string new_chunk_other(the_vec_str[_cursor_pos.first+delta_first_pos_cur].first); /** v 2 1 aaaa S pppp 3 */ rem_me.erase(_cursor_pos.second); if(_cursor_pos.second > the_vec_str=vec_str(); vector < pair >::iterator iniz=_vec_str.begin(); iniz+=_cursor_pos.first; bool res_merged=false; if(_cursor_pos.first < static_cast(_vec_str.size())){ bool pre_exist=false; if(check_if_type_etic_previous_chunk((*iniz).second,pre_exist) && pre_exist ){ std::string bef=(*(iniz-1)).first; std::string nw=bef+(*iniz).first; (*(iniz-1)).first=nw; set_cursor_position(_cursor_pos.first-1, bef.size()); elimina(_cursor_pos.first+1); res_merged=true;; } if(reset_cur){ reset_cursor_if_outside_limits(); } return res_merged; }else{ string exc="Errore where < _vec_str.size() in class etichetta. Function: " + string(__FUNCTION__); throw out_of_range(exc); } } void etichetta::merge_orphan_pedic_apic(int from, int type,bool& has_merged){ std::vector < std::pair > the_vec_str=vec_str(); if(from >=0 && from < static_cast(the_vec_str.size()-1)){ if(check_if_type_etic(type,from)){ std::string str_to_merge=the_vec_str[from].first; for(int i=from+1;i< static_cast(the_vec_str.size());i++){ if(check_if_type_etic(ET_STR,i)){ merge_orphan_pedic_apic(i,type,has_merged); break; }else if(check_if_type_etic(type,i)){ str_to_merge+=the_vec_str[i].first; elimina(i, false); the_vec_str=vec_str(); i--; } } sostituisci(str_to_merge,type,from,true); has_merged=true; }else{ merge_orphan_pedic_apic(from+1,type,has_merged); } } } void etichetta::delete_orphan_pedic_apic(int from,int type){ std::vector < std::pair > the_vec_str=vec_str(); if(from >=0 && from < static_cast(the_vec_str.size())){ for(int i=from;i< static_cast(the_vec_str.size());i++){ if(check_if_type_etic(type,i)){ try{ if(!check_if_type_etic(ET_STR,i-1) && !check_if_type_etic(ET_STR,i-2) ){ elimina(i, false); the_vec_str=vec_str(); i--; } }catch (out_of_range e){ elimina(i, false); the_vec_str=vec_str(); i--; } } } } } void etichetta::clean_string_after_delete(){ std::vector < std::pair > the_vec_str=vec_str(); int old_type=type_etic_at_cur_pos(); bool old_is_last =false; if(_cursor_pos.first == static_cast(the_vec_str.size()-1)){ old_is_last=true; } elimina(_cursor_pos.first,true); bool has_merged=false; merge_orphan_pedic_apic(0, ET_APICE, has_merged); has_merged=false; merge_orphan_pedic_apic(0, ET_PEDICE, has_merged); delete_orphan_pedic_apic(0,ET_APICE); delete_orphan_pedic_apic(0,ET_PEDICE); reset_cursor_if_outside_limits(true); the_vec_str=vec_str(); if(old_type==ET_APICE || old_type==ET_PEDICE){ if(_cursor_pos.first(the_vec_str.size()-1)){ _cursor_pos.first--; }else if(check_if_type_etic(ET_STR,_cursor_pos.first)){ if(!old_is_last){ _cursor_pos.first--; } } reset_cursor_if_outside_limits(true); while(_cursor_pos.first >0 && !check_if_type_etic(ET_STR,_cursor_pos.first)){ _cursor_pos.first--; } } if(the_vec_str.size()>0){ _cursor_pos.second=(the_vec_str[_cursor_pos.first].first).size(); } } bist-0.5.2/src/bond_prop.cpp0000644000175000017500000002041611270362673014326 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void legame_prop_scale_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); legame_prop* p=dynamic_cast(w->parent()); p->_scale=sl->value(); } void legame_prop_ok_cb(Fl_Widget* w, void* d){ legame_prop* p=dynamic_cast((w->parent())); Fl_Group* o=dynamic_cast(p->child(1)); for(int i=0;ichildren();i++){ Fl_Round_Button* bt=dynamic_cast(o->child(i)); if(bt->value()){ int ritval=-1; switch(i){ case 0: ritval=LEGAME_SINGOLO; break; case 1: ritval=LEGAME_DOPPIO; break; case 2: ritval=LEGAME_TRIPLO; break; case 3: ritval=LEGAME_DOPPIO_TRATTEGGIATO; break; case 4: ritval= LEGAME_ESTERNO; break; case 5: ritval=LEGAME_ESTERNO_OPP ; break; case 6: ritval=LEGAME_INTERNO ; break; case 7: ritval=LEGAME_INTERNO_OPP ; break; case 8: ritval=LEGAME_TRATTEGGIATO ; break; case 9: ritval=LEGAME_ISPESSITO ; break; case 10: ritval=LEGAME_STEREO_SCON ; break; } p->_radioval=ritval; } } p->hide(); } void legame_prop_color_cb(Fl_Widget* w, void* d){ legame_prop* p=dynamic_cast(w->parent()); unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); if(pushd){ p->_r=r; p->_g=g; p->_b=b; } } void legame_prop_cancel_cb(Fl_Widget* w, void* d){ legame_prop* p=dynamic_cast(w->parent()); p->_radioval=-1; p->_r=-1; p->_g=-1; p->_b=-1; p->_scale=1; p->hide(); } legame_prop::legame_prop(int x,int y,int w, int h, char* tit,int quale) :Fl_Window(x,y,w,h,tit), _r(-1), _g(-1), _b(-1), _scale(1) { static const int gap_box_windows=5; static const int gap_widget=5; static const int button_width=80; static const int button_height=25; static const int round_button_w=w-5*gap_box_windows; { Fl_Box* o = new Fl_Box(gap_box_windows, 4*gap_box_windows, w-2*gap_box_windows,245, _("Bond type")); o->box(FL_ENGRAVED_BOX); o->align(FL_ALIGN_TOP_LEFT); } { Fl_Group* o = new Fl_Group(5, 25, 255, 245); { Fl_Round_Button* o = new Fl_Round_Button(15, 35, round_button_w, button_height, _("Single bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 55, round_button_w, button_height, _("Double bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 75, round_button_w, button_height, _("Triple bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 95, round_button_w, button_height, _("Double dashed bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 115, round_button_w, button_height, _("Stereospecific \"up\" bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 134, round_button_w, button_height, _("Stereospecific \"up\" reverse bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 155, round_button_w, button_height, _("Stereospecific \"down\" bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 176, 245, button_height, _("Stereospecific \"down\" reverse bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 195, round_button_w, button_height, _("Dashed bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 215, round_button_w, button_height, _("Bold bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } { Fl_Round_Button* o = new Fl_Round_Button(15, 235, round_button_w, button_height, _("Unknown stereochemistry bond")); o->type(102); o->down_box(FL_ROUND_DOWN_BOX); } o->end(); if(qualechildren()){ Fl_Round_Button* bt=dynamic_cast(o->child(trasl_rev_tipo_leg(quale))); if(bt!=NULL){ bt->set(); } } } Fl_Box* scale_box = new Fl_Box(gap_box_windows, 285, w-button_width - gap_box_windows - gap_widget, button_height+static_cast(1/4.* button_height), _("Scale")); scale_box->box(FL_ENGRAVED_BOX); scale_box->align(FL_ALIGN_TOP_LEFT); Fl_Value_Slider* scale_gap = new Fl_Value_Slider(scale_box->x()+gap_widget, scale_box->y()+gap_widget, scale_box->w()-2*gap_widget, scale_box->h()-2*gap_widget, _("Arrow gap:")); scale_gap->label(""); scale_gap->type(FL_HORIZONTAL); scale_gap->step(0.01); scale_gap->align(FL_ALIGN_LEFT); scale_gap->range(0.001, 4); scale_gap->precision(2); scale_gap->value(1); scale_gap->callback(legame_prop_scale_cb); Fl_Button* color_button = new Fl_Button(w - button_width - gap_box_windows, scale_box->y(), button_width, scale_box->h(), _("Color")); color_button->callback(legame_prop_color_cb); { Fl_Button* o = new Fl_Button(w/2-button_width, 327, button_width, button_height, _("Cancel")); o->callback(legame_prop_cancel_cb); } { Fl_Return_Button* o = new Fl_Return_Button(w/2, 327, button_width, button_height, _("OK")); o->callback(legame_prop_ok_cb); } end(); set_modal(); dialog_position(this); } int trasl_rev_tipo_leg(int quale){ int ritval=-1; switch(quale){ case LEGAME_SINGOLO: ritval=0; break; case LEGAME_DOPPIO: case LEGAME_DOPPIO_1: case LEGAME_DOPPIO_2: ritval=1; break; case LEGAME_TRIPLO: ritval=2; break; case LEGAME_DOPPIO_TRATTEGGIATO: case LEGAME_DOPPIO_TRATTEGGIATO_1: case LEGAME_DOPPIO_TRATTEGGIATO_2: ritval=3; break; case LEGAME_ESTERNO: ritval=4; break; case LEGAME_ESTERNO_OPP: ritval=5; break; case LEGAME_INTERNO: ritval=6; break; case LEGAME_INTERNO_OPP: ritval=7; break; case LEGAME_TRATTEGGIATO: ritval=8; break; case LEGAME_ISPESSITO: ritval=9; break; case LEGAME_STEREO_SCON: ritval= 10; break; default: ritval=0; } return ritval; } vector bond_win(int quale){ legame_prop p(397, 330, 550, 360,_("Bond properties"),quale); p.show(); while(p.shown()){ Fl::wait(); } vector risul; risul.push_back(p._r); risul.push_back(p._g); risul.push_back(p._b); risul.push_back(p._radioval); risul.push_back(p._scale); return risul; } bist-0.5.2/src/atomo.cpp0000644000175000017500000003024611412200237013446 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern Preferences __pref; /*************utilita'*************/ bool ordina_legame_id_atomo(legame uno, legame altro){ return uno.id_atomo() < altro.id_atomo(); } bool ordina_legame_id_legame(legame uno, legame altro){ return uno.id_legame() < altro.id_legame(); } bool ordina_atomo_id(atomo uno, atomo altro){ return uno.id() < altro.id(); } /**************atomo****************/ atomo::atomo() :_visitato(false), _tipo_atomo(DEFAULT_TYPE_ATOMO), _cr(0), _cg(0), _cb(0), _massa(14), _cariche(0), _position_charge(R_TOP), _doppietti(0), _el_spaiati(0), _pos_x(0), _pos_y(0), _pos_z(0), _can_attach(false) { _lati_liberi[0]=true; _lati_liberi[1]=true; _lati_liberi[2]=true; _lati_liberi[3]=true; } atomo& atomo::operator=(const atomo& altro){ _visitato=altro._visitato; _id=altro._id; _tipo_atomo=altro._tipo_atomo; _cr=altro._cr; _cg=altro._cg; _cb=altro._cb; _massa=altro._massa; _etich=altro._etich; _cariche=altro._cariche; _position_charge=altro._position_charge; _doppietti=altro._doppietti; _el_spaiati=altro._el_spaiati; _pos_x=altro._pos_x; _pos_y=altro._pos_y; _pos_z=altro._pos_z; _legami=altro._legami; _arrivati=altro._arrivati; _can_attach=altro._can_attach; genitore::_il_genitore=altro.genitore::_il_genitore; for(int i=0;i<4;i++){ _lati_liberi[i]=altro._lati_liberi[i]; } return (*this); } atomo::atomo(const atomo& altro) :_visitato(altro._visitato), _id(altro._id), _tipo_atomo(altro._tipo_atomo), _cr(altro._cr), _cg(altro._cg), _cb(altro._cb), _massa(altro._massa), _etich(altro._etich), _cariche(altro._cariche), _position_charge(altro._position_charge), _doppietti(altro._doppietti), _el_spaiati(altro._el_spaiati), _pos_x(altro._pos_x), _pos_y(altro._pos_y), _pos_z(altro._pos_z), _legami(altro._legami), _arrivati(altro._arrivati), _can_attach(altro._can_attach) { genitore::_il_genitore=altro.genitore::_il_genitore; for(int i=0;i<4;i++){ _lati_liberi[i]=altro._lati_liberi[i]; } } atomo::~atomo(){ } bool atomo::can_attach(){ return _can_attach; } void atomo::can_attach(bool nw){ _can_attach=nw; } int atomo::id_gruppo(){ gruppo* grp=dynamic_cast(_il_genitore); if(grp){ return grp->id(); }else{ return -1; } } void atomo::aggiungi_genitore(genitore* gentr){ _il_genitore=gentr; } genitore* atomo::ritorna_genitore(){ return _il_genitore; } bool atomo::is_son(atomo atm){ bool res=false; for(unsigned int i=0;i<_legami.size();i++){ if(_legami[i].id_atomo()==atm.id()){ res=true; } } return res; } bool atomo::dentro_bb(float x, float y, float w , float h){ if(pos_x()>x && pos_x()y && pos_y()(_il_genitore); etichetta cp_etic=_etich; grp->allinea_etichetta(cp_etic,(*this)); int w=cp_etic.w(); int h=cp_etic.h(); float st_xpos=cp_etic.x(); float st_ypos=cp_etic.y(); float ics_e=st_xpos;//_etich.x()+pos_x()-_etich.w()/2; float ips_e=st_ypos;//_etich.y()+pos_y()-_etich.h()/2; float w_e=w; float h_e=h; if(posx_m > ics_e && posx_m < ics_e+w_e && posy_m > ips_e && posy_m < ips_e+h_e){ return id(); }else{ return -1; } } void atomo::libera_tutti(){ for(int i=0;i<4;i++){ _lati_liberi[i]=true; } } bool* atomo::ritorna_lati_liberi(){ return _lati_liberi; } /** *Setta a false tutte le visite. */ void atomo::reset_arrivati(){ for(unsigned int i=0; i<_arrivati.size();i++){ _arrivati[i]=false; } } bool atomo::e_arrivato(int altro){ int pos_atm=-1; for(unsigned int i=0;i<_legami.size();i++){ if(_legami[i].id_atomo()==altro){ pos_atm=i; break; } } if( ritorna_arrivati(pos_atm) ){ return true; }else{ return false; } } /** *Setta a true le vistite in posizione pos. */ void atomo::setta_arrivati(int ida){ for(unsigned int i=0;i<_arrivati.size();i++){ if(_legami[i].id_atomo()==ida){ _arrivati[i]=true; } } } bool atomo::ritorna_arrivati(int pos){ return _arrivati[pos]; } void atomo::costruisci_arrivati(){ _arrivati.erase(_arrivati.begin(),_arrivati.end()); for(unsigned int i=0;i<_legami.size();i++){ _arrivati.push_back(false); } } /** *\return true se altro ha lo stesso id di quest'istanza **/ bool atomo::operator==(atomo altro){ if(id()==altro.id()){ return true; }else{ return false; } } /*setta i valori*/ void atomo::visitato(bool nw){ _visitato=nw; } void atomo::id(int nw_id){ _id=nw_id; } void atomo::tipo_atomo(int nw_tipo_atomo){ _tipo_atomo=nw_tipo_atomo; } void atomo::etich(etichetta nw){ _etich=nw; } void atomo::cariche(int nw_cariche){ _cariche=nw_cariche; } void atomo::position_charge(int nw_pos){ if(nw_pos<=ATOM_MAX_POSITION_CHARGE && nw_pos >= 0){ _position_charge=nw_pos; }else{ _position_charge=L_TOP; } } void atomo::doppietti(int nw_doppietti){ _doppietti=nw_doppietti; } void atomo::el_spaiati(int nw_el_spaiati){ _el_spaiati=nw_el_spaiati; } void atomo::massa(int nw){ _massa=nw; } void atomo::cr(int nw){ _cr=nw; } void atomo::cg(int nw){ _cg=nw; } void atomo::cb(int nw){ _cb=nw; } void atomo::pos_x(float nw_pos_x){ _pos_x=nw_pos_x; } void atomo::pos_y(float nw_pos_y){ _pos_y=nw_pos_y; } void atomo::pos_z(float nw_pos_z){ _pos_z=nw_pos_z; } /*recupera i valori*/ bool atomo::visitato(){ return _visitato; } etichetta atomo::etich(){ return _etich; } etichetta& atomo::etich_ref(){ return _etich; } etichetta* atomo::etich_punt(){ return &_etich; } int atomo::id(){ return _id ; } int atomo::tipo_atomo(){ return _tipo_atomo; } int atomo::cariche(){ return _cariche; } int atomo::position_charge(){ return _position_charge; } int atomo::doppietti(){ return _doppietti; } int atomo::el_spaiati(){ return _el_spaiati; } int atomo::massa(){ return _massa; } int atomo::cr(){ return _cr; } int atomo::cg(){ return _cg; } int atomo::cb(){ return _cb; } float atomo::pos_x(){ if(cairo_t_singleton::can_export()){ return phys_pos_x(); }else{ return visual_pos_x(); } } float atomo::phys_pos_x(){ return _pos_x; } float atomo::visual_pos_x(){ return phys_pos_x() * __pref.getZoom(); } float atomo::pos_y(){ if(cairo_t_singleton::can_export()){ return phys_pos_y(); }else{ return visual_pos_y(); } } float atomo::visual_pos_y(){ return phys_pos_y() * __pref.getZoom(); } float atomo::phys_pos_y(){ return _pos_y; } float atomo::pos_z(){ return _pos_z; } float atomo::visual_pos_z(){ return pos_z(); //Va bene o anche la componente z va scalata? } float atomo::phys_pos_z(){ return pos_z(); //Va bene o anche la componente z va scalata? } void atomo::disegna(){ cout << "disegnare la molecola e' compito del gruppo di appartenenza" << endl; } void atomo::trasla(float dx, float dy){ pos_x(descale(pos_x()+dx)); pos_y(descale(pos_y()+dy)); } void atomo::phys_translate(float dx, float dy){ pos_x(phys_pos_x()+dx); pos_y(phys_pos_y()+dy); } void atomo::scale(float sc){ pos_x(phys_pos_x()*sc); pos_y(phys_pos_y()*sc); } void atomo::ruota(float xpiv, float ypiv, float angl){ xpiv/=__pref.getZoom(); ypiv/=__pref.getZoom(); float x=phys_pos_x()-xpiv; float y=phys_pos_y()-ypiv; float xp=x*cos(angl)+y*sin(angl); float yp=y*cos(angl)-x*sin(angl); pos_x(xp+xpiv); pos_y(yp+ypiv); } void atomo::aggiungi_legame(int nw_leg_id_atomo, int nw_leg_id_legame, int nw_leg_tipo_legame,int nwcr, int nwcg , int nwcb){ legame nuovo(nw_leg_id_atomo,nw_leg_id_legame,nw_leg_tipo_legame, nwcr,nwcg,nwcb); _legami.push_back(nuovo); sort(_legami.begin(),_legami.begin(),ordina_legame_id_legame); } void atomo::aggiungi_legame(int nw_leg_id_atomo, int nw_leg_tipo_legame,int nwcr, int nwcg , int nwcb){ int id_leg=0; if(_legami.size()>0){ id_leg=_legami.back().id_legame()+1; } legame nuovo(nw_leg_id_atomo,id_leg,nw_leg_tipo_legame, nwcr,nwcg,nwcb); _legami.push_back(nuovo); sort(_legami.begin(),_legami.begin(),ordina_legame_id_legame); } void atomo::elimina_legame(int id){ vector::iterator iniz=_legami.begin(); vector::iterator fin=_legami.end(); while(iniz!=fin){ if((*iniz).id_atomo()==id){ _legami.erase(iniz); } iniz++; } } void atomo::elimina_legami(){ _legami.erase(_legami.begin(),_legami.end()); } void atomo::modifica_legame(int id_target, int nw_leg_id_atomo, int nw_leg_id_legame, int nw_leg_tipo_legame, int nwcr, int nwcg, int nwcb){ for(unsigned int i=0; i<_legami.size();i++){ if(_legami[i].id_atomo()==id_target){ _legami[i].id_legame(nw_leg_id_legame); _legami[i].tipo_legame(nw_leg_tipo_legame); _legami[i].cr(nwcr); _legami[i].cg(nwcg); _legami[i].cb(nwcb); } } } void atomo::modifica_legame(int id_target, int* nw_leg_id_atomo, int* nw_leg_id_legame, int* nw_leg_tipo_legame, int* nwcr, int* nwcg, int* nwcb){ for(unsigned int i=0; i<_legami.size();i++){ if(_legami[i].id_atomo()==id_target){ if(nw_leg_id_legame!=NULL){ _legami[i].id_legame(*nw_leg_id_legame); } if(nw_leg_tipo_legame!=NULL){ _legami[i].tipo_legame(*nw_leg_tipo_legame); } if(nwcr!=NULL){ _legami[i].cr(*nwcr); } if(nwcg!=NULL){ _legami[i].cg(*nwcg); } if(nwcb!=NULL){ _legami[i].cb(*nwcb); } } } } legame* atomo::find_leg(int id){ vector::iterator first=primo_leg(); vector::iterator last=ultimo_leg(); legame* res=NULL; while(first!=last){ if((*first).id_legame()==id){ res=&(*first); break; } first++; } return res; } vector::iterator atomo::primo_leg(){ return _legami.begin(); } /** *\return ritorna un iterator all'ultimo elemento del vettore *contenente i legami. */ vector::iterator atomo::ultimo_leg(){ return _legami.end(); } std::vector atomo::get_all_children(){ std::vector res; vector::iterator fst=primo_leg(); vector::iterator end=ultimo_leg(); gruppo* par=dynamic_cast(ritorna_genitore()); while(fst!=end){ int id=(*fst).id_atomo(); atomo* atm=par->find_atomo_id(id); res.push_back(atm); fst++; } return res; } unsigned int atomo::bond_number(){ return _legami.size(); } unsigned int atomo::bond_number_not_visited(){ gruppo* grp=dynamic_cast(_il_genitore); vector::iterator first=primo_leg(); vector::iterator last=ultimo_leg(); unsigned int res=0; while(first!=last){ int id_atom_bond=(*first).id_atomo(); atomo* bonded=grp->find_atomo_id(id_atom_bond); if( bonded!=0 && !bonded->visitato() ){ res++; } first++; } return res; } bist-0.5.2/src/prefs.cpp0000644000175000017500000005305511224104617013457 0ustar cagecage#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include Preferences::Preferences() { Defaults(); } void Preferences::Defaults() { fixed_arrow = true; arrow_fixedlength = LENGHT_BOND; arrow_fixedangle = ANGL_BOND; fixed_bond = true; fix_hydrogens = true; paper_size = PAGE_A4; paper_orient = PAGE_PORTRAIT; paper_width = PAPER_W_STD; paper_height = PAPER_H_STD; units = PIXELS; snapgrid = GRID_NONE; splash = true; dykcount = 0; zoom = 1.0; magnetic_point_gap=0; mono_font="Mono"; sans_font="Sans"; serif_font="Serif"; mono_font_bold="Mono Bold"; sans_font_bold="Sans Bold"; serif_font_bold="Serif Bold"; mono_font_italic="Mono Italic"; sans_font_italic="Sans Italic"; serif_font_italic="Serif Italic"; mono_font_bold_italic="Mono Bold Italic"; sans_font_bold_italic="Sans Bold Italic"; serif_font_bold_italic="Serif Bold Italic"; symbol_font="Symbol"; dingbats_font="Dingbats"; gridspace = 25; gridmode = GRID_NONE; drawgrid = GRID_NONE; bond_fixedlength = LENGHT_BOND; bond_fixedangle = ANGL_BOND; dbond_offset = SPACE_BOND; tratteggio_legame=TRATTEGGIO_LEGAME; larg_max_cuneo = LARG_MAX_CUNEO; larg_min_cuneo = LARG_MIN_CUNEO; width_single_bond=LARG_SINGLE_BOND; sensib_leg=SENSIB_LEG; arr_w = ARR_W; arr_h =ARR_H; arr_gap=ARR_GAP; multiple_bond_gap= MULTIPLE_BOND_GAP; ampiezza_stereo_scon = AMPIEZZA_STEREO_SCON; frequenza_stereo_scon = FREQUENZA_STEREO_SCON; num_barrette_stereo_down = NUM_BARRETTE_STEREO_DOWN; } void Preferences::setFile(std::string fn, bool fb) { fileName = fn; fallback = fb; } void Preferences::setSaveFile(std::string fn) { saveFileName = fn; } bool Preferences::LoadPrefs() { std::ifstream fin(fileName.c_str()); if(!fin){ cout << _("file ") << fileName.c_str() << _("do not exists") << endl; } /* if (fin.open(IO_ReadOnly) == false) return false; */ // QTextStream tin(&fin); std::string line; do { getline(fin,line,'\n'); //tin.readLine(); //cout << PREF: << line << endl; if (line.find(PREFS_FIXED_ARROW) !=std::string::npos) { if (line.find(PREFS_TRUE)){ fixed_arrow = true; }else{ fixed_arrow = false; } } if (line.find(PREFS_FIXED_BOND) !=std::string::npos) { if (line.find(PREFS_TRUE) !=std::string::npos) fixed_bond = true; else fixed_bond = false; } if (line.find(PREFS_FIX_HYDROGENS) !=std::string::npos) { if (line.find(PREFS_TRUE) !=std::string::npos ) fix_hydrogens = true; else fix_hydrogens = false; } if (line.find(PREFS_SPLASH) !=std::string::npos) { if (line.find(PREFS_TRUE) !=std::string::npos){ splash = true; }else{ splash = false; } } if (line.find(PREFS_ARROW_LENGTH) !=std::string::npos) { arrow_fixedlength = strtof(line.substr(strlen (PREFS_ARROW_LENGTH)).c_str(),NULL); } if (line.find(PREFS_ARROW_ANGLE) !=std::string::npos) { arrow_fixedangle = strtof(line.substr(strlen(PREFS_ARROW_ANGLE)).c_str(),NULL); } if (line.find(PREFS_BOND_LENGTH) !=std::string::npos) { bond_fixedlength = strtof(line.substr(strlen(PREFS_BOND_LENGTH)).c_str(),NULL); } if (line.find(PREFS_BOND_ANGLE) !=std::string::npos) { bond_fixedangle = strtof(line.substr(strlen(PREFS_BOND_ANGLE)).c_str(),NULL); } if (line.find(PREFS_DBOND_OFFSET) !=std::string::npos) { dbond_offset = strtof(line.substr(strlen(PREFS_DBOND_OFFSET)).c_str(),NULL); } if(line.find(PREFS_ARR_W) !=std::string::npos) { arr_w = strtof(line.substr(strlen(PREFS_ARR_W)).c_str(),NULL); } if(line.find(PREFS_ARR_H) !=std::string::npos) { arr_h = strtof(line.substr(strlen(PREFS_ARR_H)).c_str(),NULL); } if(line.find(PREFS_ARR_GAP) !=std::string::npos) { arr_gap = strtof(line.substr(strlen(PREFS_ARR_GAP)).c_str(),NULL); } if(line.find(PREFS_MULTIPLE_BOND_GAP) !=std::string::npos) { multiple_bond_gap = strtof(line.substr(strlen(PREFS_MULTIPLE_BOND_GAP)).c_str(),NULL); } if (line.find(PREFS_SENSIB_LEG) !=std::string::npos) { sensib_leg = static_cast(strtol(line.substr(strlen(PREFS_SENSIB_LEG)).c_str() ,NULL,0)); } if(line.find(PREFS_LARG_MAX_CUNEO) !=std::string::npos) { larg_max_cuneo = strtof(line.substr(strlen(PREFS_LARG_MAX_CUNEO)).c_str(),NULL); } if(line.find(PREFS_LARG_MIN_CUNEO) !=std::string::npos) { larg_max_cuneo = strtof(line.substr(strlen(PREFS_LARG_MIN_CUNEO)).c_str(),NULL); } if(line.find(PREFS_AMPIEZZA_STEREO_SCON) !=std::string::npos) { ampiezza_stereo_scon = strtof(line.substr(strlen(PREFS_AMPIEZZA_STEREO_SCON)).c_str(),NULL); } if(line.find(PREFS_FREQUENZA_STEREO_SCON) !=std::string::npos) { frequenza_stereo_scon = strtof(line.substr(strlen(PREFS_FREQUENZA_STEREO_SCON)).c_str(), NULL); } if(line.find(PREFS_TRATTEGGIO_LEGAME) !=std::string::npos) { tratteggio_legame = static_cast(strtol(line.substr(strlen(PREFS_TRATTEGGIO_LEGAME)).c_str(), NULL,0)); } //int if (line.find(PREFS_NUM_BARRETTE_STEREO_DOWN) !=std::string::npos) { num_barrette_stereo_down = static_cast(strtol(line.substr(strlen(PREFS_NUM_BARRETTE_STEREO_DOWN)).c_str(), NULL,0)); } if (line.find(PREFS_MAGNETIC_POINT_GAP) !=std::string::npos) { magnetic_point_gap = static_cast(strtol(line.substr(strlen(PREFS_MAGNETIC_POINT_GAP)).c_str(),NULL,0)); } if (line.find(PREFS_SANS_FONT ) !=std::string::npos) { sans_font = trim(line.substr(strlen(PREFS_SANS_FONT))); } if (line.find(PREFS_MONO_FONT ) !=std::string::npos) { mono_font = trim(line.substr(strlen(PREFS_MONO_FONT))); } if (line.find(PREFS_SERIF_FONT ) !=std::string::npos) { serif_font = trim(line.substr(strlen(PREFS_SERIF_FONT))); } if (line.find(PREFS_SANS_FONT_ITALIC ) !=std::string::npos) { sans_font_italic = trim(line.substr(strlen(PREFS_SANS_FONT_ITALIC))); } if (line.find(PREFS_MONO_FONT_ITALIC ) !=std::string::npos) { mono_font_italic = trim(line.substr(strlen(PREFS_MONO_FONT_ITALIC))); } if (line.find(PREFS_SERIF_FONT_ITALIC ) !=std::string::npos) { serif_font_italic = trim(line.substr(strlen(PREFS_SERIF_FONT_ITALIC))); } if (line.find(PREFS_SANS_FONT_BOLD ) !=std::string::npos) { sans_font_bold = trim(line.substr(strlen(PREFS_SANS_FONT_BOLD))); } if (line.find(PREFS_MONO_FONT_BOLD ) !=std::string::npos) { mono_font_bold = trim(line.substr(strlen(PREFS_MONO_FONT_BOLD))); } if (line.find(PREFS_SERIF_FONT_BOLD ) !=std::string::npos) { serif_font_bold = trim(line.substr(strlen(PREFS_SERIF_FONT_BOLD))); } if (line.find(PREFS_SANS_FONT_BOLD_ITALIC ) !=std::string::npos) { sans_font_bold_italic = trim(line.substr(strlen(PREFS_SANS_FONT_BOLD_ITALIC))); } if (line.find(PREFS_MONO_FONT_BOLD_ITALIC ) !=std::string::npos) { mono_font_bold_italic = trim(line.substr(strlen(PREFS_MONO_FONT_BOLD_ITALIC))); } if (line.find(PREFS_SERIF_FONT_BOLD_ITALIC ) !=std::string::npos) { serif_font_bold_italic = trim(line.substr(strlen(PREFS_SERIF_FONT_BOLD_ITALIC))); } if (line.find(PREFS_SYMBOL_FONT ) !=std::string::npos) { symbol_font = trim(line.substr(strlen(PREFS_SYMBOL_FONT))); } if (line.find(PREFS_DINGBATS_FONT ) !=std::string::npos) { symbol_font = trim(line.substr(strlen(PREFS_DINGBATS_FONT))); } if (line.find(PREFS_PAPER_SIZE) !=std::string::npos) { paper_size = static_cast(strtol(line.substr(strlen(PREFS_PAPER_SIZE)).c_str(),NULL,0)); } if (line.find(PREFS_PAPER_ORIENT) !=std::string::npos) { paper_orient = static_cast(strtol(line.substr(strlen(PREFS_PAPER_ORIENT)).c_str(),NULL,0)); } if (line.find(PREFS_PAPER_WIDTH) !=std::string::npos) { paper_width = static_cast(strtol(line.substr(strlen(PREFS_PAPER_WIDTH)).c_str(),NULL,0)); } if (line.find(PREFS_PAPER_HEIGHT) !=std::string::npos) { paper_height = static_cast(strtol(line.substr(strlen(PREFS_PAPER_HEIGHT)).c_str(),NULL,0)); } if (line.find(PREFS_UNITS) !=std::string::npos) { units = static_cast(strtol(line.substr(strlen(PREFS_UNITS)).c_str(),NULL,0)); } if (line.find(PREFS_DRAWGRID) !=std::string::npos) { drawgrid = static_cast(strtol(line.substr(strlen(PREFS_DRAWGRID)).c_str(),NULL,0)); } if (line.find(PREFS_SNAPGRID) !=std::string::npos) { snapgrid = static_cast(strtol(line.substr(strlen(PREFS_SNAPGRID)).c_str(),NULL,0)); } if (line.find(PREFS_DYKCOUNT) !=std::string::npos) { dykcount = static_cast(strtol(line.substr(strlen(PREFS_DYKCOUNT)).c_str(),NULL,0)); } if (line.find(PREFS_GRIDMODE) !=std::string::npos) { gridmode = static_cast(strtol(line.substr(strlen(PREFS_GRIDMODE)).c_str(),NULL,0)); } if (line.find(PREFS_GRIDSPACE) !=std::string::npos) { gridspace = static_cast(strtol(line.substr(strlen(PREFS_GRIDSPACE)).c_str(),NULL,0)); } if(line.find(PREFS_WIDTH_SINGLE_BOND) !=std::string::npos) { width_single_bond=strtof(line.substr(strlen(PREFS_WIDTH_SINGLE_BOND)).c_str(),NULL); } if(line.find(PREFS_LAST_OPENED_FILES) !=std::string::npos) { std::string all_files=line.substr(strlen(PREFS_LAST_OPENED_FILES)); std::vector v_fi; std::string regex=std::string(PREFS_TEXT_DELIM) + std::string("[^") + std::string(PREFS_TEXT_DELIM) + std::string("]*") + std::string(PREFS_TEXT_DELIM); s_regmatch(regex,all_files,v_fi,true); _last_opended_files=v_fi; for(unsigned int i=0;i<_last_opended_files.size();i++){ _last_opended_files[i]=_last_opended_files[i].substr(1,_last_opended_files[i].size()-2); } } } while (!fin.eof()); fin.close(); return true; } bool Preferences::SavePrefs() { std::ofstream tout(saveFileName.c_str()); if (fixed_arrow) tout << PREFS_FIXED_ARROW << " " << PREFS_TRUE << endl; else tout << PREFS_FIXED_ARROW << " " << PREFS_FALSE << endl; if (fixed_bond) tout << PREFS_FIXED_BOND << " " << PREFS_TRUE << endl; else tout << PREFS_FIXED_BOND << " "<< PREFS_FALSE << endl; if (fix_hydrogens) tout << PREFS_FIX_HYDROGENS << " " << PREFS_TRUE << endl; else tout << PREFS_FIX_HYDROGENS << " " << PREFS_FALSE << endl; if (splash) tout << PREFS_SPLASH << " " << PREFS_TRUE << endl; else tout << PREFS_SPLASH << " " << PREFS_FALSE << endl; tout << PREFS_DYKCOUNT << " "<< dykcount << endl; tout << PREFS_ARROW_LENGTH << " "<< arrow_fixedlength << endl; tout << PREFS_ARR_W << " "<< arr_w << endl; tout << PREFS_ARR_H << " "<< arr_h << endl; tout << PREFS_ARR_GAP << " "<< arr_gap << endl; tout << PREFS_MULTIPLE_BOND_GAP<< " " << multiple_bond_gap << endl; tout << PREFS_SENSIB_LEG << " "<< sensib_leg << endl; tout << PREFS_LARG_MAX_CUNEO << " " << larg_max_cuneo << endl; tout << PREFS_LARG_MIN_CUNEO << " " << larg_max_cuneo << endl; tout << PREFS_TRATTEGGIO_LEGAME << " "<< tratteggio_legame << endl; tout << PREFS_AMPIEZZA_STEREO_SCON << " "<< ampiezza_stereo_scon << endl; tout << PREFS_FREQUENZA_STEREO_SCON << " "<< frequenza_stereo_scon << endl; tout << PREFS_NUM_BARRETTE_STEREO_DOWN << " "<< num_barrette_stereo_down << endl; tout << PREFS_ARROW_ANGLE << " "<< arrow_fixedangle << endl; tout << PREFS_BOND_LENGTH << " "<< bond_fixedlength << endl; tout << PREFS_BOND_ANGLE << " "<< bond_fixedangle << endl; tout << PREFS_DBOND_OFFSET << " "<< dbond_offset << endl; tout << PREFS_PAPER_SIZE << " "<< paper_size << endl; tout << PREFS_PAPER_ORIENT << " "<< paper_orient << endl; tout << PREFS_PAPER_WIDTH << " "<< paper_width << endl; tout << PREFS_PAPER_HEIGHT << " "<< paper_height << endl; tout << PREFS_UNITS << " "<< units << endl; tout << PREFS_DRAWGRID << " "<< drawgrid << endl; tout << PREFS_SNAPGRID << " "<< snapgrid << endl; tout << PREFS_GRIDMODE << " "<< gridmode << endl; tout << PREFS_GRIDSPACE << " "<< gridspace << endl; tout << PREFS_MAGNETIC_POINT_GAP << " " << magnetic_point_gap << endl; tout << PREFS_SANS_FONT << " "<< sans_font << endl; tout << PREFS_MONO_FONT << " "<< mono_font << endl; tout << PREFS_SERIF_FONT << " "<< serif_font << endl; tout << PREFS_SANS_FONT_ITALIC << " "<< sans_font_italic << endl; tout << PREFS_MONO_FONT_ITALIC << " "<< mono_font_italic << endl; tout << PREFS_SERIF_FONT_ITALIC << " "<< serif_font_italic << endl; tout << PREFS_SANS_FONT_BOLD << " "<< sans_font_bold << endl; tout << PREFS_MONO_FONT_BOLD << " "<< mono_font_bold << endl; tout << PREFS_SERIF_FONT_BOLD << " "<< serif_font_bold << endl; tout << PREFS_SANS_FONT_BOLD_ITALIC << " "<< sans_font_bold_italic << endl; tout << PREFS_MONO_FONT_BOLD_ITALIC << " "<< mono_font_bold_italic << endl; tout << PREFS_SERIF_FONT_BOLD_ITALIC << " "<< serif_font_bold_italic << endl; tout << PREFS_SYMBOL_FONT << " "<< symbol_font << endl; tout << PREFS_DINGBATS_FONT << " "<< dingbats_font << endl; tout << PREFS_LAST_OPENED_FILES << " "; for(unsigned int i=0;i<_last_opended_files.size();i++){ tout << "\"" << _last_opended_files[i] << "\" "; } tout << std::endl; tout.close(); return true; } float Preferences::get_arr_w(){ return arr_w; } void Preferences::set_arr_w(float nw){ arr_w=nw; } float Preferences::get_ampiezza_stereo_scon(){ return ampiezza_stereo_scon; } void Preferences::set_ampiezza_stereo_scon(float nw){ ampiezza_stereo_scon=nw; } float Preferences::get_frequenza_stereo_scon(){ return frequenza_stereo_scon; } void Preferences::set_frequenza_stereo_scon(float nw){ frequenza_stereo_scon=nw; } float Preferences::get_arr_h(){ return arr_h; } void Preferences::set_arr_h(float nw){ arr_h=nw; } float Preferences::get_arr_gap(){ return arr_gap; } void Preferences::set_arr_gap(float nw){ arr_gap=nw; } float Preferences::get_multiple_bond_gap(){ return multiple_bond_gap; } void Preferences::set_multiple_bond_gap(float nw){ multiple_bond_gap=nw; } int Preferences::get_sensib_leg(){ return sensib_leg; } void Preferences::set_sensib_leg(int nw){ sensib_leg=nw; } int Preferences::get_tratteggio_legame(){ return tratteggio_legame; } void Preferences::set_tratteggio_legame(int nw){ tratteggio_legame=nw; } int Preferences::get_num_barrette_stereo_down(){ return num_barrette_stereo_down; } void Preferences::set_num_barrette_stereo_down(int nw){ num_barrette_stereo_down=nw; } float Preferences::get_larg_max_cuneo(){ return larg_max_cuneo; } void Preferences::set_larg_max_cuneo(float nw){ larg_max_cuneo=nw; } float Preferences::get_larg_min_cuneo(){ return larg_max_cuneo; } void Preferences::set_larg_min_cuneo(float nw){ larg_max_cuneo=nw; } float Preferences::get_width_single_bond(){ return width_single_bond; } void Preferences::set_width_single_bond(float nw){ width_single_bond=nw; } bool Preferences::getArrow_fixed() { return fixed_arrow; } double Preferences::getArrow_fixedlength() { return arrow_fixedlength; } double Preferences::getArrow_fixedangle() { return arrow_fixedangle; } bool Preferences::getBond_fixed() { return fixed_bond; } double Preferences::getBond_fixedlength() { return bond_fixedlength; } double Preferences::getBond_fixedangle() { return bond_fixedangle; } bool Preferences::getAntialiased() { return antialiased; } bool Preferences::getFixHydrogens() { return fix_hydrogens; } int Preferences::getPageSize() { return paper_size; } int Preferences::getPageOrientation() { return paper_orient; } void Preferences::setPageSize(int n1) { paper_size = n1; } void Preferences::setPageOrientation(int n1) { paper_orient = n1; } void Preferences::setFixHydrogens(bool n1) { fix_hydrogens = n1; } void Preferences::setArrow_fixed(bool n1) { fixed_arrow = n1; } void Preferences::setArrow_fixedlength(double n1) { arrow_fixedlength = n1; } void Preferences::setArrow_fixedangle(double n1) { arrow_fixedangle = n1; } void Preferences::setBond_fixed(bool n1) { fixed_bond = n1; } void Preferences::setBond_fixedlength(double n1) { bond_fixedlength = n1; } void Preferences::setBond_fixedangle(double n1) { bond_fixedangle = n1; } void Preferences::setAntialiased(bool n1) { antialiased = n1; } double Preferences::getDoubleBondOffset() { return dbond_offset; } void Preferences::setDoubleBondOffset(double n1) { dbond_offset = n1; } int Preferences::getPageWidth() { return paper_width; } void Preferences::setPageWidth(int n1) { paper_width = n1; } int Preferences::getPageHeight() { return paper_height; } void Preferences::setPageHeight(int n1) { paper_height = n1; } int Preferences::getUnits() { return units; } void Preferences::setUnits(int n1) { units = n1; } int Preferences::getGridMode() { return gridmode; } void Preferences::setGridMode(int n1) { gridmode = n1; } int Preferences::getDrawGrid() { return drawgrid; } void Preferences::setDrawGrid(int n1) { drawgrid = n1; } int Preferences::getSnapGrid() { return snapgrid; } void Preferences::setSnapGrid(int n1) { snapgrid = n1; } int Preferences::getGridSpacing() { return gridspace; } void Preferences::setGridSpacing(int n1) { gridspace = n1; } bool Preferences::getSplash() { return splash; } void Preferences::setSplash(bool n1) { splash = n1; } int Preferences::getDYKCount() { return dykcount; } void Preferences::setDYKCount(int n1) { dykcount = n1; } float Preferences::getZoom() { return zoom; } void Preferences::setZoom(float z1) { zoom = z1; } int Preferences::getMagnetic_point_gap() { return magnetic_point_gap; } void Preferences::setMagnetic_point_gap(int mag_gap) { magnetic_point_gap=mag_gap; } std::string Preferences::get_mono_font(){ return mono_font;} std::string Preferences::get_sans_font(){ return sans_font;} std::string Preferences::get_serif_font(){ return serif_font;} std::string Preferences::get_mono_font_bold(){ return mono_font_bold;} std::string Preferences::get_sans_font_bold(){ return sans_font_bold;} std::string Preferences::get_serif_font_bold(){ return serif_font_bold;} std::string Preferences::get_mono_font_italic(){ return mono_font_italic;} std::string Preferences::get_sans_font_italic(){ return sans_font_italic;} std::string Preferences::get_serif_font_italic(){ return serif_font_italic;} std::string Preferences::get_symbol_font(){ return symbol_font;} std::string Preferences::get_dingbats_font(){return dingbats_font;} std::string Preferences::get_mono_font_bold_italic(){ return mono_font_bold_italic;} std::string Preferences::get_sans_font_bold_italic(){ return sans_font_bold_italic;} std::string Preferences::get_serif_font_bold_italic(){ return serif_font_bold_italic;} void Preferences::set_mono_font(std::string nw){ mono_font=nw; } void Preferences::set_sans_font(std::string nw){ sans_font=nw; } void Preferences::set_serif_font(std::string nw){ serif_font=nw; } void Preferences::set_mono_font_bold(std::string nw){ mono_font_bold=nw; } void Preferences::set_sans_font_bold(std::string nw){ sans_font_bold=nw; } void Preferences::set_serif_font_bold(std::string nw){ serif_font_bold=nw; } void Preferences::set_mono_font_italic(std::string nw){ mono_font_italic=nw; } void Preferences::set_sans_font_italic(std::string nw){ sans_font_italic=nw; } void Preferences::set_serif_font_italic(std::string nw){ serif_font_italic=nw; } void Preferences::set_symbol_font(std::string nw){ symbol_font=nw; } void Preferences::set_dingbats_font(std::string nw){ dingbats_font=nw; } void Preferences::set_mono_font_bold_italic(std::string nw){ mono_font_bold_italic=nw; } void Preferences::set_sans_font_bold_italic(std::string nw){ sans_font_bold_italic=nw; } void Preferences::set_serif_font_bold_italic(std::string nw){ serif_font_bold_italic=nw; } std::vector Preferences::get_last_opened_files(){ std::vector saved=_last_opended_files; std::vector res; std::reverse(_last_opended_files.begin(), _last_opended_files.end()); res=_last_opended_files; _last_opended_files=saved; return res;; } void Preferences::set_last_opened_files(std::string nw){ if(_last_opended_files.size()>= Preferences::max_opened_files && _last_opended_files.size()>0){ _last_opended_files.erase(_last_opended_files.begin()); } if(std::find(_last_opended_files.begin(), _last_opended_files.end(),nw)==_last_opended_files.end()){ _last_opended_files.push_back(nw); } } const unsigned int Preferences::max_opened_files=5; bist-0.5.2/src/chain_prop.cpp0000644000175000017500000000610311257720365014464 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void chain_prop_cancel_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } void chain_prop_ok_cb(Fl_Widget* w, void* d){ chain_prop* wi=dynamic_cast(w->parent()); char* tail; float rot_deg=strtof(dynamic_cast(wi->child(2))->value(),&tail); if(tail[0]=='\0'){ wi->_angl=rot_deg*2.0*M_PI/360.0; }else{ wi->_angl=0; } long int noc=strtol(dynamic_cast(wi->child(1))->value(),&tail,10); if(tail[0]=='\0'){ wi->_no_c=static_cast(noc); }else{ wi->_no_c=3; } wi->hide(); } chain_prop::~chain_prop(){ } chain_prop::chain_prop() :Fl_Double_Window(340, 90, _("Draw chain...")), _no_c(0), _angl(0) { { Fl_Box* o = new Fl_Box(10, 5, 330, 40); o->box(FL_ENGRAVED_BOX); } { Fl_Input* o = new Fl_Input(280, 10, 40, 25, _("Number of carbon:"));//1 o->type(2); } { Fl_Input* o = new Fl_Input(80, 10, 40, 25, _("Angle:"));//2 o->type(1); } Fl_Return_Button* ok=new Fl_Return_Button(100, 50, 80, 30, _("OK")); ok->callback(chain_prop_ok_cb); add(ok); Fl_Button* c=new Fl_Button(180, 50, 70, 30, _("Cancel")); c->callback(chain_prop_cancel_cb); add(c); end(); set_modal(); dialog_position(this,0); } bist-0.5.2/src/multifont_label.cpp0000644000175000017500000003167011406210753015520 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* #include #include #include #include #include #include #include #include */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; multifont_label::multifont_label() :multiline_label() { layout_lines(MULTILINE_LABEL_ALIGN_SINGLE_LINE_TEXT_LAYOUT); } multifont_label::multifont_label(const multifont_label& other) :multiline_label(other) { } multifont_label::multifont_label(const multifont_label* other) :multiline_label(other) { } multifont_label::multifont_label(int nfont, int ndim, int ncr, int ncg, int ncb) :multiline_label() { bool old_t=treat_as_a_whole(true); font(nfont); dim(ndim); cr(ncr); cg(ncg); cb(ncb); treat_as_a_whole(old_t); layout_lines(MULTILINE_LABEL_ALIGN_SINGLE_LINE_TEXT_LAYOUT); } multifont_label& multifont_label::operator=(const multifont_label& other){ _treat_as_a_whole=_treat_as_a_whole; _pointer_to_currline=other._pointer_to_currline; _interline_space=other._interline_space; _layout_lines=other._layout_lines; _cr=other._cr; _cg=other._cg; _cb=other._cb; _allineamento=other._allineamento; _vec_str=other._vec_str; _font=other._font; _dim=other._dim; _x=other._x; _y=other._y; _v_offset=other._v_offset; _cursor_pos=other._cursor_pos; _draw_cursor=other._draw_cursor; _draw_negative=other._draw_negative; genitore::_il_genitore=other._il_genitore; for(unsigned int i=0;i< (other._lines_of_text.size()) ;i++){ etichetta* tmp=new etichetta(other._lines_of_text[i]); _lines_of_text.push_back(tmp); } return (*this); } multifont_label::~multifont_label(){ //std::cerr << __FUNCTION__ << std::endl; } void multifont_label::format_paragraph(){ //find max height int max_h=-1; for(unsigned int ct=0;ct<_lines_of_text.size();ct++){ if(_lines_of_text[ct]->phys_h() > max_h){ max_h=_lines_of_text[ct]->phys_h(); } } for(unsigned int i=0;i<_lines_of_text.size();i++){ int h_n=_lines_of_text[i]->phys_h(); _lines_of_text[i]->y(_y + max_h - h_n); int total_w=0; for(unsigned int j=0;jphys_w(); } _lines_of_text[i]->x(_x+total_w); } } void multifont_label::disegna(){ multiline_label::disegna(); } void multifont_label::insert_string_in_curr_pos(std::string str,int type){ switch(type){ case ET_STR: { for(unsigned int i=0;i c_pos(0,0); std::vector < std::pair > the_vec_str; std::string car=""; int old_type=ET_TYPE_NOT_VALID; if(_lines_of_text.size()>0){ get_cursor_position(&c_pos); the_vec_str=_lines_of_text[pointer_to_currline()]->vec_str(); car=the_vec_str[c_pos.first].first; old_type=_lines_of_text[pointer_to_currline()]->type_etic_at_cur_pos(); } /* std::cerr << car << " insert start!! c_pos.first " << c_pos.first << " c_pos.second " << c_pos.second << std::endl << " car " << car << std::endl; */ switch(type){ case ET_STR: { if(old_type==ET_STR ||old_type==ET_TYPE_NOT_VALID ){ std::string str; str+=add; etichetta* tmp=new etichetta(); bool old_t=treat_as_a_whole(true); tmp->font(font()); tmp->dim(phys_dim()); tmp->cr(cr()); tmp->cg(cg()); tmp->cb(cb()); treat_as_a_whole(old_t); tmp->aggiungi(str,ET_STR); if(_lines_of_text.size()==0){ tmp->set_cursor_position(0,1); add_line(tmp); }else{ if(pointer_to_currline()== static_cast(_lines_of_text.size()-1) && _lines_of_text.size()>1){ tmp->set_cursor_position(0,1); add_line(tmp); }else{ fall_apart_line_and_add_normal_string(add); for(unsigned int i=0;i<_lines_of_text.size();i++){ if(static_cast(i)<=pointer_to_currline()){ _lines_of_text[i]->go_to_end_of_label(); }else{ _lines_of_text[i]->go_to_start_of_label(); } } } } }else if(old_type==ET_APICE || old_type==ET_PEDICE){ fall_apart_line_and_add_normal_string(add); } } break; case ET_PEDICE: case ET_APICE: multiline_label::insert_char_in_curr_pos(add,type); break; } } void multifont_label::manage_sub_super(int check, int troublesome,std::string car){ } bool multifont_label::manage_add_sub_super_next_normal_str(int type){ return false; } bool multifont_label::manage_add_sub_next_super(int type){ return false; } bool multifont_label::cursor_one_step_fwd(int &curr_type){ bool has_more=true; if(_lines_of_text.size()>0){ unsigned int ptr_line=pointer_to_currline(); std::pair pos; _lines_of_text[ptr_line]->get_cursor_position(&pos); std::vector < std::pair > the_vec_str=(_lines_of_text[ptr_line])->vec_str(); int sz=the_vec_str.size()-1; // std::cerr << ptr_line << std::endl; if(ptr_line == (_lines_of_text.size() -1) && pos.first == sz && pos.second == the_vec_str.back().first.size() ){ has_more=false; }else{ multiline_label::cursor_one_step_fwd(curr_type); _lines_of_text[pointer_to_currline()]->get_cursor_position(&pos); if(pos.second==0 && pos.first==0){ _lines_of_text[pointer_to_currline()]->cursor_one_step_fwd(curr_type); } _lines_of_text[pointer_to_currline()]->get_cursor_position(&pos); } }else{ has_more=false; } return has_more; } bool multifont_label::cursor_one_step_back(int &curr_type){ bool has_more=true; if(_lines_of_text.size()>0 ){ std::pair pos; _lines_of_text[pointer_to_currline()]->get_cursor_position(&pos); if(pointer_to_currline() == 0 && pos.first == 0 && pos.second == 0 ){ has_more=false; }else{ multiline_label::cursor_one_step_back(curr_type); _lines_of_text[pointer_to_currline()]->get_cursor_position(&pos); if(pos.second==0 && pos.first==0 && pointer_to_currline()>0){ cursor_one_step_back(curr_type); _lines_of_text[pointer_to_currline()]->get_cursor_position(&pos); // std::cerr << pointer_to_currline() << " " // << pos.first << " " << pos.second << std::endl; } } }else{ has_more=false; } return has_more; } void multifont_label::fall_apart_line_and_add_normal_string(char add){ std::pair old_pos(0,0); get_cursor_position(&old_pos); //int old_ptrline=pointer_to_currline(); _lines_of_text[pointer_to_currline()]->break_string_at_cur_pos(ET_STR); _lines_of_text[pointer_to_currline()]->insert_char_in_curr_pos(add,ET_STR); //int dummy=0; std::pair pos; int added=break_lines_into_sublabel(); get_cursor_position(&pos); pointer_to_currline(added); if(old_pos.second>0){ pointer_to_currline_transl(1); } _lines_of_text[pointer_to_currline()]->set_cursor_position(0,1); /* std::cerr << "added " << added << std::endl; std::cerr << "pos old " << old_ptrline << std::endl; */ //works but it is a mess! /* if(!(pos.second==0 && pos.first==0 && pointer_to_currline()==0)){ //std::cerr << "ecco 3 " << std::endl; pointer_to_currline_transl(1); _lines_of_text[pointer_to_currline()]->set_cursor_position(0,0); multiline_label::cursor_one_step_fwd(dummy); }else if(old_pos.second>0 && old_pos.first==0 && old_ptrline==0 ){ pointer_to_currline(old_ptrline); _lines_of_text[old_ptrline]->set_cursor_position(0,1); //std::cerr << "ecco 1 " << std::endl; pointer_to_currline(old_pos.second-1); cursor_one_step_fwd(dummy); }else if(old_pos.second==0 && old_pos.first==0 && old_ptrline==0 ){ //std::cerr << "ecco 2 " << std::endl; pointer_to_currline(0); cursor_one_step_fwd(dummy); }else if(pos.second==0 && pos.first==0 && pointer_to_currline()==0){ pointer_to_currline_transl(1); _lines_of_text[pointer_to_currline()]->set_cursor_position(0,1); } */ } int multifont_label::break_lines_into_sublabel(){ vector new_lines_of_text; int added=0; for(unsigned int i=0;i<_lines_of_text.size();i++){ int to_add=break_line_into_sublabel(_lines_of_text[i],new_lines_of_text); if(static_cast(i) < pointer_to_currline()){ added+=to_add; } } _lines_of_text=new_lines_of_text; return added; } int multifont_label::break_line_into_sublabel(etichetta* to_break, vector & new_lines_of_text){ int added=0; if(to_break->size_str()>0){ std::vector < std::pair > the_vec_str=to_break->vec_str(); for(unsigned int ct=0;ctaggiungi(the_vec_str[ct].first,the_vec_str[ct].second); ct++; } } } } return added; } int multifont_label::atomize_normal_string(etichetta* the_template, std::string the_string, vector & new_lines_of_text){ int added=0; for(unsigned int i=0;ielimina(); //tmp->set_cursor_position(0,0); std::string single_char=""; single_char+=the_string[i]; tmp->aggiungi(single_char,ET_STR); new_lines_of_text.push_back(tmp); added++; } return added; } void multifont_label::delete_char_curr_pos(bool before){ int ptr_line=pointer_to_currline(); std::pair curpos; get_cursor_position(&curpos); if(_lines_of_text.size()>0){ std::vector < std::pair > the_vec_str= _lines_of_text[ptr_line]->vec_str(); etichetta saved=_lines_of_text[ptr_line]; /* bool reassign=false; if(!before && curpos.second == 0 && the_vec_str.size()>1 ){ std::cerr << "reassign!!!!" << std::endl; }else if (before && curpos.second == 1 && curpos.first == 0 && the_vec_str.size()>1){ std::cerr << "reassign!!!!" << std::endl; } */ multiline_label::delete_char_curr_pos(before); //readjust cursor in a tricky way... if(size_lines_of_text()>0){ std::pair curpos; _lines_of_text[pointer_to_currline()]->get_cursor_position(&curpos); int curr_type=0; //if(before && size_lines_of_text()==1){ //cursor_one_step_fwd(curr_type); /*}else*/ if(!ptr_line_is_last_line() || (curpos.first==0 && curpos.second==0)){ cursor_one_step_fwd(curr_type); cursor_one_step_back(curr_type); } } } } bist-0.5.2/src/arc_prop.cpp0000644000175000017500000001240211440434363014140 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0104 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; // // called by clicking "Color" button // allow to choose and set up the color // void Arc_Prop::setColor(unsigned int r, unsigned int g, unsigned int b) { _arc->cr(r); _arc->cg(g); _arc->cb(b); } void arc_prop_color_cb(Fl_Widget* w, void* d){ unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); editor* ed=dynamic_cast(MainWindow); if (pushd){ Arc_Prop* prop = dynamic_cast(w->parent()); prop->setColor(r,g,b); ed->redraw(); } } void arc_prop_ok_cb(Fl_Widget* w, void* d){ Fl_Window* win=dynamic_cast(w->parent()); win->hide(); } void arc_prop_cancel_cb(Fl_Widget* w, void* d){ Fl_Window* wi=dynamic_cast(w->parent()); wi->hide(); } // // callback used for setting up arc width // void Arc_Prop::setWidth(int width) { if (width > 0){ _arc->spessore(width); } } void arc_prop_width_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); Arc_Prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->setWidth(sl->value()); ed->redraw(); } // // callback used to setting up arc thickness // void Arc_Prop::setThick(int thick) { if (thick > 0){ _arc->dash(thick); } } void arc_prop_thick_cb(Fl_Widget* w, void* d){ Fl_Value_Slider* sl=dynamic_cast(w); Arc_Prop* arrp=dynamic_cast(w->parent()); editor* ed=dynamic_cast(MainWindow); arrp->setThick(static_cast(sl->value())); ed->redraw(); } Arc_Prop::~Arc_Prop(){ } /* * initializing gui elements * of arc properties window. */ Arc_Prop::Arc_Prop(proc_arc* arr) :Fl_Double_Window(400, 171), _arc(arr) { Fl_Box* arcPropBox = new Fl_Box(5, 20, 395, 110, _("Arc properties")); arcPropBox->box(FL_ENGRAVED_BOX); arcPropBox->align(FL_ALIGN_TOP_LEFT); Fl_Value_Slider* thickSlider = new Fl_Value_Slider(100, 25, 250, 25, _("Thickness:")); thickSlider->type(1); thickSlider->step(0.01); thickSlider->align(FL_ALIGN_LEFT); thickSlider->range(0, 30); thickSlider->precision(0); thickSlider->value(_arc->dash()); thickSlider->callback(arc_prop_thick_cb); Fl_Value_Slider* widthSlider = new Fl_Value_Slider(100, 52, 250, 25, _("Width:")); widthSlider->type(1); widthSlider->step(0.01); widthSlider->align(FL_ALIGN_LEFT); widthSlider->range(0, 10); widthSlider->precision(0); widthSlider->value(_arc->spessore()); widthSlider->callback(arc_prop_width_cb); Fl_Button* colorButton=new Fl_Button(w()/2-LARG_BUTTON_DEFAULT*2, 92, LARG_BUTTON_DEFAULT*2, LARG_BUTTON_DEFAULT, _("Color")); colorButton->callback(arc_prop_color_cb); add(colorButton); Fl_Button* okButton=new Fl_Button(w()/2, 92, LARG_BUTTON_DEFAULT*2, LARG_BUTTON_DEFAULT, _("OK")); okButton->callback(arc_prop_ok_cb); add(okButton); Fl_Button* cancelButton=new Fl_Button(w()/2-LARG_BUTTON_DEFAULT*3/2, h()-LARG_BUTTON_DEFAULT-10, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Cancel")); cancelButton->callback(arc_prop_cancel_cb); add(cancelButton); end(); set_modal(); dialog_position(this); } void arc_win(proc_arc* at){ Arc_Prop win(at); win.show(); while(win.shown()){ Fl::wait(); } } bist-0.5.2/src/substructure_search.cpp0000644000175000017500000015055611411114540016435 0ustar cagecage#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace substructure_search; residual_DFS::residual_DFS(){ clean_to_start(); } residual_DFS::residual_DFS(gruppo& ref) :_molecule(ref) { clean_to_start(); } bool residual_DFS::is_black(atomo* a){ int res=0; if(a!=NULL){ if(_blacks.count(a)>0){ res=1; } } return res; } bool residual_DFS::is_gray(atomo* a){ int res=0; if(a!=NULL){ if(_grays.count(a)>0){ res=1; } } return res; } residual_DFS::~residual_DFS(){ } void residual_DFS::clean_to_start(){ while(!_stack_atoms.empty()){ _stack_atoms.pop(); } while(!_parents.empty()){ _parents.pop(); } while(!_history.empty()){ _history.pop(); } while(!_bond_type.empty()){ _bond_type.pop(); } while(!_no_children.empty()){ _no_children.pop(); } while(!_curr_action.empty()){ _curr_action.pop(); } _grays.clear(); _blacks.clear(); } bool residual_DFS::DFS_find_descend_forced(atomo* parent, atomo* child){ node_status nw; bool is_cycle=false; bool had_children_not_black=false; bool found=false; nw._parent_node=parent; if(is_gray(parent)){ nw._lastcolor=GRAY; }else if(is_black(parent)){ nw._lastcolor=BLACK; }else{ nw._lastcolor=WHITE; } vector::iterator sub_first=parent->primo_leg(); vector::iterator sub_last=parent->ultimo_leg(); atomo* child_found=0; while(sub_first!=sub_last){ child_found=_molecule.find_atomo_id((*sub_first).id_atomo()); if(child_found==child){ found=true; } if( found && (_blacks.count(child)==0) ){ if(is_gray(child)){ is_cycle=true; } had_children_not_black=true; _grays[child]=true; _stack_atoms.push(child); _bond_type.push((*sub_first).tipo_legame()); _no_children.push(child->bond_number()); _parents.push(parent); if(is_cycle){ _curr_action.push(DESCEND_NORMAL_CYCLE); nw._action=DESCEND_NORMAL_CYCLE; nw._node=child; }else{ _curr_action.push(DESCEND_NORMAL); nw._action=DESCEND_NORMAL; nw._node=child; } break; } sub_first++; } if(found && (_blacks.count(child)==0)){ DFS_manage_node_no_white_nodes(had_children_not_black, is_cycle, parent, child , nw); _history.push(nw); } //nw._node=child; return found && (_blacks.count(child)==0); } void residual_DFS::DFS_find_and_descend(atomo* parent, node_status& nw){ bool is_cycle=false; bool had_children_not_black=false; vector::iterator sub_first=parent->primo_leg(); vector::iterator sub_last=parent->ultimo_leg(); atomo* child=0; while(sub_first!=sub_last){ child=_molecule.find_atomo_id((*sub_first).id_atomo()); if( (_blacks.count(child)==0) && (_parents.size()==0 || _parents.top()->id()!=child->id())){ if(is_gray(child)){ is_cycle=true; } had_children_not_black=true; _grays[child]=true; _stack_atoms.push(child); _bond_type.push((*sub_first).tipo_legame()); _no_children.push(child->bond_number()); _parents.push(parent); if(is_cycle){ _curr_action.push(DESCEND_NORMAL_CYCLE); nw._action=DESCEND_NORMAL_CYCLE; }else{ _curr_action.push(DESCEND_NORMAL); nw._action=DESCEND_NORMAL; } break; } sub_first++; } DFS_manage_node_no_white_nodes(had_children_not_black, is_cycle, parent, child, nw); } void residual_DFS::DFS_manage_node_no_white_nodes(bool had_children_not_black, bool is_cycle, atomo* parent, atomo* child , node_status& nw){ vector::iterator sub_first=parent->primo_leg(); vector::iterator sub_last=parent->ultimo_leg(); bool all_black_or_gray=true; while(sub_first!=sub_last){ atomo* c2=_molecule.find_atomo_id((*sub_first).id_atomo()); if(!is_gray(c2) && !is_black(c2)){ all_black_or_gray=false; } sub_first++; } if(all_black_or_gray){ /* std::cerr << "tutti i figli sono grigi o neri setto" << curr->id() << " black "; */ _grays.erase(parent); _blacks[parent]=true; nw._currcolor=BLACK; if(had_children_not_black){ if(is_cycle){ _curr_action.push(DESCEND_SET_BLACK_PARENT_CYCLE); nw._action=DESCEND_SET_BLACK_PARENT_CYCLE; }else{ _curr_action.push(DESCEND_SET_BLACK_PARENT); nw._action=DESCEND_SET_BLACK_PARENT; } nw._node=child; }else{ if(is_cycle){ _curr_action.push(SET_BLACK_CURR_CYCLE); nw._action=SET_BLACK_CURR_CYCLE; //will never happens isn'it? nw._parent_node=child; nw._node=parent; }else{ _curr_action.push(SET_BLACK_CURR); nw._action=SET_BLACK_CURR; nw._parent_node=child; nw._node=parent; } } }else{ nw._node=child; nw._currcolor=nw._lastcolor; } } bool residual_DFS::DFS_simulate_shift_descendant(atomo** res){ dump_history(); dump(); bool found=false; atomo* parent=parent_atom(); atomo* old_child=curr_atom(); //std::cerr << "############################################" << std::endl; DFS_pop_current_atom(false,false); atomo* gran_parent=parent_atom(); //dump_history(); //dump(); /* gparent ---- parent ---- child */ //std::cerr << "@@@@@@@@@@@@@@@@@@@@"<< std::endl; if( (gran_parent!=NULL && parent!=NULL)){ found=DFS_simulate_shift_descendant_w_gparent(res,gran_parent, parent, old_child); DFS_find_descend_forced(parent,old_child); }else if(gran_parent==NULL && parent!=NULL){ found=DFS_simulate_shift_descendant_no_gparent(res,parent, old_child); DFS_find_descend_forced(parent,old_child); }else if(gran_parent==NULL && parent==NULL){ //we are at the starting point! int start=old_child->id(); DFS_step(&start); } return found; } bool residual_DFS::DFS_simulate_shift_descendant_w_gparent(atomo** res, atomo* gparent, atomo* parent, atomo* old_child){ /* gparent ----> parent ----> child */ bool found=false; atomo* nw_child=NULL; vector::iterator sub_first=parent->primo_leg(); vector::iterator sub_last=parent->ultimo_leg(); while(sub_first!=sub_last){ nw_child=_molecule.find_atomo_id((*sub_first).id_atomo()); if(nw_child->id()!=old_child->id() && (_blacks.count(nw_child)==0) && (gparent->id()!=nw_child->id()) ){ found=true; *res=nw_child; break; } sub_first++; } return found; } bool residual_DFS::DFS_simulate_shift_descendant_no_gparent(atomo** res, atomo* parent, atomo* old_child){ /* gparent ----> parent ----> child */ bool found=false; atomo* nw_child=NULL; vector::iterator sub_first=parent->primo_leg(); vector::iterator sub_last=parent->ultimo_leg(); while(sub_first!=sub_last){ nw_child=_molecule.find_atomo_id((*sub_first).id_atomo()); if(nw_child->id()!=old_child->id() && (_blacks.count(nw_child)==0)){ found=true; *res=nw_child; break; } sub_first++; } return found; } bool residual_DFS::DFS_shift_descendant(bool leave_black){ bool found=false; // std:: cerr << "]]]]]]]]]" << std::endl; // dump(); // std:: cerr << "]]]]]]]]]" << std::endl; atomo* curr_child=curr_atom(); DFS_pop_current_atom(leave_black,false); // std:: cerr << "[[[[[[[[[[[[[[" << std::endl; // dump(); // std:: cerr << "[[[[[[[[[[[[[[" << std::endl; // std::cerr << __FUNCTION__ << " genitore " <id() // << endl; atomo* nw_child=NULL; vector::iterator sub_first=curr_atom()->primo_leg(); vector::iterator sub_last=curr_atom()->ultimo_leg(); while(sub_first!=sub_last){ nw_child=_molecule.find_atomo_id((*sub_first).id_atomo()); if(nw_child->id()!=curr_child->id() && (_blacks.count(nw_child)==0) && (_parents.size()==0 || _parents.top()->id()!=nw_child->id()) ){ found=true; break; } sub_first++; } // std::cerr << __FUNCTION__ << " nuovo figlio " << nw_child->id() // << endl; DFS_find_descend_forced(curr_atom(),nw_child); return found; } void residual_DFS::DFS_delete_terminal(atomo* at,node_status& nw,bool keep_in_history){ _stack_atoms.pop(); _bond_type.pop(); _no_children.pop(); _parents.pop(); _curr_action.push(DELETE_TERMINAL); nw._action=DELETE_TERMINAL; nw._currcolor=BLACK; nw._parent_node=at; nw._node=at; if(keep_in_history){ _history.push(nw); } } void residual_DFS::DFS_step(int* start){ if(start!=NULL){ clean_to_start(); _stack_atoms.push(_molecule.find_atomo_id(*start)); _curr_action.push(NONE); _grays[_molecule.find_atomo_id(*start)]=true; node_status nw; nw._parent_node=_molecule.find_atomo_id(*start); nw._node=_molecule.find_atomo_id(*start); nw._lastcolor=WHITE; nw._currcolor=GRAY; _history.push(nw); }else{ if(!_stack_atoms.empty()){ atomo* curr=_stack_atoms.top(); //std::cerr << "top " << curr->id() << " \n" ; node_status nw; nw._parent_node=curr; if(is_gray(curr)){ nw._lastcolor=GRAY; }else if(is_black(curr)){ nw._lastcolor=BLACK; }else{ nw._lastcolor=WHITE; } if(_blacks.count(curr)==0){ DFS_find_and_descend(curr,nw); }else{ DFS_delete_terminal(_stack_atoms.top(), nw,false); } _history.push(nw); } } } bool residual_DFS::DFS_set_black_current(atomo* candidate){ vector::iterator sub_first=candidate->primo_leg(); vector::iterator sub_last=candidate->ultimo_leg(); atomo* child=0; bool had_children_not_black=false; while(sub_first!=sub_last){ //dump_blacks(); child=_molecule.find_atomo_id((*sub_first).id_atomo()); if( ! ( is_gray(child) || is_black(child) ) ){ //std::cerr << "attenzione!!!! " << child->id() << " " << child << std::endl; had_children_not_black=true; break; } sub_first++; } if(!had_children_not_black){ _grays.erase(candidate); _blacks[candidate]=true; } return !had_children_not_black; } void residual_DFS::DFS_force_black_current(bool keep_track){ node_status nw; nw._node=curr_atom(); nw._parent_node=parent_atom(); nw._lastcolor=BLACK; nw._currcolor=BLACK; nw._action=FORCE_BLACK_CURRENT; _blacks[curr_atom()]=true; _grays.erase(curr_atom()); //std::cerr << "setto black " << curr_atom()->id() << std::endl; _curr_action.push(FORCE_BLACK_CURRENT); if(keep_track){ _history.push(nw); } } void residual_DFS::DFS_force_black_parent(bool keep_track){ node_status nw; nw._node=curr_atom(); nw._parent_node=parent_atom(); nw._lastcolor=get_color(parent_atom()); nw._currcolor=BLACK; nw._action=FORCE_BLACK_PARENT; _blacks[parent_atom()]=true; _grays.erase(parent_atom()); //std::cerr << "setto black " << curr_atom()->id() << std::endl; _curr_action.push(FORCE_BLACK_PARENT); if(keep_track){ _history.push(nw); } } colornode residual_DFS::get_color(atomo* atm){ colornode res=WHITE; if(is_black(atm)){ res=BLACK; }else if(is_gray(atm)){ res=GRAY; } return res; } bool residual_DFS::DFS_pop_current_atom(bool leave_it_black, bool keep_in_history){ node_status nw; bool has_more=false; if(!_stack_atoms.empty()){ has_more=true; atomo* last=curr_atom(); std::stack last_st; last_st.push(_history.back()); nw._node=curr_atom(); nw._parent_node=parent_atom(); if(last_st.top()._action==SET_BLACK_CURR_CYCLE || last_st.top()._action==SET_BLACK_CURR){ std::queue q_saved=_history; while(q_saved.size()>2){ q_saved.pop(); } last_st.push(q_saved.front()); backstep(); backstep(); }else{ has_more=backstep(); } if(has_more){ if(leave_it_black){ //std::cerr << __FUNCTION__ << " setto black " << last->id() << std::endl; _blacks[last]=true; _grays.erase(last); nw._action=POP_CURRENT_ATOM_LEAVE_BLACK; _curr_action.push(POP_CURRENT_ATOM_LEAVE_BLACK); }else{ nw._action=POP_CURRENT_ATOM; _curr_action.push(POP_CURRENT_ATOM); } if(keep_in_history){ while(!last_st.empty()){ _history.push(last_st.top()); last_st.pop(); } _history.push(nw); } } } return has_more; } action residual_DFS::curr_action(){ return _curr_action.top(); } int residual_DFS::bond_type(){ return _bond_type.top(); } int residual_DFS::no_children(){ return _no_children.top(); } atomo* residual_DFS::curr_atom(){ if(_stack_atoms.empty()){ return NULL; }else{ return _stack_atoms.top(); } } atomo* residual_DFS::parent_atom(){ atomo* res=NULL; if(_stack_atoms.size()>1){ std::stack saved=_stack_atoms; _stack_atoms.pop(); res= _stack_atoms.top(); _stack_atoms=saved; } return res; } bool residual_DFS::DFS_is_finished(){ std::stack tmp=_stack_atoms; bool res=true; while(!tmp.empty()){ if( !is_black(tmp.top())){ res=false; break; } tmp.pop(); } return res; } bool residual_DFS::backstep(){ //std::cerr << "********************** indietro! " // << _history.size() << " ***************" << std::endl; bool has_more=false; if(!_history.empty()){ has_more=true; int count=_history.size()-1; if(count==0){ count=1; has_more=false; } std::queue copy_hist=_history; atomo* start=NULL; while(!_stack_atoms.empty()){ start=_stack_atoms.top(); _stack_atoms.pop(); } int id_start=start->id(); DFS_step(&id_start); for(int i=0;iid(); DFS_step(&start); } break; case FORCE_BLACK_PARENT: assert(st._parent_node==parent_atom()); DFS_force_black_parent(); break; case FORCE_BLACK_CURRENT: assert(st._node==curr_atom()); DFS_force_black_current(); break; case POP_CURRENT_ATOM_LEAVE_BLACK: DFS_pop_current_atom(true); break; case POP_CURRENT_ATOM: DFS_pop_current_atom(false); break; case DELETE_TERMINAL: //std::cerr << "cancellerei " << st._node->id() << std::endl; //dump_blacks(); assert(_stack_atoms.top() == st._node); assert(is_black(st._node)); DFS_delete_terminal(_stack_atoms.top() , st,true); break; case SET_BLACK_CURR: DFS_set_black_current(st._node); _history.push(st); break; case DESCEND_FORCE_SET_BLACK_PARENT: DFS_descend_force_set_black_parent(st._parent_node, st._node, true); break; case DESCEND_FORCE_SET_BLACK_PARENT_CYCLE: assert(is_gray(st._node)); DFS_descend_force_set_black_parent_cycle(st._parent_node, st._node, true); break; case DESCEND_SET_BLACK_PARENT: //std::cerr << "\t\tDESCEND_SET_BLACK_PARENT prima" << std::endl; // dump_blacks(); // std::cerr << "crtitico da: " << st._parent_node->id() // << " " << st._node->id() << std::endl; DFS_find_descend_forced(st._parent_node, st._node); // std::cerr << "\t\tDESCEND_SET_BLACK_PARENT dopo" << std::endl; // dump_blacks(); break; case DESCEND_SET_BLACK_PARENT_CYCLE: assert(is_gray(st._node)); DFS_find_descend_forced(st._parent_node, st._node); break; default: DFS_find_descend_forced(st._parent_node, st._node); break; } /* action ca=curr_action(); if(ca==DESCEND_NORMAL){ std::cerr << "\tDESCEND_NORMAL" << std::endl; std::cerr << "partendo da : " << parent_atom()->id() << " scenderei in " << curr_atom()->id() << " proveniente da un legame " << bond_type() << " e " << no_children() << " figli " << std::endl; }else if(ca==DESCEND_TERMINAL){ std::cerr << "\tDESCEND_TERMINAL" << std::endl; std::cerr << "partendo da : " << parent_atom()->id() << " scenderei in " << curr_atom()->id() << " proveniente da un legame " << bond_type() << " e " << no_children() << " figli " << " questo verra' eliminato " << std::endl; }else if(ca==DELETE_TERMINAL){ std::cerr << "\t DELETE_TERMINAL" << std::endl; std::cerr << " eliminato precedente " << std::endl; }else if(ca==DESCEND_NORMAL_CYCLE){ std::cerr << "\t DESCEND_NORMAL_CYCLE" << std::endl; std::cerr << "ciclo!! partendo da : " << parent_atom()->id() << " scenderei in " << curr_atom()->id() << " proveniente da un legame " << bond_type() << " e " << no_children() << " figli " << std::endl; std::cerr << "\tformano un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR_CYCLE){ std::cerr << "\t SET_BLACK_CURR_CYCLE" << std::endl; std::cerr << curr_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR){ std::cerr << "\t SET_BLACK_CURR" << std::endl; std::cerr << curr_atom()->id() << " diventa black " << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT_CYCLE){ std::cerr << "\t DESCEND_SET_BLACK_PARENT_CYCLE" << std::endl; std::cerr << "partendo da : " << parent_atom()->id() << " scenderei in " << curr_atom()->id() << " proveniente da un legame " << bond_type() << " e " << no_children() << " figli " << std::endl; std::cerr << parent_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT){ std::cerr << "\t DESCEND_SET_BLACK_PARENT" << std::endl; std::cerr << "partendo da : " << parent_atom()->id() << " scenderei in " << curr_atom()->id() << " proveniente da un legame " << bond_type() << " e " << no_children() << " figli " << std::endl; std::cerr << parent_atom()->id() << " diventa black " << std::endl; }else if(ca==FORCE_BLACK_CURRENT){ std::cerr << "\tFORCE_BLACK_CURRENT" << std::endl; std::cerr << "forzo " << curr_atom()->id() << " black" << std::endl; } */ } } return has_more; } void residual_DFS::DFS_descend_force_set_black_parent_cycle(atomo* parent, atomo* child, bool keep_track){ node_status nw; bool found_not_black=DFS_find_descend_forced(parent, child); if(found_not_black && pop_back_history(nw) && is_gray(curr_atom())){ DFS_force_black_parent(false); if(keep_track){ nw._action=DESCEND_FORCE_SET_BLACK_PARENT_CYCLE; _history.push(nw); } } } void residual_DFS::DFS_descend_force_set_black_parent(atomo* parent, atomo* child, bool keep_track){ node_status nw; DFS_find_descend_forced(parent, child); if(pop_back_history(nw)){ DFS_force_black_parent(false); if(keep_track){ nw._action=DESCEND_FORCE_SET_BLACK_PARENT; _history.push(nw); } } } bool residual_DFS::pop_back_history(node_status& popped){ std::queue nw; bool res=false; while(!_history.empty() && _history.size()>1){ res=true; nw.push(_history.front()); _history.pop(); } if(res){ popped=_history.front(); _history=nw; } return res; } void residual_DFS::dump(){ std::stack tmp=_stack_atoms; while(!tmp.empty()){ std::cerr << tmp.top() << " id= " << tmp.top()->id(); if(is_black(tmp.top())){ std::cerr << " BLACK "; }else if(is_gray(tmp.top())){ std::cerr << " gray "; }else{ std::cerr << " white "; } std::cerr << std::endl; tmp.pop(); } } void residual_DFS::dump_history(){ dump_any_history(_history); } void residual_DFS::dump_any_history(std::queue tmp){ while(!tmp.empty()){ std::cerr << "node: " << tmp.front()._node->id() << " " << "parentnode: " << tmp.front()._parent_node->id() << " " << "curcolor: " << colornode2string(tmp.front()._currcolor) << " " << "lastcolor: " << colornode2string(tmp.front()._lastcolor) << " " << "act: " << action2string(tmp.front()._action) << std::endl; tmp.pop(); } } void residual_DFS::dump_blacks(){ std::map::iterator iter; for( iter = _blacks.begin(); iter != _blacks.end(); iter++ ) { std::cerr << "id: " << iter->first->id() << " address=" << iter->first << " value:" << iter->second << endl; } } atomo* residual_DFS::get_starting_point(){ atomo* res=NULL; if(!_stack_atoms.empty()){ std::stack saved=_stack_atoms; while(_stack_atoms.size()>1){ _stack_atoms.pop(); } assert(_stack_atoms.size()==1); res=_stack_atoms.top(); _stack_atoms=saved; } return res; } bool residual_DFS::is_starting_point(atomo* chkd){ return get_starting_point()==chkd; } std::vector residual_DFS::dump_atoms_from_molecule(){ std::vector res; vector::iterator first=_molecule.iniz_atom(); vector::iterator last=_molecule.fin_atom(); while(first!=last){ atomo* a=_molecule.find_atomo_id((*first).id()); res.push_back(a); first++; } return res; } std::string residual_DFS::colornode2string(colornode c){ std::string res=""; if(c==WHITE){ res="white"; }else if(c==GRAY){ res="gray"; }else if(c==BLACK){ res="BLACK"; } return res; } std::string residual_DFS::action2string(action a){ std::string res=""; if(a == NONE){ res="NONE"; }else if(a == DESCEND_NORMAL){ res="DESCEND_NORMAL"; }else if(a == DESCEND_TERMINAL){ res="DESCEND_TERMINAL"; }else if(a == DESCEND_NORMAL_CYCLE){ res="DESCEND_NORMAL_CYCLE"; }else if(a== DESCEND_TERMINAL_CYCLE){ res="DESCEND_TERMINAL_CYCLE"; }else if(a== SET_BLACK_CURR_CYCLE){ res="SET_BLACK_CURR_CYCLE"; }else if(a== SET_BLACK_CURR){ res="SET_BLACK_CURR"; }else if(a== DESCEND_SET_BLACK_PARENT_CYCLE){ res="DESCEND_SET_BLACK_PARENT_CYCLE"; }else if(a== DESCEND_SET_BLACK_PARENT){ res="DESCEND_SET_BLACK_PARENT"; }else if(a== DELETE_TERMINAL){ res="DELETE_TERMINAL"; }else if(a== FORCE_BLACK_CURRENT){ res="FORCE_BLACK_CURRENT"; }else if(a== FORCE_BLACK_PARENT){ res="FORCE_BLACK_PARENT"; }else if(a== FORCE_SHIFT_CHILD){ res="FORCE_SHIFT_CHILD"; }else if(a==POP_CURRENT_ATOM){ res="POP_CURRENT_ATOM"; }else if(a==POP_CURRENT_ATOM_LEAVE_BLACK){ res="POP_CURRENT_ATOM_LEAVE_BLACK"; }else if(a==DESCEND_FORCE_SET_BLACK_PARENT_CYCLE){ res="DESCEND_FORCE_SET_BLACK_PARENT_CYCLE"; }else if(a==DESCEND_FORCE_SET_BLACK_PARENT){ res="DESCEND_FORCE_SET_BLACK_PARENT"; } return res; } gruppo residual_DFS::get_copy_gruppo(){ return _molecule; } gruppo* residual_DFS::get_pointer_gruppo(){ return &_molecule; } /*************************************************/ molecule_matching::molecule_matching(gruppo& mol, gruppo& sub) :_sub(sub), _mol(mol) { } molecule_matching::~molecule_matching(){ } void molecule_matching::clean(){ _sub.clean_to_start(); _mol.clean_to_start(); } bool molecule_matching::match(){ //return TEST_DFS_forced(); bool result=false; std::vector starting_points_sub=_sub.dump_atoms_from_molecule(); std::vector starting_points_mol=_mol.dump_atoms_from_molecule(); /* for(unsigned int i=0;i0 && starting_points_mol.size()>0 ){ //for each atom in searched substructure for(unsigned int ct_st_points_sub=0; ct_st_points_sub(starting_points_sub[ct_st_points_sub]->id()); //initialize DFS for substructure _sub.DFS_step(&starting); //for each starting point for(unsigned int ct_st_points_mol=0; ct_st_points_mol(starting_points_mol[ct_st_points_mol]->id()); //initialize DFS for molecule _mol.DFS_step(&starting); //check if the starting point has equal (i.e. same label) if(good_starting_point(_sub.curr_atom(),_mol.curr_atom())){ //start DFS bool break_main=false; while(!_sub.DFS_is_finished()){ std::cerr << "\t\tSTART ITERATION" << std::endl; _sub.DFS_step(); std::cerr << "------------ SUB ---------------" << std::endl; debug_print_DFS(_sub); _sub.dump(); _sub.dump_history(); std::cerr << "------------ FINE SUB ---------------\n" << std::endl; if(!main_descend(false)){ break_main=true; break; } } //std::cerr << "OOOOKKK" << std::endl; if(!break_main){ return true; } } } // end for(unsigned int ct_st_points_mol=0; } // end for(unsigned int ct_st_points_sub=0; return false; } return result; } bool molecule_matching::main_descend(bool use_reds){ bool res=false; action curr_action=_sub.curr_action(); std::cerr << "------------ MOL ---------------" << std::endl; std::cerr << " \t\taction wished " << residual_DFS::action2string(curr_action) << std::endl; switch(curr_action){ case DESCEND_NORMAL: if(find_normal_candidate(use_reds)){ res=true; }else{ if(find_alternative_path()){ std::cerr << "\t\tsearch alternative OK!" << std::endl; res=true; }else{ std::cerr << "\t\tsearch alternative failed" << std::endl; res=false; } } debug_print_all(_mol); break; case DESCEND_TERMINAL: break; case DELETE_TERMINAL: { node_status st; assert(_mol.is_black(_mol.curr_atom())); _mol.DFS_delete_terminal(_mol.curr_atom(), st, true); _mol_reds.clear(); res=true; debug_print_all(_mol); } break; case DESCEND_NORMAL_CYCLE: break; case SET_BLACK_CURR_CYCLE: break; case SET_BLACK_CURR: _mol.DFS_force_black_current(); res=true; debug_print_all(_mol); break; case DESCEND_SET_BLACK_PARENT_CYCLE: if(find_set_black_parent_cycle_candidate(use_reds)){ res=true; debug_print_all(_mol); _mol.dump_blacks(); }else{ if(find_alternative_path()){ std::cerr << "\t\tsearch alternative OK!" << std::endl; res=true; debug_print_all(_mol); _mol.dump_blacks(); }else{ std::cerr << "\t\tsearch alternative failed" << std::endl; res=false; debug_print_all(_mol); _mol.dump_blacks(); } } break; case DESCEND_SET_BLACK_PARENT: std::cerr << "\t\tDESCEND_SET_BLACK_PARENT STARTTTT!" << std::endl; //debug_print_all(_mol); //std::cerr << "¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹" << std::endl; if(find_set_black_parent_candidate(use_reds)){ res=true; debug_print_all(_mol); _mol.dump_blacks(); }else{ std::cerr << "DESCEND_SET_BLACK_PARENT no candidate!" << std::endl; std::cerr << "search alternative\n\t\tstart dump" << std::endl; // debug_print_all(_mol); // std::cerr << "°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°" << std::endl; if(find_alternative_path()){ std::cerr << "\t\tsearch alternative OK!" << std::endl; res=true; debug_print_all(_mol); _mol.dump_blacks(); }else{ std::cerr << "\t\tsearch alternative failed" << std::endl; res=false; debug_print_all(_mol); _mol.dump_blacks(); } } break; default: assert(false); break; } return res; } bool molecule_matching::find_alternative_path(){ block_path(_mol.curr_atom()); bool mol_res=go_back_to_parent(_mol); // std::cerr << "################## MOL ################################" << std::endl; // std::cerr << "# "; // _mol.dump_history(); // _mol.dump(); // std::cerr << " #" << std::endl; // std::cerr << "##################################################" << std::endl; bool sub_res=go_back_to_parent(_sub); // std::cerr << "################### SUB ###############################" << std::endl; // std::cerr << "# "; // _sub.dump_history(); // _sub.dump(); // std::cerr << " #" << std::endl; // std::cerr << "##################################################" << std::endl; bool res=false; if(mol_res && sub_res){ res=main_descend(true); } return res; } bool molecule_matching::go_back_to_parent(residual_DFS& molecule){ bool res=false; atomo* pin=molecule.curr_atom(); if(!_mol.is_starting_point(pin)){ std::vector allowed; allowed.push_back(DESCEND_NORMAL); allowed.push_back(DESCEND_NORMAL_CYCLE); allowed.push_back(DESCEND_TERMINAL); allowed.push_back(DESCEND_TERMINAL_CYCLE); allowed.push_back(DESCEND_SET_BLACK_PARENT_CYCLE); allowed.push_back(DESCEND_SET_BLACK_PARENT); //DEBUG_TO_CERR(pin->id()); /* molecule.dump_history(); molecule.dump(); */ bool available=false; if(pin!=NULL){ while(molecule.curr_atom()==pin && find(allowed.begin(), allowed.end(), molecule.curr_action())!=allowed.end()){ available=molecule.backstep(); std::cerr << __FUNCTION__ << "backstep\n"; } } res=available; } return res; } bool molecule_matching::block_path(atomo* atm){ bool res=false; if(atm==NULL){ atomo* at=_mol.curr_atom(); if(at!=NULL){ _mol_reds.insert(at); res=true; } }else{ _mol_reds.insert(atm); res=true; } return res; } bool molecule_matching::find_set_black_parent_cycle_candidate(bool use_reds){ bool res=false; std::vector allowed; allowed.push_back(DESCEND_NORMAL_CYCLE); allowed.push_back(DESCEND_TERMINAL_CYCLE); allowed.push_back(DESCEND_SET_BLACK_PARENT_CYCLE); bool (molecule_matching::*condition)(residual_DFS*, atomo* , atomo* , residual_DFS* , atomo* , atomo* ) = &molecule_matching::check_black_parent_cycle_candidate; bool found=find_generic_candidate(allowed,condition,use_reds); if(found){ if(_mol.curr_action()!=DESCEND_SET_BLACK_PARENT_CYCLE){ //qui si deve forzare black per il genitore // DA FAREEEEE!!! atomo* parent=_mol.parent_atom(); atomo* curr=_mol.curr_atom(); _mol.backstep(); _mol.DFS_descend_force_set_black_parent_cycle(parent,curr,true); } res=true; }else{ } return res; } bool molecule_matching::find_set_black_parent_candidate(bool use_reds){ bool res=false; std::vector allowed; allowed.push_back(DESCEND_NORMAL); allowed.push_back(DESCEND_SET_BLACK_PARENT); bool (molecule_matching::*condition)(residual_DFS*, atomo* , atomo* , residual_DFS* , atomo* , atomo* ) = &molecule_matching::check_normal_candidates_atom; bool found=find_generic_candidate(allowed,condition,use_reds); if(found){ if(_mol.curr_action()!=DESCEND_SET_BLACK_PARENT){ //std::cerr << "AAAAAAAAAAAAAAA" << std::endl; atomo* parent=_mol.parent_atom(); atomo* curr=_mol.curr_atom(); _mol.backstep(); _mol.DFS_descend_force_set_black_parent(parent,curr,true); } res=true; }else{ } return res; } bool molecule_matching::find_normal_candidate(bool use_reds){ std::vector allowed; allowed.push_back(DESCEND_NORMAL); bool (molecule_matching::*condition)(residual_DFS*, atomo* , atomo* , residual_DFS* , atomo* , atomo* ) = &molecule_matching::check_normal_candidates_atom; return find_generic_candidate(allowed,condition,use_reds); } bool molecule_matching::find_generic_candidate(std::vector allowed, bool (molecule_matching::*cond)(residual_DFS*, atomo*,atomo*, residual_DFS*, atomo*,atomo*), bool use_reds ){ bool result=false; atomo* sub_p=_sub.parent_atom(); atomo* sub_atom=_sub.curr_atom(); atomo* mol_p=_mol.parent_atom(); atomo* mol_atom=_mol.curr_atom(); gruppo* grp=_mol.get_pointer_gruppo(); vector::iterator mol_first=mol_atom->primo_leg(); vector::iterator mol_last=mol_atom->ultimo_leg(); atomo* child=0; while(mol_first!=mol_last){ child=grp->find_atomo_id((*mol_first).id_atomo()); if(mol_p==NULL || child->id()!= mol_p->id()){ //std::cerr << "check " << mol_atom->id() << " " << child->id() << std::endl; bool found_and_not_black=_mol.DFS_find_descend_forced(mol_atom,child); action curr_action=_mol.curr_action(); if(found_and_not_black){ if(find(allowed.begin(), allowed.end(), curr_action)!=allowed.end() && (((*this).*cond)(&_mol, _mol.curr_atom(), _mol.parent_atom(), &_sub, sub_atom, sub_p))){ //std::cerr << "AOOOOOOOOOOOOOOOOOOO"<< std::endl; if(use_reds){ if(_mol_reds.count(_mol.curr_atom())==0){ result=true; break; }else{ result=false; _mol.backstep(); } }else{ result=true; break; } }else{ _mol.backstep(); } } } mol_first++; } return result; } bool molecule_matching::check_black_parent_cycle_candidate(residual_DFS* dfs_mol, atomo* mol, atomo* parmol, residual_DFS* dfs_ref, atomo* sub, atomo* parsub){ bool res=false; gruppo* molecule=dfs_mol->get_pointer_gruppo(); gruppo* ref=dfs_ref->get_pointer_gruppo(); if(equal_bond_type(molecule, mol, parmol, ref, sub, parsub) && equal_no_children(mol, sub) && equal_raw_string (mol, sub) && dfs_mol->is_gray(mol) ){ res=true; } return res; } bool molecule_matching::check_normal_candidates_atom(residual_DFS* dfs_mol, atomo* mol, atomo* parmol, residual_DFS* dfs_ref, atomo* sub, atomo* parsub){ bool res=false; gruppo* molecule=dfs_mol->get_pointer_gruppo(); gruppo* ref=dfs_ref->get_pointer_gruppo(); if(equal_bond_type(molecule, mol, parmol, ref, sub, parsub) && equal_no_children(mol, sub) && equal_raw_string (mol, sub) ){ res=true; } return res; } bool molecule_matching::good_starting_point(atomo* ref, atomo* start){ bool found=false; if(equal_raw_string(ref,start)){ found=true; } return found; } bool molecule_matching::equal_bond_type(gruppo* molecule_mol, atomo* mol, atomo* parmol, gruppo* molecule_ref, atomo* ref, atomo* parref){ bool res=false; legame mol_bond(0,0,0,0,0,0); legame ref_bond(0,0,0,0,0,0);; if(is_direct_children(molecule_mol, mol, parmol, mol_bond) && is_direct_children(molecule_ref, ref, parref, ref_bond)){ if(mol_bond.tipo_legame()==ref_bond.tipo_legame()){ res=true; } }else{ } return res; } bool molecule_matching::is_direct_children(gruppo* mol, atomo* child, atomo* parent, legame& res){ bool found=false; vector::iterator mol_first=parent->primo_leg(); vector::iterator mol_last=parent->ultimo_leg(); while(mol_first!=mol_last){ atomo* nw_child=mol->find_atomo_id((*mol_first).id_atomo()); if(nw_child->id() == child->id() && nw_child==child){ found=true; res=*mol_first; break; } mol_first++; } return found; } bool molecule_matching::equal_no_children(atomo* mol, atomo* ref){ bool res=false; if(mol->bond_number() >= ref->bond_number()){ res=true; } return res; } bool molecule_matching::equal_raw_string(atomo* mol, atomo* ref){ bool res=false; if((mol->etich()).to_raw_string() == (ref->etich()).to_raw_string()){ res=true; } return res; } void molecule_matching::debug_print_all(residual_DFS s){ debug_print_DFS(s); s.dump(); s.dump_history(); } void molecule_matching::debug_print_DFS(residual_DFS s){ action ca=s.curr_action(); if(ca==DESCEND_NORMAL){ std::cerr << "\tDESCEND_NORMAL" << std::endl; std::cerr << "partendo da : " << s.parent_atom()->id() << " scenderei in " << s.curr_atom()->id() << " proveniente da un legame " << s.bond_type() << " e " << s.no_children() << " figli " << std::endl; }else if(ca==DESCEND_TERMINAL){ std::cerr << "\tDESCEND_TERMINAL" << std::endl; std::cerr << "partendo da : " << s.parent_atom()->id() << " scenderei in " << s.curr_atom()->id() << " proveniente da un legame " << s.bond_type() << " e " << s.no_children() << " figli " << " questo verra' eliminato " << std::endl; }else if(ca==DELETE_TERMINAL){ std::cerr << "\t DELETE_TERMINAL" << std::endl; std::cerr << " eliminato precedente " << std::endl; }else if(ca==DESCEND_NORMAL_CYCLE){ std::cerr << "\t DESCEND_NORMAL_CYCLE" << std::endl; std::cerr << "ciclo!! partendo da : " << s.parent_atom()->id() << " scenderei in " << s.curr_atom()->id() << " proveniente da un legame " << s.bond_type() << " e " << s.no_children() << " figli " << std::endl; std::cerr << "\tformano un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR_CYCLE){ std::cerr << "\t SET_BLACK_CURR_CYCLE" << std::endl; std::cerr << s.curr_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR){ std::cerr << "\t SET_BLACK_CURR" << std::endl; std::cerr << s.curr_atom()->id() << " diventa black " << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT_CYCLE){ std::cerr << "\t DESCEND_SET_BLACK_PARENT_CYCLE" << std::endl; std::cerr << "partendo da : " << s.parent_atom()->id() << " scenderei in " << s.curr_atom()->id() << " proveniente da un legame " << s.bond_type() << " e " << s.no_children() << " figli " << std::endl; std::cerr << s.parent_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT){ std::cerr << "\t DESCEND_SET_BLACK_PARENT" << std::endl; std::cerr << "partendo da : " << s.parent_atom()->id() << " scenderei in " << s.curr_atom()->id() << " proveniente da un legame " << s.bond_type() << " e " << s.no_children() << " figli " << std::endl; std::cerr << s.parent_atom()->id() << " diventa black " << std::endl; }else if(ca==FORCE_BLACK_PARENT){ std::cerr << "\t FORCE_BLACK_PARENT" << std::endl; std::cerr << " forzo " << s.parent_atom()->id() << " black " << std::endl; } } bool molecule_matching::TEST_BFS(){ int st=1; _sub.DFS_step(&st); gruppo* g=_sub.get_pointer_gruppo(); std::cerr << "---- 1 -> 2 ---------" << std::endl; _sub.DFS_find_descend_forced(g->find_atomo_id(1), g->find_atomo_id(2)); _sub.dump(); _sub.dump_history(); std::cerr << "-------------" << std::endl; std::cerr << "---- shift ---------" << std::endl; _sub.DFS_shift_descendant(true); _sub.dump(); _sub.dump_history(); std::cerr << "-------------" << std::endl; std::cerr << "---- shift seconfo---------" << std::endl; _sub.DFS_shift_descendant(true); _sub.dump(); _sub.dump_history(); std::cerr << "-------------" << std::endl; return true; } bool molecule_matching::TEST_DFS_forced(){ int st=0; _sub.DFS_step(&st); gruppo* g=_sub.get_pointer_gruppo(); std::cerr << "---- 0 -> 1 ---------" << std::endl; _sub.DFS_find_descend_forced(g->find_atomo_id(0), g->find_atomo_id(1)); _sub.dump(); _sub.dump_history(); std::cerr << "-------------" << std::endl; std::cerr << "---- 1 -> 2 ---------" << std::endl; _sub.DFS_find_descend_forced(g->find_atomo_id(1), g->find_atomo_id(2)); _sub.dump(); _sub.dump_history(); std::cerr << "---- set 2 black ---" << std::endl; _sub.DFS_step(); _sub.dump(); _sub.dump_history(); std::cerr << "dump blacks " << std::endl; _sub.dump_blacks(); /* std::cerr << "---- 2 -> 1 ---------" << std::endl; _sub.DFS_find_descend_forced(g->find_atomo_id(2), g->find_atomo_id(1)); _sub.dump(); _sub.dump_history(); std::cerr << "-------------" << std::endl; */ std::cerr << "---- pop 2 ---------" << std::endl; _sub.DFS_pop_current_atom(true); _sub.dump(); _sub.dump_history(); std::cerr << "MMMM " <<_sub.is_black(g->find_atomo_id(2)) << std::endl; std::cerr << "---- 1 -> 3 ---------" << std::endl; _sub.DFS_find_descend_forced(g->find_atomo_id(1), g->find_atomo_id(3)); _sub.dump(); _sub.dump_history(); std::cerr << "MMMM " <<_sub.is_black(g->find_atomo_id(2)) << std::endl; std::cerr << "---- pop 3 ??? ---------" << std::endl; _sub.DFS_pop_current_atom(true); _sub.dump(); _sub.dump_history(); std::cerr << "MMMM " <<_sub.is_black(g->find_atomo_id(2)) << std::endl; std::cerr << "dump blacks " << std::endl; _sub.dump_blacks(); return true; } bool molecule_matching::TEST_DFS(){ int st=0; _sub.DFS_step(&st); atomo* res=NULL; _sub.DFS_step(); debug_print_DFS(_sub); _sub.DFS_step(); debug_print_DFS(_sub); _sub.DFS_step(); debug_print_DFS(_sub); //DEBUG_TO_CERR(_sub.DFS_simulate_shift_descendant(&res)); if(res){ std::cerr << "scenderei in " << res->id() << std::endl; } _sub.dump_history(); _sub.dump(); return false; for(int i=0;i<10;i++){ if(_sub.DFS_is_finished()){ std::cerr << "finito" << std::endl; }else{ _sub.DFS_step(); action ca=_sub.curr_action(); if(ca==DESCEND_NORMAL){ std::cerr << "\tDESCEND_NORMAL" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; }else if(ca==DESCEND_TERMINAL){ std::cerr << "\tDESCEND_TERMINAL" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << " questo verra' eliminato " << std::endl; }else if(ca==DELETE_TERMINAL){ std::cerr << "\t DELETE_TERMINAL" << std::endl; std::cerr << " eliminato precedente " << std::endl; }else if(ca==DESCEND_NORMAL_CYCLE){ std::cerr << "\t DESCEND_NORMAL_CYCLE" << std::endl; std::cerr << "ciclo!! partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; std::cerr << "\tformano un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR_CYCLE){ std::cerr << "\t SET_BLACK_CURR_CYCLE" << std::endl; std::cerr << _sub.curr_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR){ std::cerr << "\t SET_BLACK_CURR" << std::endl; std::cerr << _sub.curr_atom()->id() << " diventa black " << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT_CYCLE){ std::cerr << "\t DESCEND_SET_BLACK_PARENT_CYCLE" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; std::cerr << _sub.parent_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT){ std::cerr << "\t DESCEND_SET_BLACK_PARENT" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; std::cerr << _sub.parent_atom()->id() << " diventa black " << std::endl; } } } _sub.dump_history(); return true; _sub.backstep(); _sub.backstep(); _sub.backstep(); std::cerr << "indietro di 3 " << std::endl; _sub.dump_history(); for(int i=0;i<10;i++){ if(_sub.DFS_is_finished()){ std::cerr << "finito" << std::endl; }else{ _sub.DFS_step(); action ca=_sub.curr_action(); if(ca==DESCEND_NORMAL){ std::cerr << "\tDESCEND_NORMAL" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; }else if(ca==DESCEND_TERMINAL){ std::cerr << "\tDESCEND_TERMINAL" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << " questo verra' eliminato " << std::endl; }else if(ca==DELETE_TERMINAL){ std::cerr << "\t DELETE_TERMINAL" << std::endl; std::cerr << " eliminato precedente " << std::endl; }else if(ca==DESCEND_NORMAL_CYCLE){ std::cerr << "\t DESCEND_NORMAL_CYCLE" << std::endl; std::cerr << "ciclo!! partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; std::cerr << "\tformano un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR_CYCLE){ std::cerr << "\t SET_BLACK_CURR_CYCLE" << std::endl; std::cerr << _sub.curr_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==SET_BLACK_CURR){ std::cerr << "\t SET_BLACK_CURR" << std::endl; std::cerr << _sub.curr_atom()->id() << " diventa black " << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT_CYCLE){ std::cerr << "\t DESCEND_SET_BLACK_PARENT_CYCLE" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; std::cerr << _sub.parent_atom()->id() << " diventa black " << std::endl; std::cerr << "\te chiude un ciclo" << std::endl; }else if(ca==DESCEND_SET_BLACK_PARENT){ std::cerr << "\t DESCEND_SET_BLACK_PARENT" << std::endl; std::cerr << "partendo da : " << _sub.parent_atom()->id() << " scenderei in " << _sub.curr_atom()->id() << " proveniente da un legame " << _sub.bond_type() << " e " << _sub.no_children() << " figli " << std::endl; std::cerr << _sub.parent_atom()->id() << " diventa black " << std::endl; } } } _sub.dump_history(); return true; } bist-0.5.2/src/immagine_mol.cpp0000644000175000017500000002167311406210753014777 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; immagine_mol::immagine_mol() :immagine(), _atoms_number(0) { } immagine_mol::immagine_mol(string path) :immagine(path), _atoms_number(0) { } immagine_mol::immagine_mol(const immagine_mol& altra) :immagine::immagine(altra) { } immagine_mol::~immagine_mol(){ } void immagine_mol::filebist(string path){ struct stat attrb; stat(path.c_str(),&attrb); if(!S_ISDIR(attrb.st_mode)){ reset_all(); _filebist=path; if(path==""){ return; } ifstream inf(_filebist.c_str(),ios::in); if(!inf){ _has_error=true; string error="Error: file " + _filebist + " do not exist."; _error.push_back(error); }else{ while(!inf.eof()){ string linea; getline(inf,linea,'\n'); _molecule+=linea + std::string("\n"); } } inf.close(); } } void immagine_mol::start(){ setlocale(LC_ALL,"C"); parse_file_mol(); #ifdef DEBUG dump_tmp_atom(); #endif setlocale(LC_ALL,""); } void immagine_mol::start_from_string(std::string mol){ _molecule=mol; start(); } void immagine_mol::parse_file_mol(){ skip_header_lines(); atoms_number(); gruppo the_g; _gruppi.push_back(the_g); atom_block(_gruppi.back()); connection_table(_gruppi.back()); m_charge(_gruppi.back()); gruppo* bk=&_gruppi.back(); vector::iterator ina=bk->iniz_atom(); vector::iterator enda=bk->fin_atom(); while(ina!=enda){ atomo* atm=bk->find_atomo_id(ina->id()); atm->costruisci_arrivati(); ina++; } //std::cerr << "HAS ERROR: " << _has_error << std::endl; } void immagine_mol::skip_header_lines(){ skip_junk_from_line(); skip_junk_from_line(); skip_junk_from_line(); } void immagine_mol::skip_junk_from_line(){ //std::cerr << "SKIP" << std::endl; string::size_type i=_punt_mol; try{ while(_molecule.at(i)!='\n'){ //std::cerr << _molecule.at(i); i++; } }catch (out_of_range e){ _punt_mol=i+1; _has_error=true; //std::cerr << "EX"<< std::endl; } //std::cerr << "<-" << std::endl; _punt_mol=i+1; } void immagine_mol::connection_table(gruppo& the_group){ try{ while(_molecule.at(_punt_mol)!=IMMAGINE_MOL_MOD_IDENTIFIER){ bond_block(the_group); } }catch (out_of_range e){ _has_error=true; //std::cerr << "EX"<< std::endl; } } void immagine_mol::atoms_number(){ std::string num; while(isspace(_molecule[_punt_mol])){ _punt_mol++; } while(_punt_mol< _molecule.size() && isdigit(_molecule[_punt_mol]) ){ num+=_molecule[_punt_mol]; _punt_mol++; } //std::cerr << "NUM " << num << std::endl; char* tail; int atoms=strtol(num.c_str(),&tail,0); _punt_mol+=num.size(); if((*tail)!='\0'){ _has_error=true; gen_err_miss_number(_punt_mol, num.size()); }else{ _atoms_number=atoms; } skip_junk_from_line(); #ifdef DEBUG std::cerr << __FUNCTION__ << " " << "atoms number " << _atoms_number<< std::endl; #endif } void immagine_mol::atom_block(gruppo& the_group){ for(int i=0;i<_atoms_number;i++){ float x=coordinate(); float y=coordinate(); float z=coordinate(); std::string symbol=periodic_table_entry(); skip_junk_from_line(); atomo tmp_atom; etichetta tmp_etichetta; if(symbol=="C" || symbol=="c"){ tmp_etichetta.aggiungi(NO_ETIC,ET_STR); }else{ tmp_etichetta.aggiungi(symbol, ET_STR); } tmp_atom.id(i); tmp_atom.pos_x(x); tmp_atom.pos_y(y); tmp_atom.pos_z(z); tmp_atom.etich(tmp_etichetta); tmp_atom.aggiungi_genitore(&the_group); the_group.add_atomo(tmp_atom); } } float immagine_mol::coordinate(){ char* tail; const char* mol_c=_molecule.c_str(); float coord=strtod(mol_c + _punt_mol,&tail); _punt_mol+=tail - (mol_c + _punt_mol); if((*tail)!=' '){ _has_error=true; gen_err_miss_number(_punt_mol , (tail - (mol_c + _punt_mol))); //std::cerr << "ERRORE" << std::endl; }else{ } return coord; } void immagine_mol::bond_block(gruppo& the_group){ int atom_f=node_entry()-1; int atom_s=node_entry()-1; int order=node_entry(); atomo* atm_f=the_group.find_atomo_id(atom_f); atomo* atm_s=the_group.find_atomo_id(atom_s); int type_b=LEGAME_SINGOLO; switch(order){ case 1: type_b=LEGAME_SINGOLO; break; case 2: type_b=LEGAME_DOPPIO; break; case 3: type_b=LEGAME_TRIPLO; break; default: type_b=LEGAME_SINGOLO; break; } if( atm_f !=0 && atm_s!=0){ atm_f->aggiungi_legame(atm_s->id(),type_b,0,0,0); atm_s->aggiungi_legame(atm_f->id(),type_b,0,0,0); } skip_junk_from_line(); } int immagine_mol::node_entry(){ char* tail; const char* mol_c=_molecule.c_str(); int res=strtol(mol_c + _punt_mol,&tail,0); _punt_mol+=tail - (mol_c + _punt_mol); if((*tail)!=' '){ _has_error=true; gen_err_miss_number(_punt_mol , (tail - (mol_c + _punt_mol))); //std::cerr << "ERRORE" << std::endl; }else{ } return res; } int immagine_mol::numeric_entry_int(){ char* tail; const char* mol_c=_molecule.c_str(); int res=strtol(mol_c + _punt_mol,&tail,0); _punt_mol+=tail - (mol_c + _punt_mol); if((*tail)!=' ' && (*tail)!='\n' ){ _has_error=true; gen_err_miss_number(_punt_mol , (tail - (mol_c + _punt_mol))); }else{ } return res; } int immagine_mol::numeric_entry_float(){ char* tail; const char* mol_c=_molecule.c_str(); float res=strtod(mol_c + _punt_mol,&tail); _punt_mol+=tail - (mol_c + _punt_mol); if((*tail)!=' ' && (*tail)!='\n'){ _has_error=true; gen_err_miss_number(_punt_mol , (tail - (mol_c + _punt_mol))); //std::cerr << "ERRORE" << std::endl; }else{ } return res; } std::string immagine_mol::periodic_table_entry(){ std::string res=""; try{ string::size_type i=_punt_mol; while(isspace(_molecule.at(i))){ i++; } _punt_mol=i; while(!isspace(_molecule.at(i))){ res+=_molecule.at(i); i++; } _punt_mol=i; }catch (out_of_range e){ _has_error=true; } //std::cerr << "res: " << res << std::endl; return res; } void immagine_mol::m_charge(gruppo& the_group){ /* #define IMMAGINE_MOL_M_END "M END" #define IMMAGINE_MOL_M_CHG "M CHG" #define IMMAGINE_MOL_MOD_IDENTIFIER 'M' */ std::string::size_type m_end_size=std::string(IMMAGINE_MOL_M_END).size(); std::string::size_type m_chg_size=std::string(IMMAGINE_MOL_M_CHG).size(); try{ std::string mod=""; std::string::size_type i=0; for(;icariche(atm_chg); } } m_charge(the_group); }else{ std::string mod_end=""; std::string::size_type i=0; for(;i. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include <2D_vector.hpp> #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; /****************mol_canvas*************************/ mol_canvas::mol_canvas(int X,int Y,int W,int H) :Fl_Widget(X,Y,W,H), _la_molecola(0), _x_pivot(w()/2), _y_pivot(h()/2), _action(ACT_NOTHING), _start_atom(0), _end_atom(0), _b_arrow_added(false), _x_arc_centr(0), _y_arc_centr(0), _arc_max_ax(0), _arc_min_ax(0), _b_bond_added(false), _x_added_atom(0), _y_added_atom(0), _b_construct_box(false), _pivot_xpm(pivot_xpm), _fixed_rotation_degree(0), _glue_mode(true) { box(FL_ENGRAVED_BOX); color(FL_WHITE); } void mol_canvas::num_atom_chain(unsigned int nw){ _num_atom_chain=nw; } void mol_canvas::orient_chain(float nw){ _orient_chain=nw; } void mol_canvas::fixed_rotation_degree(float nw){ _fixed_rotation_degree=nw; } void mol_canvas::add_immagine(immagine* imm){ #ifdef DEBUG std::cerr << "added: " << imm << endl; #endif _la_molecola=imm; _la_molecola->ruota(); } mol_canvas::~mol_canvas(){ #ifdef DEBUG cerr << "distrutto mol_canvas" << endl; #endif } void mol_canvas::action(int nw){ _action=nw; } int mol_canvas::action(){ return _action; } bool mol_canvas::glue_mode(){ return _glue_mode; } void mol_canvas::glue_mode(bool nw){ _glue_mode=nw; } bool mol_canvas::toggle_glue_mode(){ bool old=glue_mode(); _glue_mode=!glue_mode(); return old; } void mol_canvas::draw(){ draw_box(); if(__pref.getDrawGrid()){ fl_color(0xdd,0xdd,0xdd); char dash[2]={__pref.get_tratteggio_legame(),0}; //preferenze fl_line_style(FL_SOLID,1,dash); float incrx=__pref.getGridSpacing() * __pref.getZoom(); float incry=__pref.getGridSpacing() * __pref.getZoom(); int main_w=MainWindow->ritorna_mol_canvas()->window()->w(); int main_h=MainWindow->ritorna_mol_canvas()->window()->h()-ALT_BUTT_TOP-HEIGHT_INF_BAR; for(float i=x();i<=w()+x();i+=incrx){ if (i > 0 && i <= main_w){ fl_line(static_cast(rintf(i)), y(), static_cast(rintf(i)), y() + h()); } } for(float i=y();i<=h()+y();i+=incry){ if (i > 0 && i <= main_h){ fl_line(x(), static_cast(rintf(i)), x()+w(), static_cast(rintf(i))); } } } fl_line_style(0); if(_la_molecola){ _la_molecola->disegna(); } switch(_action){ case ACT_DRAW_ARROW: if(_b_arrow_added){ fl_color(255,0,0); fl_line(_x_mouse,_y_mouse,Fl::event_x(),Fl::event_y()); } break; case ACT_DRAW_SINGLE_BOND: if(!_b_bond_added){ draw_preview_bond(ACT_DRAW_SINGLE_BOND); } break; case ACT_DRAW_DOUBLE_BOND: if(!_b_bond_added){ draw_preview_bond(ACT_DRAW_SINGLE_BOND); } break; case ACT_DRAW_TRIPLE_BOND: if(!_b_bond_added){ draw_preview_bond(ACT_DRAW_TRIPLE_BOND); } break; case ACT_DRAW_BEZIER: if(_bezier_point.size()<4){ for(unsigned int i=0;i<_bezier_point.size();i++){ draw_point(_bezier_point[i].first,_bezier_point[i].second); } } break; case ACT_DRAW_ARC: if(_arc_max_ax){ draw_point(_x_arc_centr,_y_arc_centr); fl_color(COMP_R_EV,COMP_G_EV,COMP_B_EV); /* fl_arc(_x_arc_centr, _y_arc_centr, abs(_arc_max_ax), abs(_arc_min_ax), 0, 360); */ /* proc_arc* agg=new proc_arc(0, xc-dx_scroll, yc+h/2-dy_scroll, xc+w-dx_scroll, yc+h/2-dy_scroll, xc-dx_scroll, yc-dy_scroll, xc+w-dx_scroll, yc-dy_scroll, xc-dx_scroll, yc+h-dy_scroll, xc+w-dx_scroll, yc+h-dy_scroll, 0, 0, 0 , 0, 0, 0, 1, 0); */ fl_begin_line(); fl_curve(_x_arc_centr, _y_arc_centr+_arc_min_ax/2, _x_arc_centr, _y_arc_centr, _x_arc_centr+_arc_max_ax,_y_arc_centr, _x_arc_centr+_arc_max_ax, _y_arc_centr+_arc_min_ax/2); fl_end_line(); fl_begin_line(); fl_curve(_x_arc_centr, _y_arc_centr+_arc_min_ax/2, _x_arc_centr, _y_arc_centr+_arc_min_ax, _x_arc_centr+_arc_max_ax,_y_arc_centr+_arc_min_ax, _x_arc_centr+_arc_max_ax, _y_arc_centr+_arc_min_ax/2); fl_end_line(); } break; case ACT_SEL_ATOM: case ACT_SEL_BOX: if(_b_construct_box){ _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); fl_color(COMP_R_EV,COMP_G_EV,COMP_B_EV); fl_loop(_x_mouse, _y_mouse, _x_mouse+(Fl::event_x()-_x_mouse), _y_mouse, _x_mouse+(Fl::event_x()-_x_mouse), _y_mouse+(Fl::event_y()-_y_mouse), _x_mouse, _y_mouse+(Fl::event_y()-_y_mouse)); } break; case ACT_DRAW_BOX: if(_b_construct_box){ _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); fl_color(COMP_R_EV,COMP_G_EV,COMP_B_EV); fl_loop(_x_mouse, _y_mouse, _x_mouse+(Fl::event_x()-_x_mouse), _y_mouse, _x_mouse+(Fl::event_x()-_x_mouse), _y_mouse+(Fl::event_y()-_y_mouse), _x_mouse, _y_mouse+(Fl::event_y()-_y_mouse)); } break; case ACT_ROTATE_SELECTED: _pivot_xpm.draw(_x_pivot-_pivot_xpm.w()/2, _y_pivot-_pivot_xpm.h()/2); break; default: break; } } int mol_canvas::handle(int e){ if(plugin()!=0 && plugin()->time_to_act()){ plugin()->act(e); return 1; } // editor* ed=dynamic_cast(MainWindow); //static float trx=10; // static float trxm=0.5; //static float angl=0.1; switch(e){ case FL_PASTE: //std::cerr << Fl::event_text() << std::endl; return 1; case FL_LEAVE: redraw(); return 1; case FL_FOCUS: redraw(); return 1; case FL_UNFOCUS: redraw(); return 1; case FL_KEYDOWN: switch(Fl::event_key()){ case FL_Up: switch(_action){ case ACT_SCALE_SELECTED: { if(Fl::event_ctrl()){ _la_molecola->scale_label_of_atom_selected(1.01); }else{ _la_molecola->scala_selected(1.01); } redraw(); break; } case ACT_ROTATE_SELECTED: _la_molecola->ruota_selected(-mol_canvas::rotation_incr/2 ,_x_pivot,_y_pivot); redraw(); break; default: set_action_translate_selected_push_handle(); _la_molecola->trasla_selected(0,-1); fl_cursor(FL_CURSOR_DEFAULT); redraw(); } return 1; case FL_Down: switch(_action){ case ACT_SCALE_SELECTED: { if(Fl::event_ctrl()){ _la_molecola->scale_label_of_atom_selected(0.99); }else{ _la_molecola->scala_selected(0.99); } redraw(); break; } case ACT_ROTATE_SELECTED: _la_molecola->ruota_selected(mol_canvas::rotation_incr/2 ,_x_pivot,_y_pivot); redraw(); break; default: set_action_translate_selected_push_handle(); _la_molecola->trasla_selected(0,1); fl_cursor(FL_CURSOR_DEFAULT); redraw(); break; } return 1; case FL_Left: switch(_action){ default: { set_action_translate_selected_push_handle(); _la_molecola->trasla_selected(-1,0); fl_cursor(FL_CURSOR_DEFAULT); redraw(); break; } } return 1; case FL_Right: switch(_action){ default: { set_action_translate_selected_push_handle(); _la_molecola->trasla_selected(1,0); fl_cursor(FL_CURSOR_DEFAULT); redraw(); break; } } return 1; case GUI_KEY_ZOOM: zoom_center_to_mousepointer(mol_canvas::zoom_incr); return 1; case GUI_KEY_UNZOOM: zoom_center_to_mousepointer(-mol_canvas::zoom_incr); return 1; case GUI_KEY_GLUE_MODE: { toggle_glue_mode(); redraw(); } return 1; //DEBUG // case 'e': // { // try{ // gruppo ring=create_ring(__pref.getBond_fixedlength(), 3,true); // ring.trasla(50,50); // _la_molecola->aggiungi_gruppo(ring); // redraw(); // }catch (out_of_range){ // std::cerr<< "eccezione" << std::endl; // } // // _la_molecola->PROVA_ISOMORPH(); // // //_la_molecola->trasla(trx,0); // // redraw(); // } // return 1; // break; // case 'l': // { // spectra_plot::plot_window p; // p.add_spike(3000,50); // p.add_group(_la_molecola->ritorna_gruppo(0),3000,50); // p.show(); // while(p.shown()){ // Fl::wait(); // } //} //return 1; //case 'y': // for(int i=0;i<7;i++){ // add_bezier_along_circle(_la_molecola->find_group_id(0), 200+i*100, 200, 50, 0, M_PI - i/4); // add_bezier_along_circle(_la_molecola->find_group_id(0), 200+i*100, 300, 20+i*50, 0, M_PI-i/2); // } // add_bezier_along_circle(_la_molecola->find_group_id(0), 400, 200, 100, 0, M_PI/2); // add_bezier_along_circle(_la_molecola->find_group_id(0), 200, 200, 100, deg2rad(100),deg2rad(160)); // add_bezier_along_circle(_la_molecola->find_group_id(0), 200, 200, 100, deg2rad(0),deg2rad(180)); // add_bezier_along_circle(_la_molecola->find_group_id(0), 400, 400, 50, deg2rad(0),deg2rad(180)); // add_bezier_along_circle(_la_molecola->find_group_id(0), 500, 400, 50, deg2rad(0),deg2rad(90)); // redraw(); //return 1; // case 'q': // _la_molecola->ruota(120,120,angl); // redraw(); // return 1; // break; // case 'w': // _la_molecola->ruota(120,120,-angl); // redraw(); // return 1; // break; // case 'i': // cout << "i pressed" << endl; // _la_molecola->PROVA_TRASLA_MULTILINE(); // redraw(); // return 1; // case 'r': // { // int dx_scr=(MainWindow->ritorna_mol_canvas())->x(); // int dy_scr=(MainWindow->ritorna_mol_canvas())->y(); // _la_molecola->paste(Fl::event_x()-dx_scr,Fl::event_y()-dy_scr); // redraw(); // return 1; // } // case 's': // { // return 1; // } // case 'd': // if(_la_molecola->prova_click_atomo(&_start_atom,Fl::event_x(),Fl::event_y())>=0){ // cout << "iio_start_atom " << _start_atom << endl; // } // { // float alfa=__pref.getBond_fixedangle(); // float length=__pref.getBond_fixedlength(); // _x_mouse=Fl::event_x(); // _y_mouse=Fl::event_y(); // _x_added_atom=_x_mouse+length*cos(alfa); // _y_added_atom=_y_mouse+length*sin(alfa); // genera_catena(10,M_PI/2); // // _la_molecola->scale(0.99); // redraw(); // return 1; // } // default: return 0; } case FL_MOUSEWHEEL: if(Fl::event_dy()!=0){ if(_action == ACT_SCALE_SELECTED){ float incr=mol_canvas::scale_incr; if(Fl::event_ctrl()){ incr*=2; } _la_molecola->scala_selected(Fl::event_dy()>0 ? 1 + incr : 1 - incr); redraw(); return 1; }else if(_action == ACT_ROTATE_SELECTED){ float incr=mol_canvas::rotation_incr; if(Fl::event_ctrl()){ incr*=4; } _la_molecola->ruota_selected(Fl::event_dy()>0 ? incr : -incr,_x_pivot,_y_pivot); redraw(); return 1; }else if(Fl::event_ctrl() || _action== ACT_ZOOM || _action== ACT_UNZOOM){ if(Fl::event_dy()>0){ zoom_center_to_mousepointer(-mol_canvas::zoom_incr); }else{ zoom_center_to_mousepointer(mol_canvas::zoom_incr); return 1; } }else{ return 0; } }else{ // if dy ==0 return 0; } case FL_DRAG: switch(_action){ case ACT_TRANSL_CANVAS: { int dx=Fl::event_x()-_x_mouse; int dy=Fl::event_y()-_y_mouse; _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); translate(dx, dy); dynamic_cast(MainWindow)->redraw(); } return 1; case ACT_SEL_ATOM: case ACT_SEL_BOX: { } redraw(); return 1; case ACT_DRAW_BOX: { } redraw(); return 1; case ACT_SCALE_SELECTED: { float dy=Fl::event_y()-_y_mouse; _y_mouse=Fl::event_y(); _la_molecola->scala_selected(dy>0 ? 1.02 : 0.98); redraw(); return 1; } case ACT_ROTATE_SELECTED: { //float dx=Fl::event_x()-_x_mouse; int dy=static_cast(rintf(Fl::event_y()-_y_mouse)); // int dx=static_cast(rintf(Fl::event_x()-_x_mouse)); float ang_rot=mol_canvas::rotation_incr; if(dy<-2){ ang_rot=-ang_rot; _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); }else if (dy >= -2 && dy <=2) { ang_rot=0; }else{ _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); } _la_molecola->ruota_selected( ang_rot,_x_pivot,_y_pivot); redraw(); return 1; } case ACT_3D_ROT: { int dy=static_cast(rintf(Fl::event_y()-_y_mouse)); int dx=static_cast(rintf(Fl::event_x()-_x_mouse)); float ang_rot=-0.05; if(dy<-2){ ang_rot=-ang_rot; _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); }else if (dy >= -2 && dy <=2) { ang_rot=0; }else{ _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); } _la_molecola->rotate_selected_3d(true, ang_rot); ang_rot=-0.05; if(dx<-2){ ang_rot=-ang_rot; _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); }else if (dx >= -2 && dx <=2) { ang_rot=0; }else{ _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); } _la_molecola->rotate_selected_3d(false, ang_rot); redraw(); return 1; } case ACT_TRANSLATE_SELECTED: { int dx=Fl::event_x()-_x_mouse; int dy=Fl::event_y()-_y_mouse; _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); _la_molecola->trasla_selected(dx,dy); if(glue_mode()){ test_and_glue_objects(); } redraw(); return 1; } case ACT_DRAW_SINGLE_BOND: case ACT_DRAW_DOUBLE_BOND: case ACT_DRAW_TRIPLE_BOND: if(_la_molecola->prova_click_atomo(&_end_atom,Fl::event_x(),Fl::event_y())<0 ){ _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); _end_atom=0; } redraw(); return 1; case ACT_DRAW_ARROW: redraw(); return 1; case ACT_DRAW_ARC: { _arc_max_ax=Fl::event_x()-_x_arc_centr; _arc_min_ax=Fl::event_y()-_y_arc_centr; redraw(); return 1; } case ACT_EDIT_CONTROL_POINT_CURVES: { int dx=Fl::event_x()-_x_mouse; int dy=Fl::event_y()-_y_mouse; _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); _la_molecola->translate_control_points(dx, dy); redraw(); } return 1; } case FL_RELEASE: switch(_action){ case ACT_TRANSL_CANVAS: _action=ACT_SEL_ATOM; break; case ACT_SEL_ATOM: if(_b_construct_box){ _b_construct_box=false; _la_molecola->aggiungi_se_dentro_bb(_x_mouse, _y_mouse, Fl::event_x()-_x_mouse , Fl::event_y()-_y_mouse); } break; case ACT_SEL_BOX: { int lux=(_x_mouse < Fl::event_x() ? _x_mouse : Fl::event_x()); int luy=(_y_mouse < Fl::event_y() ? _y_mouse : Fl::event_y()); int rbx=(_x_mouse > Fl::event_x() ? _x_mouse : Fl::event_x()); int rby=(_y_mouse > Fl::event_y() ? _y_mouse : Fl::event_y()); int w=rbx - lux; int h=rby - luy; _la_molecola->aggiungi_se_dentro_bb(lux, luy, w, h); _b_construct_box=false; _action=ACT_SEL_ATOM; } return 1; case ACT_DRAW_BOX: { if(_b_construct_box){ reg_modified(); int lux=(_x_mouse < Fl::event_x() ? _x_mouse : Fl::event_x()); int luy=(_y_mouse < Fl::event_y() ? _y_mouse : Fl::event_y()); int rbx=(_x_mouse > Fl::event_x() ? _x_mouse : Fl::event_x()); int rby=(_y_mouse > Fl::event_y() ? _y_mouse : Fl::event_y()); attract_mouse_to_magnetic_point(&lux,&luy); attract_mouse_to_magnetic_point(&rbx,&rby); _la_molecola->create_new_box(lux, luy, rbx, rby); } _b_construct_box=false; } return 1; case ACT_TRANSLATE_SELECTED: { fl_cursor(FL_CURSOR_DEFAULT); _x_mouse=0; _y_mouse=0; editor* ed=dynamic_cast(MainWindow); _action=ed->get_button_value_as_action(); //_action=ACT_SEL_ATOM; } break; case ACT_DRAW_SINGLE_BOND: if(_x_mouse>0 && _y_mouse>0){ return aggiungi_nuovo_legame(LEGAME_SINGOLO); }else{ return 1; } case ACT_DRAW_DOUBLE_BOND: if(_x_mouse>0 && _y_mouse>0){ return aggiungi_nuovo_legame(LEGAME_DOPPIO); }else{ return 1; } case ACT_DRAW_TRIPLE_BOND: if(_x_mouse>0 && _y_mouse>0){ return aggiungi_nuovo_legame(LEGAME_TRIPLO); }else{ return 1; } case ACT_DRAW_ARROW: if(_b_arrow_added){ reg_modified(); int mag_x=Fl::event_x(); int mag_y=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&mag_x,&mag_y); _la_molecola->crea_freccia_nuova(_x_mouse, _y_mouse, mag_x,mag_y); _b_arrow_added=false; } return 1; case ACT_DRAW_ARC: if(_arc_max_ax){ reg_modified(); _la_molecola->crea_ellisse_nuova(_x_arc_centr,_y_arc_centr, _arc_max_ax, _arc_min_ax); _arc_max_ax=0; redraw(); } return 1; case ACT_ROTATE_SELECTED: fl_cursor(FL_CURSOR_DEFAULT); return 1; case ACT_EDIT_CONTROL_POINT_CURVES: _la_molecola->unset_selected_control_points(); _action=ACT_SEL_ATOM; return 1; } return 1; case FL_PUSH: { /* _la_molecola->PROVA_TRASLA_MULTILINE(); return 1; */ if(action()==ACT_NOTHING){ return 0; } if(Fl::event_button()==FL_RIGHT_MOUSE){ reg_modified(); int fl_event_x=Fl::event_x(); int fl_event_y=Fl::event_y(); if(!_la_molecola->cambia_prop_atomo(fl_event_x, fl_event_y)){ _la_molecola->cambia_prop_legami(fl_event_x, fl_event_y); } if(_la_molecola->cambia_prop_bezier(fl_event_x, fl_event_y)){ }else if(_la_molecola->cambia_prop_frecce(fl_event_x, fl_event_y)){ }else if(_la_molecola->cambia_prop_arc(fl_event_x, fl_event_y)){ }else if(_la_molecola->change_prop_box(fl_event_x, fl_event_y)){ }else if(_la_molecola->cambia_prop_etichetta(fl_event_x, fl_event_y)){ }else{ } }else if(Fl::event_button()==FL_MIDDLE_MOUSE){ switch(_action){ case ACT_SCALE_SELECTED: _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); return 1; case ACT_ROTATE_SELECTED: _x_pivot=Fl::event_x(); _y_pivot=Fl::event_y(); redraw(); return 1; case ACT_FLIP_VER: _la_molecola->copy_flip(Fl::event_x(),Fl::event_y(),false); return 1; case ACT_FLIP_HOR: _la_molecola->copy_flip(Fl::event_x(),Fl::event_y()); return 1; } }else{ // left mouse button pressed //editor* ed=dynamic_cast(MainWindow); if(Fl::event_key(FL_Shift_L)){ _action=ACT_TRANSL_CANVAS; _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); redraw(); }else{ switch(_action){ case ACT_ZOOM: zoom_center_to_mousepointer(mol_canvas::zoom_incr); return 1; case ACT_UNZOOM: zoom_center_to_mousepointer(-mol_canvas::zoom_incr); return 1; case ACT_FLIP_VER: _la_molecola->flip(Fl::event_x(),Fl::event_y(),false); return 1; case ACT_FLIP_HOR: _la_molecola->flip(Fl::event_x(),Fl::event_y()); return 1; case ACT_PASTE: { reg_modified(); int dx_scr=(MainWindow->ritorna_mol_canvas())->x(); int dy_scr=(MainWindow->ritorna_mol_canvas())->y(); _la_molecola->paste(Fl::event_x()-dx_scr,Fl::event_y()-dy_scr); redraw(); } return 1; case ACT_DRAW_CHAIN: { if(_num_atom_chain>1){ reg_modified(); /* int dx=(MainWindow->ritorna_mol_canvas())->x(); int dy=(MainWindow->ritorna_mol_canvas())->y(); */ if(_la_molecola->prova_click_atomo(&_start_atom,Fl::event_x(),Fl::event_y())>=0){ //cout << "_start_atom " << _start_atom << endl; }else{ float alfa=__pref.getBond_fixedangle(); float length=scale_z(__pref.getBond_fixedlength()); //*__pref.getZoom(); _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&_x_mouse,&_y_mouse); _x_added_atom=static_cast(rintf(_x_mouse+length*cos(alfa))); _y_added_atom=static_cast(rintf(_y_mouse+length*sin(alfa))); } genera_catena(_num_atom_chain,_orient_chain); redraw(); } return 1; } case ACT_FIXED_ROTATION: reg_modified(); _x_pivot=Fl::event_x(); _y_pivot=Fl::event_y(); _la_molecola->ruota_selected(_fixed_rotation_degree,_x_pivot,_y_pivot); redraw(); return 1; case ACT_DRAW_ORB: { reg_modified(); int cntx=Fl::event_x(); int cnty=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&cntx,&cnty); float wo=scale_z(10); float ho=scale_z(20); vector< pair > punti; pair primo(cntx,cnty); punti.push_back(primo); primo.first=cntx-wo; primo.second=cnty+ho; punti.push_back(primo); primo.first=cntx+wo; primo.second=cnty+ho; punti.push_back(primo); primo.first=cntx+0.001; primo.second=cnty; punti.push_back(primo); _la_molecola->crea_bezier_nuova(punti); punti[1].second=cnty-ho; punti[2].second=cnty-ho; _la_molecola->crea_bezier_nuova(punti); redraw(); return 1; } case ACT_SCALE_SELECTED: reg_modified(); return 1; case ACT_ROTATE_SELECTED: fl_cursor(FL_CURSOR_NS); _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); reg_modified(); return 1; case ACT_TRANSLATE_SELECTED: set_action_translate_selected_push_handle(); reg_modified(); return 1; case ACT_DRAW_SINGLE_BOND: case ACT_DRAW_DOUBLE_BOND: case ACT_DRAW_TRIPLE_BOND: { reg_modified(); int dx=(MainWindow->ritorna_mol_canvas())->x(); int dy=(MainWindow->ritorna_mol_canvas())->y(); _b_bond_added=false; if(_la_molecola->prova_click_atomo(&_start_atom,Fl::event_x(),Fl::event_y())>=0){ //cout << "_start_atom " << _start_atom << endl; _y_mouse=static_cast(rintf(_start_atom->pos_y()+dy)); _x_mouse=static_cast(rintf(_start_atom->pos_x()+dx)); }else{ int x=Fl::event_x(); int y=Fl::event_y(); bool exists=false; if(!_la_molecola->check_click_bond(x,y,exists,true)){ _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&_x_mouse,&_y_mouse); }else{ _x_mouse=-1; _y_mouse=-1; } } redraw(); } return 1; case ACT_DRAW_ARROW: _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&_x_mouse,&_y_mouse); _b_arrow_added=true; return 1; case ACT_DRAW_BEZIER: // cout << "_bezier_point " << _bezier_point.size() << endl; if(_bezier_point.size()<3){ //cout << "kk"<< endl; pair punti; int mag_x=Fl::event_x(); int mag_y=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&mag_x,&mag_y); punti.first=mag_x; punti.second=mag_y; _bezier_point.push_back(punti); }else{ reg_modified(); pair punti; int mag_x=Fl::event_x(); int mag_y=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&mag_x,&mag_y); punti.first=mag_x; punti.second=mag_y; _bezier_point.push_back(punti); _la_molecola->crea_bezier_nuova(_bezier_point); _bezier_point.erase(_bezier_point.begin(),_bezier_point.end()); } redraw(); return 1; case ACT_DRAW_ARC: { int mag_x=Fl::event_x(); int mag_y=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&mag_x,&mag_y); _x_arc_centr=mag_x; _y_arc_centr=mag_y; } return 1; case ACT_DRAW_ETICH: { reg_modified(); int dx=(MainWindow->ritorna_mol_canvas())->x(); int dy=(MainWindow->ritorna_mol_canvas())->y(); int mag_x=Fl::event_x(); int mag_y=Fl::event_y(); //testing magnetic attract_mouse_to_magnetic_point(&mag_x,&mag_y); //etichetta* dummy=new multifont_label(); //etichetta* dummy=new multiline_label(); etichetta* dummy=new paragraph_text; dummy->x(descale(mag_x-dx)); dummy->y(descale(mag_y-dy)); _la_molecola->elimina_legami_selected(); _la_molecola->elimina_elem_selected(); _la_molecola->add_etich(dummy); _la_molecola->aggiungi_elem_selected(ETICHETTA,NO_VALID_GROUP, _la_molecola->numero_etichetta()-1); _la_molecola->highlight_selected(); //multiline_label_prop p(_la_molecola->ritorna_punt_etich(_la_molecola->numero_etichetta()-1) ); paragraph_text_prop p(_la_molecola->ritorna_punt_etich(_la_molecola->numero_etichetta()-1) ); p.show(); while(p.shown()){ Fl::wait(); } _la_molecola->elimina_legami_selected(); _la_molecola->elimina_elem_selected(); break; } return 1; case ACT_DRAW_BOX: _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); _b_construct_box=true; return 1; case ACT_SEL_BOX: _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); _b_construct_box=true; return 1; case ACT_SEL_ATOM: { if(Fl::event_clicks()==1 && Fl::event_button()==FL_LEFT_MOUSE){ if(d_click_bond()){ Fl::event_is_click(0); } }else{ bool has_hitted=false; bool no_incremental_sel=true; bool exists; if(_la_molecola->check_control_point_procedura_under_mouse(Fl::event_x(), Fl::event_y())){ // procedura control points editing //fl_cursor(FL_CURSOR_MOVE); _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); reg_modified(); _action=ACT_EDIT_CONTROL_POINT_CURVES; }else{ if(_la_molecola->check_exists_in_elem_selected(Fl::event_x(), Fl::event_y(),exists)){ set_action_translate_selected_push_handle(); }else{ if(Fl::event_key(FL_Control_L)){ no_incremental_sel=false; } has_hitted=_la_molecola->prova_click(Fl::event_x(), Fl::event_y(), exists, no_incremental_sel); if(!has_hitted){ _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); _b_construct_box=true; _action=ACT_SEL_BOX; } } } } break; } case ACT_SEL_GROUP: { bool exists=true; if(_la_molecola->check_exists_in_elem_selected(Fl::event_x(), Fl::event_y(),exists)){ set_action_translate_selected_push_handle(); }else{ bool incremental=false; if(Fl::event_key(FL_Control_L)){ incremental=true; } if(!_la_molecola->click_gruppo(Fl::event_x(), Fl::event_y(), !incremental)){ _la_molecola->check_click_etichetta(Fl::event_x(), Fl::event_y(),exists, !incremental); } } } return 1; case ACT_KILL: reg_modified(); bool dummy; _la_molecola->prova_click(Fl::event_x(), Fl::event_y(), dummy,true); _la_molecola->cancella_elementi_selected(); _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); } return 1; } return 1; } } default: return Fl_Widget::handle(e); break; } } void mol_canvas::test_and_glue_objects(){ atomo* sel_1=NULL; atomo* sel_2=NULL; atomo* hook_1=NULL; atomo* hook_2=NULL; if(_la_molecola->check_selected_group_bond_coincidence(&sel_1 , &sel_2, &hook_1, &hook_2)){ if(sel_1!=NULL && sel_2!=NULL && hook_1!=NULL && hook_2!=NULL){ glue_bonds(sel_1,sel_2,hook_1,hook_2); redraw(); } }else if(_la_molecola->check_selected_group_atom_coincidence(&sel_1, &hook_1)){ if(sel_1!=NULL && hook_1!=NULL){ //found hook glue_vertices(sel_1,hook_1); redraw(); } } } void mol_canvas::glue_bonds(atomo* sel_1,atomo* sel_2, atomo* hook_1,atomo* hook_2){ _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); std::pair v_sel_1(sel_1->pos_x(), sel_1->pos_y()); std::pair v_sel_2(sel_2->pos_x(), sel_2->pos_y()); std::pair v_hook_1(hook_1->pos_x(), hook_1->pos_y()); std::pair v_hook_2(hook_2->pos_x(), hook_2->pos_y()); std::pair l1=bidimensional_vector::diff(v_sel_1,v_sel_2); std::pair l2=bidimensional_vector::diff(v_hook_1,v_hook_2); float scale_f=bidimensional_vector::magn(l2)/bidimensional_vector::magn(l1); float dprod=bidimensional_vector::dot_product(l1,l2); if(dprod<0){ std::swap(sel_1,sel_2); } sel_1->etich(hook_1->etich()); sel_2->etich(hook_2->etich()); gruppo* sel_grp=dynamic_cast(sel_1->ritorna_genitore()); gruppo* hook_grp=dynamic_cast(hook_1->ritorna_genitore()); sel_grp->scale(scale_f); int sel_grp_id =sel_grp->id(); int hook_grp_id=hook_grp->id(); hook_grp->rimappa_da((*(sel_grp->fin_atom()-1)).id()+1,0); //translate float dx_sel_1=hook_1->pos_x() - sel_1->pos_x(); float dy_sel_1=hook_1->pos_y() - sel_1->pos_y(); sel_grp->trasla(dx_sel_1, dy_sel_1); std::vector first_neighbors_hook_1; std::vector first_neighbors_bond_type_hook_1; vector::iterator beg_b=hook_1->primo_leg(); vector::iterator end_b=hook_1->ultimo_leg(); while(beg_b!=end_b){ if((*beg_b).id_atomo()!=hook_2->id()){ first_neighbors_hook_1.push_back((*beg_b).id_atomo()); first_neighbors_bond_type_hook_1.push_back((*beg_b).tipo_legame()); } beg_b++; } std::vector first_neighbors_hook_2; std::vector first_neighbors_bond_type_hook_2; beg_b=hook_2->primo_leg(); end_b=hook_2->ultimo_leg(); while(beg_b!=end_b){ if((*beg_b).id_atomo()!=hook_1->id()){ first_neighbors_hook_2.push_back((*beg_b).id_atomo()); first_neighbors_bond_type_hook_2.push_back((*beg_b).tipo_legame()); } beg_b++; } std::vector links; for(unsigned int i=0;iid(); tmp._second=first_neighbors_hook_1[i]; tmp._bondtype=first_neighbors_bond_type_hook_1[i]; links.push_back(tmp); } for(unsigned int i=0;iid(); tmp._second=first_neighbors_hook_2[i]; tmp._bondtype=first_neighbors_bond_type_hook_2[i]; links.push_back(tmp); } int h_id1=hook_1->id(); int h_id2=hook_2->id(); gruppo g_linked=link_groups(sel_grp, hook_grp,links); g_linked.purge_atom(h_id1); g_linked.purge_atom(h_id2); g_linked.rimappa_da(0,0); _la_molecola->aggiungi_gruppo(g_linked); _la_molecola->remove_gruppo_id(sel_grp_id); _la_molecola->remove_gruppo_id(hook_grp_id); } void mol_canvas::glue_vertices(atomo* sel, atomo* hook){ _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); sel->etich(hook->etich()); gruppo* sel_grp=dynamic_cast(sel->ritorna_genitore()); gruppo* hook_grp=dynamic_cast(hook->ritorna_genitore()); int sel_grp_id=sel_grp->id(); int hook_grp_id=hook_grp->id(); hook_grp->rimappa_da((*(sel_grp->fin_atom()-1)).id()+1,hook->id()); float dx_sel=hook->pos_x() - sel->pos_x(); float dy_sel=hook->pos_y() - sel->pos_y(); sel_grp->trasla(dx_sel, dy_sel); std::vector first_neighbors_hook; std::vector first_neighbors_bond_type; vector::iterator beg_b=hook->primo_leg(); vector::iterator end_b=hook->ultimo_leg(); while(beg_b!=end_b){ first_neighbors_hook.push_back((*beg_b).id_atomo()); first_neighbors_bond_type.push_back((*beg_b).tipo_legame()); beg_b++; } std::vector links; for(unsigned int i=0;iid(); tmp._second=first_neighbors_hook[i]; tmp._bondtype=first_neighbors_bond_type[i]; links.push_back(tmp); } int h_id=hook->id(); // for(unsigned int i=0;iaggiungi_gruppo(g_linked); _la_molecola->remove_gruppo_id(sel_grp_id); _la_molecola->remove_gruppo_id(hook_grp_id); } void mol_canvas::draw_preview_bond(int tip){ //#define LENGHT_BOND 15.0f /** *Angolo legame in radianti */ //#define ANGL_BOND .26179938779914943653f fl_color(COMP_R_EV,COMP_G_EV,COMP_B_EV); float length=static_cast(__pref.getBond_fixedlength() * __pref.getZoom()); //LENGHT_BOND; float angl=static_cast(__pref.getBond_fixedangle()); //ANGL_BOND; switch(tip){ case ACT_DRAW_DOUBLE_BOND: case ACT_DRAW_SINGLE_BOND: case ACT_DRAW_TRIPLE_BOND: { std::vector pos_calc=preview_bond_calc_w_springs(_x_mouse, _y_mouse); if(pos_calc.size()==4 && similar_to(Fl::event_y()-_y_mouse,0,__pref.get_sensib_leg()) && similar_to(Fl::event_x()-_x_mouse ,0,__pref.get_sensib_leg())){ int dx=(MainWindow->ritorna_mol_canvas())->x(); int dy=(MainWindow->ritorna_mol_canvas())->y(); _x_added_atom=pos_calc[2]+dx; _y_added_atom=pos_calc[3]+dy; fl_line(pos_calc[0]+dx, pos_calc[1]+dy, pos_calc[2]+dx, pos_calc[3]+dy); }else{ float alfa_l=atan2(static_cast(Fl::event_y()-_y_mouse), static_cast(Fl::event_x()-_x_mouse) ); int alfa_i=static_cast(rintf(alfa_l/angl)); alfa_l=alfa_i*angl; _x_added_atom=static_cast(_x_mouse+rintf(length*cos(alfa_l))); _y_added_atom=static_cast(_y_mouse+rintf(length*sin(alfa_l))); if(_end_atom==0){ fl_line(_x_mouse, _y_mouse, _x_added_atom, _y_added_atom); }else{ int dx_scr=(MainWindow->ritorna_mol_canvas())->x(); int dy_scr=(MainWindow->ritorna_mol_canvas())->y(); fl_line(_x_mouse, _y_mouse, static_cast(rintf(_end_atom->pos_x()+dx_scr)), static_cast(rintf(_end_atom->pos_y()+dy_scr))); } } break; } } } void mol_canvas::genera_catena(unsigned int n_carb, float orient){ _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); // cout << "iio" << _start_atom << endl; float alfa=__pref.getBond_fixedangle(); float length=scale_z(__pref.getBond_fixedlength()); if(_start_atom){ bool sopra=true; float xpiv=_start_atom->pos_x(); float ypiv=_start_atom->pos_y(); float x_addtmp= static_cast(rintf(_start_atom->pos_x())); float y_addtmp= static_cast(rintf(_start_atom->pos_y())); for(unsigned int i=0;i(length*cos(alfa)); y_addtmp+=static_cast(length*sin(alfa)); float x=x_addtmp-xpiv; float y=y_addtmp-ypiv; float xp=x*cos(orient)+y*sin(orient); float yp=y*cos(orient)-x*sin(orient); _x_added_atom=static_cast(rintf(xp+xpiv)); _y_added_atom=static_cast(rintf(yp+ypiv)); if(sopra){ alfa-=__pref.getBond_fixedangle()*2; sopra=false; }else{ alfa+=__pref.getBond_fixedangle()*2; sopra=true; } _start_atom=_la_molecola->crea_legame_nuovo(_start_atom, _x_added_atom, _y_added_atom, LEGAME_SINGOLO); } _start_atom=0; }else{ float x= _x_added_atom-_x_mouse; float y=_y_added_atom-_y_mouse; float xp=x*cos(orient+alfa*2)+y*sin(orient+alfa*2); float yp=y*cos(orient+alfa*2)-x*sin(orient+alfa*2); _x_added_atom=static_cast(rintf(xp+_x_mouse)); _y_added_atom=static_cast(rintf(yp+_y_mouse)); _start_atom=_la_molecola->crea_legame_nuovo(_x_mouse, _y_mouse, _x_added_atom, _y_added_atom, LEGAME_SINGOLO); genera_catena(n_carb-2, orient); } } int mol_canvas::aggiungi_nuovo_legame(int tipo){ if(!_b_bond_added){ _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); //float dx=Fl::event_x()-_x_mouse; //float dy=Fl::event_y()-_y_mouse; int dx_scr=(MainWindow->ritorna_mol_canvas())->x(); int dy_scr=(MainWindow->ritorna_mol_canvas())->y(); //float lung_att=sqrt( pow(static_cast(dx),2)+ // pow(static_cast(dy),2) ); //float length=static_cast(__pref.getBond_fixedlength()); //LENGHT_BOND; if(_start_atom){ if(_end_atom){ _la_molecola->crea_legame_nuovo(_start_atom, _end_atom, tipo); }else{ _la_molecola->crea_legame_nuovo(_start_atom, _x_added_atom-dx_scr, _y_added_atom-dy_scr, tipo); } }else{ if(_end_atom){ _la_molecola->crea_legame_nuovo(_end_atom, _x_mouse-dx_scr, _y_mouse-dy_scr, tipo); }else{ _la_molecola->crea_legame_nuovo(_x_mouse, _y_mouse, _x_added_atom, _y_added_atom, tipo); } } _start_atom=0; _end_atom=0; _b_bond_added=true; redraw(); } return 1; } void mol_canvas::reg_modified(){ editor* ed=dynamic_cast(MainWindow); //_la_molecola->elimina_elem_selected(); //_la_molecola->elimina_legami_selected(); ed->register_images_undo(_la_molecola); _la_molecola=MainWindow->ritorna_immagine(); } bist_plugin* mol_canvas::plugin(){ editor* ed=dynamic_cast(MainWindow); if(ed!=0){ return ed->actual_plugin(); }else{ return 0; } } void mol_canvas::zoom(float entity,int traslx, int trasly){ float nwzoom=__pref.getZoom()+entity; if(nwzoom>0 && static_cast(rintf(__pref.getPageWidth()*nwzoom)) > 30 && static_cast(rintf(__pref.getPageHeight()*nwzoom)) > 30){ __pref.setZoom(__pref.getZoom()+entity); resize(x(),y(), static_cast(rintf(__pref.getPageWidth()*__pref.getZoom())), static_cast(rintf(__pref.getPageHeight()*__pref.getZoom()))); //if(w() > parent()->w() || h() > parent()->h()){ position(x()+traslx,y()+trasly); //}else{ //position(parent()->x(),parent()->y()); //} redraw(); parent()->redraw(); } } void mol_canvas::zoom_center_to_mousepointer(float entity){ float x_t=(Fl::event_x()-x()); float y_t=(Fl::event_y()-y()); float x_t_z_offset=(Fl::event_x()-x())*abs(entity)/__pref.getZoom(); float y_t_z_offset=(Fl::event_y()-y())*abs(entity)/__pref.getZoom(); zoom(entity, static_cast(rintf(x_t)), static_cast(rintf(y_t))); if(entity<0){ position(static_cast(rintf(x()+x_t_z_offset-x_t)), static_cast(rintf(y()+y_t_z_offset-y_t))); }else{ position(static_cast(rintf(x()-x_t_z_offset- x_t)), static_cast(rintf(y()-y_t_z_offset- y_t))); } parent()->redraw(); } void mol_canvas::set_action_translate_selected_push_handle(){ fl_cursor(FL_CURSOR_MOVE); _x_mouse=Fl::event_x(); _y_mouse=Fl::event_y(); reg_modified(); _action=ACT_TRANSLATE_SELECTED; } bool mol_canvas::d_click_atom(){ atomo* clicked=NULL; int res= _la_molecola->prova_click_atomo(&clicked,Fl::event_x(), Fl::event_y()); if(clicked!=NULL){ std::vector children=clicked->get_all_children(); if(children.size()>1){ bidimensional_vinculated_particle b; b.k_spring(10); pair center(clicked->pos_x(), clicked->pos_y()); b.add_center(center); for(unsigned int i=0;i tmp(children[i]->pos_x(),children[i]->pos_y()); b.add_particle(tmp); } std::vector start_position; start_position.push_back(children[0]->pos_x()); start_position.push_back(children[0]->pos_y()); b.pos(start_position); std::vector pp=b.pos(); atomo* nw_atm=_la_molecola->crea_legame_nuovo(clicked,pp[0], pp[1], LEGAME_SINGOLO); while(b.update()){ redraw(); Fl::check(); pp=b.pos(); nw_atm->pos_x(static_cast(rintf(pp[0]))); nw_atm->pos_y(static_cast(rintf(pp[1]))); } } } return res; } bool mol_canvas::d_click_bond(){ bool res=false; reg_modified(); bool dummy; _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); res=_la_molecola->check_click_bond(Fl::event_x(), Fl::event_y(), dummy, true); _la_molecola->shift_type_bond_selected(); _la_molecola->elimina_elem_selected(); _la_molecola->elimina_legami_selected(); return res; } void mol_canvas::translate(int dx,int dy){ x(x()+dx); y(y()+dy); } std::vector mol_canvas::preview_bond_calc_w_springs(int x_c, int y_c){ std::vector res; atomo* clicked=NULL; _la_molecola->prova_click_atomo(&clicked,x_c, y_c); if(clicked!=NULL){ res.push_back(static_cast(rintf(clicked->pos_x()))); res.push_back(static_cast(rintf(clicked->pos_y()))); std::vector children=clicked->get_all_children(); if(children.size()>1){ bidimensional_vinculated_particle b; b.k_spring(10); pair center(clicked->pos_x(), clicked->pos_y()); b.add_center(center); for(unsigned int i=0;i tmp(children[i]->pos_x(),children[i]->pos_y()); b.add_particle(tmp); } std::vector start_position; start_position.push_back(children[0]->pos_x()); start_position.push_back(children[0]->pos_y()); b.pos(start_position); std::vector pp=b.pos(); //atomo* nw_atm=_la_molecola->crea_legame_nuovo(clicked,pp[0], // pp[1], LEGAME_SINGOLO); while(b.update()){ //redraw(); //Fl::check(); pp=b.pos(); //nw_atm->pos_x(static_cast(rintf(pp[0]))); //nw_atm->pos_y(static_cast(rintf(pp[1]))); } res.push_back(static_cast(rintf(pp[0]))); res.push_back(static_cast(rintf(pp[1]))); } } return res; } void mol_canvas::rotation_pivot_pos(int x, int y){ _x_pivot=x; _y_pivot=y; } const float mol_canvas::rotation_incr=0.01; const float mol_canvas::zoom_incr=0.1; const float mol_canvas::scale_incr=0.1; bist-0.5.2/src/multiline_label_prop.cpp0000644000175000017500000003361711406210753016544 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include Fl_Pixmap img_incr_interline_mlabel(lb_incr_interline_mlabel_xpm); Fl_Pixmap img_decr_interline_mlabel(lb_decr_interline_mlabel_xpm); Fl_Pixmap img_group_ungroup_mlabel(lb_group_ungroup_mlabel_xpm); void multiline_label_set_l_layout(Fl_Widget* w, void* d){ multiline_label_prop* prop=dynamic_cast(w->parent()); prop->_str->layout_lines(MULTILINE_LABEL_ALIGN_LEFT_TEXT_LAYOUT); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void multiline_label_set_c_layout(Fl_Widget* w, void* d){ multiline_label_prop* prop=dynamic_cast(w->parent()); prop->_str->layout_lines(MULTILINE_LABEL_ALIGN_CENTER_TEXT_LAYOUT); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void multiline_label_set_r_layout(Fl_Widget* w, void* d){ multiline_label_prop* prop=dynamic_cast(w->parent()); prop->_str->layout_lines(MULTILINE_LABEL_ALIGN_RIGHT_TEXT_LAYOUT); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void multiline_label_threat_as_a_whole_cb(Fl_Widget* w, void* d){ multiline_label_prop* prop=dynamic_cast(w->parent()); Fl_Button* b = dynamic_cast(prop->child(9)); prop->_str->treat_as_a_whole(b->value()); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void multiline_label_prop_color_cb(Fl_Widget* w, void* d){ multiline_label_prop* prop=dynamic_cast(w->parent()); unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); if(pushd){ prop->_str->cr(r); prop->_str->cg(g); prop->_str->cb(b); } editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void multiline_label_prop_ok_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); multiline_label_prop* prop=dynamic_cast(w->parent()); Fl_Choice* dimensioni=dynamic_cast(prop->child(2)); Fl_Choice* i_font=dynamic_cast(prop->child(1)); int font_ch=i_font->value(); prop->_str->font(font_ch); prop->_str->dim(strtol(dimensioni->mvalue()->text,NULL,0)); prop->_str->de_highlight(); //prop->_str->treat_as_a_whole(true); ed->redraw(); } void multiline_label_prop_canc_cb(Fl_Widget* w, void* d){ multiline_label_prop* prop=dynamic_cast(w->parent()); prop->_str->treat_as_a_whole(true); prop->_str->de_highlight(); prop->hide(); } void multiline_label_increase_interline(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); multiline_label_prop* prop=dynamic_cast(w->parent()); int old=prop->_str->interline_space(); prop->_str->interline_space(old+2); ed->redraw(); } void multiline_label_decrease_interline(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); multiline_label_prop* prop=dynamic_cast(w->parent()); int old=prop->_str->interline_space(); if(old>2){ prop->_str->interline_space(old-2); } ed->redraw(); } multiline_label_prop::multiline_label_prop(etichetta* et) :Fl_Double_Window(339,144,_("Text properties")) { multiline_label* m_lb=dynamic_cast(et); if(m_lb!=0){ _str=m_lb; }else{ _str=0; } initialize_GUI(); dialog_position(this); } multiline_label_prop::multiline_label_prop(multiline_label* et) :Fl_Double_Window(339,144,_("Text properties")), _str(et) { initialize_GUI(); dialog_position(this); } void multiline_label_prop::initialize_GUI(){ if(_str!=0){ { Fl_Box* o = new Fl_Box(5, 5, 330, 100); //0 o->box(FL_ENGRAVED_BOX); add(o); } { Fl_Choice* o = new Fl_Choice(90, 15, 145, 20, _("Font:")); //1 o->down_box(FL_BORDER_BOX); o->copy(multiline_label_prop::_str_font_face); add(o); } { Fl_Choice* o = new Fl_Choice(90, 40, 60, 20, _("Dimension:"));//2 o->down_box(FL_BORDER_BOX); o->copy(multiline_label_prop::_font_dim_str); o->value(8); add(o); } Fl_Button* text= new Fl_Button(LARG_BUTTON_DEFAULT, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//3 text->type(FL_RADIO_BUTTON); text->image(image_lb_normal_str_atom); add(text); Fl_Button* sup= new Fl_Button(LARG_BUTTON_DEFAULT*2, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//4 sup->type(FL_RADIO_BUTTON); sup->image(image_lb_supers); add(sup); Fl_Button* sub= new Fl_Button(LARG_BUTTON_DEFAULT*3, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//5 sub->type(FL_RADIO_BUTTON); sub->image(image_lb_subs); add(sub); Fl_Button* color=new Fl_Button(LARG_BUTTON_DEFAULT*4, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//6 color->image(image_lb_select_font_color); color->callback(multiline_label_prop_color_cb); add(color); Fl_Button* incr_interline=new Fl_Button(LARG_BUTTON_DEFAULT*5, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//7 incr_interline->image(img_incr_interline_mlabel); incr_interline->callback(multiline_label_increase_interline); add(incr_interline); Fl_Button* decr_interline=new Fl_Button(LARG_BUTTON_DEFAULT*6, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//8 decr_interline->image(img_decr_interline_mlabel); decr_interline->callback(multiline_label_decrease_interline); add(decr_interline); Fl_Toggle_Button* treat_as_a_whole=new Fl_Toggle_Button(LARG_BUTTON_DEFAULT*7, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//9 treat_as_a_whole->image(img_group_ungroup_mlabel); treat_as_a_whole->callback(multiline_label_threat_as_a_whole_cb); add(treat_as_a_whole); Fl_Button* l_align=new Fl_Button(LARG_BUTTON_DEFAULT*8, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//10 l_align->label("L"); l_align->callback(multiline_label_set_l_layout); add(l_align); Fl_Button* c_align=new Fl_Button(LARG_BUTTON_DEFAULT*9, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//11 c_align->label("C"); c_align->callback(multiline_label_set_c_layout); add(c_align); Fl_Button* r_align=new Fl_Button(LARG_BUTTON_DEFAULT*10, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//12 r_align->label("R"); r_align->callback(multiline_label_set_r_layout); add(treat_as_a_whole); Fl_Button* ok= new Fl_Return_Button(110, 109, 80, 30, _("Apply"));//13 ok->callback(multiline_label_prop_ok_cb); add(ok); Fl_Button* ann=new Fl_Button(190, 109, 65, 30, _("Done"));//14 ann->callback(multiline_label_prop_canc_cb); add(ann); end(); set_modal(); bool old_t=_str->treat_as_a_whole(false); _str->draw_cursor(true); _str->treat_as_a_whole(old_t); treat_as_a_whole->value(old_t); } } multiline_label_prop::~multiline_label_prop(){ } int multiline_label_prop::handle(int e){ if(_str!=0){ editor* ed=dynamic_cast(MainWindow); Fl_Double_Window::handle(e); Fl_Button* apic=dynamic_cast(child(4)); Fl_Button* pedic=dynamic_cast(child(5)); switch(e){ case FL_KEYDOWN: { string car; if(Fl::event_state(FL_SHIFT)){ car=toupper(Fl::event_text()[0]); }else{ car=Fl::event_text()[0]; } if(Fl::event_key(FL_Delete)){ //cancellare il successivo _str->delete_char_curr_pos(false); }else if(car=="\b"){//cancellare il precedente _str->delete_char_curr_pos(true); }else if(isprint(car[0])){ if(apic->value()){ _str->insert_string_in_curr_pos(car,ET_APICE); }else if(pedic->value()){ _str->insert_string_in_curr_pos(car,ET_PEDICE); }else{ _str->insert_string_in_curr_pos(car,ET_STR); } }else if(Fl::event_key()==FL_Left){ if(Fl::event_state(FL_SHIFT)){ de_highlight_text(); }else{ int currtype=0; _str->cursor_one_step_back(currtype); } }else if(Fl::event_key()==FL_Right){ if(Fl::event_state(FL_SHIFT)){ highlight_text(); }else{ int currtype=0; _str->cursor_one_step_fwd(currtype); } }else if(Fl::event_key()==FL_Up){ // da metter in una opportuna funzione membro di multiline_string int limit=_str->get_cursor_position(0); _str->pointer_to_currline_transl(-1); _str->set_cursor_position(limit); }else if(Fl::event_key()==FL_Down){ // da metter in una opportuna funzione membro di multiline_string int limit=_str->get_cursor_position(0); _str->pointer_to_currline_transl(1); _str->set_cursor_position(limit); }else if(Fl::event_key()==FL_Enter){ etichetta* left=0; etichetta* right=0; if(_str->break_and_split_normal_str(&left,&right)){ _str->subst_line(left, _str->pointer_to_currline()); _str->add_line(right,_str->pointer_to_currline()); }else{ delete left; delete right; etichetta* tmp=new etichetta(); tmp->aggiungi("",ET_STR); _str->add_line(tmp,_str->pointer_to_currline()); } } ed->redraw(); return 1; } default: return 0; } }else{ return 0; } } void multiline_label_prop::highlight_text(){ _str->increase_highlighted(); } void multiline_label_prop::de_highlight_text(){ _str->decrease_highlighted(); } const int multiline_label_prop::_button_mouse_highlight=FL_LEFT_MOUSE; const Fl_Menu_Item multiline_label_prop::_str_font_face[] = { {"helvetica", 0, 0, 0,}, {"helvetica bold", 0, 0, 0,}, {"helvetica italic", 0, 0, 0,}, {"helvetica bold italic", 0, 0, 0,}, {"courier", 0, 0, 0,}, {"courier bold", 0, 0, 0,}, {"courier italic", 0, 0, 0,}, {"courier bold italic", 0, 0, 0,}, {"times", 0, 0, 0,}, {"times bold", 0, 0, 0,}, {"times italic", 0, 0, 0,}, {"times bold italic", 0, 0, 0,}, {"symbol", 0, 0, 0,}, {"screen", 0, 0, 0,}, {"screen bold", 0, 0, 0,}, {"zapf dingbats", 0, 0, 0,}, {0} }; const Fl_Menu_Item multiline_label_prop::_font_dim_str[]={ {"5", 0, 0, 0,}, {"6", 0, 0, 0,}, {"7", 0, 0, 0,}, {"8", 0, 0, 0,}, {"9", 0, 0, 0,}, {"10", 0, 0, 0,}, {"11", 0, 0, 0,}, {"12", 0, 0, 0,}, {"13", 0, 0, 0,}, {"14", 0, 0, 0,}, {"15", 0, 0, 0,}, {"16", 0, 0, 0,}, {"17", 0, 0, 0,}, {"18", 0, 0, 0,}, {"19", 0, 0, 0,}, {"20", 0, 0, 0,}, {"21", 0, 0, 0,}, {"22", 0, 0, 0,}, {"23", 0, 0, 0,}, {"24", 0, 0, 0,}, {"25", 0, 0, 0,}, {"26", 0, 0, 0,}, {"27", 0, 0, 0,}, {"28", 0, 0, 0,}, {"29", 0, 0, 0,}, {"30", 0, 0, 0,}, {"31", 0, 0, 0,}, {"32", 0, 0, 0,}, {"33", 0, 0, 0,}, {"34", 0, 0, 0,}, {"35", 0, 0, 0,}, {"36", 0, 0, 0,}, {"37", 0, 0, 0,}, {"38", 0, 0, 0,}, {"39", 0, 0, 0,}, {"40", 0, 0, 0,}, {"41", 0, 0, 0,}, {"42", 0, 0, 0,}, {"43", 0, 0, 0,}, {"44", 0, 0, 0,}, {"45", 0, 0, 0,}, {"46", 0, 0, 0,}, {"47", 0, 0, 0,}, {"48", 0, 0, 0,}, {"49", 0, 0, 0,}, {0} }; bist-0.5.2/src/paragraph_text_prop.cpp0000644000175000017500000003655011476736445016435 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern Fl_Pixmap img_incr_interline_mlabel; extern Fl_Pixmap img_decr_interline_mlabel; void paragraph_text_set_l_layout(Fl_Widget* w, void* d){ paragraph_text_prop* prop=dynamic_cast(w->parent()); prop->_str->layout_lines(PARAGRAPH_TEXT_ALIGN_LEFT_TEXT_LAYOUT); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void paragraph_text_set_c_layout(Fl_Widget* w, void* d){ paragraph_text_prop* prop=dynamic_cast(w->parent()); prop->_str->layout_lines(PARAGRAPH_TEXT_ALIGN_CENTER_TEXT_LAYOUT); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void paragraph_text_set_r_layout(Fl_Widget* w, void* d){ paragraph_text_prop* prop=dynamic_cast(w->parent()); prop->_str->layout_lines(PARAGRAPH_TEXT_ALIGN_RIGHT_TEXT_LAYOUT); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void paragraph_text_prop_color_cb(Fl_Widget* w, void* d){ paragraph_text_prop* prop=dynamic_cast(w->parent()); unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); if(pushd){ prop->_str->cr(r); prop->_str->cg(g); prop->_str->cb(b); } editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void paragraph_text_prop_ok_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); paragraph_text_prop* prop=dynamic_cast(w->parent()); Fl_Choice* dimensioni=dynamic_cast(prop->child(2)); Fl_Choice* i_font=dynamic_cast(prop->child(1)); int font_ch=i_font->value(); prop->_str->font(font_ch); prop->_str->dim(strtol(dimensioni->mvalue()->text,NULL,0)); prop->_str->update_highligted_text(); prop->_str->de_highlight(); prop->_str->can_highlight(true); //prop->_str->treat_as_a_whole(true); ed->redraw(); } void paragraph_text_prop_canc_cb(Fl_Widget* w, void* d){ paragraph_text_prop* prop=dynamic_cast(w->parent()); //prop->_str->treat_as_a_whole(true); prop->_str->de_highlight(); prop->_str->can_highlight(false); prop->hide(); } void paragraph_text_increase_interline(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); paragraph_text_prop* prop=dynamic_cast(w->parent()); int old=prop->_str->interline_space(); prop->_str->interline_space(old+2); ed->redraw(); } void paragraph_text_decrease_interline(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); paragraph_text_prop* prop=dynamic_cast(w->parent()); int old=prop->_str->interline_space(); if(old>0){ prop->_str->interline_space(old-1); } ed->redraw(); } void paragraph_text_set_current_font_dimension(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); paragraph_text_prop* prop=dynamic_cast(w->parent()); Fl_Choice* dimensioni=dynamic_cast(prop->child(2)); prop->_str->dim(strtol(dimensioni->mvalue()->text,NULL,0)); ed->redraw(); } void paragraph_text_set_current_font(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); paragraph_text_prop* prop=dynamic_cast(w->parent()); Fl_Choice* i_font=dynamic_cast(prop->child(1)); int font_ch=i_font->value(); prop->_str->font(font_ch); ed->redraw(); } paragraph_text_prop::paragraph_text_prop(paragraph_text* et) :Fl_Double_Window(339,144,_("Text properties")), _str(et) { et->can_highlight(true); initialize_GUI(); dialog_position(this); } paragraph_text_prop::paragraph_text_prop(etichetta* et) :Fl_Double_Window(339,144,_("Text properties")) { paragraph_text* m_lb=dynamic_cast(et); et->can_highlight(true); if(m_lb!=0){ _str=m_lb; }else{ _str=0; } initialize_GUI(); dialog_position(this); } void paragraph_text_prop::initialize_GUI(){ if(_str!=0){ { Fl_Box* o = new Fl_Box(5, 5, 330, 100); //0 o->box(FL_ENGRAVED_BOX); add(o); } { Fl_Choice* o = new Fl_Choice(90, 15, 145, 20, _("Font:")); //1 o->down_box(FL_BORDER_BOX); o->copy(paragraph_text_prop::_str_font_face); o->callback(paragraph_text_set_current_font); add(o); } { Fl_Choice* o = new Fl_Choice(90, 40, 60, 20, _("Dimension:"));//2 o->down_box(FL_BORDER_BOX); o->copy(paragraph_text_prop::_font_dim_str); o->value(8); o->callback(paragraph_text_set_current_font_dimension); add(o); } Fl_Button* text= new Fl_Button(LARG_BUTTON_DEFAULT, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//3 text->type(FL_RADIO_BUTTON); text->image(image_lb_normal_str_atom); add(text); Fl_Button* sup= new Fl_Button(LARG_BUTTON_DEFAULT*2, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//4 sup->type(FL_RADIO_BUTTON); sup->image(image_lb_supers); add(sup); Fl_Button* sub= new Fl_Button(LARG_BUTTON_DEFAULT*3, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//5 sub->type(FL_RADIO_BUTTON); sub->image(image_lb_subs); add(sub); Fl_Button* color=new Fl_Button(LARG_BUTTON_DEFAULT*4, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//6 color->image(image_lb_select_font_color); color->callback(paragraph_text_prop_color_cb); add(color); Fl_Button* incr_interline=new Fl_Button(LARG_BUTTON_DEFAULT*5, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//7 incr_interline->image(img_incr_interline_mlabel); incr_interline->callback(paragraph_text_increase_interline); add(incr_interline); Fl_Button* decr_interline=new Fl_Button(LARG_BUTTON_DEFAULT*6, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//8 decr_interline->image(img_decr_interline_mlabel); decr_interline->callback(paragraph_text_decrease_interline); add(decr_interline); /* Fl_Toggle_Button* treat_as_a_whole=new Fl_Toggle_Button(LARG_BUTTON_DEFAULT*7, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//9 treat_as_a_whole->image(img_group_ungroup_mlabel); treat_as_a_whole->callback(paragraph_text_threat_as_a_whole_cb); add(treat_as_a_whole); */ Fl_Button* l_align=new Fl_Button(LARG_BUTTON_DEFAULT*8, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//10 l_align->label("L"); l_align->callback(paragraph_text_set_l_layout); add(l_align); Fl_Button* c_align=new Fl_Button(LARG_BUTTON_DEFAULT*9, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//11 c_align->label("C"); c_align->callback(paragraph_text_set_c_layout); add(c_align); Fl_Button* r_align=new Fl_Button(LARG_BUTTON_DEFAULT*10, 65, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT);//12 r_align->label("R"); r_align->callback(paragraph_text_set_r_layout); add(r_align); Fl_Button* ok= new Fl_Return_Button(w()/2-LARG_BUTTON_DEFAULT*3, 109, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Apply"));//13 ok->callback(paragraph_text_prop_ok_cb); add(ok); Fl_Button* ann=new Fl_Button(w()/2, 109, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Done"));//14 ann->callback(paragraph_text_prop_canc_cb); add(ann); end(); set_non_modal(); _str->draw_cursor(true); } } paragraph_text_prop::~paragraph_text_prop(){ } int paragraph_text_prop::handle(int e){ if(_str!=0){ editor* ed=dynamic_cast(MainWindow); Fl_Double_Window::handle(e); Fl_Button* apic=dynamic_cast(child(4)); Fl_Button* pedic=dynamic_cast(child(5)); switch(e){ case FL_KEYDOWN: { string car; if(Fl::event_state(FL_SHIFT)){ car=toupper(Fl::event_text()[0]); }else{ car=Fl::event_text()[0]; } if(Fl::event_key(FL_Delete)){ //cancellare il successivo _str->delete_char_curr_pos(false); }else if(car=="\b"){//cancellare il precedente _str->delete_char_curr_pos(true); }else if(isprint(car[0])){ if(apic->value()){ _str->insert_string_in_curr_pos(car,ET_APICE); }else if(pedic->value()){ _str->insert_string_in_curr_pos(car,ET_PEDICE); }else{ _str->insert_string_in_curr_pos(car,ET_STR); } }else if(Fl::event_key()==FL_Left){ if(Fl::event_state(FL_SHIFT)){ _str->invert_highlight_child_and_shift_cursor(false); }else{ int currtype=0; _str->cursor_one_step_back(currtype); update_widget_cursor(); } }else if(Fl::event_key()==FL_Right){ if(Fl::event_state(FL_SHIFT)){ _str->invert_highlight_child_and_shift_cursor(true); }else{ int currtype=0; _str->cursor_one_step_fwd(currtype); update_widget_cursor(); } }else if(Fl::event_key()==FL_Up){ int ctype=0; _str->cursor_one_step_up(ctype); }else if(Fl::event_key()==FL_Down){ int ctype=0; _str->cursor_one_step_down(ctype); }else if(Fl::event_key()==FL_Enter){ multifont_label* l=0; multifont_label* r=0; etichetta* p_l=l; etichetta* p_r=r; _str->break_and_split_normal_str(&p_l , &p_r); }else if(Fl::event_key()==FL_End){ //_str->highlight_child(false); //_str->dim_child(80); //_str->font_child(8); int ctype=0; if(Fl::event_state(FL_SHIFT)){ _str->highlight_current_line(); _str->go_to_end_of_line(); _str->cursor_one_step_fwd(ctype); }else if(Fl::event_state(FL_CTRL)){ _str->go_to_end_of_label(); }else{ _str->go_to_end_of_line(); } }else if(Fl::event_key()==FL_Home){ int ctype=0; if(Fl::event_state(FL_SHIFT)){ _str->dehighlight_current_line(); _str->go_to_start_of_line(); _str->cursor_one_step_back(ctype); _str->pointer_to_currline_transl(-1); }else if(Fl::event_state(FL_CTRL)){ _str->go_to_start_of_label(); }else{ _str->go_to_start_of_line(); } }else if(Fl::event_key()==FL_Insert){ //_str->highlight_child(true); } ed->redraw(); return 1; } default: return 0; } }else{ return 0; } } void paragraph_text_prop::update_widget_cursor(){ int cr_f=0; int cg_f=0; int cb_f=0; int dim_f=0; int font_f=0; _str->query_child(&cr_f, &cg_f, &cb_f, &font_f, &dim_f, NULL,NULL); Fl_Choice* dim_w=dynamic_cast(child(2)); Fl_Choice* font_w=dynamic_cast(child(1)); Fl_Menu_Item min_s=paragraph_text_prop::_font_dim_str[0]; int min_i=strtod(min_s.text,NULL); dim_w->value(dim_f - min_i); font_w->value(font_f); } void paragraph_text_prop::highlight_text(){ _str->increase_highlighted(); } void paragraph_text_prop::de_highlight_text(){ _str->decrease_highlighted(); } const int paragraph_text_prop::_button_mouse_highlight=FL_LEFT_MOUSE; const Fl_Menu_Item paragraph_text_prop::_str_font_face[] = { {"helvetica", 0, 0, 0,}, {"helvetica bold", 0, 0, 0,}, {"helvetica italic", 0, 0, 0,}, {"helvetica bold italic", 0, 0, 0,}, {"courier", 0, 0, 0,}, {"courier bold", 0, 0, 0,}, {"courier italic", 0, 0, 0,}, {"courier bold italic", 0, 0, 0,}, {"times", 0, 0, 0,}, {"times bold", 0, 0, 0,}, {"times italic", 0, 0, 0,}, {"times bold italic", 0, 0, 0,}, {"symbol", 0, 0, 0,}, {"screen", 0, 0, 0,}, {"screen bold", 0, 0, 0,}, {"zapf dingbats", 0, 0, 0,}, {0} }; const Fl_Menu_Item paragraph_text_prop::_font_dim_str[]={ {"5", 0, 0, 0,}, {"6", 0, 0, 0,}, {"7", 0, 0, 0,}, {"8", 0, 0, 0,}, {"9", 0, 0, 0,}, {"10", 0, 0, 0,}, {"11", 0, 0, 0,}, {"12", 0, 0, 0,}, {"13", 0, 0, 0,}, {"14", 0, 0, 0,}, {"15", 0, 0, 0,}, {"16", 0, 0, 0,}, {"17", 0, 0, 0,}, {"18", 0, 0, 0,}, {"19", 0, 0, 0,}, {"20", 0, 0, 0,}, {"21", 0, 0, 0,}, {"22", 0, 0, 0,}, {"23", 0, 0, 0,}, {"24", 0, 0, 0,}, {"25", 0, 0, 0,}, {"26", 0, 0, 0,}, {"27", 0, 0, 0,}, {"28", 0, 0, 0,}, {"29", 0, 0, 0,}, {"30", 0, 0, 0,}, {"31", 0, 0, 0,}, {"32", 0, 0, 0,}, {"33", 0, 0, 0,}, {"34", 0, 0, 0,}, {"35", 0, 0, 0,}, {"36", 0, 0, 0,}, {"37", 0, 0, 0,}, {"38", 0, 0, 0,}, {"39", 0, 0, 0,}, {"40", 0, 0, 0,}, {"41", 0, 0, 0,}, {"42", 0, 0, 0,}, {"43", 0, 0, 0,}, {"44", 0, 0, 0,}, {"45", 0, 0, 0,}, {"46", 0, 0, 0,}, {"47", 0, 0, 0,}, {"48", 0, 0, 0,}, {"49", 0, 0, 0,}, {0} }; bist-0.5.2/src/font_factory.cpp0000644000175000017500000000476611304467065015052 0ustar cagecage#include #include #include #include #include #include extern Preferences __pref; font_factory::font_factory(){ set_actual_font_from_prefs(); } font_factory::~font_factory(){ } Fl_Font font_factory::get_actual_font(Fl_Font alias){ Fl_Font res=FL_HELVETICA; if(_fonts.count(alias)>0){ res=_fonts[alias]; } return res; } void font_factory::search_for_font(const char* desidered, Fl_Font destination, int num_fonts){ for (int i = 0; i < num_fonts; i++) { const char *name = Fl::get_font_name((Fl_Font)i,NULL); if(strcasecmp (desidered,name)==0){ std::pair tmp(destination,(Fl_Font)i); _fonts.insert(tmp); break; } } } void font_factory::set_actual_font_from_prefs(){ int n=Fl::set_fonts(NULL); search_for_font(__pref.get_sans_font().c_str(),FL_HELVETICA,n); search_for_font(__pref.get_sans_font().c_str(),FL_HELVETICA,n); search_for_font(__pref.get_sans_font_bold().c_str(),FL_HELVETICA_BOLD,n); search_for_font(__pref.get_sans_font_italic().c_str(),FL_HELVETICA_ITALIC,n); search_for_font(__pref.get_sans_font_bold_italic().c_str(),FL_HELVETICA_BOLD_ITALIC,n); search_for_font(__pref.get_mono_font().c_str(),FL_COURIER,n); search_for_font(__pref.get_mono_font_bold().c_str(),FL_COURIER_BOLD,n); search_for_font(__pref.get_mono_font_italic().c_str(),FL_COURIER_ITALIC,n); search_for_font(__pref.get_mono_font_bold_italic().c_str(),FL_COURIER_BOLD_ITALIC,n); search_for_font(__pref.get_serif_font().c_str(),FL_TIMES,n); search_for_font(__pref.get_serif_font_bold().c_str(),FL_TIMES_BOLD,n); search_for_font(__pref.get_serif_font_italic().c_str(),FL_TIMES_ITALIC,n); search_for_font(__pref.get_serif_font_bold_italic().c_str(),FL_TIMES_BOLD_ITALIC,n); search_for_font(__pref.get_symbol_font().c_str(),FL_SYMBOL,n); search_for_font(__pref.get_mono_font().c_str(),FL_SCREEN,n); search_for_font(__pref.get_mono_font_bold().c_str(),FL_SCREEN_BOLD,n); search_for_font(__pref.get_dingbats_font().c_str(),FL_ZAPF_DINGBATS,n); } font_factory* font_map_singleton::get_context(){ if(font_map_singleton::factory==NULL){ font_map_singleton::factory=new font_factory(); } return font_map_singleton::factory; } void font_map_singleton::free_context(){ delete font_map_singleton::factory; } bool font_map_singleton::works(){ return font_map_singleton::factory; } font_map_singleton::font_map_singleton(){} font_factory* font_map_singleton::factory=NULL; bist-0.5.2/src/plot_window.cpp0000644000175000017500000002507011653002572014704 0ustar cagecage#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern Fl_Pixmap img_save_file; #include using namespace spectra_plot; void spectra_plot::save_as_native_file_cb(Fl_Widget* w, void* v){ char* file_n=fl_file_chooser(_("Save Spectra As..."), "*.bist", NULL, 0); plot_window* pwin=static_cast(v); if(pwin!=0){ if(file_n!=NULL){ string name=file_n; name=name.substr(name.find_last_of("/")+1); struct stat attrb; stat(file_n,&attrb); int write=1; if(errno!=ENOENT){ write=ask_overwrite_file(name); } if(write){ immagine im=pwin->_plot; im.w_immagine(string(file_n)); } } } } plot_window::plot_window(signal_type type_plot) :Fl_Double_Window(def_w,def_h,title), _canvas(static_cast(rintf(def_w*def_gap_w/100.0)), static_cast(rintf(def_h*def_gap_h/100.0)), def_w - static_cast(rintf(def_w*2*def_gap_w/100.0)), def_h - static_cast(rintf(def_h*2*def_gap_h/100.0))), _save_file_b(PADD_BUTT+LARG_BUTTON_TOP,def_h-ALT_BUTT_TOP-PADD_BUTT, LARG_BUTTON_TOP,ALT_BUTT_TOP), _type_plot(type_plot) { resizable(this); _canvas.add_immagine(ritorna_immagine()); add(_canvas); _save_file_b.image(img_save_file); _save_file_b.callback(spectra_plot::save_as_native_file_cb); _save_file_b.user_data(this); _save_file_b.tooltip(_("Save as")); add(_save_file_b); end(); set_modal(); if(_type_plot==IR){ _max_y=max_transmittance; _max_x=max_wave_no; } } plot_window::~plot_window(){ } void plot_window::draw(){ _plot.reset_all(); draw_axis(); draw_points(); draw_groups(); Fl_Double_Window::draw(); } Fl_Scroll* plot_window::ritorna_scroll(){ return _placeholder; } immagine* plot_window::ritorna_immagine(){ return &_plot; } mol_canvas* plot_window::ritorna_mol_canvas(){ return &_canvas; } void plot_window::draw_axis(){ gruppo axis; float arr_w=(plot_window::def_gap_w/100*w())/5; float arr_h=(plot_window::def_gap_h/100*h())/5; float arr_gap=0; float x_ax_st=actual_plot_x(); float y_ax_st=actual_plot_y(); float x_ax_end=actual_plot_w(); float y_ax_end=actual_plot_y(); float y_ay_end=actual_plot_h(); proc_arrow X(0,x_ax_st, y_ax_st, x_ax_end,y_ax_end, 50,50,50, //GRAY 0, 0, 0, 1, 0, ARR_NO_PUNT, arr_w, arr_h, arr_gap); proc_arrow Y(0,x_ax_st, y_ax_st, x_ax_st,y_ay_end, 50,50,50, //GRAY 0, 0, 0, 1, 0, ARR_NO_PUNT, arr_w, arr_h, arr_gap); axis.aggiungi_procedura(&X); axis.aggiungi_procedura(&Y); float y_now=0; for(int i=0;i<=axys_div;i++){ int l_tick=1; if(i%4==0){ l_tick*=2; } proc_arrow tick_y(0,x_ax_st-l_tick, remap_y(normalize_y(y_now)), x_ax_st,remap_y(normalize_y(y_now)), 50,50,50, //GRAY 0, 0, 0, l_tick, 0, ARR_NO_PUNT, arr_w, arr_h, arr_gap); y_now= i * _max_y/axys_div; axis.aggiungi_procedura(&tick_y); } float incr=_max_x/axys_div; int ct_tk=0; for(float i=0;i<=_max_x;i+=incr, ct_tk++){ int l_tick=1; if(ct_tk%4==0){ l_tick*=2; } proc_arrow tick_x(0,remap_x(normalize_x(i)),remap_y(normalize_y(0)), remap_x(normalize_x(i)),remap_y(normalize_y(-l_tick)), 50,50,50, //GRAY 0, 0, 0, l_tick, 0, ARR_NO_PUNT, arr_w, arr_h, arr_gap); axis.aggiungi_procedura(&tick_x); } _plot.aggiungi_gruppo(axis); draw_scale_y(); draw_scale_x(); } void plot_window::draw_scale_y(){ if(_type_plot==IR){ float y_now=0; for(int i=1;i<=axys_div;i++){ int dim_std=(plot_window::def_gap_h/100*h())/5;; if(i%4==0){ dim_std+=2; } etichetta et; et.dim(dim_std); ostringstream value_st; value_st << y_now; et.aggiungi(value_st.str(), ET_STR); et.x(actual_plot_x()-et.w()*2); et.y(remap_y(normalize_y(y_now) - et.h()/2)); _plot.add_etich(et); y_now= i * _max_y/axys_div; } }else{ //TODO: OTHER PLOT } } void plot_window::draw_scale_x(){ if(_type_plot==IR){ float incr=_max_x/axys_div; int ct_tk=0; for(float i=0;i<=_max_x;i+=incr, ct_tk++){ int dim_std=(plot_window::def_gap_h/100*h())/5;; if(ct_tk%4==0){ dim_std+=2; } etichetta et; et.dim(dim_std); ostringstream value_st; value_st << _max_x- i; et.aggiungi(value_st.str(), ET_STR); et.x(remap_x(normalize_x(i) - et.w()/2)); et.y(remap_y(normalize_y(-et.h()))); _plot.add_etich(et); } }else{ //TODO: OTHER PLOT } } void plot_window::add_spike(float x, float y){ plot_point p; p._type=SPIKE; p._x=x; p._y=y; _data.push_back(p); } void plot_window::add_group(gruppo to_add, float x, float y){ to_add.trasla(-to_add.posx(),-to_add.posy()); to_add.trasla(x,y); _groups.push_back(to_add); } void plot_window::draw_groups(){ if(_type_plot==IR){ for(unsigned i=0;i<_groups.size();i++){ gruppo cp=_groups[i]; float sc=0.9; float max=plot_window::def_gap_w/100*_canvas.w(); if(cp.w()>0){ if(cp.w()max && cp.h()>max){ cp.scale(sc); } } float old_x=_groups[i].posx(); float old_y=_groups[i].posy(); cp.trasla(-cp.posx(),-cp.posy()); cp.trasla(remap_x(normalize_x(old_x,IR),IR), remap_y(normalize_y(old_y))); }else{ float old_x=_groups[i].posx(); float old_y=_groups[i].posy(); cp.trasla(-cp.posx(),-cp.posy()); cp.trasla(remap_x(normalize_x(old_x+(plot_window::def_gap_w/100*w()),IR),IR), remap_y(normalize_y(old_y))); } _plot.aggiungi_gruppo(cp); } } } void plot_window::draw_points(){ if(_type_plot==IR){ draw_points_IR(); } } void plot_window::draw_points_IR(){ gruppo grp; for(unsigned int i=0;i<_data.size();i++){ float xpt=remap_x(normalize_x(_data[i]._x,IR),IR); float ypt=remap_y(normalize_y(_data[i]._y)); float height=ypt-1; if(_data[i]._type==SPIKE){ height=remap_y(normalize_y(0)); } proc_arrow pt(0,xpt,ypt, xpt,height, 0,0,0, //BLACK 0, 0, 0, 1, 0, ARR_NO_PUNT, 1, 1, 0); grp.aggiungi_procedura(&pt); } _plot.aggiungi_gruppo(grp); } float plot_window::remap_y(float old){ float res=actual_plot_y(); if(_type_plot!=IR){ res+= actual_plot_h() - old; }else{ res+=old; } return res; } float plot_window::de_remap_y(float old){ float res=-actual_plot_y(); if(_type_plot!=IR){ res-= actual_plot_h() + old; }else{ res-=old; } return res; } float plot_window::remap_x(float old, signal_type t){ float res=actual_plot_x(); if(t==IR){ res += old; }else{ res+= old; } return res; } float plot_window::de_remap_x(float old){ float res=-actual_plot_x(); res-=old; return res; } float plot_window::normalize_y(float old){ float res=0; if(_type_plot==IR){ res=old * (actual_plot_h() - actual_plot_y())/_max_y; } return res; } float plot_window::de_normalize_y(float old){ float res=0; if(_type_plot==IR){ res=(old * _max_y)/ (actual_plot_h()); } return res; } float plot_window::normalize_x(float old,signal_type t){ float res=0; if(t==IR){ res=(_max_x -old) * (actual_plot_w() - actual_plot_x())/_max_x; }else{ res=old * (actual_plot_w() - actual_plot_x())/_max_x; } return res; } float plot_window::de_normalize_x(float old){ float res=0; if(_type_plot==IR){ res=(old * _max_x)/ (actual_plot_w() - actual_plot_x()); } return res; } float plot_window::actual_plot_x(){ return _canvas.x() + plot_window::def_gap_w/100*_canvas.w(); } float plot_window::actual_plot_y(){ return _canvas.y() + plot_window::def_gap_h/100*_canvas.h(); } float plot_window::actual_plot_w(){ return _canvas.w() - actual_plot_x();//2 * plot_window::def_gap_w/100*_canvas.w(); } float plot_window::actual_plot_h(){ return _canvas.h() - actual_plot_y();//2 * plot_window::def_gap_h/100*_canvas.h(); } const int plot_window::def_w=800; const int plot_window::def_h=600; const float plot_window::max_transmittance=100; const float plot_window::max_wave_no=4000; const float plot_window::def_gap_w=5; const float plot_window::def_gap_h=5; const char* plot_window::title=_("Spectra prediction"); const float plot_window::axys_div=20; const float plot_window::max_group_w=50; bist-0.5.2/src/command_line.cpp0000644000175000017500000000511211412200237014746 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern Preferences __pref; void print_version(){ cout << ELF << " " << VERSION << endl; } void print_help(char* nome){ cout << ELF << " " << _("Usage") << ":" << endl << "--help -h\t" << _("Print this message and exit") << endl << "--version -v\t" << _("Print version and package name and exit") << endl << "--convert-to -c\t" << _("Format of the converted file") << endl << "--input-file -f\t" << _("Input file(s) to convert") << endl; } void convert_to_vector_format(string in,string out, const char* format){ immagine imm(true); imm.filebist(in); imm.start(); export_image_to_vector_file(imm,out,false); } bist-0.5.2/src/interfacce.cpp0000644000175000017500000000304311655222635014444 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include genitore::genitore() :_il_genitore(0) { } genitore::genitore(const genitore& altro) :_il_genitore(altro._il_genitore) { } genitore::genitore(const genitore* altro) :_il_genitore(altro->_il_genitore) { } genitore& genitore::operator=(const genitore& altro){ _il_genitore=altro._il_genitore; return *this; } void genitore::aggiungi_genitore(genitore* gtr){ _il_genitore=gtr; // std::cout << "GENITOREAGG: " << typeid(*_il_genitore).name() << " " // << " " << _il_genitore << " " << std::endl; } genitore* genitore::ritorna_genitore(){ return _il_genitore; } damaged_obj::damaged_obj() :_damaged(false) { } bool damaged_obj::damaged(){ return _damaged; } void damaged_obj::damaged(bool is_damaged=true){ _damaged=is_damaged; } bist-0.5.2/src/editor.cpp0000644000175000017500000011707611733641566013650 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante Copyright (C) 2010 Valov Vasily This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* * Application implements MVC model. * editor class represents a model. * functions like 'editor_window_cb' represents controller. * FLTK is a view. * All functionality must be added into the editor class. * Global functions are used to verify input data from user * and call appropriate editor's method. * Friends functions are not allowed. If existing functionality * doesn't satisfy your needs just add necessary methods into * editor class. Then call this method inside existing global * functions. If you need to create a new callback just create * new global function and call all necessary methods inside of it. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; Fl_Pixmap img_sel_atom(lb_select_atom_xpm); Fl_Pixmap img_sel_group(lb_select_group_xpm); Fl_Pixmap img_sel_color(lb_select_color_xpm); Fl_Pixmap img_sel_font_color(lb_select_font_color_xpm); Fl_Pixmap img_delete_selected(lb_delete_selected_xpm); Fl_Pixmap img_kill(lb_kill_xpm); Fl_Pixmap img_draw_bond(lb_draw_bond_xpm); Fl_Pixmap img_draw_double_bond(lb_draw_double_bond_xpm); Fl_Pixmap img_draw_triple_bond(lb_draw_triple_bond_xpm); Fl_Pixmap img_draw_arrow(lb_draw_arrow_xpm); Fl_Pixmap img_draw_bezier(lb_draw_bezier_xpm); Fl_Pixmap img_draw_arc(lb_draw_arc_xpm); Fl_Pixmap img_draw_box(lb_draw_box_xpm); Fl_Pixmap img_draw_etich(lb_draw_etich_xpm); Fl_Pixmap img_scale(lb_scale_xpm); Fl_Pixmap img_rotate(lb_rotate_xpm); Fl_Pixmap img_draw_orb(lb_orb_xpm); Fl_Pixmap img_add_lib(lb_lib_xpm); Fl_Pixmap img_load_file(load_file_xpm); Fl_Pixmap img_save_file(lb_save_file_xpm); Fl_Pixmap img_exp_ps(lb_exp_ps_xpm); Fl_Pixmap img_new(lb_new_xpm); Fl_Pixmap img_exp_png(lb_exp_png_xpm); Fl_Pixmap img_undo(lb_undo_xpm); Fl_Pixmap img_redo(lb_redo_xpm); Fl_Pixmap img_fixed_rotation(lb_fixed_rotation_xpm); Fl_Pixmap img_save_as_file(lb_save_as_file_xpm); Fl_Pixmap img_draw_chain(lb_draw_chain_xpm); Fl_Pixmap img_paste(lb_paste_xpm); Fl_Pixmap img_flip_v(lb_flip_v_xpm); Fl_Pixmap img_flip_h(lb_flip_h_xpm); Fl_Pixmap img_3D_rotation(lb_3D_rotation_xpm); Fl_Pixmap img_zoom(lb_zoom_xpm); Fl_Pixmap img_unzoom(lb_unzoom_xpm); Fl_Pixmap img_unzoom_1o1(lb_unzoom_1on1_xpm); void editor_window_cb(Fl_Widget* w , void* d){ editor* ed=dynamic_cast(MainWindow); if(ed->no_of_images_undo()>2 && !ed->isFileSaved()){ if (fl_choice(_("Image modified, exit without saving?"),_("Yes"),_("No"),NULL)==0){ ed->hide(); }else{ editor_save_native(w,d); } }else{ ed->hide(); } } void start_plugin_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); Fl_Menu_* m=dynamic_cast(w); std::map path_plugins=ed->getPluginPath(); std::string key_path=(m->mvalue())->label(); if(path_plugins.count(key_path)!=0){ std::string path_plugin=path_plugins[key_path]; /*free mem of old plugin*/ if(ed->getActualPlugin()!=0){ void* destroy_plg = dlsym(const_cast(ed->getHandle()), "destroy_plugin"); void (*dest)(bist_plugin*)=(void (*)(bist_plugin*))(destroy_plg); dest(const_cast(ed->getActualPlugin())); dlclose(const_cast(ed->getHandle())); } /**load new plugin*/ ed->setHandle(dlopen(path_plugin.c_str(),RTLD_LAZY)); if(!ed->getHandle()){ std::cerr << dlerror() << endl; } void* create_plg = dlsym(const_cast(ed->getHandle()), "create_plugin"); if(!create_plg){ std::cerr << dlerror() << endl; } bist_plugin* (*gen_plugin)(immagine*,string)=( bist_plugin* (*)(immagine*,string))(create_plg); bist_plugin* plugin=gen_plugin(ed->ritorna_immagine(),path_plugin); ed->setActualPlugin(plugin); ed->reg_modified(); const_cast(ed->getActualPlugin())->inizialize(); }else{ std::ostringstream ost; ost << _("No such plugin ") << key_path; fl_alert("%s",ost.str().c_str()); } } void editor_zoom_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->zoom(); } void editor_unzoom_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->unzoom(); } void editor_unzoom_1o1_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->unzoom_1o1(); } void editor_3D_rotation_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->rotate3d(); } void editor_flip_v_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->flipV(); } void editor_flip_h_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->flipH(); } void editor_paste_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->paste(); } void editor_draw_chain(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->drawChain(); } void export_image(std::string format){ std::string file_filter=std::string("*.") + format; char* the_file=fl_file_chooser(_("Export..."), file_filter.c_str(), NULL, 0); if(the_file!=NULL){ editor* ed=dynamic_cast(MainWindow); ed->hide(); immagine* imm=MainWindow->ritorna_immagine(); export_image_to_vector_file(*imm,the_file,true); ed->show(); } } void editor_export(Fl_Widget* w, void* d){ export_image("*"); } void editor_save_as_ps_cb(Fl_Widget* w, void* d){ export_image("ps"); } void editor_save_as_png_cb(Fl_Widget* w, void* d){ export_image("png"); } void editor_undo_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->undo(); } void editor_redo_cb(Fl_Widget* w, void* d){ editor* ed=dynamic_cast(MainWindow); ed->redo(); } void editor_set_def_cb(Fl_Widget* w, void* d){ __pref.Defaults(); __pref.SavePrefs(); editor* ed=dynamic_cast(MainWindow); ed->canvas_resize(__pref.getPageWidth(), __pref.getPageHeight()); } void config_cb(Fl_Widget* w, void* v){ pref_dialog* p=new pref_dialog; p->show(); while(p->shown()){ Fl::wait(); } delete p; } void edit_about_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->showAboutDialog(); } void edit_tutorial_cb(Fl_Widget* w,void* v){ editor* ed = dynamic_cast(MainWindow); ed->showHelpDialog(); } void edit_nowar_cb(Fl_Widget* w, void* v){ const static char* man="Copyright (C) 2005 Valerio Benfante.\nThis is free software; see the file COPYING for copying conditions.\nThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nThe logo is copyright (C) 2005 Luisa Russo and is released under GNU GPL"; fl_message("%s",man); } void add_lib_cb(Fl_Widget* w, void* v){ editor* tmp=dynamic_cast(MainWindow); tmp->addLib(MainWindow); } void editor_rotate_selected_fixed_cb(Fl_Widget* w, void* v){ fl_beep(FL_BEEP_QUESTION); editor* ed = dynamic_cast(MainWindow); ed->rotateSelectedFixed(); } void rotate_selected_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->rotateSelected(); } void translate_selected_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->translateSelected(); } void scale_selected_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->scaleSelected(); } void draw_single_bond_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawBond(BOND_SINGLE); } void draw_double_bond_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawBond(BOND_DOUBLE); } void draw_triple_bond_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawBond(BOND_TRIPLE); } void draw_arrow_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawArrow(); } void draw_bezier_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawBezier(); } void draw_arc_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawArc(); } void draw_box_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawBox(); } void draw_etich_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawEtich(); } void draw_orb_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->drawOrb(); } void copy_cb(Fl_Widget* w, void* v) { //int status; pid_t pid; pid = fork (); if(pid == 0){ execl(ELF_ABS_PATH,ELF,NULL); exit (0); }else if (pid < 0){ fl_alert(_("I can not create a new window")); } } void quit_cb(Fl_Widget* w, void* v) { if (fl_choice(_("Really quit?"),_("Yes"),_("No"),NULL)==0){ editor* ed=dynamic_cast(MainWindow); ed->hide(); exit(EXIT_SUCCESS); } //da aggiornare quando ci saranno piu funzionalita' } void choose_font_cb(Fl_Widget* w, void* v){ } void kill_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->kill(MainWindow); } void delete_selected_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->deleteSelected(MainWindow); } void open_file_cb(Fl_Widget* w, void* v){ char* il_file=fl_file_chooser(_("Pick a file..."), NULL, NULL, 0); if(il_file!=NULL){ editor* ed=dynamic_cast(MainWindow); ed->showOpenFileDialog(il_file); }else{ #ifdef DEBUG cout << "file null" << endl; #endif } } void open_recent_file_cb(Fl_Widget* w, void* v){ std::string the_file=reinterpret_cast(v); if(the_file!=""){ editor* ed=dynamic_cast(MainWindow); ed->file_inp(string(the_file)); ed->redraw(); }else{ #ifdef DEBUG cerr << __FUNCTION__ << " file null" << endl; #endif } } void editor_save_native(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); if(ed->isFileOpened()==""){ save_as_native_file_cb(w,v); }else{ immagine* la_imm=ed->ritorna_immagine(); la_imm->w_immagine(ed->isFileOpened()); } ed->saveFile(); } void save_as_native_file_cb(Fl_Widget* w, void* v){ char* il_file=fl_file_chooser(_("Save As..."), "*.bist", NULL, 0); if(il_file!=NULL){ string nome=il_file; nome=nome.substr(nome.find_last_of("/")+1); struct stat attrb; stat(il_file,&attrb); int scrive=1; if(errno!=ENOENT){ scrive=ask_overwrite_file(nome); } if(scrive){ editor* ed=dynamic_cast(MainWindow); ed->openFile(il_file); immagine* la_imm=ed->ritorna_immagine(); la_imm->w_immagine(string(il_file)); ed->saveFile(); __pref.set_last_opened_files(il_file); __pref.SavePrefs(); } } } void select_atom_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->selectAtom(MainWindow); } void select_group_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->selectGroup(MainWindow); } void select_box_cb(Fl_Widget* w, void* v){ editor* ed=dynamic_cast(MainWindow); ed->selectBox(MainWindow); } void select_color_cb(Fl_Widget* w, void* v){ unsigned char r,g,b; int pushd=fl_color_chooser(_("pick a color..."), r, g, b); immagine* imm=MainWindow->ritorna_immagine(); if(pushd){ editor* ed=dynamic_cast(MainWindow); ed->selectColor(imm,r,g,b); } imm->elimina_elem_selected(); imm->elimina_legami_selected(); } extern Fl_Menu_Item* voci_menu; editor::editor(int W,int H, const char* titolo) :Fl_Double_Window(W,H,titolo), _actual_plugin(0), _scroller(LARGH_BUTTON_BAR,ALT_MENU+ALT_TOOLBAR, w()-LARGH_BUTTON_BAR, h()-ALT_MENU-ALT_TOOLBAR*2), _mol_can(LARGH_BUTTON_BAR,ALT_MENU+ALT_TOOLBAR,__pref.getPageWidth(),__pref.getPageHeight()), _il_menu(0, 0,w() , ALT_MENU), //upper frame (just under the menu) _sup_frame(FL_UP_FRAME, 0, ALT_MENU, LARGH_FIN, ALT_TOOLBAR,""), _new_b(PADD_BUTT,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _open_file_b(PADD_BUTT+LARG_BUTTON_TOP,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _save_file_b(PADD_BUTT+LARG_BUTTON_TOP*2,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _save_file_as_b(PADD_BUTT+LARG_BUTTON_TOP*3,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _exp_ps_b(PADD_BUTT+LARG_BUTTON_TOP*4,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _exp_png_b(PADD_BUTT+LARG_BUTTON_TOP*5,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _delete_selected(PADD_BUTT+LARG_BUTTON_TOP*6,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _undo_b(PADD_BUTT+LARG_BUTTON_TOP*8,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _redo_b(PADD_BUTT+LARG_BUTTON_TOP*9,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _b_paste(PADD_BUTT+LARG_BUTTON_TOP*10,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _zoom_b(PADD_BUTT+LARG_BUTTON_TOP*12,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _unzoom_1o1_b(PADD_BUTT+LARG_BUTTON_TOP*13,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), _unzoom_b(PADD_BUTT+LARG_BUTTON_TOP*14,ALT_MENU+PADD_BUTT,LARG_BUTTON_TOP,ALT_BUTT_TOP), //left buttons bar _select_atom(PADD_BUTT,ALT_MENU+PADD_BUTT+ALT_TOOLBAR,LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _select_group(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR, LARG_BUTTON_LEFT, ALT_BUTT_LEFT), _rotate_sel(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_fixed_rotation(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_rotate_3d(PADD_BUTT,ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*2, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _scale_sel(PADD_BUTT*2+LARG_BUTTON_LEFT,ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*2, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_flip_v(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*3, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _b_flip_h(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*3, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _kill(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*4, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _select_color(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+LARG_BUTTON_LEFT*4, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), //SPACER from here _draw_single_bond(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*5, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_arrow(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*5, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_double_bond(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*6, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_bezier(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*6, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_triple_bond(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*7, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_arc(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*7, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_box(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*8, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_chain(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*8, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_etich(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*9, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _draw_orb(PADD_BUTT*2+LARG_BUTTON_LEFT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*9, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), _add_lib(PADD_BUTT, ALT_MENU+PADD_BUTT+ALT_TOOLBAR+SPACER+LARG_BUTTON_LEFT*10, LARG_BUTTON_LEFT,ALT_BUTT_LEFT), //INFORMATION BOX _inf_frame(FL_EMBOSSED_BOX,0,h()-ALT_BUTT_TOP,FIN_W,HEIGHT_INF_BAR,""), _file_saved(false) { #ifndef DEBUG callback(editor_window_cb); #endif _help_dialog=new Fl_Help_Dialog; _il_menu.copy(voci_menu); add(_il_menu); //get recent files and add to menu std::vector recent_v=__pref.get_last_opened_files(); for(unsigned int i=0;i(const_cast(recent_v[i].c_str())),0); } string the_plugin_user_home_dir=getenv("HOME") + string(PLUGIN_PATH_HOME); populate_plugin_menu(the_plugin_user_home_dir); populate_plugin_menu(PLUGIN_PATH_SHARED); //barra sopra add(_sup_frame); _new_b.image(img_new); _new_b.callback(copy_cb); _new_b.tooltip(_("Create a new window")); add(_new_b); _open_file_b.image(img_load_file); _open_file_b.callback(open_file_cb); _open_file_b.tooltip(_("Open a file")); add(_open_file_b); _save_file_b.image(img_save_file); _save_file_b.callback(editor_save_native); _save_file_b.tooltip(_("Save")); add(_save_file_b); _save_file_as_b.image(img_save_as_file); _save_file_as_b.callback(save_as_native_file_cb); _save_file_as_b.tooltip(_("Save as")); add(_save_file_as_b); _exp_ps_b.image(img_exp_ps); _exp_ps_b.callback(editor_save_as_ps_cb); _exp_ps_b.tooltip(_("Export as PostScript")); add(_exp_ps_b); _exp_png_b.image(img_exp_png); _exp_png_b.callback(editor_save_as_png_cb); _exp_png_b.tooltip(_("Export as PNG")); add(_exp_png_b); _delete_selected.image(img_delete_selected); _delete_selected.callback(delete_selected_cb); _delete_selected.tooltip(_("Delete selected")); add(_delete_selected); _undo_b.image(img_undo); _undo_b.callback(editor_undo_cb); _undo_b.tooltip(_("Undo!")); add(_undo_b); _redo_b.image(img_redo); _redo_b.callback(editor_redo_cb); _redo_b.tooltip(_("Redo!")); add(_redo_b); _b_paste.image(img_paste); _b_paste.callback(editor_paste_cb); _b_paste.type(FL_RADIO_BUTTON); _b_paste.tooltip(_("Paste")); add(_b_paste); _zoom_b.image(img_zoom); _zoom_b.callback(editor_zoom_cb); _zoom_b.tooltip(_("Zoom")); _zoom_b.type(FL_RADIO_BUTTON); add(_zoom_b); _unzoom_1o1_b.image(img_unzoom_1o1); _unzoom_1o1_b.callback(editor_unzoom_1o1_cb); _unzoom_1o1_b.tooltip(_("Actual view")); add(_unzoom_1o1_b); _unzoom_b.image(img_unzoom); _unzoom_b.callback(editor_unzoom_cb); _unzoom_b.tooltip(_("Unzoom")); _unzoom_b.type(FL_RADIO_BUTTON); add(_unzoom_b); //canvas _scroller.type(Fl_Scroll::BOTH_ALWAYS); _scroller.box(FL_UP_FRAME); _scroller.add(_mol_can); _scroller.end(); resizable(_scroller); add(_scroller); _mol_can.position(_mol_can.parent()->w()/2-_mol_can.w()/2, _mol_can.parent()->h()/2-_mol_can.h()/2); _select_atom.set(); _select_atom.image(img_sel_atom); _select_atom.callback(select_atom_cb); _select_atom.type(FL_RADIO_BUTTON); _select_atom.tooltip(_("Select Element")); add(_select_atom); _select_group.callback(select_group_cb); _select_group.image(img_sel_group); _select_group.type(FL_RADIO_BUTTON); _select_group.tooltip(_("Select a molecule")); add(_select_group); _rotate_sel.callback(rotate_selected_cb); _rotate_sel.image(img_rotate); _rotate_sel.type(FL_RADIO_BUTTON); _rotate_sel.tooltip(_("Rotate selected element")); add(_rotate_sel); _b_fixed_rotation.image(img_fixed_rotation); _b_fixed_rotation.callback(editor_rotate_selected_fixed_cb); _b_fixed_rotation.type(FL_RADIO_BUTTON); _b_fixed_rotation.tooltip(_("Fixed angle rotation")); add(_b_fixed_rotation); _b_rotate_3d.image(img_3D_rotation); _b_rotate_3d.callback(editor_3D_rotation_cb); _b_rotate_3d.type(FL_RADIO_BUTTON); _b_rotate_3d.tooltip(_("3D rotation")); add(_b_rotate_3d); _scale_sel.callback(scale_selected_cb); _scale_sel.image(img_scale); _scale_sel.type(FL_RADIO_BUTTON); _scale_sel.tooltip(_("Scale selected element")); add(_scale_sel); _b_flip_v.image(img_flip_v); _b_flip_v.callback(editor_flip_v_cb); _b_flip_v.type(FL_RADIO_BUTTON); _b_flip_v.tooltip(_("Vertical flip")); add(_b_flip_v); _b_flip_h.image(img_flip_h); _b_flip_h.callback(editor_flip_h_cb); _b_flip_h.type(FL_RADIO_BUTTON); _b_flip_h.tooltip(_("Orizontal flip")); add(_b_flip_h); _kill.image(img_kill); _kill.callback(kill_cb); _kill.type(FL_RADIO_BUTTON); _kill.tooltip(_("Kill")); add(_kill); _select_color.image(img_sel_color); _select_color.callback(select_color_cb); _select_color.tooltip(_("Select color")); add(_select_color); _draw_single_bond.image(img_draw_bond); _draw_single_bond.callback(draw_single_bond_cb); _draw_single_bond.type(FL_RADIO_BUTTON); _draw_single_bond.tooltip(_("Draw single bond")); add(_draw_single_bond); _draw_arrow.image(img_draw_arrow); _draw_arrow.callback(draw_arrow_cb); _draw_arrow.type(FL_RADIO_BUTTON); _draw_arrow.tooltip(_("Draw arrow")); add(_draw_arrow); _draw_double_bond.image(img_draw_double_bond); _draw_double_bond.callback(draw_double_bond_cb); _draw_double_bond.type(FL_RADIO_BUTTON); _draw_double_bond.tooltip(_("Draw double bond")); add(_draw_double_bond); _draw_bezier.image(img_draw_bezier); _draw_bezier.callback(draw_bezier_cb); _draw_bezier.type(FL_RADIO_BUTTON); _draw_bezier.tooltip(_("Draw bezier curve")); add(_draw_bezier); _draw_triple_bond.image(img_draw_triple_bond); _draw_triple_bond.callback(draw_triple_bond_cb); _draw_triple_bond.type(FL_RADIO_BUTTON); _draw_triple_bond.tooltip(_("Draw triple bond")); add(_draw_triple_bond); _draw_arc.image(img_draw_arc); _draw_arc.callback(draw_arc_cb); _draw_arc.type(FL_RADIO_BUTTON); _draw_arc.tooltip(_("Draw circle/ellipse")); add(_draw_arc); _draw_box.image(img_draw_box); _draw_box.callback(draw_box_cb); _draw_box.type(FL_RADIO_BUTTON); _draw_box.tooltip(_("Draw box")); add(_draw_box); _draw_chain.image(img_draw_chain); _draw_chain.callback(editor_draw_chain); _draw_chain.type(FL_RADIO_BUTTON); _draw_chain.tooltip(_("Draw chain")); add(_draw_chain); _draw_etich.image(img_draw_etich); _draw_etich.callback(draw_etich_cb); _draw_etich.type(FL_RADIO_BUTTON); _draw_etich.tooltip(_("Draw string")); add(_draw_etich); _draw_orb.image(img_draw_orb); _draw_orb.callback(draw_orb_cb); _draw_orb.type(FL_RADIO_BUTTON); _draw_orb.tooltip(_("Draw p orbital")); add(_draw_orb); _add_lib.image(img_add_lib); _add_lib.callback(add_lib_cb); _add_lib.tooltip(_("Insert template")); add(_add_lib); //information box add(_inf_frame); _mol_can.action(ACT_SEL_ATOM); file_inp(""); } void editor::showHelpDialog(){ _help_dialog->load(TUTORIAL_HTML); _help_dialog->show(); } void editor::zoom(){ _mol_can.action(ACT_ZOOM); } void editor::unzoom(){ _mol_can.action(ACT_UNZOOM); } void editor::unzoom_1o1(){ _mol_can.action(ACT_NOTHING); int oldaction=get_button_value_as_action(); __pref.setZoom(1.0); int posx_canv=_mol_can.parent()->x() - _mol_can.x() + _mol_can.parent()->w()/2 - __pref.getPageWidth()/2; int posy_canv=_mol_can.parent()->y() - _mol_can.y() + _mol_can.parent()->h()/2 - __pref.getPageHeight()/2; _mol_can.zoom(0,posx_canv,posy_canv); set_button(oldaction, true); redraw(); } void editor::rotate3d(){ _mol_can.action(ACT_3D_ROT); } void editor::flipV(){ _mol_can.action(ACT_FLIP_VER); } void editor::flipH(){ _mol_can.action(ACT_FLIP_HOR); } void editor::paste(){ set_button(ACT_PASTE,true); } void editor::drawChain(){ chain_prop* p = new chain_prop; p->show(); while(p->shown()){ Fl::wait(); } _mol_can.action(ACT_DRAW_CHAIN); _mol_can.num_atom_chain(p->_no_c); _mol_can.orient_chain(p->_angl); delete p; } void editor::undo(){ if (_immagini.size() > 1){ immagine the_front=ritorna_immagine(); _immagini.pop_front(); _redo_immagini.push_front(the_front); _mol_can.add_immagine(ritorna_immagine()); } redraw(); } void editor::redo(){ if (_redo_immagini.size() >= 1){ immagine the_front=_redo_immagini.front(); _redo_immagini.pop_front(); _immagini.push_front(the_front); _mol_can.add_immagine(ritorna_immagine()); } redraw(); } bool editor::isFileSaved() const { return _file_saved; } void editor::saveFile(){ _file_saved = true; } const std::string& editor::isFileOpened() const { return _file_opened; } void editor::openFile(const string& fname){ _file_opened = fname; } void editor::showAboutDialog(){ _help_dialog->load(ABOUT_HTML); _help_dialog->show(); } void editor::rotateSelectedFixed(){ fl_beep(FL_BEEP_QUESTION); const char * risposta=fl_input(_("Please insert rotation entity in degrees."), "90"); char* tail; if(risposta!=NULL){ float rot_deg=strtof(risposta,&tail); if(tail[0]=='\0'){ rot_deg=rot_deg*2.0*M_PI/360.0; _mol_can.action(ACT_FIXED_ROTATION); _mol_can.fixed_rotation_degree(rot_deg); } } } void editor::rotateSelected(){ _mol_can.action(ACT_ROTATE_SELECTED); pair ld; pair ru; immagine* img = ritorna_immagine(); if(img->elem_selected_size()>0){ img->aabb_elem_selected(ld, ru); int dx_scroll=(MainWindow->ritorna_mol_canvas())->x(); int dy_scroll=(MainWindow->ritorna_mol_canvas())->y(); _mol_can.rotation_pivot_pos(ld.first + (ru.first -ld.first) /2 + dx_scroll, ld.second + (ru.second -ld.second) /2 +dy_scroll); } } void editor::drawEtich(){ _mol_can.action(ACT_DRAW_ETICH); } void editor::deleteSelected(finestra_pr* finestra){ reg_modified(); immagine* imm=finestra->ritorna_immagine(); imm->cancella_elementi_selected(); imm->elimina_elem_selected(); imm->elimina_legami_selected(); this->redraw(); } void editor::selectAtom(finestra_pr* finestra){ this->_mol_can.action(ACT_SEL_ATOM); this->_mol_can.take_focus(); immagine* imm=finestra->ritorna_immagine(); imm->elimina_elem_selected(); imm->elimina_legami_selected(); this->redraw(); } void editor::selectGroup(finestra_pr* finestra){ this->_mol_can.action(ACT_SEL_GROUP); this->_mol_can.take_focus(); immagine* imm=finestra->ritorna_immagine(); imm->elimina_elem_selected(); imm->elimina_legami_selected(); this->redraw(); } void editor::selectBox(finestra_pr* finestra){ this->_mol_can.action(ACT_SEL_BOX); this->_mol_can.take_focus(); immagine* imm=finestra->ritorna_immagine(); imm->elimina_elem_selected(); imm->elimina_legami_selected(); this->redraw(); } void editor::selectColor(immagine* immPtr,unsigned int r, unsigned int g,unsigned int b){ switch(this->_mol_can.action()){ case ACT_NOTHING: break; case ACT_SEL_ATOM: immPtr->cambia_colore_sel(r,g,b); break; case ACT_SEL_BOX: case ACT_SEL_GROUP: immPtr->cambia_colore_sel(r,g,b); immPtr->cambia_colore_sel_etich(r,g,b); break; } } void editor::showOpenFileDialog(const char* fname){ if (fname){ file_inp(string(fname)); __pref.set_last_opened_files(fname); __pref.SavePrefs(); this->redraw(); } } const std::map& editor::getPluginPath() const { return this->_dl_plugin_path; } const void* editor::getHandle() const{ return _dl_handle; } const bist_plugin* editor::getActualPlugin() const{ return _actual_plugin; } void editor::setActualPlugin(bist_plugin* newPlugin){ _actual_plugin = newPlugin; } void editor::setHandle(void* newHandle){ _dl_handle = newHandle; } void editor::kill(finestra_pr* finestra){ immagine* imm= finestra->ritorna_immagine(); imm->elimina_elem_selected(); imm->elimina_legami_selected(); this->_mol_can.action(ACT_KILL); this->redraw(); } void editor::addLib(finestra_pr* fin){ lib_dialog* p=new lib_dialog; MainWindow=p; p->show(); while(p->shown()){ Fl::wait(); } string templ=p->get_template_file(); delete p; MainWindow=this; immagine* imm=MainWindow->ritorna_immagine(); imm->elimina_elem_selected(); imm->elimina_legami_selected(); imm->aggiungi_template(templ); this->redraw(); } void editor::translateSelected(){ _mol_can.action(ACT_TRANSLATE_SELECTED); } void editor::drawBond(BondType bt){ switch(bt){ case BOND_SINGLE: _mol_can.action(ACT_DRAW_SINGLE_BOND); break; case BOND_DOUBLE: _mol_can.action(ACT_DRAW_DOUBLE_BOND); break; case BOND_TRIPLE: _mol_can.action(ACT_DRAW_TRIPLE_BOND);break; } } void editor::drawArc(){ _mol_can.action(ACT_DRAW_ARC); } void editor::drawOrb(){ _mol_can.action(ACT_DRAW_ORB); } void editor::drawBezier(){ _mol_can.action(ACT_DRAW_BEZIER); } void editor::drawBox(){ _mol_can.action(ACT_DRAW_BOX); } void editor::drawArrow(){ _mol_can.action(ACT_DRAW_ARROW); } void editor::scaleSelected(){ _mol_can.action(ACT_SCALE_SELECTED); _mol_can.take_focus(); } void editor::canvas_resize(int nw_width,int nw_height){ if (nw_width > 0 && nw_height > 0) _mol_can.size(nw_width, nw_height); } void editor::canvas_give_focus(){ _mol_can.take_focus(); } void editor::canvas_translate(int dx, int dy){ _mol_can.translate(dx,dy); } void editor::reg_modified(){ _mol_can.reg_modified(); } void editor::register_images_undo(immagine* imm){ _immagini.push_front(*imm); if(_actual_plugin!=0){ _actual_plugin->image(ritorna_immagine()); #ifdef DEBUG cout << "actual reg: " << imm << endl; #endif } #ifdef DEBUG cout << "registrato" << imm << " " << _immagini.size() << endl; #endif } deque::size_type editor::no_of_images_undo(){ return _immagini.size(); } editor::~editor(){ if(_actual_plugin!=0){ void* handle=dlopen(_actual_plugin->libpath().c_str(),RTLD_LAZY); if(!handle){ cout << dlerror() << endl; } void* destroy_plg = dlsym(_dl_handle, "destroy_plugin"); if(!destroy_plg){ cout << dlerror() << endl; } void (*dest)(bist_plugin*)=(void (*)(bist_plugin*))(destroy_plg); dest(_actual_plugin); dlclose(_dl_handle); } delete _help_dialog; #ifdef DEBUG cerr << "Eliminata finestra." << endl; #endif } bist_plugin* editor::actual_plugin(){ return _actual_plugin; } void editor::file_inp(string file){ immagine* la_imm=NULL; if(guess_is_cml_file(file)){ la_imm=new immagine_cml(); }else if(guess_is_mdl_file(file)){ la_imm=new immagine_mol(); }else { la_imm=new immagine(); } try{ la_imm->filebist(file); la_imm->start(); la_imm->print_warn(); la_imm->print_errors(); }catch (...){ not_impl(); } if(!la_imm->has_error()){ _file_opened=file; _immagini.push_front(static_cast(*la_imm)); _mol_can.add_immagine(ritorna_immagine()); } delete la_imm; } Fl_Scroll* editor::ritorna_scroll(){ return &_scroller; } immagine* editor::ritorna_immagine(){ return &_immagini.front(); } mol_canvas* editor::ritorna_mol_canvas(){ return &_mol_can; } void editor::draw(){ damage(FL_DAMAGE_ALL); _inf_frame.damage(FL_DAMAGE_ALL); this->Fl_Double_Window::draw(); int w_coord=draw_mouse_cordinate_inf_bar(); int res_w=0; int res_h=0; int wt=w_coord; if(_mol_can.glue_mode()){ std::string g_s(_("Glue mode ")); fl_measure(g_s.c_str(), res_w, res_h); fl_draw(g_s.c_str(),wt, h()-ALT_BUTT_TOP/2+ res_h/4); wt+=res_w; } if(getActualPlugin()!=NULL && const_cast(getActualPlugin())->time_to_act()){ res_h=0; res_w=0; std::string g_s(_("Plugin enabled ")); fl_measure(g_s.c_str(), res_w, res_h); fl_draw(g_s.c_str(),wt,h()-ALT_BUTT_TOP/2 + res_h/4); wt+=res_w; } } int editor::handle(int e){ int res=this->Fl_Double_Window::handle(e); switch(e){ case FL_MOVE: redraw(); break; } return res; } int editor::draw_mouse_cordinate_inf_bar(int x, int font_size){ int p_font=fl_font(); int p_font_size=fl_size(); fl_font(FL_HELVETICA_BOLD,font_size); int res_w=0; int res_h=0; int act_x=Fl::event_x() - LARGH_BUTTON_BAR; int act_y=Fl::event_y() - ALT_TOOLBAR - ALT_MENU; act_x= act_x < 0 ? 0 : act_x; act_y= act_y < 0 ? 0 : act_y; std::ostringstream ost; ost << " x: " << act_x << " y: "<< act_y << " " << std::ends; fl_measure(ost.str().c_str(), res_w, res_h); fl_draw(ost.str().c_str(),x,h()-ALT_BUTT_TOP/2 + res_h/4); /*revert to saved value*/ fl_font(p_font,p_font_size); return res_w; } int editor::get_button_value_as_action(){ int res= ACT_NOTHING; if(_select_atom.value()){ res=ACT_SEL_ATOM; }else if(_select_group.value()){ res=ACT_SEL_GROUP; } //TODO: all the others buttons return res; } void editor::set_button(int which, bool set_action){ _select_atom.value(0); _select_group.value(0); _rotate_sel.value(0); _scale_sel.value(0); _kill.value(0); _draw_single_bond.value(0); _draw_double_bond.value(0); _draw_triple_bond.value(0); _draw_arrow.value(0); _draw_bezier.value(0); _draw_arc.value(0); _draw_box.value(0); _draw_etich.value(0); _draw_orb.value(0); _add_lib.value(0); _new_b.value(0); _open_file_b.value(0); _save_file_b.value(0); _save_file_as_b.value(0); _exp_ps_b.value(0); _exp_png_b.value(0); _undo_b.value(0); _draw_chain.value(0); _b_fixed_rotation.value(0); _b_paste.value(0); _b_flip_v.value(0); _b_flip_h.value(0); _b_rotate_3d.value(0); _select_color.value(0); _delete_selected.value(0); _zoom_b.value(0); _unzoom_b.value(0); _unzoom_1o1_b.value(0); if(set_action){ _mol_can.action(which); } switch(which){ case ACT_NOTHING: break; case ACT_SEL_ATOM: _select_atom.value(1); break; case ACT_SEL_GROUP: _select_group.value(1); break; case ACT_SEL_BOX: _draw_box.value(1); break; case ACT_DELETE_SELECTED: _delete_selected.value(1); break; case ACT_KILL: _kill.value(1); break; case ACT_DRAW_SINGLE_BOND: _draw_single_bond.value(1); break; case ACT_DRAW_DOUBLE_BOND: _draw_double_bond.value(1); break; case ACT_DRAW_TRIPLE_BOND: _draw_triple_bond.value(1); break; case ACT_DRAW_ARROW: _draw_arrow.value(1); break; case ACT_DRAW_BEZIER: _draw_bezier.value(1); break; case ACT_DRAW_ARC: _draw_arc.value(1); break; case ACT_DRAW_ETICH: _draw_etich.value(1); break; case ACT_TRANSLATE_SELECTED: break; case ACT_ROTATE_SELECTED: _rotate_sel.value(1); break; case ACT_SCALE_SELECTED: _scale_sel.value(1); break; case ACT_DRAW_ORB: _draw_orb.value(1); break; case ACT_DRAW_LIBRARY: _add_lib.value(1); break; case ACT_FIXED_ROTATION: _b_fixed_rotation.value(1); break; case ACT_DRAW_CHAIN: _draw_chain.value(1); break; case ACT_FLIP_HOR: _b_flip_h.value(1); break; case ACT_FLIP_VER: _b_flip_v.value(1); break; case ACT_COPY: case ACT_PASTE: _b_paste.value(1); break; case ACT_3D_ROT: _b_rotate_3d.value(1); break; case ACT_ZOOM: _zoom_b.value(1); break; case ACT_UNZOOM: _unzoom_b.value(1); break; default: break; } } void editor::populate_plugin_menu(std::string startdir){ DIR* shared_plug=opendir(startdir.c_str()); if(shared_plug!=0){ struct dirent* actplug; while((actplug=readdir(shared_plug))!=NULL){ string actnameplug=actplug->d_name; if(actnameplug!="." && actnameplug!=".."){ string nameplug = startdir + actnameplug; if(is_ELF_shared_object(nameplug)){ std::pair the_pair(actnameplug,nameplug); _dl_plugin_path.insert(the_pair); //start the plugin to get its menu entry void* dl_handle=dlopen(nameplug.c_str(),RTLD_LAZY); if(!dl_handle){ std::cerr << dlerror() << endl; } void* create_plg = dlsym(dl_handle, "create_plugin"); if(!create_plg){ std::cerr << dlerror() << endl; } bist_plugin* (*gen_plugin)(immagine*,string)=( bist_plugin* (*)(immagine*,string))(create_plg); bist_plugin* plugin=gen_plugin(ritorna_immagine(),nameplug); std::ostringstream menu_entry; menu_entry << "&Plug-in/" << plugin->menu_path() << actnameplug; void* destroy_plg = dlsym(dl_handle, "destroy_plugin"); void (*dest)(bist_plugin*)=(void (*)(bist_plugin*))(destroy_plg); dest(plugin); dlclose(dl_handle); _il_menu.add(menu_entry.str().c_str(),0,start_plugin_cb,reinterpret_cast(&_dl_plugin_path)); } } } } } bist-0.5.2/src/lib_dialog.cpp0000644000175000017500000001236311653002572014425 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void lib_dialog_tree_callback(Fl_Widget* w, void* ){ lib_dialog* dia=dynamic_cast(w->window()); dia->redraw(); Fl_Tree *tree=dynamic_cast(w); Fl_Tree_Item *item=dynamic_cast(tree->callback_item()); switch (tree->callback_reason()) { case FL_TREE_REASON_SELECTED: { char selected[1024]; tree->item_pathname(selected,sizeof(selected),item); std::string actual_path= s_replace(lib_dialog::root_bra,std::string(selected), std::string(""),true); dia->_imm->reset_all(); dia->_imm->filebist(actual_path); dia->_imm->start(); dia->_imm->print_warn(); dia->_imm->print_errors(); dia->_template_file=actual_path; dia->redraw(); } default: break; } } void lib_dialog_ok_callback(Fl_Widget* w, void* ){ lib_dialog* dia=dynamic_cast(w->window()); dia->hide(); } void lib_dialog_cancel_callback(Fl_Widget* w, void* ){ lib_dialog* dia=dynamic_cast(w->window()); dia->_template_file=""; dia->hide(); } string lib_dialog::get_template_file(){ return _template_file; } lib_dialog::lib_dialog() :Fl_Double_Window(W_D,H_D,_("Insert object")), _preview(10+GAP_ELE*3+W_TREE+GAP_BOX, GAP_ELE+GAP_BOX, W_TREE*3-GAP_ELE, H_TREE*3-GAP_ELE) { string home_dir=getenv("HOME"); _preview.action(ACT_NOTHING); _imm=new immagine(true); _grp=new Fl_Scroll(10+W_TREE+GAP_ELE*2+GAP_BOX,GAP_BOX,W_TREE+GAP_ELE, H_TREE+GAP_ELE); _grp->type(Fl_Scroll::BOTH_ALWAYS); _grp->box(FL_UP_FRAME); _grp->add(_preview); _preview.add_immagine(_imm); add(_grp); _tree=new Fl_Tree(GAP_BOX+GAP_ELE, GAP_BOX+GAP_ELE, W_TREE, H_TREE); _tree->callback(lib_dialog_tree_callback); _tree->root_label(root_bra.c_str()); _tree->begin(); make_tree(home_dir + LIB_PATH_HOME ); make_tree(LIB_PATH_SHARE); _tree->end(); add(_tree); _ok = new Fl_Return_Button(w()/2-LARG_BUTTON_DEFAULT*3, h()- LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Apply")); _ok->callback(lib_dialog_ok_callback); _cancel = new Fl_Return_Button(w()/2, h()- LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT*3, LARG_BUTTON_DEFAULT, _("Cancel")); _cancel->callback(lib_dialog_cancel_callback); add(_ok); add(_cancel); end(); set_modal(); } lib_dialog::~lib_dialog(){ // cout << "Chiamato distruttore lib_dialog" << endl; delete _imm; } void lib_dialog::make_tree(string pt){ string home_dir=getenv("HOME"); DIR* direc=opendir(pt.c_str()); if(direc==NULL){ fl_alert(_("Can not open library directory %s"),pt.c_str()); return; } dirent* acc; struct stat attrb; while((acc=readdir(direc))!=NULL){ string file=pt+"/"+acc->d_name; stat(file.c_str(),&attrb); if(S_ISDIR(attrb.st_mode) && string(acc->d_name)!="." && string(acc->d_name)!=".."){ make_tree(file); }else if(S_ISREG(attrb.st_mode)){ std::vector match_ext_res; s_regmatch("bist$",file,match_ext_res,true); if(match_ext_res.size() >0){ _tree->add(file.c_str()); } } } } Fl_Scroll* lib_dialog::ritorna_scroll(){ return _grp; } immagine* lib_dialog::ritorna_immagine(){ return _imm; } mol_canvas* lib_dialog::ritorna_mol_canvas(){ return &_preview; } const string lib_dialog::home_bra=_("home"); const string lib_dialog::share_bra=_("shared"); const string lib_dialog::root_bra=_("library"); bist-0.5.2/src/cairo_t_singleton.cpp0000644000175000017500000000126711153036406016041 0ustar cagecage#include #include #include #include cairo_t* cairo_t_singleton::get_context(cairo_surface_t* surf){ if(context==NULL && surf!=NULL){ cairo_t_singleton::context=cairo_create(surf); } return cairo_t_singleton::context; } void cairo_t_singleton::free_context(){ if(cairo_t_singleton::context!=NULL){ cairo_destroy(cairo_t_singleton::context); cairo_t_singleton::context=0; } } void cairo_t_singleton::destroy(){ cairo_t_singleton::free_context(); } bool cairo_t_singleton::can_export(){ return get_context(); } cairo_t_singleton::cairo_t_singleton(){ } cairo_t* cairo_t_singleton::context=NULL; bist-0.5.2/src/2D_vector.cpp0000644000175000017500000000564211256432537014200 0ustar cagecage#include #include #include <2D_vector.hpp> std::pair bidimensional_vector::diff(std::pair a, std::pair b){ std::pair res(a.first-b.first,a.second-b.second); return res; } float bidimensional_vector::angle(std::pair a, std::pair b){ std::pair a_norm=normalize(a); std::pair b_norm=normalize(b); float dot_p=dot_product(a_norm, b_norm); float angle=acos(dot_p); if(cross_product(a,b)<0){ angle=-angle; } return angle; } float bidimensional_vector::dot_product(std::pair a, std::pair b){ return (a.first * b.first) + (a.second * b.second); } float bidimensional_vector::cross_product(std::pair a, std::pair b){ return a.first * b.second - a.second * b.first; } float bidimensional_vector::magn(std::pair a){ return sqrt(a.first * a.first + a.second * a.second); } std::pair bidimensional_vector::normalize(std::pair a){ static const float zero_thr=0.001; float mag=magn(a); std::pair res=a; if(!similar_to(mag, 0.0f, zero_thr)){ res.first/=mag; res.second/=mag; } return res; } std::pair bidimensional_vector::rotate(std::pair v, float angle){ matrix the_vec(2,1); matrix transformation(2,2); std::pair res(0,0); try{ the_vec(0,0)=v.first; the_vec(1,0)=v.second; transformation(0,0)=cos(angle); transformation(0,1)=sin(angle); transformation(1,0)=-sin(angle); transformation(1,1)=cos(angle); matrix mat_res= transformation * the_vec; res.first=mat_res(0,0); res.second=mat_res(1,0); }catch (matrix_error ex){ cerr << "exception in " << __LINE__ << " " << __FILE__ << ex.what() << endl; } return res; } std::pair bidimensional_vector::translate(std::pair v, float dx, float dy){ std::pair res(v.first + dx , v.second + dy); return res; } std::pair bidimensional_vector::scale(std::pair v, float scale_factor){ std::pair res(v.first * scale_factor , v.second * scale_factor); return res; } std::pair bidimensional_vector::project_par(std::pair v, std::pair n){ n=normalize(n); std::pair res=scale(n,dot_product(v,n)); return res; } std::pair bidimensional_vector::project_perp(std::pair v, std::pair n){ std::pair par=project_par(v,n); std::pair res=diff(v,par); return res; } void bidimensional_vector::print(std::ostream& str, std::pair v){ str << v.first << " " << v.second; } bist-0.5.2/src/legame.cpp0000644000175000017500000000366611025523004013567 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include /***********************legame******************/ legame::legame (int nw_id_atomo, int nw_id_legame ,int nw_tipo_legame, int comp_r, int comp_g, int comp_b) :_id_atomo(nw_id_atomo), _id_legame(nw_id_legame), _tipo_legame(nw_tipo_legame), _cr(comp_r), _cg(comp_g), _cb(comp_b) { } legame::~legame(){ } /** *\return true se altro ha lo stesso id di quest'istanza **/ bool legame::operator==(legame altro){ //cout << "LLLLLLLLLLEEEEEEEEE" << id_legame() << " " << altro.id_legame(); if(id_legame()==altro.id_legame()){ //cout << "uguale"<< endl; return true; }else{ //cout << "diverso"<< endl; return false; } } int legame::id_atomo(){ return _id_atomo; } int legame::id_legame(){ return _id_legame; } int legame::tipo_legame(){ return _tipo_legame; } int legame::cr(){ return _cr; } int legame::cg(){ return _cg; } int legame::cb(){ return _cb; } void legame::id_atomo(int nw){ _id_atomo=nw; } void legame::id_legame(int nw){ _id_legame=nw; } void legame::tipo_legame(int nw){ _tipo_legame=nw; } void legame::cr(int nw){ _cr=nw; } void legame::cg(int nw){ _cg=nw; } void legame::cb(int nw){ _cb=nw; } bist-0.5.2/COPYING0000644000175000017500000010451311025523004012066 0ustar cagecage GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . bist-0.5.2/pluginsrc/0000755000175000017500000000000011740261237013050 5ustar cagecagebist-0.5.2/pluginsrc/align_elements_dialog.cpp0000644000175000017500000000423211252652005020055 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0107 #include #include void align_elements_dialog_button_cb(Fl_Widget* w , void* d){ Fl_Double_Window* win=dynamic_cast(w->parent()); win->hide(); } align_elements_dialog::align_elements_dialog() :Fl_Double_Window(LARG_BUTTON_DEFAULT*3+9, LARG_BUTTON_DEFAULT+6, ""), _horiz_button(3, 3, LARG_BUTTON_DEFAULT,LARG_BUTTON_DEFAULT, "H"), _verti_button(LARG_BUTTON_DEFAULT+3, 3, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT, "V"), _circu_button(LARG_BUTTON_DEFAULT*2+3, 3, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT, "C") { labeltype(FL_NORMAL_LABEL); _horiz_button.type(FL_RADIO_BUTTON); _horiz_button.callback(align_elements_dialog_button_cb); add(_horiz_button); _verti_button.type(FL_RADIO_BUTTON); _verti_button.callback(align_elements_dialog_button_cb); add(_verti_button); _circu_button.type(FL_RADIO_BUTTON); _circu_button.callback(align_elements_dialog_button_cb); add(_circu_button); end(); set_modal(); show(); } align_elements_dialog::~align_elements_dialog(){ } align_elements_type_align align_elements_dialog::get_alignment(){ align_elements_type_align res=ALIGN_HOR; if(_horiz_button.value()){ res=ALIGN_HOR; }else if(_verti_button.value()){ res=ALIGN_VERT; }else if(_circu_button.value()){ res=ALIGN_CIRC; } return res; } bist-0.5.2/pluginsrc/attach_ring.cpp0000644000175000017500000002766411406210753016052 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include <2D_vector.hpp> #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ attach_ring::attach_ring(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(true), _has_acted(false) { } void attach_ring::inizialize(){ const char* numsize=fl_input("number of size?"); if(numsize!=NULL){ _vertices=strtol(numsize,NULL,0); }else{ _vertices=5; } } bool attach_ring::need_atom(){ return false; } bool attach_ring::need_leg(){ return false; } bool attach_ring::act(int e){ switch(e){ case FL_PUSH: { bool exists=true; _the_image->prova_click(Fl::event_x(), Fl::event_y(), exists, true); if(Fl::event_button()==FL_RIGHT_MOUSE){ attach(true); }else{ attach(false); } } break; case FL_KEYUP: switch(Fl::event_key()){ default: _has_to_act=false; break; }//end case FL_KEYUP: }//end switch(e) return _has_to_act; } attach_ring::~attach_ring(){ //std::cerr << __FUNCTION__ < > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); //vector * gruppi=r_groups(); if(eliniz!=elend){ switch((*eliniz).first){ case ATOMO: { try{ gruppo to_add=create_ring(__pref.getBond_fixedlength(), _vertices,aromatic); atomo* atm=to_add.find_atomo_id(0); std::pair type_bond_slot(LEGAME_SINGOLO,LEGAME_SINGOLO); vector::iterator fst=atm->primo_leg(); vector::iterator last=fst+1;; type_bond_slot.first=(*fst).tipo_legame(); type_bond_slot.second=(*last).tipo_legame(); to_add.trasla(-atm->pos_x(),-atm->pos_y()); gruppo* slot=_the_image->find_group_id(((*eliniz).second).first); atomo* atm_slot=slot->find_atomo_id(((*eliniz).second).second); to_add.trasla(atm_slot->pos_x(),atm_slot->pos_y()); to_add.ruota(M_PI,atm_slot->pos_x(),atm_slot->pos_y()); std::pair bisect=calc_angle(atm_slot,to_add); // std::cerr << "------\n" << bisect.first << " " // << bisect.second << std::endl; bisect.first=-bisect.first; bisect.second=-bisect.second; float rt_ang=bidimensional_vector::angle(bidimensional_vector::x_ax, bisect); //std::cerr << "rt_ang " << -rad2deg(rt_ang) << std::endl; to_add.ruota(-rt_ang,atm_slot->pos_x(),atm_slot->pos_y()); _the_image->aggiungi_gruppo(to_add); gruppo* to_attach=_the_image->find_group_id((_the_image->ritorna_ultimo_gruppo()).id()); to_attach->purge_atom(0); slot=_the_image->find_group_id(((*eliniz).second).first); atm_slot=slot->find_atomo_id(((*eliniz).second).second); _the_image->crea_legame_nuovo(atm_slot, to_attach->find_atomo_id(1), type_bond_slot.first); slot=_the_image->find_group_id(((*eliniz).second).first); atm_slot=slot->find_atomo_id(((*eliniz).second).second); atomo lst=*(slot->fin_atom()-1); _the_image->crea_legame_nuovo(atm_slot, slot->find_atomo_id(lst.id()), type_bond_slot.second); }catch(out_of_range e){ } } } } } std::pair attach_ring::calc_angle(atomo* slot, gruppo ring){ std::vector x_n; std::vector y_n; std::vector< std::pair > angles_idx_pos; std::vector< std::pair > angles_idx_neg; std::pair min_v(1,0); std::pair max_v(1,0); std::pair res(0,0); gruppo* skel=_the_image->find_group_id(slot->id_gruppo()); vector::iterator fst=slot->primo_leg(); vector::iterator lst=slot->ultimo_leg(); while(fst!=lst){ atomo* ngb=skel->find_atomo_id((*fst).id_atomo()); x_n.push_back(ngb->pos_x()- slot->pos_x()); y_n.push_back(ngb->pos_y()- slot->pos_y()); fst++; } if(x_n.size()==1){ std::pair vc(x_n[0],y_n[0]); return vc; }else{ for(unsigned int i=0;i vec(x_n[i],y_n[i]); float ang=bidimensional_vector::angle(bidimensional_vector::x_ax,vec); std::pair vc(ang,i); if(ang<=0){ angles_idx_neg.push_back(vc); }else{ angles_idx_pos.push_back(vc); } } sort_ang_idx(angles_idx_neg, false); sort_ang_idx(angles_idx_pos, false); // std::cerr << "minneg " << std::endl; // for(unsigned int i=0;i0){ max_neg=angles_idx_neg.back().second; } if(angles_idx_pos.size()>0){ min_pos=angles_idx_pos.back().second; } if(angles_idx_pos.size()>0 && angles_idx_neg.size()>0){ float bisect=calc_bisect(x_n, y_n, min_pos, max_neg); //std::cerr << "res=" <0 && angles_idx_neg.size()==0){ int max_neg=angles_idx_pos.back().second; int min_pos=angles_idx_pos[0].second; float bisect=calc_bisect(x_n, y_n, min_pos, max_neg); res=bidimensional_vector::rotate(bidimensional_vector::x_ax,bisect); }else if (angles_idx_pos.size()==0 && angles_idx_neg.size()>0){ int max_neg=angles_idx_neg.back().second; int min_pos=angles_idx_neg[0].second; float bisect=calc_bisect(x_n, y_n, min_pos, max_neg); res=bidimensional_vector::rotate(bidimensional_vector::x_ax,bisect); } return res; } } float attach_ring::calc_bisect(std::vector x_n, std::vector y_n, float min_pos, float max_neg){ float res=0; std::pair min(x_n[min_pos],y_n[min_pos]); std::pair max(x_n[max_neg],y_n[max_neg]); //std::cerr << "min_povec:" << x_n[min_pos] << "," << y_n[min_pos] << std::endl; //std::cerr << "max_negvec:" << x_n[max_neg] << "," << y_n[max_neg] << std::endl; float bisect=bidimensional_vector::angle(min,max)/2; float angle_max_neg=bidimensional_vector::angle(max, bidimensional_vector::x_ax); //std::cerr << "bisect=" << rad2deg(bisect) <M_PI/2" // << " " << angle_max_neg << " " << rad2deg(angle_max_neg) << std::endl; // bisect=angle_max_neg+bisect; // } bisect=angle_max_neg+bisect; res=bisect; return res; } void attach_ring::sort_ang_idx(std::vector< std::pair >& vc, bool asc){ if(vc.size()>0){ bool swap=true; while(swap){ swap=false; for(unsigned int i=0;i< vc.size()-1; i++){ if(asc && (vc[i].first > vc[i+1].first) ){ std::pair tmp=vc[i+1]; vc[i+1]=vc[i]; vc[i]=tmp; swap=true; }else if(!asc && (vc[i].first < vc[i+1].first) ){ std::pair tmp=vc[i+1]; vc[i+1]=vc[i]; vc[i]=tmp; swap=true; } } } } } std::string attach_ring::menu_path(){ return "rings/"; } /**************fine metodi di classe**********************************/ extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new attach_ring(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ delete j; } bist-0.5.2/pluginsrc/TREcalc/0000755000175000017500000000000011740261237014325 5ustar cagecagebist-0.5.2/pluginsrc/TREcalc/Makefile.am0000644000175000017500000000027611206030061016350 0ustar cagecageACLOCAL_AMFLAGS = -I m4 pkglib_LTLIBRARIES = TREcalc.la TREcalc_la_SOURCES = TREcalc.cpp TRE_res.cpp TREcalc.hpp TRE_res.hpp TREcalc_la_LDFLAGS = -module -avoid-version -export-dynamic bist-0.5.2/pluginsrc/TREcalc/TREcalc.hpp0000644000175000017500000000255611360326153016320 0ustar cagecage/** *if a floating number is less of this value is converted to zero */ #define TRE_TRESHOLD 1E-5 #define TRE_POLY_RAW_FORMAT 0 #define TRE_POLY_TEX_FORMAT 1 #define TRE_POLY_OOFFICE_FORMAT 2 /** *Plugin to calculatethe topological resonance energy of a non-eteroatomic molecule *see bist_plugin.hpp */ class TREcalc: public bist_plugin{ public: /** *Constructor */ TREcalc(immagine* image, string libpath); /** *Destructor */ virtual ~TREcalc(); virtual bool act(int e); virtual void register_plugin(); virtual bool time_to_act(); virtual bool need_atom(); virtual bool need_leg(); virtual string libpath(); /** *open the dialog window */ void inizialize(); /** *Scan elements of matrix and set to zero if the value is less of *TRE_TRESHOLD */ void zerify(matrix& m); virtual std::string menu_path(); protected: void calculateTRE(); vector calculate_characteristic_polynomial(matrix& adjac_matrix); matrix calculate_adjac_matrix(gruppo * group); template bool similar_to(T v, T ref, T offset); std::string format_polynomial(std::vector& coeff_vec, int format); bool _has_to_act; bool _has_acted; }; extern "C" bist_plugin* create_plugin(immagine* imm, string libpath); extern "C" void destroy_plugin(bist_plugin* j); bist-0.5.2/pluginsrc/TREcalc/TRE_res.cpp0000644000175000017500000000233611025523004016325 0ustar cagecage// generated by Fast Light User Interface Designer (fluid) version 1.0107 #include extern std::string TRE_polinomyal_characteristic_coefficients; void TRE_save_for_calculation_cb(Fl_Widget* w, void* d){ char * outf=fl_file_chooser("choose file...",NULL,NULL); if(outf!=NULL){ std::fstream outf_s(outf, std::ios::app|std::ios::out); outf_s << TRE_polinomyal_characteristic_coefficients << std::endl; outf_s.close(); } } Fl_Double_Window* make_TRE_poly_res_window() { Fl_Double_Window* w; { Fl_Double_Window* o = new Fl_Double_Window(425, 150,"TRE: results"); w = o; { Fl_Button* o =new Fl_Button(190, 5, 150, 30, "Save for calculation"); //0 o->callback(TRE_save_for_calculation_cb); } { Fl_Output* o = new Fl_Output(190, 40, 200, 30, "LaTex code"); //1 o->tooltip("String formatted fore Latex2e document"); } { Fl_Output* o = new Fl_Output(190, 75, 200, 30, "Openoffice.org code"); //2 o->tooltip("String formatted for ODT document"); } { Fl_Output* o = new Fl_Output(190, 110, 200, 30, "Characteristic polynomial"); //3 o->tooltip("Characteristic polynomial"); } o->end(); } w->set_modal(); return w; } bist-0.5.2/pluginsrc/TREcalc/m4/0000755000175000017500000000000011740261237014645 5ustar cagecagebist-0.5.2/pluginsrc/TREcalc/TRE_res.hpp0000644000175000017500000000063611166204327016345 0ustar cagecage// generated by Fast Light User Interface Designer (fluid) version 1.0107 #ifndef TRE_res_h #define TRE_res_h #include #include #include #include #include #include #include #include Fl_Double_Window* make_TRE_poly_res_window(); void TRE_save_for_calculation_cb(Fl_Widget* w, void* d); #endif bist-0.5.2/pluginsrc/TREcalc/configure.ac0000644000175000017500000000322711740111307016607 0ustar cagecagednl Autoconf requirements dnl `AC_INIT(PACKAGE, VERSION, BUG-REPORT-ADDRESS)' dnl information on the package dnl checks for programs dnl checks for libraries dnl checks for header files dnl checks for types dnl checks for structures dnl checks for compiler characteristics dnl checks for library functions dnl checks for system services dnl `AC_CONFIG_FILES([FILE...])' dnl `AC_OUTPUT' AC_INIT([bist],[0.5.2],[cage@katamail.com],[bist]) AC_CONFIG_MACRO_DIR([m4]) AC_USE_SYSTEM_EXTENSIONS AM_INIT_AUTOMAKE([-Wall foreign]) AC_SUBST([VERSION],AC_PACKAGE_VERSION) AC_SUBST([TARNAME],AC_PACKAGE_TARNAME) AC_LANG([C++]) AC_PROG_CXX([g++-4.3 g++-4.2 g++-4.1 g++ c++]) AC_PATH_PROG([SHELL],[bash]) AC_LIBTOOL_DLOPEN AC_DISABLE_STATIC AC_PROG_LIBTOOL AC_SUBST([CPPFLAGS],[$CPPFLAGS\ -I../../include\ -I.\ `fltk-config --cxxflags`]) AC_SUBST([CPPFLAGS],[$CPPFLAGS\ `pkg-config --cflags cairo`]) AC_SUBST([CPPFLAGS],[$CPPFLAGS\ `pkg-config --cflags pangocairo`]) opt=`echo "$CPPFLAGS" | grep Wall` if [[[ $opt = "" ]]]; then AC_SUBST([CPPFLAGS],[$CPPFLAGS\ -Wall]) fi AC_SUBST([LIBS],[$LIBS\ -lgsl\ -lgslcblas]) AC_MSG_CHECKING([if gsl library works]) AC_RUN_IFELSE([AC_LANG_PROGRAM([#include ], [gsl_poly_complex_workspace_alloc(2)])], [AC_SUBST([HAVE_GSL],[TRUE]) echo "it works!"], [AC_SUBST([HAVE_GSL],[FALSE]) echo "do not works!"], [AC_SUBST([HAVE_GSL],[FALSE]) echo "do not works!"]) if [[ "$HAVE_GSL" = "FALSE" ]]; then AC_MSG_ERROR([cannot find the "gnu scientific library" , please install libgsl if you want to use this plug-in!], [1]) fi AC_CONFIG_FILES([Makefile]) AC_OUTPUT bist-0.5.2/pluginsrc/TREcalc/TREcalc.cpp0000644000175000017500000004656511733641566016337 0ustar cagecage#include #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; std::string TRE_polinomyal_characteristic_coefficients; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ TREcalc::TREcalc(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(true), _has_acted(false) { } void TREcalc::inizialize(){ /** *Contiene triplette: gruppo, atomo di appartenenza e id dei legami selezionati */ vector* bonds_selected=r_legami_selected(); /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ vector< pair < int, pair > >* elem_selected=r_elem_selected(); if(bonds_selected->size()<1 && elem_selected->size()<1){ //no elem selected calculateTRE(); _has_acted=true; _has_to_act=false; return; }else{ gruppo* sel_group=0; if(bonds_selected->size()>0){ sel_group=_the_image->find_group_id(((*bonds_selected)[0])[0]); }else{ sel_group=_the_image->find_group_id( ((*elem_selected)[0]).second.first ); } //checkin for error in selection bool error_selection=false; if(bonds_selected->size()>0 && elem_selected->size()>0){ for(unsigned int i=0;isize();i++){ if(((*bonds_selected)[i])[0] != sel_group->id_gruppo()){ //user selected a bond from another molecule: abort error_selection=true; } } for(unsigned int i=0;isize();i++){ if( ((*elem_selected)[0]).second.first != sel_group->id_gruppo()){ //user selected an atom from another molecule: abort error_selection=true; } if( ((*elem_selected)[0]).second.first==NO_VALID_GROUP){ //user selected an etichetta: abort error_selection=true; } } } if(error_selection){ _has_acted=true; _has_to_act=false; return; } matrix adjac_matrix_cycle=calculate_adjac_matrix(sel_group); matrix adjac_matrix_no_bonds=calculate_adjac_matrix(sel_group); //eliminate bond std::vector::iterator beg=sel_group->iniz_atom(); std::vector::iterator end=sel_group->fin_atom(); unsigned int size_matrix=0; /* first= id in internal format second= matrix index */ std::map id_map; while(beg!=end){ pair tmp; tmp.first=beg->id(); tmp.second=size_matrix; id_map.insert(tmp); size_matrix++; beg++; } for(unsigned int i=0;isize();i++){ int group_atomo_id_start=id_map[ ((*bonds_selected)[i])[1] ]; int group_atomo_id_end=0; atomo* start=sel_group->find_atomo_id( ((*bonds_selected)[i])[1]); vector::iterator beg_leg=start->iniz_leg(); vector::iterator end_leg=start->fin_leg(); while(beg_leg!=end_leg){ if(beg_leg->id_legame()==((*bonds_selected)[i])[2]){ group_atomo_id_end=id_map[ beg_leg->id_atomo() ]; break; } beg_leg++; } adjac_matrix_no_bonds(group_atomo_id_start,group_atomo_id_end)=0; adjac_matrix_no_bonds(group_atomo_id_end,group_atomo_id_start)=0; } //cerr << "cicle \n" << adjac_matrix_cycle << std::endl; //cerr << "nobond \n" << adjac_matrix_no_bonds << std::endl; //at this point adjac_matrix_no_bonds contains the molecule //withount del bonds user have deleted, now is time to eliminate the //atoms /* first= id in internal format second= matrix index std::map id_map; *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP * vector< pair < int, pair > >* elem_selected=r_elem_selected(); */ unsigned int atom_deleted=0; for(unsigned int i=0;isize();i++){ int target_id_group=((*elem_selected)[i]).second.first; int target_id_atom=((*elem_selected)[i]).second.second; if(sel_group->id_gruppo()==target_id_group){ //matrix elim_col=result_matrix.ElimCol(id_map[target_id_atom]); //result_matrix=elim_col.ElimRow(id_map[target_id_atom]); //cerr << adjac_matrix_no_bonds.Rows() // << " eliminerei: " << id_map[target_id_atom] << std::endl; for(unsigned int row=0;row result_matrix(adjac_matrix_no_bonds.Rows()-atom_deleted, adjac_matrix_no_bonds.Cols()-atom_deleted); //cerr << "dimension : " << result_matrix.Rows() << " " // <=0){ //cerr << "row " << row << " e' maggiore di 0" << std::endl; bool allInvalid=true; for(unsigned int col=0;col=0){ //cerr << "setto " << row_target << " " << col_target // << " valore " << adjac_matrix_no_bonds(row,col)< coeff_vec_cycle=calculate_characteristic_polynomial(adjac_matrix_cycle); std::vector coeff_vec_results=calculate_characteristic_polynomial(result_matrix); //cerr << "cyclic: " << format_polynomial(coeff_vec_cycle,TRE_POLY_OOFFICE_FORMAT) // << std::endl; for(unsigned int i=0;i< coeff_vec_results.size(); i++){ ostringstream outs; outs << coeff_vec_results[i] << " "; TRE_polinomyal_characteristic_coefficients+=outs.str(); //cerr << "#" << coeff_vec_results[i] << std::endl; } //cerr << "no cyclic: " << format_polynomial(coeff_vec_results,TRE_POLY_OOFFICE_FORMAT) // << std::endl; _the_image->elimina_elem_selected(); _the_image->elimina_legami_selected(); Fl_Double_Window* w=make_TRE_poly_res_window(); Fl_Output* tex_out=dynamic_cast(w->child(1)); tex_out->value(format_polynomial(coeff_vec_results,TRE_POLY_TEX_FORMAT).c_str()); Fl_Output* odt_out=dynamic_cast(w->child(2)); odt_out->value(format_polynomial(coeff_vec_results,TRE_POLY_OOFFICE_FORMAT).c_str()); Fl_Output* raw_out=dynamic_cast(w->child(3)); raw_out->value(format_polynomial(coeff_vec_results,TRE_POLY_RAW_FORMAT).c_str()); w->show(); _has_acted=true; _has_to_act=false; } } bool TREcalc::need_atom(){ return false; } bool TREcalc::need_leg(){ return false; } bool TREcalc::act(int e){ return _has_to_act; } TREcalc::~TREcalc(){ cout << "TREcalc distruzione!!! " << _the_image <& m){ for(unsigned int i=0;i -TRE_TRESHOLD){ m(i,j)=0; } } } } matrix TREcalc::calculate_adjac_matrix(gruppo* group){ matrix res; std::vector::iterator beg=group->iniz_atom(); std::vector::iterator end=group->fin_atom(); unsigned int size_matrix=0; /* first= id in internal format second= matrix index */ std::map id_map; while(beg!=end){ pair tmp; tmp.first=beg->id(); tmp.second=size_matrix; id_map.insert(tmp); size_matrix++; beg++; } if(size_matrix==0){ //no atom in group return res; } matrix adjac_matrix(size_matrix,size_matrix); adjac_matrix.Null(); beg=group->iniz_atom(); end=group->fin_atom(); while(beg!=end){ vector::iterator in_leg=beg->iniz_leg(); vector::iterator fin_leg=beg->fin_leg(); while(in_leg!=fin_leg){ int matr_index_me=id_map[beg->id()]; int matr_index_bonded=id_map[in_leg->id_atomo()]; adjac_matrix(matr_index_me,matr_index_bonded)=1; in_leg++; } beg++; } res=adjac_matrix; return res; } vector TREcalc::calculate_characteristic_polynomial(matrix& adjac_matrix){ matrix identity(adjac_matrix.RowNo(),adjac_matrix.RowNo()); identity.Null(); for(unsigned int i=0;i A1=adjac_matrix; double n=1; double coeff=1; bool stop=false; std::vector coeff_vec; coeff_vec.push_back(1); while(true){ //cerr << "inizio ciclo ---- " << std::endl; zerify(A1); //std::cerr << "A1=\n" << A1 << std::endl; coeff = (1/n)*A1.Trace(); if(coeff <= TRE_TRESHOLD && coeff > -TRE_TRESHOLD){ coeff=0; } if(stop){ //cerr << "fine calcolo " << std::endl; break; } //std::cerr << "coeff " << -coeff << std::endl; coeff_vec.push_back(-coeff); matrix B1 = A1 - (coeff * identity); zerify(B1); stop=true; for(unsigned int i=0;i= -TRE_TRESHOLD)){ stop=false; } } } //std::cerr << "B1=\n" << B1 << std::endl; matrix A2 = adjac_matrix*B1; zerify(A2); //std::cerr << "A2=\n" << A2 << std::endl; if(coeff <= TRE_TRESHOLD && coeff >= -TRE_TRESHOLD){ coeff=0; } A1=A2; //std::cerr << "fine cclo " << std::endl; n++; } return coeff_vec; } void TREcalc::calculateTRE(){ char * inf_name=fl_file_chooser("pick TRE calculation file...",NULL,NULL); std::vector the_vectors; std::vector cyclic_polynomial_vec; if(inf_name!=NULL){ fstream inf(inf_name,ios::in); //get first polinomian (non aciclic) string line; string delim(" "); getline(inf,line); string_tokenizer tok(line,delim); while(!tok){ std::string coeff_str=tok.next_token(); double coeff=strtod(coeff_str.c_str(),NULL); cyclic_polynomial_vec.push_back(coeff); } double* coeff_cyclic_polinomial=new double[cyclic_polynomial_vec.size()]; double* coeff_acyclic_polinomial=new double[cyclic_polynomial_vec.size()]; std::copy(cyclic_polynomial_vec.begin(), cyclic_polynomial_vec.end(), coeff_cyclic_polinomial); /* for(unsigned int i=0;i(j)>=0;j--){ cyclic_reverse_coeff[(cyclic_polynomial_vec.size()-1)-j]=cyclic_polynomial_vec[j]; } double* zeroes=new double[(cyclic_polynomial_vec.size()-1)*2]; /* for(unsigned int i=0;i cyclic_zeroes; for (unsigned int i = 0; i < (cyclic_polynomial_vec.size()-1)*2; i+=2){ cyclic_zeroes.push_back(zeroes[i]); } std::sort(cyclic_zeroes.begin(),cyclic_zeroes.end()); std::reverse(cyclic_zeroes.begin(),cyclic_zeroes.end()); for (unsigned int i = 0; i < cyclic_zeroes.size(); i++){ std::cerr << "zeroes cyclic: " << cyclic_zeroes[i] << std::endl; } //root of acyclic for(unsigned int j=cyclic_polynomial_vec.size()-1;static_cast(j)>=0;j--){ acyclic_reverse_coeff[(cyclic_polynomial_vec.size()-1)-j]=coeff_acyclic_polinomial[j]; } w = gsl_poly_complex_workspace_alloc (cyclic_polynomial_vec.size()); gsl_poly_complex_solve (acyclic_reverse_coeff, cyclic_polynomial_vec.size(), w, zeroes); gsl_poly_complex_workspace_free (w); std::vector acyclic_zeroes; for (unsigned int i = 0; i < (cyclic_polynomial_vec.size()-1)*2; i+=2){ acyclic_zeroes.push_back(zeroes[i]); } std::sort(acyclic_zeroes.begin(),acyclic_zeroes.end()); std::reverse(acyclic_zeroes.begin(),acyclic_zeroes.end()); for (unsigned int i = 0; i < cyclic_zeroes.size(); i++){ std::cerr << "zeroes acyclic: " << acyclic_zeroes[i] << std::endl; } //free memory delete [] acyclic_reverse_coeff; delete [] cyclic_reverse_coeff; delete [] zeroes; delete [] coeff_cyclic_polinomial; delete [] coeff_acyclic_polinomial; for(unsigned int i=0;i(cyclic_zeroes.size())){ int num_pair=num_el_pi/2; double E_cyclic=0; double E_acyclic=0; int index_cyclic=0; int index_acyclic=0; for( ;index_cyclic& coeff_vec, int format){ //coeff[0]*x^N-1 ... std::string raw_pol=""; for(unsigned int i=0;i0){ outs << "+"; } outs << coeff_vec[i]; } if(i!=coeff_vec.size()-1){ outs << "x" << "^"; switch(format){ case TRE_POLY_TEX_FORMAT: outs << "{" << (coeff_vec.size()-1) - i << "}"; break; case TRE_POLY_OOFFICE_FORMAT: outs << "{" << (coeff_vec.size()-1) - i << "}"; break; default: outs << (coeff_vec.size()-1) - i; } } raw_pol+= outs.str(); } } return raw_pol; } template bool TREcalc::similar_to(T v, T ref, T offset){ bool res=false; if( (v >= ref - offset) && (v <= ref + offset) ){ res=!res; } return res; } std::string TREcalc::menu_path(){ return "calculation/"; } /**************fine metodi di classe**********************************/ extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new TREcalc(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ cout << "distruzione plugin: " << j << endl; delete j; cout << "riuscita" << endl; } bist-0.5.2/pluginsrc/wrap_bracket_dialog.cxx0000644000175000017500000000365711206260417017566 0ustar cagecage// generated by Fast Light User Interface Designer (fluid) version 1.0107 #include #include #include /* #define WRAP_BRACKET_PARENTHESES 0 #define WRAP_BRACKET_BOX 1 */ void wrap_molecule_dialog_cb(Fl_Widget* w, void* d){ Fl_Double_Window* win=dynamic_cast(w->parent()); win->hide(); } int make_wrap_molecule_dialog(bool& merge, bool& free_wrap) { Fl_Menu_Item the_menu_item[] = { {"parentheses", 0, 0, reinterpret_cast(WRAP_BRACKET_PARENTHESES)}, {"box bracket", 0, 0, reinterpret_cast(WRAP_BRACKET_BOX)}, {"braces",0, 0, reinterpret_cast(WRAP_BRACKET_CURLY)}, {0} }; Fl_Double_Window* w=new Fl_Double_Window(300, 120, "Wrap in bracket"); w->box(FL_ENGRAVED_BOX); int menu_w=LARG_BUTTON_DEFAULT*3; Fl_Menu_Button* menb=new Fl_Menu_Button(w->w()/2-menu_w/2, 5, menu_w, LARG_BUTTON_DEFAULT, "Type"); menb->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); menb->copy(the_menu_item); Fl_Check_Button* merge_chk=new Fl_Check_Button(2,LARG_BUTTON_DEFAULT, menu_w, LARG_BUTTON_DEFAULT, "merge with molecule"); Fl_Check_Button* free_wrap_chk=new Fl_Check_Button(2,LARG_BUTTON_DEFAULT*2, menu_w, LARG_BUTTON_DEFAULT, "free wrapping"); Fl_Button* ok=new Fl_Button(w->w()/2 - 105/2, w->h() - 30, 105, 25, "OK"); ok->callback(wrap_molecule_dialog_cb); w->add(menb); w->add(merge_chk); w->add(free_wrap_chk); w->add(ok); w->end(); w->set_modal(); w->show(); while(w->shown()){ Fl::wait(); } merge=merge_chk->value(); free_wrap=free_wrap_chk->value(); const Fl_Menu_Item* the_type=menb->mvalue(); WRAP_BRACKET_SIZE_USER_DATA_MENU type_br=reinterpret_cast(the_type->user_data()); return type_br; } bist-0.5.2/pluginsrc/align_elements.cpp0000644000175000017500000005145011653002572016545 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include <2D_vector.hpp> #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; align_elements::align_elements(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(true), _has_acted(false) { } void align_elements::inizialize(){ align_elements_dialog dialog_ch; while(dialog_ch.shown()){ Fl::wait(); } //std::cerr << "settato:" << dialog_ch.get_alignment_h()<< std::endl; align_elements_type_align horiz_align=dialog_ch.get_alignment(); switch(horiz_align){ case ALIGN_HOR: align_hor_vert(true); break; case ALIGN_VERT: align_hor_vert(false); break; case ALIGN_CIRC: bool add_arrow=fl_choice("Add arrows?", "No", "Yes", NULL); align_circ(true, add_arrow); break; } _has_to_act=false; } void align_elements::align_circ(bool clockwise, bool add_arrow){ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); float max_radius_w=-1; float max_radius_h=-1; float elem_size=0; std::map group_added; float x_start=0; float y_start=0; float w_start=0; float h_start=0; float center_x=0; float center_y=0; bool is_first=true; if(eliniz!=elend){ while(eliniz!=elend){ switch((*eliniz).first){ case ATOMO: { if(group_added.count(((*eliniz).second).first)==0){ gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); if(max_radius_w < the_grp->phys_w()){ max_radius_w=the_grp->phys_w(); } if(max_radius_h < the_grp->phys_h()){ max_radius_h=the_grp->phys_h(); } group_added.insert(std::pair((*eliniz).second.first,true)); elem_size++; if(is_first){ x_start=the_grp->phys_posx(); y_start=the_grp->phys_posy(); w_start=the_grp->phys_w(); h_start=the_grp->phys_h(); } } break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz).second).second); if(max_radius_w < proc->phys_w()){ max_radius_w=proc->phys_w(); } if(max_radius_h < proc->phys_h()){ max_radius_h=proc->phys_h(); } elem_size++; if(is_first){ std::pair lu; std::pair rd; proc->get_phys_bounding_box(lu,rd); x_start=lu.first; y_start=lu.second; w_start=rd.first - lu.first; h_start=rd.second - lu.second; } break; } case ETICHETTA: { etichetta* laet=_the_image->ritorna_etich_pointer(((*eliniz).second).second); if(max_radius_w < laet->phys_w()){ max_radius_w=laet->phys_w(); } if(max_radius_h < laet->phys_h()){ max_radius_h=laet->phys_h(); } elem_size++; if(is_first){ x_start=laet->phys_x(); y_start=laet->phys_y(); w_start=laet->phys_w(); h_start=laet->phys_h(); } break; } } is_first=false; eliniz++; } float radius=max_radius_h + max_radius_w; center_x=x_start + w_start/2 - radius; center_y=y_start + h_start/2; float angle_step=2*M_PI / elem_size; float angle_start=0; float angle=angle_start; is_first=true; group_added.clear(); eliniz=elem->begin(); elend=elem->end(); while(eliniz!=elend){ float nwx=radius * cos(angle); float nwy=radius * sin(angle); switch((*eliniz).first){ case ATOMO: { if(group_added.count(((*eliniz).second).first)==0){ gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); the_grp->phys_translate(-the_grp->phys_posx() - the_grp->phys_w()/2, -the_grp->phys_posy() - the_grp->phys_h()/2); the_grp->phys_translate(center_x+nwx,center_y+nwy); group_added.insert(std::pair((*eliniz).second.first,true)); angle+=angle_step; } break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz).second).second); std::pair lu; std::pair rd; proc->get_bounding_box(lu,rd); float w=rd.first - lu.first; float h=rd.second - lu.second; the_grp->phys_translate(-lu.first - w/2, -lu.second - h/2); the_grp->phys_translate(center_x+nwx,center_y+nwy); angle+=angle_step; break; } case ETICHETTA: { etichetta* labl=_the_image->ritorna_etich_pointer(((*eliniz).second).second); labl->phys_translate(-labl->phys_x() - labl->phys_w()/2, -labl->phys_y() - labl->phys_h()/2); labl->phys_translate(center_x+nwx,center_y+nwy); angle+=angle_step; break; } } eliniz++; } while(bb_intersect()){ scale_circle(center_x, center_y,radius); } float nw_rad=get_new_radius(center_x, elem->begin()); if(add_arrow){ patch_w_arrows(center_x,center_y,nw_rad); } } } void align_elements::patch_w_arrows(float center_x, float center_y, float nw_rad){ static const float incr_ang=0.01; std::pair start_p(0,0); std::pair end_p(0,0); bool inside=true; bool start_arr=true; bool end_arr=false; gruppo new_group; float x_bb=0; float y_bb=0; float w_bb=0; float h_bb=0; int count_el=0; vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); for(float angl=0 ;angl<=2*M_PI; angl+=incr_ang){ float x_curr=nw_rad*cos(angl) + center_x; float y_curr=nw_rad*sin(angl) + center_y; vector< pair < int, pair > >::iterator eliniz_curr=eliniz + (count_el % elem->size()); switch((*(eliniz_curr)).first){ case ATOMO: { gruppo* the_grp=_the_image->find_group_id(((*eliniz_curr).second).first); x_bb=the_grp->phys_posx(); y_bb=the_grp->phys_posy(); w_bb=the_grp->phys_w(); h_bb=the_grp->phys_h(); break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz_curr).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz_curr).second).second); std::pair lu; std::pair rd; proc->get_bounding_box(lu,rd); x_bb=lu.first; y_bb=lu.second; w_bb=rd.first - lu.first; h_bb=rd.second - lu.second; break; } case ETICHETTA: { etichetta* labl=_the_image->ritorna_etich_pointer(((*eliniz_curr).second).second); x_bb=labl->phys_x(); y_bb=labl->phys_y(); w_bb=labl->phys_w(); h_bb=labl->phys_h(); break; } } if((x_curr > x_bb && //inside x_curr < x_bb + w_bb && y_curr > y_bb && y_curr < y_bb + h_bb) ){ if(inside){ continue; }else{ if(end_arr){ end_p.first=x_curr - center_x; end_p.second=y_curr - center_y; end_arr=false; start_arr=true; inside=true; float ang1=bidimensional_vector::angle(start_p,bidimensional_vector::x_ax); float ang2=bidimensional_vector::angle(end_p ,bidimensional_vector::x_ax); proc_bezier* nwp=NULL; if(ang1 * ang2 < 0){ float min_a=std::min(ang1,ang2); float max_a=std::max(ang1,ang2); ang1=min_a + M_PI; ang2=max_a - M_PI; nwp=add_bezier_along_circle(&new_group, center_x, center_y, nw_rad , ang1, ang2); nwp->ruota(center_x, center_y,-M_PI); }else{ nwp=add_bezier_along_circle(&new_group, center_x, center_y, nw_rad , ang1, ang2); } nwp->cr(0); nwp->cg(0); nwp->cb(0); nwp->spessore(1); nwp->dash(0); nwp->punte(ARR_ETEROL_PUNT); nwp->arr_w(__pref.get_arr_w()); nwp->arr_h(__pref.get_arr_h()); nwp->arr_gap(__pref.get_arr_gap()); } } }else{ //outside if(start_arr){ start_p.first=x_curr - center_x; start_p.second=y_curr - center_y; start_arr=false; end_arr=true; inside=false; count_el++; } } } _the_image->aggiungi_gruppo(new_group); } float align_elements::get_new_radius(float center_x, vector< pair < int, pair > >::iterator eliniz){ float res=0; switch((*eliniz).first){ case ATOMO: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); res= the_grp->phys_posx() + the_grp->phys_w()/2.0 - center_x; break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz).second).second); std::pair lu; std::pair rd; proc->get_bounding_box(lu,rd); float w=rd.first - lu.first; res= lu.first + w/2.0 - center_x; break; } case ETICHETTA: { etichetta* labl=_the_image->ritorna_etich_pointer(((*eliniz).second).second); res= labl->phys_x() + labl->phys_w()/2.0 - center_x; break; } } return res; } void align_elements::align_hor_vert(bool horiz_align){ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); float x_align=0; float y_align=0; float height=0; float width=0; if(eliniz!=elend){ switch((*eliniz).first){ case ATOMO: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); x_align=the_grp->posx(); y_align=the_grp->posy(); height=the_grp->h(); width=the_grp->w(); break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz).second).second); x_align=proc->posx(); y_align=proc->posy(); height=proc->h(); width=proc->w(); break; } case ETICHETTA: { etichetta* labl=_the_image->ritorna_etich_pointer(((*eliniz).second).second); x_align=labl->x(); y_align=labl->y(); height=labl->h(); width=labl->w(); break; } } eliniz++; while(eliniz!=elend){ switch((*eliniz).first){ case ATOMO: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); float nwy= y_align - the_grp->posy() + height/2.0 - the_grp->h()/2.0 ; float nwx= x_align - the_grp->posx() + width/2.0 - the_grp->w()/2.0 ; if(horiz_align){ nwx=0; }else{ nwy=0; } the_grp->trasla(nwx,nwy); break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz).second).second); float nwy= y_align - proc->posy() + height/2.0 - proc->h()/2.0; float nwx= x_align - proc->posx() + width/2.0 - proc->w()/2.0 ; if(horiz_align){ nwx=0; }else{ nwy=0; } proc->trasla(nwx,nwy); break; } case ETICHETTA: { etichetta* labl=_the_image->ritorna_etich_pointer(((*eliniz).second).second); float nwy= y_align - labl->y() + height/2.0 - labl->h()/2.0; float nwx= x_align - labl->x() + width/2.0 - labl->w()/2.0; if(horiz_align){ nwx=0; }else{ nwy=0; } labl->trasla(nwx,nwy); break; } } eliniz++; } } } bool align_elements::need_atom(){ return false; } bool align_elements::need_leg(){ return false; } bool align_elements::act(int e){ return _has_to_act; } align_elements::~align_elements(){ cout << "align horiz distruzione!!! " << _the_image < labls=get_all_etich_as_vector(); std::vector groups=get_all_molecule_as_vector(); std::vector procs=get_all_proc_as_vector(); std::vector< std::pair < std::pair , std::pair > > all_bb; for(unsigned int i=0;i lu(labls[i]->phys_x(), labls[i]->phys_y()); std::pair rd(labls[i]->phys_x()+ labls[i]->phys_w(), labls[i]->phys_y()+ labls[i]->phys_h()); std::pair < std::pair , std::pair > bb(lu,rd); all_bb.push_back(bb); } for(unsigned int i=0;i lu(groups[i]->phys_posx(), groups[i]->phys_posy()); std::pair rd(groups[i]->phys_posx()+ groups[i]->phys_w(), groups[i]->phys_posy()+ groups[i]->phys_h()); std::pair < std::pair , std::pair > bb(lu,rd); all_bb.push_back(bb); } for(unsigned int i=0;i lu; std::pair rd; procs[i]->get_bounding_box(lu,rd); std::pair < std::pair , std::pair > bb(lu,rd); all_bb.push_back(bb); } for(unsigned int i=0;i lu1(all_bb[i].first.first, all_bb[i].first.second); std::pair rd1(all_bb[i].second.first, all_bb[i].second.second); std::pair lu2(all_bb[j].first.first, all_bb[j].first.second); std::pair rd2(all_bb[j].second.first, all_bb[j].second.second); if(lu1.first>0 && lu1.second>0 && i!=j){ if(calc_bb_gen_intersect(lu1,rd1,lu2,rd2)){ res=true; } } } } return res; } void align_elements::scale_circle(float center_x, float center_y, float radius){ // static float scale_f=1; vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); std::map group_added; if(eliniz!=elend){ while(eliniz!=elend){ switch((*eliniz).first){ case ATOMO: { if(group_added.count(((*eliniz).second).first)==0){ gruppo* grp=_the_image->find_group_id(((*eliniz).second).first); atomo* start=grp->find_atomo_id(0); if(start!=NULL){ std::pair* data_grp=new std::pair(); (*data_grp).first=(grp->phys_posx() + grp->phys_w()/2.0); (*data_grp).second=(grp->phys_posy() + grp->phys_h()/2.0); grp->generic_depth_search_appl_popped(start, static_cast(¢er_x), static_cast(¢er_y), static_cast(data_grp), scale_circle_atom); delete data_grp; } group_added.insert(std::pair((*eliniz).second.first,true)); } break; } case PROC_BEZIER: case PROC_ARC: case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*eliniz).second).first); procedura* proc=the_grp->find_proc_id(((*eliniz).second).second); /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ scale_circle_proc(proc , center_x, center_y); break; } case ETICHETTA: { etichetta* labl=_the_image->ritorna_etich_pointer(((*eliniz).second).second); scale_circle_etichetta(labl , center_x, center_y); break; } } eliniz++; } } } void align_elements::scale_circle_proc(procedura* proc , float center_x, float center_y){ std::pair lu; std::pair rd; proc->get_bounding_box(lu,rd); std::pair v(lu.first + ((rd.first - lu.first)/2.0), lu.second + ((rd.second - lu.second)/2.0)); std::pair c(center_x,center_y); v=bidimensional_vector::diff(c,v); v.first=-v.first; v.second=-v.second; v=bidimensional_vector::normalize(v); proc->phys_translate(-center_x,-center_y); proc->phys_translate(v.first,v.second); proc->phys_translate(center_x,center_y); } void align_elements::scale_circle_etichetta(etichetta* labl , float center_x, float center_y){ std::pair v(labl->phys_x() + labl->phys_w()/2.0, labl->phys_y() + labl->phys_h()/2.0); std::pair c(center_x,center_y); v=bidimensional_vector::diff(c,v); v.first=-v.first; v.second=-v.second; v=bidimensional_vector::normalize(v); labl->phys_translate(-center_x,-center_y); labl->phys_translate(v.first,v.second); labl->phys_translate(center_x,center_y); } /************************************************/ int scale_circle_atom(atomo* from , void* data, void* data2, void* data3){ float* center_x=static_cast(data); float* center_y=static_cast(data2); std::pair* data_grp=static_cast< std::pair* >(data3); std::pair v=*data_grp; std::pair c(*center_x,*center_y); v=bidimensional_vector::diff(c,v); v.first=-v.first; v.second=-v.second; v=bidimensional_vector::normalize(v); from->phys_translate(-(*center_x),-(*center_y)); from->phys_translate(v.first,v.second); from->phys_translate(*center_x,*center_y); return 1; } std::string align_elements::menu_path(){ return "align and distribuite/"; } extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new align_elements(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ delete j; } bist-0.5.2/pluginsrc/wrap_in_bracket.cpp0000644000175000017500000004063511406210753016712 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ wrap_in_bracket::wrap_in_bracket(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(false), _has_acted(false), _merge(false), _free_wrap(false), _type(WRAP_BRACKET_BOX) { } void wrap_in_bracket::inizialize(){ _type=make_wrap_molecule_dialog(_merge,_free_wrap); if(!_free_wrap){ _has_to_act=true; } } bool wrap_in_bracket::need_atom(){ return false; } bool wrap_in_bracket::need_leg(){ return false; } bool wrap_in_bracket::act(int e){ /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ if(!_has_acted && _has_to_act){ if(_free_wrap){ switch(e){ case FL_PUSH: { if(_box.size()<1){ std::pair bb(Fl::event_x(),Fl::event_y()); _box.push_back(bb); _has_acted=false; _has_to_act=true; }else{ int dx=(MainWindow->ritorna_mol_canvas())->x(); int dy=(MainWindow->ritorna_mol_canvas())->y(); std::pair bb(Fl::event_x(),Fl::event_y()); _box.push_back(bb); float w=_box[1].first - _box[0].first; float h=_box[1].second - _box[0].second; switch (_type){ case WRAP_BRACKET_BOX: insert_box_bra(NULL,_box[0].first-dx ,_box[0].second-dy,w,h); break; case WRAP_BRACKET_PARENTHESES: insert_parent_bra(NULL,_box[0].first-dx,_box[0].second-dy,w,h); break; case WRAP_BRACKET_CURLY: insert_curly_bra(NULL,_box[0].first-dx,_box[0].second-dy,w,h); break; } _has_to_act=true; _has_acted=true; } } } }else{ vector< pair < int, pair > >* elem=r_elem_selected(); if(elem->size()>0){ float lx=1E9; float ly=1E9; float rx=-1E9; float ry=-1E9; float w=-1; float h=-1; vector< pair < int, pair > >::iterator el_b=elem->begin(); vector< pair < int, pair > >::iterator el_e=elem->end(); while(el_b!=el_e){ float tmp_px=1E9; float tmp_py=1E9; float tmp_w=-1E9; float tmp_h=-1E9; switch((*el_b).first){ case ATOMO: { gruppo* the_grp=_the_image->find_group_id(((*el_b).second).first); tmp_px=the_grp->phys_posx(); tmp_py=the_grp->phys_posy(); tmp_w=the_grp->phys_w(); tmp_h=the_grp->phys_h(); } break; case PROC_BEZIER: case PROC_ARC: { gruppo* the_grp=_the_image->find_group_id(((*el_b).second).first); procedura* proc=the_grp->find_proc_id(((*el_b).second).second); tmp_px=proc->phys_posx(); tmp_py=proc->phys_posy(); tmp_w=proc->phys_w(); tmp_h=proc->phys_h(); } break; case PROC_ARROW: { gruppo* the_grp=_the_image->find_group_id(((*el_b).second).first); proc_arrow* proc=dynamic_cast(the_grp->find_proc_id(((*el_b).second).second)); std::pair ld; std::pair ru; proc->get_phys_bounding_box(ld,ru); tmp_w=ru.first - ld.first; tmp_h=ru.second - ld.second; tmp_px=ld.first; tmp_py=ld.second; /* float b_px=proc->phys_posx(); float b_py=proc->phys_posy(); float e_px=proc->phys_eposx(); float e_py=proc->phys_eposy(); if(b_px < e_px){ tmp_px=b_px; }else{ tmp_px=e_px; } if(b_py < e_py){ tmp_py=b_py; }else{ tmp_py=e_py; } tmp_w=abs(proc->phys_w()); tmp_h=abs(proc->phys_h()); */ } break; case ETICHETTA: { etichetta* laet=_the_image->ritorna_etich(((*el_b).second).second); tmp_px=laet->phys_x(); tmp_py=laet->phys_y(); tmp_w=laet->phys_w(); tmp_h=laet->phys_h(); } break; } if(tmp_px < lx){ lx=tmp_px; } if(tmp_w + tmp_px > rx){ rx=tmp_w + tmp_px; } if(tmp_py < ly){ ly=tmp_py; } if(tmp_h + tmp_py > ry){ ry=tmp_h + tmp_py; } el_b++; } w=rx-lx; h=ry-ly; gruppo* add_to_this=NULL; if(_merge){ vector * the_groups=r_groups(); for(unsigned int i=0;isize();i++){ if( (*the_groups)[i].id_gruppo() == ((*elem)[0].second).first){ add_to_this=&((*the_groups)[i]); } } } switch (_type){ case WRAP_BRACKET_BOX: insert_box_bra(add_to_this,lx,ly,w,h); break; case WRAP_BRACKET_PARENTHESES: insert_parent_bra(add_to_this,lx,ly,w,h); break; case WRAP_BRACKET_CURLY: insert_curly_bra(add_to_this,lx,ly,w,h); break; } } _has_to_act=false; _has_acted=true; } } return _has_acted; } wrap_in_bracket::~wrap_in_bracket(){ // cout << "wrap_in_bracket distruzione!!! " << _the_image <aggiungi_procedura(&hor); to_add->aggiungi_procedura(&ver); to_add->aggiungi_procedura(&hor2); to_add->aggiungi_procedura(&hor_m); to_add->aggiungi_procedura(&ver_m); to_add->aggiungi_procedura(&hor2_m); } if(the_group==NULL){ _the_image->aggiungi_gruppo(*to_add); delete to_add; } } void wrap_in_bracket::insert_parent_bra(gruppo* the_group, float px,float py, float w,float h){ float arr_w=__pref.get_arr_w(); float arr_h=__pref.get_arr_h(); float arr_gap=__pref.get_arr_gap(); //float h_line_width=w/10; float offset=__pref.getBond_fixedlength()/3.; float depth=h/5; if(h<__pref.getBond_fixedlength()){ if(!similar_to(h,static_cast(0),static_cast(0.1))){ depth=h/2; }else{ depth=h/4; } } int num_bez=1+(h/__pref.getBond_fixedlength()); int off_bez_thick=0; int off_bez_thick_incr=1; gruppo* to_add=NULL; if(the_group==NULL){ to_add=new gruppo(); }else{ to_add=the_group; } for(int i=0;iaggiungi_procedura(&par1); to_add->aggiungi_procedura(&par2); } if(the_group==NULL){ _the_image->aggiungi_gruppo(*to_add); delete to_add; } } void wrap_in_bracket::insert_curly_bra(gruppo* the_group, float px,float py, float w,float h){ float arr_w=__pref.get_arr_w(); float arr_h=__pref.get_arr_h(); float arr_gap=__pref.get_arr_gap(); float offset=__pref.getBond_fixedlength()/3.; float depth=h/5; if(h<__pref.getBond_fixedlength()){ if(!similar_to(h,static_cast(0),static_cast(0.1))){ depth=h/2; }else{ depth=5; } } float thikness_slope=0.2f; float thikness_thr=(21*h)/(160+h); gruppo* to_add=NULL; if(the_group==NULL){ to_add=new gruppo(); }else{ to_add=the_group; } for(float dyn_offset=0;dyn_offsetaggiungi_procedura(&sig1); to_add->aggiungi_procedura(&sig2); to_add->aggiungi_procedura(&sig3); to_add->aggiungi_procedura(&sig4); } if(the_group==NULL){ _the_image->aggiungi_gruppo(*to_add); delete to_add; } } /**************fine metodi di classe**********************************/ extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new wrap_in_bracket(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ //cout << "distruzione plugin: " << j << endl; delete j; //cout << "riuscita" << endl; } bist-0.5.2/pluginsrc/enumerate_atoms.cpp0000644000175000017500000001760511406210753016751 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ const int enumerate_atoms_etich_entry::max_pos=8; enumerate_atoms::enumerate_atoms(immagine* image,string libpath) :bist_plugin(image,libpath), _curr_num(0), _has_to_act(true), _has_acted(false) { } void enumerate_atoms::inizialize(){ editor* ed=dynamic_cast(MainWindow); ed->canvas_give_focus(); const char* startnum=fl_input("Start number?"); if(startnum!=NULL){ _curr_num=strtol(startnum,NULL,0); }else{ _curr_num=1; } } bool enumerate_atoms::need_atom(){ return false; } bool enumerate_atoms::need_leg(){ return false; } bool enumerate_atoms::act(int e){ switch(e){ case FL_PUSH: { if(Fl::event_button()==FL_RIGHT_MOUSE){ bool exists; _the_image->check_click_etichetta(Fl::event_x(), Fl::event_y(), exists, true); /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); while(eliniz!=elend){ switch((*eliniz).first){ case ETICHETTA: update_pos(_the_image->ritorna_punt_etich( (*eliniz).second.second )); } eliniz++; } }else{ bool exists=true; _the_image->prova_click(Fl::event_x(), Fl::event_y(), exists, true); enumerate(); } } break; case FL_KEYDOWN: switch(Fl::event_key()){ case ' ': { editor* ed=dynamic_cast(MainWindow); update_pos(_added.back()._et); ed->redraw(); ed->canvas_give_focus(); } break; case FL_Enter: default: _has_to_act=false; break; }//end case FL_KEYDOWN: }//end switch(e) return _has_to_act; } enumerate_atoms::~enumerate_atoms(){ } void enumerate_atoms::register_plugin(){ } bool enumerate_atoms::time_to_act(){ return _has_to_act; } string enumerate_atoms::libpath(){ return _lib; } void enumerate_atoms::enumerate(){ /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ vector< pair < int, pair > >* elem=r_elem_selected(); vector< pair < int, pair > >::iterator eliniz=elem->begin(); vector< pair < int, pair > >::iterator elend=elem->end(); vector * gruppi=r_groups(); while(eliniz!=elend){ switch((*eliniz).first){ case ATOMO: float x=0; float y=0; float dim_atm=8; enumerate_atoms_etich_entry ent; for(unsigned int ct=0;ctsize();ct++){ if((*gruppi)[ct].id_gruppo()==((*eliniz).second).first){ atomo* atm=(*gruppi)[ct].find_atomo_id((*eliniz).second.second); etichetta* lb=atm->etich_punt(); x=atm->pos_x(); y=atm->pos_y(); ent._x=atm->pos_x(); ent._y=atm->pos_y(); if(lb->to_raw_string()==std::string(NO_ETIC)){ ent._w=0; ent._h=0; }else{ ent._w=lb->phys_w(); ent._h=lb->phys_h(); dim_atm=lb->dim()/2; } break; } } paragraph_text* ch=new paragraph_text(); std::ostringstream ost; ost << _curr_num; ch->dim(dim_atm); ch->insert_string_in_curr_pos(ost.str(),ET_STR); ch->interline_space(0); ch->trasla(x+ent._w/2,y-ch->h()-ent._h/2); ent._et=ch; ent._last_pos=0; _added.push_back(ent); _the_image->aggiungi_etich(ch); _curr_num++; } eliniz++; } _the_image->elimina_elem_selected(); } void enumerate_atoms::update_pos(etichetta* en){ for(unsigned int i=0;i<_added.size();i++){ if(_added[i]._et==en){ etichetta* tr=_added[i]._et; switch(_added[i]._last_pos){ case 0: tr->trasla(0, tr->h()/2 + _added[i]._h/2); break; case 1: tr->trasla(0, tr->h()/2 + _added[i]._h/2); break; case 2: tr->trasla(-tr->w()/2 -_added[i]._w/2, 0); break; case 3: tr->trasla(-tr->w()/2-_added[i]._w/2, 0); break; case 4: tr->trasla(0, -tr->h()/2-_added[i]._h/2); break; case 5: tr->trasla(0, -tr->h()/2-_added[i]._h/2); break; case 6: tr->trasla(tr->w()/2+_added[i]._w/2, 0); break; case 7: tr->trasla(tr->w()/2+_added[i]._w/2, 0); break; } _added[i]._last_pos=(++_added[i]._last_pos)%enumerate_atoms_etich_entry::max_pos; break; } } } /**************fine metodi di classe**********************************/ extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new enumerate_atoms(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ cout << "distruzione plugin: " << j << endl; delete j; cout << "riuscita" << endl; } bist-0.5.2/pluginsrc/IR_prediction.cpp0000644000175000017500000001722711406210753016313 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ IR_prediction::IR_prediction(immagine* image,string libpath) :bist_plugin(image,libpath), _spectrum(spectra_plot::IR), _has_to_act(true) { _peak_height.insert(std::pair(std::string("strong"),95)); _peak_height.insert(std::pair(std::string("medium"),50)); _peak_height.insert(std::pair(std::string("weak"),20)); } void IR_prediction::inizialize(){ /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ vector< pair < int, pair > >* elem=r_elem_selected(); //vector * groups=r_groups(); if(elem->size()>0 && (((*elem)[0]).second).first!=NO_VALID_GROUP){ gruppo selected=*(_the_image->find_group_id( ((*elem)[0].second).first )); get_paths(string(LIB_PATH_SHARE) + IR_dir); generate_plot(selected); _spectrum.show(); while(_spectrum.shown()){ Fl::wait(); } } } void IR_prediction::get_paths(string pt){ DIR* direc=opendir(pt.c_str()); //std::cerr << direc << std::endl; if(direc==NULL){ fl_alert(_("Can not open library directory %s"),pt.c_str()); }else{ dirent* acc; struct stat attrb; while((acc=readdir(direc))!=NULL){ string file=pt+"/"+acc->d_name; stat(file.c_str(),&attrb); if(S_ISREG(attrb.st_mode)){ if(file.rfind("bist")!=string::npos){ _resid_paths.push_back(file); } } } sort(_resid_paths.begin(),_resid_paths.end()); } } bool IR_prediction::generate_plot(gruppo mol){ bool res=true; for(unsigned int i=0;i<_resid_paths.size();i++){ bool no_ok; gruppo r=get_residual(_resid_paths[i],no_ok); if(!no_ok){ if(match(mol,r)){ add_peak(_resid_paths[i]); }else{ //std::cerr << "NO match " << _resid_paths[i] << std::endl; } }else{ res=false; } } return res; } bool IR_prediction::add_peak(std::string file){ std::string::size_type sl=file.rfind('/'); std::string::size_type pt=file.rfind('.'); std::string nm=file.substr(sl+1,pt-sl-1); char* start_name=NULL; std::string sk; strtof(nm.c_str(),&start_name); while(*start_name!='\0'){ sk+=*start_name; start_name++; } bool has_error=false; if(find(_resid_excluded.begin(), _resid_excluded.end(),sk)==_resid_excluded.end()){ immagine im=get_residual_immagine(file, has_error); if(!has_error){ gruppo r=get_residual(file,has_error); float x=0; float y=0; for(int i=0;ito_raw_string(); x=strtof(set.c_str(),NULL); } break; case 1: { etichetta* et=im.ritorna_punt_etich(i); std::string set=et->to_raw_string(); y=_peak_height[set]; } break; case 2: { etichetta* et=im.ritorna_punt_etich(i); std::string set=et->to_raw_string(); std::string del=" "; string_tokenizer tk(set, del); while(tk.has_more_tokens()){ std::string nx=tk.next_token(); if(nx!=skip_label){ _resid_excluded.push_back(nx); } } } break; } } _spectrum.add_spike(x,y); _spectrum.add_group(r,x,y); } } return has_error; } bool IR_prediction::match(gruppo mol, gruppo r){ return mol.substructure_match(r); } gruppo IR_prediction::get_residual(std::string file, bool& has_error){ immagine im(file); im.start(); gruppo res; if(!im.has_error()&& im.size_etich_vector()>1 && im.size_gruppi_vector()>0){ res=im.ritorna_gruppo(0); has_error=false; }else{ has_error=true; } return res; } immagine IR_prediction::get_residual_immagine(std::string file, bool& has_error){ immagine im(file); im.start(); immagine res; if(!im.has_error()&& im.size_etich_vector()>0&& im.size_gruppi_vector()>0){ res=im; has_error=false; }else{ has_error=true; } return res; } bool IR_prediction::need_atom(){ return false; } bool IR_prediction::need_leg(){ return false; } bool IR_prediction::act(int e){ return true; } IR_prediction::~IR_prediction(){ cout << "IR distruzione!!! " << _the_image <. */ // generated by Fast Light User Interface Designer (fluid) version 1.0107 #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include <2D_vector.hpp> #include #include #include extern finestra_pr* MainWindow; void change_layer_dialog_up_cb(Fl_Widget* w , void* d){ ChangeLayerDialog* win=dynamic_cast(w->parent()); win->push_up(); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void change_layer_dialog_down_cb(Fl_Widget* w , void* d){ ChangeLayerDialog* win=dynamic_cast(w->parent()); win->push_down(); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void change_layer_dialog_background_cb(Fl_Widget* w , void* d){ ChangeLayerDialog* win=dynamic_cast(w->parent()); win->push_down(true); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } void change_layer_dialog_foreground_cb(Fl_Widget* w , void* d){ ChangeLayerDialog* win=dynamic_cast(w->parent()); win->push_up(true); editor* ed=dynamic_cast(MainWindow); ed->redraw(); } ChangeLayerDialog::ChangeLayerDialog(ChangeLayer* plugin) :Fl_Double_Window(LARG_BUTTON_DEFAULT*4+9, LARG_BUTTON_DEFAULT+6, "Change layer"), _up(3, 3, LARG_BUTTON_DEFAULT,LARG_BUTTON_DEFAULT, "@8->"), _down(LARG_BUTTON_DEFAULT+3, 3, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT, "@2->"), _back(LARG_BUTTON_DEFAULT*2+3, 3, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT, "@<<"), _foreg(LARG_BUTTON_DEFAULT*3+3, 3, LARG_BUTTON_DEFAULT, LARG_BUTTON_DEFAULT, "@4<<"), _plugin(plugin) { labeltype(FL_NORMAL_LABEL); _up.callback(change_layer_dialog_up_cb); add(_up); _down.callback(change_layer_dialog_down_cb); add(_up); _back.callback(change_layer_dialog_background_cb); add(_back); _foreg.callback(change_layer_dialog_foreground_cb); add(_foreg); end(); set_modal(); show(); } ChangeLayerDialog::~ChangeLayerDialog(){ } void ChangeLayerDialog::push_down(bool go_background){ _plugin->push_down(go_background); } void ChangeLayerDialog::push_up(bool go_foreground){ _plugin->push_up(go_foreground); } bist-0.5.2/pluginsrc/insert_template.cpp0000644000175000017500000001170411406210753016752 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ insert_template::insert_template(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(true), _has_acted(false), _name_template("") { } void insert_template::inizialize(){ _the_image->elimina_elem_selected(); _the_image->elimina_legami_selected(); Fl_Double_Window* win= make_insert_template_dialog(); while(win->shown()){ Fl::wait(); } Fl_Input* d = dynamic_cast(win->child(1)); _name_template=d->value(); _has_to_act=false; delete win; std::cerr << _name_template << std::endl; /* #define LIB_PATH_HOME "/.bist/rings/" #define LIB_PATH_SHARE "/usr/local/share/bist/rings/" */ string home_dir=getenv("HOME"); if(_name_template!=""){ bool found=false; if(!search(home_dir + string(LIB_PATH_HOME),found)){ found=false; search(string(LIB_PATH_SHARE),found); } } } bool insert_template::search(string pt, bool& found){ if(!found){ DIR* direc=opendir(pt.c_str()); if(direc==NULL){ fl_alert(_("Can not open library directory %s"),pt.c_str()); return false; } dirent* acc; struct stat attrb; while((acc=readdir(direc))!=NULL){ string file=pt+"/"+acc->d_name; stat(file.c_str(),&attrb); if(S_ISDIR(attrb.st_mode) && string(acc->d_name)!="." && string(acc->d_name)!=".."){ search(file,found); }else if(S_ISREG(attrb.st_mode) && !found){ if(file.find(_name_template)!=string::npos && file.rfind("bist")!=string::npos){ _the_image->aggiungi_template(file); found=true; return true; } } } return false; }else{ return true; } } bool insert_template::need_atom(){ return false; } bool insert_template::need_leg(){ return false; } bool insert_template::act(int e){ return _has_to_act; } insert_template::~insert_template(){ cout << "join ring distruzione!!! " << _the_image < #include #include #include #include #include #include #include #include #include std::string choice_window(std::vector< std::pair< std::string,std::string > > links) { Fl_Double_Window* w = new Fl_Double_Window(480, 205, "Choose molecule"); Fl_Hold_Browser* br= new Fl_Hold_Browser(25, 15, 430, 160,"Choose molecule"); for(unsigned int i=0;iadd(links[i].first.c_str()); } w->end(); w->set_modal(); w->show(); while(w->shown()){ Fl::wait(); } std::string res=links[0].second; if(br->value()>0 && static_cast(br->value()-1) < links.size()){ res=links[br->value() -1 ].second; } delete br; delete w; return res; } class get_molfile{ protected: static std::string the_file; static std::string nist_host; static int my_progress_func(void* w, double t, /* dltotal */ double d, /* dlnow */ double ultotal, double ulnow) { Fl_Window* win=reinterpret_cast(w); cout << "progress: dlnow" << d << " dltotal" << t << " "<< d*100.0/t<< "%" << endl; dynamic_cast(win->child(0))->maximum(static_cast(400.0)); dynamic_cast(win->child(0))->minimum(0); dynamic_cast(win->child(0))->value(static_cast(d/t*400.0)); win->redraw(); Fl::check(); return 0; } static int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream) { char* ch=static_cast(buffer); for(unsigned int i=0; i< nmemb ;i++){ for(unsigned int i2=0;i2 >* links){ if(page!=""){ regex_t res_r; std::string regexp="\\(/cgi/cbook.cgi?ID=[0-9,a-z]\\+&Units=SI\"\\)\\(>[^>]\\+\\)"; regcomp(&res_r, regexp.c_str(),REG_ICASE); regmatch_t results[3]; int error=regexec(&res_r, page.c_str(),3, results, REG_NOTBOL|REG_NOTEOL); if(error==0){ std::string link=nist_host + page.substr(results[1].rm_so,(results[1].rm_eo-1)-results[1].rm_so); std::string name=page.substr(results[2].rm_so,(results[2].rm_eo-1)-results[2].rm_so); std::string line=link + std::string("") + name; std::pair alink(name,link); links->push_back(alink); get_all_choices(page.substr(results[0].rm_eo-1),links); } regfree(&res_r); } } public: static std::string get_web_molfile(std::string filename,Fl_Window* progressw, bool addhost=true){ std::string urlfetch=""; if(addhost){ std::string delim=" "; string_tokenizer tok(filename , delim); std::string filename_enc=""; if(filename.find(' ')!=std::string::npos){ while(!tok){ filename_enc+=tok.next_token(); } }else{ filename_enc=filename; } urlfetch=nist_host + "cgi/cbook.cgi?Name="+ filename_enc + "&Units=SI"; }else{ urlfetch=filename; } std::string molfile=""; std::string catalog=get_curl_file(urlfetch,progressw); if(more_than_one_choice(catalog)){ std::vector< std::pair< std::string,std::string> > list; get_all_choices(catalog,&list); molfile=get_web_molfile(choice_window(list),progressw,false); }else{ molfile=get_2d_struct_file(catalog,progressw); } return molfile; } }; std::string get_molfile::nist_host="http://webbook.nist.gov/"; std::string get_molfile::the_file=""; bist-0.5.2/pluginsrc/fetch_nist_database/Makefile.am0000644000175000017500000000047411733641566021074 0ustar cagecage#ACLOCAL_AMFLAGS = -I m4 pkglib_LTLIBRARIES = fetch_nist_database.la fetch_nist_database_la_SOURCES = fetch_nist_database.cpp fetch_nist_database.hpp get_nist_file.hpp fetch_nist_database_la_LDFLAGS = -module -avoid-version -export-dynamic fetch_nist_database_la_CXXFLAGS= -Werror=format-security $(AM_CXXFLAGS) bist-0.5.2/pluginsrc/fetch_nist_database/fetch_nist_database.cpp0000644000175000017500000001243111406210753023475 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include /* #include #include using namespace OpenBabel; #include */ #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ fetch_nist_database::fetch_nist_database(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(true), _has_acted(false) { _progressw=new Fl_Window(410,60,"getting file.."); _progressw->set_modal(); Fl_Progress* progress_bar=new Fl_Progress(5,5,400,50); _progressw->add(progress_bar); _progressw->end(); } void fetch_nist_database::inizialize(){ _the_image->elimina_elem_selected(); _the_image->elimina_legami_selected(); _progressw->show(); const char * fetched=fl_input("insert name:"); // sleep(1); if(fetched!=NULL){ string molfile=get_molfile::get_web_molfile(fetched,_progressw); if(molfile!=""){ immagine_mol mol; mol.start_from_string(molfile); gruppo pp=mol.ritorna_gruppo(0); vector::iterator in=pp.iniz_atom(); vector::iterator fin=pp.fin_atom(); if(in!=fin){ vector::iterator f_leg=(*in).primo_leg(); atomo* sec= pp.find_atomo_id((*f_leg).id_atomo()); if(sec!=0){ float ix=(*in).phys_pos_x(); float iy=(*in).phys_pos_y(); float fx=sec->phys_pos_x(); float fy=sec->phys_pos_y(); float dx=ix-fx; float dy=iy-fy; float displ=sqrt( pow(dx,2) + pow(dy,2) ); float max_displ=__pref.getBond_fixedlength(); //std::cout << "max_displ_" << max_displ << std::endl; while(displphys_pos_x(); fy=sec->phys_pos_y(); dx=ix-fx; dy=iy-fy; displ=sqrt( pow(dx,2) + pow(dy,2) ); pp.scale(1.0001); } pp.trasla(pp.w()/2,pp.h()/2); _the_image->aggiungi_gruppo(pp); } } }else{ fl_alert("%s not found",fetched); } } _has_to_act=false; _progressw->hide(); } bool fetch_nist_database::need_atom(){ return false; } bool fetch_nist_database::need_leg(){ return false; } bool fetch_nist_database::act(int e){ return _has_to_act; } fetch_nist_database::~fetch_nist_database(){ delete _progressw; cout << "fetch nist database distruzione!!! " << _the_image <. */ #include #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; flip_around_bond::flip_around_bond(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(false), _has_acted(true) { } void flip_around_bond::inizialize(){ /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ //vector< pair < int, pair > >* elem=r_elem_selected(); vector * groups=r_groups(); atomo* atm_parent=NULL; atomo* atm_child=NULL; gruppo* the_grp=NULL; find_atoms(&atm_parent, &atm_child); if(atm_parent!=NULL && atm_child!=NULL){ for(unsigned int i=0;isize();i++){ gruppo* tmp=&(*groups)[i]; if(atm_child->id_gruppo()==tmp->id()){ the_grp=tmp; } } float trasl_saved_x=atm_child->pos_x(); float trasl_saved_y= atm_child->pos_y(); the_grp->trasla(-trasl_saved_x,-trasl_saved_y); int chce=fl_choice("Flip molecule or fragment?", "molecule", "fragment", NULL); if(chce==0){ the_grp->generic_depth_search_appl_popped(atm_child, atm_parent, atm_child ,the_grp, trasl_depth_search_pf); }else{ the_grp->generic_depth_search_appl_popped(atm_child, atm_parent, atm_child , the_grp, atm_parent, trasl_depth_search_pf, ignore_plug); } the_grp->trasla(trasl_saved_x,trasl_saved_y); } } std::pair vec_flipped(atomo a, atomo b){ std::pair diff; diff.first =b.pos_x() - a.pos_x(); diff.second=b.pos_y() - a.pos_y(); diff.first=-diff.first; diff.second=-diff.second; return diff; } float angle(std::pair a, std::pair b){ std::pair a_norm=normalize_vec(a); std::pair b_norm=normalize_vec(b); float dot_p=dot_product_vec(a_norm, b_norm); float angle=acos(dot_p); if(cross_product_vec(a,b)<0){ angle=-angle; } return angle; } float dot_product_vec(std::pair a, std::pair b){ return (a.first * b.first) + (a.second * b.second); } float cross_product_vec(std::pair a, std::pair b){ return a.first * b.second - a.second * b.first; } float magn_vec(std::pair a){ return sqrt(a.first * a.first + a.second * a.second); } std::pair normalize_vec(std::pair a){ static const float zero_thr=0.001; float mag=magn_vec(a); std::pair res=a; if(!similar_to(mag, 0.0f, zero_thr)){ res.first/=mag; res.second/=mag; } return res; } void flip_around_bond::find_atoms(atomo** atm_parent, atomo** atm_child){ *atm_parent=NULL; *atm_child=NULL; vector< pair < int, pair > >* elem=r_elem_selected(); vector * groups=r_groups(); if(elem->size()==2){ pair < int, pair > atm_sel_p=(*elem)[0]; pair < int, pair > atm_sel_c=(*elem)[1]; if(atm_sel_p.first==ATOMO && atm_sel_c.first==ATOMO && (atm_sel_p.second).first==(atm_sel_c.second).first){ gruppo* g_parent=NULL; for(unsigned int i=0;isize();i++){ gruppo* tmp=&(*groups)[i]; if(tmp->id()==(atm_sel_p.second).first){ g_parent=tmp; } } if(g_parent!=NULL){ *atm_parent=g_parent->find_atomo_id((atm_sel_p.second).second); *atm_child=g_parent->find_atomo_id((atm_sel_c.second).second); } } } } bool flip_around_bond::need_atom(){ return false; } bool flip_around_bond::need_leg(){ return false; } bool flip_around_bond::act(int e){ return _has_to_act; } flip_around_bond::~flip_around_bond(){ cout << __FUNCTION__ << _the_image <(data4); return atm->id() == plug->id(); } int trasl_depth_search_pf(atomo* da , void* data, void* data2, void* data3){ atomo* root=static_cast (data); atomo* block=static_cast (data2); //gruppo* the_grp=static_cast (data3); std::pair pivot = vec_flipped(*block, *root); if(da->id() != root->id() && da->id() != block->id()){ std::pair arrow(da->pos_x(),da->pos_y()); float angle_rot=angle(arrow,pivot); std::pair rotated=rotate_point(arrow.first, arrow.second, -2*angle_rot); da->pos_x(rotated.first); da->pos_y(rotated.second); } return 1; } extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new flip_around_bond(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ delete j; } bist-0.5.2/pluginsrc/insert_template_dialog.cpp0000644000175000017500000000312611025523004020261 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // generated by Fast Light User Interface Designer (fluid) version 1.0105 #include #include #include #include #include #include #include void include_template_cb(Fl_Widget* w, void* d){ Fl_Double_Window* win=dynamic_cast(w->parent()); win->hide(); } Fl_Double_Window* make_insert_template_dialog() { Fl_Double_Window* a = new Fl_Double_Window(350, 80, "Insert template by his name"); Fl_Box* b= new Fl_Box(10, 5, 330, 70); b->box(FL_EMBOSSED_BOX); a->add(b); Fl_Input* d = new Fl_Input(65, 15, 160, 30, "Name:"); a->add(d); Fl_Return_Button* e=new Fl_Return_Button(230, 15, 105, 30, "OK"); e->callback(include_template_cb); a->add(e); a->end(); a->set_modal(); a->show(); return a; } bist-0.5.2/pluginsrc/global_charge.cpp0000644000175000017500000001250111406210753016320 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2008 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; /** *Un plugin deve avere : * *una funzione bool (*need_group)() che ritorna true se il plugin ha *bisogno di conoscre quali atomi sono selezionati; * *una funzione bool (*need_leg)() che ritorna true se il plugin ha *bisogno di conoscere quali legami sono selezionati; * *una funzione bool (*act)() che computa quello per cui il plugin e' *stato scritto * */ global_charge::global_charge(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(true), _has_acted(false), _charges("") { } void global_charge::inizialize(){ /* _the_image->elimina_elem_selected(); _the_image->elimina_legami_selected(); */ _has_acted=true; const char* the_charges=fl_input("Charges","0"); if(the_charges!=NULL){ _charges=the_charges; act(0); } } bool global_charge::need_atom(){ return false; } bool global_charge::need_leg(){ return false; } bool global_charge::act(int e){ /** *Contiene coppie > selezionati, se si e' *selezionato una etichetta gruppo e' uguale a NO_VALID_GROUP */ vector< pair < int, pair > >* elem=r_elem_selected(); if(elem->size()>0){ float arr_w=__pref.get_arr_w(); float arr_h=__pref.get_arr_h(); float arr_gap=__pref.get_arr_gap(); vector * gruppi=r_groups(); //(*elem)[el_sel].second.first if((*elem)[0].second.first!=NO_VALID_GROUP){ for(unsigned int y=0;ysize();y++){ if((*gruppi)[y].id_gruppo()==((*elem)[0].second).first){ float px=(*gruppi)[y].phys_posx(); float py=(*gruppi)[y].phys_posy(); float w=(*gruppi)[y].phys_w(); float h=(*gruppi)[y].phys_h(); std::cerr << "px: " << px << "py " << py << "w " << w << "h " << h << std::endl; /* proc_arrow(int id,float posx, float posy, float eposx,float eposy, int cr, int cb, int cg , float xpiv, float ypiv, float anglrot, int spess, int tratt, int punte) */ proc_arrow hor(0,10+px+w*3/4, -10+py, 10+px+w,-10+py, 0, 0,0, 0,0,0, 2,0, ARR_NO_PUNT, arr_w,arr_h,arr_gap); proc_arrow ver(0,10+px+w, -10+py, 10+px+w,-10+py+h/4, 0, 0,0, 0,0,0, 2,0, ARR_NO_PUNT, arr_w,arr_h,arr_gap); (*gruppi)[y].aggiungi_procedura(&hor); (*gruppi)[y].aggiungi_procedura(&ver); paragraph_text* ch=new paragraph_text(); ch->insert_string_in_curr_pos(_charges,ET_STR); ch->trasla(12+px+w,-12+py); _the_image->aggiungi_etich(ch); //_the_image->redraw(); break; } } } } return _has_acted; } global_charge::~global_charge(){ cout << "global_charge distruzione!!! " << _the_image <size()>0 && !_has_acted){ _has_to_act=true; res=true; } return res; } string global_charge::libpath(){ return _lib; } /**************fine metodi di classe**********************************/ extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new global_charge(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ cout << "distruzione plugin: " << j << endl; delete j; cout << "riuscita" << endl; } bist-0.5.2/pluginsrc/change_layer.cpp0000644000175000017500000001245411411114540016170 0ustar cagecage/* Bist: a chemical drawing tool Copyright (C) 2010 Valerio Benfante This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include //portability problem? #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include <2D_vector.hpp> #include #include #include typedef immagine Image; extern finestra_pr* MainWindow; extern Preferences __pref; extern bool __close; ChangeLayer::ChangeLayer(immagine* image,string libpath) :bist_plugin(image,libpath), _has_to_act(true), _has_acted(false) { } void ChangeLayer::inizialize(){ ChangeLayerDialog dialog_ch(this); while(dialog_ch.shown()){ Fl::wait(); } _has_to_act=false; } bool ChangeLayer::need_atom(){ return false; } bool ChangeLayer::need_leg(){ return false; } bool ChangeLayer::act(int e){ return _has_to_act; } ChangeLayer::~ChangeLayer(){ } void ChangeLayer::register_plugin(){ } bool ChangeLayer::time_to_act(){ return _has_to_act; } string ChangeLayer::libpath(){ return _lib; } std::string ChangeLayer::menu_path(){ return "align and distribuite/"; } void ChangeLayer::push_down(bool go_background){ vector< pair < int, pair > >* elem=r_elem_selected(); vector * gruppi=r_groups(); for(unsigned int i=0;isize();i++){ if((*gruppi)[i].id_gruppo()==((*elem)[0].second).first && i>0 ){ unsigned int fst=i-1; unsigned int second=i; if(go_background){ (*gruppi)[second].id(-1); for(unsigned int i2=0;i2size();i2++){ (*gruppi)[i2].id((*gruppi)[i2].id()+1); } std::sort(gruppi->begin(),gruppi->end(),ordina_gruppo_id); gruppo* found=_the_image->find_group_id(0); _the_image->elimina_elem_selected(); if(found){ _the_image->aggiungi_tutto_selected(*found); break; } }else{ int bkid=(*gruppi)[fst].id(); (*gruppi)[fst].id((*gruppi)[second].id()); (*gruppi)[second].id(bkid); std::sort(gruppi->begin(),gruppi->end(),ordina_gruppo_id); gruppo* found=_the_image->find_group_id(bkid); _the_image->elimina_elem_selected(); if(found){ _the_image->aggiungi_tutto_selected(*found); break; } } } } } void ChangeLayer::push_up(bool go_foreground){ vector< pair < int, pair > >* elem=r_elem_selected(); vector * gruppi=r_groups(); for(unsigned int i=0;i< gruppi->size() -1 ;i++){ if((*gruppi)[i].id_gruppo()==((*elem)[0].second).first){ unsigned int fst=i+1; unsigned int second=i; if(go_foreground){ (*gruppi)[second].id((*gruppi)[gruppi->size() -1].id()+1); std::sort(gruppi->begin(),gruppi->end(),ordina_gruppo_id); for(unsigned int i2=0;i2size();i2++){ //remove "holes" (*gruppi)[i2].id((*gruppi)[i2].id()+1); } std::sort(gruppi->begin(),gruppi->end(),ordina_gruppo_id); break; }else{ int bkid=(*gruppi)[fst].id(); (*gruppi)[fst].id((*gruppi)[i].id()); (*gruppi)[second].id(bkid); std::sort(gruppi->begin(),gruppi->end(),ordina_gruppo_id); gruppo* found=_the_image->find_group_id(bkid); _the_image->elimina_elem_selected(); if(found){ _the_image->aggiungi_tutto_selected(*found); if(!go_foreground){ break; } } } } } } extern "C" bist_plugin* create_plugin(immagine* imm, string libpath){ return new ChangeLayer(imm, libpath); } extern "C" void destroy_plugin(bist_plugin* j){ delete j; }