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

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é