Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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.000

Facteur d'échelle X: 1.000

Facteur d'échelle Y: 1.000

Angle de rotation: 100.0000g

Facteur d'échelle Z: 1.000

Mettre à l'échelle uniformément: Non

Autoriser 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, évidemmentsmile.gif

 

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.

Posté(e)

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

Posté(e)

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: attsync

Entrez 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à à tester

A+

 

(Ps: Je n'ai pas testé avec la fonction acet-attsync, je suppose que c'est le même comportement).

Apprendre => Prendre => Rendre

Posté(e)

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 bloc

1 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: attsync

Entrez 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

 

Olivier

TEST_EE_200-1000-2.zip

Posté(e)

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.zip

Dessin6.zip

  • Upvote 1

Apprendre => Prendre => Rendre

Posté(e)

Oui mais non smile.gif

 

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à...biggrin.gif

Si il y a plus simple je préfère!

 

Olivier

  • Upvote 1
Posté(e)

Oui mais non smile.gif

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 :rolleyes:

 

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

Posté(e)

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

Posté(e)

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: ATTSYNC

Entrez une option [?/Nom/Sélectionner] <Sélectionner>: _NAME

Nom du bloc à synchroniser ou [?]: PanneauSensInterdit

La table des blocs ne contient aucun bloc avec attributs dénommé

PanneauSensInterdit.

Commande: ATTSYNC

Entrez une option [?/Nom/Sélectionner] <Sélectionner>: S

Sélectionnez un bloc:

ATTSYNC le bloc PanneauSensInterdit? [Oui/Non] <Oui>:

ATTSYNC terminé.

Je continue à chercher.

Merci

Olivier

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité