CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

创建网格 (.NET)

2023-1-1 11:10| 发布者: admin| 查看: 598| 评论: 0|来自: AutoCAD

矩形网格(对象)使用平面刻面表示对象的表面。网格的密度或小平面数是根据 MN 个顶点的矩阵定义的,类似于由列和行组成的网格。MN 分别指定任何给定顶点的列和行位置。您可以在 2D 和 3D 中创建网格,但它们主要用于 3D。PolygonMesh

创建对象的实例,然后指定新网格的顶点的密度和位置。此方法可以选择采用六个值:要创建的多边形网格的类型、定义 MN 方向上的顶点数的两个整数、包含网格中所有顶点坐标的点集合,以及定义网格是在 M 方向还是 N 方向闭合的两个布尔值。PolygonMesh

创建 PolygonMesh 后,使用 和 属性关闭网格。IsMClosedNClosed

创建多边形网格

本示例创建一个 4×4 多边形网格。然后调整活动视口的方向,以便更容易查看网格的三维性质。

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
 
<CommandMethod("Create3DMesh")> _
Public Sub Create3DMesh()
    '' Get the current document and database, and start a transaction
    Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
    Dim acCurDb As Database = acDoc.Database

    Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
        '' Open the Block table for read
        Dim acBlkTbl As BlockTable
        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
                                     OpenMode.ForRead)

        '' Open the Block table record Model space for write
        Dim acBlkTblRec As BlockTableRecord
        acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
                                        OpenMode.ForWrite)

        '' Create a polygon mesh
        Using acPolyMesh As PolygonMesh = New PolygonMesh()
            acPolyMesh.MSize = 4
            acPolyMesh.NSize = 4

            '' Add the new object to the block table record and the transaction
            acBlkTblRec.AppendEntity(acPolyMesh)
            acTrans.AddNewlyCreatedDBObject(acPolyMesh, True)

            '' Before adding vertexes, the polyline must be in the drawing
            Dim acPts3dPMesh As Point3dCollection = New Point3dCollection()
            acPts3dPMesh.Add(New Point3d(0, 0, 0))
            acPts3dPMesh.Add(New Point3d(2, 0, 1))
            acPts3dPMesh.Add(New Point3d(4, 0, 0))
            acPts3dPMesh.Add(New Point3d(6, 0, 1))

            acPts3dPMesh.Add(New Point3d(0, 2, 0))
            acPts3dPMesh.Add(New Point3d(2, 2, 1))
            acPts3dPMesh.Add(New Point3d(4, 2, 0))
            acPts3dPMesh.Add(New Point3d(6, 2, 1))

            acPts3dPMesh.Add(New Point3d(0, 4, 0))
            acPts3dPMesh.Add(New Point3d(2, 4, 1))
            acPts3dPMesh.Add(New Point3d(4, 4, 0))
            acPts3dPMesh.Add(New Point3d(6, 4, 0))

            acPts3dPMesh.Add(New Point3d(0, 6, 0))
            acPts3dPMesh.Add(New Point3d(2, 6, 1))
            acPts3dPMesh.Add(New Point3d(4, 6, 0))
            acPts3dPMesh.Add(New Point3d(6, 6, 0))

            For Each acPt3d As Point3d In acPts3dPMesh
                Dim acPMeshVer As PolygonMeshVertex = New PolygonMeshVertex(acPt3d)
                acPolyMesh.AppendVertex(acPMeshVer)
                acTrans.AddNewlyCreatedDBObject(acPMeshVer, True)
            Next
        End Using

        '' Open the active viewport
        Dim acVportTblRec As ViewportTableRecord
        acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId, _
                                          OpenMode.ForWrite)

        '' Rotate the view direction of the current viewport
        acVportTblRec.ViewDirection = New Vector3d(-1, -1, 1)
        acDoc.Editor.UpdateTiledViewportsFromDatabase()

        '' Save the new objects to the database
        acTrans.Commit()
    End Using
End Sub

C#

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
 
[CommandMethod("Create3DMesh")]
public static void Create3DMesh()
{
    // Get the current document and database, and start a transaction
    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;

    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        // Open the Block table record for read
        BlockTable acBlkTbl;
        acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
                                        OpenMode.ForRead) as BlockTable;

        // Open the Block table record Model space for write
        BlockTableRecord acBlkTblRec;
        acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
                                        OpenMode.ForWrite) as BlockTableRecord;

        // Create a polygon mesh
        using (PolygonMesh acPolyMesh = new PolygonMesh())
        {
            acPolyMesh.MSize = 4;
            acPolyMesh.NSize = 4;

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

            // Before adding vertexes, the polyline must be in the drawing
            Point3dCollection acPts3dPMesh = new Point3dCollection();
            acPts3dPMesh.Add(new Point3d(0, 0, 0));
            acPts3dPMesh.Add(new Point3d(2, 0, 1));
            acPts3dPMesh.Add(new Point3d(4, 0, 0));
            acPts3dPMesh.Add(new Point3d(6, 0, 1));

            acPts3dPMesh.Add(new Point3d(0, 2, 0));
            acPts3dPMesh.Add(new Point3d(2, 2, 1));
            acPts3dPMesh.Add(new Point3d(4, 2, 0));
            acPts3dPMesh.Add(new Point3d(6, 2, 1));

            acPts3dPMesh.Add(new Point3d(0, 4, 0));
            acPts3dPMesh.Add(new Point3d(2, 4, 1));
            acPts3dPMesh.Add(new Point3d(4, 4, 0));
            acPts3dPMesh.Add(new Point3d(6, 4, 0));

            acPts3dPMesh.Add(new Point3d(0, 6, 0));
            acPts3dPMesh.Add(new Point3d(2, 6, 1));
            acPts3dPMesh.Add(new Point3d(4, 6, 0));
            acPts3dPMesh.Add(new Point3d(6, 6, 0));

            foreach (Point3d acPt3d in acPts3dPMesh)
            {
                PolygonMeshVertex acPMeshVer = new PolygonMeshVertex(acPt3d);
                acPolyMesh.AppendVertex(acPMeshVer);
                acTrans.AddNewlyCreatedDBObject(acPMeshVer, true);
            }
        }

        // Open the active viewport
        ViewportTableRecord acVportTblRec;
        acVportTblRec = acTrans.GetObject(acDoc.Editor.ActiveViewportId,
                                            OpenMode.ForWrite) as ViewportTableRecord;

        // Rotate the view direction of the current viewport
        acVportTblRec.ViewDirection = new Vector3d(-1, -1, 1);
        acDoc.Editor.UpdateTiledViewportsFromDatabase();

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

VBA/ActiveX 代码参考

Sub Create3DMesh()
    Dim meshObj As AcadPolygonMesh
    Dim mSize, nSize, Count As Integer
 
    ' create the matrix of points
    Dim points(0 To 47) As Double
    points(0) = 0: points(1) = 0: points(2) = 0
    points(3) = 2: points(4) = 0: points(5) = 1
    points(6) = 4: points(7) = 0: points(8) = 0
    points(9) = 6: points(10) = 0: points(11) = 1
    points(12) = 0: points(13) = 2: points(14) = 0
    points(15) = 2: points(16) = 2: points(17) = 1
    points(18) = 4: points(19) = 2: points(20) = 0
    points(21) = 6: points(22) = 2: points(23) = 1
    points(24) = 0: points(25) = 4: points(26) = 0
    points(27) = 2: points(28) = 4: points(29) = 1
    points(30) = 4: points(31) = 4: points(32) = 0
    points(33) = 6: points(34) = 4: points(35) = 0
    points(36) = 0: points(37) = 6: points(38) = 0
    points(39) = 2: points(40) = 6: points(41) = 1
    points(42) = 4: points(43) = 6: points(44) = 0
    points(45) = 6: points(46) = 6: points(47) = 0
 
    mSize = 4: nSize = 4
 
    ' creates a 3Dmesh in model space
    Set meshObj = ThisDrawing.ModelSpace. _
                      Add3DMesh(mSize, nSize, points)
 
    ' Change the viewing direction of the viewport
    ' to better see the cylinder
    Dim NewDirection(0 To 2) As Double
    NewDirection(0) = -1
    NewDirection(1) = -1
    NewDirection(2) = 1
    ThisDrawing.ActiveViewport.direction = NewDirection
    ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport
 
    ZoomAll
End Sub

路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1   苏公网安备32011402011833)

GMT+8, 2025-1-8 19:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部