Message: unable to convert 8de8acb9-2bf3-4f90-a848-c03254349161 into Curve geometry

import rhinoscriptsyntax as rs
import math

class MyPolygon:
    
    def __init__(self, radius, sides):
        self.radius = radius
        self.sides = sides
        #variable theta
        theta = (2 *math.pi)/self.sides
        pt01 = rs.AddPoint(self.radius,0,0)
        pts = []
        pts.append(pt01)
        self.origin = [0,0,0]
        #radians to degrees
        degree = theta*(180/math.pi)
        #rotate object method i need a loop
        for i in range (1,self.sides):
            tempPt = pts[-1]#it will give me the last item form an array
            newPt = rs.RotateObject(tempPt, self.origin, degree, None, True)
            pts.append(newPt)
        pts.append(pt01)
        self.polygon = rs.PolylineVertices(tempPt)
polygon1 = MyPolygon(5,5)

I am getting following error message:

Message: unable to convert 8de8acb9-2bf3-4f90-a848-c03254349161 into Curve geometry

Traceback:
line 567, in coercecurve, “C:\Users\Kuldeep\AppData\Roaming\McNeel\Rhinoceros\5.0\Plug-ins\IronPython (814d908a-e25c-493d-97e9-ee3861957f49)\settings\lib\rhinoscript\utility.py”
line 2317, in PolylineVertices, “C:\Users\Kuldeep\AppData\Roaming\McNeel\Rhinoceros\5.0\Plug-ins\IronPython (814d908a-e25c-493d-97e9-ee3861957f49)\settings\lib\rhinoscript\curve.py”
line 23, in init, “E:\Digital Media Master\3rd Semester\Rhino Exercises\Polygon.py”
line 24, in , “E:\Digital Media Master\3rd Semester\Rhino Exercises\Polygon.py”

Edit:

I think tempPt is a point not a curve?
Tom

Hi @kggadhavi

it would help if you attached the definition…

I think one problem is this:

rs.PolylineVertices(tempPt)

You’re might be thinking that that will add a polyline, but it only gets vertices from an existing one.

I changed your class around a bit, see if the following makes sense. Instead of adding Rhino point objects to the document, I use 3Dpoints which only exist “virtually”. I have to leave for an hour now, but I can explain more later.

import rhinoscriptsyntax as rs
import Rhino
import math

class MyPolygon:

    def __init__(self, radius, sides):
        self.radius = radius
        self.sides = sides
        #variable theta
        theta = (2 *math.pi)/self.sides
        self.origin = rs.coerce3dpoint([0,0,0])
        #radians to degrees
        degree = theta*(180/math.pi)
        
        #create a 3dpoint object (not a Rhino point in the document)
        pt01 = rs.coerce3dpoint([self.radius,0,0])
        #empty list
        pts = []
        #need a rotation axis (World Z axis)
        zvec=rs.coerce3dvector([0,0,1])
        #run your rotate loop
        for i in range (self.sides):
            #create a rotation transform with the correct rotation from original
            xform=rs.XformRotation2(degree*i,zvec,self.origin)
            #transform the original 3d point, add to list
            pts.append(rs.PointTransform(pt01,xform))
        #add first point again to close polyline
        pts.append(pt01)
        #add the polyline
        self.polygon = rs.AddPolyline(pts)

polygon1 = MyPolygon(5,5)

–Mitch

I wan to create a polygon and then I want to make all platonic solids in 3D.

Yes, it is one of the point from the array.

Thank you very much @Helvetosaur. Could you please explain what is coerce4dpoint and why do we need to rotate the vector?

rs.coerce3dpoint() tries to create a RhinoCommon “Point3d object” from a list of 3 numbers. This Point3d object represents a point in world 3d space (coordinates) but does not actually add a visible point object to the Rhino document - in this case you do not need or want that.

Once you have this initial Point3d object you can manipulate it with various rhinoscript and RhinoCommon methods. You cannot rotate it directly with rs.RotateObject() because that method only acts on objects already in the document - represented by their GUID. The easiest way to rotate it then is to create a rotation transformation with rhinoscriptsyntax and then apply it to the object (I know this is a bit abstract, but it’s pretty common way of working).

This rotation transformation needs a center point, an angle (in degrees), and an axis direction about which to rotate - think 3D here. The axis direction is a vector which points along the direction of the axis, and that will be applied at the rotation center point. In this case, as we are working from the Top view, I fixed the axis direction as the world Z axis, thus the vector is (0,0,1). I used rs.coerce3dvector() in exactly the same way as rs.coerce3dpoint() and it creates a RhinoCommon Vector3d object…

Then the loop takes care of the rest, we rotate the original point by i times the angle increment at every iteration, and put a copy into the point list.

Hope this explanation was clear enough…

–Mitch

2 Likes

Thank You Very Much @Helvetosaur.

Hello @Helvetosaur, what if I don’t want to the center of the polygon to be [0,0,0] but any 3d point in space? I tried changing the origin, but the length of the sides changed.

Hello,

You could create the object at the origin and then move it.

That’s because the radius is also fixed from the origin by this line:

 pt01 = rs.coerce3dpoint([self.radius,0,0])

So for the radius point you would need to use the center point to which the x value has the radius added…

Something like:

pt01 = rs.coerce3dpoint([origin.X+self.radius,origin.Y,origin.Z])

Or do that… :stuck_out_tongue:

Thanks guys:grinning: