User Tools

Site Tools


projects:houseofcards:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
projects:houseofcards:start [2016/07/09 17:40]
dwheele [Non-BMesh, Working script]
projects:houseofcards:start [2017/11/18 18:03] (current)
dwheele
Line 7: Line 7:
   * [[pythonoperators|Python Operators from Blender]]   * [[pythonoperators|Python Operators from Blender]]
   * [[cardfaceinfo|Card Face Graphic Info]]   * [[cardfaceinfo|Card Face Graphic Info]]
 +  * [[blenderarraynumbering|Blender Array Numbering]]
 +  * [[shufflecards|Shuffle Cards Routine in Python]]
 +  * [[physicssettings|Physics Settings]]
 +  * [[workingpython|Work Python Scripts (backup)]]
 +  * [[playingcardspecifics|Playing Card Specifics]]
  
 My example ''c:\Projects\HouseOfCards\panelTest.blend'' has one object "Panel" which has two material slots, My example ''c:\Projects\HouseOfCards\panelTest.blend'' has one object "Panel" which has two material slots,
Line 54: Line 59:
 **Following need to be run in Object mode** **Following need to be run in Object mode**
  
-UVs are stored in a UV layer:+==== Printing UVs for Object ==== 
 + 
 +UVs are stored in a UV layer, but still need to know which uv_layer goes with which face:
  
 <code python> <code python>
 +ob = bpy.data.objects["Panel"];
 +for uv_layer in ob.data.uv_layers:
 +    print("uv_layer: %s" % uv_layer.name)
 +
 for loop in ob.data.loops : for loop in ob.data.loops :
     uv_coords = ob.data.uv_layers[0].data[loop.index].uv     uv_coords = ob.data.uv_layers[0].data[loop.index].uv
-    print(uv_coords)+    print("Loop %d: %s" % (loop.index, uv_coords))
 </code> </code>
 +
 +==== Get UVs per Face, Example from web ====
 +
 +https://blenderartists.org/forum/showthread.php?254004-Accessing-UV-data-in-Python-script
 +
 +<code python>
 +import bpy
 +ob = bpy.data.objects["Panel"];
 +me = ob.data;
 +
 +for f in me.polygons:
 +    print("Polygon", f.index, "from loop index", f.loop_start, "and length", f.loop_total)
 +    for i in f.loop_indices: # <-- python Range object with the proper indices already set
 +        l = me.loops[i] # The loop entry this polygon point refers to
 +        v = me.vertices[l.vertex_index] # The vertex data that loop entry refers to
 +        print("\tLoop index", l.index, "points to vertex index", l.vertex_index, \
 +            "at position", v.co)
 +        for j,ul in enumerate(me.uv_layers):
 +            print("\t\tUV Map", j, "has coordinates", ul.data[l.index].uv, \
 +                "for this loop index")
 +</code>
 +
 +Noticing that the polygon where the vertex index set (2, 3, 6, 7, in my case) equals the set in the Vertex Group I defined, **has the proper UV set.**
 +
 +Their explanation:
 +
 +The me.loops object is really a lookup list, and each entry is NOT a loop in and of itself. The "loops" are really polygons and are stored in the me.polygons structure. Using me.polygons, you can slice the me.loops list into chunks.
 +
 +Running this on the default cube shows that me.polygons has six entries (the six faces of the cube). Each polygon refers to four loop indexes, making the me.loops list 24 entries long.
 +
 +Every UV layer in me.uv_layers has a "data" attribute that is a list that is the same length as the me.loops list. Every me.loops entry relates to the same index entry in the me.uv_layers[n].data list.
 +
 +
 +
 +==== Printing Vertices Per Mesh ====
  
 **Vertices** **Vertices**
Line 259: Line 305:
 Going back to non-BMESH method. In BMesh, it is difficult to assemble the correct types. Going back to non-BMESH method. In BMesh, it is difficult to assemble the correct types.
  
 +==== Get Face from Mesh defined by Vertex Group ====
 +
 +<code python>
 +import bpy
 +ob = bpy.data.objects["Panel"];
 +
 +
 +def getFaceFromObjectContainingVertexGroup(ob, vertexGroupName):
 +
 +  # First, get list of Vertexes in Vertex Group
 +
 +  groupIndex = -1
 +
 +  # This is an Object with a Mesh, see if it has the supported group name
 +  for i in range(0, len(ob.vertex_groups)):
 +    group = ob.vertex_groups[i]
 +    if group.name == vertexGroupName:
 +      groupIndex = i
 +
 +  # if we didn't find it, exit
 +  if (groupIndex < 0):
 +    return null
 +
 +  # Now access the vertices that are assigned to this group
 +
 +  bmVertGroupMembers = []
 +
 +  for v in ob.data.vertices:
 +    for vertGroup in v.groups:
 +      if vertGroup.group == groupIndex:
 +         print("Vertex %d is part of group."%(v.index))
 +         bmVertGroupMembers.append(v)
 +
 +  # at this point, we have a list of vertices in bmVertGroupMembers
 +  # belonging to group vertexGroupName, with index groupIndex
 +         
 +for f in me.polygons:
 +    print("Polygon", f.index, "from loop index", f.loop_start, "and length", f.loop_total)
 +    for i in f.loop_indices: # <-- python Range object with the proper indices already set
 +        l = me.loops[i] # The loop entry this polygon point refers to
 +        v = me.vertices[l.vertex_index] # The vertex data that loop entry refers to
 +        print("\tLoop index", l.index, "points to vertex index", l.vertex_index, \
 +            "at position", v.co)
 +        for j,ul in enumerate(me.uv_layers):
 +            print("\t\tUV Map", j, "has coordinates", ul.data[l.index].uv, \
 +                "for this loop index")
 +
 +</code>
  
projects/houseofcards/start.1468086010.txt.gz · Last modified: 2016/07/09 17:40 by dwheele