speedy Posté(e) le 27 avril 2007 Posté(e) le 27 avril 2007 Bonjour à tous merci Patrick_35 et gile de votre aide si précieux............ @+ Michel a
(gile) Posté(e) le 27 avril 2007 Posté(e) le 27 avril 2007 J'espère qu'on t'a un peu aidé avec ton problème, on s'est un peu perdu en appartés et digressions ... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 2 mai 2007 Auteur Posté(e) le 2 mai 2007 Coucou, me revoilou ... @ (Gile) 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 calqueAu risque de paraître ridicule auprès des spécialistes, j'utilise tout le temps l'ampoule (activer/désactiver) et le soleil (geler/libérer).Pour moi la différence fondamentale, c'est justement que l'ampoule permet de masquer les éléments d'un calque, alors que le soleil permet de masquer les éléments d'un calque + les éléments imbriqués dans un bloc créé dans ce calque. Si je reprends mon exemple en .dwg, en désactivant le calque "-Bâti", il reste affiché des traits (du calque "-Calque inutile").Alors qu'en gelant le calque, ils n'apparraissent plus.Pourquoi ... eh bien parce que j'ai créé le bloc "maison" dans le calque "-Bâti" ...Donc je ne comprends pas la remarque " il n'y a pas un calque qui a servi à créer le bloc "... si, pour moi il y en a un, c'est le calque courant lorsque j'ai lancé la commande bloc. ("-Bâti" dans l'exemple)(désolé, je suis autodidacte, je conçois qu'on ne parle pas le même language et que je ne suis pas toujours clair dans mes questions / explications ...) Tu peux donc rendre courant le calque "-bati", sélectionner le bloc "-bati" et cocher Calque et Courant dans la boite de dialogueEt il n'y a pas moyen d'automatiser un peu tout ça ?Parce que faire la manip 7.000 fois, c'est un peu long ... D'ailleurs, c'est toujours problématique (avec les blocs avec des imbrications...) et ça oblige à y aller calque par calque ... ▬▬▬▬▬▬ ▬▬▬▬▬▬ ▬▬▬▬▬▬ ▬▬▬▬▬▬ ▬▬▬▬▬▬ ▬▬▬▬▬▬ @ Patrick_35 J'ai testé le lisp :" Des blocs utilisent comme couleur le calque - Calque inutile mais n'ont pas d'entités. " Entité = bloc ??? je ne comprends pas trop ce résultat ... Ce qui m'importe, ce n'est pas de lister les blocs ... c'est que le filaire, les points, les annotations ... "parasites" soient rebasculés dans le calque ayant servis à créer le bloc ... Par ailleurs, avec la commande SUPCALQUE ( _laydel ), effectivement, ça fonctionne ... sauf que ça supprime le contenu.Ma finalité est de "purger" les calques, pas de vider complètement mon fichier.(même si parfois c'est pas l'envie qui me manque) ^^ Une seule chose à dire : MERCI CADxp !
Patrick_35 Posté(e) le 2 mai 2007 Posté(e) le 2 mai 2007 SalutEntités = bloc, texte, ligne, point, polyligne, solide, cote, etc... Par ailleurs, avec la commande SUPCALQUE ( _laydel ), effectivement, ça fonctionne ... sauf que ça supprime le contenu. D'où l'intérêt du lisp pour voir ce qui est vide ou pas @+ 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 2 mai 2007 Posté(e) le 2 mai 2007 Pourquoi ... eh bien parce que j'ai créé le bloc "maison" dans le calque "-Bâti" ... Non, le bloc n'est pas créé dans un calque particulier, ce sont les entités composant le bloc "maison" qui étaient sur le calque "-Bâti" quand tu as créé le bloc. Si les entités avaient été sur des calques tous différents, tu ne pourrais pas dire qu'un calque à servi à créer le bloc. Le soucis que tu as avec des entités dans les blocs sur des calques "indésirables" en est un exemple. Donc, si tu veux que toutes les entités d'un bloc soient sur le même calque, il faut que l'utilisateur décide sur quel calque elles doivent être déplacées, un programme ne peut pas l'inventer. Parce que faire la manip 7.000 fois, c'est un peu long ... J'ose imaginer que tu n'as pas, dans ton dessin, 7000 définitions de bloc dont tu veux mettre les entités sur 7000 calques différents. Edit_bloc redéfinit les blocs c'est à dire modifie leur définition, les références insérées dans le dessin sont simplement mises à jour en conséquence. Donc si, avec Edit_bloc, tu sélectionnes le bloc "maison" (ainsi que tous les blocs auxquels tu veut faire subir les mêmes modifications) et que tu choisis l'option "Calque" et le calque "-bati", la modification sera effective pour toutes les entités déjà insérées dans le dessin ainsi que pour celles qui seront insérées plus tard. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 3 mai 2007 Auteur Posté(e) le 3 mai 2007 Si les entités avaient été sur des calques tous différents, tu ne pourrais pas dire qu'un calque à servi à créer le bloc Ben si, forcement ... le calque courant ... il faut que l'utilisateur décide sur quel calque elles doivent être déplacées, un programme ne peut pas l'inventer. Ca signifie que le calque courant lors de la création, n'est enregistré nulle part ????Pourtant, cette information existe, puisque dans la pratique l'ampoule et le soleil permettent de manipuler (~ d'afficher) les calques autrement. Désolé d'être aussi naïf, mais depuis 6~7 ans, j'utilise volontairement ce "phénomène" dans tous mes dessins.Donc me dire que c'est " une invention " ... ça me surprends ... Attention, c'est peut être impossible à exploiter dans un lisp, je n'en sais rien.Mais parfois vous faites presque des miracles (Patrick, Tramber, Gile ... et j'en oublies sûrement) du coup je préfère insister, au cas où le vrai problème serait un souci de compréhension, et pas d'impossibilité de réalisation ... Merci d'être à l'écoute.Cordialement. Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 Si les entités avaient été sur des calques tous différents, tu ne pourrais pas dire qu'un calque à servi à créer le bloc Ben si, forcement ... le calque courant ... Certes, si tu veux jouer sur les mots, mais ce n'est pas parce qu'au moment de la création d'un bloc le calque "toto" est courant que le bloc à forcément quelque chose à voir avec ce calque.Exemple :Fait un cercle sur le calque "rouge", un rectangle sur le calque "jaune", rend le calque "vert" courant et fait un bloc avec le cercle et le rectangle : il n'aura rien à voir avec le calque "vert". il faut que l'utilisateur décide sur quel calque elles doivent être déplacées, un programme ne peut pas l'inventer. Ca signifie que le calque courant lors de la création, n'est enregistré nulle part ????Pourtant, cette information existe, puisque dans la pratique l'ampoule et le soleil permettent de manipuler (~ d'afficher) les calques autrement. Comme j'ai tenté de l'expliquer plus haut, les seules informations contenues dans un bloc concernent les entités qui le compose et le point d'insertion. Ce que tu décris avec l'activation/désactivation ou le gel/degel d'un calque ne concerne pas le calque courant lors de la création du bloc mais le calque sur lequel est insérée une référence du bloc. Je crois maintenant comprendre ce que tu voudrais, c'est mettre toutes les entités des blocs sur le calque sur lequel ils sont insérés, ce qui suppose que tous les blocs "maison" soient bien insérés sur le calque "-bati".Ai-je compris ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 3 mai 2007 Auteur Posté(e) le 3 mai 2007 Je tiens à préciser que je ne cherche nullement à ironiser, ou à "jouer volontairement sur les mots" ... j'essaye simplement d'expliquer avec mon vocabulaire de, soyons honnête, pseudo-débutant ... Je commence à comprendre la problématique ...Effectivement, si les blocs sont "insérés / créés" sur le calque |vert| alors que toutes les entités qu'ils contient sont |rouges| et |jaunes| à petits pois on se trouve face à une belle confusion. Sauf que, si je peux me permettre un zeste d'égoïsme, j'aimerai que ma requête aboutisse sur un lisp, qui m'aide ... moi.Et concrètement, comme je le disais plus haut, je travail ainsi ... en jouant sur l'insertion vert/rouge, afin de pouvoir ne pas afficher |rouge|, tout en gardant |vert|. De ce fait, j'estime que si les dessins sources que je récupère sont mal fichus (genre des voitures insérées sur le calque maison) à la limite, c'est pas trop gênant. Enfin si, mais ça me parait plus simple de rectifier les erreurs flagrantes, que de me poser la question au cas par cas ... dans quel calque rebasculer ce bloc ?D'autant que ma finalité, c'est pas de cerner la nomenclature des 10 personnes qui sont intervenues sur le fichier ... mais d'avoir un truc clean. En résumé : mettre toutes les entités des blocs sur le calque sur lequel ils sont insérés Oui, voilà ! Merci pour ta patience ... [Edité le 3/5/2007 par Azerty] Une seule chose à dire : MERCI CADxp !
(gile) Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 Donc voilà un LISP à utiliser avec précaution, il vaut mieux sauver le dessin avant au cas où le résultat ne serait pas celui escompté. Les blocs imbriqués sont traités : le bloc et ses composant sont mis sur le même calque que le bloc "parent".Si le même bloc est imbriqué dans plusieurs autres qui ne sont pas sur le même calque il prendra les propriétés du dernier calque traité ; on pourrait aussi mettre les blocs imbriqués sur le calque 0, ils prendraient alors les propriétées du calque dans lequel ils sont imbriqués (à voir). Je te laisse tester, avant d'envisager d'éventuelles modifications. Edit : pas de traitement des blocs anonymes (blocs dynamiques) (defun c:test (/ change_lay AcDoc Blocks name ss n ref lay lst) (vl-load-com) (defun change_lay (n l) (vlax-for e (vla-item Blocks n) (vla-put-layer e l) (if (= (vla-get-ObjectName e) "AcDbBlockReference") (change_lay (vla-get-Name e) l) ) ) ) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Blocks (vla-get-Blocks AcDoc) ) (vlax-for bl Blocks (and (setq name (vla-get-name bl)) (not (wcmatch name "`**Space*,*|*")) (setq lst (cons (vla-get-name bl) lst)) (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 name)) ) ) (setq ref (vlax-ename->vla-object (ssname ss 0))) (setq lay (vla-get-Layer ref)) (change_lay name lay) ) ) (vla-regen acDoc acAllViewports) (princ) ) [Edité le 3/5/2007 par (gile)] [Edité le 3/5/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 3 mai 2007 Posté(e) le 3 mai 2007 Salut (gile) Juste une astuce pour créer ta liste de blocs (vlax-for bl Blocks (and (setq name (vla-get-name bl)) (eq (vla-get-islayout bl) :vlax-false) (setq lst (cons (vla-get-name bl) lst)) ) ) @+ 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 3 mai 2007 Posté(e) le 3 mai 2007 Merci Patrick, mais je vais garder wcmatch pour écarter du même coup les blocs des xrefs. [Edité le 3/5/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 4 mai 2007 Posté(e) le 4 mai 2007 Une version qui semble fonctionner aussi avec les blocs anonymes issus de bloces dynamiques. (defun c:test (/ change_lay AcDoc Blocks name ss n ref lay) (vl-load-com) (defun change_lay (n l) (vlax-for e (vla-item Blocks n) (vla-put-layer e l) (if (= (vla-get-ObjectName e) "AcDbBlockReference") (change_lay (vla-get-Name e) l) ) ) ) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Blocks (vla-get-Blocks AcDoc) ) (vlax-for bl Blocks (and (setq name (vla-get-name bl)) (not (wcmatch name "`**Space*,*|*")) (or (/= (substr name 1 2) "*U") (setq name (strcat "`" name)) ) (setq ss (ssget "_X" (list '(0 . "INSERT") (cons 2 name)) ) ) (setq ref (vlax-ename->vla-object (ssname ss 0))) (setq lay (vla-get-Layer ref)) (change_lay (vl-string-left-trim "`" name) lay) ) ) (vla-regen acDoc acAllViewports) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Azerty Posté(e) le 4 mai 2007 Auteur Posté(e) le 4 mai 2007 MERCI ! ! ! ! Ca fonctionne exactement comme je le souhaitais, et en plus c'est très rapide ( moins de 15 sec sur 2 "gros fichiers", avec mon 3Ghz )Ca va vraiment me faciliter la vie ... Chapeau bas pour votre réactivité et votre précision !Encore merci, très sincèrement. Une seule chose à dire : MERCI CADxp !
Bred Posté(e) le 4 mai 2007 Posté(e) le 4 mai 2007 Salut,message pour (gile) :Je suis épaté de la manière dont tu as réussis à faire ça... et je ne le comprends pas :Tu atteinds les entités d'un bloc constituant un bloc imbriqué sans l'exploser....Pourrais-tu m'éclaircir ça stp ?merci. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 4 mai 2007 Posté(e) le 4 mai 2007 Salut, On atteint les entités d'un bloc sans l'exploser en faisant un (vlax-for ent bloc ...) où bloc est la définition du bloc récupérée par (vla-item (vla-get-Blocks AcDoc) "Nom_du_bloc"). Si un bloc est imbriqué dans un autre, sa définition est aussi dans la collection ; dans la fonction récursive "change_lay" si une entité de bloc est une référence de bloc, sa définition sera passée à son tour comme argument à "change_lay" : ;; change_lay Met les entités du bloc "n" sur le calque "l" (defun change_lay (n l) (vlax-for e (vla-item Blocks n) (vla-put-layer e l) (if (= (vla-get-ObjectName e) "AcDbBlockReference") (change_lay (vla-get-Name e) l) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 4 mai 2007 Posté(e) le 4 mai 2007 merci! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 4 mai 2007 Posté(e) le 4 mai 2007 (gile)En relisant ton lisp, je me dis qu'on pourrai aussi utiliser activeselectionset, ce qui permettrai de ne pas utiliser vlax-ename->vla-object @+ 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 4 mai 2007 Posté(e) le 4 mai 2007 Patrick_35, C'est vrai je n'ai pas encore pris l'habitude, et en plus, ici l'intérêt est limité : du jeu de sélection je n'utilise que le premier élément pour récupérer le calque sur lequel il est inséré. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 4 mai 2007 Posté(e) le 4 mai 2007 Ah oui, exacte :red:Bon, je crois que je vais me coucher tôt ce soir. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Arcasdk Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 Bonjour, bonjour.... Je vais remettre ce post au gout du jour, (j'aime bien les vieux dossiers) Dans un souci permanent d'avoir des plans nikel chrome (vanadium) je crois bien que ma commande la plus utilisée est "Purger" Sauf que souvent, lorsque des blocs sont "imbriqués" dans d'autres blocs.....Eh bien on peut purger autant de fois que l'on veut...Rien n'y fait. J'ai déjà lu ce post en long, en large, en travers. J'ai parcouru tous les liens qui mennent vers des liens qui mennent vers d'autres liens. J'ai aussi bien sur charger l'incontournable "Edit_Bloc". (Et même que c'est la v3.5) ET CEPENDANT....J'ai encore quelques calques qui n'ont leur place que dans une corbeille. donc j'ai lancé la ptite macro de Gile qui est la suivante pour afficher les blocs qui possède ce genre de calques: Commande: (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) (_> ) (test "CACHE") jusque là ca va...mais juste aprés... ; erreur: no function definition: VLAX-GET-ACAD-OBJECT Me replongeant dans le lisp que depuis peu j'ai dû louper un épisode.Je me suis aperçu en revanche que ceci n'est pas de l'autolisp mais du V-Lisp (Chose nouvelle pour moi) Je suis en Autocad 2008. Messires les pros du Lisp...Je suis tout ouie.. ;) ;) ;) [Edité le 31/1/2008 par Arcasdk] <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
(gile) Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 Salut, Pour utiliser les fonctions Visual LISP, il faut les charger avec l'expression (vl-load-com), une fois par session suffit. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Arcasdk Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 Tout simplement.... Donc si c'est du Vlisp je peux écrire en début de programme "(vl-load-com)"pour ne plus être embêté? Merci! ;) <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
(gile) Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 Oui, ou encore, créer un fichier nommé acad.lsp ou acaddoc.lsp dans un répertoire du chemin de recherche des fichiers de support et mettre l'expression (vl-load-com) dans le fichier.Par défaut (variable système ACADLSPASDOC à 0) le fichier AutoCAD.lsp sera chargé au démarrage d'AutoCAD, le fichier acaddoc.lsp est chargé à chaque ouverture d'un dessin. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Arcasdk Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 J'ai bien enregistré... :) Rapide et précis...Tout ce qu'il y a de mieux Merci <IMG SRC=http://peronfrederic.free.fr/banniere.jpg></IMG> <a href=www.formu-lan.net>www.FormuLan.net</a>
felipe63000 Posté(e) le 29 janvier 2008 Posté(e) le 29 janvier 2008 petite remarque, aprés avoir chargé le lisp noté plus haut, tout fonctionne bien, mais erreur fatale au bout de quelques minutes .......... c'est normal ???d'ou l'intéret des sauvegardes auto !!
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