2017-11-17 12 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 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(); 
    } 
} 

이 방법은 모형 공간에서 개체를 삽입에만 책임이

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

I의 AutoCAD 환경에서 아무것도 코딩 적이없는,하지만 코드를 검사하는 것은 당신이 DrawingLines에서 트랜잭션을 커밋하지 않는 것 같다.

그리고 흥미로운 점이 있습니다. 왜 DrawingLines에 거래를 만들고 심지어 즉시 AddToModelSpace에 또 다른 거래를 만드십니까? 그 중 하나는 절대적으로 불필요한 것으로 보인다.

+0

@ erik-philips 이제 내 코드가 완벽하게 작동했습니다. 고마워요! –

+0

@ erik-philips 프로그래밍을 처음 사용합니다. 다시 한 번 감사드립니다! –