2017-09-17 7 views
0

Ich habe einen dynamischen Block mit zwei Parametern (par_l und par_h) für das Rechteck erstellt. Warum passiert in diesem Fall nichts? Ich nehme an, dass par_l das Element auf 500 erweitern sollte. Als Voreinstellung habe ich 100 und 100. Der Block, den ich im Programm erstellt habe. Mit dem Code in C# Ich möchte sie manipulierenArbeiten mit dynamischen Blöcken in C# (für 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(); 
     } 

Antwort

2

Sie haben die neu erstellte Block Verweis auf einige BlockTableRecord anhängen und sie in die aktive Transaktion hinzuzufügen. Sie müssen auch die Transaktion entsorgen. Bei der Entsorgung wird darauf geachtet, dass alle Objekte, die damit geöffnet oder hinzugefügt werden, verloren gehen.

[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) 
}