code: def _make_tooth_template(self):
          
          # parameters
          period_arc = (2 * pi) / self.tooth_count
          tooth_arc = period_arc * self.spacing_ratio  # the arc between faces at effective_radius
          outer_radius = self.effective_radius + (self.tooth_height / 2)
          face_angle_rad = radians(self.face_angle)
  
          # cartesian isosceles trapezoid dimensions
          side_angle = face_angle_rad - (tooth_arc / 2)
          side_tangent_radius = sin(face_angle_rad) * self.effective_radius
          extra_side_angle = side_angle + acos(side_tangent_radius / outer_radius)
  
          tooth = cadquery.Workplane('XY', origin=(0, 0, -self.width / 2)) \
              .moveTo(
                  side_tangent_radius * cos(side_angle),
                  side_tangent_radius * sin(side_angle)
              )
          opposite_point = (
              -side_tangent_radius * cos(side_angle),
              side_tangent_radius * sin(side_angle)
          )
          if self.face_angle:
              tooth = tooth.lineTo(*opposite_point)
              #tooth = tooth.threePointArc(
              #    (0, -side_tangent_radius),
              #    opposite_point
              #)
          tooth = tooth.lineTo(
                  -cos(extra_side_angle) * outer_radius,
                  sin(extra_side_angle) * outer_radius
              )
          opposite_point = (
              cos(extra_side_angle) * outer_radius,
              sin(extra_side_angle) * outer_radius
          )
          if self.flat_top:
              tooth = tooth.lineTo(*opposite_point)
          else:
              tooth = tooth.threePointArc((0, outer_radius), opposite_point)
          tooth = tooth.close().extrude(self.width)
  
          return tooth
docs: Builds a single tooth including the cylinder with tooth faces
          tangential to its circumference.