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 :
- Tap
INSERT - Cliquer "Browse..." dans la dialogue
- Naviguer dans le filesystem jusqu'au DWG du bloc
- Cliquer "Open"
- Définir échelle, rotation
- 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 :
| Mode | Trigger | Comportement |
|---|---|---|
| Browse | Sélection groupe + palette dans les listes latérales | Affiche tous les blocs de la palette sélectionnée en grille |
| Recherche | Saisie de 2+ caractères dans la barre de recherche | Affiche les blocs dont le DesignName ou DisplayName contient la requête (fuzzy) |
| Dessin actuel | Cocher 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.
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)
-
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. -
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. - Créer la BlockReference Position WCS, rotation = jig._rotation + ucsAngle, scale appliquée.
- 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.
- 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.
-
PASS 0 — Appliquer les propriétés string
Itère sur toutes les
DefaultDynPropsdont la valeur est de typestring(visibilité, lookup table, enum). Chaque modification provoque la création/mise à jour du BTR anonyme. -
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. -
Appliquer le scale final + le facteur INSUNITS
scale = userScale × InsunitsToMm(sourceInsunits) / InsunitsToMm(targetInsunits). Conversion automatique cm→mm si nécessaire. -
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. - 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.
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