diff options
Diffstat (limited to 'graphics/mcf2graph/mcf2graph.mp')
-rw-r--r-- | graphics/mcf2graph/mcf2graph.mp | 85 |
1 files changed, 41 insertions, 44 deletions
diff --git a/graphics/mcf2graph/mcf2graph.mp b/graphics/mcf2graph/mcf2graph.mp index d50800ebcb..a5c880ed0b 100644 --- a/graphics/mcf2graph/mcf2graph.mp +++ b/graphics/mcf2graph/mcf2graph.mp @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% mcf2graph ver 4.86 Copyright (c) 2013-2022 Akira Yamaji +% mcf2graph ver 4.87 Copyright (c) 2013-2022 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, @@ -33,9 +33,10 @@ % Set output MOL file (V3000) : mpost -s ahlength=6 FILENAME % Set output report : mpost -s ahlength=7 FILENAME %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -message "* This is mcf2graph ver 4.86 2022.07.18"; +message "* This is mcf2graph ver 4.87 2022.08.22"; tracingstats:=1; prologues:=3; warningcheck:=0; %------------------------------------------------------------------------------------------------- +newinternal string EN_; numeric save_num[],parts_com[][],parts_par[][],parts_cnt[],tbl_atom[],tbl_group[][],tbl_atom_wt[], tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[],at_char[]; string save_str[],tbl_atom_str[],str_tbl[],tag[],info_s[],arg_s[],aux_delimiter,default_library, @@ -105,6 +106,8 @@ ef bboxmargin=4: sw_output:=Fig+Calc; label.rt(inf_EN&" / "&cal_MW&" / "&decimal(num_MW-scantokens(inf_MW)),(0,0));) fi %--default outputtemplate:="%j-%3c."&"mps"------------------------------------------------ if (outputformat="eps")and(ahangle<>3): outputtemplate:="%j-%3c."&"mps"; +ef outputformat="svg": outputtemplate:="s%3c-%{EN_}.svg"; +ef outputformat="png": outputtemplate:="p%3c-%{EN_}.png"; else: outputtemplate:="%j-%3c."&outputformat; fi %----------------------------------------------------------------------------------------- if sw_output>=Info: @@ -159,21 +162,18 @@ def parameter_list= labeloffset,mangle,blength,fsize,fmargin,msize,mposition,defaultfont,atomfont,dottedline_gap, Me,Et,CH3,NH,NH2,NO,NO2,OH,CHO,COOH,CN,SH,!CH3,!NH2,!NO2,!OH,!CHO,!COOH,!CN,!SH enddef; %-------------------------------------------------------------------------------------------------- -def init_par(text t)= - nA:=nB:=nC:=0; +def init_par(text t)= nA:=nB:=nC:=0; for list=t: if numeric list: save_num[incr nA]:=list; ef pair list: save_pair[incr nB]:=list; ef string list: save_str[incr nC]:=list; fi endfor enddef; %-------------------------------------------------------------------------------------------------- -def store_par(text t)= - nA:=nB:=nC:=0; +def store_par(text t)= nA:=nB:=nC:=0; for list=t: if numeric list: if save_num[incr nA]<>list: save_num[nA]:=list; fi ef pair list: if save_pair[incr nB]<>list: save_pair[nB]:=list; fi ef string list: if save_str[incr nC]<>list: save_str[nC]:=list; fi fi endfor enddef; %-------------------------------------------------------------------------------------------------- -def restore_par(text t)= - nA:=nB:=nC:=0; +def restore_par(text t)= nA:=nB:=nC:=0; forsuffixes list=t: if numeric list: if list<>save_num[incr nA]: list:=save_num[nA]; fi ef pair list: if list<>save_pair[incr nB]: list:=save_pair[nB]; fi ef string list: if list<>save_str[incr nC]: list:=save_str[nC]; fi fi @@ -182,18 +182,16 @@ enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def beginfigm(text s)= begingroup - save ',mc,f_ext,blen,ext,add,ang_br,fw_n,bw_n,at_colon,info_cnt,group_num,bond_cntA, - warning_cnt,hideH_cnt,filter_s,mc_indent,cntM,cntA,cntB,minX,minY,maxX,maxY,posA,posM, - hideH,lineB,sB,eB,angB,angA,lenB,angX,numS,sumA,bond_num,wdM,htM,chargeA,addA,add_rot, - cal_FM,cal_MW,cal_MI,inf_Cat,inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS, - inf_USE,inf_EXA,inf_EXB,inf_MW,mol_pic,sC,sI,sS,sT,sV,color_list,unit_cnt,f_end,semic_cnt, - f_match,var_n,tag_a,var_a; + save ',mc,f_ext,blen,ext,add,ang_br,fw_n,bw_n,at_colon,info_cnt,group_num,bond_cntA,warning_cnt, + hideH,hideH_cnt,filter_s,mc_indent,cntM,cntA,cntB,minX,minY,maxX,maxY,posA,posM,lineB, + sB,eB,angB,angA,lenB,angX,numS,sumA,bond_num,wdM,htM,chargeA,addA,add_rot,cal_FM,cal_MW, + cal_MI,inf_Cat,inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW, + mol_pic,sC,sI,sS,sT,sV,color_list,unit_cnt,f_end,semic_cnt,f_match,var_n,tag_a,var_a; numeric mc_indent[],hideH[],lineB[],sB[],eB[],angB[],angA[],lenB[],angX[],strA[],sumA[], bond_num[],wdM[],htM[],chargeA[],addA[],add_rot[]; pair posA[],posM[][]; - string mc[],tag_a[],var_a[],mc,filter_s,cal_FM,cal_MW, - cal_MI,inf_Cat,inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW, - sC,sI,sS,sT,sV; + string mc[],tag_a[],var_a[],mc,filter_s,cal_FM,cal_MW,cal_MI,inf_Cat,inf_NO,inf_EN,inf_JN, + inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW,sC,sI,sS,sT,sV; picture mol_pic[]; color color_list[]; %------------------------------------------------------------------------------------------------ @@ -208,7 +206,7 @@ def beginfigm(text s)= fig_num:=fig_num+1; f_ext:=cntM:=mc_row:=info_cnt:=f_EOF:=0; %------------------------------------------------------------------------------------------------ for list=s: - at_colon:=scan_char(":",list,0,1); + at_colon:=scan_c(":",list); if at_colon=1: fw_n:=scan_char(" ",list,1,2); bw_n:=scan_char(" ",list,-1,2); mc_indent[incr mc_row]:=fw_n-2; @@ -216,12 +214,13 @@ def beginfigm(text s)= ef at_colon>=1: info_s[incr info_cnt]:=list; sT:=substring(0,at_colon-1) of list; sV:=substring(at_colon,length(list)) of list; - if sT="f": if scan_char(".",sV,0,1)=0: file_input:=sV&".mcf"; else: file_input:=sV; fi + if sT="f": if scan_c(".",sV)=0: file_input:=sV&".mcf"; else: file_input:=sV; fi ef sT="t": temps:=sV; ef sT="v": pickup_data_unit(temps,sV,1); ef sT="v+": pickup_data_unit(temps,sV,0); else: if known scantokens("inf_"&sT): scantokens("inf_"&sT):=sV; fi fi fi endfor + if inf_EN<>"-": EN_:=forbidden_to_underbar(inf_EN); fi %------------------------------------------------------------------------------------------------ mol_pic[0]:=nullpicture; enddef; @@ -295,7 +294,7 @@ def pickup_data_unit(expr t,v,f)= forever: sS:=readfrom file_input; if sS=EOF: f_EOF:=1; fi exitif f_EOF=1; if subc(1,sS)="%": - ef (subc(1,sS)="+")and(subc(2,sS)<>"-"): + ef subc(1,sS)="+": unit_cnt:=unit_cnt+1; if v="*": f_match:=1; ef t="n": if unit_cnt=var_n: f_match:=1; fi fi if f_match=1: forever: @@ -311,15 +310,13 @@ def pickup_data_unit(expr t,v,f)= f_end:=1; else: forever: - sS:=readfrom file_input; if sS=EOF: f_EOF:=1; fi exitif f_EOF=1; - exitif (substring(0,2) of sS)="+-"; + sS:=readfrom file_input; if sS=EOF: f_EOF:=1; fi exitif f_EOF=1; exitif subc(1,sS)="+"; endfor fi else: inf_num:=split_str(sS,";")(arg_s); for i=1 upto inf_num: - get_tag_var(arg_s[i])(tag_a[i],var_a[i]); - if t=tag_a[i]: if v=var_a[i]: f_match:=1; fi fi + get_tag_var(arg_s[i])(tag_a[i],var_a[i]); if t=tag_a[i]: if v=var_a[i]: f_match:=1; fi fi endfor fi exitif f_end=1; @@ -1148,17 +1145,15 @@ def warning_bond(expr a)= warning("A"&decimal(a)&" ( "&fsl(8)(str_tbl[strA[a]])&") has"&fdr(2)(bond_cntA)&" bonds"); fi enddef; %------------------------------------------------------------------------------------------------- -vardef erase_brace(expr s)= sS:=""; +vardef erase_char(expr s)= sS:=""; if (length(s)>=4)and(s<>"COOH"): - for i=1 upto length(s): - sC:=subc(i,s); - if (sC<>"{")and(sC<>"}")and(sC<>"_")and(sC<>"^")and(sC<>"+")and(sC<>"-"): sS:=sS&sC; fi - endfor sS + for i=1 upto length(s): sC:=subc(i,s); if scan_c(sC,"{}_^+-")=0: sS:=sS&sC; fi endfor sS else: s fi enddef; %------------------------------------------------------------------------------------------------- -vardef erase_space(expr t)= sS:=""; - for i=1 upto length(t): sC:=subc(i,t); if sC=" ": sS:=sS&"_"; else: sS:=sS&sC; fi endfor sS +vardef forbidden_to_underbar(expr t)= sS:=""; + for i=1 upto length(t): + sC:=subc(i,t); if scan_c(sC," &()[]{}^=;!'+,`~")>0: sS:=sS&"_"; else: sS:=sS&sC; fi endfor sS enddef; %================================================================================================= def proc_calc(expr n)= @@ -1207,7 +1202,7 @@ def proc_calc(expr n)= for i=1 upto tbl_atom_max: if sumA[i]>=1: num_MW:= num_MW+tbl_atom_wt[i]*sumA[i]; num_MI:= num_MI+tbl_atom_mi[i]*sumA[i]; - cal_FM:=cal_FM&erase_brace(tbl_atom_str[i]) if sumA[i]>=2: &decimal(sumA[i]) fi; fi + cal_FM:=cal_FM&erase_char(tbl_atom_str[i]) if sumA[i]>=2: &decimal(sumA[i]) fi; fi endfor cal_MW:=substring(0,8) of decimal(num_MW); cal_MI:=substring(0,10) of decimal(num_MI); enddef; @@ -1237,7 +1232,8 @@ def proc_info_out(expr f)= endfor ; if f=3: printf "+"; for i=1 upto mc_row: printf (substring(0,mc_indent[i]) of blanks)&mc[i]; endfor - printf "+-----------------------------------------------------------------------------"; + printf "+"; + printf "%-----------------------------------------------------------------------------"; fi enddef; %================================================================================================= @@ -1269,7 +1265,7 @@ def proc_report_out(expr f)= "],Ring["&decimal(cntB-cntA+1)&"],Hide H["&decimal(hideH_cnt)&"]"; printf "< NO. ><atom(s) >( x axis , y axis )<bond><hideH><chg>"; for i=1 upto cntA: - printf " A"&fdl(6)(i)&fsl(8)(erase_brace(str_tbl[strA[i]]))& + printf " A"&fdl(6)(i)&fsl(8)(erase_char(str_tbl[strA[i]]))& " ("&fdr(10)(round(xpart(posA[i])/blen))&" , "& fdr(10)(round(ypart(posA[i])/blen))&" ) "&fdr(4)(Bcnt[i])& iif(hideH[i]>0,fdr(6)(hideH[i])," ") @@ -1286,7 +1282,7 @@ def proc_report_out(expr f)= printf "<atom>( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]"; for i=1 upto tbl_atom_max: if sumA[i]>=1: - printf " "&fsl(5)(erase_brace(tbl_atom_str[i]))& + printf " "&fsl(5)(erase_char(tbl_atom_str[i]))& "("&fdr(9)(tbl_atom_wt[i])&")"&"["&fdr(9)(tbl_atom_mi[i])&"]"&" * "&fdr(4)(sumA[i]) &fdr(15)(tbl_atom_wt[i]*sumA[i])&"["&fdr(12)(tbl_atom_mi[i]*sumA[i])&"]"; fi endfor @@ -1302,14 +1298,14 @@ enddef; %================================================================================================= def proc_mol_out(expr n)= message "["&decimal(fig_num)&"]:"&inf_EN; - file_output:=jobname&"-"&fit_zero(fig_num)&"-"&erase_space(inf_EN)&".mol"; + file_output:=jobname&"-"&fit_zero(fig_num)&"-"&EN_&".mol"; %-V2000--------------------------------------------------------------------------------------- if n=1: printf ""; printf " -MCFtoMOL- "&fsl(20)(info_s[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])/blen)& fdr(10)(ypart(posA[i])/blen)&fdr(10)(0)&" "& - fsl(2)(erase_brace(str_tbl[strA[i]]))&" 0"&fdr(3)(bond_charge(chargeA[i]))&" 0 0"; + fsl(2)(erase_char(str_tbl[strA[i]]))&" 0"&fdr(3)(bond_charge(chargeA[i]))&" 0 0"; endfor for i=1 upto cntB: if lineB[i]<>0: printf fdr(3)(sB[i])&fdr(3)(eB[i])&fdr(3)(bond_type(lineB[i]))& @@ -1324,7 +1320,7 @@ def proc_mol_out(expr n)= 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)&" "&erase_brace(str_tbl[strA[i]])&" "& + printf "M V30 "&decimal(i)&" "&erase_char(str_tbl[strA[i]])&" "& decimal(xpart(posA[i])/blen)&" "&decimal(ypart(posA[i])/blen)&" 0 0" if chargeA[i]<>0: &" CHG="&decimal(chargeA[i]) fi; endfor @@ -1563,8 +1559,8 @@ def mc_query(text s)= sign_s[6]:=">="; %----------------------------------------------------------------------------------------------- for list=s: - at_colon:=scan_char(":",list,0,1); at_equal:=scan_char("=",list,0,1); - at_less:=scan_char("<",list,0,1); at_greater:=scan_char(">",list,0,1); + at_colon:=scan_c(":",list); at_equal:=scan_c("=",list); at_less:=scan_c("<",list); + at_greater:=scan_c(">",list); key_s:=""; %--------------------------------------------------------------------------------------------- if at_colon>=2: sign_at:=at_colon; sign_n:=0; at_n:=1; @@ -1577,8 +1573,8 @@ def mc_query(text s)= sT:=substring(0,sign_at-at_n) of list; sV:=substring(sign_at,length(list)) of list; %--------------------------------------------------------------------------------------------- if sign_n=0: - if sT="f": if scan_char(".",sV,0,1)=0: file_input:=sV&".mcf"; else: file_input:=sV; fi - ef sT="o": if scan_char(".",sV,0,1)=0: file_output:=sV&".aux"; else: file_output:=sV; fi + if sT="f": if scan_c(".",sV)=0: file_input:=sV&".mcf"; else: file_input:=sV; fi + ef sT="o": if scan_c(".",sV)=0: file_output:=sV&".aux"; else: file_output:=sV; fi ef sT="a": key_s:=sV; sort_oder:=0; ef sT="d": key_s:=sV; sort_oder:=1; fi @@ -1652,7 +1648,7 @@ def mc_query(text s)= enddef; %============================================================================================= vardef fix_num(expr s)= - sS:=s; nN:=scan_char(".",sS,0,1); + sS:=s; nN:=scan_c(".",sS); if nN=0: sS:=fsr(4)(sS); ef nN=1: sS:=" 0"&sS; ef nN=2: sS:=" "&sS; ef nN=3: sS:=" "&sS; ef nN=4: sS:=" "&sS; fi sS enddef; %------------------------------------------------------------------------------------------------- @@ -1668,6 +1664,7 @@ vardef scan_char(expr c,s,d,n)= ef d=1: for i=n upto length(s): if subc(i,s)<>c: nN:=i; fi exitif nN>0; endfor ef d=-1: for i=length(s) downto n: if subc(i,s)<>c: nN:=i; fi exitif nN>0; endfor fi nN enddef; +def scan_c(expr c,s)= scan_char(c,s,0,1) enddef; %------------------------------------------------------------------------------------------------- vardef split_str(expr s,c)(suffix v)= at_char[0]:=nN:=0; for i=1 upto length(s): if subc(i,s)=c: at_char[incr nN]:=i; fi endfor @@ -1675,5 +1672,5 @@ vardef split_str(expr s,c)(suffix v)= for i=1 upto nN: v[i]:=substring (at_char[i-1],at_char[i]-1) of s; endfor nN enddef; %------------------------------------------------------------------------------------------------- vardef get_tag_var(expr s)(suffix t,v)= - nN:=scan_char(":",s,0,1); t:=substring(0,nN-1) of s; v:=substring(nN,length(s)) of s; enddef; + nN:=scan_c(":",s); t:=substring(0,nN-1) of s; v:=substring(nN,length(s)) of s; enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |