Рисование сплошного блока с сетками

Я пытаюсь программно нарисовать сплошную рамку/прямоугольник в AutoCAD с помощью С#. Я близко, но верх и низ сетки не сплошные. Вот мой метод рисования сетки

[CommandMethod("TESTSIMPLEMESH")]
public void TestSimpleMesh()
{
    // Get the current document and database, and start a transaction
    Database _database = HostApplicationServices.WorkingDatabase;
    Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;
    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        BlockTable acBlkTbl = acTrans.GetObject(_database.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record for read
        BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Open the Block table record Model space for write

        // Create a polygon mesh
        PolygonMesh acPolyMesh = new PolygonMesh();

        /*
         * M indicates No of rows and N indicates No of columns, visualize it as Grid
         * So to have cube, we need two rows of vertices and 4 colomns of vertices
         * Now we need to close last column of vertices with first column of vertices that makes a simple cube or else planar surface with facets.
         */
        acPolyMesh.MSize = 2;
        acPolyMesh.NSize = 4;
        acPolyMesh.MakeNClosed(); //This function sets the PolygonMesh to be closed in the N direction. This means that the mesh will be treated as continuous from the last row on to the first row.

        // Add the new object to the block table record and the transaction        
        acBlkTblRec.AppendEntity(acPolyMesh);
        acTrans.AddNewlyCreatedDBObject(acPolyMesh, true);

        //Creating collection of points to add to the mesh
        Point3dCollection acPts3dPMesh = new Point3dCollection();
        acPts3dPMesh.Add(new Point3d(100, 100, 0));
        acPts3dPMesh.Add(new Point3d(200, 100, 0));
        acPts3dPMesh.Add(new Point3d(200, 200, 0));
        acPts3dPMesh.Add(new Point3d(100, 200, 0));
        acPts3dPMesh.Add(new Point3d(100, 100, 100));
        acPts3dPMesh.Add(new Point3d(200, 100, 100));
        acPts3dPMesh.Add(new Point3d(200, 200, 100));
        acPts3dPMesh.Add(new Point3d(100, 200, 100));

        //Converting those points to PolygonMeshVertecies and appending them to the PolygonMesh
        foreach (Point3d acPt3d in acPts3dPMesh)
        {
            PolygonMeshVertex acPMeshVer = new PolygonMeshVertex(acPt3d);
            acPolyMesh.AppendVertex(acPMeshVer);
            acTrans.AddNewlyCreatedDBObject(acPMeshVer, true);
        }

        // Save the new objects to the database        
        acTrans.Commit();
    }
}

И вот результат

введите здесь описание изображения

Что выглядит хорошо, пока вы не увидите его с высоты птичьего полета...

введите здесь описание изображения

Таким образом, стороны сплошные, а верх и низ — нет. Как я могу изменить описанный выше метод, чтобы все 6 сторон были сплошными?


person Nick Gilbert    schedule 15.09.2015    source источник
comment
Взгляните на это: через-интерфейс.typepad.com/through_the_interface/2012/09/   -  person Russ Clarke    schedule 15.09.2015


Ответы (1)


Если вы хотите твердое тело, используйте Solid3d.CreateBox вместо PolygonMesh.

Если вам нужна сетка, вы должны использовать класс SubDMesh вместо PolygonMesh, который создает старую сетку сложным способом.

[CommandMethod("CREATESUBDMESH")]
public void CreateSubDMesh()
{
  Document doc = Application.DocumentManager.MdiActiveDocument;
  Database db = doc.Database;
  Editor ed = doc.Editor;
  using (Transaction tr = db.TransactionManager.StartTransaction())
  {
    var mesh = new SubDMesh();
    mesh.Setbox(100, 100, 100, 1, 1, 1, 0);
    var currentSpace = (BlockTableRecord) tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
    currentSpace.AppendEntity(mesh);
    tr.AddNewlyCreatedDBObject(mesh, true);
    tr.Commit();
  }
}
person Maxence    schedule 15.09.2015
comment
Это на самом деле может работать отлично. Проблема в том, что в настоящее время он всегда будет рисовать в начале координат (0, 0, 0). Можно указать где рисовать? - person Nick Gilbert; 15.09.2015
comment
Вы можете переместить его после создания: mesh.TransformBy(Matrix3d.Displacement(new Vector3d(100, 200, 300))); - person Maxence; 15.09.2015
comment
Попался, я закодировал это, и это почти работает. Мои преобразования работают не совсем правильно. Какая точка нарисованного вами прямоугольника совпадает с исходной точкой? - person Nick Gilbert; 15.09.2015
comment
Коробка центрируется в начале координат. - person Maxence; 15.09.2015