Center Axis Function - Python Rebuild



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 18/10/2012 at 23:42, xxxxxxxx wrote:

    I was searching for a solution to set the parameters of Center Axis Dialog   an the send a modelling command, with no luck (it seems to be an old hardcoded Coffee Plugin).

    So I came to the conclusion I have to rebuild the function in Python, but my Matrices Math is not very good.

    I need the Axis of a Polygon Object moved to the "center" of all points.

    How do i do that - in other words Help.

    kind regards
    mogh



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 19/10/2012 at 01:29, xxxxxxxx wrote:

    Hey Mogh,

    I do not know about how to get the Center Axis Dialog but here is the mathematics way:
    http://stackoverflow.com/questions/2083771/a-method-to-calculate-the-centre-of-mass-from-a-stl-stereo-lithography-file



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 20/10/2012 at 00:47, xxxxxxxx wrote:

    As far as I kow, the only way to do this is to move all the vertices so they are equidistant from the axis.

    For example, consider an object with just two vertices, one is located at Y = 100, the other at Y = -20. These are local coords, of course, relative to the axis. To center the axis you would need to move the first point to Y = 60 and the other to Y = -60. You see that the points are the same distance apart (120 units) but now the axis is central to both. Then repeat for the X and Z axes.

    The algorithm would look something like this (sorry, C++ but easily portable to Python) :

      
    BaseObject *obj;   
    Real maxy, miny, diffy;   
    LONG i;   
    Vector *padr;   
      
    padr = ToPoint(obj)->GetPointW();   
    if(padr)   
    {   
         maxy = miny = 0.0;   
         for(i = 0; i < ToPoint(obj)->GetPointCount(); i++)   
         {   
              // get the maximum and minimum Y values   
              if(padr[i].y > maxy   
                   maxy = padr[i].y;   
              if(padr[i].y < miny)   
                   miny = padr[i].y;   
         }   
         // calculate the difference   
         diffy = (maxy - miny)/2.0 + miny;   
         // move the vertices   
         for(i = 0; i < ToPoint(obj)->GetPointCount(); i++)   
              padr[i].y -= diffy;   
    }   
    

    This is for the Y axis only, you'd need to amend it to include all three axes. Of course, doing this will appear to move your object in 3D space, so if that isn't desirable you would need to record the object's world position before you move the vertices, then alter it after moving the vertices to put it back in the same place. The algorithm for that is left to you :-)

    Steve



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 20/10/2012 at 16:36, xxxxxxxx wrote:

    GetMp() will give you the centre of Bounding Box for fast calculations

    Cheers
    Lennart



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 21/10/2012 at 10:21, xxxxxxxx wrote:

    Thanks for all your replys, i will try to incoorporate these solutions on monday.

    Nevertheless this seems awfull complicated - would be nice to have this function in the python helper class.

    kind regards mogh



  • THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

    On 22/10/2012 at 01:33, xxxxxxxx wrote:

    vec = c4d.Vector(0.0, 0.0, 0.0)   
      
    op = doc.GetFirstObject()   
    optemp = op   
              
    if optemp.GetRelPos() == vec:   
        print "Boundingbox: " + str(optemp.GetMp())   
        print "Local Matrix: " + str(optemp.GetRelPos())   
                     
        boundingboxaxis = optemp.GetMp()   
        #boundingboxaxis = c4d.utils.MatrixMove(boundingboxaxis)   
                     
        v1 = boundingboxaxis   
        v2 = c4d.Vector(0,0,0)   
        v3 = c4d.Vector(0,0,0)   
        Qoff = c4d.Vector(v1+v2)   
        newmatrix = c4d.Matrix(off, v1, v2, v3)   
                                       
        if optemp.SetMg(newmatrix) :   
            print "success"
    

    I am obviously doing something wrong, withe the matrix ... stuck again after getting some vectors with GetMp()

    Something is happening but my Object moves into deep space and points are moved instead of the axis.

    ...
    kind regards mogh


Log in to reply