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

    Cython, return BaseContainer

    SDK Help
    0
    8
    673
    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 19/07/2015 at 22:20, xxxxxxxx wrote:

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

      ---------
      Hello

      I'm  trying to understand how to use reinterpret_cast to grab data from one class to other.
      I have packed gvnode in ui and trying to make concept of py-module.

      getbc.cpp:
      I have function, which return BaseContainer Class from reinterpret_cast gvnode,
      something like:
      _
      void foo()
      {
      _
      > _node stuff
      > ...
      > BaseContainer* bca = node->GetOpContainerInstance();
      > return bca;
      > _
      }

      **getbc.pyx:

      ** _cdef extern from "getbc.cpp":
      _
      > void foo()
      >
      **
      i stack how properly work with such stuff. I read several tutorials, but** don't understand a few things

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

        On 20/07/2015 at 11:21, xxxxxxxx wrote:

        I'm starting to write concept for c4dtoa api py module ... i have small experience of py-binding with several projects(not for c4d)

        Will post as text code. Lets start, small dirty code

        !Question[URL-REMOVED] i stack with BaseMaterial in c4dtoa.pyx. I still don't understand some things in cython

        build.bat :

          
        set MSSdk=1  
        set DISTUTILS_USE_SDK=1  
          
        call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\vcvarsx86_amd64.bat"  
        python.exe setup.py build_ext --inplace  
        pause  
        

        setup.py

        # -*- coding: utf-8 -*-  
          
        from distutils.core import setup  
        from Cython.Build import cythonize  
          
        setup(ext_modules = cythonize(  
                 "c4dtoa.pyx",                 # our Cython sourc  
                 sources=["aGetNode.cpp"],  # additional source file(s)  
                 language="c++",             # generate C++ code  
            )) 
        

        c4dtoa.pyx

          
        # -*- coding: utf-8 -*-  
          
        cdef extern from "c4d_basematerial.h":  
          ctypedef struct BaseMaterial:  
              pass  
          ctypedef void* BaseMaterial  
          
        cdef extern from "aGetNode.h":  
          void aGetNode(BaseMaterial* material)  
          
        def a_Get_Node(material) :  
          print "true"  
          cdef BaseMaterial material  
          aGetNode(&material) 
        

        aGetNode.cpp

        #include "c4d.h"  
        #include "aGetNode.h"  
          
        #define C4DAI_SNMATERIAL_SHADER_NODE 202  
          
        void C4DTOA::aGetNode(BaseMaterial * material)  
              {  
              GePrint("Init");  
          if(!material)  return FALSE;  
          GePrint("Init mat");  
          BaseContainer* bc = material->GetDataInstance();  
          BaseLink* bl = bc->GetBaseLink(C4DAI_SNMATERIAL_SHADER_NODE);  
          if (bl)  
          {  
            GvNode* bl2d = reinterpret_cast<GvNode*>(bl->GetLink(material->GetDocument()));  
            if (bl2d)  
            {  
              BaseContainer* bca = bl2d->GetOpContainerInstance();   
            }  
          else  
            GePrint("No link");  
              }      
              } 
        

        aGetNode.h

        #include "c4d.h"  
        #include "c4d_basematerial.h"  
          
        namespace c4dtoa {  
          class C4DTOA {  
          public:  
              virtual void aGetNode(BaseMaterial* material);  
          };  
        }
        

        [URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.

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

          On 21/07/2015 at 00:16, xxxxxxxx wrote:

          Has anybody try to cythonize c4d stuff in modules? Or need to use pythonLibrary?

          Upd.

          c4dtoa.pyx

           # -\*- coding: utf-8 -\*-  
            
          cdef extern from "c4dapi/c4d_basematerial.h":  
          	cdef cppclass BaseMaterial:  
          		void BaseMaterial()
          

          I reread docs, add Basematerial... still can't to understand how point at mat?!

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

            On 21/07/2015 at 10:13, xxxxxxxx wrote:

            Hi Ilya,

            I'm sorry, but SDK Support team won't be of much help here. Not only is this beyond our scope, but even worse, none of us has played around with Cython, yet. Sorry.
            Hopefully we have a knowing member in our community.

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

              On 21/07/2015 at 10:28, xxxxxxxx wrote:

              Hello Andreas
              Thank you for answer.

              I have dialog with coworker, he wrote need more attention at description of class and wrap c++ to cython another way.

              I started with something "complex", will to prepare simple dummy for understanding of c4d stuff binding

              Why i start? I found pyapi methods - c4d.bc.GetLink or .GetObjectLink - are not work for me and checkout your method(discussion with Mohamed Sakr) in c++ and it works(thank for that). I mean - GetBaseLink and etc. And i'm trying expand pyapi of c4d

              Hopefully we have a knowing member in our community.

              Probably i know 2 persons and they are Sebastian Rath(father 😉 of pyC4D) and Niklas Rosenstein(he brought one latest cython build, gave this cyber "drug"  and has wonderful examples at his git) !Clap[URL-REMOVED]


              [URL-REMOVED] @maxon: This section contained a non-resolving link which has been removed.

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

                On 22/07/2015 at 00:05, xxxxxxxx wrote:

                One little or tiny progress is being... but not all work, sad thing

                i read several questions at stackover flow , a few coders extract function from cpp, not from headers like me(i tried - many faults)... before i use dll to linking for some cad tools, thinking, that's my fault. I also not often compile cython modules -> low experience of it.

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

                  On 23/07/2015 at 13:36, xxxxxxxx wrote:

                  Hey Ilya,

                  getting Cython and the Cinema 4D C++ API work together will be a tough task. You must use the
                  PythonLibrary  in lib_py.cpp  to translate Cinema 4D C++ objects to Python objects and the reverse.
                  In order to use the Cinema 4D API from your Cython Module, it needs access to the C4DOS which is
                  the all-mighty function table for all the API calls in the C4D SDK. You need to find someway to initialize
                  the C4DOS inside your Cython module.

                  Best,
                  Niklas

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

                    On 23/07/2015 at 16:21, xxxxxxxx wrote:

                    Hi Niklas

                    getting Cython and the Cinema 4D C++ API work together will be a tough task

                    Yes, but one thing i understand that needs to prepare numerous pxd-files to reconstruct or convert/translate c4dstuff to cython stuff or any 3dparty sdk >> to get classes, functions and etc. then prepare in pyx(not all we can get from c4d module)
                    (i'm playing with autopxd stuff like xdress >> to simplify my life 😉)

                    i get  a few working things, like in-line stuff(in functions with pre-/faked c4d module, closer to "pure python mode")... only something needs  from headers of sdk(c4d or arnold) to bring new functions

                    You must use the PythonLibrary  in lib_py.cpp  to translate Cinema 4D C++ objects to Python objects and the reverse.

                    Thanks, soon, i will. I saw your APEX(-tension) and remember your questions about it > sdk teamer wrote that it "poor" documented or something like

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