La structure ObjectId est l'identifiant robuste et persistant pour tout DBObject résidant dans une base de données AutoCAD. Contrairement à un pointeur mémoire, un ObjectId reste valide à travers les transactions et la réallocation de mémoire. C'est le handle principal utilisé pour récupérer des objets depuis le TransactionManager.
Autodesk.AutoCAD.DatabaseServices
| Propriété | Type | Description |
|---|---|---|
IsNull |
bool |
Vrai si l'ID n'est pas valide/nul. |
IsValid |
bool |
Vrai si l'ID pointe vers un objet valide. |
IsErased |
bool |
Vrai si l'objet cible est effacé. |
ObjectClass |
RXClass |
Le type de classe d'exécution de l'objet cible. |
Database |
Database |
La base de données possédant cet objet. |
Handle |
Handle |
Le handle persistant de l'objet cible. |
OriginalDatabase |
Database |
La base de données d'où l'objet provient (pour les XRefs). |
| Méthode | Type de Retour | Description |
|---|---|---|
GetObject(OpenMode) |
DBObject |
Obsolète. Utilisez Transaction.GetObject à la place. |
Equals(object) |
bool |
Vérifie l'égalité avec un autre ObjectId. |
GetHashCode() |
int |
Retourne le code de hachage pour les clés de dictionnaire. |
ToString() |
string |
Retourne la représentation sous forme de chaîne. |
public void CheckId(ObjectId id)
{
if (id.IsNull)
{
// Gérer le cas d'ID nul
return;
}
// Continuer avec ID valide
}public void CheckType(ObjectId id)
{
// Vérifier le type sans ouvrir l'objet (RAPIDE)
if (id.ObjectClass.IsDerivedFrom(RXObject.GetClass(typeof(Curve))))
{
// C'est une courbe (Ligne, Arc, Polyligne, etc.)
}
}using (Transaction tr = db.TransactionManager.StartTransaction())
{
// Meilleure Pratique : Toujours utiliser Transaction.GetObject
Entity ent = tr.GetObject(objectId, OpenMode.ForRead) as Entity;
if (ent != null)
{
// Travailler avec l'entité
}
tr.Commit();
}public bool IsSameObject(ObjectId id1, ObjectId id2)
{
// Opérateur de comparaison directe
return id1 == id2;
}public void ValidateId(ObjectId id)
{
if (!id.IsValid)
{
// L'ID peut provenir d'une base de données supprimée ou être invalide
throw new ArgumentException("ObjectId Invalide");
}
if (id.IsErased)
{
// L'objet existe mais est supprimé (soft-deleted)
// Vous pouvez toujours l'ouvrir avec OpenMode.ForRead si nécessaire, mais généralement on ignore.
}
}public void LogHandle(ObjectId id)
{
// Le Handle est l'identifiant chaîne persistant (ex : "5A")
Handle h = id.Handle;
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"\nHandle : {h}");
}// ObjectId implémente GetHashCode et Equals correctement
Dictionary<ObjectId, string> objectTags = new Dictionary<ObjectId, string>();
objectTags[id1] = "Inspecté";
if (objectTags.ContainsKey(id1))
{
// Trouvé
}public void CheckXRef(ObjectId id)
{
if (id.Database != id.OriginalDatabase)
{
// L'objet provient probablement d'une XRef
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nObjet XRef Détecté");
}
}- Ne jamais utiliser
Handlepour la logique d'exécution : UtilisezObjectIdquand c'est possible car c'est plus rapide. UtilisezHandleuniquement pour la persistance entre les sessions. - Éviter
Open(): N'utilisez pasObjectId.Open(). Utilisez toujoursTransaction.GetObject(). - Vérifier
IsNull: Vérifiez toujoursObjectId.Nullavant de passer des IDs. - Utiliser
ObjectClass: Vérifiez le type d'objet viaid.ObjectClasspour éviter d'ouvrir des objets juste pour vérifier leur type.