2014-06-17 8 views
1

제공된 API와 함께 AutoCAD 2012를 사용하고 있습니다. 나는 C#에서 개발 중이다.Autocad API는 레이어 내부의 모양을 감지합니다.

내가하려는 것은 특정 레이어를 선택하고 해당 레이어의 모든 사각형/사각형을 "감지"하는 것입니다. Ultimateley, 나는 (좌표를 사용하여) "감지"한 모든 직사각형을 그릴 수 있어야합니다.

지금까지, 정말 같은 객체와 레이어를 연결할 수있는 getObjects와 함께 LayerTable 클래스를 사용하고 있습니다 :

LayerTable layers; 
layers = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead) as LayerTable; 

String layerNames = ""; 

foreach (ObjectId layer in layers) 
{ 
    LayerTableRecord layerTableRec; 
    layerTableRec = acTrans.GetObject(layer, OpenMode.ForRead) as LayerTableRecord; 
    layerNames += layerTableRec.Name+"\n"; 
} 

내가 여기에 생각에서 이동 위치를 알아낼 수 없습니다. 하나의 레이어 만 선택하고 그 안에있는 모양을 검색하는 방법. 누군가가 올바른 방향으로 어떤 수업/방법을 들여다 볼 수 있습니까? 감사.

+0

당신이 'LayerTableRecord으로'사용하는 경우 습관으로 널 (null)에 대한 layerTableRec을 확인해야합니다 :

다음은 시작하는 작은 조각이다. –

답변

1

궁극적으로 AutoCAD 개체 모델을 다시 한 번 살펴볼 필요가 있습니다. BlockTableRecord "ModelSpace"는 레이어 지정이있는 AutoCAD 엔티티를 모두 포함합니다. BlockTableRecord를 읽기 용으로 열면 관심있는 레이어에 일치하는 엔티티로 필터링 할 수 있습니다. LINQ를 사용하면 편리합니다.

이 인스턴스에서는 실제로 이름의 레이어의 objectID를 신경 쓰지 않습니다. 레이어를 변경하려는 경우에만 LayerTableRecord를 열 수 있습니다. 엔티티 속성을 변경하려면 Transaction 클래스에 익숙해 져야합니다. RXObject.GetClass()를 활용하여 AutoCAD에서 'As'를 사용하는 것보다 빠른 대안이 있습니다.

* 엔티티는 다른 BlockTableRecords (예 : 추가 레이아웃)에 살 수도 있지만, 지금은 모델 스페이스만으로도 충분할 것입니다.

var acDoc = Application.DocumentManager.MdiActiveDocument; 
var acDb = acDoc.Database; 

using (var tr = database.TransactionManager.StartTransaction()) 
{ 
    try 
    { 
     var entClass = RXObject.GetClass(typeof(Entity)); 
     var modelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(acDb); 
     var modelSpace = (BlockTableRecord)tr.GetObject(modelSpaceId, OpenMode.ForRead); 

     foreach (ObjectId id in modelSpace) 
     { 
      if (!id.ObjectClass.IsDerivedFrom(entClass)) // For entity this is a little redundant, but it works well with derived classes 
       continue; 

      var ent = (Entity)tr.GetObject(id, OpenMode.ForRead) 

      // Check for the entity's layer 
      // You'll need to upgrade the entity to OpenMode.ForWrite if you want to change anything 
     } 

     tr.Commit(); 
    } 
    catch (Autodesk.AutoCAD.Runtime.Exception ex) 
    { 
     acDoc.Editor.WriteMessage(ex.Message); 
    } 
}