From e986230f2f319dbec2a2ada32b09ab8f16a71356 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 11 Feb 2019 22:05:08 +0000 Subject: mcf2graph (11feb19) git-svn-id: svn://tug.org/texlive/trunk@50003 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf | 815 ++++++++++++---------- 1 file changed, 432 insertions(+), 383 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 09af723c895..0bf24fa9b01 100644 --- a/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf +++ b/Master/texmf-dist/metapost/mcf2graph/mcf2graph.mf @@ -1,5 +1,5 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% mcf2graph ver 4.35 Copyright (c) 2013-2019 Akira Yamaji +% mcf2graph ver 4.36 Copyright (c) 2013-2019 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, @@ -36,13 +36,13 @@ % Set to use plain.mp (label,arrow,atom) : mpost -s labeloffset=2 FILENAME %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% tracingstats:=1; -message " This is mcf2graph ver 4.35 2019.01"; +message " This is mcf2graph ver 4.36 2019.02"; %------------------------------------------------------------------------------------------------- -newinternal nA,nB,nC,nD,nE,nF,char_num,str_cnt,sub_usr,sub_int,tbl_cnt,sharp_char; -numeric save_para[],comD[][],parD[][],cntD[],tbl_str_wd[],tbl_atom[],tbl_subst[][],tbl_atom_wt[], +newinternal char_num,str_cnt,sub_usr,sub_int,tbl_cnt,sharp_char; +numeric save_para[],comD[][],parD[][],cntD[],tbl_atom[],tbl_subst[][],tbl_atom_wt[], tbl_atom_mi[],tbl_char_wd[],tbl_char_ht[],andA[],and_rot[],chargeA[]; -string tbl_atom_str[],strD[],var[],tag[],mp_log_name,aux_delimiter,atomfont, - save_atomfont,save_defaultfont; +string tbl_atom_str[],strD[],var[],tag[],out_file_name,out_file_aux,out_file_rep, + aux_delimiter,atomfont,save_atomfont,save_defaultfont; picture mol_stru[]; path arrow_path,arrow_head; %------------------------------------------------------------------------------------------------- @@ -56,9 +56,14 @@ for i=3 upto aux_max: var[i]:=tag[i]:=""; endfor if (known green)and(known ahlength): f_MP:=1; color color_list[]; - atomfont:=defaultfont:=""; - mp_log_name:=jobname&"-info.aux"; prologues:=3; + %----------------------------------------------------------------------------------------- + fontmapfile "pdftex.map"; + %----------------------------------------------------------------------------------------- + atomfont:=defaultfont:=""; + out_file_aux:=jobname&"-info.aux"; + out_file_rep:=jobname&"-report.txt"; + def out_file_mol= jobname&"-"&fit_zero(char_num)&"-"&inf_EN&".mol" enddef; %-- default bboxmargin=2------------------------------------------------------------------ if bboxmargin=0: def shipit = enddef; % No image file elseif bboxmargin=1: proc_end:=1; % output first font only @@ -74,39 +79,40 @@ if (known green)and(known ahlength): elseif ahangle=13: outputformat:="png"; hppp:=vppp:=0.06; % png format(1200dpi) fi %--default ahlength=4--------------------------------------------------------------------- - if ahlength=1: sw_aux_out:=1; % output aux - elseif ahlength=2: sw_rep_out:=1; % output report - elseif ahlength=5: sw_mol_out:=1; % output MOL V2000 - elseif ahlength=6: sw_mol_out:=2; % output MOL V3000 + if ahlength=1: sw_aux_out:=1; def shipit = enddef; % output aux file + elseif ahlength=2: sw_rep_out:=1; def shipit = enddef; % output report + elseif ahlength=5: sw_mol_out:=1; def shipit = enddef; % output MOL(V2000) + elseif ahlength=6: sw_mol_out:=2; def shipit = enddef; % output MOL(V3000) fi %--default labeloffset=3------------------------------------------------------------------ if labeloffset=1: sw_arrow:=1; defaultfont:="uhvr8r"; % plain.mp label elseif labeloffset=2: sw_arrow:=1; defaultfont:=atomfont:="uhvr8r"; % plain.mp label,atom fi - %----------------------------------------------------------------------------------------- + %--default outputtemplate:="%j-%3c."&"mps"------------------------------------------------ if (outputformat="eps")and(ahangle<>3): outputtemplate:="%j-%3c."&"mps"; else: outputtemplate:="%j-%3c."&outputformat; fi + %----------------------------------------------------------------------------------------- def beginchar(expr a,b,c,d)= beginfig(a) w:=b*pt; h:=c*pt; enddef; def endchar = endfig enddef; - def printf expr s= write s to mp_log_name enddef; + def printf expr s= write s to out_file_name enddef; def # = enddef; def Cp(expr s) = if known s: if s<>0: withcolor color_list[s] fi fi enddef; if atomfont="": atomfont:="draw"; fi % default atom font if defaultfont="": defaultfont:="draw"; fi % default label font + %----------------------------------------------------------------------------------------- else: f_MP:=0; string defaultfont; dotlabeldiam:=3bp; def Cp(expr s) = enddef; def color = transform enddef; - def printf expr s= message s enddef; sw_arrow:=0; - %----------------------------------------------------------------------- atomfont:="draw"; defaultfont:="draw"; mode_setup; 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 ef=elseif; @@ -117,8 +123,9 @@ 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; -offset_atom:=0.8pt; offset_wedge:=0.4pt; thickness_font_frame:=0.2pt; +offset_thickness:=0.2bp; offset_bond_gap:=0.3bp; offset_zebra_gap:=0.1bp; +offset_atom:=0.8pt; offset_wedge:=0.4bp; +thickness_font_frame:=0.2bp; thickness_atom_frame:=0.1bp; max_bond_length:=10mm; bond_len:=8mm; font_wd:=30mm; font_ht:=20mm; %================================================================================================== @@ -126,7 +133,6 @@ ahangle:=45; ahlength:=4bp; bboxmargin:=2bp; defaultsize:=8bp; -atomfontsize:=8bp; defaultscale:=1; labeloffset:=3bp; ext_defaultline:=0.5bp; @@ -151,12 +157,15 @@ def parameter_list= 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, - atomfontsize,defaultsize,defaultscale,labeloffset, + defaultsize,defaultscale,labeloffset, Me,Et,Pr,Bu,iPr,tBu,CH3,CF3,CCl3,CBr3,NH,NH2,NO2,OH,CHO,COOH,CN,SH,OMe,OEt,SMe,SEt, !CH3,!NH2,!OH,!CHO,!COOH,!CN,!SH,!NO2 enddef; %-------------------------------------------------------------------------------------------------- +def ]]]=] ] ] enddef; +vardef iif(expr a,b,c)=if a: b else: c fi enddef; vardef pic_c(expr i,s)= substring(i,i+1) of s enddef; +vardef sfB(expr a,b,c)= a shifted ((b,0) rotated c) enddef; %-------------------------------------------------------------------------------------------------- def store_par(text t)= nA:=0; for list=t: nA:=nA+1; if save_para[nA]<>list: save_para[nA]:=list; fi endfor @@ -166,28 +175,29 @@ def restore_par(text t)= enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def beginfont(text s)= - char_num:=char_num+1; - store_par(parameter_list); - save_atomfont:=atomfont; - save_defaultfont:=defaultfont; begingroup save cntA,cntB,cntM,minX,minY,f_beginchar,numS,sftX,sftY,f_ext, cal_FM,cal_MW,cal_MW_str,cal_MI,cal_MI_str,wdM,htM, inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW, - posBs,posBe,posA,posM,lineB,sB,eB,angB,angA,lenB,ang_br,info,pT; - numeric lineB[],sB[],eB[],angB[],angA[],lenB[],ang_br[],numS[],wdM[],htM[]; - pair posA[],posM[][],pT,posBs,posBe; + posA,posM,lineB,sB,eB,angB,angA,wdA,dxA,lenB,ang_br,info; + numeric lineB[],sB[],eB[],angB[],angA[],lenB[],angX[],numS[],wdM[],htM[],wdA[],dxA[],dx_A[]; + pair posA[],posM[][]; string info[],cal_FM,cal_MW,cal_MW_str,cal_MI,cal_MI_str, inf_NO,inf_EN,inf_JN,inf_FM,inf_CAS,inf_USE,inf_EXA,inf_EXB,inf_MW; %------------------------------------------------------------------------------------------------ + char_num:=char_num+1; + store_par(parameter_list); + save_atomfont:=atomfont; + save_defaultfont:=defaultfont; + %------------------------------------------------------------------------------------------------ for i:=1 upto max_inf_num: info[i]:=":"; endfor f_ext:=inf_num:=cntM:=0; for list=s: inf_num:=inf_num+1; info[inf_num]:=list; endfor enddef; %================================================================================================== def endfont= - if sw_clip>0: - nA:=4095; nB:=-4095; nC:=4095; nD:=-4095; + if sw_clip>=1: + nA:=nC:=4095; nB:=nD:=-4095; for i=1 upto cntM: if xpart(posM[1][i])nB: nB:=xpart(posM[2][i]); fi @@ -196,8 +206,7 @@ def endfont= endfor font_wd:=nB-nA+2margin_left_right; font_ht:=nD-nC+2margin_top_bottom; - for i=1 upto cntM: - posM[0][i]:=posM[0][i]+(margin_left_right-nA,margin_top_bottom-nC); + for i=1 upto cntM: posM[0][i]:=posM[0][i]+(margin_left_right-nA,margin_top_bottom-nC); endfor fi %----------------------------------------------------------------------------------------------- @@ -205,8 +214,7 @@ def endfont= if (sw_font_frame=1)or(sw_font_frame=3): draw_frame((0,0),w,h,thickness_font_frame); fi if (sw_font_frame=2)or(sw_font_frame=3): nA:=w-2margin_left_right; nB:=h-2margin_top_bottom; - pT:=(margin_left_right,margin_top_bottom); - draw_frame(pT,nA,nB,thickness_font_frame); fi + draw_frame((margin_left_right,margin_top_bottom),nA,nB,thickness_font_frame); fi if sw_font_frame=4: draw_corner(w,h,thickness_font_frame); fi for i=1 upto cntM: addto currentpicture also mol_stru[i] shifted posM[0][i]; mol_stru[i]:=nullpicture; @@ -214,10 +222,10 @@ def endfont= if f_ext=1: addto currentpicture also mol_stru[0]; mol_stru[0]:=nullpicture; fi endchar; clearit; - endgroup; restore_par(parameter_list); atomfont:=save_atomfont; defaultfont:=save_defaultfont; + endgroup; if proc_end=1: scantokens("bye"); fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -245,7 +253,7 @@ def set_def_MC= def | == (_push,2) enddef; def || == (_pop,2) enddef; def /secondary n == (_postA,n) enddef; def //secondary n == (_postB,n) enddef; def */secondary n == (_postC,n) enddef; def /*secondary n == (_postD,n) enddef; - def **secondary n == (_postF,n) enddef; def */*secondary n == (_postG,n) enddef; + def **secondary n == (_postF,n) enddef; def */*secondary n == (_postG,n) enddef; enddef; %================================================================================================= vardef '(text TXT)= ''(incr sub_usr)(TXT); sub_usr enddef; @@ -278,7 +286,6 @@ def ''(expr ADR)(text TXT)= cntD[ADR]:=cntD[ADR]+1; comD[ADR][cntD[ADR]]:=_set_atom; parD[ADR][cntD[ADR]]:=str_cnt; - if pic_c(0,list)=="{":: tbl_str_wd[str_cnt]:=1.6; else:: tbl_str_wd[str_cnt]:=1; fi fi fi endfor @@ -371,6 +378,39 @@ vardef change_atom(expr a,b)= sub_int %------- Retern value ------- enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def puts(expr POS)(expr STR)= + begingroup + save pA,sA,bA,nB,nC; + pair pA; + string sA; + picture bA; + pA:=POS; + nB:=defaultscale*defaultsize; + nC:=0; + %------------------------------------------------------------------------------------------------ + for i=0 upto length(STR)-1: + sA:=pic_c(i,STR); + if sw_label_emu=1: + if sA="_": nC:=iif(nC=-0.5,0,-0.5); + elseif sA="^": nC:=iif(nC= 0.5,0, 0.5); + else: + if defaultfont="draw": + draw_char(sA,pA+(0,nB*nC),nB,ratio_thickness_char*defaultscale*defaultsize,0); + pA:=pA+(nB*tbl_char_wd[ASCII(sA)],0); + else: + bA:=sA infont defaultfont scaled defaultscale; + addto currentpicture also bA shifted (pA+(0,nB*nC)); + pA:=pA+(lrcorner bA-llcorner bA); + fi + fi + else: + draw_char(sA,pA,nB,ratio_thickness_char*defaultscale*defaultsize,0); + pA:=pA+(nB*tbl_char_wd[ASCII(sA)],0); + fi + endfor + endgroup; +enddef; +%================================================================================================== def ext_setup= pickup pencircle scaled ext_defaultline; dotlabeldiam:=3bp; @@ -414,54 +454,19 @@ def ext(text TXT)= ext_setup; w:=mol_wd; h:=mol_ht; l:=bond_len; aw:=atom_wd; p0:=(minX,minY); An:=cntA; Bn:=cntB; - for i=1 upto An: A[i]:=posA[i]; A[i]dir:=ang_br[i]; endfor + for i=1 upto An: A[i]:=posA[i]; A[i]dir:=angX[i]; endfor for i=1 upto Bn: B[i]s:=posA[sB[i]]; B[i]e:=posA[eB[i]]; B[i]:=0.5[B[i]s,B[i]e]; B[i]dir:=angB[i]; endfor TXT addto mol_stru[cntM] also currentpicture; clearit; endgroup; enddef; -%================================================================================================== -def ext_puts(expr POS)(expr STR)= - begingroup - save cp,sA,pC,nB,nC; - pair cp; - string sA; - picture pC; - cp:=POS; - nB:=defaultscale*defaultsize; - nC:=0; - %------------------------------------------------------------------------------------------------ - for i=0 upto length(STR)-1: - sA:=pic_c(i,STR); - nA:=ASCII(sA); - if sw_label_emu=1: - if sA="_": if nC=-0.5: nC:=0; else: nC:=-0.5; fi - 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,ratio_thickness_char*defaultscale*defaultsize,0); - cp:=cp+(nB*tbl_char_wd[nA],0); - else: - pC:=sA infont defaultfont scaled defaultscale; - addto currentpicture also pC shifted (cp+(0,nB*nC)); - cp:=cp+(lrcorner pC-llcorner pC); - fi - fi - else: - draw_char(sA,cp,nB,ratio_thickness_char*defaultscale*defaultsize,0); - cp:=cp+(nB*tbl_char_wd[nA],0); - fi - endfor - endgroup; -enddef; %-------------------------------------------------------------------------------------------------- vardef label_emu@#(expr STR,POS) = %% modified 'thelabel@#(expr s,z)' of plain.mp - begingroup - save oft,fx,fy,wds,sC,pC; + save oft,fx,fy,wds,sC,bA; pair oft,oft.lft,oft.rt,oft.top,oft.bot,oft.ulft,oft.llft,oft.urt,oft.lrt; string sC; - picture pC; + picture bA; wds:=0; for i=0 upto length(STR)-1: sC:=pic_c(i,STR); @@ -469,8 +474,8 @@ vardef label_emu@#(expr STR,POS) = %% modified 'thelabel@#(expr s,z)' of plain.m if (defaultfont="draw")or(f_MP=0): wds:=wds+defaultscale*defaultsize*tbl_char_wd[ASCII(sC)]; else: - pC:=sC infont defaultfont scaled defaultscale; - wds:=wds+xpart(lrcorner pC-llcorner pC); + bA:=sC infont defaultfont scaled defaultscale; + wds:=wds+xpart(lrcorner bA-llcorner bA); fi fi endfor @@ -483,13 +488,11 @@ vardef label_emu@#(expr STR,POS) = %% modified 'thelabel@#(expr s,z)' of plain.m oft.urt:= ( .7, .7); fx.urt:=0; fy.urt:=0; oft.llft:=(-.7,-.7); fx.llft:=1; fy.llft:=1; oft.lrt:= ( .7,-.7); fx.lrt:=0; fy.lrt:=1; - ext_puts(POS+(labeloffset*oft@#)-(wds*fx@#,defaultscale*defaultsize*fy@#))(STR); - endgroup + puts(POS+(labeloffset*oft@#)-(wds*fx@#,defaultscale*defaultsize*fy@#))(STR); enddef; %------------------------------------------------------------------------------------------------- vardef dotlabel_emu@#(expr STR,POS)= - label_emu@#(STR,POS); - draw POS withpen pencircle scaled dotlabeldiam; + label_emu@#(STR,POS); draw POS withpen pencircle scaled dotlabeldiam; enddef; %================================================================================================== def drawarrow_emu expr PAT = arrow_path:=PAT; draw_arrow enddef; @@ -546,8 +549,8 @@ def MCd(expr RW,RH)(expr FW,FH)(text TXT)= 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,sA,sC,sD,pA, - op_com,op_par,op_cnt,crR,colorA,colorB,PA,PO,PP,PX; + maxX,maxY,f_char,ps_adr,ps_com,sA,sC,sD,pA,pB,factor, + op_com,op_par,op_cnt,crR,colorA,colorB,PA,PO,PP,PX,defaultsize,defaultscale; %----------------------------------------------------------------------------------------------- def PA= sub_add enddef; def PO= sub_add_op enddef; @@ -557,46 +560,98 @@ def MCd(expr RW,RH)(expr FW,FH)(text TXT)= numeric stkB[],stkA[],stkL[],stkM[],f_char[],ps_adr[],ps_com[],colorA[],colorB[], op_com[][],op_par[][],op_cnt[]; string sA,sC,sD; - pair pA; + pair pA,pB; %----------------------------------------------------------------------------------------------- if (sw_numberA>=1)or(sw_numberB>=1): ratio_atom_bond:=0.25; 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("^"); cntA:=cntB:=cntP:=cntC:=0; strD[0]:=""; str_cnt:=2000; crR:=-ratio_chain_ring; %=============================================================================================== ''(0)(TXT,(_term,0)); + %----------------------------------------------------------------------------------------------- proc_bond_atom(1); - if (cntP>0)and(sw_subst_off=0): ps_get(1); fi + %----------------------------------------------------------------------------------------------- + if (cntP>0)and(sw_subst_off=0): post_get(1); fi + %----------------------------------------------------------------------------------------------- char_use_check; + %-scaling--------------------------------------------------------------------------------------- if sw_solid=1: bond_len:=font_wd*ratio_bond_width; proc_size_setup; proc_skeleton; proc_scaling; elseif sw_solid=2: proc_size_setup; proc_skeleton; proc_scaling; else: - bond_len:=3mm; proc_size_setup; - for i=1 upto 6: proc_skeleton; proc_scaling; + bond_len:=3mm; + proc_size_setup; + for i=1 upto 6: + proc_skeleton; proc_scaling; if (mol_ht/mol_wd)>(font_ht/font_wd): factor:=(font_ht*RH-2margin_top_bottom)/mol_ht; - else: factor:=(font_wd*RW-2margin_left_right)/mol_wd; fi - exitif factor=1; - bond_len:=bond_len*factor; proc_size_setup; + else: factor:=(font_wd*RW-2margin_left_right)/mol_wd; + fi + exitif (factor>=1-eps)and(factor<=1+eps); + bond_len:=bond_len*factor; + proc_size_setup; endfor if bond_len>max_bond_length: bond_len:=max_bond_length; proc_size_setup; proc_skeleton; proc_scaling; fi fi - %----------------------------------------------------------------------------------------------- - for i=1 upto cntB: if lineB[i]=si_: draw_bond(i,sB[i],eB[i],angB[i],lineB[i]); fi endfor - %----------------------------------------------------------------------------------------------- - proc_draw_atom; - proc_draw_charge; + %-draw atom-------------------------------------------------------------------------------------- + if (sw_numberA=0)and(sw_numberB=0): for i=1 upto cntA: draw_atom(i); endfor fi + %-draw charge------------------------------------------------------------------------------------ + for i=1 upto cntA: + if andA[i]<>0: + sA:=char(andA[i]); nA:=angX[i]+and_rot[i]; nC:=nA mod 90; + if numS[i]=0: nB:=.5atom_wd; + else: nB:=.85atom_wd+iif(nC<45,sind(nC),cosd(nC))*.5atom_wd; + fi + pA:=sfB(posA[i]-(.35atom_wd,.35atom_wd),nB,nA); + draw_char(sA,pA,atom_wd,bond_pen_wd*ratio_char_bond,0); + else: sA:=""; + fi + nA:=length(strD[numS[i]]); sC:=substring(nA-3,nA-2) of strD[numS[i]]; + if (sA="+")or(sC="+"): chargeA[i]:=1; ef (sA="-")or(sC="-"): chargeA[i]:=-1; + else: chargeA[i]:=0; + fi + endfor + %-draw bond------------------------------------------------------------------------------------- + for i=1 upto cntB: if lineB[i]=si_: draw_bond(i); fi endfor + %-atom numbering-------------------------------------------------------------------------------- + if sw_numberA>=1: + for i=1 upto cntA: + if (i>=numberA_start)and(i<=numberA_end): + if sw_numberA=2: nA:=i-numberA_start+1; + elseif sw_numberA=3: nA:=iif(numberA_end=1: + for i=1 upto cntB: + if (i>=numberB_start)and(i<=numberB_end): + if sw_numberB=2: nB:=i-numberB_start+1; + elseif sw_numberB=3: nB:=iif(numberB_end0: PO(_tmp_line,lineT) fi if rotT<>0: PO(_rot_ang,rotT) fi if lenT<>crR: PO(_chg_len,lenT) fi @@ -623,9 +680,10 @@ def ps_put= if f_lenT=0: lenT:=crR; fi if f_rotT=0: rotT:=0; fi if f_envT=0: envT:=hz; fi + endgroup enddef; %------------------------------------------------------------------------------------------------- -def ps_get(expr n)= +def post_get(expr n)= sub_int:=0; nA:=cntP; nB:=cntD[0]; for i=n upto cntP: @@ -634,21 +692,24 @@ def ps_get(expr n)= for j=1 upto cntD[ps_com[i]]: PA(comD[ps_com[i]][j],parD[ps_com[i]][j]) endfor PA(_pop,1) PA(_term,0) endfor - proc_bond_atom(nB+1); if cntP>nA: ps_get(nA+1); fi + proc_bond_atom(nB+1); if cntP>nA: post_get(nA+1); fi enddef; %------------------------------------------------------------------------------------------------- def draw_frame(expr PS,LX,LY,PN)= - draw ((0,0)--(LX,0)--(LX,LY)--(0,LY)--cycle) shifted PS wpss PN; + draw ((0,0)--(LX,0)--(LX,LY)--(0,LY)--cycle) shifted PS withpen pensquare scaled PN; enddef; %------------------------------------------------------------------------------------------------- def draw_corner(expr LX,LY,PN)= - drawdot(0,0) wpss PN; drawdot(LX,0) wpss PN; drawdot(LX,LY) wpss PN; drawdot(0,LY) wpss PN; + drawdot(0,0) withpen pensquare scaled PN; drawdot(LX,0) withpen pensquare scaled PN; + drawdot(LX,LY) withpen pensquare scaled PN; drawdot(0,LY) withpen pensquare scaled PN; enddef; %------------------------------------------------------------------------------------------------- def proc_size_setup= if (bond_len*ratio_atom_bond+offset_atom)<.8bond_len: - atom_wd:=bond_len*ratio_atom_bond+offset_atom; - else: atom_wd:=.8bond_len; ratio_chain_ring:= .5; fi + atom_wd:=bond_len*ratio_atom_bond+offset_atom; + else: + atom_wd:=.8bond_len; ratio_chain_ring:= .5; + fi wedge_wd:= bond_len*ratio_wedge_bond+offset_wedge; zebra_gap:= bond_len*ratio_zebragap_bond+offset_zebra_gap; bondgap:= bond_len*ratio_bondgap_bond+offset_bond_gap; @@ -656,28 +717,35 @@ def proc_size_setup= enddef; %------------------------------------------------------------------------------------------------- def proc_scaling= + begingroup + save nU,nD,nP,nL,nR,xpos,ypos; minX:=minY:=4095.999; - max_x:=max_y:=-4095.999; + maxX:=maxY:=-4095.999; for i=1 upto cntA: - xpos:=xpart(posA[i]); ypos:=ypart(posA[i]); - if numS[i]<>0: str_len:=nC:=nD:=0; + xpos:=xpart(posA[i]); + ypos:=ypart(posA[i]); + if numS[i]<>0: + nU:=nD:=nP:=nL:=nR:=0; for j=0 upto length(strD[numS[i]])-1: - nA:=ASCII(pic_c(j,strD[numS[i]])); - if (nA=score_u)or(nA=hat)or(nA=par_s)or(nA=par_e): - if (nA=hat)and(nC<.5atom_wd): nC:=.5atom_wd; fi; - if (nA=score_u)and(nD<.5atom_wd): nD:=.5atom_wd; fi; - else: str_len:=str_len+atom_wd*tbl_char_wd[nA]; fi + sA:=pic_c(j,strD[numS[i]]); + if (sA="^"): nU:=.5atom_wd; + elseif (sA="_"): nD:=.5atom_wd; + elseif (sA<>"{")and(sA<>"}"): nP:=nP+atom_wd*tbl_char_wd[ASCII(sA)]; + fi endfor - str_ang:=(ang_br[i] mod 360); nF:=str_len; - if (str_ang<=91)or(str_ang>=269): nF:=0; else: str_len:=0; fi - if (xpos-nF+.5atom_wd)max_x: max_x:=xpos+str_len-.5atom_wd; fi + if (angX[i]<=90.1)or(angX[i]>=269.9): nR:=nP; else: nL:=nP; fi + if (xpos-nL+.5atom_wd)maxX: maxX:=xpos+nR-.5atom_wd; + fi if (ypos-nD-.5atom_wd)max_y: max_y:=ypos+nC+.5atom_wd; fi - else: if xposmax_x: max_x:=xpos; fi - if yposmax_y: max_y:=ypos; fi fi + elseif (ypos+nU+.5atom_wd)>maxY: maxY:=ypos+nU+.5atom_wd; + fi + else: if xposmaxX: maxX:=xpos; fi + if yposmaxY: maxY:=ypos; fi + fi endfor - mol_wd:=max_x-minX; mol_ht:=max_y-minY; + mol_wd:=maxX-minX; mol_ht:=maxY-minY; + endgroup enddef; %------------------------------------------------------------------------------------------------- def char_use_check= @@ -692,44 +760,6 @@ def char_use_check= endfor fi enddef; -%----------------------------------------------------------------------------------------------- -def proc_draw_atom= - for i=1 upto cntA: - 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: - else: draw_atom(i,posA[i],ang_br[i],strD[numS[i]],tbl_str_wd[numS[i]]); fi - endfor -enddef; -%------------------------------------------------------------------------------------------------- -def proc_draw_charge= - for i=1 upto cntA: - if andA[i]<>0: - sA:=char(andA[i]); - nA:=ang_br[i]+and_rot[i]; - nC:=nA mod 90; - if strD[numS[i]]="": nB:=.5atom_wd; - else: - if nC<45: nB:=.85atom_wd+sind(nC)*.5atom_wd; - else: nB:=.85atom_wd+cosd(nC)*.5atom_wd; - fi - fi - pA:=sfB(posA[i]-(.35atom_wd,.35atom_wd),nB,nA); - draw_char(sA,pA,atom_wd,bond_pen_wd*ratio_char_bond,0); - else: sA:=""; - fi - nA:=length(strD[numS[i]]); - sC:=substring(nA-3,nA-2) of strD[numS[i]]; - if (sA="+")or(sC="+"): chargeA[i]:=1; - ef (sA="-")or(sC="-"): chargeA[i]:=-1; - else: chargeA[i]:=0; - fi - endfor -enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def proc_bond_atom(expr n)= f_bra:=f_end:=f_term:=rotT:=adrS:=f_lineT:=f_rotT:=f_lenT:=f_envT:=envT:=envB:=strAT:=f_at:=0; @@ -743,21 +773,21 @@ def proc_bond_atom(expr n)= elseif par=0: temp_len:=bondL; elseif par=2: stkA[adrS+1]:=cntA; stkB[adrS+1]:=cntB; fi - ef nC=_pop: if par=1: adrS:=adrS-1; adrA:=stkA[adrS]; adrB:=stkB[adrS]; bondL:=stkL[adrS]; - ef par=0: bondL:=temp_len; - ef par=2: stkA[adrS+1]:=0; - fi + ef nC=_pop: if par=1: adrS:=adrS-1; adrA:=stkA[adrS]; adrB:=stkB[adrS]; bondL:=stkL[adrS]; + ef par=0: bondL:=temp_len; + ef par=2: stkA[adrS+1]:=0; + 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=_postA: post_put; + ef nC=_postB: lineT:=dm; post_put; + ef nC=_postC: lineT:=wf; post_put; + ef nC=_postD: lineT:=zf; post_put; + ef nC=_postE: lineT:=nl; post_put; + ef nC=_postF: lineT:=0; post_put; + ef nC=_postG: lineT:=wv; post_put; + ef nC=_postH: lineT:=nl; lenT:=_size_a; post_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; @@ -790,8 +820,7 @@ def proc_bond_atom(expr n)= ef nC=_set_colorA: colorA[getA(adrT)]:=par; ef nC=_set_colorB: colorB[getB(adrT)]:=par; ef nC=_set_and: andAT:=par; - ef nC=_chg_charge: andA[getA(par)]:=andAT; andAT:=0; - if rotT<>0: and_rot[getA(par)]:=rotT; fi + ef nC=_chg_charge: andA[getA(par)]:=andAT; andAT:=0; if rotT<>0: and_rot[getA(par)]:=rotT; fi fi endfor enddef; @@ -807,35 +836,37 @@ def add_atom= if f_MP=1: colorA[cntA]:=colorB[cntA]:=0; fi else: f_bra:=0; fi if f_end=0: eB[cntB]:=cntA+1; f_term:=0; else: eB[cntB]:=f_end; f_end:=0; f_term:=1; fi enddef; -%------------------------------------------------------------------------------------------------- +%-------------------------------------------------------------------------------------------------- def check_adrA(expr n)= - if (if f_term=0: n>(cntA+1) else: n>cntA fi)or(n<=0): errmessage("adrA=[ "&decimal(n)&" ]"); fi -enddef; + if (n>iif(f_term=0,cntA+1,cntA))or(n<=0): errmessage("adrA=[ "&decimal(n)&" ]"); fi enddef; def check_adrB(expr n)= if (n>cntB)or(n<=0): errmessage("adrB=[ "&decimal(n)&" ]"); fi enddef; -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def proc_skeleton= + begingroup + save posBs,posBe,nC; + pair posBs,posBe; adrA:=adrB:=cntA:=cntB:=angT:=adrS:=f_end:=f_bra:=rotT:=f_term:=f_at:=0; envT:=envB:=f_lineT:=f_rotT:=f_lenT:=f_envT:=stkM[0]:=0; lineT:=si; - angA[0]:=angB[0]:=ang_br[0]:=0; posA[0]:=posBs:=posBe:=(0,0); + angA[0]:=angB[0]:=angX[0]:=0; posA[0]:=posBs:=posBe:=(0,0); for i=0 upto 5: stkA[i]:=stkB[i]:=0; endfor - %---------------------------------------------------------------------------------------------- + %----------------------------------------------------------------------------------------------- for i=1 upto cntD[0]: 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; - ef par=0: temp_len:=bondL; - ef par=2: stkA[adrS+1]:=cntA; stkB[adrS+1]:=cntB; - fi - ef nC=_pop: if par=1: adrS:=adrS-1; adrA:=stkA[adrS]; adrB:=stkB[adrS]; envB:=stkM[adrS]; - ef par=0: temp_len:=bondL; - ef par=2: stkA[adrS+1]:=0; - fi + ef par=0: temp_len:=bondL; + ef par=2: stkA[adrS+1]:=cntA; stkB[adrS+1]:=cntB; + fi + ef nC=_pop: if par=1: adrS:=adrS-1; adrA:=stkA[adrS]; adrB:=stkB[adrS]; envB:=stkM[adrS]; + ef par=0: temp_len:=bondL; + ef par=2: stkA[adrS+1]:=0; + fi ef nC=_jp_bond: termB; tempB:=getB(par); posBs:=posA[sB[tempB]]; angT:=angB[tempB]; f_bra:=1; rotT:=0; ef nC=_jp_atom: termB; adrT:=getA(par); posBs:=posA[adrT]; - angT:=ang_br[adrT]; f_bra:=1; rotT:=0; + angT:=angX[adrT]; f_bra:=1; rotT:=0; ef nC=_jp_atom_abs: adrT:=par; posBs:=posA[adrT]; - angT:=ang_br[adrT]; f_bra:=1; rotT:=0; temp_cntB:=cntB; + angT:=angX[adrT]; f_bra:=1; rotT:=0; temp_cntB:=cntB; 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); @@ -851,27 +882,34 @@ def proc_skeleton= ef nC=_term: termB; fi endfor + endgroup enddef; %------------------------------------------------------------------------------------------------- def add_bond(expr ROT)= - if ROT=_arg_ang: nA:=proc_env(angT,envB,60,-60); else: nA:=ROT; fi + begingroup + save nA,nB; + if ROT=_arg_ang: nA:=proc_env(angT,envB); else: nA:=ROT; fi if f_bra=0: adrT:=cntA:=cntA+1; posA[cntA]:=posBs; angA[cntA]:=angT; - if nA>=0: ang_br[cntA]:=angT+nA/2-90; else: ang_br[cntA]:=angT+nA/2+90; fi + angX[cntA]:=(angT+nA/2+iif(nA>=0,-90,90)) mod 360; else: f_bra:=0; fi angB[cntB+1]:=angT:=(angT+nA) mod 360; if f_end=0: if lenB[cntB+1]=_size_a: posBe:=sfB(posBs,atom_wd,angT); else: - nA:=lenB[cntB+1]; glu:=0; if nA<0: nA:=-nA; glu_c(adrT); glu_c(cntA+1); fi - posBe:=sfB(posBs,nA*bond_len+glu,angT); + nA:=lenB[cntB+1]; + if nA<0: nB:=glu_atom(adrT)+glu_atom(cntA+1); nA:=abs(nA); + else: nB:=0; + fi + posBe:=sfB(posBs,nA*bond_len+nB,angT); fi posA[cntA+1]:=posBe; f_term:=0; else: f_end:=0; f_term:=1; fi cntB:=cntB+1; posBs:=posBe; + endgroup enddef; %================================================================================================== vardef getA(expr ADR)= @@ -896,162 +934,156 @@ enddef; %-------------------------------------------------------------------------------------------------- def termB= if f_term=0: - if f_bra=0: cntA:=cntA+1; ang_br[cntA]:=angT; else:f_bra:=0; fi + if f_bra=0: cntA:=cntA+1; angX[cntA]:=angT mod 360; else:f_bra:=0; fi f_term:=1; fi enddef; %-------------------------------------------------------------------------------------------------- def proc_cyc(expr ADR)= add_bond(angle(posA[ADR]-posBs)-angT); enddef; %-------------------------------------------------------------------------------------------------- -def glu_c(expr NUM)= +vardef glu_atom(expr NUM)= + save nB,nC; if numS[NUM]<>0: - nB:=angT mod 90; - nC:=0.5tbl_str_wd[numS[NUM]]*atom_wd; - if nB<45: glu:=glu+((sind(nB)*nC)++nC); - else: glu:=glu+((cosd(nB)*.5atom_wd)++.5atom_wd); - fi + nB:=angT mod 90; nC:=0.5atom_wd; + (iif(nB<45,sind(nB),cosd(nB))*nC)++nC + else: 0 fi enddef; %-------------------------------------------------------------------------------------------------- -vardef proc_env(expr ANG,ENV,CCW,CWS)= +vardef proc_env(expr ANG,ENV)= + save nA,nCW,nCC; + nCC:=60; nCW:=-nCC; nA:=(ANG mod 360); if ENV>=sub_emb_start: parD[ENV][cntB-temp_cntB] else: - if ENV=hz: if nA=0:CCW ef nA<=90:CWS ef nA<=180:CCW ef nA<270:CWS else:CCW fi - ef ENV=vt: if nA=0:CWS ef nA<90:CCW ef nA<=180:CWS ef nA<=271:CCW else:CWS fi + if ENV=hz: if nA=0:nCC ef nA<=90:nCW ef nA<=180:nCC ef nA<270:nCW else:nCC fi + ef ENV=vt: if nA=0:nCW ef nA<90:nCC ef nA<=180:nCW ef nA<=270:nCC else:nCW fi ef (ENV>=-180)and(ENV<=180): ENV fi fi enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -def draw_atom(expr NUM,POS,ANG,STR,WD)= +def draw_atom(expr NUM)= begingroup - save pA,pT,pC,sB,dx,nB,nC,nE; - string sB; - pair pA,pT; - picture pC; + save slen,f_wd,f_ht,r_ff,pA,pB,bA,sA,sB,dx,nA,nB,nC,nD; + string sA,sB; + pair pA,pB; + picture bA; %---------------------------------------------------------------------------------------------- - if ((ANG mod 360)<=90+1)or((ANG mod 360)>=270-1): dx:=1; else: dx:=-1; fi - pT:=POS-(0.5atom_wd*dx*WD,0.5atom_wd); - nE:=nC:=0; - for i=0 upto length(STR)-1: - sB:=pic_c(i,STR); nB:=ASCII(sB); - 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 + sA:=strD[numS[NUM]]; slen:=length(sA)-1; + nA:=angX[NUM]; dxA[NUM]:=dx:=iif((nA<=90)or(nA>=270),1,-1); + wdA[NUM]:=nC:=0; pB:=(0,0); + pA:=posA[NUM]-(.5atom_wd*dx,.5atom_wd); + if (atomfont<>"draw")and(f_MP=1): + bA:="C" infont atomfont; + r_ff:=atom_wd/(ypart(ulcorner bA)-ypart(llcorner bA)); + fi + for i=0 upto slen: + if nC=0: + sB:=pic_c(i,sA); + if (dx=-1)and(sB="{"): + nD:=i+1; nC:=0; for j=nD upto slen: nC:=nC+1; exitif pic_c(j,sA)="}"; endfor + fi + else: nC:=nC-1; sB:=pic_c(nD+nC,sA); fi - 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 sB="_": pB:=iif(pB=(0,0),(0,-.5atom_wd),(0,0)); + elseif sB="^": pB:=iif(pB=(0,0),(0, .5atom_wd),(0,0)); + elseif (sB<>"{")and(sB<>"}"): if (atomfont<>"draw")and(f_MP=1): - pC:=sB infont atomfont scaled (atom_wd/atomfontsize); - if dx=-1: pA:=pT-(lrcorner pC-llcorner pC)+(0,nE*atom_wd); - else: pA:=pT+(0,nE*atom_wd); - fi - if (sw_numberA>=1)or(sw_numberB>=1): - erase fill (llcorner pC--lrcorner pC--urcorner pC--ulcorner pC--cycle) shifted pA; - fi - addto currentpicture also pC shifted pA Cp(colorA[NUM]); - if sw_atom_frame=1: - draw ((llcorner pC--lrcorner pC--urcorner pC--ulcorner pC--cycle) shifted pA) - withpen pencircle scaled 0.01pt; - fi - pT:=pT+(lrcorner pC-llcorner pC)*dx; + bA:=sB infont atomfont; + f_wd:=(xpart(lrcorner bA)-xpart(llcorner bA))*r_ff; + f_ht:=(ypart(urcorner bA)-ypart(llcorner bA))*r_ff; + if dx=-1: pA:=pA-(f_wd,0); fi + addto currentpicture also bA scaled (r_ff*(1-2ratio_atomgap_atom)) + shifted (pA+pB+(f_wd*ratio_atomgap_atom,f_ht*ratio_atomgap_atom)) Cp(colorA[NUM]); + if sw_atom_frame=1: draw_frame(pA+pB,f_wd,f_ht,thickness_atom_frame); fi + if dx=1: pA:=pA+(f_wd,0); fi else: - if dx=-1: pA:=pT+(-nA,nE*atom_wd); else: pA:=pT+(0,nE*atom_wd); fi - if (sw_numberA>=1)or(sw_numberB>=1): - erase fill unitsquare xscaled nA yscaled atom_wd shifted pA; - fi - draw_char(sB,pA,atom_wd,bond_pen_wd*ratio_char_bond,NUM); - if sw_atom_frame=1: draw_frame(pA,nA,atom_wd,0.1pt); fi - pT:=pT+(nA*dx,0); + f_wd:=atom_wd*tbl_char_wd[ASCII(sB)]; + if dx=-1: pA:=pA-(f_wd,0); fi + draw_char(sB,pA+pB,atom_wd,bond_pen_wd*ratio_char_bond,NUM); + if sw_atom_frame=1: draw_frame(pA+pB,f_wd,atom_wd,thickness_atom_frame); fi + if dx=1: pA:=pA+(f_wd,0); fi fi - fi + wdA[NUM]:=wdA[NUM]+f_wd; + fi endfor endgroup enddef; -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -def draw_bond(expr NN,BP,EP,ANG,LN)= +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def draw_bond(expr NUM)= begingroup - save ww,ap,am,hpt,Ls,Le,pA,pB,pC,pT,nB,nC,nL; - pair Ls,Le; - path pA,pB,pC,pT; - %---------------------------------------------------------------------------------------------- - nL:=LN; - nC:=length(posA[EP]-posA[BP]); - 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 (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); - 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; - 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; - 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; - 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; - ef sw_numberB=3: if numberB_end((nC-zebra_gap)/nC): nD:=1; fi - fill nA[PB,PA]--nA[PD,PA]--nD[PD,PA]--nD[PB,PA]--cycle Cp(CL); endfor enddef; -def bz_put(expr PA,PB,PC,PD,CL)= nC:=length(Le-Ls); - for i=0 upto nC/zebra_gap: - nA:=zebra_gap*i/nC; nD:=(zebra_gap*i+ratio_zebra_black*zebra_gap)/nC; - fill nA[PB,PA]--nA[PD,PC]--nD[PD,PC]--nD[PB,PA]--cycle Cp(CL); endfor enddef; -def cut_off(expr p,w,h,s)= - p intersectionpoint sqr(w+.1h,1.1h) shifted (s-(.5(w+.1h),.5(1.1h))); enddef; -def clipping(expr SA,SB,PA,PB,LEN)= - pT:=PA--PB; nA:=0.6atom_wd/LEN; - if (SA=0)and(SB=0): Ls:=PA; Le:=PB; pA:=pB:=pT; pC:=0.1[PA,PB]--0.1[PB,PA]; - ef SA=0: Ls:=PA; Le:=cut_off(pT,atom_wd*tbl_str_wd[SB],atom_wd,PB); - pA:=Ls--Le; pB:=Ls--nA[PB,PA]; pC:=0.1[PA,PB]--Le; - ef SB=0: Ls:= cut_off(pT,atom_wd*tbl_str_wd[SA],atom_wd,PA); Le:=PB; - pA:=Ls--Le; pB:=nA[PA,PB]--Le; pC:=Ls--(0.1)[PB,PA]; - else: Ls:=cut_off(pT,atom_wd*tbl_str_wd[SA],atom_wd,PA); - Le:=cut_off(pT,atom_wd*tbl_str_wd[SB],atom_wd,PB); - pB:=nA[PA,PB]--nA[PB,PA]; pC:=pA:=Ls--Le; fi +def wz_put(expr PA,PB,PD)= + for i=0 upto len/zebra_gap: + nA:=zebra_gap*i/len; nD:=(zebra_gap*i+ratio_zebra_black*zebra_gap)/len; + if nD>((len-zebra_gap)/len): nD:=1; fi + fill nA[PB,PA]--nA[PD,PA]--nD[PD,PA]--nD[PB,PA]--cycle Cp(col); + endfor +enddef; +%------------------------------------------------------------------------------------------------ +def bz_put(expr PA,PB,PC,PD)= + for i=0 upto len/zebra_gap: + nA:=zebra_gap*i/len; nD:=(zebra_gap*i+ratio_zebra_black*zebra_gap)/len; + fill nA[PB,PA]--nA[PD,PC]--nD[PD,PC]--nD[PB,PA]--cycle Cp(col); + endfor +enddef; +%------------------------------------------------------------------------------------------------ +vardef frame_str(expr NUM)= + save nA,nB; + nA:=1.12atom_wd; nB:=wdA[NUM]+.12atom_wd; + ((0,0)--(nB,0)--(nB,nA)--(0,nA)--cycle) shifted + (posA[NUM]-(.5nA+iif((dxA[NUM]=-1)and(wdA[NUM]>atom_wd),nB-nA,0),.5nA)) enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def ring expr n= <((-180 DIV n)-90),(_chg_len,0), @@ -1126,8 +1158,8 @@ char_size_set( .4)( 1)(".,:;'`^"); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% def draw_char(expr CHR,POS,WD,PEN,NUM)= begingroup -save Z,aW,aH,fW,fH,hW,hW,hH,fP,hP,pathO,pathOh,pos,dw,dwh,dwv,cdw,ppcs,sbp,sC; -path pathO,pathOh; +save Z,aW,aH,fW,fH,hW,hW,hH,fP,hP,zO,zOh,pos,dw,dwh,dwv,cdw,ppcs,sbp,sC; +path zO,zOh; string sC; pair Z[],pos; %------------------------------------------------------------------------------------------------- @@ -1148,18 +1180,18 @@ fW:=aW-hP; hW:=.5aW; fH:=aH-hP; hH:=.5aH; Z01:=( 0,hP); Z02:=(hP, 0); Z03:=(hP,hP); Z04:=(aW,hP); Z05:=(fW, 0); Z06:=(hW,aH); Z07:=(hW, 0); Z08:=( 0,hH); Z09:=(hP,hH); Z10:=(fW,hH); Z11:=(hW,aW); Z12:=( 0,fH); Z13:=(hP,fH); Z14:=(hW,fH); Z15:=(fW,aH); Z16:=(aW,fH); Z17:=(aW,hH); Z18:=(hP,aH); Z19:=(hW,hP); Z20:=(hW,hH); Z21:=(fW,hP); -pathO:=Z10..(.8aW,fH)..tension 1.5..(.2aW,fH)..Z09..(.2aW,hP)..tension 1.5..(.8aW,hP)..cycle; -pathOh:=(hP,.25aH)..Z19..(fW,.25aH)..Z20..cycle; +zO:=Z10..(.8aW,fH)..tension 1.5..(.2aW,fH)..Z09..(.2aW,hP)..tension 1.5..(.8aW,hP)..cycle; +zOh:=(hP,.25aH)..Z19..(fW,.25aH)..Z20..cycle; %------------------------------------------------------------------------------------------------- ppcs fP; if sC="A": dwvs(1.14) Z02--Z06--Z05; dw .33[Z02,Z06]--.33[Z05,Z06]; ef sC="B": dw Z13--Z14{right}..(.9fH,.75aH)..{left}Z20--Z09--Z20{right}..(.9fH,.25aH).. {left}Z19--Z03; dwv Z02--Z18; -ef sC="C": cdw sbp(.05,.95)pathO; +ef sC="C": cdw sbp(.05,.95)zO; ef sC="D": dw Z13--Z14..Z10..Z19--Z03; dwv Z02--Z18; ef sC="E": pickup pensquare scaled fP; dw Z21--Z03--Z13--(fW,fH); dw Z09--Z10; ef sC="F": dwh Z12--Z16; dwh (0,.45aH)--(fW,.45aH); dw Z02--Z13; -ef sC="G": cdw sbp(.06,.97)pathO; dwh bot Z20-- bot Z17; +ef sC="G": cdw sbp(.06,.97)zO; dwh bot Z20-- bot Z17; ef sC="H": dwv Z02--Z18; dw Z09--Z10; dwv Z05--Z15; ef sC="I": dwv Z19--Z14; dwh (hW-fP,hP)--(hW+fP,hP); dwh (hW-fP,fH)--(hW+fP,fH); ef sC="J": cdw Z09..(hP,.4aH){down}..{right}Z19{right}..{up}(fW,.4aH)..Z15; @@ -1167,12 +1199,12 @@ ef sC="K": cdw Z02--Z18; cdw .5[.45[Z02,Z18],Z16]--Z05; cdw .45[Z02,Z18]--Z16; ef sC="L": dwh Z04--Z01; dwv Z02--Z18; ef sC="M": dwv Z02--Z18; dwvs(1.14) Z18--Z19--Z15; dwv Z15--Z05; ef sC="N": dwv Z02--Z18; dwv Z05--Z15; dwvs(1.4) (1.4hP,aH)--(aW-1.4hP,0); -ef sC="O": dw pathO; +ef sC="O": dw zO; ef sC="P": dwv Z02--Z18; dw Z13--(.3aW,fH){right}..(fW,.7aH)..{left}(.3aW,.44aH)..(hP,.44aH); -ef sC="Q": dw pathO; dw (.6aW,.4aH)--Z05; +ef sC="Q": dw zO; dw (.6aW,.4aH)--Z05; ef sC="R": dwv Z02--Z18; dw Z13--(.3aW,fH){right}..(fW,.7aH)..{left}(.3aW,.44aH)..(hP,.44aH); cdw Z05{up}..{left}(hW,.44aH); -ef sC="S": cdw sbp(.05,.45)pathO; cdw sbp(.55,.95)pathO; dw (fW,.3aH){up}..{up}(hP,.7aH); +ef sC="S": cdw sbp(.05,.45)zO; cdw sbp(.55,.95)zO; dw (fW,.3aH){up}..{up}(hP,.7aH); ef sC="T": dwh Z12--Z16; dwv .5[Z12,Z16]--Z07; ef sC="U": cdw Z18..Z09{down}..{right}Z19{right}..{up}Z10..Z15; ef sC="V": dwvs(1.2) Z18--Z07--Z15; @@ -1199,7 +1231,7 @@ ef sC="o": dw Z19..Z10..Z14..Z09..cycle; ef sC="p": dw Z19..Z10..Z11..Z09..cycle; dwv (hP,.7aH)--(hP,-.3aH); ef sC="q": dw Z19..Z10..Z11..Z09..cycle; dwv (fW,.7aH)--(fW,-.3aH); ef sC="r": cdw (sbp(.35,.72)Z19..Z10..Z14..Z09..cycle) shifted(0,-fP); dwv Z02--Z18; -ef sC="s": cdw sbp(.05,.45)pathO; cdw sbp(.55,.95)pathO; dw (fW,.3aH){up}..{up}(hP,.7aH); +ef sC="s": cdw sbp(.05,.45)zO; cdw sbp(.55,.95)zO; dw (fW,.3aH){up}..{up}(hP,.7aH); ef sC="t": dwv Z07--Z06; dwh (0,.66aH)--(aW,.66aH); ef sC="u": cdw Z18..(hP,.55aH){down}..Z19..(fW,.55aH){up}..Z15; dwv Z15--Z05; ef sC="v": dwv Z18--Z07--Z15; @@ -1210,13 +1242,13 @@ ef sC="z": dwh Z12--Z16; dwvs(1.4) (1.4hP,fP)--(aW-1.4hP,aH-fP); dwh Z01--Z04; ef sC="0": dw Z09...Z14...Z10...Z19...cycle; ef sC="1": dwv Z07--Z06--(hW-hP,fH)--(hW-hP,aH-2.5hP); ef sC="2": cdw sbp(0,.71)(hP,1.3hP)--(fW,.55aH)..Z14..(hP,.5aH)..(hW,.27aH); dwh Z04--Z01; -ef sC="3": cdw sbp(0,.77)pathOh; cdw sbp(.23,.95)pathOh shifted (0,.5aH-hP); dwh (.3aW,hH)--Z20; +ef sC="3": cdw sbp(0,.77)zOh; cdw sbp(.23,.95)zOh shifted (0,.5aH-hP); dwh (.3aW,hH)--Z20; ef sC="4": dwh (0,.3aH)--(aW,.3aH); dwv (.7aW,0)--(.7aW,aH)--(1.2hP,.3aH+hP); ef sC="5": dwh Z12--Z16; dwv Z13--(hP,.49aH); cdw (.5hP,.15aH)..(.65aW,1.3hP)..(fW,.3aH).. (hW,.6aH)..(.6hP,.53aH); ef sC="6": dw Z19..(fW,.5fW)..(hW,fW)..(hP,.5fW)..cycle; cdw (hP,.4aH)--Z06; ef sC="7": dwh (0,.fH)--Z16; dwvs(1.2) (aW-1.2hP,aH-fP)--(.4aW,0); -ef sC="8": dw pathOh; dw (hP,.75aH)...Z14...(fW,.75aH)...Z20...cycle; +ef sC="8": dw zOh; dw (hP,.75aH)...Z14...(fW,.75aH)...Z20...cycle; ef sC="9": dw (Z19..(fW,.5fW)..(hW,fW)..(hP,.5fW)..cycle) shifted (0,.32aH); cdw (fW,.6aH)--Z07; ef sC=" ": ef sC=".": ppcs 1.4fP; dw Z19; @@ -1338,7 +1370,7 @@ def proc_calc_out= if (sB[j]=i)or(eB[j]=i): bond_cnt:=bond_cnt+bondC[j]; fi endfor Bcnt[i]:=bond_cnt; - if strD[numS[i]]="": strD[numS[i]]:="C"; fi + if numS[i]=0: strD[numS[i]]:="C"; fi 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 @@ -1377,9 +1409,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_aux_out=1: proc_auxfile_out; fi - if sw_rep_out=1: proc_report_out; fi - if sw_mol_out>=1: proc_mol_out; fi + if sw_aux_out=1: proc_auxfile_out; fi + if sw_rep_out=1: proc_report_out; fi + if sw_mol_out>=1: proc_mol_out; fi endgroup enddef; %================================================================================================== @@ -1390,6 +1422,7 @@ enddef; %================================================================================================== def proc_auxfile_out= message "["&decimal(char_num)&"]:"&inf_EN; + out_file_name:=out_file_aux; for i=1 upto aux_max: exitif tag[i]=""; if i=1: printf "" else: &aux_delimiter fi if sw_auxfix=0: &tag[i]&":" fi & if string scantokens(var[i]): scantokens(var[i]) @@ -1404,43 +1437,45 @@ vardef round_auto(expr n)= enddef; %-------------------------------------------------------------------------------------------------- def proc_report_out= - message "------------------------------------------------------------------"; - message " Molecular name = "& inf_EN; - message " Warnings = "&fdr(3)(warning_cnt)&" / Expanded command = "&decimal(cntD[0]); - message " Width * Height = " & fdr(10)(mol_wd)&" * "&fdr(10)(mol_ht); - message " Shift width * height = "& fdr(10)(minX)&" * "&fdr(10)(minY); - message " Bond length = "&fdr(3)(bond_len)&" Atom size = "&fdr(3)(atom_wd); - message " Atom count="&fdr(3)(cntA)&" Bond count="&fdr(3)(cntB)& + message "["&decimal(char_num)&"]:"&inf_EN; + out_file_name:=out_file_rep; + printf "------------------------------------------------------------------"; + printf " Molecular name = "& inf_EN; + printf " Warnings = "&fdr(3)(warning_cnt)&" / Expanded command = "&decimal(cntD[0]); + printf " Width * Height = " & fdr(10)(mol_wd)&" * "&fdr(10)(mol_ht); + printf " Shift width * height = "& fdr(10)(minX)&" * "&fdr(10)(minY); + printf " Bond length = "&fdr(3)(bond_len)&" Atom size = "&fdr(3)(atom_wd); + printf " 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 >< hideH >< chg >"; + printf "------------------------------------------------------------------"; + printf "< 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))&" , "& + printf " 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]) else: &" " fi + &iif(hideH[i]>0,fdr(8)(hideH[i])," ") if chargeA[i]<>0: &fdr(8)(chargeA[i]) fi; endfor - message "------------------------------------------------------------------"; - message "< NO. >< bond (sdt)>"; + printf "------------------------------------------------------------------"; + printf "< NO. >< bond (sdt)>"; for i=1 upto cntB: nC:=lenB[i]; if nC=_size_a: nC:=ratio_atom_bond; elseif nC<0: nC:=-nC; fi if lineB[i]<>0: nB:=angB[i]; if nB>180: nB:=nB-360; fi - message " B"&fdl(4)(i)&fdr(3)(sB[i])&" -> "&fdr(3)(eB[i])& + printf " B"&fdl(4)(i)&fdr(3)(sB[i])&" -> "&fdr(3)(eB[i])& " ("&fdr(3)(bondC[i]-si+1)&")"&fdr(9)(round_auto(angB[i]))& " ("&fdr(6)(round_auto(nB))&")"&fdr(8)(nC)&" ("&fdr(8)(round_auto(nC*bond_len))&")"; fi endfor - message "------------------------------------------------------------------"; - message "( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]"; + printf "------------------------------------------------------------------"; + printf "( atom wt )[ mi wt ] < cnt > < sum wt >[ sum mi wt ]"; if MWp<=40: cal_MW_str:=cal_MW; cal_MI_str:=cal_MI; else: cal_MW_str:=fdr(10)(MWp)&" * 100"; cal_MI_str:=fdr(10)(MIp)&" * 100"; fi for i=1 upto tbl_cnt: if sumA[i]>=1: nA:=tbl_atom_wt[i]/100*sumA[i]; nB:=tbl_atom_mi[i]/100*sumA[i]; - message " "& + printf " "& fixed_l(5)(stripP(tbl_atom_str[i]))& "("&fdr(9)(tbl_atom_wt[i])&")"&"["&fdr(9)(tbl_atom_mi[i])&"]"& " * "&fdr(4)(sumA[i])&" = " @@ -1449,38 +1484,44 @@ def proc_report_out= fi fi endfor - message " Molecular Weight [Mono Isotopic] = "& + printf " Molecular Weight [Mono Isotopic] = "& fixed_r(12)(cal_MW_str)&"["&fixed_r(12)(cal_MI_str)&"]"; - message "------------------------------------------------------------------"; - message " Weight Calc: " &cal_MW_str &" / Input: " + printf "------------------------------------------------------------------"; + printf " Weight Calc: " &cal_MW_str &" / Input: " if inf_MW<>"": &inf_MW &" / weight gap= " &decimal(MW_num-scantokens(inf_MW)) fi; - message " Fomula Calc: "&cal_FM&" / Input: " - if inf_FM<>"": &inf_FM&" / "& if inf_FM=cal_FM: "MACTCH" else: "NOT MACTCH" fi fi; - message "=================================================================="; + printf " Fomula Calc: "&cal_FM&" / Input: " + if inf_FM<>"": &inf_FM&" / "& iif(inf_FM=cal_FM,"MACTCH","NOT MACTCH") fi; + printf "=================================================================="; enddef; %================================================================================================== def proc_mol_out= begingroup - 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 ""; + save chg_cnt,chg_atm,chg_chg,nA,nB; + nA:=nB:=chg_cnt:=0; + message "["&decimal(char_num)&"]:"&inf_EN; + out_file_name:=out_file_mol; + if sw_mol_out<=2: + out_file_name:=out_file_mol; + if sw_mol_out=1: proc_vdk; + elseif sw_mol_out=2: proc_vtk; + fi + fi + endgroup +enddef; +%-V2000------------------------------------------------------------------------------------------ +def proc_vdk= + 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"; if chargeA[i]<>0: chg_atm[incr chg_cnt]:=i; chg_chg[chg_cnt]:=chargeA[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; - 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"; + for i=1 upto cntB: + if lineB[i]<>0: + proc_bond_class(lineB[i]); + printf fdr(3)(sB[i])&fdr(3)(eB[i])&fdr(3)(nA)&fdr(3)(nB)&" 0 0"; fi endfor if chg_cnt>0: @@ -1488,10 +1529,11 @@ def proc_mol_out= 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 ""; +enddef; +%-V3000--------------------------------------------------------------------------------------- +def proc_vtk= + 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"; @@ -1503,19 +1545,26 @@ def proc_mol_out= 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 + for i=1 upto cntB: + if lineB[i]<>0: + proc_bond_class(lineB[i]); + 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 - endgroup enddef; %------------------------------------------------------------------------------------------------- -vardef fit_zero(expr n)=if n<=9: "00" elseif n<=99: "0" fi enddef; +vardef fit_zero(expr n)=if n<=9: "00" elseif n<=99: "0" fi &decimal(n) enddef; +%------------------------------------------------------------------------------------------------- +def proc_bond_class(expr n)= + if (n=dl)or(n=dr)or(n=dm): nA:=2; + ef n=tm: nA:=3; + ef (n=wf)or(n=zb)or(n=bd): nB:=1; + ef (n=zf)or(n=wb)or(n=dt): nB:=6; + ef n=wv: nB:=4; + else: nA:=1; nB:=0; + fi +enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- cgit v1.2.3