Aller au contenu

selection polyligne 3D et insertion de bloc dynamique avec champs


Messages recommandés

Posté(e)

bonjour a tous,

 

Je recherche un lisp qui puisse faire ceci : sélection de polyligne 3D et insertion, sur tous les sommets de la polyligne, d'un bloc dynamique que j'ai créé. en regardant tous les messages sur le bloc, j'ai cru comprendre qu'il est assez difficile de faire cela avec les blocs dynamiques et les attributs champs remplis automatiquement. (récuperation automatique de l'altimétrie du sommet).

est ce que quelqu'un aurait un peu de temps pour me mettre sur la piste ou bien me proposer un petit bout de programme qui puisse faire cela? je vous joints le bloc... merci par avance et cela me rendrai bien service car je galère bien....

bonne journée à tous

Posté(e)

Salut,

 

Il y a un problème pour joindre des fichiers sur CADxp. Tu dois passer par un hébergeur.

 

Pour ton LISP, il n'y a rien de compliqué si le bloc est bien fait à savoir que l'attribut avec le champ pour l'altitude ait été créé dans l'éditeur de bloc avec le type de champ : EspaceRéservéBloc et la propriété de la référence de bloc = Position avec uniquement Z coché.

 

Ensuite, tu peux t'inspirer du LISP suivant :

 

(defun c:test (/ *error* getVertices entity vla-object activeSpace)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
 
 (defun *error* (msg)
   (and msg
        (/= msg "Fonction annulée")
        (prompt (strcat "\nErreur: " msg))
   )
   (vla-EndUndoMark *acdoc*)
   (princ)
 )
 
 (defun getVertices (poly3d / loop)
   (defun loop (lst)
     (if lst
       (cons (list (car lst) (cadr lst) (caddr lst)) (loop (cdddr lst)))
     )
   )
   (loop (vlax-get poly3d 'Coordinates))
 )

 (if (and
       (setq entity (car (entsel "\nSélectionnez une polyligne 3d: ")))
       (= (vla-get-ObjectName (setq vla-object (vlax-ename->vla-object entity))) "AcDb3dPolyline")
     )
   (progn
     (vla-StartUndoMark *acdoc*)
     (setq activeSpace (vla-get-Block (vla-get-ActiveLayout *acdoc*)))
     (foreach pt (getVertices vla-object)
       (vla-InsertBlock
         activeSpace
         (vlax-3d-point pt)
         "test"
         1.
         1.
         1.
         0.
       )
     )
   )
 )
 (*error* nil)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour Gile,

 

tout d'abord merci pour ta réponse aussi rapide et le code fourni.

J'ai bien chargé le lisp mais je ne vois pas dans le code ou rentrer le nom du bloc dynamique que je dois appeler.. J'ai vérifié et le bloc est bien créé comme tu me le demande (EspaceRéservéBloc et la propriété de la référence de bloc = Position avec uniquement Z coché).Je suis novice dans le langage...je suis désolé de remettre à contribution mais si tu as 5 mns pour m'expliquer (le nom de mon bloc est (ETI-1-200)

je te laisse un lien pour télécharger le bloc au cas ou....

 

http://dl.free.fr/goGGOc9BX

 

En tout cas je te remercie beaucoup GILE pour ton aide.. c'est vraiment agréable

Posté(e)

Le même code avec quelques commentaires :

 

(defun c:test (/ *error* getVertices entity vla-object activeSpace)
 (or *acad* (setq *acad* (vlax-get-acad-object)))
 (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))

 ;; redéfinition locale de la fonction *error*
 (defun *error* (msg)
   (and msg
        (/= msg "Fonction annulée")
        (prompt (strcat "\nErreur: " msg))
   )
   (vla-EndUndoMark *acdoc*)
   (princ)
 )

 ;; obtient tous les sommets d'une polyligne 3d
 (defun getVertices (poly3d / loop)
   (defun loop (lst)
     (if lst
       (cons (list (car lst) (cadr lst) (caddr lst)) (loop (cdddr lst)))
     )
   )
   (loop (vlax-get poly3d 'Coordinates))
 )

 ;; fonction principale
 (if (and
       (setq entity (car (entsel "\nSélectionnez une polyligne 3d: ")))
       (= (vla-get-ObjectName (setq vla-object (vlax-ename->vla-object entity))) "AcDb3dPolyline")
     )
   (progn
     (vla-StartUndoMark *acdoc*)
     (setq activeSpace (vla-get-Block (vla-get-ActiveLayout *acdoc*)))
     ;; pour chaque sommet de la polyligne 3d sélectionnée
     (foreach pt (getVertices vla-object)
       ;; insertion du bloc
       (vla-InsertBlock
         activeSpace                   ; <- espace courant
         (vlax-3d-point pt)            ; <- point d'insertion
         "ETI-1-200"                   ; <- nom du bloc
         1.0                           ; <- échelle en X
         1.0                           ; <- échelle en Y
         1.0                           ; <- échelle en Z
         0.0                           ; <- rotation
       )
     )
   )
 )
 (*error* nil)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour Gile,

 

Je n'aurai qu'un mot : PARFAIT...!!! comme d'ab d'ailleurs.

J'ai regardé comment se décompose le LISP et juste avec les explications j'arrive à comprendre..

maintenant, reste juste à ingurgiter la syntaxe !!! gros travaille de ma part sur le LISP.

UN ENORME MERCI A TOI GILE.

Pendant que j'y suis, pour un novice comme moi en LISP... comment faire pour apprendre et me donner quelques conseils pour démarrer...(site ou méthodologie) à part m'y coller et beaucoup de courage, çà je le sais... :rolleyes:

MERCI BEAUCOUP encore et passe une bonne journée Gile. La mienne démarre très bien grâce à toi !!! :D

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é