Hi, Mr Ekinks
I think I have share ... it with you!!!
As you presented your wonderful response ... giving your customer ... 'the fish' ...
I have looked at your code and mine I laboured some time ago ...
Let's have a look:
Your sample:
"
colorProp = adsk.core.ColorProperty.cast(prop)
val = colorProp.value
if val:
result += ' Value: ' + (str(val.red) + ',' +
str(val.green) + ',' +
str(val.blue) + ',' +
str(val.opacity) + '\n')
else:
result += ' Value: Undefined\n'
elif prop.objectType == adsk.core.StringProperty.classType():
strProp = adsk.core.StringProperty.cast(prop)
result += ' Value: ' + strProp.value + '\n'
elif prop.objectType == adsk.core.FloatProperty.classType():
floatProp = adsk.core.FloatProperty.cast(prop)
result += ' Value: ' + str(floatProp.value) + '\n'
elif prop.objectType == adsk.core.BooleanProperty.classType():
boolProp = adsk.core.BooleanProperty.cast(prop)
result += ' Value: ' + str(boolProp.value) + '\n'
elif prop.objectType == adsk.core.ChoiceProperty.classType():
choiceProp = adsk.core.ChoiceProperty.cast(prop)
result += ' Value: ' + str(choiceProp.value) + '\n'
(returnValue, names, choices) = choiceProp.getChoices()
"
Mine sample:
"
for a in range( _propAppear.count 😞
aP = _propAppear.item(a)
apName = aP.name
apROnly = aP.isReadOnly
if ( apROnly == True 😞
apROnly = '<R>'
else:
apROnly = ''
apName = apName + apROnly
apType = aP.objectType
if ( apType == adsk.core.ColorProperty.classType() 😞
apColor = aP.value
if ( apColor == None 😞
maValue = 'Texture'
else:
maValue = '[{:d},{:d},{:d},{:d}]'.format( apColor.red, apColor.green, apColor.blue, apColor.opacity )
elif( apType == adsk.core.StringProperty.classType() 😞
apValue = aP.value
elif( apType == adsk.core.IntegerProperty.classType() 😞
apValue = aP.value
elif( apType == adsk.core.FloatProperty.classType() 😞
apValue = aP.value
elif( apType == adsk.core.ChoiceProperty.classType() 😞
apValue = aP.value
elif( apType == adsk.core.BooleanProperty.classType() 😞
apValue = aP.value
else:
try:
apValue = aP.value
except:
apValue = None
if ( apValue != None 😞
#propRecord.append( apType )
propRecord.append( apName )
propRecord.append( apValue )
"
I was so amazed! ... and no I am not saying that we copied from each other ...
but we certainly have had copied from somebody/something else 
Best Regards
MichaelT
MichaelT