Message 1 of 3

Not applicable
08-26-2014
10:19 PM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi All,
I am creating a tool that will copy entities to each vertex of a polyline. The code below worked, until I realised that I lost field links, dynamic block functionality etc.
[CommandMethod("BRENT", "COPYALONGPOLYLINE", "COPYALONGPOLYLINE", CommandFlags.Session)] public static void COPYALONGPOLYLINE() { // Get the current document and database Document doc = AcApp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (DocumentLock dlock = doc.LockDocument()) { // Start a transaction using (Transaction tr = db.TransactionManager.StartTransaction()) { PromptEntityResult per = ed.GetEntity("\nSelect Polyline"); if (per.Status == PromptStatus.OK) { DBObject obj = tr.GetObject(per.ObjectId, OpenMode.ForRead); Point3dCollection pts = new Point3dCollection(); Polyline lwp = obj as Polyline; if (lwp != null) { lwp.Highlight(); int vn = lwp.NumberOfVertices; for (int i = 0; i < vn; i++) { pts.Add(lwp.GetPoint3dAt(i)); } } BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; PromptSelectionOptions pso = new PromptSelectionOptions(); pso.MessageForAdding = "\nSelect objects to add: "; pso.MessageForRemoval = "\nSelect objects to remove: "; PromptSelectionResult psr = ed.GetSelection(pso); if (psr.Status == PromptStatus.OK) { SelectionSet ss = psr.Value; DBObjectCollection dbEntColl = new DBObjectCollection(); foreach (ObjectId id in ss.GetObjectIds()) { Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead); dbEntColl.Add(ent); } for (int i = 1; i < pts.Count; i++) { Vector3d v3d = new Vector3d(pts[i].X - pts[0].X, pts[i].Y - pts[0].Y, pts[i].Z - pts[0].Z); foreach (Entity acEnt in dbEntColl) { Entity ent; ent = acEnt.Clone() as Entity; // Create a matrix and move each copied entity 15 units ent.TransformBy(Matrix3d.Displacement(v3d)); // Add the cloned object btr.AppendEntity(ent); tr.AddNewlyCreatedDBObject(ent, true); } } } if (lwp != null) lwp.Unhighlight(); } // Save the new object to the database tr.Commit(); } } }
I believe I need to use the Database.DeepClone, but I don't quite understand how to create the cloned entity. In this code below the error is AlreadyExists
[CommandMethod("copyEnt")] public void copyEnt() { Document doc = AcApp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptEntityOptions options = new PromptEntityOptions("\nSelect entity to copy"); PromptEntityResult acSSPrompt = ed.GetEntity(options); if (acSSPrompt.Status != PromptStatus.OK) return; ObjectIdCollection collection = new ObjectIdCollection(); collection.Add(acSSPrompt.ObjectId); //make model space as owner for new entity ObjectId ModelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(db); IdMapping mapping = new IdMapping(); //db.DeepCloneObjects(collection, ModelSpaceId, mapping, false); //now open the new entity and change the color... using (Transaction Tx = db.TransactionManager.StartTransaction()) { Entity oldEnt = (Entity)Tx.GetObject(acSSPrompt.ObjectId, OpenMode.ForRead); Entity newEnt = (Entity)oldEnt.DeepClone(oldEnt, mapping, true); //get the map. IdPair pair1 = mapping[acSSPrompt.ObjectId]; //new object Entity ent = Tx.GetObject(pair1.Value, OpenMode.ForWrite) as Entity; //change the color to red ent.ColorIndex = 1; ent.Highlight(); BlockTableRecord btr = (BlockTableRecord)Tx.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); btr.AppendEntity(newEnt); Tx.AddNewlyCreatedDBObject(newEnt, true); Tx.Commit(); } }
Can someone enlighten me on this?
Thanks,
Brent
Solved! Go to Solution.