[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20190] trunk/blender/release/scripts/ bpymodules/colladaImEx: Collada scripts updated,

Remigiusz Fiedler migius at 4d-vectors.de
Thu May 14 01:28:53 CEST 2009


Revision: 20190
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20190
Author:   migius
Date:     2009-05-14 01:28:53 +0200 (Thu, 14 May 2009)

Log Message:
-----------
Collada scripts updated,
patch commited by Jan Smith (collad)
[#18726] COLLADA export doesn_t convert names correctly to valid COLLADA id_s: 
# 2009.05.11 by jan:
# - Perfected the id renaming to fulfill at 100.0% the COLLADA standard for allowed UTF-8 
#	chars. The new renaming method is also much faster then the old one (benchmarked with
#	Python 2.5).
# - Fixed the skeleton/joint controller!
#	(Corrected the referencing of the 
#	"<skin><source><technique_common>,<accessor source="...">"
#	attribute. It pointed to its <source> node, and not the array in <source>.) 

Modified Paths:
--------------
    trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py
    trunk/blender/release/scripts/bpymodules/colladaImEx/cutils.py
    trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py

Modified: trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py
===================================================================
--- trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py	2009-05-13 22:52:31 UTC (rev 20189)
+++ trunk/blender/release/scripts/bpymodules/colladaImEx/collada.py	2009-05-13 23:28:53 UTC (rev 20190)
@@ -3485,8 +3485,16 @@
 	return True
 
 def StripString(text):
+	'''
+	Ensures the id names are valid COLLADA ids.
+	Dots (.) are evaluated as member accessors in COLLADA.
+	Therefore the renaming from "." to "_" is very important.	
+	See "COLLADA Specification, Schema Concepts 3-3, COLLADA
+	Target Adressing".
+	See also cutily.py, translateMap variable docu.
+	'''
 	if text != None:
-		return text.replace(' ','_').replace('.','_')
+		return MakeIDXMLConform(text)
 	else:
 		return text;
 

Modified: trunk/blender/release/scripts/bpymodules/colladaImEx/cutils.py
===================================================================
--- trunk/blender/release/scripts/bpymodules/colladaImEx/cutils.py	2009-05-13 22:52:31 UTC (rev 20189)
+++ trunk/blender/release/scripts/bpymodules/colladaImEx/cutils.py	2009-05-13 23:28:53 UTC (rev 20190)
@@ -27,7 +27,52 @@
 import os
 import Blender
 from Blender.Mathutils import *
+import string
 
+'''
+Translation map.
+Used to translate every COLLADA id to a valid id, no matter what "wrong" letters may be
+included. Look at the IDREF XSD declaration for more.
+Follows strictly the COLLADA XSD declaration which explicitly allows non-english chars,
+like special chars (e.g. micro sign), umlauts and so on.
+The COLLADA spec also allows additional chars for member access ('.'), these
+must obviously be removed too, otherwise they would be heavily misinterpreted.
+''' 
+translateMap = "" + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(45) + chr(95) + chr(95) + \
+	chr(48) + chr(49) + chr(50) + chr(51) + chr(52) + chr(53) + chr(54) + chr(55) + \
+	chr(56) + chr(57) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(65) + chr(66) + chr(67) + chr(68) + chr(69) + chr(70) + chr(71) + \
+	chr(72) + chr(73) + chr(74) + chr(75) + chr(76) + chr(77) + chr(78) + chr(79) + \
+	chr(80) + chr(81) + chr(82) + chr(83) + chr(84) + chr(85) + chr(86) + chr(87) + \
+	chr(88) + chr(89) + chr(90) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(97) + chr(98) + chr(99) + chr(100) + chr(101) + chr(102) + chr(103) + \
+	chr(104) + chr(105) + chr(106) + chr(107) + chr(108) + chr(109) + chr(110) + chr(111) + \
+	chr(112) + chr(113) + chr(114) + chr(115) + chr(116) + chr(117) + chr(118) + chr(119) + \
+	chr(120) + chr(121) + chr(122) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(183) + \
+	chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + chr(95) + \
+	chr(192) + chr(193) + chr(194) + chr(195) + chr(196) + chr(197) + chr(198) + chr(199) + \
+	chr(200) + chr(201) + chr(202) + chr(203) + chr(204) + chr(205) + chr(206) + chr(207) + \
+	chr(208) + chr(209) + chr(210) + chr(211) + chr(212) + chr(213) + chr(214) + chr(95) + \
+	chr(216) + chr(217) + chr(218) + chr(219) + chr(220) + chr(221) + chr(222) + chr(223) + \
+	chr(224) + chr(225) + chr(226) + chr(227) + chr(228) + chr(229) + chr(230) + chr(231) + \
+	chr(232) + chr(233) + chr(234) + chr(235) + chr(236) + chr(237) + chr(238) + chr(239) + \
+	chr(240) + chr(241) + chr(242) + chr(243) + chr(244) + chr(245) + chr(246) + chr(95) + \
+	chr(248) + chr(249) + chr(250) + chr(251) + chr(252) + chr(253) + chr(254) + chr(255)
+
+
 #---Classes---
 
 class Debug(object):
@@ -316,9 +361,21 @@
 	print name,"euler: ", newMat.toEuler()
 	print name,"scale: ", newMat.scalePart()
 	
+def MakeIDXMLConform(id):
+	'''
+	Make the name/id COLLADA XML/XSD conform.
+	See StripString and translateMap docu for more information.
+	'''
+	if (len(id) > 0 and id[0] == '#'):
+		return '#' + string.translate(id[1:], translateMap)
+	else:
+		return string.translate(id, translateMap)
+		
 def AdjustName(adjustedName):
-	'''Adjust every name to fit to collada.py's StripString renaming (. -> _) and making 
-	sure the name starts with a letter.'''
+	'''
+	Make the name/id COLLADA XML/XSD conform.
+	See StripString and translateMap docu for more information.
+	'''
 	if len(adjustedName) > 0 and not adjustedName[0].isalpha():
 		adjustedName = "i"+adjustedName
-	return adjustedName.replace('.', '_')
+	return MakeIDXMLConform(adjustedName)

Modified: trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py
===================================================================
--- trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py	2009-05-13 22:52:31 UTC (rev 20189)
+++ trunk/blender/release/scripts/bpymodules/colladaImEx/translator.py	2009-05-13 23:28:53 UTC (rev 20190)
@@ -24,6 +24,14 @@
 # --------------------------------------------------------------------------
 
 # History
+# 2009.05.11 by jan:
+# - Perfected the id renaming to fulfill at 100.0% the COLLADA standard for allowed UTF-8 
+#	chars. The new renaming method is also much faster then the old one (benchmarked with
+#	Python 2.5).
+# - Fixed the skeleton/joint controller!
+#	(Corrected the referencing of the 
+#	"<skin><source><technique_common>,<accessor source="...">"
+#	attribute. It pointed to its <source> node, and not the array in <source>.) 
 # 2009.04.16 by jan:
 # - Added the possibility to export models with modifiers (mirrors, transformers, etc.).
 # - Added helpful messages for users in case something goes wrong, so they know how and
@@ -1007,7 +1015,7 @@
 		jointSourceArray.id = self.document.CreateID(jointSource.id, "-array")
 		jointSource.techniqueCommon.accessor = jointAccessor = collada.DaeAccessor()
 		jointAccessor.AddParam("JOINT",collada.DaeSyntax.IDREF)
-		jointAccessor.source = jointSource.id
+		jointAccessor.source = jointSourceArray.id
 		daeSkin.sources.append(jointSource)
 		# And the input for the joints
 		jointInput = collada.DaeInput()
@@ -1028,7 +1036,7 @@
 		weightSourceArray.id = self.document.CreateID(weightSource.id, "-array")
 		weightSource.techniqueCommon.accessor = weightAccessor = collada.DaeAccessor()
 		weightAccessor.AddParam("WEIGHT","float")
-		weightAccessor.source = weightSource.id
+		weightAccessor.source = weightSourceArray.id
 		daeSkin.sources.append(weightSource)
 		# And the input for the weights
 		weightInput = collada.DaeInput()
@@ -1048,7 +1056,7 @@
 		poseSource.techniqueCommon.accessor = poseAccessor = collada.DaeAccessor()
 		poseAccessor.AddParam("","float4x4")
 		poseAccessor.stride = 16
-		poseAccessor.source = poseSource.id
+		poseAccessor.source = poseSourceArray.id
 		daeSkin.sources.append(poseSource)
 		# Add the input for the poses
 		poseInput = collada.DaeInput()





More information about the Bf-blender-cvs mailing list