kaisho Posté(e) le 6 juin 2017 Posté(e) le 6 juin 2017 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
kaisho Posté(e) le 6 juin 2017 Auteur Posté(e) le 6 juin 2017 Désolé, je ne vois pas apparaître le fichier bloc joints... dans le doute.....
kaisho Posté(e) le 6 juin 2017 Auteur Posté(e) le 6 juin 2017 Désolé, je ne vois pas apparaître le fichier bloc joints... dans le doute.....
(gile) Posté(e) le 6 juin 2017 Posté(e) le 6 juin 2017 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
kaisho Posté(e) le 6 juin 2017 Auteur Posté(e) le 6 juin 2017 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
(gile) Posté(e) le 6 juin 2017 Posté(e) le 6 juin 2017 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
kaisho Posté(e) le 7 juin 2017 Auteur Posté(e) le 7 juin 2017 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... MERCI BEAUCOUP encore et passe une bonne journée Gile. La mienne démarre très bien grâce à toi !!! :D
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