2015-01-07 3 views
2

Я не хочу выбирать конкретную полилинию во время выполнения. Есть ли способ напрямую получить все полилинии в .dwg-файле, используя C# без выбора во время выполнения? AutoCAD имеет команду DATAEXTRACTION для получения связанной информации для разных объектов (например, полилинии, круга, точки ... и т. Д.), Но я не знаю, можно ли ее вызывать и использовать в C#.Есть ли способ получить все полилинии в autocad (.dwg) с помощью C#?

FYI: Пример кода для получения конкретной полилинии во время выполнения из
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

Благодаря Джеймсу, он работает правильно, но то, что это определение '' oEd' в oPSR = oEd.SelectAll (Os е); '? Я предполагаю, что он определяется следующим образом: 'Редактор oEd = Application.DocumentManager.MdiActiveDocument.Editor;'. –

+0

Простите, пропустили эту декларацию. Вот еще несколько строк кода, чтобы прояснить ситуацию. Документ oDwg = Application.DocumentManager.MdiActiveDocument; Редактор oEd = oDwg.Editor; – Miiir

5

Обновлено 1/12/2015

Это будет работать, так и держать вас от необходимости иметь дело со всеми typedvalues ​​...

Я написал сообщение в блоге на эту тему, Check it out.

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; 
    } 
}