2017-11-17 10 views
1

このコードは正しく動作しません。線とポリラインは描画されませんが、レイヤが作成されます。私はこの問題が取引に関係するかもしれないとは思いますが、わかりませんし、解決する方法もわかりません。コードはレイヤーを作成しますが、オートキャドで線を描画しません

このメソッドは、作成メソッドにパラメータを送信します。

public static void DrawingLines() 
{ 
    Document document = Application.DocumentManager.MdiActiveDocument; 
    Database database = document.Database; 

    // Verificando a existencia dos Layers, caso não existam, são criados 
    CreatingLayer("P04", 4); 
    CreatingLayer("TEXTO", 3); 
    CreatingLayer("P01", 1); 

    // Start a transaction 
    using (Transaction transactionManager = 
      database.TransactionManager.StartTransaction()) 
    { 
     // Cria o triangulo da função 
     var acPoly = new Polyline(); 
     acPoly.AddVertexAt(0, new Point2d(Variaveis.pt.X - 225, 
          Variaveis.pt.Y - 175), 0, 0, 0); 
     acPoly.AddVertexAt(1, new Point2d(Variaveis.pt.X + 225, 
          Variaveis.pt.Y - 175), 0, 0, 0); 
     acPoly.AddVertexAt(2, new Point2d(Variaveis.pt.X + 225, 
          Variaveis.pt.Y - 55), 0, 0, 0); 
     acPoly.AddVertexAt(3, new Point2d(Variaveis.pt.X - 225, 
          Variaveis.pt.Y - 175), 0, 0, 0); 
     acPoly.Layer = "P01"; 

     // Desenha a linha central cyan 
     var acLine = new Line() 
     { 
      StartPoint = new Point3d(Variaveis.pt.X + 53, Variaveis.pt.Y - 
            270, 0), 
      EndPoint = new Point3d(Variaveis.pt.X + 53, Variaveis.pt.Y - 
            513, 0) 
     }; 

     acLine.Layer = "P04"; 

     // Add the new object to the block table record 
     AddToModelSpace(acPoly); 
     AddToModelSpace(acLine); 
    } 
} 

このメソッドは、レイヤーが存在するかどうかをチェックします。存在しない場合は作成されます。このメソッドは、モデル空間内のエンティティを挿入

public static void AddToModelSpace(Entity ent) 
{ 
    Document document = Application.DocumentManager.MdiActiveDocument; 
    Database database = document.Database; 

    using (Transaction tr = database.TransactionManager.StartTransaction()) 
    { 
     var blTbl = tr.GetObject(database.BlockTableId, OpenMode.ForRead) as 
           BlockTable; 
     var blTblRec = tr.GetObject(blTbl[BlockTableRecord.ModelSpace], 
            OpenMode.ForWrite) as BlockTableRecord; 

     blTblRec.AppendEntity(ent); 
     tr.AddNewlyCreatedDBObject(ent, true); 
     tr.Commit(); 
    } 
} 

答えて

2

する責任がある

public static void CreatingLayer(string layer, short color) 
{ 
    Document document = Application.DocumentManager.MdiActiveDocument; 
    Database database = document.Database; 

    using (Transaction tr = database.TransactionManager.StartTransaction()) 
    { 
     // Get the layer table from the drawing 
     LayerTable lt = (LayerTable)tr.GetObject(database.LayerTableId, 
         OpenMode.ForRead); 

     // Create our new layer table record... 
     LayerTableRecord ltr = new LayerTableRecord(); 

     // Checa a existencia de P01, caso não exista, é criada 
     if (lt.Has(layer) == true) 
     { 
      database.Clayer = lt[layer]; 
     } 
     else 
     { 
      // ... and set its properties 
      ltr.Name = layer; 
      ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, color); 

      // Add the new layer to the layer table 
      lt.UpgradeOpen(); 
      ObjectId ltId = lt.Add(ltr); 
      tr.AddNewlyCreatedDBObject(ltr, true); 

      // Set the layer to be current for this drawing 
      database.Clayer = lt[layer]; 
     } 

     // Se tudo ocorreu bem, grava a transação 
     tr.Commit(); 
    } 
} 

私はAutoCADの環境には何もコード化されたことがありませんが、あなたのコードを検査することは、あなたがDrawingLinesでトランザクションをコミットしていないようです。

そして、それは興味深いことです。なぜあなたはDrawingLinesに取引を作成していて、すぐにAddToModelSpaceに別の取引を作成していますか?そのうちの1つは絶対に不要です。

+0

@ erik-philips今、私のコードは完全に機能しました。どうもありがとうございました! –

+0

@ erik-philips私はプログラミングが初めてです。もう一度、ありがとう! –

関連する問題