PhilBat Posté(e) le 6 août 2021 Posté(e) le 6 août 2021 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.
JPhil Posté(e) le 6 août 2021 Posté(e) le 6 août 2021 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)
(gile) Posté(e) le 6 août 2021 Posté(e) le 6 août 2021 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 - GitHub Développements sur mesure pour AutoCAD
PhilBat Posté(e) le 6 août 2021 Auteur Posté(e) le 6 août 2021 Bonjour, pour moi c'est la définition je pense , le 1er bloc est '-Depart01.dwg' et je veux le remplacer par '-Depart01v3.dwg' tout en conservant certaines valeurs des attributs portants le même nom bien sûr. Bonne fin de journée. Phil -Depart01.dwg -Depart01v3.dwg
CRL Posté(e) le 6 août 2021 Posté(e) le 6 août 2021 Pourquoi pas simplement la commande BLOCKREPLACE (Express Tool) ? https://knowledge.autodesk.com/fr/support/autocad/learn-explore/caas/screencast/Main/Details/83633406-815b-47b1-a2e2-d4ba5f2e165b.html
(gile) Posté(e) le 6 août 2021 Posté(e) le 6 août 2021 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 - GitHub Développements sur mesure pour AutoCAD
PhilBat Posté(e) le 1 septembre 2021 Auteur Posté(e) le 1 septembre 2021 Bonjour, un grand merci pour vos réponses, je n'ai pas encore testé pour cause de vacances 😎. Je vous tiens au courant dès que possible. Salutations. Phil.
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