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

    Retrieving several Inport Data?

    SDK Help
    0
    6
    859
    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

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

      On 07/01/2003 at 07:08, xxxxxxxx wrote:

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

      ---------
      Hi,
      I tried to get the inport data of my plugin node but I can only retrieve the data of the first port. The second one is NULL. I tried two ways:

          
          
          GvPort* ipt = bn->GetInPort(1);  
             GeData iptdata = GvGetPortGeData(bn, ipt, run);  
             Vector pos = iptdata.GetVector();  
          
          
          
          
             GvPort* inport = vinport->GetPort();   
             GeData inportdata = GvGetPortGeData(bn, inport, run);  
             Vector normale = inportdata.GetVector();
      

      the second one does give me the data of the first inport correctly. The first one doesn´t give me the data, though the port is correct and I can also get the name of the port. How can I get the data of several ports then?
      Thanks
      Samir

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

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

        On 08/01/2003 at 02:32, xxxxxxxx wrote:

        The ports must be calculated correctly. The easiest way is to always use the convenience functions for value tables. Please refer to this example: (And just add more ports to input_ids.)

            
            
            static LONG input_ids[] = { INPORT_LINK, 0 }; // Use this for the input ports!  
            enum { INPORT_LINK_INDEX };
            
            
            
            
            class Node: public GvOperatorData  
            {  
            // Defines super  
            INSTANCEOF(Node, GvOperatorData)  
            public:  
               
              virtual Bool iCreateOperator(GvNode *bn)  
              {  
                BaseContainer* data = bn->GetOpContainerInstance();   
                if (!data) return FALSE;
            
            
            
            
                data->SetLong(STEPS, 3);
            
            
            
            
                return SUPER::iCreateOperator(bn);  
              }  
                
                
              Bool InitCalculation(GvNode *bn, GvCalc *c, GvRun *r)  
              {  
                return GvBuildInValuesTable(bn, ports, c, r, input_ids);      
              }  
                
                
              void FreeCalculation(GvNode *bn, GvCalc *c)  
              {  
                GvFreeValuesTable(bn, ports);  
              }  
                
              Bool Calculate(GvNode *bn, GvPort *port, GvRun *run, GvCalc *calc)  
              {  
                if (!port) return FALSE;  
                  
                BaseContainer *data = bn->GetOpContainerInstance();  
                if (!data) return FALSE;
            
            
            
            
                LONG steps = data->GetLong(STEPS);  
                LONG mode = data->GetLong(MODE_ID);
            
            
            
            
                GvValue* vinport = ports.in_values[INPORT_LINK_INDEX];  
                if (!vinport) return FALSE; 
            
            
            
            
                if (!vinport->Calculate(bn, GV_PORT_INPUT, run, calc, 0)) return FALSE;  
                  
                GvPort* inport = vinport->GetPort();  
                GeData inportdata = GvGetPortGeData(bn, inport, run);
            
            
            
            
                BaseDocument* doc = bn->GetNodeMaster()->GetDocument();  
                if (!doc) return FALSE;
            
            
            
            
                BaseLink* link = inportdata.GetBaseLink();  
                if (!link) return FALSE;
            
            
            
            
                BaseList2D* list = link->GetLink(doc);  
                if (!list) return FALSE;  
                  
                switch(port->GetMainID())   
                {  
                case OUTPORT_LINK:  
                  {  
                    BaseObject* obj = static_cast<BaseObject*>(list);  
                    for (LONG i = 0; list && i < steps; ++i)  
                    {  
                      switch(mode)  
                      {  
                      case GETDOWN: obj = obj->GetDown(); break;  
                      case GETUP: obj = obj->GetUp(); break;  
                      case GETPRED: obj = obj->GetPred(); break;  
                      case GETNEXT: obj = obj->GetNext(); break;  
                      }       
                    } 
            
            
            
            
                    AutoAlloc<BaseLink> bl;  
                    if (!bl) return FALSE;  
                    bl->SetLink(obj);
            
            
            
            
                    return GvSetPortGeData(GeData(bl), bn, port, run);  
                  }  
                }  
                  
                return FALSE;  
              }  
                  
              static NodeData* Alloc(void) { return gNew Node; }
            
            
            
            
            private:  
              GvValuesInfo ports;  
            };
        
        1 Reply Last reply Reply Quote 0
        • H
          Helper
          last edited by

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

          On 08/01/2003 at 02:41, xxxxxxxx wrote:

          The ports must be calculated correctly. The easiest way is to always use the convenience functions for value tables. Please refer to this example: (And just add more ports to input_ids.)

              
              
              static LONG input_ids[] = { INPORT_LINK, 0 }; // Use this for the input ports!  
              enum { INPORT_LINK_INDEX };
          
          Hi,
          
          
          I am already doing this.
          
          
          static LONG input_ids[] = { NORMAL,0,LEAVECOUNT,1}; // Use this for the input ports!  
          enum { INPORT_LINK_INDEX };
          
          
          and then the same procedure as shown in your example above.
          
          
          here is some code then in my calculate method
          
              
              
              Bool Calculate(GvNode *bn, GvPort *port, GvRun *run, GvCalc *calc)    
                {      
                   
                 if (!port) return FALSE;          
                 BaseContainer *data = bn->GetOpContainerInstance();    if (!data) return FALSE;  
                 LONG offsetseed = data->GetLong(OFFSET_SEED);      
                 LONG offset = data->GetLong(OFFSET);  
                   
                 Random rnd;  
                 rnd.Init(offsetseed);
              
              
                 GvValue* vinport = ports.in_values[INPORT_LINK_INDEX];    if (!vinport) return FALSE;      
                 if (!vinport->Calculate(bn, GV_PORT_INPUT_OR_GEDATA, run, calc, 0)) return FALSE;   
                   
                 /*LONG portcnt = bn->GetInPortCount();  
                 GvPort* ipt = bn->GetInPort(1);  
                 GeData iptdata = GvGetPortGeData(bn, ipt, run);  
                 Vector pos = iptdata.GetVector();  */
              
              
                 GvPort* inport = vinport->GetPort();   
                 GeData inportdata = GvGetPortGeData(bn, inport, run);  
                 Vector normale = inportdata.GetVector();  
              
              
              [...]
          
          The problem is that I cannot get the second port with vinport->GetPort().
          
          
          This only returns the first inport. GetPort() should take a SubID parameter for the inport afaik
          
          
          but that doesn´t work either.
          
          
          Am I missing something? :\
          
          1 Reply Last reply Reply Quote 0
          • H
            Helper
            last edited by

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

            On 10/01/2003 at 02:03, xxxxxxxx wrote:

            Any conclusions yet?

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

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

              On 11/01/2003 at 07:03, xxxxxxxx wrote:

              Uhm, input_ids is supposed to be zero terminated. So you should have:

                  
                  
                  static LONG input_ids[] = { NORMAL,LEAVECOUNT,0};   
                  enum { INPORT_NORMAL_INDEX, INPORT_LEAVECOUNT_INDEX };
              

              Then you repeat the whole ports.in_values part for each port.

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

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

                On 11/01/2003 at 07:46, xxxxxxxx wrote:

                oh, ok. Works just fine now.
                Thanks
                P.s.: Mikael works at the weekend? 🙂

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