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

    Problem with GetModelingAxis() [CLOSED]

    SDK Help
    0
    16
    1.3k
    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
      Helper
      last edited by

      On 04/07/2015 at 06:09, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R16 
      Platform:      Mac OSX  ; 
      Language(s) :     C++  ;

      ---------
      Hi,

      I'm working on a commandData/Dialog plugin and I noticed some weird behaviour with selecting objects.
      On a button press objects get updated (sometimes the object position itself, or points, edges or vertices).

      This also works on multiple objects, no matter which mode (object, model, point, edge or polygon).
      Now, when I select all my objects with cmd-a (ctrl-a on windows) it only updates one object, instead of them all. However, if I select all my objects with shift in the object-manager, they all get updated properly.

      Could this be a bug?
      Did somebody else have this problem?
      It's really weird, because I loop through al my selected objects, and both ways should select all my objects (and they visually do!) but with cmd-a it appears it doesn't.

      Thanks in advance for your help and time!

      Greetings,
      Casimir Smets

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

        On 04/07/2015 at 06:11, xxxxxxxx wrote:

        I have to note that sometimes with shift-select it also does some weird things, like going to the opposite direction of what was given. But mostly it behaves correctly.

        With kind regards,
        Casimir Smets

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

          On 06/07/2015 at 03:11, xxxxxxxx wrote:

          Can you please post some code?

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

            On 06/07/2015 at 03:31, xxxxxxxx wrote:

            Hi,

            Well, I have no code relevant to this bug?, but if you mean code to test the bug? out, here you go:

              
            case DLG_BUTTON_SET:  
                  {  
                      BaseDocument *doc = GetActiveDocument();  
                        
                      doc->StartUndo();  
                        
                      Float posX;         this->GetFloat(DLG_EDITNUMBER_X, posX);  
                      Float posY;         this->GetFloat(DLG_EDITNUMBER_Y, posY);  
                      Float posZ;         this->GetFloat(DLG_EDITNUMBER_Z, posZ);  
                        
                      Vector newPosition = Vector(posX, posY, posZ);  
                        
                      Int32 setAxis;      this->GetInt32(DLG_RADIOGROUP_AXIS_SET, setAxis);  
                      Bool setX;          this->GetBool(DLG_CHECKBOX_SET_X, setX);  
                      Bool setY;          this->GetBool(DLG_CHECKBOX_SET_Y, setY);  
                      Bool setZ;          this->GetBool(DLG_CHECKBOX_SET_Z, setZ);  
                      Int32 modelModeSet = doc->GetMode();  
              
            ....  
              
                      else if (modelModeSet == Mpoints)  
                      {  
                          AutoAlloc<AtomArray> selection;  
                          if (!selection)  
                              return false;  
                            
                          if (doc)  
                          {  
                              doc->GetActiveObjects(*selection, GETACTIVEOBJECTFLAGS_0);  
                              op = doc->GetActiveObject();  
                          }  
                            
                          if (selection->GetCount() > 1)  
                          {  
                              Vector globalModelingAxis = doc->GetHelperAxis()->GetMg().off;  
                              for (Int32 x = 0; x < selection->GetCount(); x++)  
                              {  
                                  Matrix objectAxis = static_cast<BaseObject*>(selection->GetIndex(x))->GetMg();  
                                  PointObject *opPoint = static_cast<PointObject*>(selection->GetIndex(x));  
                                  if (!opPoint) return false;  
                                  Matrix modelingAxis = opPoint->GetModelingAxis(doc);  
                                  doc->AddUndo(UNDOTYPE_CHANGE, opPoint);  
                                  Vector *points = opPoint->GetPointW();  
                                  if (!points) return false;  
                                  BaseSelect *bs = opPoint->GetPointS();  
                                  if (!bs) return false;  
                                  for (Int32 y = 0; y < opPoint->GetPointCount(); y++)  
                                  {  
                                      if (bs->IsSelected(y))  
                                      {  
                                          if (setAxis == DLG_RADIOGROUP_AXIS_SET_GLOBAL)  
                                          {  
                                              Vector projection = newPosition;  
                                              if (setX == true)  
                                                  projection.x = newPosition.x - globalModelingAxis.x;  
                                              if (setY == true)  
                                                  projection.y = newPosition.y - globalModelingAxis.y;  
                                              if (setZ == true)  
                                                  projection.z = newPosition.z - globalModelingAxis.z;  
                                              points[y] = points[y] + projection;  
                                          }  
                                          else if (setAxis == DLG_RADIOGROUP_AXIS_SET_LOCAL)  
                                          {  
                                              Vector projection = newPosition;  
                                              if (setX == true)  
                                                  projection.x = newPosition.x - modelingAxis.off.x + objectAxis.off.x;  
                                              if (setY == true)  
                                                  projection.y = newPosition.y - modelingAxis.off.y + objectAxis.off.y;  
                                              if (setZ == true)  
                                                  projection.z = newPosition.z - modelingAxis.off.z + objectAxis.off.z;  
                                              points[y] = points[y] + projection;  
                                          }  
                                      }  
                                  }  
                                  opPoint->Message(MSG_UPDATE);  
                              }  
                          }  
                          else if (selection->GetCount() == 1)  
                          {  
                              Matrix modelingAxis = op->GetModelingAxis(doc);  
                              Matrix objectAxis = op->GetMg();  
                              PointObject *opPoint = (PointObject* )op;  
                              if (!opPoint) return false;  
                              doc->AddUndo(UNDOTYPE_CHANGE, opPoint);  
                              Int32 pointCount = opPoint->GetPointCount();  
                              Vector *points = opPoint->GetPointW();  
                              BaseSelect *bs = opPoint->GetPointS();  
                              Int32 i;  
                              for (i = 0; i < pointCount; i++)  
                              {  
                                  if (bs->IsSelected(i))  
                                  {  
                                      if (setAxis == DLG_RADIOGROUP_AXIS_SET_GLOBAL)  
                                      {  
                                          Vector projection = newPosition;  
                                          if (setX == true)  
                                              projection.x = newPosition.x - modelingAxis.off.x;  
                                          if (setY == true)  
                                              projection.y = newPosition.y - modelingAxis.off.y;  
                                          if (setZ == true)  
                                              projection.z = newPosition.z - modelingAxis.off.z;  
                                          points[i] = points[i] + projection;  
                                      }  
                                      else if (setAxis == DLG_RADIOGROUP_AXIS_SET_LOCAL)  
                                      {  
                                          Vector projection = newPosition;  
                                          if (setX == true)  
                                              projection.x = newPosition.x - modelingAxis.off.x + objectAxis.off.x;  
                                          if (setY == true)  
                                              projection.y = newPosition.y - modelingAxis.off.y + objectAxis.off.y;  
                                          if (setZ == true)  
                                              projection.z = newPosition.z - modelingAxis.off.z + objectAxis.off.z;  
                                          points[i] = points[i] + projection;  
                                      }  
                                  }  
                                  op->Message(MSG_UPDATE);  
                              }  
                          }  
                          else  
                          {  
                              MessageDialog(String("There is no object selected."));  
                          }  
                      }  
            

            And the relevant layout:

              
              GroupBegin(DLG_EDITNUMBER_GROUP, BFH_LEFT, 0, 3, "", false);  
              AddEditNumber(DLG_EDITNUMBER_X, BFH_LEFT, 160);  
              AddEditNumber(DLG_EDITNUMBER_Y, BFH_LEFT, 160);  
              AddEditNumber(DLG_EDITNUMBER_Z, BFH_LEFT, 160);  
              GroupEnd();  
                
              AddSeparatorV(20);  
                
              GroupBegin(DLG_CHECKBOX_GROUP_SET, BFH_LEFT, 0, 3, "", false);  
              AddCheckbox(DLG_CHECKBOX_SET_X, BFH_LEFT | BFV_SCALEFIT, 0, 0, "X");  
              AddCheckbox(DLG_CHECKBOX_SET_Y, BFH_LEFT | BFV_SCALEFIT, 0, 0, "Y");  
              AddCheckbox(DLG_CHECKBOX_SET_Z, BFH_LEFT | BFV_SCALEFIT, 0, 0, "Z");  
              GroupEnd();  
                
              AddSeparatorV(20);  
                
              AddComboBox(DLG_RADIOGROUP_AXIS_SET, BFH_CENTER);  
              AddChild(DLG_RADIOGROUP_AXIS_SET, DLG_RADIOGROUP_AXIS_SET_GLOBAL, "Global");  
              AddChild(DLG_RADIOGROUP_AXIS_SET, DLG_RADIOGROUP_AXIS_SET_LOCAL, "Local");  
                
              AddSeparatorV(20);  
                
              AddButton(DLG_BUTTON_SET, BFH_LEFT, 0, 0, "SET");  
                
              GroupEnd();  
            

            I hope this is enough information, if not, just ask more.
            Also I think this problem has nothing to do with my code, so testing it with simpler code may be easier.

            Thanks in advance for your help and time!
            Greetings,
            Casimir Smets

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

              On 06/07/2015 at 04:09, xxxxxxxx wrote:

              Could it be, that the objects you are missing are always child objects?
              Then you need to use the flag GETACTIVEOBJECTFLAGS_CHILDREN on GetActiveObjects().

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

                On 06/07/2015 at 05:03, xxxxxxxx wrote:

                Hi,

                No, they are not children.

                Greetings,
                Casimir Smets

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

                  On 06/07/2015 at 07:29, xxxxxxxx wrote:

                  I can't reproduce any problems here.
                  My simple test code used on a button:

                  BaseDocument* doc = GetActiveDocument();
                  if (!doc)
                    return false;
                  AutoAlloc<AtomArray> selection;
                  if (!selection)
                    return false;
                    
                  doc->GetActiveObjects(*selection, GETACTIVEOBJECTFLAGS_0);
                  for (Int32 x = 0; x < selection->GetCount(); x++)
                  {
                    GePrint(static_cast<BaseObject*>(selection->GetIndex(x))->GetName());
                  }
                  

                  It print's just fine every selected object. Regardless, if I do a select all, use mouse drag selection or simply select a few with Shift-/Ctrl-Click. So I doubt this is a bug in Cinema.
                  Makes it also a bit difficult to help you.
                  Did you use a debugger to step through the code, in cases it doesn't work?

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

                    On 06/07/2015 at 07:54, xxxxxxxx wrote:

                    Hi,

                    Well, that problem seems to only occur when I'm in point, edge or polygon mode.
                    That's probably why you couldn't reproduce it.

                    And the problem is, my code ALWAYS works, it just sometimes doesn't work correctly (update the position to the wrong way). So debugging wouldn't help me, I guess.

                    Pff, this is really weird.

                    Should I make a video about how it behaves in C4D?

                    Thanks in advance for your help and time!
                    Cheers,
                    Casimir Smets

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

                      On 06/07/2015 at 08:11, xxxxxxxx wrote:

                      Honestly, with "my code ALWAYS works, it just sometimes doesn't work correctly" you made my day 😉

                      In my opinion, debugging always helps. Even if a program is producing results as expected, a debugger can generate great insights.

                      I tried it again, switching between point, edge and polygon modes. It didn't change, I still can't reproduce any irregularities with selecting objects. The code posted above still prints all selected objects.

                      I'm not sure, if a video will help. If you have the feeling, I did not understand the issue correctly, maybe a video can get us on the same page. On the other hand, the time might be better spent debugging your plugin. One strategy could be to consecutively deactivate more parts of your code, until either you found a part being responsible or you end up with a piece of code like mine above and you still see the issue. In the later case, we would probably need to file a bug report...

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

                        On 06/07/2015 at 10:18, xxxxxxxx wrote:

                        Hi Andreas,

                        Originally posted by xxxxxxxx

                        Honestly, with "my code ALWAYS works, it just sometimes doesn't work correctly" you made my day 😉

                        Well, I'm glad I did 😉

                        And it gives no problem with printing the objects.
                        The problem is when setting points, edges or polygons locally from a multi-objectselection.

                        Maybe it's best if you try it with my code after all...

                        And I will debug my plugin straight away, and check if it helps something.

                        Greetings,
                        Casimir Smets

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

                          On 06/07/2015 at 11:14, xxxxxxxx wrote:

                          Hi,

                          After debugging I found the line where the problem occurs, but I totally don't understand it!

                            
                          Matrix modelingAxis = opPoint->GetModelingAxis(doc);  
                          

                          I have tested this with 2 cubes with point-mode on.
                          I first tested the select all method, and after that the shift-select method.

                          In my first test, for my second cube, modelingAxis was just (0, 0, 0).

                          In my second test, for my second cube, modelingAxis was the proper value (84.250, 202.844, -32.124).

                          This happened with exactly the same code, so I am quite sure shift-select differs from select all. I definately can't see another reason right now.
                          Yeah, it's a thing!

                          Is this enough information to file a bug report, or do you guys also need to do some testing?

                          If needed, I could provide my whole project to MAXON.

                          With kind regards,
                          Casimir Smets

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

                            On 09/07/2015 at 09:00, xxxxxxxx wrote:

                            Hi Casimir,

                            unfortunately I still can't reproduce your issue.
                            I added code to print the offset of the modelling axis to my above code. No matter what method of selection (Ctrl-a, drag selection, shift or ctrl click) I tried and in which editing mode (points, edges, polys, object) I'm in, I always get all selected objects with correct modelling axis.

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

                              On 09/07/2015 at 09:41, xxxxxxxx wrote:

                              Hi Andreas,

                              Currently I'm working with other code that doesn't give that problem, due to not using the modeling axis anymore, but I'll change my code back for a moment, to make the movie which shows the problem, and change my code back. Because I still think this is sort of a bug.

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

                                On 26/08/2015 at 09:24, xxxxxxxx wrote:

                                After quite some research, I think, there is an issue with GetModelingAxis(). I filed a bug report for this.
                                I mark this thread as closed, but will post an update, when it is fixed.

                                Renamed thread from "Does select all differ from shift selecting??" to "Does select all differ from shift selecting??"

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

                                  On 26/08/2015 at 09:46, xxxxxxxx wrote:

                                  Hi Andreas,

                                  Thanks for your answer!

                                  I have to add that I had some problems recently with the protection tag, and also with the object-node with a rotation port combined with the universal node.
                                  I think this could have something to do with the axises.

                                  Maybe those are related to each other?

                                  The support team is currently busy with that, so if you want information about that, you can get it there. Or you could ask me to send the information via Mail, whatever you prefer.

                                  It's just a thought here, I can be completely wrong about this one.

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

                                    On 27/08/2015 at 11:16, xxxxxxxx wrote:

                                    Hi Casimir,

                                    it's pretty hard to tell, if there may be something related. Instead of getting several teams in parallel to work, I'd like to wait until you get response from support. And then it's probably a good thing to open a new thread, if any problem remains.

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