-/* === S I N F G =========================================================== */
-/*! \file rotoscope_bline.cpp
+/* === S Y N F I G ========================================================= */
+/*! \file state_bline.cpp
-** This software and associated documentation
-** are CONFIDENTIAL and PROPRIETARY property of
-** the above-mentioned copyright holder.
+** This package is free software; you can redistribute it and/or
+** modify it under the terms of the GNU General Public License as
+** published by the Free Software Foundation; either version 2 of
+** the License, or (at your option) any later version.
-** You may not copy, print, publish, or in any
-** other way distribute this software without
-** a prior written agreement with
-** the copyright holder.
+** This package is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+** General Public License for more details.
-
- std::list<sinfg::ValueNode_Const::Handle> bline_point_list;
- sinfgapp::Settings& settings;
-
- bool on_vertex_change(const sinfg::Point &point, sinfg::ValueNode_Const::Handle value_node);
- bool on_tangent1_change(const sinfg::Point &point, sinfg::ValueNode_Const::Handle value_node);
- bool on_tangent2_change(const sinfg::Point &point, sinfg::ValueNode_Const::Handle value_node);
-
-
- void popup_handle_menu(sinfg::ValueNode_Const::Handle value_node);
- void popup_vertex_menu(sinfg::ValueNode_Const::Handle value_node);
- void popup_bezier_menu(float location, sinfg::ValueNode_Const::Handle value_node);
-
- void bline_detach_handle(sinfg::ValueNode_Const::Handle value_node);
- void bline_attach_handle(sinfg::ValueNode_Const::Handle value_node);
- void bline_delete_vertex(sinfg::ValueNode_Const::Handle value_node);
- void bline_insert_vertex(sinfg::ValueNode_Const::Handle value_node,float origin=0.5);
+
+ std::list<synfig::ValueNode_Const::Handle> bline_point_list;
+ synfigapp::Settings& settings;
+
+ bool on_vertex_change(const synfig::Point &point, synfig::ValueNode_Const::Handle value_node);
+ bool on_tangent1_change(const synfig::Point &point, synfig::ValueNode_Const::Handle value_node);
+ bool on_tangent2_change(const synfig::Point &point, synfig::ValueNode_Const::Handle value_node);
+
+
+ void popup_handle_menu(synfig::ValueNode_Const::Handle value_node);
+ void popup_vertex_menu(synfig::ValueNode_Const::Handle value_node);
+ void popup_bezier_menu(float location, synfig::ValueNode_Const::Handle value_node);
+
+ void bline_detach_handle(synfig::ValueNode_Const::Handle value_node);
+ void bline_attach_handle(synfig::ValueNode_Const::Handle value_node);
+ void bline_delete_vertex(synfig::ValueNode_Const::Handle value_node);
+ void bline_insert_vertex(synfig::ValueNode_Const::Handle value_node,float origin=0.5);
Gtk::Button button_clear;
Gtk::Adjustment adj_feather;
Gtk::SpinButton spin_feather;
Gtk::Button button_clear;
Gtk::Adjustment adj_feather;
Gtk::SpinButton spin_feather;
bool get_auto_export_flag()const { return checkbutton_auto_export.get_active(); }
void set_auto_export_flag(bool x) { return checkbutton_auto_export.set_active(x); }
bool get_auto_export_flag()const { return checkbutton_auto_export.get_active(); }
void set_auto_export_flag(bool x) { return checkbutton_auto_export.set_active(x); }
bool get_layer_region_flag()const { return checkbutton_layer_region.get_active(); }
void set_layer_region_flag(bool x) { return checkbutton_layer_region.set_active(x); }
bool get_layer_region_flag()const { return checkbutton_layer_region.get_active(); }
void set_layer_region_flag(bool x) { return checkbutton_layer_region.set_active(x); }
bool get_layer_bline_flag()const { return checkbutton_layer_bline.get_active(); }
void set_layer_bline_flag(bool x) { return checkbutton_layer_bline.set_active(x); }
bool get_layer_bline_flag()const { return checkbutton_layer_bline.get_active(); }
void set_layer_bline_flag(bool x) { return checkbutton_layer_bline.set_active(x); }
bool get_layer_curve_gradient_flag()const { return checkbutton_layer_curve_gradient.get_active(); }
void set_layer_curve_gradient_flag(bool x) { return checkbutton_layer_curve_gradient.set_active(x); }
Real get_feather() const { return adj_feather.get_value(); }
void set_feather(Real x) { return adj_feather.set_value(x); }
bool get_layer_curve_gradient_flag()const { return checkbutton_layer_curve_gradient.get_active(); }
void set_layer_curve_gradient_flag(bool x) { return checkbutton_layer_curve_gradient.set_active(x); }
Real get_feather() const { return adj_feather.get_value(); }
void set_feather(Real x) { return adj_feather.set_value(x); }
- sinfg::String get_id()const { return entry_id.get_text(); }
- void set_id(const sinfg::String& x) { return entry_id.set_text(x); }
+ synfig::String get_id()const { return entry_id.get_text(); }
+ void set_id(const synfig::String& x) { return entry_id.set_text(x); }
Smach::event_result event_refresh_tool_options(const Smach::event& x);
Smach::event_result event_hijack(const Smach::event& x) { return Smach::RESULT_ACCEPT; }
Smach::event_result event_refresh_tool_options(const Smach::event& x);
Smach::event_result event_hijack(const Smach::event& x) { return Smach::RESULT_ACCEPT; }
- etl::handle<sinfgapp::CanvasInterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}
- sinfg::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();}
+ etl::handle<synfigapp::CanvasInterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}
+ synfig::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();}
bool no_egress_on_selection_change;
Smach::event_result event_layer_selection_changed_handler(const Smach::event& x)
{
bool no_egress_on_selection_change;
Smach::event_result event_layer_selection_changed_handler(const Smach::event& x)
{
insert(event_def(EVENT_WORKAREA_MOUSE_MOTION,&StateBLine_Context::event_mouse_motion_handler));
insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DRAG,&StateBLine_Context::event_mouse_motion_handler));
insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateBLine_Context::event_refresh_tool_options));
insert(event_def(EVENT_WORKAREA_MOUSE_MOTION,&StateBLine_Context::event_mouse_motion_handler));
insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DRAG,&StateBLine_Context::event_mouse_motion_handler));
insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateBLine_Context::event_refresh_tool_options));
sanity_check();
settings.set_value("bline.layer_bline",get_layer_bline_flag()?"1":"0");
settings.set_value("bline.layer_region",get_layer_region_flag()?"1":"0");
sanity_check();
settings.set_value("bline.layer_bline",get_layer_bline_flag()?"1":"0");
settings.set_value("bline.layer_region",get_layer_region_flag()?"1":"0");
{
// figure out how many digits it is
for(digits=0;(int)id.size()-1>=digits && id[id.size()-1-digits]<='9' && id[id.size()-1-digits]>='0';digits++)while(false);
{
// figure out how many digits it is
for(digits=0;(int)id.size()-1>=digits && id[id.size()-1-digits]<='9' && id[id.size()-1-digits]>='0';digits++)while(false);
String str_number;
str_number=String(id,id.size()-digits,id.size());
id=String(id,0,id.size()-digits);
String str_number;
str_number=String(id,id.size()-digits,id.size());
id=String(id,0,id.size()-digits);
// Add the number back onto the id
{
const String format(strprintf("%%0%dd",digits));
id+=strprintf(format.c_str(),number);
}
// Add the number back onto the id
{
const String format(strprintf("%%0%dd",digits));
id+=strprintf(format.c_str(),number);
}
loop_(false),
prev_workarea_layer_status_(get_work_area()->allow_layer_clicks),
duckmatic_push(get_work_area()),
loop_(false),
prev_workarea_layer_status_(get_work_area()->allow_layer_clicks),
duckmatic_push(get_work_area()),
entry_id(),
checkbutton_layer_region(_("Fill")),
checkbutton_layer_bline(_("Outline")),
entry_id(),
checkbutton_layer_region(_("Fill")),
checkbutton_layer_bline(_("Outline")),
- //options_table.attach(*manage(new Gtk::Label(_("BLine Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ //options_table.attach(*manage(new Gtk::Label(_("BLine Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
options_table.attach(entry_id, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
options_table.attach(entry_id, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- options_table.attach(checkbutton_layer_region, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- options_table.attach(checkbutton_layer_bline, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- options_table.attach(checkbutton_layer_curve_gradient, 0, 2, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- options_table.attach(*manage(new Gtk::Label(_("Feather"))), 0, 1, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ options_table.attach(checkbutton_layer_region, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ options_table.attach(checkbutton_layer_bline, 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ options_table.attach(checkbutton_layer_curve_gradient, 0, 2, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ options_table.attach(*manage(new Gtk::Label(_("Feather"))), 0, 1, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
options_table.attach(spin_feather, 1, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
options_table.attach(spin_feather, 1, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- options_table.attach(checkbutton_auto_export, 0, 2, 11, 12, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- //options_table.attach(button_make, 0, 2, 5, 6, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ options_table.attach(checkbutton_auto_export, 0, 2, 11, 12, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ //options_table.attach(button_make, 0, 2, 5, 6, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
//button_make.signal_pressed().connect(sigc::mem_fun(*this,&StateBLine_Context::run));
options_table.show_all();
refresh_tool_options();
App::dialog_tool_options->present();
//button_make.signal_pressed().connect(sigc::mem_fun(*this,&StateBLine_Context::run));
options_table.show_all();
refresh_tool_options();
App::dialog_tool_options->present();
// Hide the tables if they are showing
prev_table_status=get_canvas_view()->tables_are_visible();
if(prev_table_status)get_canvas_view()->hide_tables();
// Hide the tables if they are showing
prev_table_status=get_canvas_view()->tables_are_visible();
if(prev_table_status)get_canvas_view()->hide_tables();
// Connect a signal
//get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateBLine_Context::on_user_click));
get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
// Connect a signal
//get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateBLine_Context::on_user_click));
get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
// Bring back the tables if they were out before
if(prev_table_status)get_canvas_view()->show_tables();
// get_canvas_view()->get_smach().process_event(EVENT_REFRESH_DUCKS);
// Bring back the tables if they were out before
if(prev_table_status)get_canvas_view()->show_tables();
// get_canvas_view()->get_smach().process_event(EVENT_REFRESH_DUCKS);
- std::list<sinfg::ValueNode_Const::Handle>::iterator iter;
- const sinfg::TransformStack& transform(get_transform_stack());
-
+ std::list<synfig::ValueNode_Const::Handle>::iterator iter;
+ const synfig::TransformStack& transform(get_transform_stack());
+
for(iter=bline_point_list.begin();iter!=bline_point_list.end();++iter)
{
BLinePoint bline_point((*iter)->get_value().get(BLinePoint()));
Point new_vertex(transform.unperform(bline_point.get_vertex()));
for(iter=bline_point_list.begin();iter!=bline_point_list.end();++iter)
{
BLinePoint bline_point((*iter)->get_value().get(BLinePoint()));
Point new_vertex(transform.unperform(bline_point.get_vertex()));
// Add the BLine to the canvas
if(get_auto_export_flag() && !get_canvas_interface()->add_value_node(value_node_bline,get_id()))
{
// Add the BLine to the canvas
if(get_auto_export_flag() && !get_canvas_interface()->add_value_node(value_node_bline,get_id()))
{
// we are temporarily using the layer to hold something
layer=get_canvas_view()->get_selection_manager()->get_selected_layer();
// we are temporarily using the layer to hold something
layer=get_canvas_view()->get_selection_manager()->get_selected_layer();
// If we were asked to create a region layer, go ahead and do so
if(get_layer_region_flag())
{
// If we were asked to create a region layer, go ahead and do so
if(get_layer_region_flag())
{
Layer::Handle layer(get_canvas_interface()->add_layer_to("region",canvas,depth));
layer_selection.push_back(layer);
Layer::Handle layer(get_canvas_interface()->add_layer_to("region",canvas,depth));
layer_selection.push_back(layer);
layer->set_param("feather",get_feather());
get_canvas_interface()->signal_layer_param_changed()(layer,"feather");
}
layer->set_param("feather",get_feather());
get_canvas_interface()->signal_layer_param_changed()(layer,"feather");
}
- layer->set_param("color",sinfgapp::Main::get_background_color());
-
- sinfgapp::Action::Handle action(sinfgapp::Action::create("layer_param_connect"));
-
+ layer->set_param("color",synfigapp::Main::get_background_color());
+
+ synfigapp::Action::Handle action(synfigapp::Action::create("layer_param_connect"));
+
-
- action->set_param("canvas",get_canvas());
- action->set_param("canvas_interface",get_canvas_interface());
+
+ action->set_param("canvas",get_canvas());
+ action->set_param("canvas_interface",get_canvas_interface());
action->set_param("layer",layer);
if(!action->set_param("param",String("bline")))
action->set_param("layer",layer);
if(!action->set_param("param",String("bline")))
// If we were asked to create a BLine layer, go ahead and do so
if(get_layer_bline_flag())
{
// If we were asked to create a BLine layer, go ahead and do so
if(get_layer_bline_flag())
{
Layer::Handle layer(get_canvas_interface()->add_layer_to("outline",canvas,depth));
layer_selection.push_back(layer);
Layer::Handle layer(get_canvas_interface()->add_layer_to("outline",canvas,depth));
layer_selection.push_back(layer);
layer->set_param("feather",get_feather());
get_canvas_interface()->signal_layer_param_changed()(layer,"feather");
}
layer->set_param("feather",get_feather());
get_canvas_interface()->signal_layer_param_changed()(layer,"feather");
}
-
- action->set_param("canvas",get_canvas());
- action->set_param("canvas_interface",get_canvas_interface());
- action->set_param("layer",layer);
+
+ action->set_param("canvas",get_canvas());
+ action->set_param("canvas_interface",get_canvas_interface());
+ action->set_param("layer",layer);
// If we were asked to create a CurveGradient layer, go ahead and do so
if(get_layer_curve_gradient_flag())
{
// If we were asked to create a CurveGradient layer, go ahead and do so
if(get_layer_curve_gradient_flag())
{
Layer::Handle layer(get_canvas_interface()->add_layer_to("curve_gradient",canvas,depth));
layer_selection.push_back(layer);
layer->set_description(get_id()+_(" Gradient"));
get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description());
Layer::Handle layer(get_canvas_interface()->add_layer_to("curve_gradient",canvas,depth));
layer_selection.push_back(layer);
layer->set_description(get_id()+_(" Gradient"));
get_canvas_interface()->signal_layer_new_description()(layer,layer->get_description());
-
- action->set_param("canvas",get_canvas());
- action->set_param("canvas_interface",get_canvas_interface());
- action->set_param("layer",layer);
+
+ action->set_param("canvas",get_canvas());
+ action->set_param("canvas_interface",get_canvas_interface());
+ action->set_param("layer",layer);
get_canvas_interface()->get_selection_manager()->clear_selected_layers();
get_canvas_interface()->get_selection_manager()->set_selected_layers(layer_selection);
no_egress_on_selection_change=false;
get_canvas_interface()->get_selection_manager()->clear_selected_layers();
get_canvas_interface()->get_selection_manager()->set_selected_layers(layer_selection);
no_egress_on_selection_change=false;
//if(finish_bline_dialog.get_region_flag() || finish_bline_dialog.get_bline_flag())
// get_canvas_interface()->signal_dirty_preview()();
//if(finish_bline_dialog.get_region_flag() || finish_bline_dialog.get_bline_flag())
// get_canvas_interface()->signal_dirty_preview()();
StateBLine_Context::event_mouse_motion_handler(const Smach::event& x)
{
const EventMouse& event(*reinterpret_cast<const EventMouse*>(&x));
StateBLine_Context::event_mouse_motion_handler(const Smach::event& x)
{
const EventMouse& event(*reinterpret_cast<const EventMouse*>(&x));
bline_point.set_width(1.0f);
bline_point.set_origin(0.5f);
bline_point.set_split_tangent_flag(false);
bline_point.set_tangent1(Vector(0,0));
bline_point.set_width(1.0f);
bline_point.set_origin(0.5f);
bline_point.set_split_tangent_flag(false);
bline_point.set_tangent1(Vector(0,0));
const Vector t(event.pos-bline_point_list.back()->get_value().get(BLinePoint()).get_vertex());
bline_point.set_tangent1(t);
}
const Vector t(event.pos-bline_point_list.back()->get_value().get(BLinePoint()).get_vertex());
bline_point.set_tangent1(t);
}
iter=bline_point_list.end();
iter--;iter--;
BLinePoint prev(bline_point_list.back()->get_value().get(BLinePoint()));
iter=bline_point_list.end();
iter--;iter--;
BLinePoint prev(bline_point_list.back()->get_value().get(BLinePoint()));
case BUTTON_RIGHT: // Intercept the right-button click to short-circut the pop-up menu
return Smach::RESULT_ACCEPT;
case BUTTON_RIGHT: // Intercept the right-button click to short-circut the pop-up menu
return Smach::RESULT_ACCEPT;
handle<WorkArea::Bezier> bezier;
handle<WorkArea::Duck> duck,tduck;
BLinePoint bline_point;
handle<WorkArea::Bezier> bezier;
handle<WorkArea::Duck> duck,tduck;
BLinePoint bline_point;
for(iter=bline_point_list.begin();iter!=bline_point_list.end();++iter)
{
ValueNode_Const::Handle value_node(*iter);
for(iter=bline_point_list.begin();iter!=bline_point_list.end();++iter)
{
ValueNode_Const::Handle value_node(*iter);
duck=new WorkArea::Duck(bline_point.get_vertex());
duck->set_editable(true);
duck->set_type(Duck::TYPE_VERTEX);
duck=new WorkArea::Duck(bline_point.get_vertex());
duck->set_editable(true);
duck->set_type(Duck::TYPE_VERTEX);
tduck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_handle_menu),value_node)
);
tduck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_handle_menu),value_node)
);
// If our next iterator is the end, then we don't need
// to add a bezier.
//if(next==bline_point_list.end() && !loop_)
// continue;
// If our next iterator is the end, then we don't need
// to add a bezier.
//if(next==bline_point_list.end() && !loop_)
// continue;
tduck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_handle_menu),value_node)
);
tduck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_handle_menu),value_node)
);
duck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_vertex_menu),bline_point_list.front())
);
duck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_vertex_menu),bline_point_list.front())
);
tduck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_handle_menu),bline_point_list.front())
);
tduck->signal_user_click(2).connect(
sigc::bind(sigc::mem_fun(*this,&studio::StateBLine_Context::popup_handle_menu),bline_point_list.front())
);
menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Loop BLine",
sigc::mem_fun(*this,&studio::StateBLine_Context::loop_bline)
));
}
menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Loop BLine",
sigc::mem_fun(*this,&studio::StateBLine_Context::loop_bline)
));
}
menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Delete Vertex",
sigc::bind(
sigc::mem_fun(*this,&studio::StateBLine_Context::bline_delete_vertex),
menu.items().push_back(Gtk::Menu_Helpers::MenuElem("Delete Vertex",
sigc::bind(
sigc::mem_fun(*this,&studio::StateBLine_Context::bline_delete_vertex),
bline_point.set_tangent2(bline_point.get_tangent1());
bline_point.set_split_tangent_flag(false);
bline_point.set_origin(origin);
bline_point.set_tangent2(bline_point.get_tangent1());
bline_point.set_split_tangent_flag(false);
bline_point.set_origin(origin);
/*
bline_point.set_vertex((next_bline_point.get_vertex()+prev_bline_point.get_vertex())*0.5);
bline_point.set_width((next_bline_point.get_width()+prev_bline_point.get_width())*0.5);
/*
bline_point.set_vertex((next_bline_point.get_vertex()+prev_bline_point.get_vertex())*0.5);
bline_point.set_width((next_bline_point.get_width()+prev_bline_point.get_width())*0.5);
get_canvas_view()->get_ui_interface()->error("Unable to find where to insert vertex, internal error, please report this bug");
}
get_canvas_view()->get_ui_interface()->error("Unable to find where to insert vertex, internal error, please report this bug");
}
get_canvas_view()->get_ui_interface()->error("Unable to remove vertex, internal error, please report this bug");
}
get_canvas_view()->get_ui_interface()->error("Unable to remove vertex, internal error, please report this bug");
}
{
BLinePoint bline_point(value_node->get_value().get(BLinePoint()));
bline_point.set_split_tangent_flag(true);
{
BLinePoint bline_point(value_node->get_value().get(BLinePoint()));
bline_point.set_split_tangent_flag(true);
{
BLinePoint bline_point(value_node->get_value().get(BLinePoint()));
bline_point.set_tangent1((bline_point.get_tangent1()+bline_point.get_tangent2())*0.5);
{
BLinePoint bline_point(value_node->get_value().get(BLinePoint()));
bline_point.set_tangent1((bline_point.get_tangent1()+bline_point.get_tangent2())*0.5);