2017-09-17 465 views
0

我已經爲矩形創建了一個帶有兩個參數(par_l和par_h)的動態塊。爲什麼不在這種情況下沒有發生?我假設par_l應該將項目擴展到500.默認情況下,我有100和100. 我在程序中創建的塊。通過在C#代碼我想操縱它在C#中使用動態塊(用於AutoCad)

[CommandMethod("Elem")] 
     public void TestCommand() 
     { 
      Document doc = Application.DocumentManager.MdiActiveDocument; 
      Database db = doc.Database; 
      Editor ed = doc.Editor; 

      Transaction tr = db.TransactionManager.StartTransaction(); 

        BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite); 
        ed.WriteMessage(bt["prz_podl"]+""); 

        BlockTableRecord btr = tr.GetObject(bt["prz_podl"], OpenMode.ForWrite) as BlockTableRecord; 

        Point3d point = new Point3d(0, 0, 0); 
        BlockReference br = new BlockReference(point, btr.Id); 
        br.BlockTableRecord = btr.Id; 

        DynamicBlockReferencePropertyCollection properties = br.DynamicBlockReferencePropertyCollection; 
        for (int i = 0; i < properties.Count; i++) 
        { 
         DynamicBlockReferenceProperty property = properties[i]; 
         if (property.PropertyName == "par_l") 
         { 
          ed.WriteMessage(property.Value+""); 
          property.Value = 500.0; 
         } 
        } 
        tr.Commit(); 
     } 

回答

2

你必須要追加新創建的塊參照一些BlockTableRecord並將其添加到活動事務。 您還必須處理交易。處理它將處理所有打開的對象或添加到它的對象。

[CommandMethod("TEST")] 
public void Test() 
{ 
    var doc = AcAp.DocumentManager.MdiActiveDocument; 
    var db = doc.Database; 
    var ed = doc.Editor; 

    using (var tr = db.TransactionManager.StartTransaction()) 
    { 
     var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); 
     // if the bloc table has the block definition 
     if (bt.Has("prz_podl")) 
     { 
      // create a new block reference 
      var br = new BlockReference(Point3d.Origin, bt["prz_podl"]); 

      // add the block reference to the curentSpace and the transaction 
      var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); 
      curSpace.AppendEntity(br); 
      tr.AddNewlyCreatedDBObject(br, true); 

      // set the dynamic property value 
      foreach (DynamicBlockReferenceProperty prop in br.DynamicBlockReferencePropertyCollection) 
      { 
       if (prop.PropertyName == "par_l") 
       { 
        prop.Value = 500.0; 
       } 
      } 
     } 
     // save changes 
     tr.Commit(); 
    } // <- end using: disposing the transaction and all objects opened with it (block table) or added to it (block reference) 
}