Avril 2026 · Dépannage avancé · 7 min de lecture

Réparer les blocs dynamiques orphelins *U#### dans AutoCAD

Vos blocs dynamiques affichent soudain *U1234 au lieu de leur vrai nom ? Vous n'arrivez plus à les modifier ? Voici comment ElectroCAD détecte et répare ces blocs orphelins en 5 critères de diagnostic.

Symptôme : "*U1234" partout dans votre dessin

Vous ouvrez un projet sur lequel vous avez travaillé hier. Tout fonctionnait. Et là, dans la palette Propriétés, certains blocs s'appellent *U1234, *U5678, au lieu de DISJONCTEUR_16A ou BOBINE_24V. Ils s'affichent encore correctement (en apparence), mais :

  • Vous ne pouvez plus modifier leurs paramètres dynamiques
  • BEDIT refuse de les ouvrir
  • BREPLACE ne les détecte pas
  • Vos exports BOM affichent "*U1234" au lieu du nom métier

Ce sont des blocs dynamiques orphelins. Ils existent encore physiquement dans le fichier, mais le lien vers leur définition maître (le BTR parent) est cassé.

Pourquoi ça arrive ?

Comprendre les BTR anonymes

Quand vous modifiez un paramètre dynamique d'un bloc (étirer, basculer une visibilité, changer une lookup table), AutoCAD ne crée PAS un nouveau bloc. Il crée un BTR anonyme (Block Table Record) avec un nom de la forme *U1234, qui hérite du bloc maître via une extension dictionary appelée ACAD_ENHANCEDBLOCK.

La référence visible dans votre dessin (BlockReference) pointe vers le BTR anonyme, mais via DynamicBlockTableRecord, vous pouvez retrouver le BTR maître. Tant que ce lien existe, tout fonctionne.

Le lien vers le maître peut se casser dans 5 situations :

  1. Effacement manuel du BTR maître avant un WBLOCK
  2. WblockClone naïf qui ne préserve pas l'ObjectId du maître
  3. Plugin tiers buggy qui purge mal les blocs dynamiques
  4. Corruption de fichier (crash, sauvegarde interrompue)
  5. Import de DWG avec des conflits de noms

ECDIAGBLOCKS — diagnostiquer avant de réparer

Avant de réparer, il faut savoir l'étendue du problème. La commande ECDIAGBLOCKS scanne tous les blocs *U de votre dessin et affiche un rapport :

Command: ECDIAGBLOCKS
══════ DIAGNOSTIC BLOCS *U ══════
  *U123 → master=DISJONCTEUR_16A isDyn=true attrs=[TAG,MARQUE] OK
  *U124 → master=DISJONCTEUR_16A isDyn=true attrs=[TAG,MARQUE] OK
  *U456 → master=? isDyn=false attrs=(aucun) ORPHELIN (lien=self)
  *U457 → master=? isDyn=false attrs=(aucun) ORPHELIN (master effacé)
  *U458 → master=? isDyn=false attrs=(aucun) ORPHELIN (lien=null)
══════ TOTAL: 12 blocs *U | 9 OK | 3 ORPHELINS ══════

Cette commande est en lecture seule : elle ne modifie rien. Vous pouvez la lancer sur n'importe quel fichier sans risque, juste pour savoir si le problème est présent.

Les 5 critères de détection d'un orphelin

ECREPAIRBLOCKS détecte les blocs cassés selon 5 critères techniques précis :

#CritèreSymptômeCause typique
1 lien=self DynamicBlockTableRecord == BlockTableRecord (le bloc se référence lui-même) WblockClone qui a remplacé l'ObjectId par celui du clone
2 lien=null DynamicBlockTableRecord.IsNull == true Suppression complète du maître sans nettoyage
3 master effacé Le BTR maître existe mais IsErased == true Erase() appelé sur le maître alors que des refs existaient encore
4 master anonyme Le maître a un nom commençant par * Corruption en cascade (orphelin pointant vers un autre orphelin)
5 IsDynamicBlock=false Le bloc *U existe mais n'est plus marqué comme dynamique Conversion forcée par un plugin tiers

L'algorithme de réparation

Une fois les orphelins identifiés, ECREPAIRBLOCKS procède en 3 phases :

Phase 1 — Identifier les masters originaux

Pour chaque bloc orphelin, ECREPAIRBLOCKS doit retrouver de quel bloc maître il vient. Quand le lien direct est cassé, deux mécanismes de matching de secours sont utilisés :

  1. Matching par tags d'attributs Récupère les tags des AttributeReferences du bloc orphelin (ex: [TAG, MARQUE, REF]) et cherche dans la bibliothèque ElectroBlocs un bloc maître qui contient au moins 50% des mêmes tags. Si match, c'est probablement le bloc original.
  2. Matching par nombre d'entités Si le matching par tags échoue, compare le nombre d'entités contenues dans le BTR orphelin avec ceux des candidats maîtres. Tolérance : ±2 entités.

Phase 2 — Réimporter les BTR maîtres manquants

Si certains masters n'existent plus du tout dans le fichier, ECREPAIRBLOCKS va les réimporter depuis la source ElectroBlocs_Blocs.dwg :

// Trouver le fichier source
var sourceDwg = PaletteIndex.FindSourceDwg();

// Ouvrir en lecture seule
using (var sourceDb = new Database(false, true))
{
    sourceDb.ReadDwgFile(sourceDwg, FileShare.Read, true, "");

    // Cloner les BTR manquants avec Replace mode
    sourceDb.WblockCloneObjects(
        missingBtrIds,
        targetDb.BlockTableId,
        new IdMapping(),
        DuplicateRecordCloning.Replace,  // ← critique
        false);
}
Pourquoi DuplicateRecordCloning.Replace ?

Le mode Replace est essentiel ici. Il met à jour le BTR in-place en préservant l'ObjectId. Avec Add ou Ignore, on créerait un nouveau BTR avec un nouvel ObjectId, et tous les blocs orphelins continueraient à pointer vers l'ancien (cassé). Replace garantit que les liens existants se réparent automatiquement.

Phase 3 — Réparer chaque bloc

Pour chaque bloc orphelin, l'algorithme dépend du type :

Bloc statique simple (1 transaction) :

  • Crée une nouvelle BlockReference au point du bloc orphelin
  • Copie position, rotation, scale, calque, couleur
  • Recrée les AttributeReference avec les anciennes valeurs
  • Efface l'ancien bloc orphelin

Bloc dynamique (3 transactions séparées — astuce critique) :

  1. Transaction 1 — Insertion à l'origine Insère le bloc neuf au point (0,0,0) avec scale 1:1, sans rotation, sans dynProps. Permet à AutoCAD de créer le BTR anonyme correspondant.
  2. Transaction 2 — Application des dynProps en 2 passes Applique d'abord les propriétés dynamiques de type string (visibilité, lookup), puis les numériques (étirement, rotation). Ce 2-pass workaround contourne un bug historique d'AutoCAD où certaines props numériques ne prennent effet qu'après les strings. Puis applique le scale final.
  3. Transaction 3 — Repositionnement et attributs Déplace le bloc à sa position originale, applique la rotation, et recrée les AttributeReference en lisant les positions depuis le BTR courant (anonyme avec géométrie correcte). Efface enfin l'ancien bloc orphelin.

Pourquoi 3 transactions ? Pour permettre à AutoCAD de finaliser chaque étape proprement avant la suivante. Une seule grosse transaction provoque des erreurs eGraphicsContextCorrupted sur les blocs dynamiques complexes.

Utilisation pratique

Command: ECDIAGBLOCKS    # Diagnostic d'abord
Command: ECREPAIRBLOCKS  # Si des orphelins sont détectés

Le rapport final est affiché dans une boîte de dialogue Windows avec un résumé :

[ECREPAIRBLOCKS] Bloc_01 → DISJONCTEUR_16A OK
[ECREPAIRBLOCKS] Bloc_02 → DISJONCTEUR_16A OK
[ECREPAIRBLOCKS] Bloc_03 → BOBINE_24V OK
[ECREPAIRBLOCKS] Bloc_04 → ?? (matching échoué) IGNORÉ
[ECREPAIRBLOCKS] Terminé: 3 bloc(s) réparé(s), 1 ignoré, 0 erreur(s)
Faites une sauvegarde

ECREPAIRBLOCKS est conçu pour être conservatif (rien n'est supprimé sans certitude), mais comme toute opération de réparation sur des structures internes AutoCAD, faites une copie de votre fichier avant. En cas d'imprévu, vous restaurez en 5 secondes.

Comment éviter les orphelins en premier lieu

La meilleure réparation, c'est celle qu'on n'a pas à faire. Pour éviter les blocs *U#### orphelins :

  • N'effacez jamais manuellement un BTR maître depuis BEDIT ou via un script. Utilisez toujours la purge officielle.
  • Utilisez RPURGE au lieu de PURGE natif sur les fichiers contenant des blocs dynamiques (voir notre article sur les 10 passes de RPURGE).
  • Évitez les plugins tiers de "compression DWG" agressive — ils ignorent souvent les extension dictionaries.
  • Bénéficiez d'EBPUSH/EBRELOAD qui utilisent WblockCloneObjects(Replace) en interne, garantissant la préservation des ObjectId.
  • Sauvegardez régulièrement avec versioning (Git, SVN, ou simplement nom_v01.dwg, nom_v02.dwg).

Conclusion

Les blocs *U#### orphelins sont un cauchemar récurrent dans AutoCAD. Quand ils apparaissent, ils sont impossibles à réparer manuellement — il faudrait recréer chaque bloc à la main.

ECDIAGBLOCKS et ECREPAIRBLOCKS automatisent toute la chaîne : détection sur 5 critères, matching intelligent par attributs, réimport depuis source, réparation en 3 transactions séparées pour les blocs dynamiques. En quelques secondes, un fichier qui paraissait perdu redevient exploitable.


Vos blocs dynamiques sont-ils sains ?

ECDIAGBLOCKS + ECREPAIRBLOCKS sont inclus dans ElectroCAD Tools. Lancez-les sur vos fichiers anciens — vous serez peut-être surpris.

Commencer l'essai gratuit Voir ElectroCAD Tools