Aller au contenu

Bloc et attribut


ayoros

Messages recommandés

Bonjour tout le monde

 

Voici mon souci ,je voudrais que lorsque je copie mon bloc avec mes attributs, les renseignements indiquer à mon premier bloc se modifie par la même occasion.Donc une fois ma copie terminer et que je change la valeur de mes attributs dans mon 1er bloc il se modifie dans l'autre par la même occasion.

Le bloc le fait naturellement sauf qu'il faut l'éditer et changer tout les renseignements un par un donc je voulais combinez les avantages de chacun d'entre eux.

 

Merci d'avance pour vos renseignement

 

[Edité le 25/8/2008 par ayoros]

Lien vers le commentaire
Partager sur d’autres sites

ayoros

 

Avant de répondre, je voudrais mieux comprendre la question. Si je reformule : Tu disposes de 2 (ou plusieurs) blocs portant le même nom, avec les mêmes définitions d'attribut. Lorsque tu édites l'un (via une boite de dialogue ou sur la ligne de commande), que l'autre se modifie automatiquement. Est-ce bien cela ?

 

Serge

Lien vers le commentaire
Partager sur d’autres sites

ayoros

 

Finalement, j'ai fait une solution, en espérant qu'elle corresponde au besoin. [surligneur] À modifier[/surligneur], la liste des noms de blocs à surveiller.

 

 
;;; Réacteurs permettant de synchroniser les attributs au travers de blocs homonymes
;;; Limites: AutoCAD n'empêche pas qu'un bloc ait 2 attributs portant le même nom d'étiquette (tag)
;;; Si une telle situation se présente, le texte de la première étiquette sera extraite.
;;; De plus, si de nouveaux blocs sont insérés (e.g. via _INSERT ou INSERER), les nouveaux blocs
;;; ne seront pas surveiller. On peut facilement modifier cette routine pour inclure l'événement
;;; ou encore on peut relancer (SetReactors) pour rafraichir.

;;; IMPORTANT : Vous devez corriger la liste des noms de bloc à surveiller
;;;             Variable *BlockNamesToWatch*
;;;
;;; Par Serge Camiré, 2008-08-26

;;; Déterminer la liste des noms de bloc à surveiller
[surligneur] (setq *BlockNamesToWatch* (list "Bloc1" "Bloc2"))[/surligneur]

;;; =======================================================================
;;; Ne pas modifier la suite

(defun BlockReactorObjectClosed ( 
  object calling-reactor arg-list 
/ attributes attributesSafeArray attributesVariant BlockName infos ObjectId Occurences 
  )
  ;; BlockReactorObjectClosed
  ;; Fonction callback de l'événement :vlr-objectClosed. Filtre l'information puis délègue le traitement
  ;; à la fonction CustomModification. Les arguments proviennent du notifier.
  (and 
     (not *CustomModification*)
     (not (vl-catch-all-error-p (setq BlockName (vl-catch-all-apply 'vla-get-name (list object)))))
     (setq ObjectId (vla-get-ObjectID object))
     (setq Occurences (GetBlockOccurences BlockName))
     (setq Occurences (vl-remove-if '(lambda (x) (= (vla-get-ObjectID x) ObjectId)) Occurences))
     (setq attributesVariant (vla-GetAttributes object))
     (setq attributesSafeArray (safearray-value (variant-value attributesVariant)))
     (foreach x attributesSafeArray (setq infos (append infos (list (cons (vla-get-TagString x) (vla-get-TextString x))))))
     (progn
        (setq *CustomModification* t)
        (foreach Occurence Occurences (CustomModification Occurence infos))
        (setq *CustomModification* nil)
     )
  )
)

(defun CustomModification (
  object infos
/ attributesSafeArray attributesVariant info tag
  )
  ;; CustomModification
  ;;   objet: objet à modifier
  ;;   infos : 'LIST, (list (cons tag1 . texte1) (cons tag2 . texte2) ...) en référence
  (setq attributesVariant (vla-GetAttributes object))
  (setq attributesSafeArray (safearray-value (variant-value attributesVariant)))
  (foreach x attributesSafeArray 
     (setq tag (vla-get-TagString x))
     (if (setq info (assoc tag infos)) (vla-put-TextString x (cdr info)))
     (vla-Update x)
  )
)

(defun GetAllBlockOccurences (BlockNames / AllOccurences Occurences)
  ;; GetAllBlockOccurences
  ;; Retourne tous les occurences de bloc correspondant à la liste de noms
  ;; BlockNames : 'LIST, (list "Nom1" "Nom2" "Nom3" ...)
 (setq Occurences nil)
 (setq AllOccurences nil)
 (foreach BlockName BlockNames
   (setq Occurences (GetBlockOccurences BlockName))
   (if	Occurences
     (setq AllOccurences (append AllOccurences Occurences))
   )
 )
 AllOccurences
)

(defun GetBlockOccurences (BlockName / BlockTable)
 ;; GetBlockOccurences
 ;; Reçoit le nom d'un bloc puis retourne la liste de toutes ses occurences en format vla
 (setq BlockTable (tblobjname "block" BlockName))
 (if BlockTable
   (vl-remove-if
     '(lambda (x) (not x))
     (mapcar 'vlax-ename->vla-object
      (mapcar 'cdr
	      (vl-remove-if-not
		'(lambda (x) (= 331 (car x)))
		(entget (cdr (assoc 330 (entget BlockTable))))
	      )
      )
     )
   )
 )
)

(defun SetReactors ( / AllOccurences )
  ;; SetReactors
  ;; Création d'un réacteur (un abonnement) entre une liste d'objets à surveiller 
  ;; et des paires (événement fonctions) devant être interpellées lors du dit événement.
 (setq	AllOccurences (GetAllBlockOccurences *BlockNamesToWatch*))
 (if *BlockReactor* (vlr-remove *BlockReactor*))
 (setq	*BlockReactor*
 (vlr-object-reactor AllOccurences nil
   '((:vlr-objectClosed . BlockReactorObjectClosed)
    )
 )
 )
)
(SetReactors)  ; Self-execute
(princ)

 

Serge

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Serge

 

Je te remercie de ton aide mais j'ai pas tous saisie sur les manipulations à réaliser.

 

Ta reformulation est bonne. Apparemment sur ton dernier message tu as écrit un lisp le souci c'est que je ne suis pas balèse dans se domaine et donc je ne comprend pas toutes les manipulations.

 

Peux tu me décrire plus précisément les étapes à faire stp

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Tu copies le code de serge et tu le colles directement en ligne de commande,ensuite, suit les étapes,...

 

Je n'ai pas trop compris ton besoin, puisque quand tu édites un bloc, ils se mettent tous à jour,non ?

 

Ou bien, pourquoi 2 blocs différents avec le même non ?

 

Merci d'avance de tes réponses,..

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

C est simple j ai plusieurs renseignement à rentrer dans mon bloc vue que c'est un cartouche et donc si je dois le modifié en tant que bloc je dois effectuer plusieurs édition de texte pour remplir tout les renseignements hors si je mais des attributs, je peux via la commande attedit tout remplir en une seul fois sous forme de formulaire.

Si je copie le bloc avec mes attributs ils ne changeront pas si je modifie les information dans celui d'origine.

Ce que je voulais savoir c'est si mes attributs peuvent se comporte comme un bloc via une comande , variable ect ....

Lien vers le commentaire
Partager sur d’autres sites

ayoros

 

Désolé de ne pas avoir été plus explicite. Il n'y a aucune commande à taper. Le programme crée un réacteur qui va surveiller le dessin en temps réel. Ceci veut dire que lorsque tu utilises DDATTE ou autre commande d'édition, chaque copie sera automatiquement mise à jour. Dans les commentaires, j'écrivais que si des nouveaux blocs sont copiés, il seront surveillés. Si des blocs sont insérés (via Inserer ou un Drag & Drop), il ne seront pas surveillés si ceux-ci servent de référence à la commande DDATTE mais le seront si la référence est un bloc déjà présent au moment du chargement de la routine. Voir les commentaires pour la suite des explications.

 

Pour ce qui est concerne ton besoin, il serait intéressant d'étudier les jeux de feuilles (Sheet Sets) ainsi que les champs (Fields). C'est un sujet trop long pour ce fil mais je t'encourage à regarder les tutoriels.

 

Serge

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Oui serge, en fait je répondais à =>

 

C est simple j ai plusieurs renseignement à rentrer dans mon bloc vue que c'est un cartouche et donc si je dois le modifié en tant que bloc je dois effectuer plusieurs édition de texte pour remplir tout les renseignements

 

En fait j'utilise une feuille EXcel par cartouche mais ne change que les quelques variables,...

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

J ai trouver une solution à mon problème car malgrès vos aides apportés je n'arrivé pas au résultat que je souhaité. Donc je me suis dit que sa peut intérésser d'autre personne dans le même cas. La solution est simple il suffit de prendre le bloc avec les attributs et de recréer un bloc par dessus. Je dois donc encore allez dans l'éditeur de bloc mais avec la fonction ddattte ou attedit ce qui me permet de changer toutes les informations dans le formulaire et que mes attributs se copie dans tous les bloc du même nom.

 

Serge encore merci pour le lisp mais apparemment je dois mal l'utiliser car je n'avais pas le résultat.

 

Merci à tous pour votre aide

 

Ciao

Lien vers le commentaire
Partager sur d’autres sites

Avant de répondre, je voudrais mieux comprendre la question. Si je reformule : Tu disposes de 2 (ou plusieurs) blocs portant le même nom, avec les mêmes définitions d'attribut. Lorsque tu édites l'un (via une boite de dialogue ou sur la ligne de commande), que l'autre se modifie automatiquement. Est-ce bien cela ?

 

As tu essayé les champs?

 

Tu crées des propriétés personnalisées dans ton fichier (menu fichier => propiétés du dessin => onglet personnaliser).

Tu crées ton bloc cartouche et tu inséres pour chaque attribut un champ correspond à l'une des propriétés personnalisées du fichier.

 

Ainsi quand tu veux changer l'une des valeurs des attributs, tu passe par les propriétés personnalisées du fichier et tu changes la valeur. Un coup de REGEN et ton attribut est modifé dans tous blocs.

 

 

HPZ400 Workstation

Intel Xeon W3550 3.07 GHz

6 Go ram

QUADRO FX 1800

Lien vers le commentaire
Partager sur d’autres sites

ayoros

 

Si j'ai bien compris, c'est que tu aurais disons 20 attributs et que les 10 premiers sont communs et les 10 suivants sont distincts. Ta manipulation consiste a créer un bloc de 10 attributs qui est ensuite inclus dans un super bloc qui comporte les 10 autres. Est-ce bien cela ?

 

Serge

Lien vers le commentaire
Partager sur d’autres sites

Non en fait tout mes attributs sont commun au bloc.

 

Par contre fraxa de te remercie grandement la solution marche encore mieux.

 

Je cherche juste un champs qui indique le nom de ma présentation avec ceci le nombre de mes pages sera rempli automatiquement.

 

 

Lien vers le commentaire
Partager sur d’autres sites

Je cherche juste un champs qui indique le nom de ma présentation avec ceci le nombre de mes pages sera rempli automatiquement.

 

Cest toi qui le crées dans les propriétés du dessin, onglet personnaliser. Exemple nom présentation, nombre total de présentation, etc...

 

Ensuite quand tu veux insérer un champ dans ta définition d'attribut, tu choisis la catégorie champ "document" et tu trouveras les champs présentation, nombre total de présentation, etc...

 

HPZ400 Workstation

Intel Xeon W3550 3.07 GHz

6 Go ram

QUADRO FX 1800

Lien vers le commentaire
Partager sur d’autres sites

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é