2015-01-07 3 views
2

런타임에 특정 폴리 라인을 선택하고 싶지 않습니다. 런타임 중에 선택없이 C#을 사용하여 .dwg 파일의 모든 폴리 라인을 직접 얻을 수있는 방법이 있습니까? AutoCAD에는 DATAEXTRACTION이라는 명령이있어 여러 객체 (예 : 폴리 라인, 원, 점 등)에 대한 관련 정보를 얻을 수 있지만 C#에서 호출하여 사용할 수 있는지 여부는 알 수 없습니다.C#을 사용하여 AutoCAD (.dwg)의 모든 폴리 라인을 얻는 방법이 있습니까?

는 참고 : 샘플 코드는
http://through-the-interface.typepad.com/through_the_interface/2007/04/iterating_throu.html에서 런타임에 특정 폴리 라인을 얻을 :이 같은 뭔가를 찾고있는 것처럼

Transaction tr = db.TransactionManager.StartTransaction(); 
using (tr) 
{ 
    DBObject obj = tr.GetObject(per.ObjectId, OpenMode.ForRead); 
    Polyline lwp = obj as Polyline; // Get the selected polyline during runtime 
    ... 
} 

답변

6

는 소리. 필요하지 않은 경우 레이어 조건을 제거하십시오.

public ObjectIdCollection SelectAllPolylineByLayer(string sLayer) 
{ 
    ObjectIdCollection retVal = null; 

    try { 
     // Get a selection set of all possible polyline entities on the requested layer 
     PromptSelectionResult oPSR = null; 

     TypedValue[] tvs = new TypedValue[] { 
      new TypedValue(Convert.ToInt32(DxfCode.Operator), "<and"), 
      new TypedValue(Convert.ToInt32(DxfCode.LayerName), sLayer), 
      new TypedValue(Convert.ToInt32(DxfCode.Operator), "<or"), 
      new TypedValue(Convert.ToInt32(DxfCode.Start), "POLYLINE"), 
      new TypedValue(Convert.ToInt32(DxfCode.Start), "LWPOLYLINE"), 
      new TypedValue(Convert.ToInt32(DxfCode.Start), "POLYLINE2D"), 
      new TypedValue(Convert.ToInt32(DxfCode.Start), "POLYLINE3d"), 
      new TypedValue(Convert.ToInt32(DxfCode.Operator), "or>"), 
      new TypedValue(Convert.ToInt32(DxfCode.Operator), "and>") 
     }; 

     SelectionFilter oSf = new SelectionFilter(tvs); 

     oPSR = oEd.SelectAll(oSf); 

     if (oPSR.Status == PromptStatus.OK) { 
      retVal = new ObjectIdCollection(oPSR.Value.GetObjectIds()); 
     } else { 
      retVal = new ObjectIdCollection(); 
     } 
    } catch (System.Exception ex) { 
     ReportError(ex); 
    } 

    return retVal; 
} 
+0

감사 제임스 (OS가 제대로 작동하지만 OPSR = oEd.SelectAll'에서 oEd' '의 정의는 무엇인가 f); 나는 그것이 다음과 같이 정의되어 있다고 생각한다 :'Editor oEd = Application.DocumentManager.MdiActiveDocument.Editor;'. –

+0

죄송합니다, 그 선언을 놓쳤습니다. 여기에 몇 가지 코드가 추가되었습니다. 문서 oDwg = Application.DocumentManager.MdiActiveDocument; 편집기 oEd = oDwg.Editor; – Miiir

5

나는, Check it out.이 주제에 대한 블로그 포스트를 작성했습니다 ... 2015년 1월 12일

이 잘 작동하고 모든 typedvalues ​​처리하는 데에서 당신을 유지합니다 업데이트

public IList<ObjectId> GetIdsByType() 
{ 
    Func<Type,RXClass> getClass = RXObject.GetClass; 

    // You can set this anywhere 
    var acceptableTypes = new HashSet<RXClass> 
    { 
     getClass(typeof(Polyline)), 
     getClass(typeof (Polyline2d)), 
     getClass(typeof (Polyline3d)) 
    }; 

    var doc = Application.DocumentManager.MdiActiveDocument; 
    using (var trans = doc.TransactionManager.StartOpenCloseTransaction()) 
    { 
     var modelspace = (BlockTableRecord) 
     trans.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(doc.Database), OpenMode.ForRead); 

     var polylineIds = (from id in modelspace.Cast<ObjectId>() 
      where acceptableTypes.Contains(id.ObjectClass) 
      select id).ToList(); 

     trans.Commit(); 
     return polylineIds; 
    } 
}