Invité charles74 Posté(e) le 17 février 2011 Posté(e) le 17 février 2011 Bonjour à tous ! Je rencontre un problème en programmation vba, j'espère que vous pourrez m'aider ! Le but est de créer un point résultant de l'intersection de plusieurs faces 3D triangulées avec une droite.Le fichier dxf est déjà importé et est dessiné dans l'espace objet. la droite est également créée comme ci-dessous :[surligneur] Dim lineobj As AcadLine Set lineobj = ThisDrawing.ModelSpace.AddLine(Position_slt_1.Coordinates, Point_arbitraire.Coordinates)[/surligneur] 'Intersection entre le modèle triangulé de faces 3D "model_theorique" (contenues dans une sélection) et la droite "lineobj"[surligneur] Dim intPoints As Variant Dim h As Integer For h = 0 To f Step 1 'f nbre de faces 3D intPoints = lineobj.IntersectWith(model_theorique.Item(h), acExtendNone) 'Does not extend either object. Dim point_inter As AcadPoint Dim location4(0 To 2) As Double location4(0) = intPoints(0): location4(1) = intPoints(1): location4(2) = intPoints(2) Set point_inter = ThisDrawing.ModelSpace.AddPoint(location4) ThisDrawing.SetVariable "PDMODE", 34 ThisDrawing.SetVariable "PDSIZE", 1[/surligneur] Il me dit problème d'index avec la variable "intpoints". Je pense que je comprends mal son fonctionnement. Merci de votre aide,cordialement, Charles
(gile) Posté(e) le 20 février 2011 Posté(e) le 20 février 2011 Salut, Je ne pourrais pas t'aider en VBA, mais connaissant un peu l'interface COM (accessible aussi avec Visual LISP et .NET), il me semble que ton problème vient de l'utilisation de la valeur de retour de méthode IntersectWith. Cette méthode retourne un array de doubles (coordonnées des points d'intersection trouvés).Cet array est donc vide s'il n'y a pas d'intersection, il faut donc tester si l'array n'est pas vide avant de cherche à récupérer ses 3 premiers termes. D'autre part, IntersectWith utilisé avec une droite et une face 3d ne retournera que les intersections entre la droite et les arrêtes des faces.Si tu cherches une intersection à l'intérieur de la face 3d, il faut, par le calcul vectoriel trouver un point d'intersection entre la droite et le plan de la face 3d, et, si ce point existe, verifier qu'il est bien à l'intérieur du triangle. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité charles74 Posté(e) le 20 février 2011 Posté(e) le 20 février 2011 Bonjour Gile, Merci de ta réponse, je vais donc m'orienter vers les maths !J'ai fait une batterie de test et effectivement intersectwith ne reconnait que les côtés des faces 3D...Je vais donc dès demain attaquer le calcul vectoriel. Merci du temps que tu m'as consacré,Bonne semaine Charles
(gile) Posté(e) le 20 février 2011 Posté(e) le 20 février 2011 Je peux te donner le principe du calcul pour l'intersection d'une droite et d'un plan : Soient :- P1 et P2 deux points distincts de la droite ;- P0 un point quelconque sur le plan (un des sommets de la face 3d par exemple) ;- Norm le vecteur normal de la face 3d (les faces 3d n'ayant pas de propriété Normal, il faut calculer ce vecteur en utilisant le produit vectoriel des vecteurs du premier sommet au second et du premier au troisième) Calculer le produit scalaire de Norm et du vecteur de P1 à P2 (scal). Si scal est égal à 0, c'est que les vecteurs sont perpendiculaires, il n'y a donc pas d'intersection. Si scal est différent de 0, calculer le produit scalaire de Norm et du vecteur de P0 à P1 et diviser le résultat par scal. On obtient ainsi l'échelle avec laquelle multiplier le vecteur de P2 à P1 qui ajouté à P1 donne le point d'intersection de la droite avec le plan. Reste à calculer si ce point est bien à l'intérieur de la face 3d. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité charles74 Posté(e) le 20 février 2011 Posté(e) le 20 février 2011 ok Merci ! Pour ce qui est du triangle, il suffit de vérifier si le point est barycentre des trois sommets du triangle avec les coefficients de pondération positif. Demain je programme tout ca ! Merci encoreà bientôt Charles
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant