GetAllHighlevelData vs. GetLowlevelDataAddressR

On 31/05/2015 at 04:41, xxxxxxxx wrote:

Hi All,

regarding the softselection tag, trying to call GetAllHighlevelData() as stated at VariableTag.GetAllHighlevelData()
I receive an error message:

TypeError: Unknown data of variable tag type.

I managed to work around with LowlevelData see code below:

But I don´t understand the
ByteSeq.\__add\_\_( other )
function.
What are we supposed to add at offset?
It seems to have no influence on the buffer.
Has anyone an idea how we should use it?

Thanks in advance
Martin

LowlevelDataAddress:

  
import c4d, array  
  
def mSetAllHighlevelData(variableTag, values) :  
  #pack 32 bit float      
  b = array.array('f',values)      
  buff = b.tostring()    
  wdata = variableTag.GetLowlevelDataAddressW()  
  if len(wdata)==len(buff) :  
      wdata[0:len(buff)] = buff  
  return  
    
  
def mGetAllHighlevelData(variableTag) :  
  #unpack 32 bit float  
  data = variableTag.GetLowlevelDataAddressR()  
  a = array.array('f')  
  a.fromstring(data)  
  weightarray = a.tolist()  
  return weightarray  
  
  
  
def main() :  
  tags = op.GetTags()  
  for ta in tags:  
      if ta.GetType()== c4d.Tsoftselection:  
          print "____________________________"  
          print "Softselection"  
                
          #set up a list  
          dcount =  ta.GetDataCount()  
          values = [1] * dcount  
                
          weightarray = mGetAllHighlevelData(ta)   
          print weightarray, "before"     
            
          mSetAllHighlevelData(ta, values)  
          weightarray = mGetAllHighlevelData(ta)  
  
          print weightarray, "after"  
            
  
                    
  c4d.EventAdd()                  
                    
  
if __name__=='__main__':  
  main()  

On 01/06/2015 at 07:58, xxxxxxxx wrote:

Hi Martin,

VariableTag.GetAllHighlevelData() doesn't support softselection tag (Tsoftselection). This is why you get the error "Unknown data of variable tag type."
In fact, VariableTag.GetAllHighlevelData() is just a wrapper around VariableTag.GetLowlevelDataAddressR(). It currently supports Tpoint, Ttangent, Tline, Tpolygon, Tsegment, Tvertexmap, Tnormal and Tuvw tag types.

ByteSeq.__add__() defines the "+" operator and does the same as ByteSeq.GetOffset():

seq = data + 4
seq = data.GetOffset(4)

ByteSeq.__add__() doesn't modify the ByteSeq object, it returns a new ByteSeq object at the given offset.

On 01/06/2015 at 11:43, xxxxxxxx wrote:

Hi Yannick,

Thanks for the reply !
Still, it might be good to write a small note in brackets into the sdk "not implemented yet" or something else. It was a little confusing at the beginning.
(I know it´s not supported yet, too, but it might be more consistent to write the sitckytexture tag data in 32 bit ,too, like the uv tag and not in double 64 bit, I´m not sure, there could be good reasons to do so.)

For

  
newdata = data.__add__(5)  

I receive an error message: "NotImplemented"
for

  
newdata = data + 5  

I receive an error message:
TypeError: unsupported operand type(s) for +: 'c4d.storage.ByteSeq' and 'int'

I assume it´s not supported, too.

Best wishes
Martin

On 02/06/2015 at 02:34, xxxxxxxx wrote:

Hi Martin,

There seem to have an issue with ByteSeq.__add__()/+ operator. Sorry I had not tested it before.
ByteSeq.GetOffset() does exactly the same so please use it instead.

On 09/06/2015 at 01:21, xxxxxxxx wrote:

Hi Yannick,

thanks for the confirmation.

Best wishes
Martin