2016-10-19 7 views
0

Я пытаюсь выбрать все полилинии определенного слоя, а затем присоединить их к обычной команде autocad _JOIN. По какой-то причине я просто не могу заставить его работать.Объединение полилиний в AutoCAD с C#

selectionset правильно нашли, как я мог бы петлю через него и изменить цвет ломаной линии (просто, что для целей тестирования)

Что я упускаю/здесь делаю неправильно?

 [CommandMethod("JOINPOLY", 
         CommandFlags.UsePickSet | 
         CommandFlags.Redraw | 
         CommandFlags.Modal)] 
    public void SelectAllPolylineByLayer() 
    { 
     Document doc = Application.DocumentManager.MdiActiveDocument; 
     Database db = doc.Database; 
     Editor ed = doc.Editor; 

     using (Transaction tr = db.TransactionManager.StartTransaction()) 
     { 
      try 
      { 
       // create the typevalue (criteria what should be selected) 
       TypedValue[] tvs = new TypedValue[] { 
           new TypedValue(Convert.ToInt32(DxfCode.Operator), "<and"), 
           new TypedValue(Convert.ToInt32(DxfCode.LayerName), "Test unlocked"), 
           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>") 
       }; 

       // create a selectionfilter out of our created typevalue 
       SelectionFilter oSf = new SelectionFilter(tvs); 
       PromptSelectionResult selRes = ed.SelectAll(oSf); 

       // if there is a problemw ith the promtselection stop here 
       if (selRes.Status != PromptStatus.OK) 
       { 
        ed.WriteMessage("\nError in getting the selectAll"); 
        return; 
       } 

       SelectionSet ss = selRes.Value; 

       ed.Command("_JOIN", ss, ""); 
       tr.Commit();          
      } 
      //Catch the error and write the errormessage 
      catch (System.Exception ex) 
      { 
       ed.WriteMessage(Convert.ToString(ex)); 
      } 
     } 
    } 

ответ

0

если кто-то еще заботится о том, что это конечный результат я придумал в конце концов я сохранить все объекты в список класса, который имеет сущности, начальную и конечная точка ломаных сохранены

тогда я сравнить, если начало и оконечных элементов в списке матча и присоединиться к ним с entity.join()

 /// <summary> 
    /// Gets a layerName and tries to join all polylines on the given layer   
    /// sends back a little log message to display 
    /// </summary> 
    /// <param name="layerName"></param> 
    /// <returns></returns> 
    public static string JoinPolylineOnLayer(Database db, string layerName) 
    { 
     Document doc = Application.DocumentManager.MdiActiveDocument; 
     Editor ed = doc.Editor;       

     TypedValue[] tvs = null;    

     using (Transaction tr = db.TransactionManager.StartTransaction()) 
     { 
      LayerTable layerTable = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead); 

      try 
      { 
       // get layerid of the selected layer 
       var layerId = layerTable[layerName]; 

       // open layer table record with write privileges 
       // if the layer is locked return with an error message that the layer cant be deleted 
       LayerTableRecord layer = (LayerTableRecord)tr.GetObject(layerId, OpenMode.ForWrite); 
       if (layer.IsLocked) 
        return "' cannot be merged(locked)."; 

       // create the typevalue (criteria what should be selected) 
       tvs = new TypedValue[] { 
           new TypedValue(Convert.ToInt32(DxfCode.Operator), "<and"), 
           new TypedValue(Convert.ToInt32(DxfCode.LayerName), layerName), 
           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>") 
       }; 

       // create a list of the entities 
       List<PolylineClass> entities = FillListOfEntities(tvs, tr, ed); 

       for (int i = entities.Count - 1; i >= 0; i--) 
       {       
        for (int j = i - 1; j >= 0; j--) 
        { 
         try 
         { 
          // check if start/endpoints are the same 
          // if they are join them and reset the loops and start again 
          if ((entities[i].StartPoint == entities[j].StartPoint) || 
           (entities[i].StartPoint == entities[j].EndPoint) || 
           (entities[i].EndPoint == entities[j].StartPoint) || 
           (entities[i].EndPoint == entities[j].EndPoint)) 
          { 
           Entity srcPLine = entities[i].Ent; 
           Entity addPLine = entities[j].Ent; 

           // join both entities 
           srcPLine.UpgradeOpen(); 
           srcPLine.JoinEntity(addPLine); 

           // delete the joined entity 
           addPLine.UpgradeOpen(); 
           entities.RemoveAt(j); 
           addPLine.Erase(); 

           // set new start and end point of the joined polyline 
           entities[i - 1] = new PolylineClass(srcPLine, GetStartPointData(srcPLine), GetEndPointData(srcPLine)); 

           // reset i to the start (as it has changed) 
           i = entities.Count; 
           j = 0; 
          } 
         } 
         catch (System.Exception ex) 
         { 
          ed.WriteMessage("\nError: n{0}", ex.Message); 
         } 
        } 
       } 
       tr.Commit(); 
       return "' have been joined"; 
      } 
      //Catch the error and write the errormessage 
      catch (System.Exception ex) 
      { 
       return Convert.ToString(ex); 
      } 
     } 
    } 


    /// <summary> 
    /// Function to fill the entities list with a give TypedValue 
    /// </summary> 
    /// <param name="tvs"></param> 
    /// <param name="tr"></param> 
    /// <param name="ed"></param> 
    /// <returns></returns> 
    private static List<PolylineClass> FillListOfEntities(TypedValue[] tvs, Transaction tr, Editor ed) 
    { 
     SelectionFilter oSf = new SelectionFilter(tvs); 
     PromptSelectionResult selRes = ed.SelectAll(oSf); 

     // if there is a problemw ith the promtselection stop here 
     if (selRes.Status != PromptStatus.OK) 
     { 
      return null; 
     } 

     // declare a list and fill it with all elements from our selectionfilter 
     List<PolylineClass> entities = new List<PolylineClass>(); 

     foreach (ObjectId obj in selRes.Value.GetObjectIds()) 
     { 
      Entity ent = tr.GetObject(obj, OpenMode.ForRead) as Entity; 
      entities.Add(new PolylineClass(ent, GetStartPointData(ent), GetEndPointData(ent))); 
     } 

     return entities; 
    } 


    /// <summary> 
    /// Function to get the startpoint coordinates of a polyline 
    /// </summary> 
    /// <param name="obj"></param> 
    /// <returns></returns> 
    private static Point3d GetStartPointData(Entity obj) 
    {    
     // If a "lightweight" (or optimized) polyline 
     Polyline lwp = obj as Polyline; 
     if (lwp != null) 
     { 
      return new Point3d(lwp.GetPoint2dAt(0).X, lwp.GetPoint2dAt(0).Y, lwp.Elevation); 
     } 
     else 
     { 
      // If an old-style, 2D polyline 
      Polyline2d p2d = obj as Polyline2d; 
      if (p2d != null) 
      { 
       return new Point3d (p2d.StartPoint.X, p2d.StartPoint.Y, p2d.Elevation); 
      } 
      else 
      { 
       // If an old-style, 3D polyline 
       Polyline3d p3d = obj as Polyline3d; 
       if (p3d != null) 
       { 
        return p3d.StartPoint; 
       } 
      } 
     } 
     return new Point3d(0, 0, 0); 
    } 


    /// <summary> 
    /// Function to get the endpoint coordinates of a polyline 
    /// </summary> 
    /// <param name="obj"></param> 
    /// <returns></returns> 
    private static Point3d GetEndPointData(Entity obj) 
    { 
     // If a "lightweight" (or optimized) polyline 
     Polyline lwp = obj as Polyline; 
     if (lwp != null) 
     { 
      return new Point3d(lwp.GetPoint2dAt(lwp.NumberOfVertices - 1).X, lwp.GetPoint2dAt(lwp.NumberOfVertices - 1).Y, lwp.Elevation); 
     } 
     else 
     { 
      // If an old-style, 2D polyline 
      Polyline2d p2d = obj as Polyline2d; 
      if (p2d != null) 
      { 
       return new Point3d(p2d.EndPoint.X, p2d.EndPoint.Y, p2d.Elevation); 
      } 
      else 
      { 
       // If an old-style, 3D polyline 
       Polyline3d p3d = obj as Polyline3d; 
       if (p3d != null) 
       { 
        return p3d.EndPoint; 
       } 
      } 
     } 
     return new Point3d(0, 0, 0); 
    } 
0

команда редактор, кажется, отличается от клиента присоединиться к

как обходной путь я использую следующие в настоящее время:

doc.SendStringToExecute("._JOIN\n_p\n\n", true, false, false); 

я не 100% счастлива с ним, но хорошо, что это на что я должен пойти сейчас.

0

Правильный способ сделать это (если вы используете версию AutoCAD> = 2013) - использовать метод Polyline.JoinEntities.

Не забудьте прочитать документ:

Polyline.JoinEntities требует заданных объектов, чтобы быть другими, незакрытые полилиниями или Polyline2d, линия, и/или юридических лица, дуговые, которые разделяют общее начало или конец пункты.

Для обработки 3D-полилиний вам необходимо преобразовать их в линии/2D-полилинии (конечно, все объекты должны находиться в одной плоскости).

Существует образец здесь: http://adndevblog.typepad.com/autocad/2012/05/joining-2d-3d-polylines.html

+0

, которые дают мне хорошую точку, чтобы заглянуть в я тонкий k я неправильно истолковал свою проблему, я не хочу присоединиться к 3d-полилиниям с помощью 2d. я просто хочу присоединиться ко всем 3D-политикам с другими 3d-политиками и всеми 2d с другими 2-го. – Smir

+0

В качестве побочного пункта вы рассматривали возможность покупки специализированных процедур для этой цели? Я знаю веб-сайт, где у них есть эта процедура, которую можно купить для многократного объединения 2D и 3D полилиний. Мог бы спасти вас заново изобретать колесо. –

 Смежные вопросы

  • Нет связанных вопросов^_^