Avril 2026 · Algorithme · 6 min de lecture

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égorieCe qui est suppriméDépendances libérées
1BlocsBlocs sans référenceCalques, types de lignes, styles de texte utilisés par le bloc
2CalquesCalques vides (aucune entité)Types de lignes, états de calques, filtres
3Styles de texteStyles non utilisés par TEXT/MTEXT/ATTRIBPolices SHX/TTF
4Styles de cotationDimStyles non référencésStyles de texte enfants
5Types de ligneLinetypes non utilisésPatterns, fichiers .lin liés
6Styles de leader multiplesMLeaderStyles non utilisésStyles de texte enfants
7Styles de tableauTableStyles non utilisésStyles de texte enfants
8MatériauxTous, sauf Global, ByLayer, ByBlockTextures, propriétés rendu
9Échelles annotationToutes, sauf 1:1 et l'échelle couranteReprésentations annotation
10GroupesGroupes nommés vides
Pourquoi cet ordre exact ?

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;
GetBlockReferenceIds(false, false)

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èreRPURGEPURGE natif
ItérationJusqu'à 10 passes1 passe
Blocs dynamiquesWhitelist 12+ RegApps protégées ✓Risque de casse ⚠
Calques fantômes XRefDétectés et supprimésSouvent ignorés
MLeaderStylesOuiOui
Matériaux orphelinsOui (sauf Global/ByLayer/ByBlock)Non
Échelles annotationOui (sauf 1:1 et courante)Non
Groupes videsOuiNon
InterfaceAucune (auto)Dialogue avec cases
Gain typique50 à 85%10 à 30%

Quand utiliser quoi

Décision rapide
  • Vous voulez nettoyer en profondeur, immédiatement, sans questionnerRPURGE
  • Vous voulez choisir précisément ce qui est suppriméPURGE natif (avec dialogue)
  • Vous préparez une livraison client et voulez choisir options de nettoyageCLEANER (dialogue + options) puis RPURGE en fin (lancé automatiquement)
  • Vous avez des artefacts visibles (zéro-length, wipeouts, doublons)CLEANER d'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