- order.push_back(TrackOrder(cur, rev));
- total_len+=cur->get_type().get_total_length();
- }
-
- 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;
- ++nb;
- epi=(*nb)->get_endpoint_by_link(*order.back().track);
- float end_z=(*nb)->get_endpoint_position(epi).z;
-
- if(smooth)
- {
- float dir=(end_z>start_z)?1:-1;
- float cur_slope=0;
- while((end_z-start_z)*dir/total_len>cur_slope+0.025 && order.size()>2)
- {
- cur_slope+=0.025;
-
- float dz=order.front().track->get_type().get_total_length()*dir*cur_slope;
- set_slope(order.front(), start_z, dz);
- start_z+=dz;
- total_len-=order.front().track->get_type().get_total_length();
- order.erase(order.begin());
-
- dz=order.back().track->get_type().get_total_length()*dir*cur_slope;
- set_slope(order.back(), end_z-dz, dz);
- end_z-=dz;
- total_len-=order.back().track->get_type().get_total_length();
- order.erase(--order.end());
- }
- }
-
- float cur_z=start_z;
- for(list<TrackOrder>::iterator i=order.begin(); i!=order.end(); ++i)
- {
- float dz=i->track->get_type().get_total_length()*(end_z-start_z)/total_len;
- set_slope(*i, cur_z, dz);
- cur_z+=dz;
- }
-
- for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
- (*i)->check_slope();
-
- update_wrap();
-}
-
-void Manipulator::cancel()
-{
- if(!mode)
- return;
- mode=NONE;
-
- wrap_pos=center;
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- i->track->set_position(Point(center.x+i->pos.x, center.y+i->pos.y, center.z+i->pos.z));
- i->track->set_rotation(i->rot);