Aller au contenu

Messages recommandés

Posté(e)

Bonjour à toutes et à tous,

En premier lieu, je suis novice en programmation ;

J’ai besoin de votre aide SVP.

En fait souhaite un programme qui, à la fois, détecte et rajoute un cercle (erreur) sur les Z=0 des polylignes 3D, un peu comme celui de Covadis quand on crée un MNT.

Le but est d’avoir un visuel rapide sur ces Z=0.

Amicalement.

AutoCad MAP 2023 - Covadis + Autopiste 18.3b

www.colas-mayotte.fr

Posté(e)

Hello,

Une polyligne 3d n'est rien de plus qu'une liste de nombre réprensetant un point de la polyligne :

liste_pointe_Poly = (0,1,2,3,4,5,6) 'polyligne3D de 2 points

par exemple,

ici le 0,1,2 sont les "index" des coordonnées (XYZ) du point 1 de ta polyligne et 4,5,6 les "index" des coordonnées (XYZ) du point 2 !

il suffit de vérifier les index 2,5,8,... et regarder leurs valeurs !

en lisp je ne sais pas faire mais en VBA oui

mais au moins tu auras la base.

 

 

Posté(e) (modifié)

Coucou,

Rapidement, sur la base de la proposition de Curlygoth on peut essayer ceci :

(defun c:CheckZ (/ get-pt-list jsel ray i name pts csel n)
  (defun get-pt-list (lst)
    (if (and lst (zerop (rem (length lst) 3)))
      (cons (list (car lst) (cadr lst) (caddr lst)) (get-pt-list (cdddr lst)))
    )
  )

  (and
    (or (setq jsel (ssget '((0 . "POLYLINE")))) (setq jsel (ssget "_X" (list '(0 . "POLYLINE") (cons 410 (getvar "CTAB"))))))
    (null (initget 6))
    (or (setq ray (getdist "\nRayon des cercles <1.0> : ")) (setq ray 1.0))
    (repeat (setq csel (ssadd) n 0 i (sslength jsel))
      (setq name (ssname jsel (setq i (1- i))))
      (setq pts (get-pt-list (vlax-get (vlax-ename->vla-object name) 'Coordinates)))
      (setq pts (vl-remove-if-not '(lambda (p) (equal (last p) 0 1E-6)) pts))
      (foreach pt pts
        (setq ent
          (entmakex
            (list
              '(0 . "CIRCLE")
              '(100 . "AcDbEntity")
              '(100 . "AcDbCircle")
              '(62 . 1)
;              (cons 8 "...") ;; Remplacer "..." par le nom du calque désiré si besoin et supprimer le ; devant
              (cons 10 pt)
              (cons 40 ray)
            )
          )
        )
        (ssadd ent csel)
      )
      (if pts (setq n (+ n (length pts))) T)
    )
    (null (sssetfirst))
    (sssetfirst nil csel)
  )
)

Les cercles nouvellement créés sont conservés comme sélection active (pour les supprimer plus facilement). Il serait également judicieux de leur affecter un calque spécifique si besoin. Pour cela j'ai laissé la ligne

;              (cons 8 "...") ;; Remplacer "..." par le nom du calque désiré si besoin et supprimer le ; devant

mais elle est actuellement en commentaire (car il y a un point-virgule devant) donc tu fais comme tu veux.
Si tu veux changer la couleur, il suffit de modifier la valeur du code DXF 62 (actuellement à 1 = rouge). Les valeurs autorisées sont comprises entre 0 et 256 (0 = DuBloc et 256 = DuCalque)

Une autre méthode consisterait à laisser la vérification directement dans le programme, afin de supprimer les cercles une fois le programme terminé.

Bisous,
Luna

Modifié par Luna
Modification du code pour sélectionner manuellement les polylignes 3D ou bien toutes les polylignes 3D
  • Like 2
Posté(e)

Cool merci, ça fonctionne!

Mais un petite amélioration / remarque si possible:

Je souhaite que le programme traite d'un seule coup tous les polylignes 3D dans le fichiers sans avoir à les cliquer/sélectionner un par un.

Est-ce possible?

Amicalement

 

AutoCad MAP 2023 - Covadis + Autopiste 18.3b

www.colas-mayotte.fr

Posté(e)

Coucou,

J'ai modifié le code ci-dessus pour intégrer ta demande. J'ai remplacé

(setq jsel (ssget '((0 . "POLYLINE"))))

par

(or (setq jsel (ssget '((0 . "POLYLINE")))) (setq jsel (ssget "_X" (list '(0 . "POLYLINE") (cons 410 (getvar "CTAB"))))))

Donc si tu as une pré-sélection d'objet, le programme utilisera la pré-sélection, sinon tu devras sélectionner manuellement les objets. Et si tu skip la sélection (pas de pré-sélection et pas de sélection manuelle), le programme sélectionnera toutes les polylignes 3D de l'espace courant (pour se limiter à l'espace Objet si tu es dans l'espace objet, etc...).

Bisous,
Luna

  • Like 1

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é