Aller au contenu

Mise à jour Attributs Blocs


Messages recommandés

Bonjour, Dans un dwg, j'ai un bloc avec uniquement des attributs et je cherche à le redéfinir par un autre bloc, avec que des attributs lui aussi, tout en conservant les valeurs d'attributs en commun...

Est-ce possible en langage C# ?

Merci d'avance.

Phil.

Lien vers le commentaire
Partager sur d’autres sites

En C# je ne sais pas, mais en lisp tu peux copier les valeurs des attributs d'un bloc vers un autre.

Il faut juste vérifier que dans le nouveau bloc, il y ait le même nombre et le même ordre d'attribut.

;;;=================================================================
;;;
;;; CAT.LSP V2.01
;;;
;;; Copier des attributs
;;;
;;; Copyright (C) Patrick_35
;;;
;;;=================================================================

(defun c:CAT(/ att bl doc ent s sel *errcat*)

;=========================================================================
; Gestion des erreurs
;=========================================================================

  (defun *errcat* (msg)
    (or (member (strcase msg) '("FUNCTION CANCELLED" ""QUIT / EXIT ABORT"" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
      (princ (strcat "\nErreur : " msg))
    )
    (vla-endundomark doc)
    (setq *error* s)
    (princ)
  )

  (vl-load-com)
  (setq s *error*
	*error* *errcat*
	doc (vla-get-activedocument (vlax-get-acad-object))
  )
  (vla-startundomark doc)
  (and	(setq ent (entsel "\nSélectionnez le bloc d'origine : "))
	(setq ent (vlax-ename->vla-object (car ent)))
	(eq (vla-get-objectname ent) "AcDbBlockReference")
	(eq (vla-get-hasattributes ent) :vlax-true)
	(princ "\nSélectionnez les blocs destinataires")
	(ssget (list (cons 0 "insert") (cons 66 1)))
    (progn
      (setq att (vlax-invoke ent 'getattributes))
      (vlax-for bl (setq sel (vla-get-activeselectionset doc))
	(mapcar '(lambda(a b)(vla-put-textstring a (vla-get-textstring b))) (vlax-invoke bl 'getattributes) att)
      )
      (princ (strcat "\n" (itoa (vla-get-count sel)) " bloc(s) modifié(s)."))
      (vla-delete sel)
    )
  )
  (vla-endundomark doc)
  (setq *error* s)
  (princ)
)

(setq nom_lisp "CAT")
(if (/= app nil)
  (if (= (strcase (substr app (1+ (- (strlen app) (strlen nom_lisp))) (strlen nom_lisp))) nom_lisp)
    (princ (strcat "..." nom_lisp " chargé."))
    (princ (strcat "\n" nom_lisp ".LSP Chargé.....Tapez " nom_lisp " pour l'éxecuter.")))
  (princ (strcat "\n" nom_lisp ".LSP Chargé......Tapez " nom_lisp " pour l'éxecuter.")))
(setq nom_lisp nil)
(princ)

 

Lien vers le commentaire
Partager sur d’autres sites

Il y a 4 heures, PhilBat a dit :

Bonjour, Dans un dwg, j'ai un bloc avec uniquement des attributs et je cherche à le redéfinir par un autre bloc, avec que des attributs lui aussi, tout en conservant les valeurs d'attributs en commun...

Salut,

Pourrais-tu élaborer un petit peu ta demande, je ne comprends pas ce que tu entends par : "redéfinir par un autre bloc". S'agit-il de redéfinir une définition de bloc (BlockTableRecord) ou de mettre à jour une référence de bloc (BlockReference), ou les deux ?
Un petit exemple serait le bienvenu.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Tu devrais pouvoir t'inspirer de ça :

        [CommandMethod("PHILBAT")]
        public static void PhilBat()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            using (var tr = db.TransactionManager.StartTransaction())
            {
                var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                if (bt.Has("-Depart01") && bt.Has("-Depart01v3"))
                {
                    var source = (BlockTableRecord)tr.GetObject(bt["-Depart01v3"], OpenMode.ForRead);
                    var sourceAtts = new List<AttributeDefinition>();
                    foreach (ObjectId id in source)
                    {
                        if (id.ObjectClass.DxfName == "ATTDEF")
                        {
                            sourceAtts.Add((AttributeDefinition)tr.GetObject(id, OpenMode.ForRead));
                        }
                    }
                    var target = (BlockTableRecord)tr.GetObject(bt["-Depart01"], OpenMode.ForRead);
                    var attValues = new Dictionary<string, string>(); 
                    foreach (ObjectId brId in target.GetBlockReferenceIds(true, false))
                    {
                        var br = (BlockReference)tr.GetObject(brId, OpenMode.ForWrite);
                        foreach (ObjectId attId in br.AttributeCollection)
                        {
                            var attRef = (AttributeReference)tr.GetObject(attId, OpenMode.ForWrite);
                            attValues[attRef.Tag] = attRef.TextString;
                            attRef.Erase();
                        }
                        br.BlockTableRecord = bt["-Depart01v3"];
                        foreach (var attDef in sourceAtts)
                        {
                            var attRef = new AttributeReference();
                            attRef.SetAttributeFromBlock(attDef, br.BlockTransform);
                            if (attValues.ContainsKey(attDef.Tag.ToUpper()))
                            {
                                attRef.TextString = attValues[attDef.Tag.ToUpper()];
                            }
                            ObjectId id = br.AttributeCollection.AppendAttribute(attRef);
                            tr.AddNewlyCreatedDBObject(attRef, true);
                        }
                    }
                }
                tr.Commit();
            }
        }

 

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Partager

×
×
  • Créer...