.NET
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Erase last object

13 REPLIES 13
Reply
Message 1 of 14
vince1327
1384 Views, 13 Replies

Erase last object

Hey everyone, In AutoCAD, i can type "erase" and then "last" into the commandline and it will automatically select and erase the last object i created. How is this accomplished in C#? I'm generating a polyline to automatically calculate areas, but i would like that polyline to vanish once the area has been measured. Thanks Vince
13 REPLIES 13
Message 2 of 14
hgasty1001
in reply to: vince1327

Hi,

 

There is a SelectLast option:

PromptSelectionResult acSSPrompt;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
acSSPrompt = ed.SelectLast();

 

Gaston Nunez

Message 3 of 14
vince1327
in reply to: hgasty1001

Ok that helps, what would i use to delete what i selected with the editor?

 

Thanks

Vince

Message 4 of 14
hgasty1001
in reply to: vince1327

Hi,

 

You should start a transaction, get the last object (as entity)  erase it (entity.erase), and commit the transaction and that's it. Like this (not tested, and translated from VB)

 

[CommandMethod("ELAST")]
public void EraseObj()
{
	Document acDoc = Application.DocumentManager.MdiActiveDocument;
	Database acCurDb = acDoc.Database;
	Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

	using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) {
		PromptSelectionResult acSSPrompt;
		acSSPrompt = ed.SelectLast;
		Entity ent;
		SelectionSet ss = acSSPrompt.Value;

		if (ss.Count > 0) {
			ent = acTrans.GetObject(ss.Item(0).ObjectId, OpenMode.ForWrite);
			ent.Erase();
		}
		acTrans.Commit();
	}
}

 

Gaston Nunez

 

Message 5 of 14
jeff
in reply to: hgasty1001

I have not used it and of course 'not supported' but maybe you can search for

 

Autodesk.AutoCAD.Internal.Utils.EntLast();

 

and see if people have had success

You can also find your answers @ TheSwamp
Message 6 of 14
vince1327
in reply to: hgasty1001

Thanks for this sample, i'm having an issue with the line:

 

 ent = acTrans.GetObject(ss.(0).ObjectId, OpenMode.ForWrite);

.

Visual Studio 2010 and AutoCAD 2012 are telling me that there is no definition for ss.item and thus i cannot compile. As i missing  a reference?

 

Thanks

Vince

 

 

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Colors;

Message 7 of 14
vince1327
in reply to: jeff

Thanks jeff, i'll have a look into this as well.

Cheers

Vince

Message 8 of 14
hgasty1001
in reply to: vince1327

Hi,

 

SelectionSet  it's part of the EditorInput, and I see you are "using" it, so I have no idea why VS is telling you that. Any way the correct sintax is : ss(index).ObjectId without a dot after ss.

 

Gaston Nunez

Message 9 of 14
vince1327
in reply to: hgasty1001

Ok, so i've got this now:

 

using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
PromptSelectionResult acSSPrompt;
acSSPrompt = ed.SelectLast();
Entity ent;
SelectionSet ss = acSSPrompt.Value;

if (ss.Count > 0)
{
ent = acTrans.GetObject(ss(0).ObjectId, OpenMode.ForWrite);
ent.Erase();
}
acTrans.Commit();
}
}
}
}

 

 

But the error I have is 'ss' is a 'variable' but is used like a 'method'

Message 10 of 14
hgasty1001
in reply to: vince1327

Hi,

 

My mistake (i'm a vb guy), just change ss(0) by ss[0].

 

Gaston Nunez

 

 

Message 11 of 14
vince1327
in reply to: hgasty1001

Haha didn't even notice that. Now when i change it to ss[0], i get 

 

Error 1 Cannot implicitly convert type 'Autodesk.AutoCAD.DatabaseServices.DBObject' to 'Autodesk.AutoCAD.DatabaseServices.Entity'. An explicit conversion exists (are you missing a cast?) C:\Users\user\Dropbox\Programming\Cad\Cad\TheProgram\Drawing Commands\Copy of AREA.cs 28 27 Commands

 

 

if (ss.Count > 0)
{
ent = acTrans.GetObject(ss[0].ObjectId, OpenMode.ForWrite);
ent.Erase();
}
acTrans.Commit();

Message 12 of 14
vince1327
in reply to: vince1327

Scratch that, fixed it 😉

 

public void EraseObj()
{
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;

using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
PromptSelectionResult acSSPrompt;
acSSPrompt = ed.SelectLast();
Entity ent;
SelectionSet ss = acSSPrompt.Value;

if (ss.Count > 0)
{
ent = acTrans.GetObject(ss[0].ObjectId, OpenMode.ForWrite) as Entity;
ent.Erase();
}
acTrans.Commit();
}
}
}
}

 

Thanks a million for your help!

 

Message 13 of 14
hgasty1001
in reply to: vince1327

Hi,

 

Glad to help you, sorry the mistake, i feel much comfortable with vb 'cause I'd like to see "End this", "End That"... instead of a lot of brackets at the end of a block of code.

 

Gaston Nunez

Message 14 of 14
vince1327
in reply to: hgasty1001

No worries, thanks again!

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk DevCon in Munich May 28-29th


Autodesk Design & Make Report

”Boost