mryapados Posté(e) le 29 octobre 2012 Posté(e) le 29 octobre 2012 bonjour Je souhaite supprimer du dessin (pas purger) toutes les références de blocs dont le nom est "LEGENDE". j'applique ce code, mais rien ne se passe : public static void KillLegendes(Database db, Editor ed) { List<BlockAttribute> result = new List<BlockAttribute>(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); foreach (ObjectId id in bt) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead); if (!(btr.IsAProxy || btr.IsFromExternalReference || btr.IsLayout)) { foreach (ObjectId brId in btr.GetBlockReferenceIds(true, false)) { BlockReference br = (BlockReference)brId.GetObject(OpenMode.ForWrite); BlockTableRecord owner = (BlockTableRecord)br.OwnerId.GetObject(OpenMode.ForRead); if (owner.IsLayout) { if (btr.Name.ToLower() == "legende") { br.Erase(true); } } } } } } } Avez-vous une idée ?Merci
Maxence DELANNOY Posté(e) le 29 octobre 2012 Posté(e) le 29 octobre 2012 Un petit tr.Commit(); à la fin, ce serait pas inutile ;) Maxence DELANNOYDéveloppement de compléments aux logiciels Autodesk : AutoCAD, Revit, Inventor, Vault, Navisworks... et autres logiciels de CAOWIIP - http://wiip.fr
bryce Posté(e) le 29 octobre 2012 Posté(e) le 29 octobre 2012 Bonjour, Pas d'idée pour t'aider, désolé...Je me demande juste si pour faire quelque chose d'aussi simple il ne vaudrait pas mieux quelques lignes de Lisp plutôt que toute une tartine en .Net... :P A moins que ce soit une petite partie d'un projet plus ambitieux ? Brice, formateur AutoCAD - Inventor - SolidWorks - ZWCad - DraftSight - SketchUp indépendant
mryapados Posté(e) le 29 octobre 2012 Auteur Posté(e) le 29 octobre 2012 Merci Maxence Il ne manquait que le tr.Commit();
(gile) Posté(e) le 29 octobre 2012 Posté(e) le 29 octobre 2012 Salut, tu fais des choses inutiles dans ton code comme parcourir toute la table des blocs pour retrouver le bloc alors que tu peux y accéder directement. public void EraseBlockRefs(Database db, string blkName) { using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); if (!bt.Has(blkName)) return; BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[blkName], OpenMode.ForRead); foreach (ObjectId id in btr.GetBlockReferenceIds(true, false)) { BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForRead); BlockTableRecord owner = (BlockTableRecord)tr.GetObject(br.OwnerId, OpenMode.ForRead); if (owner.IsLayout) { br.UpgradeOpen(); br.Erase(); } } tr.Commit(); } } Mais on peut aussi passer par un jeu de sélection : public void EraseBlockRefs(Document doc, string blkName) { Database db = doc.Database; Editor ed = doc.Editor; SelectionFilter filter = new SelectionFilter( new TypedValue[] { new TypedValue(0, "INSERT"), new TypedValue(2, blkName) }); PromptSelectionResult psr = ed.SelectAll(filter); if (psr.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { foreach (ObjectId id in psr.Value.GetObjectIds()) { BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForWrite); br.Erase(); } tr.Commit(); } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
mryapados Posté(e) le 31 octobre 2012 Auteur Posté(e) le 31 octobre 2012 Bonjour gileMerci pour ce code plus optimisé.
La Lozère Posté(e) le 1 novembre 2012 Posté(e) le 1 novembre 2012 Salut,Perso, j'y connais pas grand chose en programmation, alors je propose une autre solution.J'utiliserais la commande "filter" avec comme nom de bloc "*LEGENDE*". Cela permet de sélectionner tous les blocs contenant LEGENDE dans leurs noms et de les supprimer.... http://img.imagesia.com/fichiers/34/capture_imagesia-com_34k2_large.JPG Maintenant, il y a un bug, c'est si les blocs se trouvent sur des présentations, là, il faut faire présentations par présentations. Du coup, par la programmation, c'est plus rapide, et le fait d'essayer de programmer est plus instructif de ce point de vue là. A plus. www.cad-is.fr Autocad Map 2021 - Covadis/Autopiste V18.0c Pisser sous la douche ne suffira pas
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