Peyo_pmbt Posté(e) le 19 novembre 2024 Posté(e) le 19 novembre 2024 Bonjour, j'essaie de réaliser un lisp pour qu'il puisse me générer le milieu entre deux polylignes 3D qui n'ont pas le même nombre de sommets; ca donne ca: Citation (defun c:UniformiserSommets ( / pl1 pl2 points1 points2 nb-points1 nb-points2 nb-max interpol-points1 interpol-points2 i step) ;; Fonction pour récupérer les sommets d'une polyligne (defun GetPolylinePoints (pl) (setq points nil) (if (and (vlax-property-available-p pl 'Coordinates) (setq coords (vlax-get pl 'Coordinates))) (progn (repeat (/ (length coords) 3) (setq points (append points (list (list (car coords) (cadr coords) (caddr coords))))) (setq coords (cdddr coords)) ) ) ) points ) ;; Fonction pour interpoler des points sur une polyligne (defun InterpolatePolylinePoints (points nb-new-points) (if (and points (> (length points) 1)) (let ((segments (1- (length points))) interpolated nil step (/ (float segments) (1- nb-new-points))) (setq i 0.0) (repeat nb-new-points (let* ((seg-index (fix i)) (t (- i seg-index)) (p1 (nth seg-index points)) (p2 (nth (1+ seg-index) points)) (interp-point (mapcar '(lambda (a b) (+ a (* t (- b a)))) p1 p2))) (setq interpolated (append interpolated (list interp-point)))) (setq i (+ i step))) interpolated ) ) ) ;; Sélection des deux polylignes (if (and (setq pl1 (car (entsel "\nSélectionnez la première polyligne 3D : "))) (setq pl2 (car (entsel "\nSélectionnez la deuxième polyligne 3D : ")))) (progn ;; Conversion en objets VLA (setq pl1 (vlax-ename->vla-object pl1) pl2 (vlax-ename->vla-object pl2)) ;; Vérification des types (if (and (eq (vla-get-ObjectName pl1) "AcDb3dPolyline") (eq (vla-get-ObjectName pl2) "AcDb3dPolyline")) (progn ;; Récupération des points (setq points1 (GetPolylinePoints pl1) points2 (GetPolylinePoints pl2) nb-points1 (length points1) nb-points2 (length points2)) ;; Déterminer le nombre maximal de points (setq nb-max (max nb-points1 nb-points2)) ;; Interpolation des points pour chaque polyligne (setq interpol-points1 (InterpolatePolylinePoints points1 nb-max) interpol-points2 (InterpolatePolylinePoints points2 nb-max)) ;; Mise à jour des polylignes (if interpol-points1 (progn ;; Mise à jour de la première polyligne (vla-put-Coordinates pl1 (vlax-make-safearray vlax-vbDouble (cons 0 (1- (* 3 nb-max))))) (vla-put-Coordinates pl1 (apply 'append interpol-points1)) ) ) (if interpol-points2 (progn ;; Mise à jour de la deuxième polyligne (vla-put-Coordinates pl2 (vlax-make-safearray vlax-vbDouble (cons 0 (1- (* 3 nb-max))))) (vla-put-Coordinates pl2 (apply 'append interpol-points2)) ) ) (princ "\nLes deux polylignes ont maintenant le même nombre de sommets.") ) (princ "\nLes entités sélectionnées ne sont pas des polylignes 3D.") ) ) (princ "\nOpération annulée.") ) (princ) ) mais je ne comprends pas mon erreur Pouvez-vous m'aider ? Merci
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