use strict;


gfx read data veins.exnode;
gfx create dgroup new_curve

gfx modify g_element veins general clear circle_discretization 6 element_discretization "16*16*16" native_discretization none

gfx modify g_element veins data_points glyph sphere general size "0.1*0.1*0.1" centre 0,0,0 select_on material blue selected_material default_selected

gfx define field dx_ds1 coordinate_system rectangular_cartesian node_value fe_field coordinates d/ds1 version 1

#now read in all the segments
$filename="veins.txt";
CORE::open(IN,$filename) || die("could not open file $filename!");
@segs=<IN>;
close(IN);


$num_elements = 6;


gfx create window 1
gfx modify win 1 set data_tool

gfx data_tool edit define create coordinate_field coordinates group new_curve constrain_to_surface;

# Make sure new_curve data is visible once created
gfx modify g_element new_curve general clear circle_discretization 6 default_coordinate coordinates element_discretization "16*16*16" native_discretization none;

gfx modify g_element new_curve node_points glyph sphere general size "0.1*0.1*0.1" centre 0,0,0 font default label cmiss_number select_on invisible material default selected_material default_selected;

gfx modify g_element new_curve node_points glyph arrow_solid general size "0*0.1*0.1" centre 0,0,0 font default label cmiss_number orientation dx_ds1 scale_factors "0.2*0*0" select_on invisible material default selected_material default_selected;

gfx modify g_element new_curve cylinder constant_radius 0.03 select_on material green selected_material default_selected

gfx create egroup temporary;

#Define a weight field, normal_weight for normal nodes and
#normal_weight+end_weight for the two end points of each segment

gfx define field normal_weight constant 1;
gfx define field end_weight constant 100;
gfx define field end_point_number_1 constant 1;
gfx define field end_point_number_2 constant 1;
gfx define field filter_end_1 equal_to fields cmiss_number end_point_number_1;
gfx define field filter_end_2 equal_to fields cmiss_number end_point_number_2;
gfx define field end_points or fields filter_end_1 filter_end_2;
gfx define field end_weights multiply fields end_points end_weight;
gfx define field weight add fields normal_weight end_weights

foreach $nodes (@segs) {
		printf " selecting and fitting segment $nodes...\n";
		gfx unsel da all;

	   my @list_of_nodes;
	   eval "\@list_of_nodes = ($nodes);";
	   gfx define field end_point_number_1 constant $list_of_nodes[0];

	   $segment_node_number = 40000;
	   foreach $node_number (@list_of_nodes)
	   {
	      gfx modify dgroup temporary add $node_number;
	      gfx change_identifier data_offset $segment_node_number sort_by cmiss_number group temporary;
	      gfx list data group temporary;
	      gfx select data group temporary;
	      gfx modify dgroup temporary remove all;
	      $segment_node_number++;
	   }

				
	gfx create snake number_of_fitting_fields 1 fitting_fields coordinates coord coordinates dest new_curve number_of_elements $num_elements density 0 stiffness 0.01 weight_field weight;

           $segment_node_number = 40000;
	   foreach $node_number (@list_of_nodes)
	   {
	      gfx modify dgroup temporary add $segment_node_number;
	      gfx change_identifier data_offset $node_number sort_by cmiss_number group temporary;
	      gfx modify dgroup temporary remove all;
	      $segment_node_number++;
	   }
}


