Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité