2017-09-17 8 views
0

J'ai créé un bloc dynamique avec deux paramètres (par_l et par_h) pour le rectangle. Pourquoi pas dans ce cas rien ne se passe? Je suppose que par_l devrait étendre l'élément à 500. Par défaut, j'ai 100 et 100. Le bloc que j'ai créé dans le programme. Par code C# Je veux manipulerTravailler avec des blocs dynamiques en C# (pour 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(); 
     } 

Répondre

2

Vous devez ajouter la référence de bloc nouvellement créé une certaine BlockTableRecord et l'ajouter à la transaction active. Vous devez également disposer de la transaction. Le jeter prendra soin de dipiper tous les objets ouverts avec lui ou ajoutés à lui.

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