Solved c4d.modules.volume.VolumeObject.GetVolume() returns unknown data type

Env.: R20, Windows
Lang.: Python

@s_bach said in Check object (poly) intersect:

Regarding Volume Interface: if you have problems using the Volume object, please report this in a new thread. There are some issues with the API, that are fixed in the next version.

To formalize it: c4d.modules.volume.VolumeObject.GetVolume() returns a unknown data type and Cinema 4D did crash on me when I tried try to access the value (I think I did something like dir(my_volumeInterface)).

I always assumed this was somehow intentional/NYI since the Python SDK has no maxon framework and VolumeInterface type (yet), although the Python SDK states that return type of GetVolume() is maxon.VolumeInterface.

If VolumeInterfaces aren't introduced into the R21 Python SDK, it might be a good idea to flag related methods as NYI.

Cheers
zipit

MAXON SDK Specialist
developers.maxon.net

Hello,

maxon is not a framework, but a module. It is actually available in R20 (just not documented). It can be imported like this:

import maxon

Volume interfaces are part of the volume framework:

from maxon.frameworks import volume as v

With these interfaces it is possible to use the volume classes:

import c4d
import maxon
from maxon.frameworks import volume as v

def main():
    # Create VolumeObject
    volumeObj = c4d.BaseObject(c4d.Ovolume)
    if volumeObj is None:
        return
    
    # Insert the volume Object within the scene
    doc.InsertObject(volumeObj, None, None)
    
    # Create volume
    volume = v.VolumeToolsInterface.CreateNewFloat32Volume(0.0)
    volume.SetGridClass(c4d.GRIDCLASS_FOG)
    volume.SetGridName("Example Grid")
    
    scaleMatrix = maxon.Matrix()
    volume.SetGridTransform(scaleMatrix)
    
    # Create accessor
    access = v.GridAccessorInterface.Create(maxon.Float32)
    access.Init(volume)
    
    # Set values in the shape of a helix
    offset = 0.0
    scale = 100.0
    scaleY = 10.0
    
    while offset < 50.0:
        
        res = c4d.utils.SinCos(offset)
        sin = res[0]
        cos = res[1]
        
        pos = maxon.IntVector32()
        pos.x = maxon.Int32(sin * scale)
        pos.y = maxon.Int32(cos * scale)
        pos.z = maxon.Int32(offset * scaleY)
        
        # Set value
        access.SetValue(pos, 10.0)
        
        offset = offset + 0.1
    
    # Insert volume in the VolumeObject
    volumeObj.SetVolume(volume)
    c4d.EventAdd()
    
if __name__=='__main__':
    main()

A volume is then accessed like:

volume = op.GetVolume()
print(volume)

Using dir() seems to crash, but this fixed in the next version.

The upcoming R21 Python documentation will include much more information on the MAXON API and the maxon module.

best wishes,
Sebastian

Hi,

thank you for the clarification.

Cheers
zipit

MAXON SDK Specialist
developers.maxon.net