Here's a little sample
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace BlockJigTest
{
class BlockJig : EntityJig
{
BlockReference m_blkRef;
Point3d m_insPt;
public BlockJig(BlockReference br) : base(br)
{
m_insPt = br.Position;
m_blkRef = br;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
JigPromptPointOptions jigOpts = new JigPromptPointOptions();
jigOpts.UserInputControls =
(UserInputControls.Accept3dCoordinates | UserInputControls.NullResponseAccepted);
jigOpts.Message = "\nEnter insert point: ";
PromptPointResult ppr = prompts.AcquirePoint(jigOpts);
if (m_insPt == ppr.Value)
return SamplerStatus.NoChange;
else
m_insPt = ppr.Value;
return SamplerStatus.OK;
}
protected override bool Update()
{
m_blkRef.Position = m_insPt;
return true;
}
}
public class TestCommand
{
[CommandMethod("TEST")]
public void Test()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptStringOptions opts = new PromptStringOptions("\nEnter block name: ");
PromptResult pr = ed.GetString(opts);
if (pr.Status != PromptStatus.OK)
return;
Transaction tr = doc.TransactionManager.StartTransaction();
using (tr)
{
BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
if (!bt.Has(pr.StringResult))
{
ed.WriteMessage("\nBlock not found.");
return;
}
ObjectId blockId = bt[pr.StringResult];
while (pr.Status == PromptStatus.OK)
{
Point3d pt = new Point3d(0, 0, 0);
using (BlockReference br = new BlockReference(pt, blockId))
{
BlockJig entJig = new BlockJig(br);
pr = ed.Drag(entJig);
if (pr.Status == PromptStatus.OK)
{
BlockTableRecord btr =
(BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
btr.AppendEntity(br);
tr.AddNewlyCreatedDBObject(br, true);
doc.TransactionManager.QueueForGraphicsFlush();
}
}
}
tr.Commit();
}
}
}
}