2017-09-17 464 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) 
}