ClientDistUpdate.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. """ClientDistUpdate module: contains the ClientDistUpdate class"""
  2. import DirectNotifyGlobal
  3. import Datagram
  4. from MsgTypes import *
  5. class ClientDistUpdate:
  6. notify = DirectNotifyGlobal.directNotify.newCategory("ClientDistUpdate")
  7. def __init__(self, cdc, dcField):
  8. self.cdc = cdc
  9. self.field = dcField
  10. self.number = dcField.getNumber()
  11. self.name = dcField.getName()
  12. self.types = []
  13. self.divisors = []
  14. self.deriveTypesFromParticle(dcField)
  15. # Figure out our function pointer
  16. exec("import " + cdc.name)
  17. try:
  18. self.func = eval(cdc.name + "." + cdc.name + "." + self.name)
  19. except:
  20. ClientDistUpdate.notify.warning(cdc.name + "." + self.name +
  21. " does not exist")
  22. self.func = None
  23. return None
  24. def deriveTypesFromParticle(self, dcField):
  25. dcFieldAtomic = dcField.asAtomicField()
  26. dcFieldMolecular = dcField.asMolecularField()
  27. if dcFieldAtomic:
  28. for i in range(0, dcFieldAtomic.getNumElements()):
  29. self.types.append(dcFieldAtomic.getElementType(i))
  30. self.divisors.append(dcFieldAtomic.getElementDivisor(i))
  31. elif dcFieldMolecular:
  32. for i in range(0, dcFieldMolecular.getNumAtomics()):
  33. componentField = dcFieldMolecular.getAtomic(i)
  34. for j in range(0, componentField.getNumElements()):
  35. self.types.append(componentField.getElementType(j))
  36. self.divisors.append(componentField.getElementDivisor(j))
  37. else:
  38. ClientDistUpdate.notify.error("field is neither atom nor molecule")
  39. return None
  40. def updateField(self, cdc, do, di):
  41. #func = eval(cdc.name + "." + cdc.name + "." + self.name)
  42. #print("Calling: " + cdc.name + "." + cdc.name + "." + self.name +
  43. # " for do " + str(do.getDoId()))
  44. # Get the arguments into a list
  45. args = self.extractArgs(di)
  46. # Apply the function to the object with the arguments
  47. apply(self.func, [do] + args)
  48. return None
  49. def extractArgs(self, di):
  50. args = []
  51. assert(len(self.types) == len(self.divisors))
  52. numTypes = len(self.types)
  53. for i in range(numTypes):
  54. args.append(di.getArg(self.types[i], self.divisors[i]))
  55. return args
  56. def addArgs(self, datagram, args):
  57. # Add the args to the datagram
  58. numElems = len(args)
  59. assert (numElems == len(self.types) == len(self.divisors))
  60. for i in range(0, numElems):
  61. datagram.putArg(args[i], self.types[i], self.divisors[i])
  62. def sendUpdate(self, cr, do, args):
  63. datagram = Datagram.Datagram()
  64. # Add message type
  65. datagram.addUint16(CLIENT_OBJECT_UPDATE_FIELD)
  66. # Add the DO id
  67. datagram.addUint32(do.doId)
  68. # Add the field id
  69. datagram.addUint16(self.number)
  70. # Add the arguments
  71. self.addArgs(datagram, args)
  72. # send the datagram
  73. cr.send(datagram)