Aller au contenu

Calcul milieu entre deux polylignes 3D


Messages recommandés

Posté(e)

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

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é