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
    • Recent
    • Tags
    • Users
    • Login

    Messages

    Scheduled Pinned Locked Moved SDK Help
    8 Posts 0 Posters 724 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 16/08/2009 at 12:53, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   10.5 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      I can receive the message MSG_TRANSLATE_POINTS in a TagPlugin, but so far I have not been able to receive this message in an ObjectPlugin.

      Is this possible?

      Also I have not been able to receive a MSG_POINTS_CHANGED in either a TagPlugin or an ObjectPlugin.

      Is there any way to receive these messages?

      Thanks hopefully,

      Nebu

      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 17/08/2009 at 03:22, xxxxxxxx wrote:

        MSG_POINTS_CHANGED works just fine in a TagData plugin. Remember that it is only called if the number of points changed, for instance if a point was deleted.

        As for ObjectData plugins, what are you trying to achieve, check for a change of the points of input objects?

        cheers,
        Matthias

        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 17/08/2009 at 10:32, xxxxxxxx wrote:

          Thank you for responding, I really appreciate that.

          Yes I did think the MSG_POINTS_CHANGED message would be sent when the position of a point changed.
          I have misinterpreted 'The points have changed' entry in the SDK.

          What I want to be able to do in an object or tag plugin is make changes to a polygon object as fast as possible.

          For example: A tag the user adds to a polygon object and after making a selection of points the user clicks on a button in the tag that effectively lock these points.
          The problem is what 'event/message' I should use to implement the freezing.
          I have the following code that works, but I am doing something we are not supposed to do: make changes in the structure of an object in the execute member of a TagPlugin (TagData).
          Still this example might be the most easiest to explain what I am after, so here is the relevant code:

          > \> LONG LockPoints::Execute(PluginTag \*tag, BaseDocument \*doc, BaseObject \*op, BaseThread \*bt, LONG priority, LONG flags) \> {      \>      PolygonObject\* objPoly =(PolygonObject\* )op; \>      ResetPoints(doc,objPoly); \>       \>      return EXECUTION_RESULT_OK; \> } \> \> Bool LockPoints::Message(GeListNode \*node, LONG type, void \*data) \> {     // Receives messages. \>      if (type == MSG_DESCRIPTION_COMMAND) \>      {     DescriptionCommand \*dc = (DescriptionCommand\* ) data; \>           PolygonObject\* objPoly; \>            \>           BaseTag\* tag = (BaseTag\* )node; \>           BaseObject\* obj = tag->GetObject(); \>           objPoly=(PolygonObject\* )obj; \>            \>           if (dc->id[0].id==LOCKPOINT_LOCKSELECTED) \>           {     LockSelected(node->GetDocument(),objPoly); \>           } \>           if (dc->id[0].id==LOCKPOINT_UNLOCKSELECTED) \>           { \>           } \>      } \>       \>      if (type == MSG_TRANSLATE_POINTS) \>      {     // Update the indexes as needed \>      } \>      return TRUE; \> } \> \> Bool LockPoints::LockSelected(BaseDocument \*doc, PolygonObject\* objPoly) \> {     BaseSelect \* objSelPoints; \>      LONG lngI; \>      LONG \* lngIndex; \>      Vector \* posIndex; \>      const Vector \* arrPoints; \> \>      if (!objPoly->IsInstanceOf(Opolygon)) \>           return FALSE; \>      objSelPoints=objPoly->GetPointS(); \>      LONG lngPointCount=objPoly->GetPointCount(); \>      LONG size = sizeof(LONG) \* objSelPoints->GetCount(); \>      pointArray = (LONG\* )GeAlloc(size); \>      if (!pointArray) \>           return FALSE; \>      size = sizeof(Vector) \* objSelPoints->GetCount(); \>      posArray = (Vector\* )GeAlloc(size); \>      arrPoints=objPoly->GetPointR(); \> \>      lngIndex = pointArray; \>      posIndex = posArray; \>      for (lngI=0;lngI<lngPointCount;lngI++) \>      {     if (objSelPoints->IsSelected(lngI)) \>           {     \*lngIndex=lngI; \>                \*posIndex=arrPoints[lngI]; \>                lngIndex++; \>                posIndex++; \>           } \>      } \>      lngLockedPoints=objSelPoints->GetCount(); \>       \>      return TRUE; \> } \> \> Bool LockPoints::ResetPoints(BaseDocument \*doc, PolygonObject\* objPoly) \> {     LONG \* lngIndex; \>      Vector \* posIndex; \>      LONG lngI; \>      LONG lngPointCount=objPoly->GetPointCount(); \>      Vector \* arrPoints; \>      lngIndex = pointArray; \>      posIndex = posArray; \>      arrPoints=objPoly->GetPointW(); \> \>      for (lngI=0;lngI<lngLockedPoints;lngI++) \>      {     if (arrPoints[\*lngIndex]!=\*posIndex) \>           {     arrPoints[\*lngIndex]=\*posIndex; \>           } \> \>           lngIndex++; \>           posIndex++; \>      } \> \>      return TRUE; \> } \>

          The ResetPoints function is called from the Execute, and in the important threading information in the SDK it states that this is not allowed.
          At least that is how I interpret it, it would be nice if I am wrong.

          If a user now selects a 'locked' point and wants to move it he can't because the position is immediately overwritten with the stored position.

          Now I have read that you could use the MessageData to capture the EVMSG_CHANGE.
          And in this topic I found how you could then call your own plugin again:

          Atom array compatibility

          But the EVMSG_CHANGE is only fired after the user completes dragging.
          So you can move the point and on releasing the mouse, the point jumps back to its locked position.
          What I want is a method that makes it look like you cannot move the points, like in my code, but then not violating the rules.

          Thanks,

          Nebu

          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 17/08/2009 at 11:50, xxxxxxxx wrote:

            MSG_UPDATE is the correct message sent when the bounding box needs to be recalculated - which is a sure sign that points changed position. It is also sent for other changes unfortunately.

            Still, user editing doesn't send messages until after the fact (except for MSG_PRETRANSLATE_XXX). You'll just have to be resigned to resetting the 'locked' points whenever you think there was possible manipulation of them. Actually keeping the user from moving them at all may be a tricky business.

            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 17/08/2009 at 12:38, xxxxxxxx wrote:

              Thank you Robert, I just checked to see if I receive MSG_UPDATE and MSG_POINTS_CHANGED messages and I do receive the MSG_POINTS_CHANGED when I delete a point but no MSG_UPDATE when I move a point.

              Only tried it with a TagPlugin yet. Still it sounds like it would give me the same situation as catching the EVMSG_CHANGE from the MessageData, so I could just use that.

              If it can't be done it can't be done, but I must say I did not expect that there would be no way to do it.

              Right now,as a last resort, I am looking at the RegisterSceneHookPlugin to see if that might be used. The following is from the SDK:

              SceneHookData
              This is a data class to register a function that will be called on every scene prepare, for example before redraw

              So I will just have a look and see.

              Cheers,

              Wim

              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 17/08/2009 at 13:16, xxxxxxxx wrote:

                Once again from the SDK:

                InitSceneHook()

                Called before all scene hooks and expressions in a scene are calculated. Here you can allocate temporary data in the node.

                FreeSceneHook()

                Called after all scene hooks and expressions in a scene are calculated, before the drawing starts. Here you can free temporary data allocated in InitSceneHook().

                So once again my interpretation is that these are called outside the drawing pipeline?

                I did a quick test with a GePrint in the InitSceneHook() and this does get fired multiple times when the user drags a point.
                So I might be able to use this to update points on a polygonobject??

                Cheers

                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 21/08/2009 at 03:17, xxxxxxxx wrote:

                  So I went ahead and implemented it.
                  Now I modify the positions of points in the InitSceneHook, and it does not crash, but then again doing it in the TagData::Execute() did not crash either.
                  So what I really would like to know is what I am doing safe?
                  Thanks,
                  Nebu

                  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 21/08/2009 at 03:28, xxxxxxxx wrote:

                    It is safe to change points positions in TagData::Execute. Just don't change the scene (inserting/deleting objects etc.).

                    cheers,
                    Matthias

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