from pygiftiio import * from ctypes import * import numpy # setup image = GiftiImage() # CTypes provides constructors for pointer-based types. This is important # to the initialization of the various members of the structs we need # to write via the library. image.version = c_char_p("version_string") image.darray = POINTER(POINTER(GiftiDataArray))() image.data = c_void_p(None) image.numDA = c_int(0) image.swapped = c_int(0) image.compressed = c_int(0) # type(im) = GiftiImage # type(ver) = str def set_version(im, ver): image.version = c_char_p(ver) # type(im) = GiftiImage # type(numDA) = int def set_numDA(im, numDA): im.numDA = c_int(numDA) # type(im) = GiftiImage # type(md) = GiftiMetaData def set_meta_data(im, md): im.meta = md # type(im) = GiftiImage # type(da) = GiftiDataArray def add_data_array(im, da): cur_numda = im.numDA # Create a pointer to the new dataarray da_ptr = pointer(da.data) # Grab the pointer to the image's dataarrays ptr = image.darray # Create a new dataarray array pointer ar = (POINTER(GiftiDataArray)*(cur_numda+1))() # We need to cast the resulting pointer for use by C ar = cast(ar, POINTER(POINTER(GiftiDataArray))) # Copy all of the current da's to the new array. This just copies the pointers! for i in xrange(num_da): ar[i] = im.darray[i] # Add the new data array to the image's data ar[num_da] = da_ptr # Reassign the pointer im.darray = ar # Tell the image it has an extra DA now cur_numda += 1 im.numDA = c_int(cur_numda) # type(da) = GiftiDataArray # type(axis) = int # type(val) = int def set_da_dim(da, axis, val): # Simple setter. However, the axis variable here is a # python array index (as the da dims is an array) # To properly assign the value, the val variable must # be usable by C, so we must form a c_int type. # This is true for all Setters. da.dims[axis] = c_int(val) # type(filename) = string # type(im) = GiftiImage def write_image(filename, im): return gifti_write_image, im, filename, 1)