/// <summary>
 /// Adds a new linetype with specified definition to the linetype table.
 /// </summary>
 /// <param name="name">A name for the new linetype.</param>
 /// <param name="segmentLengths">Positive values are dashes, negative values are gaps.</param>
 /// <returns>
 /// Index of new linetype or -1 on error.
 /// </returns>
 public int Add(string name, IEnumerable <double> segmentLengths)
 {
     using (Runtime.InteropWrappers.SimpleArrayDouble segs = new Rhino.Runtime.InteropWrappers.SimpleArrayDouble(segmentLengths))
     {
         IntPtr pSegs = segs.NonConstPointer();
         return(UnsafeNativeMethods.CRhinoLinetypeTable_AddLinetype2(m_doc.RuntimeSerialNumber, name, pSegs));
     }
 }
    /// <summary>
    /// Divide the curve into specific length segments.
    /// </summary>
    /// <param name="segmentLength">The length of each and every segment (except potentially the last one).</param>
    /// <param name="includeStart">If true, then the points at the start of the curve is included.</param>
    /// <returns>Array containing division curve parameters if successful, null on failure.</returns>
    /// <example>
    /// <code source='examples\vbnet\ex_dividebylength.vb' lang='vbnet'/>
    /// <code source='examples\cs\ex_dividebylength.cs' lang='cs'/>
    /// <code source='examples\py\ex_dividebylength.py' lang='py'/>
    /// </example>
    public double[] DivideByLength(double segmentLength, bool includeStart)
    {
      IntPtr pConstThis = ConstPointer();
      SimpleArrayDouble outputParams = new SimpleArrayDouble();
      IntPtr outputParamsPtr = outputParams.NonConstPointer();

      bool success = UnsafeNativeMethods.RHC_RhinoDivideCurve3(pConstThis, segmentLength, includeStart, outputParamsPtr);

      double[] rc = null;
      if (success)
      {
        rc = outputParams.ToArray();
      }
      outputParams.Dispose();

      return success ? rc : null;
    }
    /// <summary>
    /// Several types of Curve can have the form of a polyline 
    /// including a degree 1 NurbsCurve, a PolylineCurve, 
    /// and a PolyCurve all of whose segments are some form of 
    /// polyline. IsPolyline tests a curve to see if it can be 
    /// represented as a polyline.
    /// </summary>
    /// <param name="polyline">
    /// If true is returned, then the polyline form is returned here.
    /// </param>
    /// <param name="parameters">
    /// if true is returned, then the parameters of the polyline
    /// points are returned here.
    /// </param>
    /// <returns>true if this curve can be represented as a polyline; otherwise, false.</returns>
    public bool TryGetPolyline(out Polyline polyline, out double[] parameters)
    {
      polyline = null;
      parameters = null;
      SimpleArrayPoint3d outputPts = new SimpleArrayPoint3d();
      int pointCount = 0;
      IntPtr pCurve = ConstPointer();
      IntPtr outputPointsPointer = outputPts.NonConstPointer();
      Rhino.Runtime.InteropWrappers.SimpleArrayDouble tparams = new SimpleArrayDouble();
      IntPtr ptparams = tparams.NonConstPointer();
      UnsafeNativeMethods.ON_Curve_IsPolyline2(pCurve, outputPointsPointer, ref pointCount, ptparams);
      if (pointCount > 0)
      {
        polyline = Polyline.PolyLineFromNativeArray(outputPts);
        parameters = tparams.ToArray();
      }

      tparams.Dispose();
      outputPts.Dispose();
      return (pointCount != 0);
    }