SOLVED Beginner:How to set axis to the bottom of a cube by python?

Hi~i am a green hand, well, I think many beginners will meet the problem to set the axis to the specific point, make cube as an easy example, I am wondering how to achieve it
cube_axis.png
cube_axis2.png

import c4d
#Welcome to the world of Python


def main():
    cube=c4d.BaseObject(c4d.Ocube)
    
    '''how to set axis?(for exaple,to the bottom):grinning: '''
    
    
    doc.InsertObject(cube)
    c4d.EventAdd()   

Hi iLad,

primitives' axis cannot be changed because their geometry is parametric and generated by the object itself. If the object doesn't come with the function to change the axis, there's no chance to change it via code either.

However, if you have polygon objects, you simply move all points in a desired direction.
For example: If your cube is 200cm in Y dimension and the axis is centered, you simply add Y = 200/2 = 100cm to all points. Then you move the axis/object into the opposite direction for the same value to compensate the position.

Hi iLad, thanks for reaching out us.

With regard to your question, beside sponsoring @mp5gosu's answers, I also recommend to look at:

  • Matrix Fundamentals: a few basic information on matrices and geometry are provided
  • c4d.Matrix: the section describing the matrix class implementation in Cinema 4D
  • c4d.PointObject: the section describing the PointObject implementation (the class responsible for handling the vertex data of a generic object)

Wrapping all the above information together, you might end up with something like:

import c4d
from c4d import gui
#Welcome to the world of Python


def main():
    # check about op existance
    if op == None:
        return

    #check about op being derived from a PointObject
    if op.IsInstanceOf(c4d.Opoint) == False:
        return
    
    # set the offset of the axis
    offset = c4d.Vector(100,0,0)
    
    # move object
    m = op.GetMg()
    m.off = m.off + offset
    op.SetMg(m)
    
    # transform points
    padr = op.GetAllPoints()
    
    for i, point in enumerate(padr):
        point = point - offset
        op.SetPoint(i,point)
        
    op.Message(c4d.MSG_UPDATE)

if __name__=='__main__':
    main()
    c4d.EventAdd()

Note that the above example works properly only if you're supposed to make on offset of the axis and not if you're attempting to change axis orientation: in this latter case you've to compute the inverse transformation matrix and use this to reposition the object in space upon vertexes repositioning.

Best, Riccardo

@r_gigante Thanks,great help,i will retry in your way later.

@mp5gosu Thanks,great thought while only limit to still object rather than animated one with botton set axis.😀

@ilad Well, it's not limited to non-animated objects. As @r_gigante posted, you're actually modifying the points and the matrix. Both operations can also be achieved manually. So, no difference if animated or not.

The only thing you have to keep in mind when modifying animated objects is to make sure, all keys containing Matrix/PLA data have to be handled as well.