]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/manipulator.cpp
Add a generic snapping interface in Object
[r2c2.git] / source / designer / manipulator.cpp
index 5b95d5c4bddab072fbdce0c4d3b0588aa1925e70..6aca114aa5538ecfbceebf5ab328009c4b5a675b 100644 (file)
@@ -174,10 +174,10 @@ void Manipulator::even_slope(bool smooth)
 
        set<Track *>::iterator nb = neighbors.begin();
        int epi = (*nb)->get_endpoint_by_link(*order.front().track);
-       float start_z = (*nb)->get_endpoint_position(epi).z;
+       float start_z = (*nb)->get_snap_node(epi).position.z;
        ++nb;
        epi = (*nb)->get_endpoint_by_link(*order.back().track);
-       float end_z = (*nb)->get_endpoint_position(epi).z;
+       float end_z = (*nb)->get_snap_node(epi).position.z;
 
        if(smooth)
        {
@@ -233,8 +233,7 @@ void Manipulator::connect()
 
        float limit = designer.get_layout().get_catalogue().get_gauge()/10;
 
-       Vector pos1;
-       float dir1;
+       Snap sn1;
        bool ok = false;
        float gap = 0;
        for(unsigned i=0; i<track1->get_type().get_endpoints().size(); ++i)
@@ -242,22 +241,20 @@ void Manipulator::connect()
                if(track1->get_link(i))
                        continue;
 
-               pos1 = track1->get_endpoint_position(i);
-               dir1 = track1->get_endpoint_direction(i);
+               sn1 = track1->get_snap_node(i);
 
                for(unsigned j=0; j<track2->get_type().get_endpoints().size(); ++j)
                {
                        if(track2->get_link(j))
                                continue;
 
-                       Vector pos2 = track2->get_endpoint_position(j);
-                       float dir2 = track2->get_endpoint_direction(j);
+                       Snap sn2 = track2->get_snap_node(j);
 
-                       float dz = pos2.z-pos1.z;
+                       float dz = sn2.position.z-sn1.position.z;
                        if(abs(dz)>0.02)
                                continue;
 
-                       float adiff = dir1+M_PI-dir2;
+                       float adiff = sn1.rotation+M_PI-sn2.rotation;
                        while(adiff<-M_PI)
                                adiff += M_PI*2;
                        while(adiff>M_PI)
@@ -265,10 +262,10 @@ void Manipulator::connect()
                        if(abs(adiff)>0.01)
                                continue;
 
-                       float c = cos(dir1);
-                       float s = sin(dir1);
-                       float dx = pos2.x-pos1.x;
-                       float dy = pos2.y-pos1.y;
+                       float c = cos(sn1.rotation);
+                       float s = sin(sn1.rotation);
+                       float dx = sn2.position.x-sn1.position.x;
+                       float dy = sn2.position.y-sn1.position.y;
                        if(abs(dx*s-dy*c)>limit)
                                continue;
 
@@ -289,7 +286,7 @@ void Manipulator::connect()
                return;
        }
 
-       vector<Track *> trks = create_straight(pos1, dir1, gap, limit);
+       vector<Track *> trks = create_straight(sn1.position, sn1.rotation, gap, limit);
 
        if(trks.empty())
        {
@@ -472,19 +469,18 @@ void Manipulator::axis_motion(unsigned axis, float value, float)
                                if(track->get_link(j))
                                        continue;
 
-                               Vector ep_pos = track->get_endpoint_position(j);
-                               float ep_dir = track->get_endpoint_direction(j);
-                               float c = cos(ep_dir);
-                               float s = sin(ep_dir);
-                               float dx = gpointer.x-ep_pos.x;
-                               float dy = gpointer.y-ep_pos.y;
+                               Snap sn = track->get_snap_node(j);
+                               float c = cos(sn.rotation);
+                               float s = sin(sn.rotation);
+                               float dx = gpointer.x-sn.position.x;
+                               float dy = gpointer.y-sn.position.y;
 
                                float len = dx*c+dy*s;
                                if(len<length)
                                        continue;
 
-                               pos = ep_pos;
-                               dir = ep_dir;
+                               pos = sn.position;
+                               dir = sn.rotation;
                                length = len;
                        }
                }
@@ -557,7 +553,7 @@ void Manipulator::update_objects()
                        unsigned n_endpoints = track->get_type().get_endpoints().size();
                        for(unsigned j=0; j<n_endpoints; ++j)
                        {
-                               Vector p = track->get_endpoint_position(j);
+                               Vector p = track->get_snap_node(j).position;
                                if(i==objects.begin() && j==0)
                                        minp = maxp = p;
                                else