From 318121054ebb87dd1e2d6759d77c51847b6e2ce1 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 3 Jun 2018 21:16:34 +0000 Subject: mcf2graph (3jun18) git-svn-id: svn://tug.org/texlive/trunk@47911 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf | 568 ++++++++++++---------- 1 file changed, 316 insertions(+), 252 deletions(-) (limited to 'Master/texmf-dist/metapost') diff --git a/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf b/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf index 875b4e32b1a..f553da1e7dc 100644 --- a/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf +++ b/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% mcf2graph ver 4.31 Copyright (c) 2013-2018 Akira Yamaji +% mcf2graph ver 4.32 Copyright (c) 2013-2018 Akira Yamaji % % Permission is hereby granted, free of charge, to any person obtaining a copy of this software % and associated documentation files (the "Software"), to deal in the Software without restriction, @@ -17,7 +17,7 @@ % OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % mcf2graph is METAFONT/METAPOST macro package convert -% Molecular Coding Format(MCF) to font(pk)/eps/sgv/png/mdl molfile(V2000) +% Molecular Coding Format(MCF) to font(pk)/eps/sgv/png/mdl molfile %---------------------------------------------------------------------------------------------- % This package is located at : http://www.ctan.org/pkg/mcf2graph % Suggestion or request mail to : mcf2graph@gmail.com @@ -25,25 +25,26 @@ % Set output no image file : mpost -s ahangle=0 FILENAME % Set outputformat to "png" : mpost -s ahangle=1 FILENAME % Set outputformat to "svg" : mpost -s ahangle=2 FILENAME -% Set outputformat to MDL Molfile : mpost -s ahangle=3 FILENAME +% Set outputformat to MOL(V2000) : mpost -s ahangle=3 FILENAME +% Set outputformat to MOL(V3000) : mpost -s ahangle=4 FILENAME % Set make first font only : mpost -s ahlength=1 FILENAME % Set output report : mpost -s ahlength=2 FILENAME % Set to use plain.mp label,arrow : mpost -s ahlength=3 FILENAME %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tracingstats:=1; -message " This is mcf2graph ver 4.3 2018.04"; +message " This is mcf2graph ver 4.3 2018.06"; %------------------------------------------------------------------------------------------------- newinternal nA,nB,nC,nD,nE,nF,char_num,str_cnt,sub_usr,sub_int,tbl_cnt; numeric save_para[],comD[][],parD[][],cntD[],tbl_str_wd[],tbl_atom[],tbl_subst[][],tbl_atom_wt[], - tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[]; + tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[],chgA[]; string tbl_atom_str[],strD[],var[],tag[],mp_log_name,aux_delimiter,atomfont, save_atomfont,save_defaultfont; picture mol_stru[]; path arrow_path,arrow_head; %------------------------------------------------------------------------------------------------- char_num:=str_cnt:=proc_end:=sw_label_emu:=0; -sw_numberA:=sw_numberB:=sw_mol_frame:=sw_auxout:=sw_solid:=sw_expand:=sw_font_frame:=sw_clip:=0; -sw_atom_frame:=sw_report:=sw_MOLout:=sw_subst_off:=sw_bond_single:=sw_auxfix:=sw_arrow:=0; +sw_numberA:=sw_numberB:=sw_mol_frame:=sw_aux_out:=sw_solid:=sw_expand:=sw_font_frame:=sw_clip:=0; +sw_atom_frame:=sw_report:=sw_mol_out:=sw_subst_off:=sw_bond_single:=sw_auxfix:=sw_arrow:=0; numberA_start:=numberB_start:=1; numberA_end:=numberB_end:=4095; aux_max:=max_inf_num:=20; aux_delimiter:=";"; var1:="jobname"; tag1:="F"; var2:="char_num"; tag2:="C"; for i=3 upto aux_max: var[i]:=tag[i]:=""; endfor @@ -60,8 +61,9 @@ if (known green)and(known ahlength): fi if ahangle=0: def shipit = enddef; % No image file elseif ahangle=1: outputformat:="png"; hppp:=vppp:=0.1; % PNG format - elseif ahangle=2: outputformat:="svg"; % SVG format - elseif ahangle=3: sw_MOLout:=1; def shipit = enddef; % MDL Molefile on + elseif ahangle=2: outputformat:="svg"; prologues:=3; % SVG format + elseif ahangle=3: sw_mol_out:=1; def shipit = enddef; % output MOL V2000 + elseif ahangle=4: sw_mol_out:=2; def shipit = enddef; % output MOL V3000 fi outputtemplate:="%j-%3c."&outputformat; def beginchar(expr a,b,c,d)= beginfig(a) w:=b*pt; h:=c*pt; enddef; @@ -77,7 +79,6 @@ else: f_MP:=0; def Cp(expr s) = enddef; def color = transform enddef; def printf expr s= message s enddef; - %----------------------------------------------------------------------- sw_arrow:=0; dotlabeldiam:=3bp; %----------------------------------------------------------------------- @@ -88,11 +89,12 @@ fi clearit; for i=0 upto 20: mol_stru[i]:=nullpicture; endfor %-------------------------------------------------------------------------------------------------- -let DIV= /; let MUL= *; let LT= <; let GT= >; let AND= &; let :: = : ; let == = =; +let DIV= /; let MUL= *; let LT= <; let GT= >; let AND= &; let :: = : ; let == = =; let ef=elseif; %-------------------------------------------------------------------------------------------------- ?3:=?20:=Ph:=Ph1:=Ph2:=hz:=0; vt:=1; -margin_left_right:=margin_top_bottom:=0.4mm; ratio_bond_width:=0.1; -ratio_chain_ring:= 0.66; ratio_atom_bond:=0.36; ratio_thickness_bond:=0.015; +margin_left_right:=margin_top_bottom:=0.4mm; +ratio_bond_width:=0.1; ratio_chain_ring:= 0.66; ratio_atom_bond:=0.36; +ratio_thickness_bond:=0.015; ratio_thickness_char:=0.1; ratio_char_bond:=1.5; ratio_bondgap_bond:=0.15; ratio_zebragap_bond:=0.12; ratio_zebra_black:=0.4; ratio_wedge_bond:=0.12; ratio_atomgap_atom:=0.050; offset_thickness:=0.2pt; offset_bond_gap:=0.3pt; offset_zebra_gap:=0.1pt; @@ -121,10 +123,10 @@ def_com(-4000)(_term,_jp_atom,_jp_atom_abs,_jp_bond,_cyc,_cyc_sB,_cyc_eB,_set_li def_com(1)(si,dl,dr,db,dm,tm,wf,wb,bd,bz,zf,zb,dt,wv,nl,vf,vb,si_,wf_,wb_,bd_); %-------------------------------------------------------------------------------------------------- def parameter_list= - sw_report,sw_numberA,sw_numberB,sw_mol_frame,sw_auxout,sw_solid,sw_expand,sw_MOLout, + sw_report,sw_numberA,sw_numberB,sw_mol_frame,sw_aux_out,sw_solid,sw_expand,sw_mol_out, sw_atom_frame,sw_font_frame,sw_subst_off,sw_bond_single,sw_clip,sw_arrow,sw_label_emu, margin_left_right,margin_top_bottom,ratio_atom_bond,ratio_thickness_bond,ratio_char_bond, - ratio_chain_ring,ratio_bondgap_bond,ratio_zebra_black,ratio_zebragap_bond, + ratio_chain_ring,ratio_bondgap_bond,ratio_zebra_black,ratio_zebragap_bond,ratio_thickness_char, ratio_wedge_bond,ratio_atomgap_atom,ratio_bond_width,font_wd,font_ht, bond_len,offset_atom,offset_wedge,max_bond_length,offset_zebra_gap,offset_bond_gap, thickness_font_frame,offset_thickness,numberA_start,numberA_end,numberB_start,numberB_end, @@ -396,7 +398,7 @@ def ext_puts(expr a)(expr STR)= elseif sA="^": if nC= 0.5: nC:=0; else: nC:= 0.5; fi else: if defaultfont="draw": - draw_char(sA,cp+(0,nB*nC),nB,0.35*ratio_char_bond*bp,0); + draw_char(sA,cp+(0,nB*nC),nB,ratio_thickness_char*defaultscale*defaultsize,0); cp:=cp+(nB*tbl_char_wd[nA],0); else: pC:=sA infont defaultfont scaled defaultscale; @@ -404,8 +406,9 @@ def ext_puts(expr a)(expr STR)= cp:=cp+(lrcorner pC-llcorner pC); fi fi - else: draw_char(sA,cp,nB,0.35*ratio_char_bond*bp,0); - cp:=cp+(nB*tbl_char_wd[nA],0); + else: + draw_char(sA,cp,nB,ratio_thickness_char*defaultscale*defaultsize,0); + cp:=cp+(nB*tbl_char_wd[nA],0); fi endfor endgroup; @@ -499,7 +502,7 @@ def MCd(expr RW,RH)(expr FW,FH)(text TX)= begingroup save com,par,adrA,adrB,f_bra,envT,envB,lenT,lineT,strAT,stkA,stkB,stkL,stkM,cntP,bondL,temp_len, temp_cntB,f_end,f_term,rotT,adrS,f_at,f_lineT,f_rotT,f_lenT,f_envT,angT,tempB,tempA, - glu,xpos,ypos,str_len,max_x,max_y,par_s,par_e,score_u,hat,f_char,ps_adr,ps_com, + glu,xpos,ypos,str_len,max_x,max_y,par_s,par_e,score_u,hat,f_char,ps_adr,ps_com,sA, op_com,op_par,op_cnt,crR,colorA,colorB,PA,PO,PP,PX; %----------------------------------------------------------------------------------------------- def PA= sub_add enddef; @@ -509,9 +512,10 @@ def MCd(expr RW,RH)(expr FW,FH)(text TX)= %----------------------------------------------------------------------------------------------- numeric stkB[],stkA[],stkL[],stkM[],f_char[],ps_adr[],ps_com[],colorA[],colorB[], op_com[][],op_par[][],op_cnt[]; + string sA; %----------------------------------------------------------------------------------------------- if (sw_numberA>=1)or(sw_numberB>=1): ratio_atom_bond:=0.25; fi - if (sw_expand=1)or(sw_MOLout=1): expand_set; fi + if (sw_expand=1)or(sw_mol_out>=1): expand_set; fi sub_usr:=sub_usr_start; sub_int:=sub_int_start; par_s:=ASCII("{"); par_e:=ASCII("}"); score_u:=ASCII("_"); hat:=ASCII("^"); @@ -540,6 +544,8 @@ def MCd(expr RW,RH)(expr FW,FH)(text TX)= for i=1 upto cntB: if lineB[i]>=si_: draw_bond(i,sB[i],eB[i],angB[i],lineB[i]); fi endfor %----------------------------------------------------------------------------------------------- for i=1 upto cntA: + sA:=substring(3,4) of strD[numS[i]]; + if sA="+": chgA[i]:=1; ef sA="-": chgA[i]:=-1; else: chgA[i]:=0; fi if (sw_numberA>=1)and(i>=numberA_start)and(i<=numberA_end): if sw_numberA=2: nA:=i-numberA_start+1; elseif sw_numberA=3: if numberA_end=1))and(f_MP=1): proc_calc_out; fi %----------------------------------------------------------------------------------------------- %%%% message "count of usr ="& decimal(sub_usr) &" "& decimal(sub_usr-sub_usr_start); %%%% message "count of int ="& decimal(sub_int) &" "& decimal(sub_int-sub_int_start); @@ -657,58 +663,58 @@ def proc_bond_atom(expr n)= for i=0 upto 5: stkA[i]:=stkB[i]:=0; endfor %----------------------------------------------------------------------------------------------- for i=n upto cntD[0]: - com:=comD[0][i]; par:=parD[0][i]; - if com=_push: + nC:=comD[0][i]; par:=parD[0][i]; + if nC=_push: if par=1: stkL[adrS]:=bondL; stkA[incr adrS]:=adrA:=cntA; stkB[adrS]:=adrB:=cntB; elseif par=0: temp_len:=bondL; elseif par=2: stkA[adrS+1]:=cntA; stkB[adrS+1]:=cntB; fi - elseif com=_pop: if par=1: adrA:=stkA[decr adrS]; adrB:=stkB[adrS]; bondL:=stkL[adrS]; - elseif par=0: bondL:=temp_len; - elseif par=2: stkA[adrS+1]:=0; + ef nC=_pop: if par=1: adrA:=stkA[decr adrS]; adrB:=stkB[adrS]; bondL:=stkL[adrS]; + ef par=0: bondL:=temp_len; + ef par=2: stkA[adrS+1]:=0; fi - elseif com=_mk_bond: if (par=0)and(rotT<>0): rotT:=0; fi add_atom; - elseif com=_set_adr: adrT:=par; - elseif com=_set_atom: strAT:=par; - elseif com=_postA: ps_put; - elseif com=_postB: lineT:=dm; ps_put; - elseif com=_postC: lineT:=wf; ps_put; - elseif com=_postD: lineT:=zf; ps_put; - elseif com=_postE: lineT:=nl; ps_put; - elseif com=_postF: lineT:=0; ps_put; - elseif com=_postG: lineT:=wv; ps_put; - elseif com=_postH: lineT:=nl; lenT:=_size_a; ps_put; - elseif com=_jp_bond: termA; tempB:=getB(par); check_adrB(tempB); sB[cntB+1]:=sB[tempB]; f_bra:=1; - elseif com=_jp_atom: termA; tempA:=getA(par); check_adrA(tempA); sB[cntB+1]:=tempA; f_bra:=1; - elseif com=_jp_atom_abs: sB[cntB+1]:=par; f_bra:=1; temp_cntB:=cntB; - elseif com=_chg_atom: numS[getA(adrT)]:=parD[par][1]; - elseif com=_N: numS[getA(par)]:=parD[N][1]; - elseif com=_O: numS[getA(par)]:=parD[O][1]; - elseif com=_S: numS[getA(par)]:=parD[S][1]; - elseif com=_chg_len: if par=_ring_len: bondL:=ringL; - elseif par=0: if lenT<>crR: bondL:=lenT; else: if bondL<0: bondL:=1; fi fi + ef nC=_mk_bond: if (par=0)and(rotT<>0): rotT:=0; fi add_atom; + ef nC=_set_adr: adrT:=par; + ef nC=_set_atom: strAT:=par; + ef nC=_postA: ps_put; + ef nC=_postB: lineT:=dm; ps_put; + ef nC=_postC: lineT:=wf; ps_put; + ef nC=_postD: lineT:=zf; ps_put; + ef nC=_postE: lineT:=nl; ps_put; + ef nC=_postF: lineT:=0; ps_put; + ef nC=_postG: lineT:=wv; ps_put; + ef nC=_postH: lineT:=nl; lenT:=_size_a; ps_put; + ef nC=_jp_bond: termA; tempB:=getB(par); check_adrB(tempB); sB[cntB+1]:=sB[tempB]; f_bra:=1; + ef nC=_jp_atom: termA; tempA:=getA(par); check_adrA(tempA); sB[cntB+1]:=tempA; f_bra:=1; + ef nC=_jp_atom_abs: sB[cntB+1]:=par; f_bra:=1; temp_cntB:=cntB; + ef nC=_chg_atom: numS[getA(adrT)]:=parD[par][1]; + ef nC=_N: numS[getA(par)]:=parD[N][1]; + ef nC=_O: numS[getA(par)]:=parD[O][1]; + ef nC=_S: numS[getA(par)]:=parD[S][1]; + ef nC=_chg_len: if par=_ring_len: bondL:=ringL; + ef par=0: if lenT<>crR: bondL:=lenT; else: if bondL<0: bondL:=1; fi fi else: bondL:=par; fi - elseif com=_get_len: if par=0: if bondL=crR: bondL:=lenT; fi else: ringL:=lenB[getB(par)]; fi - elseif com=_tmp_len: lenT:=par; - elseif com=_set_line: lineB[getB(adrT)]:=par; - elseif com=_dl: lineB[getB(par)]:=dl; - elseif com=_mb: lineB[getB(-1)]:=par; - elseif (com=_chg_line)or(com=_tmp_line): lineT:=par; - elseif com=_tmp_rot: rotT:=par; - elseif com=_cyc: f_end:=getA(par); check_adrA(f_end); add_atom; - elseif com=_cyc_eB: f_end:=eB[getB(par)]; add_atom; - elseif com=_cyc_sB: f_end:=sB[getB(par)]; add_atom; - elseif com=_chg_env: envB:=par; - elseif com=_tmp_env: envT:=par; - elseif com=_set_clr: + ef nC=_get_len: if par=0: if bondL=crR: bondL:=lenT; fi else: ringL:=lenB[getB(par)]; fi + ef nC=_tmp_len: lenT:=par; + ef nC=_set_line: lineB[getB(adrT)]:=par; + ef nC=_dl: lineB[getB(par)]:=dl; + ef nC=_mb: lineB[getB(-1)]:=par; + ef (nC=_chg_line)or(nC=_tmp_line): lineT:=par; + ef nC=_tmp_rot: rotT:=par; + ef nC=_cyc: f_end:=getA(par); check_adrA(f_end); add_atom; + ef nC=_cyc_eB: f_end:=eB[getB(par)]; add_atom; + ef nC=_cyc_sB: f_end:=sB[getB(par)]; add_atom; + ef nC=_chg_env: envB:=par; + ef nC=_tmp_env: envT:=par; + ef nC=_set_clr: f_at:=par; if par=1: if lineT<>si: f_lineT:=1; fi if rotT<>0: f_rotT:=1; fi if lenT<>crR: f_lenT:=1; fi if envT<>hz: f_envT:=1; fi - elseif par=0: f_lineT:=f_rotT:=f_lenT:=f_envT:=rotT:=envT:=0; lineT:=si; lenT:=crR; + ef par=0: f_lineT:=f_rotT:=f_lenT:=f_envT:=rotT:=envT:=0; lineT:=si; lenT:=crR; fi - elseif com=_term: termA; - elseif com=_set_colorA: colorA[getA(adrT)]:=par; - elseif com=_set_colorB: colorB[getB(adrT)]:=par; + ef nC=_term: termA; + ef nC=_set_colorA: colorA[getA(adrT)]:=par; + ef nC=_set_colorB: colorB[getB(adrT)]:=par; fi endfor enddef; @@ -734,36 +740,35 @@ def proc_skeleton= for i=0 upto 5: stkA[i]:=stkB[i]:=0; endfor %---------------------------------------------------------------------------------------------- for i=1 upto cntD[0]: - com:=comD[0][i]; par:=parD[0][i]; - if com=_push: if par=1: stkM[adrS]:=envB; adrS:=adrS+1; stkA[adrS]:=adrA:=cntA; + nC:=comD[0][i]; par:=parD[0][i]; + if nC=_push: if par=1: stkM[adrS]:=envB; adrS:=adrS+1; stkA[adrS]:=adrA:=cntA; stkB[adrS]:=adrB:=cntB; - elseif par=0: temp_len:=bondL; - elseif par=2: stkA[adrS+1]:=cntA; stkB[adrS+1]:=cntB; + ef par=0: temp_len:=bondL; + ef par=2: stkA[adrS+1]:=cntA; stkB[adrS+1]:=cntB; fi - elseif com=_pop: if par=1: adrA:=stkA[decr adrS]; adrB:=stkB[adrS]; envB:=stkM[adrS]; - elseif par=0: temp_len:=bondL; - elseif par=2: stkA[adrS+1]:=0; + ef nC=_pop: if par=1: adrA:=stkA[decr adrS]; adrB:=stkB[adrS]; envB:=stkM[adrS]; + ef par=0: temp_len:=bondL; + ef par=2: stkA[adrS+1]:=0; fi - elseif com=_jp_bond: termB; tempB:=getB(par); posBs:=posA[sB[tempB]]; + ef nC=_jp_bond: termB; tempB:=getB(par); posBs:=posA[sB[tempB]]; angT:=angB[tempB]; f_bra:=1; rotT:=0; - elseif com=_jp_atom: termB; adrT:=getA(par); posBs:=posA[adrT]; + ef nC=_jp_atom: termB; adrT:=getA(par); posBs:=posA[adrT]; angT:=ang_br[adrT]; f_bra:=1; rotT:=0; - elseif com=_jp_atom_abs: adrT:=par; posBs:=posA[adrT]; + ef nC=_jp_atom_abs: adrT:=par; posBs:=posA[adrT]; angT:=ang_br[adrT]; f_bra:=1; rotT:=0; temp_cntB:=cntB; - elseif com=_adj_ang: if (angT<40)or(angT>320): angT:=0; elseif angT<140: angT:=90; - elseif angT<220: angT:=180; else: angT:=270; fi - elseif com=_mk_bond: if (par=0)and(rotT<>0):par:=rotT; rotT:=0; fi add_bond(par); - elseif com=_rot_ang: angT:=(angT+par) mod 360; - elseif com=_tmp_rot: rotT:=par; - elseif (com>=_postA)and(com<=_postH): rotT:=0; - elseif com=_chg_env: envB:=par; - elseif com=_tmp_env: envT:=par; - elseif com=_set_clr: f_at:=par; if par=0: lineT:=si; lenT:=crR; rotT:=envT:=0; fi - elseif com=_cyc: f_end:=1; proc_cyc(getA(par)); - elseif com=_cyc_sB: f_end:=1; proc_cyc(sB[getB(par)]); - elseif com=_cyc_eB: f_end:=1; proc_cyc(eB[getB(par)]); - elseif com=_term: termB; -%%%%%%%%% elseif com=_stack_reset: stkA[adrS+1]:=0; + ef nC=_adj_ang: if (angT<40)or(angT>320): angT:=0; ef angT<140: angT:=90; + ef angT<220: angT:=180; else: angT:=270; fi + ef nC=_mk_bond: if (par=0)and(rotT<>0):par:=rotT; rotT:=0; fi add_bond(par); + ef nC=_rot_ang: angT:=(angT+par) mod 360; + ef nC=_tmp_rot: rotT:=par; + ef (nC>=_postA)and(nC<=_postH): rotT:=0; + ef nC=_chg_env: envB:=par; + ef nC=_tmp_env: envT:=par; + ef nC=_set_clr: f_at:=par; if par=0: lineT:=si; lenT:=crR; rotT:=envT:=0; fi + ef nC=_cyc: f_end:=1; proc_cyc(getA(par)); + ef nC=_cyc_sB: f_end:=1; proc_cyc(sB[getB(par)]); + ef nC=_cyc_eB: f_end:=1; proc_cyc(eB[getB(par)]); + ef nC=_term: termB; fi endfor enddef; @@ -790,11 +795,11 @@ def add_bond(expr m)= enddef; %================================================================================================== vardef getA(expr n)= - if n>=0: stkA[adrS+1]+n elseif n>=-999: cntA+n+1 else: stkA[adrS]+n+4095 fi + if n>=0: stkA[adrS+1]+n ef n>=-999: cntA+n+1 else: stkA[adrS]+n+4095 fi enddef; %-------------------------------------------------------------------------------------------------- vardef getB(expr n)= - if n>=1: stkB[adrS+1]+n elseif n=0: tempB elseif n>=-999: cntB+n+1 else: stkB[adrS]+n+4095 fi + if n>=1: stkB[adrS+1]+n ef n=0: tempB ef n>=-999: cntB+n+1 else: stkB[adrS]+n+4095 fi enddef; %-------------------------------------------------------------------------------------------------- def termA= if f_term=0: if f_bra=0: numS[incr cntA]:=strAT; strAT:=0; @@ -809,9 +814,9 @@ def glu_c(expr n)= if numS[n]<>0: nB:=angT mod 180; nC:=.5tbl_str_wd[numS[n]]*at %-------------------------------------------------------------------------------------------------- vardef proc_env(expr n,m,a,b)= r:=(n mod 360); if m>=sub_emb_start: parD[m][cntB-temp_cntB] else: - if m=hz:if r=0:a elseif r<=90:b elseif r<=180:a elseif r<270:b else:a fi - elseif m=vt:if r=0:b elseif r<90:a elseif r<=180:b elseif r<=271:a else:b fi - elseif (m>=-180)and(m<=180): m fi fi + if m=hz:if r=0:a ef r<=90:b ef r<=180:a ef r<270:b else:a fi + ef m=vt:if r=0:b ef r<90:a ef r<=180:b ef r<=271:a else:b fi + ef (m>=-180)and(m<=180): m fi fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def draw_atom(expr NUM,POS,ANG,STR,WD)= @@ -829,9 +834,9 @@ def draw_atom(expr NUM,POS,ANG,STR,WD)= if dx<0: if nB=par_s: k:=i+1; nC:=1; forever: exitif pic_c(i+(incr nC),STR)="}";endfor fi if nC>0: sB:=pic_c(k+(decr nC),STR); nB:=ASCII(sB); fi fi - if nB=score_u: if nE=0: nE:=-.5; else: nE:=0; fi; - elseif nB=hat: if nE=0: nE:= .5; else: nE:=0; fi; - elseif (nB<>par_s)and(nB<>par_e): + if nB=score_u: if nE=0: nE:=-.5; else: nE:=0; fi; + ef nB=hat: if nE=0: nE:= .5; else: nE:=0; fi; + ef (nB<>par_s)and(nB<>par_e): nA:=atom_wd*tbl_char_wd[nB]; if (atomfont<>"draw")and(f_MP=1): pC:=sB infont atomfont scaled (atom_wd/atomfontsize); @@ -863,52 +868,53 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def draw_bond(expr NN,BP,EP,ANG,LN)= begingroup - save ww,ap,am,hpt,Ls,Le,pA,pB,pC,pT; + save ww,ap,am,hpt,Ls,Le,pA,pB,pC,pT,nL,nC; pair Ls,Le; path pA,pB,pC,pT; %---------------------------------------------------------------------------------------------- + nL:=LN; nC:=length(posA[EP]-posA[BP]); - if (nC>0)and(LN<>0): + if (nC>0)and(nL<>0): ww:=wedge_wd; hpt:=.5bond_pen_wd; ap:=ANG+90; am:=ANG-90; if sw_numberB>=1: clipping(0,0,posA[BP],posA[EP],nC); else: clipping(numS[BP],numS[EP],posA[BP],posA[EP],nC); fi pickup pencircle scaled bond_pen_wd; if known colorB[NN]: nB:=colorB[NN]; fi %--------------------------------------------------------------------------------------------- - if (LN=si)or(sw_bond_single=1): draw pA Cp(nB); - elseif LN=dl:draw pA Cp(nB); draw sfB(pC,bondgap,ap) Cp(nB); - elseif LN=dr:draw pA Cp(nB); draw sfB(pC,bondgap,am) Cp(nB); - elseif LN=dm:draw sfB(pB,bondgap/1.75,ap) Cp(nB); draw sfB(pB,bondgap/1.75,am) Cp(nB); - elseif LN=db:if ((ANG-ang_br[BP]) mod 360)<=180: nA:=ap; else: nA:=am; fi + if (nL=si)or(sw_bond_single=1): draw pA Cp(nB); + ef nL=dl: draw pA Cp(nB); draw sfB(pC,bondgap,ap) Cp(nB); + ef nL=dr: draw pA Cp(nB); draw sfB(pC,bondgap,am) Cp(nB); + ef nL=dm: draw sfB(pB,bondgap/1.75,ap) Cp(nB); draw sfB(pB,bondgap/1.75,am) Cp(nB); + ef nL=db: if ((ANG-ang_br[BP]) mod 360)<=180: nA:=ap; else: nA:=am; fi draw pA Cp(nB); draw sfB(pC,bondgap,nA) Cp(nB); - elseif LN=tm:draw pA Cp(nB);draw sfB(pA,bondgap,ap) Cp(nB); draw sfB(pA,bondgap,am) Cp(nB); - elseif LN=wf:fill Ls--sfB(Le,ww,am)--sfB(Le,ww,ap)--cycle; - elseif LN=wb:fill sfB(Ls,ww,am)--Le--sfB(Ls,ww,ap)--cycle; - elseif LN=bd:draw pA withpen penrazor rotated ap scaled bondgap Cp(nB); - elseif LN=bz:bz_put(sfB(Ls,ww,ap),sfB(Le,ww,ap),sfB(Ls,ww,am),sfB(Le,ww,am),nB); - elseif LN=zf:wz_put(Ls,sfB(Le,ww,ap),sfB(Le,ww,am),nB); - elseif LN=zb:wz_put(Le,sfB(Ls,ww,am),sfB(Ls,ww,ap),nB); - elseif LN=dt:for i=0 step .75zebra_gap/length(Le-Ls) until 1: drawdot i[Ls,Le]; endfor - elseif LN=wv:nB:=3bond_pen_wd; nA:=nB/length(Le-Ls); + ef nL=tm: draw pA Cp(nB);draw sfB(pA,bondgap,ap) Cp(nB); draw sfB(pA,bondgap,am) Cp(nB); + ef nL=wf: fill Ls--sfB(Le,ww,am)--sfB(Le,ww,ap)--cycle; + ef nL=wb: fill sfB(Ls,ww,am)--Le--sfB(Ls,ww,ap)--cycle; + ef nL=bd: draw pA withpen penrazor rotated ap scaled bondgap Cp(nB); + ef nL=bz: bz_put(sfB(Ls,ww,ap),sfB(Le,ww,ap),sfB(Ls,ww,am),sfB(Le,ww,am),nB); + ef nL=zf: wz_put(Ls,sfB(Le,ww,ap),sfB(Le,ww,am),nB); + ef nL=zb: wz_put(Le,sfB(Ls,ww,am),sfB(Ls,ww,ap),nB); + ef nL=dt: for i=0 step .75zebra_gap/length(Le-Ls) until 1: drawdot i[Ls,Le]; endfor + ef nL=wv: nB:=3bond_pen_wd; nA:=nB/length(Le-Ls); draw Le for i=1 upto 1/nA: if odd(i): ..controls(((i-.5)*nA)[sfB(Le,nB,ap),sfB(Ls,nB,ap)]) else: ..controls(((i-.5)*nA)[sfB(Le,nB,am),sfB(Ls,nB,am)]) fi ..(i*nA)[Le,Ls] endfor ..Ls; - elseif LN=vf:draw pA Cp(nB);draw sfB(Le,bondgap,ANG-150)--Le--sfB(Le,bondgap,ANG+150) Cp(nB); - elseif LN=vb:draw pA Cp(nB);draw sfB(Ls,bondgap,ANG-30)--Ls--sfB(Ls,bondgap,ANG+30) Cp(nB); - elseif LN=si_:erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs 0.8bondgap; draw pA Cp(nB); - elseif LN=wf_:erase fill sfB(0.15[Ls,Le],.5ww,ap)--sfB(0.15[Ls,Le],.5ww,am)-- + ef nL=vf: draw pA Cp(nB);draw sfB(Le,bondgap,ANG-150)--Le--sfB(Le,bondgap,ANG+150) Cp(nB); + ef nL=vb: draw pA Cp(nB);draw sfB(Ls,bondgap,ANG-30)--Ls--sfB(Ls,bondgap,ANG+30) Cp(nB); + ef nL=si_: erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs 0.8bondgap; draw pA Cp(nB); + ef nL=wf_: erase fill sfB(0.15[Ls,Le],.5ww,ap)--sfB(0.15[Ls,Le],.5ww,am)-- sfB(0.85[Ls,Le],1.3ww,am)--sfB(0.85[Ls,Le],1.3ww,ap)--cycle; fill Ls--sfB(Le,ww,am)--sfB(Le,ww,ap)--cycle; - elseif LN=wb_:erase fill sfB(0.15[Ls,Le],1.3ww,ap)--sfB(0.15[Ls,Le],1.3ww,am)-- + ef nL=wb_: erase fill sfB(0.15[Ls,Le],1.3ww,ap)--sfB(0.15[Ls,Le],1.3ww,am)-- sfB(0.85[Ls,Le],.5ww,am)--sfB(0.85[Ls,Le],.5ww,ap)--cycle; fill sfB(Ls,ww,am)--Le--sfB(Ls,ww,ap)--cycle; - elseif LN=bd_:erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs 1.6bondgap; + ef nL=bd_: erase draw 0.15[Ls,Le]--0.85[Ls,Le] wpcs 1.6bondgap; draw pA withpen penrazor rotated ap scaled bondgap Cp(nB); fi if (sw_numberB>=1)and(NN>=numberB_start)and(NN<=numberB_end): if sw_numberB=2: nB:=NN-numberB_start+1; - elseif sw_numberB=3: if numberB_end=dl)and(lineB[j]<=dm): bondC[j]:=2; - elseif lineB[j]=tm: bondC[j]:=3; - elseif (lineB[j]=vf)or(lineB[j]=vb): bondC[j]:=0; - else: bondC[j]:=1; + if (lineB[j]>=dl)and(lineB[j]<=dm): bondC[j]:=2; + ef lineB[j]=tm: bondC[j]:=3; + ef (lineB[j]=vf)or(lineB[j]=vb): bondC[j]:=0; + else: bondC[j]:=1; fi if (sB[j]=i)or(eB[j]=i): bond_cnt:=bond_cnt+bondC[j]; fi endfor @@ -1202,19 +1224,19 @@ def proc_calc_out= if (strD[numS[i]]="C")and(bond_cnt<4): hideH[i]:=4-bond_cnt; cnt_hide_H:=cnt_hide_H+hideH[i]; else: hideH[i]:=0; fi - if strD[numS[i]]="C": bond_check(i)(1,2,3,4); - elseif strD[numS[i]]="N": bond_check(i)(3,5); - elseif strD[numS[i]]="H": bond_check(i)(1); - elseif strD[numS[i]]="O": bond_check(i)(2); - elseif strD[numS[i]]="S": bond_check(i)(2,4,6); - elseif strD[numS[i]]="P": bond_check(i)(5); - elseif strD[numS[i]]="OH": bond_check(i)(1); - elseif strD[numS[i]]="COOH": bond_check(i)(1); - elseif strD[numS[i]]="CN": bond_check(i)(1); - elseif strD[numS[i]]="N{H_2_}": bond_check(i)(1); - elseif strD[numS[i]]="F": bond_check(i)(1); - elseif strD[numS[i]]="{Cl}": bond_check(i)(1); - elseif strD[numS[i]]="{Br}": bond_check(i)(1); + if strD[numS[i]]="C": bond_check(i)(1,2,3,4); + ef strD[numS[i]]="N": bond_check(i)(3,5); + ef strD[numS[i]]="H": bond_check(i)(1); + ef strD[numS[i]]="O": bond_check(i)(2); + ef strD[numS[i]]="S": bond_check(i)(2,4,6); + ef strD[numS[i]]="P": bond_check(i)(5); + ef strD[numS[i]]="OH": bond_check(i)(1); + ef strD[numS[i]]="COOH": bond_check(i)(1); + ef strD[numS[i]]="CN": bond_check(i)(1); + ef strD[numS[i]]="N{H_2_}": bond_check(i)(1); + ef strD[numS[i]]="F": bond_check(i)(1); + ef strD[numS[i]]="{Cl}": bond_check(i)(1); + ef strD[numS[i]]="{Br}": bond_check(i)(1); fi for j=1 upto tbl_cnt: if strD[numS[i]]=tbl_atom_str[j]: @@ -1234,9 +1256,9 @@ def proc_calc_out= endfor cal_MI:=substring (0,10) of decimal(MI_num); cal_MW:=substring (0,8) of decimal(MW_num); - if sw_auxout=1: proc_auxfile_out; fi + if sw_aux_out=1: proc_auxfile_out; fi if sw_report=1: proc_report_out; fi - if sw_MOLout=1: proc_MOLfile_out; fi + if sw_mol_out>=1: proc_mol_out; fi endgroup enddef; %================================================================================================== @@ -1270,11 +1292,13 @@ def proc_report_out= message " Atom count="&fdr(3)(cntA)&" Bond count="&fdr(3)(cntB)& " Ring count="&fdr(3)(cntB-cntA+1)&" Hide H count="&fdr(3)(cnt_hide_H); message "------------------------------------------------------------------"; - message "< NO. >( x axis , y axis )< atom >< bond >< hide_H >"; + message "< NO. >( x axis , y axis )< atom >< bond >< hideH >< chg >"; for i=1 upto cntA: message " A"&fdl(4)(i)&" ("&fdr(10)(round_auto(xpart(posA[i])/bond_len))&" , "& fdr(10)(round_auto(ypart(posA[i])/bond_len))&" ) "&fixed_l(8)(strD[numS[i]])& - " "&fdr(3)(Bcnt[i]) if hideH[i]>0: &fdr(8)(hideH[i]) fi; + " "&fdr(3)(Bcnt[i]) + if hideH[i]>0: &fdr(8)(hideH[i]) else: &" " fi + if chgA[i]<>0: &fdr(8)(chgA[i]) fi; endfor message "------------------------------------------------------------------"; message "< NO. >< bond (sdt)>"; @@ -1314,20 +1338,60 @@ def proc_report_out= message "=================================================================="; enddef; %================================================================================================== -def proc_MOLfile_out= +def proc_mol_out= + save chg_cnt,chg_atm,chg_chg; + numeric chg_atm,chg_chg; + chg_cnt:=0; + %-V2000------------------------------------------------------------------------------------------ + if sw_mol_out=1: mp_log_name:=jobname&"-"&fit_zero(char_num)&decimal(char_num)&"-"&inf_EN&".mol"; printf ""; printf " -MCFtoMOL- "&fixed_l(20)(info[1]); printf ""; printf fdr(3)(cntA)&fdr(3)(cntB)&" 0 0 0 0 0 0 0 0999 V2000"; - for i=1 upto cntA: printf fdr(10)(xpart(posA[i])/bond_len)& fdr(10)(ypart(posA[i])/bond_len)& - fdr(10)(0)&" "&fixed_l(2)(stripP(strD[numS[i]]))&" 0 0 0 0"; endfor + for i=1 upto cntA: + printf fdr(10)(xpart(posA[i])/bond_len)& fdr(10)(ypart(posA[i])/bond_len)& + fdr(10)(0)&" "&fixed_l(2)(stripP(strD[numS[i]]))&" 0 0 0 0"; + if chgA[i]<>0: chg_atm[incr chg_cnt]:=i; chg_chg[chg_cnt]:=chgA[i]; fi + endfor for i=1 upto cntB: if lineB[i]<>0: if (lineB[i]=dl)or(lineB[i]=dr)or(lineB[i]=dm): nA:=2; - elseif lineB[i]=tm: nA:=3; - elseif (lineB[i]=wf)or(lineB[i]=zb)or(lineB[i]=bd): nB:=1; - elseif (lineB[i]=zf)or(lineB[i]=wb)or(lineB[i]=dt): nB:=6; - elseif lineB[i]=wv: nB:=4; else: nA:=1; nB:=0; fi - printf fdr(3)(sB[i])&fdr(3)(eB[i])&fdr(3)(nA)&fdr(3)(nB)&" 0 0"; fi endfor + ef lineB[i]=tm: nA:=3; + ef (lineB[i]=wf)or(lineB[i]=zb)or(lineB[i]=bd): nB:=1; + ef (lineB[i]=zf)or(lineB[i]=wb)or(lineB[i]=dt): nB:=6; + ef lineB[i]=wv: nB:=4; else: nA:=1; nB:=0; fi + printf fdr(3)(sB[i])&fdr(3)(eB[i])&fdr(3)(nA)&fdr(3)(nB)&" 0 0"; + fi + endfor + if chg_cnt>0: + printf "M CHG"&fdr(3)(chg_cnt) + for i=1 upto chg_cnt: &fdr(4)(chg_atm[i])&fdr(4)(chg_chg[i]) endfor; + fi printf "M END"; + %-V3000----------------------------------------------------------------------------------------- + elseif sw_mol_out=2: + mp_log_name:=jobname&"-"&fit_zero(char_num)&decimal(char_num)&"-"&inf_EN&".mol"; + printf ""; printf " -MCFtoMOL- "&fixed_l(20)(info[1]); printf ""; + printf " 0 0 0 0 0 999 V3000"; + printf "M V30 BEGIN CTAB"; + printf "M V30 COUNTS "&decimal(cntA)&" "&decimal(cntB)&" 0 0 0"; + printf "M V30 BEGIN ATOM"; + for i=1 upto cntA: + printf "M V30 "&decimal(i)&" "&stripP(strD[numS[i]])&" "& + decimal(xpart(posA[i])/bond_len)&" "&decimal(ypart(posA[i])/bond_len)&" 0 0" + if chgA[i]<>0: &" CHG="&decimal(chgA[i]) fi; + endfor + printf "M V30 END ATOM"; + printf "M V30 BEGIN BOND"; + for i=1 upto cntB: if lineB[i]<>0: + if (lineB[i]=dl)or(lineB[i]=dr)or(lineB[i]=dm): nA:=2; + ef lineB[i]=tm: nA:=3; + ef (lineB[i]=wf)or(lineB[i]=zb)or(lineB[i]=bd): nB:=1; + ef (lineB[i]=zf)or(lineB[i]=wb)or(lineB[i]=dt): nB:=6; + ef lineB[i]=wv: nB:=4; else: nA:=1; nB:=0; fi + printf "M V30 "&decimal(i)&" "&decimal(nA)&" "&decimal(sB[i])&" "&decimal(eB[i]); fi endfor + printf "M V30 END BOND"; + printf "M V30 END CTAB"; + printf "M END"; + fi enddef; %------------------------------------------------------------------------------------------------- vardef fit_zero(expr n)=if n<=9: "00" elseif n<=99: "0" fi enddef; -- cgit v1.2.3