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

    Change Global Matrix fails

    Scheduled Pinned Locked Moved PYTHON Development
    11 Posts 0 Posters 1.5k 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

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

      On 02/06/2011 at 09:03, xxxxxxxx wrote:

      ... creating my own matrix does not work either ??

      import c4d

      def main() :
        global o

      m = o.GetMg()
        mn = c4d.Matrix(m.off,m.v1,m.v2,m.v3)

      print mn.off.y
        mn.off.y = 500
        print mn.off.y
       
        o.SetMg(mn) 
        print mn

      The same output, y stays the same ...

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

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

        On 02/06/2011 at 09:38, xxxxxxxx wrote:

        In your example mn.off returns a new vector object where you change y. So the value is not assigned to the component of the internal vector of the Matrix.

        v=mn.off
        v.y=500
        mn.off=v

        Hope this helps.

        Cheers, Sebastian

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

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

          On 02/06/2011 at 09:54, xxxxxxxx wrote:

          Hmm, so

          mn.off is a method call ? I thought mn.off is just a reference to the c4d.Vector ?

          Thank you,
          maxx

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

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

            On 02/06/2011 at 10:12, xxxxxxxx wrote:

            Yes, it referres to the off component of a matrix.
            But getting an attribute of an instance invokes the instances __getattr ibute __ method, so it returns a value.

            @Sebastian:
            Why is the returned Vector not the original instance ? If so, that would do it all:

            mn.off.y = 20.
            
            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

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

              On 02/06/2011 at 10:22, xxxxxxxx wrote:

              How can I know, that matrix.off will become a method call?

              I can't see anything in the Matrix-API telling me that ?

              So, for now, each time when I access a member, I will need to check if it returns me a copy or not?

              Cheers,
              maxx

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

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

                On 02/06/2011 at 12:52, xxxxxxxx wrote:

                No. Sorry, I didn't want to confuse you. 😕

                In Pyhton, most classes support a methode called "__getattribute__" which is invoked when you want to get an attribute. The returnvalue of this method is what you recieve from the attribute-acess.

                The lower text was jsut for Sebastian. 😉

                No, you don't have to look it up. It's standart in Cinema 4D, and many other programs. I'm sure there is a sense, but I couldn't it figure out, yet.

                If the original isntance would have been returned, and not a copy, changing the vectors value would take affect in the matrix, too.

                That's how it's working:

                import c4d  
                  
                m = c4d.Matrix(*[c4d.Vector(0) for i in xrange(4)])  
                v = m.off  
                v.x = 100  
                print m.off.x # 0  
                  
                m.off.x = 100  
                print m.off.x # 0  
                  
                m.off = v  
                print m.off.x # 100, what we wanted :)
                

                More on Special Methods here.

                Cheers, Niklas

                PS: Yes it's wrong what i wrote in the previous post, not "getattr", instead "getattribute"

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

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

                  On 02/06/2011 at 13:36, xxxxxxxx wrote:

                  You didn't confuse me, it was the correct explanation 😉

                  But assume the Vector class wouldn't consist of atomic values, instead of references to a simple value-container class.

                  Now, if I call v.x = 100 I again can't be sure, if I just set the value to a copy (of the simpe value-continer) or the actual container value of v (just if the API would state so). Who tells me, when there is a hidden call ??

                  This seems a pretty strange concept to me, as I can't be sure that a reference to an attribute contains (or, returns) a copy or not ...

                  Cheers,
                  maxx

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

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

                    On 02/06/2011 at 14:02, xxxxxxxx wrote:

                    You can be sure. It is as it is. 😂

                    A matrix object does return a vector by calling i.e. m.off . But modifing this vector does not modify the original vector in the matrix.

                    A vector object does return an integer by calling i.e. v.x . But you can't modify this integer.
                    By setting a value to the vector, you set the value to the vector, not to a copy.

                    Omg, weird thing :S

                    btw, v.x = 100 invokes "v.__setattr__(100)", not "v.__getattribute__("x") = 100"

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

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

                      On 02/06/2011 at 14:45, xxxxxxxx wrote:

                      btw, v.x = 100 invokes "v.__setattr__(100)", not "v.__getattribute__("x") = 100"

                      Ok. Now its really clear 😉

                      Until now, I just got lucky, as I always created a vector first and then I set it on the matrix. This seems to be the first time, I tried to access a vector-component directly in this manner ...

                      Thank you,
                      maxx

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

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

                        On 02/06/2011 at 23:48, xxxxxxxx wrote:

                        It depends on the type and the level of access. If you call Matrix().off a copy (not the reference to the off vector) is returned. That yourmatrix.off.x=30 does not work is unfortunately a technical limitation. I will make a note for the docs.

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