J'en parlais comme exemple de possibilité de programmation dans la page d'accueil et voici donc le traitement que je propose pour cet exercice.
Il est tout à fait possible d'avoir à dessiner ces lignes particulières dans un triangle que sont les médianes, ce sont les lignes qui relient chaque sommet au milieu du segment opposé.
Il y a plusieurs cas de figure qui peuvent se présenter pour le triangle qui servira de base, il peut être dessiné avec des lignes (entités "ligne") séparées ou bien une polyligne, commençons par traiter les cas de lignes.
Tout d'abord il vous faut dessiner un triangle quelconque dans l'interface graphique d'AutoCAD par la commande LIGNE en cliquant A, B puis C et finir par Clore, ça vous allez le faire "à la main".
Voici l'image du code, je collerai le code en texte plus tard si vous voulez absolument copier-coller au lieu de vous "taper" ces lignes de code, ce qui est bien plus formateur, mais je radote là...
Explications :
Choix d'une ligne à l'écran que l'on mémorise dans la variable ent
- Extraction des valeurs X et Y des points de départ et d'arrivée de la ligne sélectionnée mémorisée dans une variable coord1 (Codes DXF 10 et 11)
On écrase la variable ent" en choisissant une autre ligne (on n'a plus besoin de cette variable, car son contenu a été utilisé et on peut l'écraser par une autre valeur).
- Extraction des valeurs X et Y des points de départ et d'arrivée de la ligne sélectionnée mémorisée dans une variable coord2
- On écrase (à nouveau) la variable ent en choisissant une autre ligne
- Extraction des valeurs X et Y des points de départ et d'arrivée de la ligne sélectionnée mémorisée dans une variable coord3
- Création de trois variables p1, p2 et p3 qui ne contiennent que les points de départ des lignes (code DXF 10, point de départ d'une ligne)
- Création de trois variables p1arr, p2arr et p3arr qui sont les calculs des coordonnées du milieu des points opposés aux sommets, p1arr est le milieu du segment p2 p3, pour le calculer, on fait la moyenne des coordonnées de ces sommets,
- On fait une liste (list) avec xp2+xp3 divisé par deux et yp2 + yp3 divisé par deux et on recommence pour p2arr et p3arr
- Il ne reste plus qu'à faire trois lignes reliant p1 et p1arr, p2 et p2arr puis p3 et p3arr.
OK tout le monde suit ?
On peut simplifier le code en supprimant ces multiples appels à (setq)
C'est un peu plus "propre" mais c'est subjectif, on est bien d'accord.
Lorsqu'on utilise la fonction (command) dans un programme, il faut se méfier des accrochages permanents, car ils ne sont pas pris en compte par le programme et le résultat peut se révéler faux parce que les lignes dessinées par (command) peuvent "s'accrocher" en utilisant ces accrochages permanents, il est donc conseillé de les désactiver dans le programme puis de les réactiver à la fin.
Une méthode souvent utilisée est de mémoriser l'état des accrochages au lancement du programme dans une variable, de les désactiver, de laisser se finir le programme puis de les remettre dans l'état précédent.
Ça fait partie des erreurs commises dans les débuts et qui tracassent les débutants à cause des résultats erratiques, les lignes ne se dessinant pas aux vrais points calculés, mais en s'accrochant à proximité de ces points calculés.
Sur l'image suivante, les lignes ajoutées pour gérer ce défaut d'accrochage sont surlignées en jaune :
Et voici le code pour les inconditionnels du copier-coller :
Si vous en avez le courage je vous déconseille de copier-coller, la plupart des erreurs se produisant lors de la saisie, je pense que le "copier-coller" n'est pas la meilleure façon d'apprendre.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | (setq old-osmode (getvar "osmode"));mémorisation de l'état des accrochages (setvar "osmode" 0);désactivation des accrochages (setq ent (car( entsel"\nLigne 1\n")) coord1 (list (cdr (assoc 10 (entget ent))) (cdr (assoc 11 (entget ent)))) ent (car( entsel"\nLigne 2\n")) coord2 (list (cdr (assoc 10 (entget ent))) (cdr (assoc 11 (entget ent)))) ent (car( entsel"\nLigne 2\n")) coord3 (list (cdr (assoc 10 (entget ent))) (cdr (assoc 11 (entget ent)))) p1 (car coord1) p2 (car coord2) p3 (car coord3) p1arr (list (/ (+ (car p2) (car p3))2.0) (/ (+ (cadr p2) (cadr p3))2.0)) p2arr (list (/ (+ (car p1) (car p3))2.0) (/ (+ (cadr p1) (cadr p3))2.0)) p3arr (list (/ (+ (car p1) (car p2))2.0) (/ (+ (cadr p1) (cadr p2))2.0)) );fin de setq (command "_line" p1 p1arr "") (command "_line" p2 p2arr "") (command "_line" p3 p3arr "") (setvar "osmode" old-osmode) ;remise en état initial des accrochages |
Il peut y avoir bien d'autres soucis, sommets disjoints, choix des lignes dans un sens inattendu... c'est la différence entre un "bricolage" qui fonctionne dans certains cas, mais pas dans TOUS les cas, combien de fois ai-je écrit un code qui me semblait fonctionnel et quand un copain le faisait tourner sur son poste des erreurs se produisaient ? (grrrr.)
C'est en tapant toutes ces lignes qu'on s'en rend compte, car le collègue à qui on passe le programme fièrement avait un calque verrouillé ou un accrochage bloqué… et c'est en "pensant" à ces cas de figure qu'on se perfectionnera, mais là n'est pas le sujet encore, pour l'instant, on dégrossit le langage, tout ceci sera explicité plus tard, allez ! je vais me prendre un café moi...
26 novembre 2017