Blender (jusqu'à 2.49)
Python
MESH : 
Repérer le point d'intersection de deux segments 
en mode edit 
Pour Blender version  cvs 236 
du 07/02/2005  minimum
    Début   Index
précédentScript Python
Conserver les  rot/pos d'une contrainte Suivant

Fichier exemple

Edges en mode sélection
Conserver les seams et les edges
Le script
Le même objectif en utilisant la  fonction LineIntersect() de Mathutils 

Voir aussi :
Comment trouver la plus courte distance d'un point à une ligne 
Calculer le chemin le plus court entre deux lignes

Ce script permet de trouver le point d'intersection de deux segments  sélectionnés en mode édit. 

Il fonctionne aussi bien en sélection par point ...

que par edge.

Pour une raison encore indeterminée, dans les versions de l'API python  antérieure à Blender 2.4,  les edges ne sont pas reconnus si au moins un appel aux seams n'a pas été effectue par ctrl-e .

Méthode pour récupérer dans une liste  tous les edges en mode sélection :
 

# sachant que M est un mesh
# chaquelement e appartenant à la liste 
# M.edges peut etre teste avec l'expression
# e.flag&1
e=[e for e in M.edges if e.flag&1] 
...

Méthode pour mettre à jour un mesh en conservant les parametres des seams et d'edges.
 

# sachant que M est un mesh
# update accepte plusieurs parametres
# le premier pour recalculer les normales
# le second pour conserver les seams et les
# edges.

M.update(0,1)
...

Le Script 

# -------------------------------------
# Blender Version  cvs 236 
# 09/02/2005  minimum
#
# Pour une raison encore indeterminee
# les edges ne sont pas reconnus si
# au moins un appel aux seams n'a pas
# ete effectue par ctrl-e
# --------------------------------------
import Blender
if Blender.Get('version')>=236:
    from Blender import NMesh
    in_editmode = Blender.Window.EditMode()
    if in_editmode: 
        Blender.Window.EditMode(0)
    O=Blender.Object.GetSelected()[0]
    M=O.getData()
    e=[e for e in M.edges if e.flag&1] 
    if len(e)==2:
      A1 = e[0].v1.co
      B1 = e[0].v2.co
      u1 = [0,0,0]
      for i in range(3):
        u1[i] = B1[i]-A1[i]
      print u1
      A2 = e[1].v1.co
      B2 = e[1].v2.co
      u2 = [0,0,0]
      for i in range(3):
        u2[i] = B2[i]-A2[i]
      mu1 = (A1[1]-A2[1])*u1[0]-(A1[0]-A2[0])*u1[1]
      mu2 = u1[0]*u2[1]-u1[1]*u2[0]
      mu = mu1/mu2
      C = [0,0,0]
      for i in range(3):
         C[i] = A2[i]+mu*u2[i]
      p=Blender.NMesh.Vert(C[0],C[1],C[2])
      M.verts.append(p)
      M.update(0,1)
    else:
        print "only or at least 2 edges have to be selected"
    Blender.Window.EditMode(in_editmode)

Le même objectif en utilisant la fonction LineIntersect() de Mathutils 
 

# -------------------------------------
# Blender Version   241
# 18/02/2006 
# -------------------------------------

from Blender import Mathutils, NMesh, Object
MESH=Object.GetSelected()[0].getData()
EDGES=MESH.edges
NV=Mathutils.LineIntersect(Mathutils.Vector(EDGES[0].v1),
                              Mathutils.Vector(EDGES[0].v2),
                              Mathutils.Vector(EDGES[1].v1),
                              Mathutils.Vector(EDGES[1].v2))
print NV
MESH.verts.append(NMesh.Vert(NV[0][0],NV[0][1],NV[0][2]))
MESH.verts.append(NMesh.Vert(NV[1][0],NV[1][1],NV[1][2]))
MESH.addEdge(MESH.verts[-2],MESH.verts[-1])
MESH.update(0,1)


 
précédentScript Python
 Conserver les  rot/pos d'une contrainte Suivant
Vers le  Haut de page

Les questions concernant cette page  peuvent être posées sur  :
 news://news.zoo-logique.org/3D.Blender


 

 

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

mon site de démos sur youtube