Making Spline Mask Editable



  • On 01/11/2013 at 10:44, xxxxxxxx wrote:

    I'm running this in a generator object.

    I want to make the Spline Mask editable so I can do more to it, however it returns an empty spline object.

    import c4d
    from c4d.utils.noise import C4DNoise
      
    def MakeEditable(op) :
        if (not op) | op.CheckType(c4d.Opolygon) | op.CheckType(c4d.Ospline) : return op
        op = [op.GetClone()]
        doc = c4d.documents.BaseDocument()
        doc.InsertObject(op[0],None,None)
        op = c4d.utils.SendModelingCommand(
                                      command = c4d.MCOMMAND_MAKEEDITABLE,
                                      list = op,
                                      mode = c4d.MODELINGCOMMANDMODE_EDGESELECTION,
                                      doc = doc )
        return op[0]
      
      
    def main() :
        obj = c4d.BaseObject(c4d.Osplinetext)
        objMask = c4d.BaseObject(1019396) #Spline Mask
        
        obj[c4d.PRIM_TEXT_TEXT] = "Test"
        objTemp1 = MakeEditable(obj)
        
        objTemp1[c4d.SPLINEOBJECT_INTERPOLATION] = 4
        objTemp1[c4d.SPLINEOBJECT_ANGLE] = 90
        objTemp1[c4d.SPLINEOBJECT_MAXIMUMLENGTH] = 25
     
        objTemp1.InsertUnder(objMask)
        
        obj3 = MakeEditable(objMask) #This line seems to kill it...
       
        obj3.Message (c4d.MSG_UPDATE)
        c4d.EventAdd()
        return obj3
        #return objMask #this works when it hasn't been make editable yet
    

    Any hints as to what I'm missing would be wonderful. Thanks so much,

    Chris Schmdit



  • On 01/11/2013 at 11:06, xxxxxxxx wrote:

    Hi Chris,

    I can reproduce your problem and reported to the developers. There'll be an answer soon. One note on
    your code though: Do not call c4d.EventAdd() from a Python Generator or Tag, only from commands (aka
    scripts). It is 1. completely redundant and 2. can lead to an infinite unbreakable refresh of your scene.

    Best,
    -Niklas



  • On 02/11/2013 at 15:30, xxxxxxxx wrote:

    @ CHris,

    print obj3 did give me <c4d.SplineObject object called 'Spline Mask/Spline' with ID 5101 at 0x0E541620> so it is working

    adding doc.InsertObject(obj3) will insert an edited spline

    You can use obj3 as global variable to use in another function.

    import c4d
    from c4d.utils.noise import C4DNoise
      
    def MakeEditable(op) :
        if (not op) | op.CheckType(c4d.Opolygon) | op.CheckType(c4d.Ospline) : return op
        op = [op.GetClone()]
        doc = c4d.documents.BaseDocument()
        doc.InsertObject(op[0],None,None)
        op = c4d.utils.SendModelingCommand(
                                      command = c4d.MCOMMAND_MAKEEDITABLE,
                                      list = op,
                                      mode = c4d.MODELINGCOMMANDMODE_EDGESELECTION,
                                      doc = doc )
        return op[0]
      
      
    def ReturnObj3() :
        global obj3 #declaring this variable as global will make it available in other functions
        obj = c4d.BaseObject(c4d.Osplinetext)
        objMask = c4d.BaseObject(1019396) #Spline Mask
        
        obj[c4d.PRIM_TEXT_TEXT] = "Test"
        objTemp1 = MakeEditable(obj)
        
        objTemp1[c4d.SPLINEOBJECT_INTERPOLATION] = 4
        objTemp1[c4d.SPLINEOBJECT_ANGLE] = 90
        objTemp1[c4d.SPLINEOBJECT_MAXIMUMLENGTH] = 25
     
        objTemp1.InsertUnder(objMask)
        
        obj3 = MakeEditable(objMask)
       
        obj3.Message (c4d.MSG_UPDATE)
        c4d.EventAdd()
        
        
    def main() :
        ReturnObj3()
        print obj3
        
    if __name__=='__main__':
        main()
    

    Hope this help



  • On 04/11/2013 at 12:24, xxxxxxxx wrote:

    Thanks for the replies guys!

    I solved that problem with a connect object instead of a spline mask before I saw the post from Focus3D. I have another question to follow up though.

    I've simplified the code as much as I can. If I remove a point, and update the number of points in the spline the generator is still returning a phantom point.

    Insert this code into a Python Generator, make it editable, select all the points and move them. There is a 'point' that can't be selected. Stuck here... any help would be killer.

    import c4d
    import math
    from c4d.utils.noise import C4DNoise
    #Welcome to the world of Python
      
    def MakeEditable(op) :
        if (not op) | op.CheckType(c4d.Opolygon) | op.CheckType(c4d.Ospline) : return op
        op = [op.GetClone()]
        doc = c4d.documents.BaseDocument()
        doc.InsertObject(op[0],None,None)
        op = c4d.utils.SendModelingCommand(
                                      command = c4d.MCOMMAND_MAKEEDITABLE,
                                      list = op,
                                      mode = c4d.MODELINGCOMMANDMODE_EDGESELECTION,
                                      doc = doc )
        return op[0]
      
    def main() :
        obj = c4d.BaseObject(c4d.Osplinetext)
        obj[c4d.PRIM_TEXT_TEXT] = "S"
        
        obj2 = MakeEditable(obj)
        obj2[c4d.SPLINEOBJECT_TYPE] = 0 #lin
        
        basePoints = obj2.GetAllPoints()
        pointCount = obj2.GetPointCount()
        pointList1 = []
        count3 = 0
        while (count3 < pointCount) :
      
            if(count3 != 0) :
                print "Point ", count3, basePoints[count3]," added"
                newPoint = basePoints[count3]
                pointList1.append(newPoint)
            count3 += 1
       
        print len(pointList1)
        obj2.ResizeObject(len(pointList1))
        obj2.SetAllPoints(pointList1)
        obj2.Message (c4d.MSG_UPDATE)
        return obj2
    

    Thanks again!



  • On 04/11/2013 at 13:09, xxxxxxxx wrote:

    Well I seem to have gotten around that by initiating a new spline object. Would still be curious why the first example didn't work though...

        obj3 = c4d.SplineObject(len(pointList1), c4d.SPLINETYPE_LINEAR)
        obj3[c4d.SPLINEOBJECT_CLOSED] = True
        obj3.SetAllPoints(pointList1)
        obj3.Message (c4d.MSG_UPDATE)
        return obj3
    


  • On 05/11/2013 at 16:30, xxxxxxxx wrote:

    @Chris,
    Which version of Cinema4D are you using?
    I tried your first code with c4d R13.061 with the Python Generator and it is working.
    try to close and restart cinema 4d.



  • On 06/11/2013 at 10:07, xxxxxxxx wrote:

    I'm currently tinkering in R14



  • On 06/11/2013 at 17:53, xxxxxxxx wrote:

    @Chris,
    for R14, you are right it is not working but if you use command = c4d.MCOMMAND_CURRENTSTATETOOBJECT instead of command = c4d.MCOMMAND_MAKEEDITABLE, it will work.
    Also try to use myDoc=c4d.documents.GetActiveDocument().

    Hope this will help.



  • On 08/11/2013 at 11:45, xxxxxxxx wrote:

    Thanks Focus, learning little by little.


Log in to reply