// Create a new BlockTableRecord.
// If one with the same name already exists, get its references and
// erase it. After creation of the new one, change those references
// so that they point to the new instead of the old BlockTableRecord.
let createBlock (db : Database) (name : string) ent =
let tm = db.TransactionManager
let bt = db.BlockTableId.GetObject OpenMode.ForWrite :?> BlockTable
let refIds =
if bt.Has name then
let btr = bt.[name].GetObject OpenMode.ForWrite :?> BlockTableRecord
let refIds = btr.GetBlockReferenceIds(true, false)
btr.Erase()
refIds
else new ObjectIdCollection()
let btr = new BlockTableRecord(Name = name)
let btrId = bt.Add btr
tm.AddNewlyCreatedDBObject(btr, true)
btr.AppendEntity ent |> ignore
tm.AddNewlyCreatedDBObject(ent, true)
for refId in refIds do
let bref = refId.GetObject OpenMode.ForWrite :?> BlockReference
bref.BlockTableRecord <- btrId
btrId
[<CommandMethod("WblockCloneObjectsTest")>]
let wblockCloneObjectsTest() =
let doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument
let db = doc.Database
let ed = doc.Editor
let getEnter (msg : string) =
let pr = ed.GetString msg
pr.Status = PromptStatus.OK
use srcDb = new Database(true, true)
use srcTr = srcDb.TransactionManager.StartTransaction()
// Create nested blocks in side Database. The inner contains a circle.
let srcNestedBtrId =
new Circle(Point3d(0.5, 0.5, 0.), Vector3d.ZAxis, 0.5)
|> createBlock srcDb "NestedBlock"
let srcBtrId =
new BlockReference(Point3d.Origin, srcNestedBtrId)
|> createBlock srcDb "Block"
srcTr.Commit()
// Clone them into the active drawing
db.WblockCloneObjects(
new ObjectIdCollection[| srcBtrId |],
db.BlockTableId,
new IdMapping(),
DuplicateRecordCloning.Replace,
false )
// Create a reference to the outer block.
(
use tr = db.TransactionManager.StartTransaction()
let bt = db.BlockTableId.GetObject OpenMode.ForRead :?> BlockTable
let cs = db.CurrentSpaceId.GetObject OpenMode.ForWrite:?> BlockTableRecord
let bref = new BlockReference(Point3d.Origin, bt.["Block"])
cs.AppendEntity bref |> ignore
tr.AddNewlyCreatedDBObject(bref, true)
tr.Commit()
)
if getEnter "You see a Circle. Press Enter to continue" then
// Replace the inner block with one containing a line
(
use tr = db.TransactionManager.StartTransaction()
new Line(Point3d(0., 0., 0.), Point3d(1., 1., 1.))
|> createBlock db "NestedBlock"
|> ignore
tr.Commit()
)
ed.Regen()
if getEnter "You see a Line. Press Enter to continue" then
// Clone them again into the active drawing, replacing the inner block
db.WblockCloneObjects(
new ObjectIdCollection[| srcBtrId |],
db.BlockTableId,
new IdMapping(),
DuplicateRecordCloning.Replace,
false )