Memory and Speed by draw Pyramid

#3
I made a little test program, so you can see what happen.
Only if I close drawing reduce memory.

//----------------------------------------------------
[CommandMethod("pyr100")]
public static void Pyr100() { AcadFunc.DrawTestPyramid(100); }
//----------------------------------------------------
[CommandMethod("pyr50")]
public static void Pyr50() { AcadFunc.DrawTestPyramid(50); }
//----------------------------------------------------
[CommandMethod("delety")]
public static void DelAllEtys() { AcadFunc.DelAllEtyOnModelSpace(); }
//----------------------------------------------------

internal static ObjectIdCollection DrawTestPyramid(int NuOfLevels)
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
Editor AcEd = acDoc.Editor;
ObjectIdCollection ObjIdColl = new ObjectIdCollection();
double MvX = 0, MvY = 0, MvZ = 0, Mv0 = 0; int NuOfSolid = 0;
//-----------------------------------------------------------
acCurDb.DisableUndoRecording(true);
AcEd.WriteMessage("START TIME : " + DateTime.Now.ToString("HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo) + "\n");
using (DocumentLock AcDocLock = acDoc.LockDocument())
{
using (Transaction AcTrans = acCurDb.TransactionManager.StartTransaction())
{
using (BlockTableRecord AcBlkTblRec = AcTrans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(acCurDb), OpenMode.ForWrite) as BlockTableRecord)
{
for (int NuOnLevel = NuOfLevels; NuOnLevel > 0; NuOnLevel--)
{
Mv0 = (NuOfLevels - NuOnLevel) * 150; MvY = Mv0;
for (int i = 0; i < NuOnLevel; i++)
{
MvX = Mv0;
for (int j = 0; j < NuOnLevel; j++)
{
using (Solid3d AcSolid3d = GetSolid3dBox(AcEd, 100, 100, 100))
{
AcSolid3d.TransformBy(Matrix3d.Displacement(new Vector3d(MvX, MvY, MvZ)));
ObjIdColl.Add(DrawSolid3d(AcSolid3d, AcEd, AcTrans, AcBlkTblRec));
}
MvX = MvX + 300; NuOfSolid++;
}
MvY = MvY + 300;
}
MvZ = MvZ + 300;
}
}
AcTrans.Commit(); ObjIdColl.Clear(); ObjIdColl.Dispose();
}
}
//-----------------------------------------------------------
AcEd.WriteMessage("END TIME : " + DateTime.Now.ToString("HH:mm:ss", System.Globalization.DateTimeFormatInfo.InvariantInfo) + "\n");
AcEd.WriteMessage("NU OF SOLIDS : " + NuOfSolid.ToString());
return ObjIdColl;
}
//-------------------------------------------------------------------
internal static Solid3d GetSolid3dBox(Editor AcEd, double DimX, double DimY, double DimZ)
{
//------------------------------------------
Solid3d AcSolid3d = new Solid3d();
AcSolid3d.SetDatabaseDefaults();
try
{
AcSolid3d.CreateBox(DimX, DimY, DimZ);
}
//------------------------------------------
catch (System.Exception ex)
{
AcEd.WriteMessage(ex.TargetSite.ReflectedType.FullName + " : " + ex.Message + "\n");
AcEd.WriteMessage(" X: " + DimX.ToString() + " Y: " + DimY.ToString() + " Z: " + DimZ.ToString() + "\n");
}
return AcSolid3d;
}
//-------------------------------------------------------------------
internal static ObjectId DrawSolid3d(Solid3d Box, Editor AcEd, Transaction AcTrans, BlockTableRecord BlkTblRec)
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
ObjectId EtyObjId = ObjectId.Null;
//------------------------------------------
using (Box)
{
try
{
EtyObjId = BlkTblRec.AppendEntity(Box);
AcTrans.AddNewlyCreatedDBObject(Box, true);
}
//------------------------------------------
catch (System.Exception ex) { AcEd.WriteMessage(ex.TargetSite.ReflectedType.FullName + " : " + ex.Message); }
}
return EtyObjId;
}
//-------------------------------------------------------------------
internal static void DelAllEtyOnModelSpace()
{
Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
acCurDb.DisableUndoRecording(true);
//----------------------------------------------------------------------------------
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
using (BlockTableRecord BlckTabRec = acTrans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(acCurDb), OpenMode.ForRead) as BlockTableRecord)
{
foreach (ObjectId ObjId in BlckTabRec)
{
using (Entity Ety = acTrans.GetObject(ObjId, OpenMode.ForWrite) as Entity)
{
if (Ety != null) Ety.Erase(true);
}
}
}
acTrans.Commit();
}
//----------------------------------------------------------------------------------
// GC.Collect(); nothing happened
}
//---------------------------------------------------------------------------------