Avril 2026 · Productivité & technique · 8 min de lecture

Comment fonctionne la palette de recherche de blocs EBFIND

EBFIND est la fonctionnalité qui justifie à elle seule l'abonnement ElectroBlocs. Sous le capot : recherche fuzzy en temps réel avec debouncing 200 ms, insertion en 2 modes, et application des propriétés dynamiques en 2 passes pour contourner un bug historique d'AutoCAD.

Le problème qu'EBFIND résout

Insérer un symbole électrique dans AutoCAD est une opération qu'un dessinateur effectue 200 à 500 fois par jour. La méthode native :

  1. Tap INSERT
  2. Cliquer "Browse..." dans la dialogue
  3. Naviguer dans le filesystem jusqu'au DWG du bloc
  4. Cliquer "Open"
  5. Définir échelle, rotation
  6. Cliquer le point d'insertion

Soit ~15 secondes par insertion. Multiplié par 200 : 50 minutes par jour gaspillées en navigation.

EBFIND ramène ça à 2 secondes par insertion : tape un mot, clic sur la miniature, clic dans le dessin. −40 minutes par jour.

Architecture de la palette

EBFIND est une fenêtre WPF modeless intégrée à AutoCAD via AcApp.ShowModelessWindow(). Elle reste ouverte en permanence à côté du dessin, sans bloquer l'utilisation d'AutoCAD.

Trois modes de navigation coexistent dans la même palette :

ModeTriggerComportement
BrowseSélection groupe + palette dans les listes latéralesAffiche tous les blocs de la palette sélectionnée en grille
RechercheSaisie de 2+ caractères dans la barre de rechercheAffiche les blocs dont le DesignName ou DisplayName contient la requête (fuzzy)
Dessin actuelCocher la case "Dessin actuel"Affiche uniquement les blocs déjà présents dans le model space

La recherche fuzzy avec debouncing 200 ms

Quand vous tapez dans la barre de recherche, EBFIND ne lance pas une requête à chaque touche pressée — ce serait coûteux et créerait du flicker. À la place, il utilise un DispatcherTimer avec un debounce de 200 ms :

private DispatcherTimer _searchDebouncer;

void OnSearchTextChanged(string newText)
{
    _searchDebouncer.Stop();
    _searchDebouncer.Interval = TimeSpan.FromMilliseconds(200);
    _searchDebouncer.Tick += (s, e) =>
    {
        _searchDebouncer.Stop();
        ExecuteSearch(newText);
    };
    _searchDebouncer.Start();
}

Effet pratique : si vous tapez "disjoncteur" en 800 ms, la recherche ne s'exécute qu'une seule fois (200 ms après le dernier "r"), pas 11 fois. La palette reste fluide.

L'algorithme de matching

Pour chaque bloc, EBFIND construit une chaîne SearchText = DesignName + " " + DisplayName en majuscules. La recherche est ensuite un simple Contains(query.ToUpper()). C'est case-insensitive, ça matche au milieu d'un mot, et c'est instantané sur 500 blocs.

Taper "rec16" trouve "REC16A", "REC16B", "REC16C". Taper "16A" trouve tous les composants 16A, peu importe leur famille. Taper "bobine" trouve toutes les bobines de relais et contacteurs.

Les deux workflows d'insertion

Cliquer sur une miniature dans la palette déclenche l'insertion. Mais le code interne diffère selon que le bloc a ou non des propriétés dynamiques :

Workflow 1 — Bloc statique (simple)

  1. Lancer le jig de drag ed.Drag(jig) capture activement le mouvement de la souris. Le bloc suit le curseur en temps réel jusqu'au clic.
  2. Convertir UCS → WCS Le point retourné par le jig est en coordonnées World (WCS). Le système calcule également l'angle UCS courant via Math.Atan2(xAxis.Y, xAxis.X) pour l'ajouter à la rotation.
  3. Créer la BlockReference Position WCS, rotation = jig._rotation + ucsAngle, scale appliquée.
  4. Créer les attributs Pour chaque AttributeDefinition du BTR, créer une AttributeReference correspondante avec la position transformée par la matrice du bloc.

Workflow 2 — Bloc dynamique (2 passes critiques)

C'est ici que ça devient subtil. Les blocs dynamiques exigent un traitement spécial à cause d'un bug historique d'AutoCAD : certaines propriétés numériques ne prennent effet qu'APRÈS les propriétés string.

  1. Insérer à l'origine Le bloc est inséré au point (0,0,0) avec scale 1:1 et sans rotation. Cette étape "pré-construit" le BTR anonyme dans la base de données.
  2. PASS 0 — Appliquer les propriétés string Itère sur toutes les DefaultDynProps dont la valeur est de type string (visibilité, lookup table, enum). Chaque modification provoque la création/mise à jour du BTR anonyme.
  3. PASS 1 — Appliquer les propriétés numériques Itère sur les propriétés double, int, short (étirement, rotation paramètre, scale paramètre). À ce stade, le BTR a la bonne géométrie de base, donc les modifications numériques s'appliquent correctement.
  4. Appliquer le scale final + le facteur INSUNITS scale = userScale × InsunitsToMm(sourceInsunits) / InsunitsToMm(targetInsunits). Conversion automatique cm→mm si nécessaire.
  5. Lancer le jig de repositionnement ed.Drag(jig) sur le bloc maintenant équipé de ses propriétés dynamiques. L'utilisateur clique pour le placer.
  6. Créer les attributs depuis le BTR courant Critique : on lit les positions des AttributeDefinition depuis le BTR anonyme (avec géométrie correcte), pas depuis le BTR maître. Sinon les attributs apparaissent à la mauvaise place.
Pourquoi 2 passes ?

Si vous appliquez une propriété numérique avant certaines string, elle est silencieusement ignorée par AutoCAD. Le bug existe depuis AutoCAD 2014 au moins. Le 2-pass garantit que les strings s'appliquent en premier (changeant la géométrie de base), puis les numériques (étirant cette nouvelle géométrie). Sans ce contournement, 30% des blocs dynamiques s'inséreraient avec leurs valeurs par défaut, pas celles voulues par l'utilisateur.

La rotation avec Ctrl pendant le jig

Pendant le drag de l'utilisateur, presser Ctrl fait pivoter le bloc de 90°. Pas de menu, pas de question — juste Ctrl.

Implémentation : un Timer parallèle au jig polle GetAsyncKeyState(VK_CONTROL) toutes les 10 ms et détecte les transitions "press → release". À chaque transition complète, un compteur atomique est incrémenté. Le sampler du jig, sur un autre thread, applique les rotations restantes :

private System.Threading.Timer _keyTimer;
private int _rotationCount;
private int _appliedCount;

protected override SamplerStatus Sampler(JigPrompts prompts)
{
    while (_appliedCount < _rotationCount)
    {
        _rotation += Math.PI / 2;
        _appliedCount++;
    }
    // ... reste du sampler
}

Le pattern Interlocked + Timer permet de gérer le cas où le jig n'appelle pas Sampler() pendant 30 ms (latence Windows). Le compteur s'accumule, et la prochaine fois Sampler() rattrape les rotations en attente.

Sauvegarde et restauration du calque courant

EBFIND insère ses blocs sur des calques métier spécifiques (ECL, CFO, etc.) plutôt que sur le calque courant de l'utilisateur. Pour ne pas changer le calque utilisateur de manière permanente :

// Sauvegarder le calque courant avant insertion
ObjectId _savedLayer = db.Clayer;

try
{
    // Activer le calque cible
    db.Clayer = layerTable[block.LayerName];

    // Insertion avec jig
    InsertBlockWithJig(block, ...);
}
finally
{
    // Restaurer toujours, même en cas d'Échap utilisateur
    db.Clayer = _savedLayer;
}

Le bloc finit sur le bon calque métier, mais le calque courant retourne à ce qu'il était avant. L'utilisateur n'a rien à gérer manuellement.

Génération de miniatures à la volée

Les 500+ miniatures de la palette ne sont pas pré-calculées dans des fichiers PNG. Elles sont générées à la volée au premier affichage de chaque bloc, puis cachées en mémoire pour les affichages suivants.

Méthode utilisée : ouvrir la base de données source en lecture seule, créer une Database temporaire, importer le BTR, et utiliser BlockReference.GeometricExtents pour calculer le cadre, puis rasteriser via une fonction interne d'AutoCAD.

Avantages :

  • Aucun fichier à maintenir/synchroniser quand un bloc est mis à jour
  • Les miniatures sont toujours à jour
  • Le cache mémoire évite les recalculs inutiles
  • Le cache est invalidé automatiquement quand la source change (via InvalidateThumbnailsAndRefresh)

Le mode continu

Cocher la case "Mode continu" change le comportement après insertion : au lieu de désactiver le jig, il se relance automatiquement sur le même bloc. L'utilisateur peut placer 50 prises de courant en cliquant 50 fois — sans jamais retourner à la palette.

Échap arrête le mode continu et restaure le calque original.

Conclusion

EBFIND paraît simple côté utilisateur — une palette de recherche, on tape, on clique, c'est inséré. Mais sous le capot, c'est une mécanique précise qui résout :

  • Performance UI : debouncing 200 ms, miniatures cachées
  • Bug AutoCAD : 2 passes pour propriétés dynamiques
  • UCS/WCS : conversion automatique avec angle UCS
  • Ergonomie : rotation Ctrl polling 10 ms thread-safe
  • Cohérence calques : sauvegarde/restauration automatique
  • Conversion d'unités : INSUNITS auto cm↔mm

Le résultat : des centaines d'insertions par jour qui prennent 2 secondes au lieu de 15. Sur un projet de plan de bureau, ça représente une journée entière de gain.


EBFIND + 500 symboles IEC 60617 = ElectroBlocs

Pack Pro dès 49 CHF/mois (ElectroBlocs + ElectroCAD Tools). Essai gratuit 30 jours.

Commencer l'essai gratuit En savoir plus sur EBFIND