Aller au contenu

Modif LISP Min_Z


Demixav

Messages recommandés

Bonjour,

 

J'ai un LISP qui me serait bien utile mais avec une modification à faire, si c'est possible et si ce n'est pas trop demandé bien sûr...

Je n'y connais rien en LISP, j'ai bien tenté deux ou trois trucs sans succès (et sans surprise non plus!)

 

Ce LISP (dont je connais pas l'auteur... désolé si il me lit!), min_Z (max_Z existe aussi) qui sert à identifier par un point le sommet le plus bas en altitude sur une poly 3D.

Ce LISP demande de choisir une ou des poly3D, et repère donc le point le plus entre toutes les poly3D sélectionnées. La modif que je souhaiterai, c'est qu'il répertorie le point le plus bas SUR CHAQUE poly3D sélectionnées, ce qui m'éviterait de les sélectionner une par une...

 

Le code ci dessous!

 

Merci de votre aide!

Xav

 

(vl-load-com)

(defun c:min_z ( / js obj ename pr pt lst_pt lst_z id_seg nw_pt)

(princ "\nSelectionner les polyligne3D: ")

(while (null (setq js (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8)))))

(princ "\nObjets non valable!")

)

(repeat (setq n (sslength js))

(setq

obj (ssname js (setq n (1- n)))

ename (vlax-ename->vla-object obj)

pr -1

)

(repeat (if (zerop (vlax-get ename 'Closed)) (1+ (fix (vlax-curve-getEndParam ename))) (fix (vlax-curve-getEndParam ename)))

(setq

pt (vlax-curve-GetPointAtParam ename (setq pr (1+ pr)))

lst_pt (cons pt lst_pt)

)

)

(setq

lst_z (mapcar 'caddr lst_pt)

id_seg (- (length lst_z) (length (member (apply 'min lst_z) lst_z)))

)

(setq nw_pt

(vlax-invoke

(if (eq (getvar "CVPORT") 1)

(vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))

(vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))

)

'AddPoint

(nth id_seg lst_pt)

)

)

(vla-put-Normal nw_pt (vlax-3d-point '(0 0 1)))

)

(prin1)

)

AutoCad Map 3D 2011 - Covadis v16.0d

Windows 7 - 64b

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Je ne comprends pas ta demande car c'est d'ores et déjà le cas,

Dans le code fourni il y a un jeu de sélection et donc une boucle qui traite chaque poly3D de ce jeu de sélection.

Tu les sélectionnes comment tes poly à traiter ?

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

je souhaiterai, c'est qu'il répertorie le point le plus bas SUR CHAQUE poly3D sélectionnées

 

Ben en réalité, c'est ce qu'il était censé de faire.

J'ai juste oublié de réinitialiser la variable "lst_pt" dans la boucle!

 

La correction:

 

(vl-load-com)
(defun c:min_z ( / js obj ename pr pt lst_pt lst_z id_seg nw_pt)
 (princ "\nSelectionner les polyligne3D: ")
 (while (null (setq js (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8)))))
   (princ "\nObjets non valable!")
 )
 (repeat (setq n (sslength js))
   (setq
     obj (ssname js (setq n (1- n)))
     ename (vlax-ename->vla-object obj)
     pr -1
     lst_pt nil
   )
   (repeat (if (zerop (vlax-get ename 'Closed)) (1+ (fix (vlax-curve-getEndParam ename))) (fix (vlax-curve-getEndParam ename)))
     (setq
       pt (vlax-curve-GetPointAtParam ename (setq pr (1+ pr)))
       lst_pt (cons pt lst_pt)
     )
   )
   (setq
     lst_z (mapcar 'caddr lst_pt)
     id_seg (- (length lst_z) (length (member (apply 'min lst_z) lst_z)))
   )
   (setq nw_pt
    (vlax-invoke
     (if (eq (getvar "CVPORT") 1)
       (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
       (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
     )
     'AddPoint
     (nth id_seg lst_pt)
    )
   )
   (vla-put-Normal nw_pt (vlax-3d-point '(0 0 1)))
 )
 (prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Merci à tous pour vos réponses, et en particulier à BonusCad pour ton LISP (tu t'es reconnu apparemment!) et ta correction! ca fonctionne nickel!

Je garde les deux versions... ca peut servir! :)

 

Encore merci!

Xav

AutoCad Map 3D 2011 - Covadis v16.0d

Windows 7 - 64b

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

J'ai parlé un peu vite... j'ai fait un test hier pour voir si ca fonctionnait et c'etait bien le cas!

Aujourd'hui, je souhaite me servir du LISP et au lieu de me trouver le sommet le plus bas de chaque poly3D, il insère des points autant que de poly sélectionnées et insère tous ces points sur le sommet le plus bas d'entre toutes les poly...

 

Je sais pas si c'est bien clair...

Exemple : Je sélectionne 4 poly, je valide, il insère 4 points confondus sur le sommet le plus bas de toutes ces poly, et aucun sur les 3 autres poly.

 

J'ai sorti les rames là... :(

Merci de votre aide!

Xav

AutoCad Map 3D 2011 - Covadis v16.0d

Windows 7 - 64b

Lien vers le commentaire
Partager sur d’autres sites

Je garde les deux versions... ca peut servir!

 

Tu ne devrais pas, l'ancienne comporte un bug sur la variable lst_pt qui est cumulée à chaque boucle.

 

Donc vérifie bien que tu utilise la bonne routine, car le comportement que tu décrit je l'ai observé avec l'ancienne.

 

Si tu es vraiment sûr, fait moi passer ton fichier d'exemple que je regarde à : ubuesque(at)mailoo.org

 

Là dans l'immédiat je vois pas de causes...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Je sais pas si c'est bien clair...

Exemple : Je sélectionne 4 poly, je valide, il insère 4 points confondus sur le sommet le plus bas de toutes ces poly, et aucun sur les 3 autres poly.

 

Du moins à mes yeux : il est clair que ce n'est pas clair !

4 points confondus ? que veux dire confondu ?

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Incompréhensible car je viens de relancer le lisp et tout est parfait du moins dans ce que j'ai compris :

un point se dessine sur chaque sommet le plus bas de chaque polyligne à la nuance près que si deux sommets sont égaux en Z un seul point est pris en compte.

 

Amicalement

 

 

Lien vers le commentaire
Partager sur d’autres sites

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é