B.R Posté(e) le 6 mai 2015 Posté(e) le 6 mai 2015 Bonjour à tous, Je travaille actuellement sur un projet de LISP dont le but est d'aligner un profil DXF (en 2D) avec un polyligne 3D à partir de leur centre de gravité. Le profil DXF est en réalité un bloc que j'ai reussi a explosé avec la commande _explode. Ensuite il faut extraitre l'ensemble des points de ce profil. Je suis parti sur ce code : (setq Polyligne2D (entsel "Choisir une polyligne 2D"))(setq ListePoints (list))(setq defpolyligne (entget Polyligne2D))(if (= (cdr (assoc 0 defpolyligne)) "LWPOLYLINE") (progn (foreach rec defpolyligne (if (= (car rec) 10) (progn (setq ListePoints (cons (cdr rec) ListePoints)) ) ) ) (setq ListePoints (reverse ListePoints)) ) (prompt "\n Vous n'avez pas sélectionné une polyligne 2D"))ListePoints Mais quand je l'execute autocad me retourne le message suivant : "erreur: type d'argument incorrect: lentityp (<Nom d'entité: 7ff624d1ed80> (6.16249 0.822887 0.0))" J'ai du mal à saisir le sens de cette erreur. Pouvez-vous m'indiquer ce qui ne va pas ? Merci d'avance
-Olivier- Posté(e) le 6 mai 2015 Posté(e) le 6 mai 2015 Bonjour B.R. La fonction entget à besoin d'un nom d'entité appelé ename.Hors la fonction entsel enregistre le nom de l'entité plus les coordonnées d'un point cliqué lors de la sélection de l'objet.Il te faut donc ajouter une étape pour ne récupérer que la première partie de la valeur avec la fonction car. Je te laisse mettre en forme tout seul. Olivier
B.R Posté(e) le 6 mai 2015 Auteur Posté(e) le 6 mai 2015 Merci beaucoup pour cette réponse rapide -Olivier-.
B.R Posté(e) le 7 mai 2015 Auteur Posté(e) le 7 mai 2015 Bonjour, Un autre problème se pose à moi. Une fois un bloc explosé, comment est-il possible de selectionner l'ensemble qui le compose ? Est-il possible de faire plusieurs entsel ? Merci
didier Posté(e) le 7 mai 2015 Posté(e) le 7 mai 2015 Coucou si tu lances le jeu de sélection juste après la décomposition il faut choisir le mode "p" comme précédent.mais tu devrais le décomposer à la fin de tes manipulations ce serait plus simple surtout si tu dois le re-sélectioner plus tard. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
B.R Posté(e) le 8 mai 2015 Auteur Posté(e) le 8 mai 2015 Merci pour cette réponse. Un dernier problème se pose. Je chercher à calculer les centres de gravité de ma polyligne. Pour cela j'ai rédigé le programme suivant : (setq taille (/ (length ListePoints) 3)) ; on divise la liste en trois parties (setq sousliste11 (ExtraitSousListe ListePoints 1 taille)) ; on crée la première sous liste(setq sousliste22 (ExtraitSousListe ListePoints (+ taille 1) (* taille 2))) ; on crée la deuxième sous-liste(setq sousliste33 (ExtraitSousListe ListePoints (+ (* taille 2) 1) (length ListePoints))) ; on crée la troisième sous-liste(princ "\n la sous-liste1 est : \n");On affiche les différentes sous listes(print sousliste11)(princ "\n la sous-liste2 est : \n")(print sousliste22)(princ "\n la sous-liste3 est : \n")(print sousliste33)(setq result1 (list sousliste11 sousliste22 sousliste33))result1(setq v (getvar "osmode")) ; on stocke la valeur courante avec getvar ce qui retourne 16425 si l'accrochage aux objets et désactivé et 41 si il est activé(setq r (rem v 16384)); on calule et on stoke le reste de la division euclidienne de getvar par 16384 = 164525 - 41, dans les deux cas (41/16384 et 16425/16384) le reste retournée est 41(setvar "osmode" (+ r 16384));on affecte la valeur 16425 à la variable osmode, ce qui permet de désactiver l'accrochage aux objets, si celui ci ne l'était pas et le laisse désactivé si il l'était(setvar "pdmode" 32)(setvar "pdsize" 0.5)(setq ssliste11 (car result1))(setq ssliste22 (cadr result1))(setq ssliste33 (caddr result1))(setq A1 (CentredeGravite ssliste11))(command "_point" A1 "" "") (command "_change" A1 "" "_P" "_C" 1 "")(setq B1 (CentredeGravite ssliste22))(command "_point" B1 "" "")(setq C1 (CentredeGravite ssliste33))(command "_point" C1 "" "") Cependant autocad me retourne une erreur de type numberp=nil et je ne trouve pas le problème après plusieurs modification sur les variables. Je vous joins également le programme CentredeGravite (j'ai essayé de chercher de ce coté la mais rien de concluant non plus): (defun CentredeGravite (liste);Cette fonction donne le centre de gravité des points de la polyligne (setq grav liste) (setq g1 (car (car grav)));On prend le premier x de la premiere sous liste (setq g2 (cadr (car grav)));On prend le premier y de la premiere sous liste (setq g3 (caddr (car grav)));On prend le premier z de la premiere sous liste (while (/= (cdr grav) nil);La condition d'arret est que la liste ne contient plus d'élément non traité (setq grav (cdr grav));On avance dans la liste en enlevant la sous-liste en tête (setq g1 (+ g1 (car (car grav))));On ajoute à g1 la valeur du x du triplet de tête (setq g2 (+ g2 (cadr (car grav))));On ajoute à g2 la valeur du y du triplet de tête (setq g3 (+ g3 (caddr (car grav))));On ajoute à g3 la valeur du z du triplet de tête ) (setq coordgrav (list (/ g1 (length liste)) (/ g2 (length liste)) (/ g3 (length liste))));On crée la liste comprenant les sommes calculées précédemment qu'on divise par le nombre d'élément de la liste (princ coordgrav) (print) coordgrav) Merci d'avance
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