Private
Public Access
1
0

Merge branch 'develop' into feature/gauges

This commit is contained in:
Sander Roosendaal
2019-12-22 20:20:58 +01:00
20 changed files with 104 additions and 65 deletions

View File

@@ -1388,7 +1388,7 @@ def parsenonpainsled(fileformat,f2,summary):
try: try:
row = parsers[fileformat](f2) row = parsers[fileformat](f2)
hasrecognized = True hasrecognized = True
except KeyError: except (KeyError,IndexError):
hasrecognized = False hasrecognized = False
return None, hasrecognized, '', 'unknown' return None, hasrecognized, '', 'unknown'

View File

@@ -715,6 +715,8 @@ def getsmallrowdata_db(columns,ids=[],debug=False):
data = [] data = []
columns = [c for c in columns if c != 'None'] columns = [c for c in columns if c != 'None']
df = pd.DataFrame()
if len(ids)>1: if len(ids)>1:
for id, f in zip(ids,csvfilenames): for id, f in zip(ids,csvfilenames):
try: try:
@@ -728,11 +730,13 @@ def getsmallrowdata_db(columns,ids=[],debug=False):
df = pd.concat(data,axis=0) df = pd.concat(data,axis=0)
except ValueError: except ValueError:
df = pd.DataFrame() df = pd.DataFrame()
else: elif len(ids)==1:
try: try:
df = pd.read_parquet(csvfilenames[0],columns=columns,engine='pyarrow') df = pd.read_parquet(csvfilenames[0],columns=columns,engine='pyarrow')
except (OSError,IndexError): except (OSError,IndexError):
df = pd.DataFrame() df = pd.DataFrame()
else:
df = pd.DataFrame()
return df return df

View File

@@ -1398,6 +1398,7 @@ class TrainingPlan(models.Model):
status = models.BooleanField(default=True,verbose_name='Active') status = models.BooleanField(default=True,verbose_name='Active')
target = models.ForeignKey(TrainingTarget,blank=True,null=True,on_delete=models.SET_NULL) target = models.ForeignKey(TrainingTarget,blank=True,null=True,on_delete=models.SET_NULL)
startdate = models.DateField(default=current_day) startdate = models.DateField(default=current_day)
notes = models.CharField(blank=True,null=True,max_length=200,verbose_name='Plan Notes')
enddate = models.DateField( enddate = models.DateField(
default=half_year_from_now) default=half_year_from_now)
@@ -1476,11 +1477,12 @@ class TrainingPlan(models.Model):
class TrainingPlanForm(ModelForm): class TrainingPlanForm(ModelForm):
class Meta: class Meta:
model = TrainingPlan model = TrainingPlan
fields = ['name','target','startdate','enddate','status','rowers'] fields = ['name','target','startdate','enddate','status','notes','rowers']
widgets = { widgets = {
'startdate': AdminDateWidget(), 'startdate': AdminDateWidget(),
'enddate': AdminDateWidget() 'enddate': AdminDateWidget(),
'notes': forms.Textarea()
} }
def __init__(self,*args, **kwargs): def __init__(self,*args, **kwargs):

View File

@@ -1754,15 +1754,15 @@ def handle_updatefitnessmetric(user_id,mode,workoutids,debug=False,
def handle_updatecp(rower_id,workoutids,debug=False,table='cpdata',**kwargs): def handle_updatecp(rower_id,workoutids,debug=False,table='cpdata',**kwargs):
columns = ['power','workoutid','time'] columns = ['power','workoutid','time']
df = getsmallrowdata_db(columns,ids=workoutids,debug=debug) df = getsmallrowdata_db(columns,ids=workoutids,debug=debug)
dfgrouped = df.groupby(['workoutid'])
if not df.empty: if df.empty:
maxt = 1.05*df['time'].max()/1000. return 0
else:
maxt = 1000. maxt = 1.05*df['time'].max()/1000.
logarr = datautils.getlogarr(maxt) logarr = datautils.getlogarr(maxt)
dfgrouped = df.groupby(['workoutid'])
delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr) delta,cpvalue,avgpower = datautils.getcp(dfgrouped,logarr)

View File

@@ -46,7 +46,7 @@
function copyText() { function copyText() {
var tempInput = document.createElement("input"); var tempInput = document.createElement("input");
tempInput.style = "position: absolute; left: -1000px; top: -1000px"; tempInput.style = "position: absolute; left: -1000px; top: -1000px";
tempInput.value = "https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/"; tempInput.value = "{{ siteurl }}/rowers/video/{{ analysis.id|encode }}/";
document.body.appendChild(tempInput); document.body.appendChild(tempInput);
tempInput.select(); tempInput.select();
document.execCommand("copy"); document.execCommand("copy");
@@ -125,7 +125,7 @@ function copyText() {
{% if analysis %} {% if analysis %}
<li class="grid_2"> <li class="grid_2">
<span class="fb-share-button" style="height:20px; vertical-align: top;" <span class="fb-share-button" style="height:20px; vertical-align: top;"
data-href="https://rowsandall.com/rowers/video/{{ analysis.id|encode }}" data-href="{{ siteurl }}/rowers/video/{{ analysis.id|encode }}"
data-layout="button" data-size="small" data-mobile-iframe="false"> data-layout="button" data-size="small" data-mobile-iframe="false">
<a class="fb-xfbml-parse-ignore" target="_blank" <a class="fb-xfbml-parse-ignore" target="_blank"
href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/"> href="https://www.facebook.com/sharer/sharer.php?u=https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/">
@@ -134,7 +134,7 @@ function copyText() {
<span> <span>
<a class="twitter-share-button" <a class="twitter-share-button"
href="https://twitter.com/intent/tweet" href="https://twitter.com/intent/tweet"
data-url="https://rowsandall.com/rowers/video/{{ analysis.id|encode }}/" data-url="{{ siteurl }}/rowers/video/{{ analysis.id|encode }}/"
data-text="@rowsandall #rowingdata">Tweet</a> data-text="@rowsandall #rowingdata">Tweet</a>
</span> </span>
<span> <span>
@@ -310,7 +310,7 @@ function copyText() {
} }
</script> </script>
</li> </li>
{% if user.is_authenticated and user == workout.user.user %} {% if user.is_authenticated and workout|may_edit:request %}
<li class="grid_4"> <li class="grid_4">
<input type="checkbox" name="lock" id="lock" value="Lock">Lock Data and Video <input type="checkbox" name="lock" id="lock" value="Lock">Lock Data and Video
</li> </li>
@@ -326,7 +326,7 @@ function copyText() {
<li class="grid_2"> <li class="grid_2">
{% if form and user.is_authenticated and user == workout.user.user %} {% if form and user.is_authenticated and workout|may_edit:request %}
<table> <table>
{{ form.as_table }} {{ form.as_table }}

View File

@@ -35,7 +35,7 @@
Please correct the error{{ form.errors|pluralize }} below. Please correct the error{{ form.errors|pluralize }} below.
</p> </p>
{% endif %} {% endif %}
<table> <table>
{{ form.as_table }} {{ form.as_table }}
</table> </table>
@@ -89,9 +89,9 @@
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm/">Delete</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm/">Delete</a>
</td> </td>
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/maketemplate/">Save</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/maketemplate/">Save</a>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
@@ -144,7 +144,7 @@
$("td #id_course").hide(); $("td #id_course").hide();
$("th label[for='id_course']").hide(); $("th label[for='id_course']").hide();
$("td #id_sessionmode").change(function() { $("td #id_sessionmode").change(function() {
if (this.value == 'TRIMP') { if (this.value == 'TRIMP') {
@@ -192,7 +192,7 @@
$("th label[for='id_course']").hide(); $("th label[for='id_course']").hide();
$("td #id_course").hide(); $("td #id_course").hide();
} }
if (this.value == 'challenge') { if (this.value == 'challenge') {
$("td #id_criterium").prop("value","minimum"); $("td #id_criterium").prop("value","minimum");
$('#id_guidance').html("<p>For Challenges, the default criterium is 'At Least'</p>"); $('#id_guidance').html("<p>For Challenges, the default criterium is 'At Least'</p>");
@@ -228,7 +228,7 @@
} }
); );

View File

@@ -23,14 +23,14 @@
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<p><a href="/rowers/sessions/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
<p><a href="/rowers/sessions/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
</li> </li>
<li class="grid_4"> <li class="grid_4">
<table width="90%" class="listtable"> <table width="90%" class="listtable">
@@ -80,7 +80,7 @@
</td> </td>
{% endfor %} {% endfor %}
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<p> <p>
@@ -129,7 +129,7 @@
{% else %} {% else %}
<td> <td>
<a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name <a href={% url rower.defaultlandingpage id=workout.id|encode %}>No Name
</a></td> </a></td>
{% endif %} {% endif %}
{% else %} {% else %}
@@ -144,7 +144,7 @@
<td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td> <td> {{ workout.duration |durationprint:"%H:%M:%S.%f" }} </td>
<td> {{ workout.averagehr }} </td> <td> {{ workout.averagehr }} </td>
<td> {{ workout.maxhr }} </td> <td> {{ workout.maxhr }} </td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
@@ -153,7 +153,7 @@
{% endif %} {% endif %}
</ul> </ul>

View File

@@ -19,10 +19,10 @@
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<p><a href="/rowers/sessions/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by <p><a href="/rowers/sessions/teamcreate/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
<p><a href="/rowers/sessions/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by <p><a href="/rowers/sessions/teamcreate/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
</li> </li>
@@ -34,21 +34,21 @@
Please correct the error{{ form.errors|pluralize }} below. Please correct the error{{ form.errors|pluralize }} below.
</p> </p>
{% endif %} {% endif %}
<ul class="main-content"> <ul class="main-content">
<li class="grid_2"> <li class="grid_2">
{% csrf_token %} {% csrf_token %}
<h1>New Team Session</h1> <h1>New Team Session</h1>
<table> <table>
{{ teamform.as_table }} {{ teamform.as_table }}
</table> </table>
<table> <table>
{{ form.as_table }} {{ form.as_table }}
</table> </table>
<input class="button green" type="submit" value="Save"> <input class="button green" type="submit" value="Save">
<div id="id_guidance" class="padded"> <div id="id_guidance" class="padded">
</div> </div>
</li> </li>
{% if plannedsessions %} {% if plannedsessions %}
@@ -90,15 +90,18 @@
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone/">Clone</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/clone/">Clone</a>
</td> </td>
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm/">Delete</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm/">Delete</a>
</td> </td>
<td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/maketemplate/">Save</a>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</p> </p>
</li> </li>
{% endif %} {% endif %}
<li class="grid_2"> <li class="grid_2">
@@ -150,7 +153,7 @@
$(document).ready(function(){ $(document).ready(function(){
$("td #id_course").hide(); $("td #id_course").hide();
$("th label[for='id_course']").hide(); $("th label[for='id_course']").hide();
$("td #id_sessionmode").change(function() { $("td #id_sessionmode").change(function() {
if (this.value == 'TRIMP') { if (this.value == 'TRIMP') {
@@ -165,16 +168,16 @@
$("td #id_sessionunit").prop("value","min"); $("td #id_sessionunit").prop("value","min");
$('#id_guidance').html("<p>Time: Set value to minutes</p>"); $('#id_guidance').html("<p>Time: Set value to minutes</p>");
} }
if (this.value == 'rScore') { if (this.value == 'rScore') {
$("td #id_sessionunit").prop("value","None"); $("td #id_sessionunit").prop("value","None");
$('#id_guidance').html("<p>rScore has no unit</p>"); $('#id_guidance').html("<p>rScore has no unit</p>");
} }
}); });
$("td #id_sessiontype").change(function() { $("td #id_sessiontype").change(function() {
if (this.value == 'session') { if (this.value == 'session') {
$("td #id_criterium").prop("value","none"); $("td #id_criterium").prop("value","none");
$('#id_guidance').html("<p>For Training Sessions, the default criterium is 'Approximately'</p>"); $('#id_guidance').html("<p>For Training Sessions, the default criterium is 'Approximately'</p>");
@@ -205,18 +208,18 @@
$("td #id_criterium").prop("value","minimum"); $("td #id_criterium").prop("value","minimum");
$('#id_guidance').html("<p>For Challenges, the default criterium is 'At Least'</p>"); $('#id_guidance').html("<p>For Challenges, the default criterium is 'At Least'</p>");
} }
if (this.value == 'cycletarget') { if (this.value == 'cycletarget') {
$("td #id_criterium").prop("value","none"); $("td #id_criterium").prop("value","none");
$('#id_guidance').html("<p>For Cycle Targets, the default criterium is 'Approximately'</p>"); $('#id_guidance').html("<p>For Cycle Targets, the default criterium is 'Approximately'</p>");
} }
} }
); );
$("td #id_sessionunit").change(function() { $("td #id_sessionunit").change(function() {
if (this.value == 'm') { if (this.value == 'm') {
$("td #id_sessionmode").prop("value","distance"); $("td #id_sessionmode").prop("value","distance");
$('#id_guidance').html("<p>Mode was set to distance</p>"); $('#id_guidance').html("<p>Mode was set to distance</p>");
@@ -233,13 +236,13 @@
$("td #id_sessionmode").prop("value","time"); $("td #id_sessionmode").prop("value","time");
$('#id_guidance').html("<p>Mode was set to time</p>"); $('#id_guidance').html("<p>Mode was set to time</p>");
} }
} }
); );
}); });
</script> </script>

View File

@@ -19,10 +19,10 @@
</p> </p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
<p><a href="/rowers/sessions/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|previousperiodstart }}&enddate={{ timeperiod|previousperiodend}}">Back by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
<p><a href="/rowers/sessions/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by <p><a href="/rowers/sessions/coach/?startdate={{ timeperiod|nextperiodstart }}&enddate={{ timeperiod|nextperiodend}}">Forward by
{{ timeperiod|timedeltadays }} days</a> {{ timeperiod|timedeltadays }} days</a>
</p> </p>
</li> </li>
@@ -41,10 +41,10 @@
<p> <p>
Selecting a team assigns this session to all members of the team. Selecting a team assigns this session to all members of the team.
Unselecting a team does not remove rowers Unselecting a team does not remove rowers
who are already assigned to this session. Use the Rowers selection for that. who are already assigned to this session. Use the Rowers selection for that.
</p><p> </p><p>
<table> <table>
{{ teamform.as_table }} {{ teamform.as_table }}
</table></p> </table></p>
</li> </li>
<li class="grid_2"> <li class="grid_2">
@@ -112,15 +112,18 @@
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/clone">Clone</a>
</td> </td>
<td> <td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a> <a class="small" href="/rowers/sessions/{{ ps.id }}/deleteconfirm">Delete</a>
</td> </td>
<td>
<a class="small" href="/rowers/sessions/{{ ps.id }}/maketemplate/">Save</a>
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</p> </p>
{% endif %} {% endif %}
</li> </li>
@@ -134,7 +137,7 @@
$(document).ready(function(){ $(document).ready(function(){
var o = $("td #id_sessiontype").find(":selected").val(); var o = $("td #id_sessiontype").find(":selected").val();
if (o != 'coursetest') { if (o != 'coursetest') {
$("td #id_course").hide(); $("td #id_course").hide();
$("th label[for='id_course']").hide(); $("th label[for='id_course']").hide();
@@ -230,7 +233,7 @@
} }
); );

View File

@@ -19,6 +19,9 @@
&nbsp; &nbsp;
{% endif %} {% endif %}
</p> </p>
<p>
Login <em>{{ rower.user }}</em>
</p>
{% if userform.errors %} {% if userform.errors %}
<p style="color: red;"> <p style="color: red;">
Please correct the error{{ form.errors|pluralize }} below. Please correct the error{{ form.errors|pluralize }} below.
@@ -26,7 +29,7 @@
{% endif %} {% endif %}
{% if accountform.errors %} {% if accountform.errors %}
<p style="color: red;"> <p style="color: red;">
</p> </p>
{% endif %} {% endif %}
<form enctype="multipart/form-data" action="" method="post"> <form enctype="multipart/form-data" action="" method="post">

View File

@@ -24,6 +24,11 @@
The training plan target is: {{ plan.target.name }} on {{ plan.target.date }}. The training plan target is: {{ plan.target.name }} on {{ plan.target.date }}.
{% endif %} {% endif %}
</p> </p>
<h2>Notes</h2>
<p>
{{ plan.notes }}
</p>
{% if plan|mayeditplan:request %} {% if plan|mayeditplan:request %}
<p><a href="/rowers/editplan/{{ plan.id }}">Edit the plan</a></p> <p><a href="/rowers/editplan/{{ plan.id }}">Edit the plan</a></p>
{% endif %} {% endif %}
@@ -303,7 +308,7 @@
</th> </th>
</tr> </tr>
{% if todays_date <= microcycle.enddate %} {% if todays_date <= microcycle.enddate %}
{% if microcycle.plan.type == 'userdefined' %} {% if microcycle.plan.type == 'userdefined' %}
<tr> <tr>
<td>&nbsp;</td> <td>&nbsp;</td>
</tr> </tr>
@@ -381,7 +386,7 @@
</tr> </tr>
<tr> <tr>
<td colspan="4"> <td colspan="4">
{% if microcycle|mayeditplan:request %} {% if microcycle|mayeditplan:request %}
<a href="/rowers/microcycle/{{ microcycle.id }}">edit</a> <a href="/rowers/microcycle/{{ microcycle.id }}">edit</a>
/ /
<a href="/rowers/deletemicrocycle/{{ microcycle.id }}">delete</a> <a href="/rowers/deletemicrocycle/{{ microcycle.id }}">delete</a>
@@ -427,7 +432,7 @@
The gray "filler" The gray "filler"
cycles are generated, adjusted and deleted automatically to cycles are generated, adjusted and deleted automatically to
ensure the entire plan ensure the entire plan
duration is covered with non-overlapping cycles. duration is covered with non-overlapping cycles.
Once you edit a filler cycle, it become a user-defined Once you edit a filler cycle, it become a user-defined
cycle, which cannot be deleted cycle, which cannot be deleted
by the system.</p> by the system.</p>

View File

@@ -1557,7 +1557,7 @@ def plannedsession_totemplate_view(request,id=0):
ps.enddate = datetime.date(1970,1,1) ps.enddate = datetime.date(1970,1,1)
ps.save() ps.save()
url = reverse(plannedsession_create_view,kwargs={'userid':request.user.id}) url = reverse(plannedsession_create_view,kwargs={'userid':r.user.id})
startdatestring = startdate.strftime('%Y-%m-%d') startdatestring = startdate.strftime('%Y-%m-%d')
enddatestring = enddate.strftime('%Y-%m-%d') enddatestring = enddate.strftime('%Y-%m-%d')
@@ -2021,6 +2021,7 @@ def rower_create_trainingplan(request,userid=0):
startdate = form.cleaned_data['startdate'] startdate = form.cleaned_data['startdate']
status = form.cleaned_data['status'] status = form.cleaned_data['status']
enddate = form.cleaned_data['enddate'] enddate = form.cleaned_data['enddate']
notes = form.cleaned_data['notes']
try: try:
athletes = form.cleaned_data['rowers'] athletes = form.cleaned_data['rowers']
@@ -2033,6 +2034,7 @@ def rower_create_trainingplan(request,userid=0):
manager=themanager, manager=themanager,
startdate=startdate, startdate=startdate,
enddate=enddate,status=status, enddate=enddate,status=status,
notes=notes,
) )
p.save() p.save()

View File

@@ -156,6 +156,7 @@ def workout_video_view(request,id=''):
'locked': True, 'locked': True,
'metricsform':metricsform, 'metricsform':metricsform,
'metricsgroups': metricsgroups, 'metricsgroups': metricsgroups,
'siteurl': settings.SITE_URL,
}) })
@@ -171,6 +172,9 @@ def workout_video_create_view(request,id=0):
else: else:
mode = 'erg' mode = 'erg'
mayedit = checkworkoutuser(request.user,w) and isprorower(request.user.rower)
# get video ID and offset # get video ID and offset
if request.method == 'POST': if request.method == 'POST':
form = VideoAnalysisCreateForm(request.POST) form = VideoAnalysisCreateForm(request.POST)
@@ -265,6 +269,7 @@ def workout_video_create_view(request,id=0):
'metrics':metrics, 'metrics':metrics,
'metricsgroups': metricsgroups, 'metricsgroups': metricsgroups,
'locked': False, 'locked': False,
'siteurl': settings.SITE_URL,
}) })
# Show the EMpower Oarlock generated Stroke Profile # Show the EMpower Oarlock generated Stroke Profile

1
static/rigging/1x.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":0.9,"Mb":14,"BladeLength":0.46,"Lscull":2.425,"Nrowers":1,"RowOrScull":"scull","Span":1.6,"CatchAngle":-0.93,"DragForm":0.98}

1
static/rigging/2-.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":1.14,"Mb":27,"BladeLength":0.46,"Lscull":2.975,"Nrowers":2,"RowOrScull":"row","Span":1.6,"CatchAngle":-0.93,"DragForm":1.05}

1
static/rigging/2x.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":0.9,"Mb":27,"BladeLength":0.46,"Lscull":2.425,"Nrowers":2,"RowOrScull":"scull","Span":1.6,"CatchAngle":-0.93,"DragForm":1.05}

1
static/rigging/4-.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":1.14,"Mb":50,"BladeLength":0.545,"Lscull":2.9325,"Nrowers":4,"RowOrScull":"row","Span":1.6,"CatchAngle":-0.93,"DragForm":1}

1
static/rigging/4x.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":0.9,"Mb":52,"BladeLength":0.46,"Lscull":2.425,"Nrowers":4,"RowOrScull":"scull","Span":1.6,"CatchAngle":-0.93,"DragForm":1.11}

1
static/rigging/8+.json Normal file
View File

@@ -0,0 +1 @@
{"Lin":1.14,"Mb":151,"BladeLength":0.545,"Lscull":2.9325,"Nrowers":8,"RowOrScull":"row","Span":1.6,"CatchAngle":-0.93,"DragForm":1}

View File

@@ -56,6 +56,12 @@
js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.10&appId=694685920739849"; js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.10&appId=694685920739849";
fjs.parentNode.insertBefore(js, fjs); fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script> }(document, 'script', 'facebook-jssdk'));</script>
<script>
$(document).ready(function (){
FB.XFBML.parse();
})
</script>
<link rel="stylesheet" href="https://webapiv2.navionics.com/dist/webapi/webapi.min.css" > <link rel="stylesheet" href="https://webapiv2.navionics.com/dist/webapi/webapi.min.css" >
<script type="text/javascript" src="https://webapiv2.navionics.com/dist/webapi/webapi.min.no-dep.js"></script> <script type="text/javascript" src="https://webapiv2.navionics.com/dist/webapi/webapi.min.no-dep.js"></script>
<script>window.twttr = (function(d, s, id) { <script>window.twttr = (function(d, s, id) {