added encoding "# coding: utf-8" to the headers of scripts that python would not...
[blender.git] / release / scripts / rvk1_torvk2.py
1 #!BPY
2 # coding: utf-8
3 """ Registration info for Blender menus: <- these words are ignored
4 Name: 'Deformed mesh to Rvk'
5 Blender: 243
6 Group: 'Mesh'
7 Tip: 'Copy deform data (not surf. subdiv) of active obj to rvk of the 2nd selected obj'
8 """
9
10 __author__ = "Jean-Michel Soler (jms)"
11 __url__ = ("blender", "blenderartists.org",
12 "Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_rvk1versrvk2.htm",
13 "Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
14 __version__ = "2007/04/27"
15
16 __bpydoc__ = """\
17 "DEFORM to RVK2" copies deform data (except EDGESPLIT,DECIMATE,SUBSURF,BOOLEAN, 
18 BUILD,MIRROR,ARRAY) of the active object to the RVK (relative vertex key) of
19 the other selected object.
20
21 It is presupposed that the second mesh object is built exactly like the first
22 one. In fact, it is better to use a true copy with at least one basic shape
23 key.
24
25 The new version of this scrit (Blender 2.43) manages the modifier changes.
26 There are a lot of modifiers but only the ones which just deforms the shape
27 can be used : LATTICE, CURVE, WAVE, ARMATURE. You can unset these modifiers
28 from the script. 
29
30 Usage:
31
32 Select the object that will receive the rvk info, then select the deformed
33 object, enter Edit Mode and run this script from the "Mesh->Scripts" menu of
34 the 3d View.  If the active object has subsurf turned on and nonzero subdiv
35 level, the script will ask if it should change that.  Before copying data to
36 the rvk it will also ask whether it should replace or add a new vertex group.
37
38  
39 """
40
41 #----------------------------------------------
42 # jm soler (c) 2004-2007 : 'Deformed mesh to Rvk'  released under GPL licence
43 #----------------------------------------------
44 """
45 Ce programme est libre, vous pouvez le redistribuer et/ou
46 le modifier selon les termes de la Licence Publique Générale GNU
47 publiée par la Free Software Foundation (version 2 ou bien toute
48 autre version ultérieure choisie par vous).
49
50 Ce programme est distribué car potentiellement utile, mais SANS
51 AUCUNE GARANTIE, ni explicite ni implicite, y compris les garanties
52 de commercialisation ou d'adaptation dans un but spécifique.
53 Reportez-vous à la Licence Publique Générale GNU pour plus de détails.
54
55 Vous devez avoir reçu une copie de la Licence Publique Générale GNU
56 en même temps que ce programme ; si ce n'est pas le cas, écrivez à la
57 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
58 MA 02111-1307, États-Unis.
59
60
61 This program is free software; you can redistribute it and/or modify
62 it under the terms of the GNU General Public License as published by
63 the Free Software Foundation; either version 2 of the License, or
64 (at your option) any later version.
65
66 This program is distributed in the hope that it will be useful,
67 but WITHOUT ANY WARRANTY; without even the implied warranty of
68 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
69 GNU General Public License for more details.
70
71 You should have received a copy of the GNU General Public License
72 along with this program; if not, write to the Free Software
73 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
74 """
75 # Copy the rvk (1, or armature, lattice, or
76 # any mesh deformation except surface
77 # sbdivision) of the active object to rvk (2) of
78 # the second selected object. Create rvk or modify
79 # absolute key if needed.
80 #----------------------------------------------
81 # official Page :
82 # http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_rvk1versrvk2.htm
83 # download the script :
84 # http://jmsoler.free.fr/util/blenderfile/py/rvk1_torvk2.py
85 # Communicate upon problems or errors:
86 # http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender 
87 #----------------------------------------------
88 # Page officielle :
89 #   http://jmsoler.free.fr/util/blenderfile/py/rvk1_torvk2.py
90 # Communiquer les problemes et erreurs sur:
91 #   http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
92 #---------------------------------------------
93 #---------------------------------------------
94
95 import Blender
96 from Blender import NMesh,Draw,Object,Modifier
97
98 DEBUG=0
99
100 def Value(t):
101         exec "t=Modifier.Types.%s"%t
102         return t
103
104 def deform2rvk():  
105         POSSMOD_list=['EDGESPLIT',
106                                                                 'DECIMATE',
107                                                                 'SUBSURF', 
108                                                                 'BOOLEAN', 
109                                                                 'BUILD',
110                                                                 'MIRROR', 
111                                                                 'ARRAY']
112
113         AUTHMOD_list=['LATTICE',
114                       'CURVE', 
115                       'WAVE',
116                       'ARMATURE']
117
118         MODIFIERS=0
119         
120         BMOD=[['Possible Modifiers'],
121                                 ['Allowed Modifiers']]
122
123         #       =================================================================
124         # at leat 2 objects ===============================================
125         #       =================================================================
126         if len(Object.GetSelected())>1 :
127                 RVK1=Object.GetSelected()[0]
128                 RVK2=Object.GetSelected()[1]
129                 # =============================================================
130                 # must be 2 meshes ============================================
131                 # =============================================================
132                 if RVK1.getType()=='Mesh' and RVK2.getType()=='Mesh': 
133                         FRAME=Blender.Get('curframe') 
134                         DATA2=RVK2.getData()
135                         if DEBUG: print DATA2.getKey()
136                         # ============================================================
137                         # at least the second must have a shape key ==================
138                         # ============================================================
139                         if DATA2.getKey():
140                                 # ======================================================
141                                 # in case of modifiers use =============================
142                                 # ======================================================
143                                 if RVK1.modifiers:
144                                         MODIFIERS=1
145                                         POSSMOD=[Value(t) for t in POSSMOD_list]
146                                         AUTHMOD=[Value(t) for t in AUTHMOD_list]
147                                         if DEBUG: print 'POSSMOD:',POSSMOD,'\nAUTHMOD:', AUTHMOD
148                                         MODRVK1=RVK1.modifiers
149                                         block = []
150                                         # ===================================================
151                                         # ===  Bloc Menu Modifiers ===1 doc =================
152                                         # ===================================================
153                                         m=0
154                                         for mod in  MODRVK1: 
155                                                 if DEBUG: print mod.type
156                                                 if mod.type in POSSMOD:
157                                                         BMOD[0].append([Draw.Create(0),mod.type,
158                                                                                                                                         m,
159                                                                                                                                         POSSMOD_list[POSSMOD.index(mod.type)],
160                                                                                                                                         mod[Modifier.Settings.RENDER]==1,
161                                                                                                                                         mod[Modifier.Settings.EDITMODE]==1
162                                                                                                                                         ])
163                                                 elif mod.type in AUTHMOD:
164                                                         BMOD[1].append([Draw.Create(1),
165                                                                                                                         mod.type,
166                                                                                                                                         m,
167                                                                                                                                         AUTHMOD_list[AUTHMOD.index(mod.type)],
168                                                                                                                                         mod[Modifier.Settings.RENDER]==1,
169                                                                                                                                         mod[Modifier.Settings.EDITMODE]==1
170                                                                                                                                         ])
171                                                 m+=1
172                                         # ===================================================
173                                         # ===  Bloc Menu Modifiers ===2 display =============
174                                         # ===================================================
175                                         block.append(BMOD[1][0])
176                                         for     B in BMOD[1][1:]:
177                                                 block.append((B[3],B[0],""))
178                                         block.append(BMOD[0][0])
179                                         block.append("not alredy implemented")
180                                         block.append("in this script.")
181                                         for     B in BMOD[0][1:]:
182                                                 block.append((B[3],B[0],""))
183                                         retval = Blender.Draw.PupBlock("MESH 2 RVK", block)
184                                         # ===================================================
185                                         # ===  unset Modifiers  =============================
186                                         # ===================================================   
187                                         for     B in BMOD[0][1:]:
188                                                 if DEBUG: print B[2]
189                                                 MODRVK1[B[2]][Modifier.Settings.RENDER]=0
190                                         for     B in BMOD[1]:
191                                                 if not B[1]:
192                                                         MODRVK1[B[2]][Modifier.Settings.RENDER]=0
193                                         # ===================================================
194                                         # ===  update Modifiers =============================
195                                         # ===================================================
196                                         RVK1.makeDisplayList()                                                                  
197                                 # =======================================================
198                                 # ===  get deformed mesh ================================
199                                 # =======================================================
200                                 RVK1NAME=Object.GetSelected()[0].getName()
201                                 meshrvk1=NMesh.GetRawFromObject(RVK1NAME)  
202                                 if DEBUG: print len(meshrvk1.verts)
203                                 # =======================================================
204                                 # ===  get normal mesh for vertex group =================
205                                 # =======================================================
206                                 DATA1=RVK1.getData()
207                                 # =======================================================
208                                 # ===  get destination mesh  ============================
209                                 # =======================================================
210                                 DATA2=RVK2.getData()
211                                 if DEBUG: print len(meshrvk1.verts)
212                                 if DEBUG: print len(DATA2.verts)                                                        
213                                 # ========================================================
214                                 # ===== is there the same number of vertices =============
215                                 # ========================================================
216                                 if len(meshrvk1.verts)==len(DATA2.verts): 
217                                         name = "Do you want to replace or add vertex groups ? %t| YES %x1| NO ? %x2 " 
218                                         result = Draw.PupMenu(name)
219                                         if result==1:       
220                                                 # =====================================================
221                                                 # ===== Do we save vertex groups ?  ===================
222                                                 # =====================================================
223                                                 GROUPNAME2=DATA2.getVertGroupNames() 
224                                                 if len(GROUPNAME2)!=0:
225                                                         for GROUP2 in GROUPNAME2:
226                                                                 DATA2.removeVertGroup(GROUP2)
227                                                 GROUPNAME1=DATA1.getVertGroupNames()
228                                                 if len(GROUPNAME1)!=0:
229                                                         for GROUP1 in GROUPNAME1:
230                                                                 DATA2.addVertGroup(GROUP1)
231                                                                 DATA2.assignVertsToGroup(GROUP1,DATA1.getVertsFromGroup(GROUP1),1.0,'replace')
232                                         # ========================================================
233                                         # ===== now copy the vertices coords =====================
234                                         # ========================================================
235                                         for v in meshrvk1.verts:
236                                                 i= meshrvk1.verts.index(v) 
237                                                 v1=DATA2.verts[i]
238                                                 for n in [0,1,2]:
239                                                         v1.co[n]=v.co[n]
240                                         DATA2.update() 
241                                         DATA2.insertKey(FRAME,'relative')
242                                         DATA2.update()
243                                         RVK2.makeDisplayList()
244                                         if MODIFIERS:
245                                                 # ===================================================
246                                                 # ===  unset Modifiers  =============================
247                                                 # ===================================================
248                                                 for     B in BMOD[0][1:]:
249                                                         MODRVK1[B[2]][Modifier.Settings.RENDER]|=B[-2]
250                                                 for     B in BMOD[1]:
251                                                         if not B[1]:
252                                                                 MODRVK1[B[2]][Modifier.Settings.RENDER]|=B[-2]
253                                 else:
254                                         name = "Meshes Objects must the same number of vertices %t| Ok. %x1" 
255                                         result = Draw.PupMenu(name)
256                                         return
257                         else:
258                                 name = "Second Object must have  at least a shape key %t| Ok. %x1" 
259                                 result = Draw.PupMenu(name)
260                                 return
261                 else:   
262                         name = "Object must be Meshes %t| Ok. %x1" 
263                         result = Draw.PupMenu(name)
264                         return 
265         else :
266                 name = "At least 2 Meshes as to be selected %t| Ok. %x1" 
267                 result = Draw.PupMenu(name)
268                 return
269         Blender.Redraw()  
270 EDITMODE=Blender.Window.EditMode()
271 Blender.Window.EditMode(0)
272 deform2rvk()
273 Blender.Window.EditMode(EDITMODE)