Olivier Eckmann Posté(e) le 18 juin 2014 Posté(e) le 18 juin 2014 Bonjour, J'essaie de supprimer tous les attributs d'une référence de bloc. (setq oVlaBlk (vlax-ename->vla-object oBloc)) (foreach oVlaAtt (vlax-invoke oVlaBlk 'GetAttributes) (vla-delete oVlaAtt) ) (vla-update oVlaBlk) ça fonctionne visuellement, le problème c'est que mon bloc possède encore le drapeau (66 . 1) et donc la propriété HasAttributes à true, ce qui me génère un message d'erreur à chaque fois que je sélectionne ce bloc. J'ai trouvé une solution en remettant en place un nouveau bloc et en effaçant l'ancien, mais c'est pas très propre (ordre de tracé non respecté, ...) Est-ce qu'il y a une solution pour effacer tous les attributs d'un bloc et lui indiquer qu'il n'a plus d'attribut? Merci Olivier
lecrabe Posté(e) le 18 juin 2014 Posté(e) le 18 juin 2014 Hello Que penses tu de ce programme de Gilles ! Bye, lecrabe ;; ;; Par GC le 19/08/2009 - ATTENTION CE PROGRAMME SUPPRIME TOUS LES ATTRIBUTS DE TOUS LES BLOCS ;; ;; http://www.cadxp.com/modules.php?op=modload&name=XForum&file=viewthread&tid=24840#pid107475 ;; (defun c:delatt_all () (vl-load-com) ;; Supprimer les attributs dans toutes les definitions de bloc (vlax-for blk (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) (if (and (= (vla-get-isXref blk) :vlax-false) (= (vla-get-isLayout blk) :vlax-false) ) (vlax-for obj blk (if (= (vla-get-ObjectName obj) "AcDbAttributeDefinition") (vla-delete obj) ) ) ) ) ;; Supprimer les attributs dans toutes les references de bloc inserees (if (ssget "_X" '((0 . "INSERT") (66 . 1))) (progn (vlax-for blk (setq ss (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)) ) ) (mapcar 'vla-delete (vlax-invoke blk 'GetAttributes)) ) (vla-delete ss) ) ) (princ) ) Autodesk Expert Elite Team
Olivier Eckmann Posté(e) le 19 juin 2014 Auteur Posté(e) le 19 juin 2014 Salut, c'est bien le même type de code que j'utilisais. Voilà la liste d'un joli point topo une fois ses attributs supprimés par le programme de Gilles REFERENCE DE BLOC Calque: "TOPOJIS" Espace: Espace objet Maintien = f20e4 Nom du bloc: "COVAPOINT" en point, X=1679998.262 Y=8165011.103 Z= 0.000Facteur d'échelle X: 1.000Facteur d'échelle Y: 1.000Angle de rotation: 100.0000gFacteur d'échelle Z: 1.000Mettre à l'échelle uniformément: NonAutoriser la décomposition: Oui SEQUENCE FIN Calque: "TOPOJIS" Espace: Espace objet Maintien = f20e5 Le code SEQEND reste et n'est pas mis à jour. Et MAP affiche le message d'erreur suivant lorsqu'on sélectionne ce bloc et que la palette de propriété est affichée"Impossible de lire les attributs de bloc à partir de la référence de bloc sélectionnée." La commande "Contrôler" d'Autocad nous dit qu'il n'y a aucune erreur dans la base de données, évidemment Je vais chercher du côté du C# si on peut faire mieux. Olivier PS: je viens de m'apercevoir d'un truc rigolo. Le Handle du SEQEND suit immédiatement celui du INSERT, puis les attributs sont ajoutés ensuite et leur Handle suit. Ce qui voudrait dire qu'AutoCAD ajoute d'abord le SEQEND puis les attributs à la suite, même si c'est listé dans le sens inverse.
GEGEMATIC Posté(e) le 19 juin 2014 Posté(e) le 19 juin 2014 salut,si tu as essayé la solution de la réinsertion, c'est que ta définition de bloc n'a plus d'attributs non plus, vrai ?as-tu essayé de faire un attsync ?es-ce que hasattribute reste à 1 ?Gérald ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
VDH-Bruno Posté(e) le 19 juin 2014 Posté(e) le 19 juin 2014 Bonjour, as-tu essayé de faire un attsync ? Un test rapide me fait dire que la piste évoqué est bonne pour les références déjà inséré. A+ Apprendre => Prendre => Rendre
Olivier Eckmann Posté(e) le 19 juin 2014 Auteur Posté(e) le 19 juin 2014 Bonjour, La commande ATTSYNC ne peut pas être la solution.Si j'ai une définition de bloc qui contient des attributs et que sur UNE référence (insertion) particulière de ce bloc je souhaite enlever tous les attributs, quand je lance ATTSYNC il me les remet.Et si ma définition de bloc n'a plus d'attribut, ATTSYNC refuse de la prendre en compte car cette commande ne sait travailler que sur les blocs dont la définition possède un attribut.D'autre part ATTSYNC redéfinit les attributs sur tous les blocs déjà insérés selon leur définition, y compris la position. Ce qui m'oblige à stocker les caractéristiques de chaque attribut (position, rotation, style, hauteur...) pour les restaurer après ATTSYNC. C'est un peu lourd. Gilles avait écrit un programme qui permettait de synchroniser les attributs ajoutés à une définition sans toucher aux caractéristiques des blocs déjà insérés. Mais le code c'est du C# et j'étais parti en lisp. Mais si il n'y a pas d'autre solution je reprendrais une partie du code C# pour l'appeler à partir de mon lisp.Pour la réinsertion, en fait je fait un "entget" sur mon bloc avec attribut, puis un "subst" de (66 . 0) à la place de (66 . 1) et j'utilise cette liste dans un "entmake" ce qui permet de cloner un bloc avec attribut en un bloc identique mais sans attribut. quelque soit sa définition (avec ou sans attribut) puis un "entdel" de mon bloc d'origine.Le problème c'est que j'ai une liste (et un jeu de sélection) des blocs à traiter en version ename et en version vla. le fait d'effacer un bloc et de le remplacer par un autre m'oblige à mettre mes listes à jour, et c'est toujours un peu sportif. Olivier
VDH-Bruno Posté(e) le 19 juin 2014 Posté(e) le 19 juin 2014 Bonjour Olivier, La commande ATTSYNC ne peut pas être la solution. Tu as sans doute raison pour les raisons évoqués, néanmoins dans mes tests, sans le faire exprès, j’ai réussi lever cette affirmation sous AutoCAD 2007:Et si ma définition de bloc n'a plus d'attribut, ATTSYNC refuse de la prendre en compte car cette commande ne sait travailler que sur les blocs dont la définition possède un attribut. Donc pour le retour, je livre le mode opératoire (conscient que cela ne peut être qu’un « truc » plus qu’autre chose). En 1 : Supprimer les attributs des définitions de bloc (ex : routine de (gile)) En 2 : Pour pouvoir lancer ATTSYNC, avoir ou charger dans le dessin au moins une définition de bloc avec attribut.En 3 : Enregistrer fermer puis rouvrir le dessin.En 4 : Lancer la commande ATTSYNC.Commande: attsyncEntrez une option [?/Nom/Sélectionner] <Sélectionner>:Sélectionnez un bloc:ATTSYNC le bloc repere file projet? [Oui/Non] <Oui>:ATTSYNC terminé. Contrôle du code 66 sur une référence de bloc :_$ (assoc 66 (entget (car (entsel)))) nil Toutes les références du bloc synchronisé sont à jour du code 66 dans de dessin ;-) Voilà à testerA+ (Ps: Je n'ai pas testé avec la fonction acet-attsync, je suppose que c'est le même comportement). Apprendre => Prendre => Rendre
Olivier Eckmann Posté(e) le 19 juin 2014 Auteur Posté(e) le 19 juin 2014 Merci pour les infos, mais je n'arrive pas du tout à mettre en oeuvre ton astuce. Je joins un fichier qui contient: 1 bloc COVAPOINT avec 2 attributs (c'est ma définition de bloc qui contient au moins un attribut pour pouvoir lancer ATTSYNC)1 bloc "PanneauSensInterdit" en noir qui est une insertion normale de ce bloc1 bloc "PanneauSensInterdit" rouge qui possédait un attribut que j'ai supprimé par le programme de gilles (code 66 à 1 restant) Commande: (entget (car (entsel)))Choix de l'objet: ((-1 . <Nom d'entité: 7edfc1e0>) (0 . "INSERT") (330 . <Nom d'entité: 7edf7cf8>) (5 . "F2F94") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 1) (100 . "AcDbBlockReference") (66 . 1) (2 . "PanneauSensInterdit") (10 27.9999 8.25 0.0) (41 . 3.0) (42 . 3.0) (43 . 0.6) (50 . 6.13319) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0)) Lorsque je lance ATTSYNC et que je sélectionne mon panneau, il me dit : Commande: attsyncEntrez une option [?/Nom/Sélectionner] <Sélectionner>:Sélectionnez un bloc:Le bloc sélectionné est sans attribut.Si tu as la solution je suis preneur. Je fais les tests sur un MAP 3D 2008. Merci OlivierTEST_EE_200-1000-2.zip
VDH-Bruno Posté(e) le 19 juin 2014 Posté(e) le 19 juin 2014 Re, Change de bloc, plus sérieusement même message avec "PanneauSensInterdit"... Je te retourne tout de même ton dessin car j'ai fait le même test avec COVAPOINT, tu verras qu'il n'y as plus de code 66. Je t'ai retourné en second dessin avec un de mes blocs avec attribut supprimé en référence et définition + code 66 à 1.Il n'y a plus qu'a lancer ATTSYNC dessus pour supprimer le code 66 A+retour-TEST_EE_200-1000-2.zipDessin6.zip 1 Apprendre => Prendre => Rendre
Olivier Eckmann Posté(e) le 19 juin 2014 Auteur Posté(e) le 19 juin 2014 Oui mais non en fait dans ton dessin, comme le bloc original avait des attributs, le fait de les supprimer de la définition garde en mémoire que c'était un bloc avec attribut donc ATTSYNC se fait "rouler dans la farine" car il croit que la définition du bloc contient toujours des attributs. Par contre tu démarres un nouveau dessin, tu définis ton bloc "repere file projet" avec simplement une ligne et un cercle et tu insères ton Dessin6 dedans. Alors ATTSYNC ne se fait plus "berner" et tu obtiens le message indiquant que ton bloc n'a pas d'attribut. Donc il faudrait que j'ajoute des attributs à ma définition de bloc pour ensuite les enlever et lui faire croire qu'ils sont toujours là...Si il y a plus simple je préfère! Olivier 1
VDH-Bruno Posté(e) le 20 juin 2014 Posté(e) le 20 juin 2014 Oui mais non Non mais oui ;) Par contre tu démarres un nouveau dessin, tu définis ton bloc "repere file projet" avec simplement une ligne et un cercle et tu insères ton Dessin6 dedans. Alors ATTSYNC ne se fait plus "berner" et tu obtiens le message indiquant que ton bloc n'a pas d'attribut.Tel que décrit cela fonctionne (si si j'ai testé :D) car lorsque j’insère mon bloc dans mon nouveau dessin, j’insère également la définition correspondant dans la table des blocs et j'écrase la définition antérieure dans ce cas je "blouse" toujours ATTSYNC Je pense que dans ton dessin tu as fait tout le contraire tu as écrasé ta définition de bloc par une définition plus récente qui n’a jamais contenu d’attribut (la blague était bonne, car je n'avais rien compris à ce bloc merci pour l'explication :(rires forts): ) A+ Apprendre => Prendre => Rendre
VDH-Bruno Posté(e) le 20 juin 2014 Posté(e) le 20 juin 2014 Re, Donc il faudrait que j'ajoute des attributs à ma définition de bloc pour ensuite les enlever et lui faire croire qu'ils sont toujours làSi il y a plus simple je préfère! Non pas forcément il faut juste « forcer » le code dxf 70 à 2 dans la définition du bloc, pour pouvoir exécuter ATTSYNC sur les références de bloc. Pour le principe les quelques lignes de codes utilisés sur ton fichier pour venir à bout de la définition du bloc "PanneauSensInterdit"…((lambda () (setq blk (entget (tblobjname "BLOCK" (cdr (assoc 2 (entget (car (entsel))))))) e (cdr (assoc -2 blk)) lstent nil ) (while e (setq lstent (cons (entget e) lstent)) (setq e (entnext e))) (entmake (subst '(70 . 2) (assoc 70 blk) blk)) (mapcar 'entmake (reverse lstent)) (entmake '((0 . "ENDBLK"))) ) ) Ci-joint ton fichier avec le code 66 supprimé après usage de la commande ATTSYNC:Commande: attsync Entrez une option [?/Nom/Sélectionner] <Sélectionner>: Sélectionnez un bloc:ATTSYNC le bloc PanneauSensInterdit? [Oui/Non] <Oui>: ATTSYNC terminé. A+retour2-TEST_EE_200-1000-2.zip Apprendre => Prendre => Rendre
Olivier Eckmann Posté(e) le 20 juin 2014 Auteur Posté(e) le 20 juin 2014 Grand merci pour tout ça. Je teste et je reviens dès que c'est concluant. Olivier
Olivier Eckmann Posté(e) le 23 juin 2014 Auteur Posté(e) le 23 juin 2014 Bonjour, Ça fonctionne presque. En fait c'est ATTSYNC qui est un peu bizarre. Si je lance la commande, puis que je prends l'option sélectionner, et que je sélectionne mon bloc, pas de souci, ATTSYNC propose de redéfinir les attributs. Par contre si je prends l'option NOM pour spécifier le bloc par son nom, alors ATTSYNC refuse de fonctionner car le bloc ne possède pas d'attribut. Commande: ATTSYNCEntrez une option [?/Nom/Sélectionner] <Sélectionner>: _NAMENom du bloc à synchroniser ou [?]: PanneauSensInterditLa table des blocs ne contient aucun bloc avec attributs dénommé PanneauSensInterdit.Commande: ATTSYNCEntrez une option [?/Nom/Sélectionner] <Sélectionner>: SSélectionnez un bloc:ATTSYNC le bloc PanneauSensInterdit? [Oui/Non] <Oui>:ATTSYNC terminé.Je continue à chercher.MerciOlivier
Patrick_35 Posté(e) le 23 juin 2014 Posté(e) le 23 juin 2014 Salut Une piste, à étoffer pour des blocs dynamiques.(defun c:efa(/ doc ent sel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (setq ent (car (entsel))) (setq nom (cdr (assoc 2 (entget ent)))) (progn (vlax-for ent (vla-item (vla-get-blocks doc) nom) (and (eq (vla-get-objectname ent) "AcDbAttributeDefinition") (vla-delete ent) ) ) (and (ssget "x" (list (cons 0 "insert") (cons 2 nom) (cons 66 1))) (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (entmake (vl-remove-if '(lambda(x)(member (car x) '(-1 5 66 330))) (entget (vlax-vla-object->ename ent)))) (vla-delete ent) ) (vla-delete sel) ) ) ) ) (vla-endundomark doc) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VDH-Bruno Posté(e) le 23 juin 2014 Posté(e) le 23 juin 2014 Bonjour,Ça fonctionne presque. En fait c'est ATTSYNC qui est un peu bizarre. Si je lance la commande, puis que je prends l'option sélectionner, et que je sélectionne mon bloc, pas de souci, ATTSYNC propose de redéfinir les attributs. Par contre si je prends l'option NOM pour spécifier le bloc par son nom, alors ATTSYNC refuse de fonctionner car le bloc ne possède pas d'attribut. Je m’en étais aperçu en testant la fonction acet-attsync, je pense qu’une solution avec ATTSYNC ne peut être que un "truc à savoir", mais pas une "vraie solution". Pour moi le problème ne se pose plus, en repartant et en testant les lignes de Patrick_35 je pense que c’est plus complet et direct que mes précédentes propositions. Par contre le fait de redessiner la réference la replace en avant plan (un moindre mal qui doit peut être trouver sa solution …) A+ Apprendre => Prendre => Rendre
Olivier Eckmann Posté(e) le 23 juin 2014 Auteur Posté(e) le 23 juin 2014 Je suis aussi revenu au remplacement par une nouvelle insertion et effacement de l'ancien. En .net il y a une fonction SwapIdWith qui s'implémente comme cela:firstObj.SwapIdWith(secondId, swapExtendedData, swapExtensionDictionary);Je vais voir de ce côté car elle permet d'intervertir les Id et les Handles, et il me semble que la table de SORTENTS pour les ordres de tracé fonctionne sur les Handles. Merci à Bruno et Patrick Olivier
Olivier Eckmann Posté(e) le 24 juin 2014 Auteur Posté(e) le 24 juin 2014 Effectivement, j'ai implémenté le SwapId (en C#) entre mon ancien bloc et mon nouveau, ce qui intervertit les Objectid ET les handles. Donc tout fonctionne bien. Olivier
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