summaryrefslogtreecommitdiff
path: root/graphics/mcf2graph/mcf2graph.mp
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/mcf2graph/mcf2graph.mp')
-rw-r--r--graphics/mcf2graph/mcf2graph.mp85
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;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%