This involves two steps :
- Call the static method “SubDMesh.GetObjectMesh” to retrieve the vertex and face array from a surface.
-
Call the “SubDMesh.SetSubDMesh” method and pass the vertex and face information retrieved in step1.
Here is a sample code :
[CommandMethod("SubDMeshFromSurface")]
public void TestMethod()
{
Document activeDoc
= Application.DocumentManager.MdiActiveDocument;
Database db = activeDoc.Database;
Editor ed = activeDoc.Editor;
Point3d p1 = new Point3d(0.0, 0.0, 0.0);
Point3d p2 = new Point3d(5.0, 0.0, 0.0);
Point3d p3 = new Point3d(5.0, 5.0, 0.0);
Point3d p4 = new Point3d(0.0, 5.0, 0.0);
ObjectId oid = ObjectId.Null;
using (Transaction tr
= db.TransactionManager.StartTransaction())
{
Autodesk.AutoCAD.DatabaseServices.Face face
= new Autodesk.AutoCAD.DatabaseServices.Face
(
p1,
p2,
p3,
p4,
true,
true,
true,
true
);
Autodesk.AutoCAD.DatabaseServices.Surface surface
= new Autodesk.AutoCAD.DatabaseServices.Surface();
surface.SetDatabaseDefaults();
surface
= Autodesk.AutoCAD.DatabaseServices.Surface.CreateFrom(face);
BlockTable bt = tr.GetObject(
db.BlockTableId,
OpenMode.ForRead
) as BlockTable;
BlockTableRecord modelSpaceBTR
= tr.GetObject
(
bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite
) as BlockTableRecord;
oid = modelSpaceBTR.AppendEntity(surface);
tr.AddNewlyCreatedDBObject(surface, true);
tr.Commit();
}
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Autodesk.AutoCAD.DatabaseServices.Surface surf
= tr.GetObject
(
oid,
OpenMode.ForRead
) as Autodesk.AutoCAD.DatabaseServices.Surface;
MeshFaceterData mfd = new MeshFaceterData();
mfd.FaceterMeshType = 0;
mfd.FaceterMaxEdgeLength = 0.5;
MeshDataCollection md = SubDMesh.GetObjectMesh(surf, mfd);
SubDMesh mesh = new SubDMesh();
mesh.SetDatabaseDefaults();
mesh.SetSubDMesh(md.VertexArray, md.FaceArray, 1);
BlockTable bt
= tr.GetObject
(
db.BlockTableId,
OpenMode.ForRead
) as BlockTable;
BlockTableRecord modelSpaceBTR
= tr.GetObject
(
bt[BlockTableRecord.ModelSpace],
OpenMode.ForWrite
) as BlockTableRecord;
modelSpaceBTR.AppendEntity(mesh);
tr.AddNewlyCreatedDBObject(mesh, true);
tr.Commit();
}
}

Leave a Reply to BalajiCancel reply