SymbolTable est la classe de base abstraite pour toutes les tables de symboles dans la base de données AutoCAD, telles que BlockTable, LayerTable, LinetypeTable, etc. Elle agit comme un dictionnaire spécialisé qui mappe des noms de chaînes (clés) aux ObjectIds des SymbolTableRecords.
Autodesk.AutoCAD.DatabaseServices
System.Object
└─ RXObject
└─ DBObject
└─ SymbolTable
├─ BlockTable
├─ LayerTable
├─ LinetypeTable
├─ TextStyleTable
├─ DimStyleTable
├─ RegAppTable
├─ UcsTable
├─ ViewTable
└─ ViewportTable
| Propriété | Type | Description |
|---|---|---|
this[string] |
ObjectId |
Indexeur pour obtenir l'ID d'enregistrement par nom. |
Count |
int |
Nombre d'enregistrements dans la table. |
| Méthode | Type de Retour | Description |
|---|---|---|
Has(string) |
bool |
Vérifie si un enregistrement avec le nom donné existe. |
Has(ObjectId) |
bool |
Vérifie si un enregistrement avec l'ID donné existe dans cette table. |
Add(SymbolTableRecord) |
ObjectId |
Ajoute un nouvel enregistrement à la table. |
GetEnumerator() |
SymbolTableEnumerator |
Retourne un énumérateur pour les ObjectIds. |
using (Transaction tr = db.TransactionManager.StartTransaction())
{
// Ouvrir une table dérivée (ex : LayerTable) comme SymbolTable
SymbolTable table = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as SymbolTable;
if (table.Has("MyLayer"))
{
// Le calque existe
}
tr.Commit();
}using (Transaction tr = db.TransactionManager.StartTransaction())
{
// 1. Ouvrir la Table pour Écriture
SymbolTable table = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as SymbolTable;
// 2. Créer l'Enregistrement (Type dérivé)
LayerTableRecord newRec = new LayerTableRecord();
newRec.Name = "NewLayer";
// 3. Ajouter à la Table
// Add() retourne le nouvel ObjectId
ObjectId newId = table.Add(newRec);
// 4. Ajouter à la Transaction
tr.AddNewlyCreatedDBObject(newRec, true);
tr.Commit();
}using (Transaction tr = db.TransactionManager.StartTransaction())
{
SymbolTable table = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as SymbolTable;
// Énumérer les ObjectIds
foreach (ObjectId id in table)
{
// Ouvrir chaque enregistrement
SymbolTableRecord rec = tr.GetObject(id, OpenMode.ForRead) as SymbolTableRecord;
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"\nTrouvé : {rec.Name}");
}
tr.Commit();
}ObjectId id = table["MyLayer"];
// Note : Lance KeyNotFoundException si "MyLayer" n'existe pas.
// Utilisez Has() d'abord si vous n'êtes pas sûr.// Les clés de table de symboles sont généralement insensibles à la casse dans AutoCAD
if (table.Has("mylayer") && table.Has("MYLAYER"))
{
// Ceux-ci réfèrent au même enregistrement
}// SymbolTable n'a PAS de méthode Remove() directement.
// Vous devez ouvrir l'Enregistrement lui-même et appeler Erase().
using (Transaction tr = db.TransactionManager.StartTransaction())
{
SymbolTable table = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as SymbolTable;
if (table.Has("LayerToDelete"))
{
ObjectId id = table["LayerToDelete"];
DBObject rec = tr.GetObject(id, OpenMode.ForWrite);
rec.Erase(); // Cela le supprime de la table
}
tr.Commit();
}// Puisque SymbolTable implémente IEnumerable, utilisez Cast<ObjectId>()
var allIds = table.Cast<ObjectId>().ToList();// Tout enregistrement ajouté à cette table aura cette table comme OwnerID
if (record.OwnerId == table.ObjectId)
{
// L'enregistrement appartient à cette table
}- Toujours utiliser des Transactions : Utilisez
AddNewlyCreatedDBObjectimmédiatement aprèstable.Add(). - Vérifier
Has(): Les vérifications sont peu coûteuses ; les exceptions des indexeurs invalides sont coûteuses. - Erase vs Remove : Rappelez-vous qu'il n'y a pas de méthode
Remove()sur la table. VousErase()l'enregistrement. - Utilisation de la Classe de Base : Utilisez la référence
SymbolTablelors de l'écriture de code générique qui gère n'importe quelle table (Calques, Types de Ligne, etc.) de manière identique.
- SymbolTableRecord - Les éléments contenus dans la table.
- BlockTable - Implémentation spécifique.
- LayerTable - Implémentation spécifique.