Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    order of operations

    Scheduled Pinned Locked Moved PYTHON Development
    7 Posts 0 Posters 745 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      On 11/09/2016 at 23:28, xxxxxxxx wrote:

      hello , 
      when I want to disable an object , do something with it , then re-enable it with the same script , the result I get is the same if the first (disable ) wasn't there , so I have to make another script to complete the first script job . 
      another example , is when I set the target of pose morph = obj  , then make the target = none (to clear the field , if it is not the correct way , please let me know ) in one code , the result is the same if I removed the part of the target = obj , so I have to make separate script , and every thing works fine .

      what I want to know , is there an order of operations in the python code ? or it is just from top to bottom , I tried to arrange my code , so the part I want to compile first is in the beginning and the other part in the end , but this seems to not work , so is there is a workaround to this problem without having to do many scripts ?
      if it is necessary I can provide the code I am working with , 
      🙂

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        On 12/09/2016 at 08:21, xxxxxxxx wrote:

        Hi,

        I have to admit, I'm not sure I understand your questions.
        After reading it multiple times, it could be you are missing a EventAdd() somewhere, but really this is just a wild guess.
        Maybe a bit of code could help clear things up. But please also provide us with the usual details: Where are you using Python (Script Manager, Python Generator, a plugin)? If a plugin, what type and in which function?

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          On 12/09/2016 at 10:12, xxxxxxxx wrote:

          hi , thanks for reply .
          I put EventAdd() in the end of the script ,
          I use the script in the script manager .
          this is a simple script , no scene files needed , just paste it in the script manager.

          import c4d
            
          def main() :
             #this is just scen preparation  
              obj = c4d.BaseObject(c4d.Ocube)
              morph =c4d.BaseObject(c4d.Osphere)
              doc.InsertObject(obj)
              doc.InsertObject(morph)
              obj[c4d.ID_BASELIST_NAME]="object"
              obj[c4d.PRIM_CUBE_SUBX]=2
              obj[c4d.PRIM_CUBE_SUBY]=2
              obj[c4d.PRIM_CUBE_SUBZ]=2
              morph[c4d.ID_BASELIST_NAME]="morph"
              morph[c4d.PRIM_SPHERE_TYPE]=2
              morph[c4d.PRIM_SPHERE_SUB]=6
              doc.SetActiveObject(morph)
              c4d.CallCommand(12236) #make editable
              doc.SetActiveObject(obj)
              c4d.CallCommand(12236) #make editable
              pmTag =c4d.BaseTag(c4d.Tposemorph)
              obj.InsertTag(pmTag)
              pmTag[c4d.ID_CA_POSE_POINTS]=True
              pmTag.AddMorph()
              pmTag.UpdateMorphs()
              mo = pmTag.AddMorph()
              pmTag.UpdateMorphs()
              count=pmTag.GetMorphCount()
              pmTag.SetActiveMorphIndex(count-1)
              #this is the problem 
              pmTag[c4d.ID_CA_POSE_TARGET]=morph
              pmTag[c4d.ID_CA_POSE_TARGET]=None #problem line
            
              c4d.EventAdd()
          if __name__=='__main__':
              main()    
          

          as you can see if you run the script you will see the cube will still have a cube shape , but if you 
          comment the "problem line " , the cube will have a sphere shape, then with another script just make the target = None , the target will be empty , but the cube will still have the sphere shape in the morph , which is what I want .
          this is not the only situation I have this problem , but it is just an example , is it possible to make it in one script without the need to split it into another script ?

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            On 12/09/2016 at 10:51, xxxxxxxx wrote:

            The "make editable" command doesnt re-evaluate the object. Using
            SendModelingCommand() would do this, or use DrawViews() or I
            think ExecutePasses() works as well before the make editable command.

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              On 12/09/2016 at 10:56, xxxxxxxx wrote:

              Originally posted by xxxxxxxx

              The "make editable" command doesnt re-evaluate the object. Using
              SendModelingCommand() would do this, or use DrawViews() or I
              think ExecutePasses() works as well before the make editable command.

              thanks for the tip , but I don't work with make editable command , it is just to create a simple scene to show the problem , because I didn't want to upload a scene file.🙂

              1 Reply Last reply Reply Quote 0
              • H Offline
                Helper
                last edited by

                On 13/09/2016 at 00:50, xxxxxxxx wrote:

                Hi,

                the following two lines:

                    pmTag[c4d.ID_CA_POSE_TARGET]=morph
                    pmTag[c4d.ID_CA_POSE_TARGET]=None #problem line
                

                do basically nothing (as you already found out). The parameter is set to one value (morph) and directly afterwards to another value (None). Very simplified like writing one value into a BaseContainer and directly afterwards overwriting it with another value.

                Instead you need to give Cinema 4D the chance (or rather command it to) evaluate the scene graph and execute all expressions (in this case the PoseMorph).
                Like so:

                    pmTag[c4d.ID_CA_POSE_TARGET]=morph
                    doc.ExecutePasses(None, False, True, False, c4d.BUILDFLAGS_0)
                    pmTag[c4d.ID_CA_POSE_TARGET]=None #problem line
                

                Note: The parameters passed to ExecutePasses() may vary depending on the given scenario.

                1 Reply Last reply Reply Quote 0
                • H Offline
                  Helper
                  last edited by

                  On 13/09/2016 at 03:16, xxxxxxxx wrote:

                  thank you very much Andreas , 
                  this solved my problem , did not know there is such commands to tell c4d , evaluate the scene graph , I will have to read the documentation , thanks again for the help 🙂

                  1 Reply Last reply Reply Quote 0
                  • First post
                    Last post