Here's a .NET solution:
Command: MULTINSERT
Prompt the user for a block name (or a dwg name, have to specify the full path if the the file isn't in AutoCAD search path),
displays the bloc during insert,
allows osnaps using,
hit Enter or Space or right click to break the loop.
C# code
- using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.EditorInput;using Autodesk.AutoCAD.Geometry;using Autodesk.AutoCAD.Runtime;namespace MultiInsertSample{ public class MyBlockClass { 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; } } [CommandMethod("MULTINSERT")] public void MultiInsert() { 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); ObjectId blockId = ObjectId.Null; string name = pr.StringResult; if (bt.Has(name)) blockId = bt[name]; else { try { string filename = HostApplicationServices.Current.FindFile( name.EndsWith(".dwg") ? name : name + ".dwg", db, FindFileHint.Default); using (Database source = new Database(false, true)) { source.ReadDwgFile(filename, System.IO.FileShare.None, false, null); blockId = db.Insert(name, source, false); } } catch { ed.WriteMessage("\nBlock not found."); return; } } 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(); } } }}
MultInsert.zip |