RhinoCommon, Curve.IsPolyline() returns true on non linear polyCurve

Hello Forum,

I have a Curve instance which is on fact a polycurve made of 22 linear and non-linear elements, see attachment. When I test Curve.IsPolyline() the system returns true, but, as far as I can understand, it shouldn’t.

In general how can I get a PolyCurve instance out of a Curve instance? I tried a cast, but I got a crash…

Thanks. L

0.3dm (48.5 KB)

Hi @lscandella,

Here is a common approach:

protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
  var rc = RhinoGet.GetOneObject("Select curve", false, ObjectType.Curve, out var objref);
  if (rc != Result.Success)
    return rc;

  var curve = objref.Curve();
  if (null == curve)
    return Result.Failure;

  if (curve is LineCurve lineCurve)
  {
    RhinoApp.WriteLine("Curve is {0}", nameof(LineCurve));
  }
  else if (curve is ArcCurve arcCurve)
  {
    RhinoApp.WriteLine("Curve is {0}", nameof(ArcCurve));
  }
  else if (curve is PolylineCurve polylineCurve)
  {
    RhinoApp.WriteLine("Curve is {0}", nameof(PolylineCurve));
  }
  else if (curve is PolyCurve polyCurve)
  {
    RhinoApp.WriteLine("Curve is {0}", nameof(PolyCurve));
  }
  else if (curve is NurbsCurve nurbsCurve)
  {
    RhinoApp.WriteLine("Curve is {0}", nameof(NurbsCurve));
  }

  return Result.Success;
}

Also, Curve.IsPolyline() returns false when tested against the curve you posted.

– Dale

Dale,

thanks. Yes Curve.IsPolyline() returns false, my mistake…

I could not write the code as you recommended:

LineCurve lineCurve = null
if (curve is LineCurve lineCurve)

was not accepted then I wrote just

if (curve is LineCurve)

My full code is now:

        string s = "";
        ObjRef objref = null;
        var rc = RhinoGet.GetOneObject("Select curve", false, ObjectType.Curve, out objref);
        if (rc != Result.Success) return;
        var curve = objref.Curve();
        if (null == curve) return;
        if (curve is LineCurve) s += "Curve is " + nameof(LineCurve);
        if (curve is ArcCurve) s += "Curve is " + nameof(LineCurve);
        if (curve is PolylineCurve) s += "Curve is " + nameof(LineCurve);
        if (curve is PolyCurve) s += "Curve is " + nameof(LineCurve);
        if (curve is NurbsCurve) s += "Curve is " + nameof(LineCurve);
        MessageBox.Show(s);

and when run on the attached file its output is “Curve is LineCurve”, while Rhino reports its properties as:

curva

ID: 880ea30f-4b24-48aa-9b75-a283e85a2b67 (5367)
Nome dell’oggetto: (senza nome assegnato)
Nome del livello: 3
Materiale di rendering:
sorgente = da livello
indice = -1
Dati utente per l’attributo:
ID dati utente:563238F9-C201-411d-A7B1-13895A0317AD
Plug-in: Rhino
descrizione: AutoPointsOn
salvato nel file: no
copia calcolo: 1

Geometria:
Curva valida.
Policurva chiusa con 22 segmenti di curva.
Segmento 1:
Arco
inizio = (631.21,409.205,0)
fine = (641.288,409.379,0)
centro = (635.915,428.644,0)
raggio = 20
angolo = 29.1916 gradi
Segmento 2:
Curva NURBS aperta
inizio = (641.288,409.379,0)
fine = (652.718,410.686,0)
grado = 3
punti di controllo: non-razionali, numero=10
nodi: non-uniformi, dominio = da 276.976 a 288.597
fissato all’inizio ed alla fine
Segmento 3:
Linea
inizio = (652.718,410.686,0)
fine = (662.715,408.266,0)
dominio = da 288.597 a 298.901
lunghezza linea = 10.2864
Segmento 4:
Curva NURBS aperta
inizio = (662.715,408.266,0)
fine = (690.266,404.169,0)
grado = 3
punti di controllo: non-razionali, numero=18
nodi: non-uniformi, dominio = da 298.901 a 328.848
fissato all’inizio ed alla fine
Segmento 5:
Curva NURBS aperta
inizio = (690.266,404.169,0)
fine = (663.892,413.126,0)
grado = 3
punti di controllo: non-razionali, numero=19
nodi: non-uniformi, dominio = da 328.848 a 358.795
fissato all’inizio ed alla fine
Segmento 6:
Linea
inizio = (663.892,413.126,0)
fine = (653.894,415.546,0)
dominio = da 358.795 a 369.099
lunghezza linea = 10.2864
Segmento 7:
Curva NURBS aperta
inizio = (653.894,415.546,0)
fine = (644.33,421.935,0)
grado = 3
punti di controllo: non-razionali, numero=10
nodi: non-uniformi, dominio = da 369.099 a 380.718
fissato all’inizio ed alla fine
Segmento 8:
Arco
inizio = (644.33,421.935,0)
fine = (635.446,426.7,0)
centro = (630.74,407.261,0)
raggio = 20
angolo = 29.195 gradi
Segmento 9:
Linea
inizio = (635.446,426.7,0)
fine = (624.35,429.385,0)
dominio = da 390.909 a 401.708
lunghezza linea = 11.4159
Segmento 10:
Arco
inizio = (624.35,429.385,0)
fine = (405.279,429.385,0)
centro = (514.815,-23.1037,0)
raggio = 465.558
angolo = 27.216 gradi
Segmento 11:
Linea
inizio = (405.279,429.385,0)
fine = (394.184,426.7,0)
dominio = da 622.588 a 633.387
lunghezza linea = 11.4159
Segmento 12:
Arco
inizio = (394.184,426.7,0)
fine = (385.3,421.935,0)
centro = (398.889,407.261,0)
raggio = 20
angolo = 29.195 gradi
Segmento 13:
Curva NURBS aperta
inizio = (385.3,421.935,0)
fine = (375.735,415.546,0)
grado = 3
punti di controllo: non-razionali, numero=10
nodi: non-uniformi, dominio = da 643.578 a 655.196
fissato all’inizio ed alla fine
Segmento 14:
Linea
inizio = (375.735,415.546,0)
fine = (365.738,413.126,0)
dominio = da 655.196 a 665.501
lunghezza linea = 10.2864
Segmento 15:
Curva NURBS aperta
inizio = (365.738,413.126,0)
fine = (339.363,404.169,0)
grado = 3
punti di controllo: non-razionali, numero=19
nodi: non-uniformi, dominio = da 665.501 a 695.448
fissato all’inizio ed alla fine
Segmento 16:
Curva NURBS aperta
inizio = (339.363,404.169,0)
fine = (366.914,408.266,0)
grado = 3
punti di controllo: non-razionali, numero=18
nodi: non-uniformi, dominio = da 695.448 a 725.395
fissato all’inizio ed alla fine
Segmento 17:
Linea
inizio = (366.914,408.266,0)
fine = (376.912,410.686,0)
dominio = da 725.395 a 735.699
lunghezza linea = 10.2864
Segmento 18:
Curva NURBS aperta
inizio = (376.912,410.686,0)
fine = (388.341,409.379,0)
grado = 3
punti di controllo: non-razionali, numero=10
nodi: non-uniformi, dominio = da 735.699 a 747.32
fissato all’inizio ed alla fine
Segmento 19:
Arco
inizio = (388.341,409.379,0)
fine = (398.42,409.205,0)
centro = (393.714,428.644,0)
raggio = 20
angolo = 29.1916 gradi
Segmento 20:
Linea
inizio = (398.42,409.205,0)
fine = (409.514,411.891,0)
dominio = da 757.51 a 768.308
lunghezza linea = 11.4149
Segmento 21:
Arco
inizio = (409.514,411.891,0)
fine = (620.115,411.891,0)
centro = (514.815,-23.1037,0)
raggio = 447.558
angolo = 27.216 gradi
Segmento 22:
Linea
inizio = (620.115,411.891,0)
fine = (631.21,409.205,0)
dominio = da 989.187 a 999.985
lunghezza linea = 11.4149
Dati utente per la geometria:
ID dati utente:3B7FB506-437C-431e-B1D7-93C4CBFF417F
Plug-in: Rhino
descrizione: Gumball grip frame
salvato nel file: sì
copia calcolo: 2

The two problems still remain:

  1. Detect a PolyCurve when proper
  2. Get the PolyCurve from the curve object

Thanks. L

Why? Are you coding in Visual Studio or Grasshopper?

You can always do this:

var polyCurve= curve as PolyCurve;
if (null != polyCurve)
{
  // todo...
}

– Dale

Dale,

thanks, solved.

L