- using System; 
- using System.Collections.Generic; 
- using Autodesk.AutoCAD.Runtime; 
- using Autodesk.AutoCAD.ApplicationServices; 
- using Autodesk.AutoCAD.DatabaseServices; 
- using Autodesk.AutoCAD.Geometry; 
- using Autodesk.AutoCAD.EditorInput; 
- using Autodesk.AutoCAD.Internal.DatabaseServices; 
- using AcAp = Autodesk.AutoCAD.ApplicationServices; 
- using AcDb = Autodesk.AutoCAD.DatabaseServices; 
- using AcGe = Autodesk.AutoCAD.Geometry; 
- using AcEd = Autodesk.AutoCAD.EditorInput; 
- using AcId = Autodesk.AutoCAD.Internal.DatabaseServices; 
-   
- [assembly: CommandClass(typeof(Rivilis.BPTTest))] 
-   
- #pragma warning disable 618 
-   
- namespace Rivilis 
- { 
-   
-   public class BPTTest 
-   { 
-     [CommandMethod("InsBlockWithBPT")] 
-     public static void InsBlockWithBPT() 
-     { 
-       AcAp.Document doc = AcAp.Application.DocumentManager.MdiActiveDocument; 
-       AcEd.Editor ed = doc.Editor; 
-       AcDb.Database db = doc.Database; 
-       AcEd.PromptResult rs = ed.GetString("\nEnter block name: "); 
-       if (rs.Status != PromptStatus.OK) return; 
-       AcDb.ObjectId idBTR = AcDb.ObjectId.Null, idBref; 
-       using (AcDb.BlockTable bt = db.BlockTableId.Open(OpenMode.ForRead) as AcDb.BlockTable) { 
-         if (bt != null) idBTR = bt[rs.StringResult]; 
-       } 
-       if (idBTR.IsNull) { 
-         ed.WriteMessage("\nDatabase has not block \"{0}\"", rs.StringResult); 
-         return; 
-       } 
-       AcEd.PromptPointResult rsp = ed.GetPoint("\nEnter position: "); 
-       if (rsp.Status != PromptStatus.OK) return; 
-   
-       using (AcDb.Transaction tr = doc.TransactionManager.StartTransaction()) { 
-         AcDb.BlockTableRecord btr =  
-           tr.GetObject(idBTR, OpenMode.ForRead) as AcDb.BlockTableRecord; 
-         AcDb.BlockTableRecord btrSpace =  
-           tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as AcDb.BlockTableRecord; 
-         if (btr != null && btrSpace != null) { 
-           AcDb.BlockReference brf = 
-             new AcDb.BlockReference(rsp.Value.TransformBy(ed.CurrentUserCoordinateSystem), idBTR); 
-           idBref = btrSpace.AppendEntity(brf); 
-           tr.AddNewlyCreatedDBObject(brf, true); 
-           if (brf.IsDynamicBlock) { 
-             AcDb.BlockTableRecord btrDyn = 
-               tr.GetObject(brf.DynamicBlockTableRecord, OpenMode.ForRead) as AcDb.BlockTableRecord; 
-             if (btrDyn != null && !btrDyn.ExtensionDictionary.IsNull) { 
-               AcDb.DBDictionary extDic =  
-                 tr.GetObject(btrDyn.ExtensionDictionary, OpenMode.ForRead) as AcDb.DBDictionary; 
-               if (extDic != null) { 
-                 AcId.EvalGraph graph = 
-                   tr.GetObject(extDic.GetAt("ACAD_ENHANCEDBLOCK"), OpenMode.ForRead) as AcId.EvalGraph; 
-                 int[] nodeIds = graph.GetAllNodes(); 
-                 foreach (uint nodeId in nodeIds) { 
-                   DBObject node = graph.GetNode(nodeId, OpenMode.ForRead, tr); 
-                   if (!(node is BlockPropertiesTable)) continue; 
-                   AcDb.BlockPropertiesTable bpt = node as AcDb.BlockPropertiesTable; 
-                   int currentRow = SelectRowNumber(ref bpt); 
-                   AcDb.BlockPropertiesTableRow row = bpt.Rows[currentRow]; 
-                   List<string> nameProps = new List<string>(); 
-                   for (int i = 0; i < bpt.Columns.Count; i++) { 
-                     nameProps.Add(bpt.Columns[i].Parameter.Name); 
-                   } 
-                   AcDb.DynamicBlockReferencePropertyCollection dynPropsCol = 
-                     brf.DynamicBlockReferencePropertyCollection; 
-                   foreach (AcDb.DynamicBlockReferenceProperty dynProp in dynPropsCol) { 
-                     int i = nameProps.FindIndex(delegate(string s) { return s == dynProp.PropertyName; }); 
-                     if (i >= 0 && i < nameProps.Count) { 
-                       try {  
-                         dynProp.Value = row[i].AsArray()[0].Value; 
-                       } catch { 
-                         ed.WriteMessage("\nCan not set to {0} value={1}",  
-                           dynProp.PropertyName, row[i].AsArray()[0].Value); 
-                       } 
-                     } 
-                   } 
-                 } 
-               } 
-             } 
-           } else { 
-             ed.WriteMessage("\nBlock \"{0}\" is not dynamic", rs.StringResult); 
-           } 
-         } 
-         tr.Commit(); 
-       } 
-     } 
-   
-     public static int SelectRowNumber(ref BlockPropertiesTable bpt) 
-     { 
-       AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor; 
-       int columns = bpt.Columns.Count; 
-       int rows = bpt.Rows.Count; 
-       int currentRow = 0, currentColumn = 0; 
-       ed.WriteMessage("\n"); 
-       for (currentColumn = 0; currentColumn < columns; currentColumn++) { 
-         ed.WriteMessage("{0}; ", bpt.Columns[currentColumn].Parameter.Name); 
-       } 
-       foreach (BlockPropertiesTableRow row in bpt.Rows) { 
-         ed.WriteMessage("\n[{0}]:\t", currentRow); 
-         for (currentColumn = 0; currentColumn < columns; currentColumn++) { 
-           TypedValue[] columnValue = row[currentColumn].AsArray(); 
-           foreach (TypedValue tpVal in columnValue) { 
-             ed.WriteMessage("{0}; ", tpVal.Value); 
-           } 
-           ed.WriteMessage("|"); 
-         } 
-         currentRow++; 
-       } 
-   
-       AcEd.PromptIntegerResult res; 
-       string.Format("0-{0}", rows - 1); 
-   
-       while ((res = ed.GetInteger(string.Format("\nSelect row number (0-{0}): ", rows - 1))).Status == PromptStatus.OK) { 
-         if (res.Value >= 0 && res.Value <= rows) return res.Value; 
-       } 
-       return -1; 
-     } 
-   } 
- }