]> git.donarmstrong.com Git - lilypond.git/blob - lily/spaceable-element.cc
release: 1.3.70
[lilypond.git] / lily / spaceable-element.cc
1 /*   
2   spaceable-element.cc --  implement Spaceable_element
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9
10 #include "spaceable-element.hh"
11 #include "score-element.hh"
12 #include "warn.hh"
13
14 SCM
15 Spaceable_element::get_minimum_distances ( Score_element*me)
16 {
17   return me->get_elt_property ("minimum-distances");
18 }
19
20 void
21 Spaceable_element::add_rod (Score_element *me , Score_element * p, Real d)
22 {
23   SCM mins = get_minimum_distances (me);
24   SCM newdist=                 gh_double2scm (d);
25   for (; gh_pair_p (mins); mins = gh_cdr (mins))
26     {
27       SCM dist = gh_car (mins);
28       if (gh_car (dist) == p->self_scm_)
29         {
30           gh_set_cdr_x (dist, scm_max (gh_cdr (dist),
31                                        newdist));
32           return ;
33         }
34     }
35
36   mins = gh_cons (gh_cons (p->self_scm_, newdist), mins);
37   me->set_elt_property ("minimum-distances", mins);
38 }
39
40 SCM
41 Spaceable_element::get_ideal_distances (Score_element*me)
42 {
43   return me->get_elt_property ("ideal-distances");
44 }
45
46 void
47 Spaceable_element::add_spring (Score_element*me, Score_element * p, Real d, Real s)
48 {
49   SCM mins = get_ideal_distances (me);
50   SCM newdist= gh_double2scm (d);
51   for (; gh_pair_p (mins); mins = gh_cdr (mins))
52     {
53       SCM dist = gh_car (mins);
54       if (gh_car (dist) == p->self_scm_)
55         {
56           programming_error("already have that spring");
57           /*      gh_set_car_x (gh_cdr (dist), scm_max (gh_cadr (dist),
58                   newdist));*/
59           return ;
60         }
61     }
62   SCM newstrength= gh_double2scm (s);  
63   
64   mins = gh_cons (gh_cons (p->self_scm_, gh_cons (newdist, newstrength)), mins);
65   me->set_elt_property ("ideal-distances", mins);
66 }
67
68
69 void
70 Spaceable_element::remove_interface (Score_element*me)
71 {
72   me->remove_elt_property ("minimum-distances");
73   me->remove_elt_property ("ideal-distances");
74   me->remove_elt_property ("dir-list");
75 }
76
77
78 void
79 Spaceable_element::set_interface (Score_element*me)
80 {
81   me->set_elt_property ("minimum-distances", SCM_EOL);
82   me->set_elt_property ("ideal-distances", SCM_EOL);
83   me->set_elt_property ("dir-list",SCM_EOL) ;  
84 }