DBObjectCollection est un conteneur qui détient des références à des instances réelles de DBObject (pas seulement leurs IDs). Il est typiquement utilisé pour des opérations impliquant des objets non résidents de la base de données (objets créés en mémoire mais pas encore ajoutés à la base de données), tels que Entity.Explode() ou Curve.GetSplitCurves().
Autodesk.AutoCAD.DatabaseServices
| Propriété | Type | Description |
|---|---|---|
Count |
int |
Nombre d'objets dans la collection. |
this[int] |
DBObject |
Indexeur pour obtenir l'objet à l'index. |
| Méthode | Type de Retour | Description |
|---|---|---|
Add(DBObject) |
int |
Ajoute un objet à la collection. |
Clear() |
void |
Vide la collection (ne supprime pas les objets). |
Contains(DBObject) |
bool |
Vérifie si l'objet est dans la liste. |
CopyTo(DBObject[], int) |
void |
Copie vers un tableau. |
Dispose() |
void |
Libère le conteneur de collection. |
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Entity ent = tr.GetObject(entId, OpenMode.ForRead) as Entity;
// Créer une collection spécifique pour les résultats
DBObjectCollection explodedParts = new DBObjectCollection();
// Décomposer dans la collection
ent.Explode(explodedParts);
ed.WriteMessage($"\nDécomposé en {explodedParts.Count} pièces.");
// Ajouter les nouvelles pièces à la base de données
BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
foreach (Entity part in explodedParts)
{
btr.AppendEntity(part);
tr.AddNewlyCreatedDBObject(part, true);
}
tr.Commit();
}Curve curve = ...;
Point3dCollection splitPoints = ...;
DBObjectCollection newCurves = new DBObjectCollection();
// Diviser la courbe aux points
// Les courbes résultantes sont ajoutées à newCurves
curve.GetSplitCurves(splitPoints, newCurves);// Region.CreateFromCurves nécessite une entrée DBObjectCollection
DBObjectCollection curves = new DBObjectCollection();
curves.Add(new Line(new Point3d(0,0,0), new Point3d(10,0,0)));
curves.Add(new Line(new Point3d(10,0,0), new Point3d(10,10,0)));
// (ajouter plus de courbes fermantes)
DBObjectCollection regions = Region.CreateFromCurves(curves);// IMPORTANT : DBObjectCollection est IDisposable
using (DBObjectCollection list = new DBObjectCollection())
{
// remplir liste
// utiliser liste
} // La collection est libérée ici// Les objets dans DBObjectCollection ne sont souvent PAS encore dans la base de données.
// Si vous ne les ajoutez pas à la base de données, vous devez les libérer manuellement !
DBObjectCollection parts = new DBObjectCollection();
someEntity.Explode(parts);
// ... décider de ne pas les utiliser ...
foreach (DBObject obj in parts)
{
obj.Dispose(); // Nettoyage mémoire
}
parts.Dispose(); // Nettoyage conteneur- Gestion de la Mémoire : C'est le piège n°1.
DBObjectCollectionne possède PAS les objets à l'intérieur. Si ces objets ne sont pas physiquement ajoutés à la Database (viaAppendEntity), vous êtes responsable d'appeler.Dispose()sur chaque objet à l'intérieur, OU la mémoire fuit. - Libérer la Collection : La collection elle-même utilise des ressources non gérées, donc utilisez toujours
usingouDispose(). - Utiliser les Types API : N'utilisez pas
List<DBObject>quand une méthode API attendDBObjectCollection- vous devez utiliser le type AutoCAD.
- DBObject - Le type d'élément.
- ObjectIdCollection - Collection de références (poignées).