summaryrefslogtreecommitdiff
path: root/metapost
diff options
context:
space:
mode:
Diffstat (limited to 'metapost')
-rw-r--r--metapost/context/base/mp-chem.mpiv124
1 files changed, 62 insertions, 62 deletions
diff --git a/metapost/context/base/mp-chem.mpiv b/metapost/context/base/mp-chem.mpiv
index cb595f2c6..066a60bfd 100644
--- a/metapost/context/base/mp-chem.mpiv
+++ b/metapost/context/base/mp-chem.mpiv
@@ -3,7 +3,7 @@
%D version=2009.05.13,
%D title=\CONTEXT\ \METAPOST\ graphics,
%D subtitle=chemicals,
-%D author=Hans Hagen,
+%D author=Hans Hagen \& Alan Braslau",
%D date=\currentdate,
%D copyright=\PRAGMA]
%C
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See licen-en.pdf for
%C details.
-%D This module in incomplete and experimental.
+%D This module is incomplete and experimental.
% either consistent setting or not
@@ -30,6 +30,9 @@ boolean
chem_setting_fixedwidth, chem_setting_fixedheight,
chem_doing_pb, chem_text_trace ;
+color
+ chem_axis_color ;
+
path
chem_setting_bbox ;
@@ -82,7 +85,7 @@ chem_adjacent := 0 ;
chem_substituent := 0 ;
chem_direction := 0 ;
chem_stack_n := 0 ;
-chem_doing_pb := false ;
+chem_doing_pb := false ;
chem_shift := origin ;
chem_dot_factor := 4 ;
chem_text_trace := false ;
@@ -90,6 +93,7 @@ chem_bd_n := 4 ;
chem_bw_n := 4 ;
chem_bd_angle := 4 ;
chem_bb_angle := 4 ;
+chem_axis_color := blue ; % TODO: add "axiscolor=" option in lua...
vardef chem_start_structure(expr n, l, r, t, b, scale, axis, fixedwidth, fixedheight, offset) =
chem_setting_axis := axis ;
@@ -127,17 +131,18 @@ def chem_stop_structure =
chem_setting_bbox :=
(-chem_setting_l,-chem_setting_b) -- ( chem_setting_r,-chem_setting_b) --
( chem_setting_r, chem_setting_t) -- (-chem_setting_l, chem_setting_t) -- cycle ;
- % maybe put it behind the picture
- if chem_setting_axis :
+ if chem_setting_axis : % put it behind the picture
+ picture chem_picture ; chem_picture := currentpicture ; currentpicture := nullpicture ;
save stp ; stp := chem_base_width/ 2 * chem_setting_scale ;
- save siz ; siz := chem_base_width/10 * chem_setting_scale ;
- draw (-chem_setting_l,0) -- (chem_setting_r,0) withcolor blue ;
- draw (0,-chem_setting_b) -- (0,chem_setting_t) withcolor blue ;
- for i = 0 step stp until chem_setting_r : draw (i,-siz) -- (i,siz) withcolor blue ; endfor ;
- for i = 0 step -stp until -chem_setting_l : draw (i,-siz) -- (i,siz) withcolor blue ; endfor ;
- for i = 0 step stp until chem_setting_t : draw (-siz,i) -- (siz,i) withcolor blue ; endfor ;
- for i = 0 step -stp until -chem_setting_b : draw (-siz,i) -- (siz,i) withcolor blue ; endfor ;
- draw chem_setting_bbox withcolor blue ;
+ save siz ; siz := stp/5 ;
+ draw (-chem_setting_l,0) -- (chem_setting_r,0) withcolor chem_axis_color ;
+ draw (0,-chem_setting_b) -- (0,chem_setting_t) withcolor chem_axis_color ;
+ for i = 0 step stp until chem_setting_r : draw (i,-siz) -- (i,siz) withcolor chem_axis_color ; endfor ;
+ for i = 0 step -stp until -chem_setting_l : draw (i,-siz) -- (i,siz) withcolor chem_axis_color ; endfor ;
+ for i = 0 step stp until chem_setting_t : draw (-siz,i) -- (siz,i) withcolor chem_axis_color ; endfor ;
+ for i = 0 step -stp until -chem_setting_b : draw (-siz,i) -- (siz,i) withcolor chem_axis_color ; endfor ;
+ % frame=on: draw chem_setting_bbox withcolor chem_axis_color ;
+ addto currentpicture also chem_picture ;
fi ;
setbounds currentpicture to chem_setting_bbox ;
enddef ;
@@ -146,8 +151,8 @@ def chem_start_component = enddef ;
def chem_stop_component = enddef ;
def chem_pb =
-% draw boundingbox currentpicture withpen pencircle scaled 1mm withcolor blue ;
-% draw origin withpen pencircle scaled 2mm withcolor blue ;
+% draw boundingbox currentpicture withpen pencircle scaled 1mm withcolor chem_axis_color ;
+% draw origin withpen pencircle scaled 2mm withcolor chem_axis_color ;
chem_doing_pb := true ;
enddef ;
@@ -174,6 +179,7 @@ vardef chem_do (expr p) =
fi
enddef ;
+% f_rom, t_o, r_ule, c_olor
vardef chem_b (expr n, f, t, r, c) =
chem_draw (n, chem_b_path[n], f, t, r, c) ;
enddef ;
@@ -545,7 +551,7 @@ vardef chem_c_text(expr txt, z) = % adapted copy of thelabel@
enddef ;
vardef chem_ang (expr n, d) =
- ((-1 * (d-1) * chem_angle[n]) + (-chem_rotation+1) * 90 + chem_start[n]) % no ;
+ ((1-d)*chem_angle[n] + (1-chem_rotation)*90 + chem_start[n]) % no ;
enddef ;
vardef chem_rot (expr n, d) =
@@ -562,7 +568,7 @@ enddef ;
vardef chem_dir (expr n, d) =
if n = 1 :
- chem_direction_p := (origin - 2*center(chem_b_path[n] rotated chem_ang(n,d+1))) ;
+ chem_direction_p := (origin - 2*center(chem_b_path[n] rotated chem_ang(n,d))/cosd(chem_angle[n])) ;
currentpicture := currentpicture shifted chem_direction_p ;
chem_shift := chem_shift + chem_direction_p ;
fi ;
@@ -580,16 +586,12 @@ vardef chem_mov (expr n, d) =
enddef ;
vardef chem_off (expr n, d) =
- if (d = 1) or (d = 2) or (d = 8) : % positive
- currentpicture := currentpicture shifted (-chem_setting_offset,0) ;
- chem_shift := chem_shift + (-chem_setting_offset,0)
- elseif (d = 4) or (d = 5) or (d = 6) : % negative
- currentpicture := currentpicture shifted ( chem_setting_offset,0) ;
- chem_shift := chem_shift + ( chem_setting_offset,0)
- fi ;
+ pair o ; o := (-chem_setting_offset,0) rotated chem_ang(1,d+chem_initialmov[1]) ;
+ currentpicture := currentpicture shifted o ;
+ chem_shift := chem_shift + o ;
enddef ;
-vardef chem_set(expr n, m) =
+vardef chem_set (expr n, m) =
if chem_adjacent > 0 :
chem_adjacent_d := xpart chem_b_zero[n] + xpart chem_b_zero[m] ;
if chem_adjacent = 1 : chem_adjacent_p := (-chem_adjacent_d, 0) ;
@@ -693,14 +695,16 @@ vardef chem_restore =
fi ;
enddef ;
-def chem_init_some(expr n, ratio, start, initialrot, initialmov) =
- chem_width [n] := ratio * chem_base_width * chem_setting_scale ;
+def chem_init_some(expr n, initialrot, initialmov, front) =
chem_angle [n] := 360/abs(n) ;
- chem_start [n] := start ;
+ chem_width [n] := chem_setting_scale * (chem_base_width/2) / sind(chem_angle[n]/2) ;
+ chem_start [n] := 0 ;
chem_initialrot[n] := initialrot ;
chem_initialmov[n] := initialmov ;
- chem_b_zero [n] := (chem_width[n],0) rotated (chem_angle[n]/2) ;
- chem_n_zero [n] := (chem_text_min*chem_width[n],0) rotated (chem_angle[n]/2) ;
+ chem_b_path [n] := ((chem_width[n],0) rotated -(chem_angle[n]/2))--
+ ((chem_width[n],0) rotated +(chem_angle[n]/2)) ;
+ chem_b_zero [n] := point 1 of chem_b_path [n] ;
+ chem_n_zero [n] := chem_text_min*chem_b_zero[n] ;
chem_r_max [n] := chem_radical_max*chem_b_zero[n] ;
chem_r_path [n] := chem_b_zero[n] -- chem_r_max[n] ;
chem_mr_path [n] := chem_r_path [n] rotatedaround(chem_b_zero[n], (180-chem_angle[n])/2) ;
@@ -714,8 +718,7 @@ def chem_init_some(expr n, ratio, start, initialrot, initialmov) =
chem_rt_zero [n] := (((chem_radical_max+chem_radical_min)/2)*chem_width[n],0) rotated (chem_angle[n]/2) ;
chem_rtt_zero [n] := chem_rt_zero[n] rotated + 10 ;
chem_rbt_zero [n] := chem_rt_zero[n] rotated - 10 ;
- chem_b_path [n] := reverse(chem_b_zero[n] -- (chem_b_zero[n] rotated -chem_angle[n])) ;
- chem_bx_path [n] := reverse(chem_b_zero[n] -- (chem_b_zero[n] rotated -chem_angle[n])) ; % ?
+ chem_bx_path [n] := reverse(chem_b_zero[n] -- (chem_b_zero[n] rotated -chem_angle[n])) ; % ? NOT USED...
chem_sb_path [n] := subpath (0.25,0.75) of chem_b_path[n] ;
chem_s_path [n] := point 0 of chem_b_path[n] -- point 0 of (chem_b_path[n] rotated (2chem_angle[n])) ;
chem_ss_path [n] := subpath (0.25,0.75) of (chem_s_path[n]) ;
@@ -740,59 +743,56 @@ def chem_init_some(expr n, ratio, start, initialrot, initialmov) =
point 0 of chem_sb_path[n] rotatedaround(point 1 of chem_sb_path[n], -4) --
point 0 of chem_sb_path[n] rotatedaround(point 1 of chem_sb_path[n], 4) -- cycle ;
chem_rb_path [n] := chem_b_zero[n] -- chem_r_max[n] rotated -2 -- chem_r_max[n] -- chem_r_max[n] rotated 2 -- cycle ;
- chem_mrb_path [n] := chem_rb_path[n] rotatedaround(chem_b_zero[n], (180-chem_angle[n])/2) ;
+ chem_mrb_path [n] := chem_rb_path[n] rotatedaround(chem_b_zero[n],+(180-chem_angle[n])/2) ;
chem_prb_path [n] := chem_rb_path[n] rotatedaround(chem_b_zero[n],-(180-chem_angle[n])/2) ;
- chem_msr_path [n] := chem_sr_path[n] rotatedaround(chem_b_zero[n], (180-chem_angle[n])/2) ;
+ chem_msr_path [n] := chem_sr_path[n] rotatedaround(chem_b_zero[n],+(180-chem_angle[n])/2) ;
chem_psr_path [n] := chem_sr_path[n] rotatedaround(chem_b_zero[n],-(180-chem_angle[n])/2) ;
% not yet ok:
% chem_c_path [n] := subpath (30/45, -30/45) of (fullcircle scaled (1.25*chem_circle_radius*chem_width[n]));
% chem_cc_path [n] := subpath (30/45,8-30/45) of (fullcircle rotated 90 scaled (1.25*chem_circle_radius*chem_width[n]));
chem_c_path [n] := subpath (30/45, -30/45) of (fullcircle scaled (chem_width[n]));
chem_cc_path [n] := subpath (30/45,8-30/45) of (fullcircle rotated 90 scaled (chem_width[n]));
-enddef ;
-def chem_init_three = chem_init_some(3,30/52 ,-60,1,2) ; enddef ; % 60
-def chem_init_four = chem_init_some(4,30/42.5, 0,1,0) ; enddef ; % 45
-def chem_init_five = chem_init_some(5,30/35 , 0,1,0) ; enddef ; % 36
-def chem_init_six = chem_init_some(6, 1 , 0,1,0) ; enddef ; % 30
-def chem_init_eight = chem_init_some(8,30/22.5, 0,1,0) ; enddef ; % 22.5
-
-% bb R -R R Z -RZ +RZ
-
-def chem_init_some_front(expr n, ratio, start, initialrot, initialmov) =
- chem_init_some(n, ratio, start, initialrot, initialmov) ;
- chem_bb_path [n] := chem_b_path[n] rotated -chem_angle[n] -- chem_b_path[n] -- chem_b_path[n] rotated chem_angle[n] --
+ if (front) :
+ chem_bb_path [n] := chem_b_path[n] rotated -chem_angle[n] -- chem_b_path[n] -- chem_b_path[n] rotated chem_angle[n] --
(reverse(chem_b_path[n] shortened (chem_base_width/20))) paralleled (chem_base_width/20) --
cycle ;
- chem_r_max [n] := chem_radical_max*chem_b_zero[n] ;
- chem_mr_path [n] := origin -- origin shifted (0,-.25chem_base_width) ;
- chem_pr_path [n] := origin -- origin shifted (0, .25*chem_base_width) ;
- chem_r_path [n] := point 1 of chem_mr_path[n] -- point 1 of chem_pr_path[n] ;
- chem_mr_zero [n] := point 1 of chem_mr_path[n] ;
- chem_pr_zero [n] := point 1 of chem_pr_path[n] ;
+ chem_r_max [n] := chem_radical_max*chem_b_zero[n] ;
+ chem_mr_path [n] := origin -- origin shifted (0,-.25chem_base_width) ;
+ chem_pr_path [n] := origin -- origin shifted (0,+.25chem_base_width) ;
+ chem_r_path [n] := point 1 of chem_mr_path[n] -- point 1 of chem_pr_path[n] ;
+ chem_mr_zero [n] := point 1 of chem_mr_path[n] ;
+ chem_pr_zero [n] := point 1 of chem_pr_path[n] ;
+ fi
enddef ;
-def chem_init_five_front = chem_init_some_front(-5,30/35,0,2,0) ; enddef ; % 36
-def chem_init_six_front = chem_init_some_front(-6, 1 ,0,2,0) ; enddef ; % 30
+def chem_init_three = chem_init_some(3,1,2,false) ; enddef ;
+def chem_init_four = chem_init_some(4,1,0,false) ; enddef ;
+def chem_init_five = chem_init_some(5,1,0,false) ; enddef ;
+def chem_init_six = chem_init_some(6,1,0,false) ; enddef ;
+def chem_init_eight = chem_init_some(8,1,0,false) ; enddef ;
+def chem_init_five_front = chem_init_some(-5,2,0,true) ; enddef ;
+def chem_init_six_front = chem_init_some(-6,2,0,true) ; enddef ;
+
+% bb R -R R Z -RZ +RZ
vardef chem_init_one =
- chem_width [1] := .75 * chem_base_width * chem_setting_scale ;
+ chem_width [1] := chem_setting_scale * chem_base_width ;
chem_angle [1] := 360/8 ;
chem_start [1] := 0 ;
chem_initialrot[1] := 1 ;
- chem_initialmov[1] := 1 ;
- chem_b_zero [1] := (1.75*chem_width[1],0) ;
+ chem_initialmov[1] := 0 ;
+ chem_b_path [1] := origin -- (chem_width[1],0) ;
+ chem_b_zero [1] := point 1 of chem_b_path[1] ;
chem_r_min [1] := chem_radical_min*chem_b_zero[1] ;
chem_r_max [1] := chem_radical_max*chem_b_zero[1] ;
chem_r_path [1] := (.5*chem_width[1],0) -- (1.25*chem_width[1],0) ;
chem_r_zero [1] := point 1 of chem_r_path [1] ;
- chem_b_path [1] := chem_r_path[1] rotated + (chem_angle[1]) ; % used for move here
- chem_b_zero [1] := chem_r_zero[1] ;
chem_crz_zero [1] := chem_r_zero[1] enlonged chem_center_offset ;
chem_e_path [1] := (.5*chem_width[1],-.25*chem_width[1]) -- (.5*chem_width[1],.25*chem_width[1]) ;
- chem_sb_path [1] := chem_r_path [1] ;
- chem_msb_path [1] := chem_r_path [1] shifted (0,-.1chem_width[1]) ;
- chem_psb_path [1] := chem_r_path [1] shifted (0, .1chem_width[1]) ;
+ chem_sb_path [1] := subpath(.25,.75) of chem_b_path [1] ;
+ chem_msb_path [1] := subpath (0.00,0.75) of chem_b_path[1] ;
+ chem_psb_path [1] := subpath (0.25,1.00) of chem_b_path[1] ;
chem_ddt_path [1] := subpath(0,.4) of chem_r_path [1] ;
chem_ddb_path [1] := subpath(.6,1) of chem_r_path [1] ;
chem_ldt_path [1] := chem_ddt_path [1] shifted (0,-.1chem_width[1]) ; % parallel