yusukens82 Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Bonjour, J'essaye d'écrire un lisp permattant de DECOMPOSER tous les BLOC visible. Début d'idée : (defun c:TEST () (ssget "x" '( (0 . "BLOCK") ) ) (command "DECOMPOS" "0,0" "_p" "") ) pouvez vous m'aider SVP.
Tramber Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 (defun c:TEST () (setq jeu(ssget "x" '( (0 . "BLOCK") ) ) ) (command "DECOMPOS" jeu "" ""...) ) Voyons ! tu fais une selection, autant l'enregistrer. Donc les instructions 0,0 et P ne servent à rien.D'ailleurs pour P comme précédent, cela ne fonctionne pas dans un lisp, il ne reconnait pas ssget comme une manoeuvre retenant P.Un COMMAND avec la commande PSELECT devrait le faire je pense mais ça ne serait toujours pas filtré ! Bref ne mélangeons pas les concepts ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
yusukens82 Posté(e) le 8 octobre 2012 Auteur Posté(e) le 8 octobre 2012 Bonjour Tramber,Etant un novice en LISP je comprend un peu ce que tu veux dire mais je n'arrive pas réecire correctement le code avec PSELECT (setq jeu(ssget "x" '( (0 . "BLOCK") ) ) ) (command "PSELECT" "DECOMPOS" jeu)
-Olivier- Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Bonjour yusukens,Tramber a déjà modifié le lisp en ajoutant (setq jeu pour enregistrer ta séletion.Le PSELECT n'est donc pas nécessaire. Le jeu enregistré est réutilisé directement dans la commande décompose à la place du "0,0" et P. En revanche pour que la commande fonctionne sur les références de bloc il te faut filtrer avec "INSERT" et non "BLOCK".Olivier
Tramber Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 :angry: Je papotais.... connais-tu la moindre commande AutoCAD qui envoie (et c'est son seul rôle) une selection dans P ? Mon code ne marchait pas ?.... et pour cause.(setq jeu(ssget "x" '( (0 . "BLOCK") ) ) ) est faux, j'avais pas vu.(setq jeu(ssget "x" '( (0 . "INSERT") ) ) ) est mieux. Tu débutes, c'est normal :P Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
yusukens82 Posté(e) le 8 octobre 2012 Auteur Posté(e) le 8 octobre 2012 Effectivement avec INSERT ça marche mieux.en revanche ça fonctionne très bien avec la commande EFFACER mais pas avec DECOMPOS. Commande EFFACER :(setq jeu(ssget "x" '( (0 . "INSERT") ) ) ) (command "EFFACER" jeu "") Commande DECOMPOS:(setq jeu(ssget "x" '( (0 . "INSERT") ) ) ) (command "DECOMPOS" jeu "") même problème avec les commandes EXPLODE ou _EXPLODE
-Olivier- Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Si tu regardes la commande de Tramber, il faut que tu ajoutes un "" supplémentaire (supprimes les ... bien entendu)
yusukens82 Posté(e) le 8 octobre 2012 Auteur Posté(e) le 8 octobre 2012 comme ça ? (defun c:TEST () (setq jeu(ssget "x" '( (0 . "INSERT") ) ) ) (command "DECOMPOS" jeu "" "") ) Bizarrement ça fonctionne avec EFFACER mais pas avec DECOMPOS ni _EXPLODE
VDH-Bruno Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 (modifié) Bonjour yusukens82 Tout d’abord ce que tu appelles bloc dans un dessin et une référence de bloc soit une entité "INSERT", pour t’en convaincre, tape ce code dans ta console Visual Lisp et sélectionne une référence de bloc. _$ [b](entget (car (entsel)))[/b] ((-1 . <Nom d'entité: 7ef92458>) (0 . "INSERT") (330 . <Nom d'entité: 7ef90cf8>) (5 . "18B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "TEST POTEAU") (10 1042.04 1618.44 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0)) Une entité "BLOCK", est ce que l’on appelle une définition de bloc, elle est définie dans le table des blocs, qui n’est pas directement accessible avec ssget, mais plutôt avec les fonctions tblnext tblobjname tblsearch. Un petit sujet qu’il peut être util de lire ou relire - Blocs et imbrications -http://cadxp.com/index.php?/topic/30082-blocs-et-imbrications/ Maintenant plus concrètement pour l’exemple que tu viens de poster la commande DECOMPOS (_explode) fait partie des quelques commandes qui ne fonctionne en lisp qu’avec des objets uniques. Extrait de l’aide AutoCAD : Remarque Si vous utilisez un script ou une fonction ObjectARX®, vous ne pouvez pas décomposer plus d'un objet à la fois. Donc une fois que tu as créé ta sélection au moyen de l’instruction ssget_$ (ssget "_x" '((0 . "INSERT"))) <Selection set: da> Il te faut parcourir le jeu de sélection obtenue pour appliquer la commande _explode à chaques entités. Tu trouveras pour cela une fonction nommée ssmap fort pratique et très bien expliqué dans le sujet Arguments et Variables.http://cadxp.com/index.php?/topic/28642-arguments-et-variables/ Pour ma part j’ai monté un petit exemple avec ssnamex et une boucle pour traiter les blocs imbriqués (defun c:TEST (/ jeu-sel) (while (setq jeu-sel (ssget "_x" '((0 . "INSERT")))) (mapcar '(lambda (e) (command "_explode" (cadr e))) (ssnamex (ssget "_x" '((0 . "INSERT"))))) ) (princ) ) Cordialement - Edit - supprimé "" en trop dans le code Modifié le 8 octobre 2012 par VDH-Bruno Apprendre => Prendre => Rendre
bonuscad Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Pour _EXPLODE 2 solutions:-Soit tu parcours ton jeu de sélection en décomposant tes insertions une par une dans une boucle (solution la plus propre)-Soit tu change l'état de variable QAFLAGS et tu appliques ton code (en explosant ton jeu de sélection), bien penser à remettre la variable non documentée à 0... 1 Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
VDH-Bruno Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 -Soit tu change l'état de variable QAFLAGS et tu appliques ton code (en explosant ton jeu de sélection), bien penser à remettre la variable non documentée à 0...1+ Clap, Clap, Clap… QAFLAGS les petites astuces qui font toutes la différence , c’est beau bravo A+ Apprendre => Prendre => Rendre
Tramber Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Ah oui, désolé, je ne m'étais pas souvenu de cette limitation. Mais nous sommes sur la voie du progrès. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Eric Posté(e) le 8 octobre 2012 Posté(e) le 8 octobre 2012 Sinon il y a la fonction XPLODE aussi Eric est formateur, revendeur sur AutoCAD LT, DraftSight, ZWCAD, SketchUp et PDF2CAD
yusukens82 Posté(e) le 8 octobre 2012 Auteur Posté(e) le 8 octobre 2012 Merci ça fonctionne très bien avec cette variable positionné en "1" cela donne : (command "QAFLAGS" "1") (setq jeu(ssget "x" '( (0 . "INSERT") ) ) ) (command "DECOMPOS" jeu "" "") (command "QAFLAGS" "0") merci VDH-Bruno pour cette explication détaillé. Merci à vous tous.
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