Newer
Older
<!DOCTYPE html>
<html>
<head>
{% for src in js %}
<script type="text/javascript" src="{{ src }}"></script>
{% endfor %}
{% for src in css %}
<link type="text/css" rel="stylesheet" href="{{ src }}">
{% endfor %}
<script type="text/javascript" src="{{ url_for( 'send_app_files', path = 'functions.js' ) }}"></script>
<link type="text/css" rel="stylesheet" href="{{ url_for( 'send_app_files', path = 'app.css' ) }}">
<script type="text/javascript">
baseurl = "{{ baseurl }}";
var start_f1_f5_button = false;
var start_hv = false;
var points = [];

Marco De Donno
committed
var zones_array = new Array();
{% for zone in zones %}
zones_array.push( {{ zone[ 'pc' ] }} );
{% endfor %}
var data_columns = new Array();
{% for d in datacolumns %}
data_columns.push( "{{ d }}" );
{% endfor %}
var dpc = {{ card_img_info[ 'dpc' ] }};
var svg_width = {{ svg_width }};
var svg_height = {{ svg_height }};
var clear = function()
{
$( 'input' ).val( "" );
updateSVG();
}
var get_data = function()

Marco De Donno
committed
{
var data = {};
for( var i = 0; i < zones_array.length; i++ )
{
var zone = zones_array[ i ];
data[ zone ] = {};
for( var j = 0; j < data_columns.length; j++ )
{
var column = data_columns[ j ];
var d = $( '#icnml_zone_' + zone + '_' + column + ' > input' ).val() || null;
d = parseFloat( d );
data[ zone ][ column ] = d;
}
}
return data;
}
var update_zone_coordinates = function()
{
$.ajax( {
url: "{{ url_for( 'update_zone_coordinates', card = card_id ) }}",
dataType: 'json',
method: 'POST',
data: {
data: JSON.stringify( get_data() )
},
success: function( data )
{
if( ! data.error )
{
}
}
} );
updateSVG();

Marco De Donno
committed
}
var updateSVG = function()
{
var zonesData = {};
for( var i = 0; i < zones_array.length; i++ )
{
var pc = zones_array[ i ];
zonesData[ pc ] = {}
for( var j = 0; j < data_columns.length; j++ )
{
var z = data_columns[ j ];
var v = $( '#icnml_zone_' + pc + '_' + z + ' > input' ).val() || 0;
zonesData[ pc ][ z ] = parseFloat( v );
}
}
$( "#tp_polygones" ).empty();
for( var i = 0; i < zones_array.length; i++ )
{
var pc = zones_array[ i ];
var $svg = $( "#tp_polygones" );
var a = zonesData[ pc ][ 'tl_x' ] * dpc + "," + zonesData[ pc ][ 'tl_y' ] * dpc;
var b = zonesData[ pc ][ 'br_x' ] * dpc + "," + zonesData[ pc ][ 'tl_y' ] * dpc;
var c = zonesData[ pc ][ 'br_x' ] * dpc + "," + zonesData[ pc ][ 'br_y' ] * dpc;
var d = zonesData[ pc ][ 'tl_x' ] * dpc + "," + zonesData[ pc ][ 'br_y' ] * dpc;
var p = a + " " + b + " " + c + " " + d;
if( ! p.includes( "NaN" ) )
{
$( SVG( 'polygon' ) )
.attr( 'id', 'pc_' + pc )
.attr( 'points', p )
.attr( 'fill', 'rgb( 255, 0, 0 )' )
.attr( 'fill-opacity', '0.1' )
.attr( 'stroke', 'red' )
.attr( 'stroke-width', '1' )
.appendTo( $svg );
}
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
if( zonesData[ pc ][ 'angle' ] == 0 )
{
$( SVG( 'line' ) )
.attr( 'id', 'pc_' + pc + '_angle' )
.attr( 'x1', zonesData[ pc ][ 'tl_x' ] * dpc )
.attr( 'y1', zonesData[ pc ][ 'tl_y' ] * dpc + 20 )
.attr( 'x2', zonesData[ pc ][ 'br_x' ] * dpc )
.attr( 'y2', zonesData[ pc ][ 'tl_y' ] * dpc + 20 )
.attr( 'stroke', 'red' )
.attr( 'stroke-width', '2' )
.appendTo( $svg );
} else if ( zonesData[ pc ][ 'angle' ] == 90 ) {
$( SVG( 'line' ) )
.attr( 'id', 'pc_' + pc + '_angle' )
.attr( 'x1', zonesData[ pc ][ 'br_x' ] * dpc - 20 )
.attr( 'y1', zonesData[ pc ][ 'tl_y' ] * dpc )
.attr( 'x2', zonesData[ pc ][ 'br_x' ] * dpc - 20 )
.attr( 'y2', zonesData[ pc ][ 'br_y' ] * dpc )
.attr( 'stroke', 'red' )
.attr( 'stroke-width', '2' )
.appendTo( $svg );
} else if ( zonesData[ pc ][ 'angle' ] == 180 ) {
$( SVG( 'line' ) )
.attr( 'id', 'pc_' + pc + '_angle' )
.attr( 'x1', zonesData[ pc ][ 'br_x' ] * dpc )
.attr( 'y1', zonesData[ pc ][ 'br_y' ] * dpc - 20 )
.attr( 'x2', zonesData[ pc ][ 'tl_x' ] * dpc )
.attr( 'y2', zonesData[ pc ][ 'br_y' ] * dpc - 20 )
.attr( 'stroke', 'red' )
.attr( 'stroke-width', '2' )
.appendTo( $svg );
} else if ( zonesData[ pc ][ 'angle' ] == 270 ) {
$( SVG( 'line' ) )
.attr( 'id', 'pc_' + pc + '_angle' )
.attr( 'x1', zonesData[ pc ][ 'tl_x' ] * dpc + 20 )
.attr( 'y1', zonesData[ pc ][ 'tl_y' ] * dpc )
.attr( 'x2', zonesData[ pc ][ 'tl_x' ] * dpc + 20 )
.attr( 'y2', zonesData[ pc ][ 'br_y' ] * dpc )
.attr( 'stroke', 'red' )
.attr( 'stroke-width', '2' )
.appendTo( $svg );
}
}
}
<div class="icnml_central" style="height: {{ svg_height }}px; width: {{ svg_width * 2 }}px">
<div class="icnml_tp_cardbox">
<div style="width: {{ svg_width }}px; height: {{ svg_height }}px">
<svg id="template_svg" width="100%" height="100%">
<defs>
<clipPath id="zoom_circle_clipping">
<circle cx="0" cy="0" r="30" fill="#FFFFFF"/>
</clipPath>
</defs>
<image x="0" y="0" width="100%" height="100%" xlink:href="/tenprint_template/image/{{ card_id }}/{{ t }}"></image>
<g id="tp_polygones"></g>
<line x1="{{ card_img_info[ 'right' ] }}" y1="0" x2="{{ card_img_info[ 'right' ] }}" y2="{{ svg_height }}" style="stroke:rgb(0,0,255); stroke-width: 2" />
<line x1="0" y1="{{ card_img_info[ 'bottom' ] }}" x2="{{ svg_width }}" y2="{{ card_img_info[ 'bottom' ] }}" style="stroke:rgb(0,0,255); stroke-width: 2" />
<svg id="template_svg_zoom" x="0" y="0" width="150" height="150" viewBox="0 0 150 150" visibility="hidden" clip-path="url( #zoom_circle_clipping )">
<image x="0" y="0" width="{{ svg_width }}" height="{{ svg_height }}" xlink:href="/tenprint_template/image/{{ card_id }}/{{ t }}" />
</svg>
<line id="helper" x1="0" y1="0" x2="0" y2="0" style="stroke:rgb(0,0,255); stroke-width: 2" />
<div>
<div class="icnml_box_fields">
<div>Tenprint id</div>
<div>{{ img_info[ 'id' ] }}</div>
<div>Country code</div>
<div>{{ img_info[ 'country_code' ] }}</div>
<div>Size</div>
<div>{{ img_info[ 'width' ] }} / {{ img_info[ 'height' ] }} [cm]</div>
<div>Format</div>
<div>{{ img_info[ 'size_display' ] }}</div>
</div>
<div id="tenprint_zones_table">
<div></div>
<div>Top left x</div>
<div>Top left y</div>
<div>Bottom right x</div>
<div>Bottom right y</div>
<div>Rotation</div>
{% for zone in zones %}
<div id="icnml_zone_{{ zone[ 'pc' ] }}_name" style="padding-right: 20px">{{ zone[ 'pc_name' ] }}</div>
<div id="icnml_zone_{{ zone[ 'pc' ] }}_tl_x">
<input class="tenprint_zones_table_input" value="{{ zone[ 'tl_x' ] }}">
</div>
<div id="icnml_zone_{{ zone[ 'pc' ] }}_tl_y">
<input class="tenprint_zones_table_input" value="{{ zone[ 'tl_y' ] }}">
</div>
<div id="icnml_zone_{{ zone[ 'pc' ] }}_br_x">
<input class="tenprint_zones_table_input" value="{{ zone[ 'br_x' ] }}">
</div>
<div id="icnml_zone_{{ zone[ 'pc' ] }}_br_y">
<input class="tenprint_zones_table_input" value="{{ zone[ 'br_y' ] }}">
</div>
<div id="icnml_zone_{{ zone[ 'pc' ] }}_angle">
<input class="tenprint_zones_table_input" value="{{ zone[ 'angle' ] }}">
</div>
{% endfor %}
</div>
<div style="margin-top: 20px">
{% if t == 'front' %}
<div>
<a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="start_f1_f5_button" role="button" aria-disabled="false">
<span class="ui-button-text">Start F1-F5</span>
</a>
<a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="start_hv_button" role="button" aria-disabled="false">
<span class="ui-button-text">Start HV</span>
</a>
</div>
<div>
<a class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="clear_button" role="button" aria-disabled="false">
<span class="ui-button-text">Clear</span>
</a>
</div>
{% endif %}
</div>
</div>
</body>
<script type="text/javascript">
zoomed = false;
zoom_factor = 5;
$( '#template_svg' ).on( 'contextmenu', function( event )
$( '#helper' )
.attr( 'x1', 0 )
.attr( 'x2', 0 )
.attr( 'y1', 0 )
.attr( 'y2', 0 );
if( ! zoomed )
{
zoomed = true;
var x = event.offsetX - 15;
var y = event.offsetY - 15;
var tmp_zoom_size = 150 / zoom_factor;
$( '#template_svg_zoom' )
.attr( 'visibility', 'show' )
.attr( 'x', event.offsetX - 75 )
.attr( 'y', event.offsetY - 75 )
.attr( 'viewBox', x + " " + y + " " + tmp_zoom_size + " " + tmp_zoom_size )
$( '#zoom_circle_clipping > circle' )
.attr( "cx", event.offsetX )
.attr( "cy", event.offsetY )
} else {
zoomed = false;
$( '#template_svg_zoom' )
.attr( 'visibility', 'hidden' );
}
$( '#template_svg_zoom' ).on( 'click', function( event )
{
event.preventDefault();
if( zoomed )
{
var e = event.target;
var dim = e.getBoundingClientRect();
var x = event.clientX - dim.left;
var y = event.clientY - dim.top;
x = x / zoom_factor;
y = y / zoom_factor;
x = x / {{ card_img_info[ 'dpc' ] }};
y = y / {{ card_img_info[ 'dpc' ] }};
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
x = x.toFixed( 2 );
y = y.toFixed( 2 );
x = parseFloat( x );
y = parseFloat( y );
if( start_f1_f5_button )
{
points.push( { x: x, y: y } );
if( points.length == 2 )
{
var start = points[ 0 ];
var end = points[ 1 ];
if( end.x - start.x > 5.08 )
{
var dx = ( end.x - start.x ) / 5;
for( var f = 0; f < 5; f++ )
{
var a = start.x + f * dx;
var b = start.x + ( f + 1 ) * dx;
$( '#icnml_zone_' + ( f + 1 ) + '_tl_x > input' ).val( a );
$( '#icnml_zone_' + ( f + 1 ) + '_tl_y > input' ).val( start.y );
$( '#icnml_zone_' + ( f + 1 ) + '_br_x > input' ).val( b );
$( '#icnml_zone_' + ( f + 1 ) + '_br_y > input' ).val( end.y );
}
}
updateSVG();
points = [];
start_f1_f5_button = false;
}
} else if( start_hv )
{
points.push( { x: x, y: y } );
console.log( points );
if( points.length == 10 )
{
for( var i = 1; i <= 5; i++ )
$( '#icnml_zone_' + i + '_tl_y > input' ).val( points[ 0 ].y );
for( var i = 1; i <= 5; i++ )
$( '#icnml_zone_' + i + '_br_y > input' ).val( points[ 1 ].y );
for( var i = 6; i <= 10; i++ )
$( '#icnml_zone_' + i + '_tl_y > input' ).val( points[ 2 ].y );
for( var i = 6; i <= 10; i++ )
$( '#icnml_zone_' + i + '_br_y > input' ).val( points[ 3 ].y );
for( var i = 1; i <= 5; i++ )
{
$( '#icnml_zone_' + i + '_tl_x > input' ).val( points[ i + 3 ].x );
$( '#icnml_zone_' + i + '_br_x > input' ).val( points[ i + 4 ].x );
$( '#icnml_zone_' + ( i + 5 ) + '_tl_x > input' ).val( points[ i + 3 ].x );
$( '#icnml_zone_' + ( i + 5 ) + '_br_x > input' ).val( points[ i + 4 ].x );
update_zone_coordinates();
points = [];
start_hv = false;
}
}
zoomed = false;
$( '#template_svg_zoom' )
.attr( 'visibility', 'hidden' );
}
{% for zone in zones %}
$( '#icnml_zone_{{ zone[ 'pc' ] }}_name' )
.on( 'mouseover', function()
{
$( "#pc_{{ zone[ 'pc' ] }}" )
.attr( 'fill', 'rgb( 0, 0, 255 )' )
.attr( 'stroke', 'rgb( 0, 0, 255 )' )
} )
.on( 'mouseout', function()
{
$( "#pc_{{ zone[ 'pc' ] }}" )
.attr( 'fill', 'rgb( 255, 0, 0 )' )
.attr( 'stroke', 'rgb( 255, 0, 0 )' )
} )

Marco De Donno
committed
{% for d in datacolumns %}
$( "#icnml_zone_{{ zone[ 'pc' ] }}_{{ d }} > input" )
.on( 'change', function()
{
update_zone_coordinates( "{{ zone[ 'pc' ] }}", "{{ d }}", $( this ).val() );
} );
{% endfor %}
$( '#template_svg' ).on( 'mousemove', function( event )
{
if( start_hv && ! zoomed )
{
if( points.length < 4 )
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
{
$( '#helper' )
.attr( 'x1', 0 )
.attr( 'x2', svg_width )
.attr( 'y1', event.offsetY )
.attr( 'y2', event.offsetY );
} else {
$( '#helper' )
.attr( 'x1', event.offsetX )
.attr( 'x2', event.offsetX )
.attr( 'y1', 0 )
.attr( 'y2', svg_height );
}
}
} );
$( '#start_f1_f5_button' ).on( 'click', function()
{
clear();
start_f1_f5_button = true;
} );
$( '#start_hv_button' ).on( 'click', function()
{
clear();
start_hv = true;
} );
$( '#clear_button' ).on( 'click', clear );
updateSVG();