Les 10 passes de RPURGE expliquées une à une
RPURGE n'est pas une simple version "améliorée" de PURGE. C'est un algorithme itératif qui boucle jusqu'à convergence. Voici exactement ce qui se passe sous le capot, passe par passe.
Le principe de l'itération jusqu'à convergence
Le problème de la commande PURGE native d'AutoCAD : elle ne fait qu'une seule passe. Or, supprimer un bloc orphelin libère parfois un calque, qui libère un type de ligne, qui libère un style de cotation… Une seule passe ne capture pas ces dépendances en cascade.
RPURGE résout ça avec une boucle :
int passCount = 0;
int totalPurged = 0;
do {
int purgedThisPass = 0;
purgedThisPass += PurgeBlocks();
purgedThisPass += PurgeLayers();
purgedThisPass += PurgeTextStyles();
purgedThisPass += PurgeDimStyles();
purgedThisPass += PurgeLinetypes();
purgedThisPass += PurgeMLeaderStyles();
purgedThisPass += PurgeTableStyles();
purgedThisPass += PurgeMaterials();
purgedThisPass += PurgeScales();
purgedThisPass += PurgeGroups();
totalPurged += purgedThisPass;
passCount++;
} while (purgedThisPass > 0 && passCount < 10);
La boucle s'arrête dès qu'une passe ne supprime plus rien (purgedThisPass == 0) — c'est la convergence. Le maximum de 10 passes est une protection contre les boucles infinies en cas de bug. En pratique, 2 à 4 passes suffisent toujours.
La séquence des 10 catégories
L'ordre des catégories n'est pas anodin. Il suit la hiérarchie de dépendances AutoCAD :
| # | Catégorie | Ce qui est supprimé | Dépendances libérées |
|---|---|---|---|
| 1 | Blocs | Blocs sans référence | Calques, types de lignes, styles de texte utilisés par le bloc |
| 2 | Calques | Calques vides (aucune entité) | Types de lignes, états de calques, filtres |
| 3 | Styles de texte | Styles non utilisés par TEXT/MTEXT/ATTRIB | Polices SHX/TTF |
| 4 | Styles de cotation | DimStyles non référencés | Styles de texte enfants |
| 5 | Types de ligne | Linetypes non utilisés | Patterns, fichiers .lin liés |
| 6 | Styles de leader multiples | MLeaderStyles non utilisés | Styles de texte enfants |
| 7 | Styles de tableau | TableStyles non utilisés | Styles de texte enfants |
| 8 | Matériaux | Tous, sauf Global, ByLayer, ByBlock | Textures, propriétés rendu |
| 9 | Échelles annotation | Toutes, sauf 1:1 et l'échelle courante | Représentations annotation |
| 10 | Groupes | Groupes nommés vides | — |
Supprimer les blocs en premier libère leurs dépendances internes (calques, styles, linetypes utilisés uniquement à l'intérieur d'un bloc orphelin). À la passe suivante, ces calques deviennent à leur tour purgeables. C'est la cascade.
Le piège #1 : la protection des blocs dynamiques
C'est le point le plus sensible et la principale différence avec le PURGE natif. Les blocs dynamiques d'AutoCAD utilisent un mécanisme d'extension dictionaries appelé ACAD_ENHANCEDBLOCK. Chaque modification d'un paramètre dynamique crée un BTR anonyme (*U1234) qui hérite du bloc maître via cet extension dictionary.
Si on purge naïvement, on casse les liens et on crée des blocs orphelins. RPURGE protège ça avec une whitelist explicite des RegApps à ne JAMAIS supprimer :
private static readonly HashSet<string> ProtectedRegApps = new()
{
"ACAD",
"AcDbDynamicBlockTrueName",
"AcDbDynamicBlockGUID",
"AcDbBlockRepBTag",
"AcDbBlockRepresentationData",
"ACAD_ENHANCEDBLOCK",
"AcDbBlockVisibilityParameter",
"AcDbDynamicBlockProxyGraph",
// ... 12 autres entrées critiques
};
Et dans PurgeBlocks(), plusieurs gardes empêchent la suppression de blocs sensibles :
// NE PAS purger si:
if (btr.IsLayout) continue; // Layout (Model, Layout1...)
if (btr.IsFromExternalReference) continue; // XRef
if (btr.IsAnonymous) continue; // *U#### dynamique
if (btr.Name.StartsWith("*")) continue; // Bloc système
if (btr.IsDynamicBlock) continue; // Bloc dynamique parent
// Et JAMAIS le calque "0"
if (layer.Name == "0") continue;
Le comptage des références doit utiliser directOnly=false (premier paramètre). Avec true, les références qui passent par des BTR anonymes de blocs dynamiques sont ignorées — RPURGE pourrait alors supprimer un bloc encore utilisé. C'est un bug subtil que les premières versions d'ElectroCAD ont eu, désormais corrigé.
Exemple chiffré : un fichier projet réel
Voici un exemple d'exécution sur un fichier de projet bâtiment de 45 Mo qui avait transité par 3 plugins anciens et 2 imports XRef :
Command: RPURGE [RPURGE] Pass 1: 280 objets purgés - Blocs: 47 (anciens symboles plugin disparu) - Calques: 89 (calques fantômes XRef bindées) - Styles texte: 32 (styles importés inutilisés) - Styles cotation: 12 - Linetypes: 18 - MLeaderStyles: 4 - TableStyles: 2 - Materials: 8 - Scales: 65 (échelles annotation accumulées) - Groupes: 3 [RPURGE] Pass 2: 45 objets purgés (dépendances libérées par la passe 1) [RPURGE] Pass 3: 2 objets purgés (dernières dépendances) [RPURGE] Pass 4: 0 objets purgés → STOP [RPURGE] Total: 327 objets en 3 passes [RPURGE] Taille fichier: 45 Mo → 8 Mo (-82%)
Trois passes ont suffi à converger. Le gain de taille final est de 82%.
Pourquoi pas la commande PURGE native ?
Comparons techniquement :
| Critère | RPURGE | PURGE natif |
|---|---|---|
| Itération | Jusqu'à 10 passes | 1 passe |
| Blocs dynamiques | Whitelist 12+ RegApps protégées ✓ | Risque de casse ⚠ |
| Calques fantômes XRef | Détectés et supprimés | Souvent ignorés |
| MLeaderStyles | Oui | Oui |
| Matériaux orphelins | Oui (sauf Global/ByLayer/ByBlock) | Non |
| Échelles annotation | Oui (sauf 1:1 et courante) | Non |
| Groupes vides | Oui | Non |
| Interface | Aucune (auto) | Dialogue avec cases |
| Gain typique | 50 à 85% | 10 à 30% |
Quand utiliser quoi
- Vous voulez nettoyer en profondeur, immédiatement, sans questionner →
RPURGE - Vous voulez choisir précisément ce qui est supprimé →
PURGEnatif (avec dialogue) - Vous préparez une livraison client et voulez choisir options de nettoyage →
CLEANER(dialogue + options) puis RPURGE en fin (lancé automatiquement) - Vous avez des artefacts visibles (zéro-length, wipeouts, doublons) →
CLEANERd'abord, RPURGE après
La protection finale : Layer "0"
Le seul cas où RPURGE ne supprime jamais un calque, même s'il est vide, c'est le calque 0. C'est le calque par défaut d'AutoCAD : si on le supprime, le fichier devient corrompu et impossible à ouvrir. Cette protection est codée en dur, sans option pour la désactiver — par sécurité.
Conclusion
RPURGE n'est pas un "PURGE en mieux", c'est une approche fondamentalement différente : itération jusqu'à convergence, ordre intelligent des catégories, whitelist de protection, gestion explicite des cas critiques (blocs dynamiques, layer 0, XRefs).
Le résultat : un nettoyage en profondeur en une seule commande, sans risque de casser les blocs dynamiques. Utilisez-le sur n'importe quel fichier qui paraît trop lourd — vous serez systématiquement surpris du gain.
RPURGE inclus dans ElectroCAD Tools
Plus de 15 outils de productivité AutoCAD pour les électriciens. Pack Pro dès 49 CHF/mois.
Commencer l'essai gratuit En savoir plus sur RPURGE