<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<!--
  Copyright (c) 2007-2008 by HSMWorks ApS
  All rights reserved
  http://www.hsmworks.com
-->

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:tl="http://www.hsmworks.com/xml/2004/cnc/tool-library"
                exclude-result-prefixes="tl">

<xsl:param name="material-cutting-speed" select="25"/>
<xsl:param name="material-feed-per-tooth" select="25"/>

<xsl:output method="text"
            encoding="ascii"/>

<xsl:template name="add-new-line">
  <xsl:text>&#xa;</xsl:text>
</xsl:template>

<xsl:template name="get-safe-string">
  <xsl:param name="value" select="''"/>

  <xsl:value-of select="translate($value, translate($value, ' !&#x22;#$%&#x26;()*+,-./0123456789:;&lt;=&gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~', ''), '')"/>
</xsl:template>

<xsl:template match="/">

  <xsl:text># Mastercam Tool Library</xsl:text>
  <xsl:call-template name="add-new-line"/>
  <xsl:text># Generated by HSMWorks - http://www.hsmworks.com</xsl:text>
  <xsl:call-template name="add-new-line"/>
  <xsl:call-template name="add-new-line"/>
  <xsl:call-template name="add-new-line"/>

  <xsl:apply-templates select="tl:tool-library"/>
</xsl:template>

<xsl:template match="tl:tool-library">
  <xsl:apply-templates select="tl:tool"/>
</xsl:template>

<!-- returns true if the tool is a drill. -->
<xsl:template name="is-drill">
  <xsl:param name="type"/>

  <xsl:choose>
    <xsl:when test="$type='drill'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="$type='center drill'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="$type='spot drill'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="$type='block drill'">
      <xsl:value-of select="1"/>
      <xsl:text>20</xsl:text>
    </xsl:when>
    <xsl:when test="@type='tap right hand'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="@type='tap left hand'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="@type='reamer'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="@type='boring bar'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="@type='counter bore'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:when test="@type='counter sink'">
      <xsl:value-of select="1"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="0"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="tl:tool">

  <!-- header -->
  <xsl:text>1 - TOOL</xsl:text>
  <xsl:call-template name="add-new-line"/>


  <!-- material -->
  <xsl:text>2 - </xsl:text>
  <xsl:choose>
    <xsl:when test="false()">
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>10</xsl:text> <!-- unspecified -->
    </xsl:otherwise>
  </xsl:choose>
  <xsl:call-template name="add-new-line"/>


  <xsl:text>3 - </xsl:text>
  <xsl:call-template name="get-safe-string">
    <xsl:with-param name="value" select="tl:description"/>
  </xsl:call-template>
  <xsl:call-template name="add-new-line"/>


  <!-- geometry -->
  <xsl:text>4 - </xsl:text>
  <xsl:call-template name="add-new-line"/>


  <xsl:text>5 - </xsl:text>
  <xsl:call-template name="get-safe-string">
    <xsl:with-param name="value">
      <xsl:choose>
        <xsl:when test="tl:manufacturer!='' and tl:product-id!=''">
          <xsl:value-of select="concat(tl:manufacturer, ' ', tl:product-id)"/>
        </xsl:when>
        <xsl:when test="tl:manufacturer!=''">
          <xsl:value-of select="tl:manufacturer"/>
        </xsl:when>
        <xsl:when test="tl:product-id!=''">
          <xsl:value-of select="tl:product-id"/>
        </xsl:when>
      </xsl:choose>
    </xsl:with-param>
  </xsl:call-template>
  <xsl:call-template name="add-new-line"/>


  <!-- chunck -->
  <xsl:text>6 - </xsl:text>
  <xsl:call-template name="add-new-line"/>


  <!-- primary -->
  <xsl:text>7 - </xsl:text>
  <xsl:value-of select="tl:nc/@number"/>
  <xsl:text> </xsl:text>

  <xsl:choose>
    <xsl:when test="@type='drill'">
      <xsl:text>3</xsl:text>
    </xsl:when>
    <xsl:when test="@type='center drill'">
      <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:when test="@type='spot drill'">
      <xsl:text>2</xsl:text>
    </xsl:when>
    <xsl:when test="@type='block drill'">
      <xsl:text>20</xsl:text>
    </xsl:when>
    <xsl:when test="@type='flat end mill'">
      <xsl:text>10</xsl:text>
    </xsl:when>
    <xsl:when test="@type='spherical end mill'">
      <xsl:text>11</xsl:text>
    </xsl:when>
    <xsl:when test="@type='bull nose end mill'">
      <xsl:text>19</xsl:text>
    </xsl:when>
    <xsl:when test="@type='chamfer mill'">
      <xsl:text>12</xsl:text>
    </xsl:when>
    <xsl:when test="@type='face mill'">
      <xsl:text>13</xsl:text>
    </xsl:when>
    <xsl:when test="@type='slot mill'">
      <xsl:text>14</xsl:text>
    </xsl:when>
    <xsl:when test="@type='radius mill'">
      <xsl:text>15</xsl:text>
    </xsl:when>
    <xsl:when test="@type='dovetail mill'">
      <xsl:text>16</xsl:text>
    </xsl:when>
    <xsl:when test="@type='tapered mill'">
      <xsl:choose>
        <xsl:when test="tl:body/@taper-angle&gt;0">
          <xsl:text>17</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>19</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:when test="@type='lollipop mill'">
      <xsl:text>18</xsl:text>
    </xsl:when>
    <xsl:when test="@type='tap right hand'">
      <xsl:text>4</xsl:text>
    </xsl:when>
    <xsl:when test="@type='tap left hand'">
      <xsl:text>5</xsl:text>
    </xsl:when>
    <xsl:when test="@type='reamer'">
      <xsl:text>6</xsl:text>
    </xsl:when>
    <xsl:when test="@type='boring bar'">
      <xsl:text>7</xsl:text>
    </xsl:when>
    <xsl:when test="@type='counter bore'">
      <xsl:text>8</xsl:text>
    </xsl:when>
    <xsl:when test="@type='counter sink'">
      <xsl:text>9</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>0</xsl:text> <!-- unspecified -->
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text> </xsl:text>

  <xsl:choose>
    <xsl:when test="@type='flat end mill'">
      <xsl:text>0</xsl:text> <!-- sharp corner -->
    </xsl:when>
    <xsl:when test="@type='spherical end mill'">
      <xsl:text>2</xsl:text> <!-- full corner -->
    </xsl:when>
    <xsl:when test="@type='bull nose end mill'">
      <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:when test="@type='tapered mill'">
      <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>0</xsl:text> <!-- unspecified -->
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text> </xsl:text>

  <xsl:value-of select="tl:body/@diameter"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:body/@corner-radius"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="0"/>
  <xsl:text> </xsl:text>
  <xsl:choose>
    <xsl:when test="tl:body/@taper-angle!=''">
      <xsl:value-of select="tl:body/@taper-angle"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="0"/>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:nc/@diameter-offset"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:nc/@length-offset"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:motion/@cutting-feedrate"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:motion/@plunge-feedrate"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:motion/@retraction-feedrate"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:motion/@spindle-rpm"/>
  <xsl:text> </xsl:text>

  <xsl:choose>
    <xsl:when test="tl:coolant/@mode='flood'">
      <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:when test="tl:coolant/@mode='mist'">
      <xsl:text>2</xsl:text>
    </xsl:when>
    <xsl:when test="tl:coolant/@mode='tool'">
      <xsl:text>3</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>0</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text> </xsl:text>

  <xsl:value-of select="tl:body/@number-of-flutes"/>
  <xsl:text> </xsl:text>
  <xsl:text>0</xsl:text> <!-- turret -->
  <xsl:text> </xsl:text>
  <xsl:text>-1</xsl:text> <!-- station -->
  <xsl:call-template name="add-new-line"/>


  <!-- drilling/milling parameters -->
  <xsl:variable name="drill">  
    <xsl:call-template name="is-drill">
      <xsl:with-param name="type" select="@type"/>
    </xsl:call-template>
  </xsl:variable>

  <xsl:choose>
    <xsl:when test="$drill=1">
      <!-- drilling parameters -->
      <xsl:text>8 - </xsl:text>
      <xsl:call-template name="add-new-line"/>
    </xsl:when>
  <xsl:otherwise>
    <xsl:text>8 - </xsl:text>
      <xsl:choose>
        <xsl:when test="tl:capabilities/@finishing='yes' and tl:capabilities/@roughing='yes'">
          <xsl:text>0</xsl:text>
        </xsl:when>
        <xsl:when test="tl:capabilities/@roughing='yes'">
          <xsl:text>1</xsl:text>
        </xsl:when>
        <xsl:when test="tl:capabilities/@finishing='yes'">
          <xsl:text>2</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>0</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:text> </xsl:text>

      <!-- roughing -->
      <xsl:value-of select="tl:capabilities/@maximum-radial-step"/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="tl:capabilities/@maximum-axial-step"/>
      <xsl:text> </xsl:text>

      <!-- finishing -->
      <xsl:value-of select="tl:capabilities/@maximum-radial-step"/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="tl:capabilities/@maximum-axial-step"/>
      <xsl:text> </xsl:text>

      <xsl:value-of select="0"/> <!-- tip_dia -->
      <xsl:text> </xsl:text>
      <xsl:value-of select="0"/> <!-- root_dia -->
      <xsl:text> </xsl:text>
      <xsl:value-of select="0"/> <!-- thd_angle -->
      <xsl:text> </xsl:text>

      <xsl:value-of select="tl:minimum-diameter"/>
      <xsl:text> </xsl:text>
      <xsl:call-template name="add-new-line"/>
    </xsl:otherwise>
  </xsl:choose>

  <xsl:text>9 - </xsl:text>
  <xsl:choose>
    <xsl:when test="tl:capabilities/@minimum-diameter">
      <xsl:value-of select="tl:capabilities/@minimum-diameter"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="0"/>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:value-of select="tl:capabilities/@minimum-diameter"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:body/@flute-length"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:body/@body-length"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:body/@shoulder-length"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="tl:body/@shaft-diameter"/>
  <xsl:text> </xsl:text>

  <xsl:choose>
    <xsl:when test="tl:holder">
      <xsl:apply-templates select="tl:holder" mode="get-holder-diameter"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>0</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text> </xsl:text>
  <xsl:choose>
    <xsl:when test="tl:holder">
      <xsl:apply-templates select="tl:holder" mode="get-holder-length"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>0</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text> </xsl:text>

  <xsl:choose>
    <xsl:when test="tl:motion/@clockwise='no'">
      <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>0</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text> </xsl:text>

  <xsl:value-of select="$material-cutting-speed"/>
  <xsl:text> </xsl:text>
  <xsl:value-of select="$material-feed-per-tooth"/>
  <xsl:text> </xsl:text>

  <xsl:choose>
    <xsl:when test="@unit='millimeters'">
      <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>0</xsl:text> <!-- inches -->
    </xsl:otherwise>
  </xsl:choose>

  <xsl:call-template name="add-new-line"/>
  <xsl:call-template name="add-new-line"/>
</xsl:template>

<!-- returns the maximum diameter of the holder -->
<xsl:template match="tl:holder" mode="get-holder-diameter">
  <xsl:for-each select="tl:section/@diameter">
    <xsl:sort data-type="number" order="descending"/>
    <xsl:if test="position()=1">
      <xsl:value-of select="."/>
    </xsl:if>
  </xsl:for-each>
</xsl:template>

<!-- returns the total length of the holder -->
<xsl:template match="tl:holder" mode="get-holder-length">
  <xsl:value-of select="sum(tl:section/@length)"/>
</xsl:template>

</xsl:stylesheet>
