Azerty Posté(e) le 16 avril 2007 Posté(e) le 16 avril 2007 Bonjour à tous, Ma question a sans doute déjà été abordée, mais j'ai épluché des 10aines de sujets, sans trouver mon "bonheur" ... Le contenu (~ les lignes) d'un bloc est généralement dessiné sur le calque 0.Puis chaque bloc est créé dans un calque correspondant.Seulement voilà, nombreux sont les fichiers où l'on retrouve des imbrications multiples (calque 00filaire ou encore JB.modif ou je ne sais quelle "originalité" non-intuitive ...) En clair, je me retrouve avec des calques que je ne peux pas purger car ils sont utilisés (~ imbriqués) dans dans blocs créés dans d'autres calques. Ma question est simple : comment faire pour sélectionner (~ retrouver) le contenu de ces calques "non-purgeables" ???? Par avance, merci ... j'en aurai vraiment besoin, et en plus c'est assez urgent ... :question: Une seule chose à dire : MERCI CADxp !
Tramber Posté(e) le 16 avril 2007 Posté(e) le 16 avril 2007 Regarde edit_block dans les lisp de (Gile) Tu pourra remmettre les composants de block dans le calque 0 et purger ce qui reste de calques. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Azerty Posté(e) le 16 avril 2007 Auteur Posté(e) le 16 avril 2007 Merci pour cette réponse rapide. (super ce récap !!)Effectivement, ce lisp permet de gagner du temps pour re-basculer dans le calque zéro. Mais le souci c'est de devoir sélectionner les blocs à modifier.En fait, j'ai un plan de recollement assez "énorme" (2 relevés topo + 2 entreprises + 2 bailleurs + 3 BET ...) et je ne veux pas modifier tous les blocs.Ce que j'aimerai c'est y aller "petit à petit" en partant des calques "foireux". En résumé, ce lisp modifie le contenu d'un bloc, mais ce que j'aimerai avant tout ... c'est sélectionner / connaitre le bloc à modifier.Dans la pratique, et vu mon fichier, c'est pas tout à fait la même chose. D'avance, merci. Une seule chose à dire : MERCI CADxp !
Bred Posté(e) le 16 avril 2007 Posté(e) le 16 avril 2007 Salut,En fait, ta demande est possible en prog, mais vraiment trés lourde, car il faut "rentrer" dans tout les blocs ET imbrication de blocs, récapituler les calques se trouvant dans le blocs et les sous-blocs et quand on trouve le bon calque, repérer le bloc, puis continuer dans les sous-blocs, etc... et ceci pour tous les blocs.... Donc, soit plus clair dans ta demande : que veux tu faire avec ce bloc contenant un objet dans un claque précis ? Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Azerty Posté(e) le 16 avril 2007 Auteur Posté(e) le 16 avril 2007 que veux tu faire avec ce bloc contenant un objet dans un calque précis ? Précisément, que le filaire contenu dans un bloc soit basculé dans le calque qui a servi à créer ce bloc. Concrètement, j'ai 200 calques / 7000 blocs dans mon fichier.J'ai une 50aine de calques "inutiles".Mon problème c'est que si j'isole l'un de ses 50 claques que j'estime "inutiles", il est vide ...Sans doute parce qu'il a été utilisé pour définir des attributs, pour dessiner un bloc, par erreur dans un sous-bloc ... En résumé, ce qu'il faudrait, c'est une "sélection rapide" qui va fouiller dans tous les éléments imbriqués ...J'imagine que c'est très complexe à programmer, mais ça ne parait pas insolite comme "demande".Je travail depuis quelques années, et je n'ai jamais vu un plan parfaitement clean.Une fonctionne de ce genre m'aurait servie à chaque nouveau projet !Donc je suppose que d'autres que moi ne trouvent pas ça normal ; et vu les experts qu'il y a sur CADXP, je suis sûr que certains ont déjà réfléchis à ce problème. Toute astuce, ou toute manip est la bienvenue.(par ex. le lisp qui évite d'éditer les blocs, de tout sélectionner puis de changer le calque est déjà une bonne chose, même si je ne tiens pas forcement à tout rebasculer sur le calque 0 et surtout, qu'il m'est difficile de savoir parmi les 7.000 blocs, lesquels éditer ...) D'avance, merci. [Edité le 16/4/2007 par Azerty] [Edité le 16/4/2007 par Azerty] Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 17 avril 2007 Posté(e) le 17 avril 2007 Comme je ne comprends pas bien la demande, on va y aller progressivement. si tu veux avoir le nom des blocs contenant des entités sur sur le calque nommé "CeCalque" par exemple, tu colle ce code sur la ligne de commande pour charger la routine. (defun test (lay / lst) (vlax-for bloc (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) (vlax-for obj bloc (if (= (vla-get-Layer obj) lay) (or (member (vla-get-Name bloc) lst) (setq lst (cons (vla-get-Name bloc) lst)) ) ) ) ) (mapcar 'print lst) (textscr) (princ) ) puis tu tapes : (test "CeCalque") et tu liras dans la fenêtre de texte tous les blocs contenets de entités sur "CeCalque"NOTE : si tu lis "*Paper_Space" ou "*Model_Space" c'est que des entités sur le calque ne sont pas des composants de bloc mais sont dans l'espace papier ou l'espace objet. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
coxsurf56 Posté(e) le 17 avril 2007 Posté(e) le 17 avril 2007 Salutpersonnellement moi je fusionne les calques pour faire disparaitre des calques maintenant 50 ,ca peut etre long
Azerty Posté(e) le 25 avril 2007 Auteur Posté(e) le 25 avril 2007 Bonjour à tous, Me revoilou ...J'ai de nouveau un peu de "temps libre" et je reviens sur ce sujet, qui vraiment pourrait me faciliter la vie. je ne comprends pas bien la demande, on va y aller progressivement. Comme à chaque fois que je lance un topic ... :D Pourtant ça ne me parait pas complexe comme "problème". A résoudre oui, mais à comprendre, non ... je pense que la plupart des autocadiens sont concernés ... J'ai dessiné un exemple fictif : (fichier dwg)http://www.megaupload.com/fr/?d=BTPSTAYXLe plus simple serait de le télécharger et d'essayer (désolé pour le passage par megaupload, je connais rien d'autre de gratuit moins contraignant)J'ai créé 2 blocs, contenant chacun des éléments parasites, dessinés sur des calques que je qualifierai " d'inutiles ". La finalité serait de basculer ces éléments sur les calques qui ont servi à créer les blocs.Dans l'exemple, la polyligne "parasite" dans le calque BATI et le point dans le calque ARBRE. Ca ne doit pas être trop compliqué ... vu que (gile) tu as créé un lisp qui fait déjà ça, sauf que ça renvoi sur le calque zéro, mais la démarche doit être la même. ■ 1er problèmeLes blocs imbriqués dans des blocs.Dans certains cas, il serait sans doute préférable de ne pas modifier les sous-blocs.Mais d'une manière générale (en ce qui me concerne) je préférerai que tout soit modifier ...Exemple, un bloc lavabo (calque sanitaire) inclus dans un bloc Maison ==> rebasculer le tout dans le bloc Maison. ■ 2ème problèmeRetrouver des éléments "indéfinissables".La finalité exacte de ma demande et de ce topic, c'est de rendre des plans plus "propres".Et cela ne concerne pas uniquement les blocs.C'est-à-dire que des attributs, des résidus d'autres applications, ou je ne sais quoi encore, polluent bien souvent les plans que j'ai a retravailler. L'idée de coxsurf56, je l'utilise régulièrement, mais c'est pas très "clean" ...Si 10 calques me paraissent inutiles, je les fusionne en 1 seul, que j'intitule par exemple calque_parasite.Mais si ces 10 calques ne sont pas purgeables, c'est qu'il y a une raison ... !D'où ma 1ère question, sur l'existence d'un outil permettant une espèce de sélection rapide ou de référencement des entités, des attributs, des blocs, des sous-blocs, de TOUT ce à quoi un calque contient. Merci pour votre attention, et votre disponibilité.Cordialement. [Edité le 25/4/2007 par Azerty] Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 25 avril 2007 Posté(e) le 25 avril 2007 Salut, La finalité serait de basculer ces éléments sur les calques qui ont servi à créer les blocs. C'est ça que je comprends pas bien. Il n'y a pas un calque qui a servi à créer un bloc, ce sont les composants d'un bloc qui sont chacun sur un calque, et pas forcément le même sinon tu n'aurais pas de soucis. Donc je ne vois pas comment déterminer sur quel calque mettre les composants qui seraient sur des calques "indésirables" sauf à être sûr que tous les composants du bloc qui ne sont pas sur un calque indésirable sont bien sur le même calque. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 25 avril 2007 Posté(e) le 25 avril 2007 SalutMoi non plus, je ne comprends pas tout :casstet: J'ai fait ce lisp plus pour le fun et pour avoir s'il répond en partie à tes besoins @+ (defun c:cv(/ cal doc ent lay lst sel tbl) (if (ssget "x") (progn (setq doc (vla-get-activedocument (vlax-get-acad-object)) tbl '() ) (vlax-for lay (vla-get-layers doc) (or (vl-string-search "|" (setq cal (vla-get-name lay))) (setq tbl (cons (vla-get-name lay) tbl)) ) ) (setq lst tbl) (vlax-map-collection (setq sel (vla-get-activeselectionset doc)) '(lambda (x) (if (member (setq cal (vla-get-layer x)) tbl) (setq tbl (vl-remove cal tbl)) ) ) ) (vla-clear sel) (if tbl (progn (foreach sel (acad_strlsort (vl-remove-if '(lambda (x) (member x tbl)) lst)) (princ (strcat "\nLe calque " sel " contient des entités.")) ) (setq lst tbl) (vlax-for sel (vla-get-blocks doc) (setq aa sel) (and (eq (vla-get-islayout sel) :vlax-false) (eq (vla-get-isxref sel) :vlax-false) (not (vl-string-search "|" (vla-get-name sel))) lst (vlax-for ent sel (if (member (setq cal (vla-get-layer ent)) lst) (setq lst (vl-remove cal lst)) ) ) ) ) (if lst (progn (foreach sel (acad_strlsort (vl-remove-if '(lambda (x) (member x lst)) tbl)) (princ (strcat "\nDes blocs utilisent comme couleur le calque " sel " mais n'ont pas d'entités.")) ) (foreach sel (acad_strlsort lst) (princ (strcat "\nLe calque " sel " peut être supprimé.")) ) ) (progn (foreach sel (acad_strlsort tbl) (princ (strcat "\nDes blocs utilisent comme couleur le calque " sel " mais n'ont pas d'entités.")) ) (princ "\nTous les calques sont actuellement utilisés.") ) ) ) (princ "\nAucun calques qui ne contiennent d'élements") ) ) ) (princ) ) Edit : Une amélioration pour ne pas prendre en compte les xrefs [Edité le 25/4/2007 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 25 avril 2007 Posté(e) le 25 avril 2007 Si le LISP de Patrick_35 ne te convenait pas, je te fais une autre proposition. J'ai modifié Edit_bloc (version 3.3) qui permet désormais de choisir entre mettre toutes les entités du (ou des) bloc(s) sélectionné(s) soit sur le calque 0, soit sur le calque courant. Tu peux donc rendre courant le calque "-bati", sélectionner le bloc "-bati" (et tous les autres blocs dont tu veux mettre les composants sur ce calque) et cocher Calque et Courant dans la boite de dialogue (les blocs imbriqués seront traités aussi).[Edité le 25/4/2007 par (gile)] [Edité le 26/4/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 25 avril 2007 Posté(e) le 25 avril 2007 Salut (gile)A propos d'Edit_bloc, j'ai constaté ce que je pourrai appeler un Bug :(Si je choisis de mettre toute la collection sur le calque 0, etc.., j'ai eu la désagréable surprise de constater que des blocs qui ont été inséré avec un certain facteur d'échelle, de les retrouver avec l'échelle 1 :o .Qaund on fait le ménage d'un plan venu de l'extérieur, cela surprend au début. Donc si la possibilité pouvait être offerte de choisir ou pas le facteur d'échelle, ce serait top ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 25 avril 2007 Posté(e) le 25 avril 2007 Merci Patrick, pour le retour. Donc, Edit_bloc version 3.2 avec une case à cocher pour la mise à l'échelle. http://img122.imageshack.us/img122/2884/editblocyq3.png [Edité le 26/4/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 25 avril 2007 Posté(e) le 25 avril 2007 Quel réactivité :D Juste deux remarques pour te taquiner ;) Si le facteur d'échelle est grisé, il serait logique que l'unité aussi. De même que l'on pourrait faire apparaître le nom du calque courant au lieu de courant, mais là, ca prête à discution.Ou mieux encore, avec la possibilité de choisir son calque dans une popup_list avec comme calque par défaut le courant. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
speedy Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 Bonjour à tous il est super "Edit_bloc" de Gile, j'ai le même prob avec des plans qui viennent de l'exterrieur....,je me retrouve avec des calques qui ne se purge pas ??.... J'ai remarqué que parfois il y avait des blocs dans un bloc et du copier colé qui venait d'un autre calque, je pense que c'est ça que je ne puisse pas les purger, j'ai essayé le code Patrick (cv.lsp), pas eu de résultat satisfaisant, ce code cherche les entités calque et bloc. y'aurait il un moyen de faire une analyse sur le bloc lui même ???, dans le style explode bloc à l'intérieur des blocs ou m'indiquer quel bloc est constitué de bloc à l'interrieur .... @+ Michel a
(gile) Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 Si le facteur d'échelle est grisé, il serait logique que l'unité aussi. Je ne pense pas, les deux agissent indépendamment, même si un changement d'unité se traduit par un changement d'échelle. Ou mieux encore, avec la possibilité de choisir son calque dans une popup_list avec comme calque par défaut le courant. C'est fait, avec comme défaut le calque 0. Nous en sommes donc à la version 3.3 (ici)et je pense essayer d'arrêter de transformer en "usine à gaz" ce, qu'au départ, je pensais pouvoir être juste un utilitaire pour "mettre au propre" des collections de blocs ou des dessins (avec les propriétés usuelles des blocs : DuBloc et Calque 0). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 qu'au départ, je pensais pouvoir être juste un utilitaire pour "mettre au propre" Comme quoi, les idées et les améliorations viennent au fur et à mesure de l'utilisation :cool: Et tant que j'y suis, tu pourrais comme pour la sélection du calque, faire la même chose la couleur, le type de ligne et l'épaisseur ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Patrick_35 Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 Pour répondre à speedy, mon lisp ne sert qu'à indiquer les calques qui sont vide. Pour les effacer définitivement, il faut utiliser la commande des expresstools _laydel. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
speedy Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 Merci Patrick_35 j'avais essayer de les purger, rien à faire, pour les supprimer j'ai créé une ligne par calque à effacer et ensuite avec _laydel je les a éffacé difinitivement. @+ Michel a
speedy Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 + pour le fichier de Azerty, j'y ai procédé de la même manière et ces calques (- Calque inutilese) sont effacés difinivement.....à voir si cette astuce peut servir..... @+ Michel a
(gile) Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 speedy, Pour trouver les blocs imbriqués tu peux utiliser cette routine, que m'avait conseillé Tramber (le lien n'est plus valide, alors je colle le code ici (Taper NB et sélectionner un bloc, les imbrications dans le bloc apparaissent dans une arborescence). ;;NESTED.LSP Copyright 2003,2004 HyperPics all rights reserved ;; ;; Author: Lee Ambrosius, ;; HyperPics, http://www.hyperpics.com ;; return-nested (defun return-nested (PARENT-ENT RPT-INDENT / ENT BLKNAM) (setq ED (entget (tblobjname "BLOCK" (dxf 2 (entget PARENT-ENT))))) (setq ENT (dxf -2 ED)) ;; Grab the first Layer name from table entity (setq BLKNAM (dxf 2 ED)) (while (/= ENT nil) (setq ED (entget ENT)) (if (= (dxf 0 ED) "INSERT") (progn (terpri) (setq RPT-INDENT (strcat RPT-INDENT "|-> ")) (princ (strcat RPT-INDENT (setq BLKNAM (dxf 2 ED)))) (setq RPT-INDENT (substr RPT-INDENT 1 (- (strlen RPT-INDENT) 4)) ) (if (/= (dxf -2 (entget (tblobjname "BLOCK" (dxf 2 (entget PARENT-ENT)))) ) ) (return-nested ENT (strcat RPT-INDENT "| ")) ) ) ) (setq ENT (entnext ENT)) ) ) (defun c:nb () ;; Grabs the value from the designated location in the DXF code ;; ie. (dxf 2 ) (defun dxf (code elist) (cdr (assoc code elist)) ) (setq INDENT "") (setq ENT (car (entsel "\nSelect block: "))) (if (/= ENT nil) (progn (terpri) (princ (strcat "*" (dxf 2 (entget ENT)))) (return-nested ENT INDENT) ) ) (princ) ) (prompt "\nType NB to run the command.") (princ) Patrick_35, En recherchant le code ci-dessus, je suis tombé sur ce message des tout débuts de Edit_bloc :casstet: ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 Ah oui, c'est exacte :red: Comme quoi, seul les idiots ne changent pas d'avis ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 Bon... ...version 3.4, maintenant ça suffit ! C'est plus une routine, c'est un roman feuilleton ... http://img45.imageshack.us/img45/9582/editblockw2.png J'avoue en avoir un peu bavé, les couleurs vraies en vlisp, c'est pas ce qu'on fait de plus simple. Ça devrait fonctionner aussi pour les versions antérieures à 2004. [Edité le 27/4/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 maintenant ça suffit ! C'est plus une routine, c'est un roman feuilleton ... Ca me rappel la fonction LXL ;)Remarque, c'est comme cela que l'on répond aux besoins et qu'on arrive à faire des super lisps Je suis curieux de voir comment tu as rempli l'image (avec fill_image je suppose, mais en couleurs vraies avec la traduction RVB !) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 26 avril 2007 Posté(e) le 26 avril 2007 Je suis curieux de voir comment tu as rempli l'image Avec fill_image, on ne peut mettre que les couleurs de l'index, et la couleur est choisie avec (acad_truecolordlg ...) qui retourne une liste de paires pointées (DXF 62, 420 et 430 si ces deux derniers existent) donc même pour les couleurs "vraies" (RGB) ou les couleurs d'un carnet on a la couleur de l'index la plus proche.La difficulté était plus d'attribuer une couleur RGB ou "nommée" avec (vla-put-TrueColor ...). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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