autospeed Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Bonjour , Lors des opérations de nettoyage de plans , je rencontre souvent des blocs contenant des solides ou des hachures. Ex un ascenceur ou une voiture. J'aimerais bien trouver un petit lisp qui permette d'explorer tous les blocs d'un dessins .. même les blocs de blocs et qui enlève tout ce qui est hachures ou solides à l'intérieur des blocs. Est ce que cela existe déja ? Auteur du logiciel AutospeedAuteur de la théorie du site www.kheops.bizAuteur de nombreux livres
Fraid Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Bonjour, essaye cela (defun c:deleteSolidHathInBlocks (/ AcDoc) (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-StartUndoMark AcDoc) (vlax-for b (vla-get-Blocks AcDoc) (vlax-for e b (if (and (= "AcDbHatch" (vla-get-ObjectName e)) (= "SOLID" (vla-get-PatternName e)) ) (vla-delete e) ) ) ) (vla-EndUndoMark AcDoc) (vla-regen AcDoc acActiveViewport) (princ) ) il me semble que c'est (gile) qui en est l'auteur merci [Edité le 24/2/2011 par Fraid] https://github.com/Fraiddd
autospeed Posté(e) le 24 février 2011 Auteur Posté(e) le 24 février 2011 Merci Fraid .. j'ai testé surun plan hyper lourd et ça plante :-) cela sélectionne des solides puis voici le message d'erreur Commande: _appload delsol.lsp correctement chargé(s)delsol.lsp correctement chargé(s)Commande: delsol_undo Paramètres courants: Auto = Activé, Contrôle = Tous, Associer = OuiEntrez le nombre d'opérations à annuler ou [Auto/Contrôle/Début/Fin/Marque/Retour] <1>: _eCommande: ; erreur: une erreur est survenue dans la fonction *erreur*paramètre de la variable AutoCAD rejeté: "pickadd" nil par contre sur des plans plus légers , ça marche nickel ..super même ! exactement ce que je cherchais [Edité le 24/2/2011 par autospeed] Auteur du logiciel AutospeedAuteur de la théorie du site www.kheops.bizAuteur de nombreux livres
lecrabe Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Hello Fraid C une routine interessante qui devrait permettre (a terme) de nettoyer les blocs (symboles) de TOUTE Hachure et de TOUT Solid Par contre j'aimerais bien de pouvoir faire une selection AutoCAD classique et non pas de traiter TOUS les blocs (symboles) du dessin, y compris ceux utilises pour faire du decor (avec donc des hachures et solides) que l'on utilise souvent dans les cartouches ! Merci d'avance, Le Decapode Autodesk Expert Elite Team
Fraid Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 vois pas pourquoi? Tu n'a pas oublié de parentheses? https://github.com/Fraiddd
bryce Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Bonjour, Quand tu parles de solides, s'agit-il de hachures avec le motif SOLID, ou bien des objets créés avec la commande _SOLID ?Est-ce que tu veux supprimer toutes les hachures, quel que soit leur motif ? Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Fraid Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Pour Le Crabe (defun c:DeleteSolidHathInBlocks (/ AcDoc listBlocs vlalistbloc) (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) listBlocs (ssget (list (cons 0 "INSERT"))) vlalistbloc (vlax-ename->vla-object listBlocs) ) (vla-StartUndoMark AcDoc) (vlax-for b vlalistbloc (vlax-for e b (if (and (= "AcDbHatch" (vla-get-ObjectName e)) (= "SOLID" (vla-get-PatternName e)) ) (vla-delete e) ) ) ) (vla-EndUndoMark AcDoc) (vla-regen AcDoc acActiveViewport) (princ) ) par contre je n'ai pas le temps de testé [Edité le 24/2/2011 par Fraid] https://github.com/Fraiddd
bryce Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Re, Je crois que tu ne peux pas transformer un jeu de sélection ssget avec (vlax-ename->vla-object), il faut passer par (vla-get-activeselectionset).Ensuite tu ne peux pas parcourir les entités de la référence de bloc, il faut accéder à la définition du bloc. (defun c:dsh (/ AcDoc listBlocs vlalistbloc blocks) (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) listBlocs (ssget (list (cons 0 "INSERT"))) vlalistbloc (vla-get-activeselectionset AcDoc) ) (setq blocks (vla-get-blocks AcDoc)) (vla-StartUndoMark AcDoc) (vlax-for b vlalistbloc (vlax-for e (vla-item blocks (vla-get-effectivename b)) (if (and (= "AcDbHatch" (vla-get-ObjectName e)) (= "SOLID" (vla-get-PatternName e)) ) (vla-delete e) ) ) ) (vla-EndUndoMark AcDoc) (vla-regen AcDoc acActiveViewport) (princ) ) Comme ça ça fonctionne, mais il n'y a aucune gestion d'erreurs ou vérifications des doublons (plusieurs occurrences du même bloc sélectionnées =le bloc sera traité plusieurs fois inutilement). Edit: corrigé la 2e phrase. [Edité le 24/2/2011 par bryce] Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Fraid Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Je crois que tu ne peux pas transformer un jeu de sélection ssget avec (vlax-ename->vla-object) ba oui, il faut passé par un ssname.... :P je suis en train d'apprendre le VLA et grace a vous je fais des progrés tout les jours, merci Bryce car aujourd'huis je sais faire une selection en VLA !! https://github.com/Fraiddd
Patrick_35 Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Salut Juste pour être pédagogique (defun c:dsh (/ AcDoc listBlocs vlalistbloc blocks) (vl-load-com) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) blocks (vla-get-blocks AcDoc) ) (vla-StartUndoMark AcDoc) (and (ssget (list (cons 0 "INSERT"))) (progn (vlax-for b (setq vlalistbloc (vla-get-activeselectionset AcDoc)) (or (member (vla-get-effectivename b) listBlocs) (setq listBlocs (cons (vla-get-effectivename b) listBlocs)) ) ) (vla-delete vlalistbloc) (mapcar '(lambda(e) (vlax-for e (vla-item blocks e) (and (= "AcDbHatch" (vla-get-ObjectName e)) (= "SOLID" (vla-get-PatternName e)) (vla-delete e) ) ) ) listBlocs ) (vla-regen AcDoc acActiveViewport) ) ) (vla-EndUndoMark AcDoc) (princ) ) ps : non testé Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
autospeed Posté(e) le 24 février 2011 Auteur Posté(e) le 24 février 2011 Ca marche bien et c'est exactement ce qu'il me fallait ! De plus c'est mieux avec la sélection.Super merci à tous ! Auteur du logiciel AutospeedAuteur de la théorie du site www.kheops.bizAuteur de nombreux livres
bryce Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 ps : non testé Ça fonctionne, merci pour la démonstration ! :P J'ai une question sur cette partie : (mapcar '(lambda(e) (vlax-for e (vla-item blocks e) (and (= "AcDbHatch" (vla-get-ObjectName e)) (= "SOLID" (vla-get-PatternName e)) (vla-delete e) ) ) ) listBlocs ) et en particulier sur (vlax-for e (vla-item blocks e) Y a-t-il une raison pour utiliser la même variable e pour 2 choses différentes ?J'aurais eu tendance à utiliser 2 variables différentes : (vlax-for ent (vla-item blocks e) J'ai un peu de mal à comprendre pourquoi ta méthode fonctionne... Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
Fraid Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Bonjour patrick Une belle leçon :exclam: ma question est beaucoup plus simple Pourquoi le AND ? https://github.com/Fraiddd
Patrick_35 Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 Bryce :Tu as raison, utiliser deux variables est plus simple pour la compréhension.Maintenant, il faut aussi voir les différents niveaux d'imbrication de cette ligne(vlax-for e (vla-item blocks e)La première évaluation se situe dans (vla-item blocks e) et donne la définition du bloc.Une fois cette définition trouvée, je n'ai plus besoin de cette variable et je peux donc l'utiliser à nouveau dans une boucle qui parcoure cette définition.J'ai juste gagné une variable. Fraid :La fonction AND à la particularité de faire l'évaluation du 1er argument et s'il est non-nil, de passer au suivant et ainsi de suite; de s'arrêter à ma fonction (dernier argument) ou un argument retournant nil Donc, si j'écris(and var_1 var_2 var_3 ma_fonction)ma fonction sera lancée si var_1+var_2+var_3 sont non-nilCela revient à écrire de manière plus traditionnelle(if (and var_1 var_2 var_3) ma_fonction)Le gain, une fonction if qui n'est pas réellement nécessaire, sauf si on désire utiliser le else/ou/autrement (qui est implicite dans la fonction if) La logique est la même avec le ORQuand j'écris(or (member (vla-get-effectivename b) listBlocs) ...)cela revient à écrire(if (not (member (vla-get-effectivename b) listBlocs) ...)ou encore(and (not (member (vla-get-effectivename b) listBlocs) ...) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bryce Posté(e) le 24 février 2011 Posté(e) le 24 février 2011 La première évaluation se situe dans (vla-item blocks e) et donne la définition du bloc.Une fois cette définition trouvée, je n'ai plus besoin de cette variable et je peux donc l'utiliser à nouveau dans une boucle qui parcoure cette définition.Et comme elle est redéfinie à chaque nouvelle exécution de lambda, il n'y aucun problème de "téléscopage"...Merci :) Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
globehugo Posté(e) le 5 août 2014 Posté(e) le 5 août 2014 Vieux Topic mais super lisp,Merci beaucouphugo.
philsogood Posté(e) le 24 décembre 2014 Posté(e) le 24 décembre 2014 helloesk'un bienfaiteur pourrait ajouter une ligne ou deux pour que ce splendide lisp marche sur les blcos imbriquéssur mon ficheir je dois avoir 6 "lignées" de blcoa vant d'atteindre les hachures!! :/Merci papa Noël!! :)Phil Projeteur Revit Indépendant - traitement des eaux/CVC
Steven Posté(e) le 29 décembre 2014 Posté(e) le 29 décembre 2014 helloesk'un bienfaiteur pourrait ajouter une ligne ou deux pour que ce splendide lisp marche sur les blcos imbriquéssur mon ficheir je dois avoir 6 "lignées" de blcoa vant d'atteindre les hachures!! :/Merci papa Noël!! :)Phil Salut Philsogood, Tu trouveras ce que tu cherches ici. Puis si tu veux aussi la même chose pour les Wipeouts, c'est ici, aussi ;) N'oublie pas de faire une regen après avoir lancer la commande. Steven________________________________________ Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD. Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD. En rêve; AutoCAD sous Linux.
philsogood Posté(e) le 29 décembre 2014 Posté(e) le 29 décembre 2014 hellomerci pour le tuyauj'avais du mal faire ma recherche pcq j'avais luopé ces posts!! :/Phil Projeteur Revit Indépendant - traitement des eaux/CVC
joris25 Posté(e) le 26 octobre 2018 Posté(e) le 26 octobre 2018 Bonjour à vous, ce lisp est super mais si il y a des contraintes paramétriques dans le bloc alors la hachure ne s'efface pas - il faut editer le bloc le fermer et repondre oui a l'enregistrement, et là, la modification est prise en compte - y a t'il moyen de faire en sorte que ce super lisp fonctionne de la meme façon avec les blocs paramétriques qu'avec les autres ? Merci à vous tous..
Jo le projeteur Posté(e) le 3 mai 2024 Posté(e) le 3 mai 2024 Bonjour a tous. Je déterre ce post, pour savoir s'il est possible de faire une "petite" modification sur le lisp qui me serrait extrêmement utile. Est il possible de faire en sorte que le lisp ne supprime que les hachure solide, et les solide, et non pas toutes les hachures dans les blocs. Lecrabe en a écrit un, mais malheureusement pour moi. il ne les supprimes pas dans les blocs. Je nettoie régulièrement des fonds de plans d'architecte qui ont pleins de hachures qui ne me servent pas, mais les hachures autres que solide sont souvent les faux plafonds qui me sont très utile. Si c'est possible ce serrait vraiment génial. En tout cas un grand merci d'avance
lecrabe Posté(e) le 3 mai 2024 Posté(e) le 3 mai 2024 Hello @Jo le projeteur Voir le Lisp joint ... Est ce OK ? Bye, lecrabe ;; ;; http://cadxp.com/topic/42821-modif-lis-khatch-block/page__pid__243487 ;; ;; Routine: KHATCH_BLOCK_SOLID par GC + Tramber ;; ;; Efface les Hachures DANS les Blocs mais SEULEMENT les Hachures SOLID ;; + Test pour ne traiter que les objets dans l'Espace Objet/Model ;; ;; ----- Anciens commentaires ----- ;; Supprimer (Kill) les hachures (HATCH) dans les blocs (BLOCK) ;; Par GC le 11/03/2011 - Passage en DEFUN par Fraid ;; Micro-Modification par LeCrabe DIM --> HATCH ;; (defun c:KHATCH_BLOCK_SOLID (/ b o) (vl-load-com) (vlax-for b (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ;(setq b(vla-item(vla-get-Blocks(vla-get-ActiveDocument(vlax-get-acad-object)))0)) (or (and (= (vla-get-IsLayout B) :vlax-true)(/= (vla-get-Name B)"*Model_Space")) (= (vla-get-IsXref B) :vlax-true) (vlax-for o b ;(setq o(vla-item b 3)) (if (and(wcmatch (vla-get-ObjectName o) "AcDb*Hatch") (= (vla-get-PatternName o) "SOLID")) (vla-delete o) ) ) ) ) ) (c:KHATCH_BLOCK_SOLID) (command "_regen") Autodesk Expert Elite Team
Jo le projeteur Posté(e) le 7 mai 2024 Posté(e) le 7 mai 2024 Le 24/02/2011 à 15:27, bryce a dit : Le 03/05/2024 à 14:29, lecrabe a dit : Hello @Jo le projeteur Voir le Lisp joint ... Est ce OK ? Bye, lecrabe ;; ;; http://cadxp.com/topic/42821-modif-lis-khatch-block/page__pid__243487 ;; ;; Routine: KHATCH_BLOCK_SOLID par GC + Tramber ;; ;; Efface les Hachures DANS les Blocs mais SEULEMENT les Hachures SOLID ;; + Test pour ne traiter que les objets dans l'Espace Objet/Model ;; ;; ----- Anciens commentaires ----- ;; Supprimer (Kill) les hachures (HATCH) dans les blocs (BLOCK) ;; Par GC le 11/03/2011 - Passage en DEFUN par Fraid ;; Micro-Modification par LeCrabe DIM --> HATCH ;; (defun c:KHATCH_BLOCK_SOLID (/ b o) (vl-load-com) (vlax-for b (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object) ) ) ;(setq b(vla-item(vla-get-Blocks(vla-get-ActiveDocument(vlax-get-acad-object)))0)) (or (and (= (vla-get-IsLayout B) :vlax-true)(/= (vla-get-Name B)"*Model_Space")) (= (vla-get-IsXref B) :vlax-true) (vlax-for o b ;(setq o(vla-item b 3)) (if (and(wcmatch (vla-get-ObjectName o) "AcDb*Hatch") (= (vla-get-PatternName o) "SOLID")) (vla-delete o) ) ) ) ) ) (c:KHATCH_BLOCK_SOLID) (command "_regen") Salut @lecrabe. J'ai tester le lisp. Il fonctionne nickel. par contre, il se lance directement quand je le glisse sur le plans. J'ai essayé de la mettre en lancement au démarrage d'Autocad avec appload, mais quand j'ouvre Autocad, il lance la commande automatiquement au démarrage. Du coup, j'ai du l'enlever de la liste des lisp qui se lancent au démarrage. Si ce n'est pas abusé de ma part, je voudrais bien qu'il me supprime également les cottes dans les blocs, et les 3 éléments (hachures solide, solide et cotte) en dehors des blocs également. Je pensais pouvoir y ajouter le lisp que j'ai écrit , mais je ne sais pas gérer la partie vl... (defun c:SHA () (setq jeusel (ssget "_A" (list '(-4 . "<OR") '(-4 . "<AND") '(0 . "HATCH") '(2 . "SOLID") '(-4 . "AND>") '(-4 . "<AND") '(0 . "SOLID") '(-4 . "AND>") '(-4 . "<AND") '(0 . "DIMENSION") '(-4 . "AND>") '(-4 . "OR>") ) ) ) (command "_.erase" jeusel "") (princ) ) Le 24/02/2011 à 15:27, bryce a dit : Le 24/02/2011 à 15:27, bryce a dit :
lecrabe Posté(e) le 7 mai 2024 Posté(e) le 7 mai 2024 Hello Si tu veux le lancer "quand tu veux", il faut enlever les 2 dernières lignes ! Après exécution SVP tu fais un REGEN ... Bye, lecrabe Autodesk Expert Elite Team
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