2016-10-31 24 views
3

スイープポリラインの頂点を検索しようとしています。 3Dポリラインに沿って円を掃くことによって作成されたソリッドがあります。 それは次のようになります:image of sweeped solidAutoCADで下位要素の頂点をAutoCADで取得する

先週金曜日の全体をグージョーリングすると私はサブエントリー部分で遊ばなければならないと思います。私はサブエントリエッジの色を変える方法を見つけましたが、キリストのためにはできませんでした。幾何学にアクセスする方法を見つけられません

これは私がこれまでに試したことですが、ちょっとそこに失われています:

[CommandMethod("SubEntExample")] 
    public void SubEntExample() 
    { 
     Document doc = Application.DocumentManager.MdiActiveDocument; 
     Database db = doc.Database; 
     Editor ed = doc.Editor; 

     PromptEntityOptions peo = new PromptEntityOptions("\nSelect a 3D solid: "); 
     peo.SetRejectMessage("\nInvalid selection..."); 
     peo.AddAllowedClass(typeof(Solid3d), true); 

     PromptEntityResult per = ed.GetEntity(peo); 

     if (per.Status != PromptStatus.OK) 
      return; 

     using (Transaction Tx = db.TransactionManager.StartTransaction()) 
     { 
      Solid3d solid = Tx.GetObject(per.ObjectId, OpenMode.ForWrite) as Solid3d; 

      ObjectId[] ids = new ObjectId[] { per.ObjectId }; 

      FullSubentityPath path = new FullSubentityPath(ids, new SubentityId(SubentityType.Null, IntPtr.Zero)); 

      List<SubentityId> subEntIds = new List<SubentityId>(); 

      using (Autodesk.AutoCAD.BoundaryRepresentation.Brep brep = 
       new Autodesk.AutoCAD.BoundaryRepresentation.Brep(path)) 
      {      
       foreach (Autodesk.AutoCAD.BoundaryRepresentation.Edge edge in brep.Edges) 
       { 
        subEntIds.Add(edge.SubentityPath.SubentId); 
       }      
      } 

      foreach (SubentityId subentId in subEntIds) 
      { 

       *** here i am lost *** 

      } 
      Tx.Commit(); 
     } 
    } 
+0

エンティティをDXFにエクスポートし、テキストファイルのデータの構成を調べる方法はありますか?あなたにサブエンティティの仕組みを説明するかもしれません。私は手元にある事件の具体的な知識は持っていませんが、もし彼らが "id"であれば、次にそれらのidを "開く"ものは何でしょうか?これらは、座標データを提供する適切なオブジェクトを返します。しかし、それは推測です。 DXFを見ると、より多くの情報が表示される場合があります。おそらくあなたはあなたの質問にそれを加えることができます。 –

答えて

0

私の最初のソリューションは、すべてのグリップを取得し、関連しているが、私は道より良い解決策を思いついたインターネット(:))からの援助のビットに感謝かを決める関与

/// <summary> 
    /// Checks if there are boundaryreps that are marked as elliptical or circular arcs 
    /// returns true if we found at least 2 of those points 
    /// also stores the points in a referenced Point3dCollection 
    /// </summary> 
    /// <param name="solid"></param> 
    /// <param name="pts"></param> 
    /// <returns></returns> 
    private bool GetSweepPathPoints(Solid3d solid, ref Point3dCollection pts) 
    { 
     // create boundary rep for the solid 
     using (Brep brep = new Brep(solid)) 
     { 
      // get edges of the boundary rep 
      BrepEdgeCollection edges = brep.Edges; 
      foreach (Edge edge in edges) 
      { 
       // get the nativ curve geometry of the edges and then 
       // check if it is a circle 
       // for more info look at: 
       // http://adndevblog.typepad.com/autocad/2012/08/retrieving-native-curve-geometry-using-brep-api.html 
       Curve3d curv = ((ExternalCurve3d)edge.Curve).NativeCurve; 
       if (curv is CircularArc3d) 
       { 
        // transform curved arch into circle and add it to the colecction 
        // (if not in it alreadz) 
        CircularArc3d circle = curv as CircularArc3d; 
        if (!pts.Contains(circle.Center)) pts.Add(circle.Center); 
       } 
      } 
     } 
     return (pts.Count > 1) ? true : false; 
    } 

私はすべて次のように呼びます

  Point3dCollection pts = new Point3dCollection(); 
      // only do the whole thing if we face a swept solid 
      if (GetSweepPathPoints(sld, ref pts)) 
      { 
       for (int i = 0; i < pts.Count; i++) 
       { 
        ed.WriteMessage("\nPt[{0}] = {1}", i, pts[i]); 
       } 
      } 
関連する問題