Déméter_33 Posté(e) le 29 août 2023 Posté(e) le 29 août 2023 Bonjour, Suite à un autre sujet sur lequel je n'avais pas reçu de réponse mais sur lequel j'ai trouvé la solution, je reviens pour un autre sujet sur une routine déjà bien ficelée (a mes yeux bien sur...). Pour expliquer rapidement, le but de cette routine est de dessiner un nuage de révision, puis de positionner un texte, et automatiquement, une ligne de repère va se former pour relier le texte au bord du nuage de révision, en direction de son centre de gravité. Actuellement, le LISP est opérationnel, toutefois sous certaines conditions: le texte peut être positionné dans les 3/4 polaires du côté inférieur gauches, mais lorsqu'on tente de le positionner dans le 1/4 polaire supérieur droit, la routine ne s'exécute plus comme prévu. Tout semble tourner autour du calcul de points de coordonnées pour un ajustement à l'intérieur d'une fonction (if ) (voir les commentaires du code ci-dessous). (defun c:ANNO(/ js1 nuage js2 regionN VlaNua VLACoord_CG Coord_CG PText js3 P1 P2 js4 barre vlabar pt-debut prec)(vl-load-com) (command "nuagerev" "L" 2 5 "S" "N") ;Lance la commande de création du nuage de révision (while (= (getvar "cmdactive") 1)(Command pause)) ;permet à l'utilisateur de tracer plusieurs points sans interrompre la routine (setq js1 (ssadd (entlast))nuage (entlast)) ;définis la variable js1 dans laquelle le jeu d'entité "nuage" contient la dernière entité créée (command "_copybase" "0" "0" nuage "") ;Copie le jeu d'entités "nuage" en base 0,0 (command "_pasteclip" "0" "0") ;Colle le jeu d'entité "nuage" copié en base 0,0 - Une copie du nuage de révision est créé (command "REGION" nuage "") ;transforme l'entité "nuage" en région (setq js2 (ssadd (entlast))regionN (entlast)) ;définis la variable js2 dans laquelle le jeu d'entité "regionN" contient la dernière entité créée (la région de nuage) (setq vlaNua (vlax-ename->vla-Object regionN)) ;transforme l'objet de "regionN" en objet VLA (setq VLACoord_CG (vla-get-centroid vlaNua)) ;extrait les informations des coordonnées de centroide de la sélection "VlaNua" (setq Coord_CG (vlax-safearray->list(vlax-variant-value VLACoord_CG))) ;inscrit les informations des coordonnées du centroides dans une variable de nom Coord_CG (setq PText (getpoint "\n Donner la position du texte")) ;acquisition des coordonnées du point de mise en place du texte (setq prec (getstring T "\n Entrer la précision")) ;demande à l'utilisateur le texte à rentrer dans la ligne de repère (command "_line" Coord_CG PText "") ;dessine la ligne qui servira de base de ligne de repère suivant les points Coord_CG et PText (setq js3 (ssadd (entlast))ligne (entlast)) ;définis la variable js3 dans laquelle le jeu d'entité "ligne" contient la dernière entité créée (if (> (car PText)(car Coord_CG)) ;Problème présent à partir de là, le point P1 ne se calcule pasdans le 1/4 polaire supérieur droit ou inférieur droit suivant le signe > ou < respectivement (progn (setq P1 (list (+ (car Coord_CG) 1) (+ (cadr Coord_CG) 1))) ;Calcule le premier point de coordonnée pour la zone de sélection d'ajustement (Dans ce cas de figure (>) , le point P1 n'a pas l'air d'être calculé ici) (setq P2 (list (- (car Coord_CG) 1) (- (cadr Coord_CG) 1))) ;Calcule le second point de coordonnées pour la zone de sélection d'ajustement ) (progn (setq P1 (list (+ (car Coord_CG) 1) (- (cadr Coord_CG) 1))) ;Calcule le premier point de coordonnée pour la zone de sélection d'ajustement (setq P2 (list (- (car Coord_CG) 1) (+ (cadr Coord_CG) 1))) ;Calcule le second point de coordonnées pour la zone de sélection d'ajustement ) ) (command "_trim" js2 js3 "" "C" P1 P2 "") ;Ajuste en sélectionnant les entités js2 et js3 contenant la region de nuage et la ligne, et sur la zone définie par les points P1 et P2 (problème ici) (setq js4 (ssadd (entlast))barre (entlast)) ;définis la variable js2 dans laquelle le jeu d'entité "barre" contient la dernière entité créée (La ligne ajustée) (setq vlabar (vlax-ename->vla-object barre)) ;transforme l'objet de "barre" en objet VLA (setq pt-debut (vlax-safearray->list (vlax-variant-value (vla-get-StartPoint vlabar)))) ;extrait les informations des coordonnées du point de début de "barre" dans la variable pt-début (command "_.mleader" pt-debut Ptext prec "") ;crée une ligne de repère avec pour coordonnée de départ "pt-debut" et coordonnee d'arrivee "ptext" (command "_erase" regionN barre "") ;supprime "regionN" et barre (princ) ) Après avoir vérifié et revérifié, ma logique semble bonne en l'état, peut être est ce que je me trompe? Merci d'avance.
Déméter_33 Posté(e) le 29 août 2023 Auteur Posté(e) le 29 août 2023 Re... une heure après, la solution est apparue comme par magie: dans la fonction (if ) de mon code, je comparais les coordonnées en X de mes deux points: (if (> (car PText)(car Coord_CG)) ;Problème présent à partir de là, le point P1 ne se calcule pasdans le 1/4 polaire supérieur droit ou inférieur droit suivant le signe > ou < respectivement (progn (setq P1 (list (+ (car Coord_CG) 1) (+ (cadr Coord_CG) 1))) ;Calcule le premier point de coordonnée pour la zone de sélection d'ajustement (Dans ce cas de figure (>) , le point P1 n'a pas l'air d'être calculé ici) (setq P2 (list (- (car Coord_CG) 1) (- (cadr Coord_CG) 1))) ;Calcule le second point de coordonnées pour la zone de sélection d'ajustement ) (progn (setq P1 (list (+ (car Coord_CG) 1) (- (cadr Coord_CG) 1))) ;Calcule le premier point de coordonnée pour la zone de sélection d'ajustement (setq P2 (list (- (car Coord_CG) 1) (+ (cadr Coord_CG) 1))) ;Calcule le second point de coordonnées pour la zone de sélection d'ajustement ) ) Alors que en fait il fallait comparer les coordonnées Y de ces mêmes points, la correction était donc: (if (< (cadr PText)(cadr Coord_CG)) (progn (setq P1 (list (+ (car Coord_CG) 1) (+ (cadr Coord_CG) 1))) (setq P2 (list (- (car Coord_CG) 1) (- (cadr Coord_CG) 1))) ) (progn (setq P1 (list (+ (car Coord_CG) 1) (- (cadr Coord_CG) 1))) (setq P2 (list (- (car Coord_CG) 1) (+ (cadr Coord_CG) 1))) ) ) Désormais la routine fonctionne parfaitement. Mais je vais revenir pour d'autres problèmes sur d'autres routines en cours de montage.
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