您的位置:首页 > 其它

获取Civil 3D 三角网曲面TinSurface中每个小三角形的法向量

2013-01-24 18:53 423 查看
Civil3D2012以后版本提供的曲面的.netAPI,通过.netAPI可以获得TinSurface的所有三角形(TinSurfaceTriangle)信息,包含顶点(Vertex)和边(Edge)。但TinSurfaceTriangle对象没有提供表示该三角形法向量(normal)的函数方法,下面自己来实现一个。思路的利用小三角形的顶点信息构建一个AutoCAD的plane实体,进而获取法向量:

Vector3dGetNormal(TinSurfaceTriangletriangle)
{
Point3dpoint1=triangle.Vertex1.Location;
Point3dpoint2=triangle.Vertex2.Location;
Point3dpoint3=triangle.Vertex3.Location;

Vector3dnormal;
using(Planeplan=newPlane(
point1,
point1.GetVectorTo(point2),
point1.GetVectorTo(point3)))
{
normal=plan.Normal.GetNormal();
};

returnnormal;
}
另一种方法:
Vector3dGetNormal2(TinSurfaceTriangletriangle)
{
Point3dpoint1=triangle.Vertex1.Location;
Point3dpoint2=triangle.Vertex2.Location;
Point3dpoint3=triangle.Vertex3.Location;

Vector3dv1=point1.GetVectorTo(point2).GetNormal();
Vector3dv2=point1.GetVectorTo(point3).GetNormal();

Vector3dnormal=v2.CrossProduct(v1).GetNormal();

returnnormal;
}
下面是对曲面操作的一个测试函数:
[CommandMethod("PrintSurfaceInfo")]
publicvoidPrintSurfaceInfo()
{

ObjectIdsurfaceId=ObjectId.Null;

do
{
surfaceId=this.PromptForTinSurface();
}
while(surfaceId==ObjectId.Null);

Databasedb=CurrentEditor.Document.Database;
using(Transactiontrans=db.TransactionManager.StartTransaction())
{
TinSurfacesurface=trans.GetObject(surfaceId,OpenMode.ForRead)asTinSurface;

inttriCount=surface.Triangles.Count;

StringBuildermsg=newStringBuilder();
msg.Append("\nSurfacetrianglecount:"+triCount.ToString());
foreach(TinSurfaceTriangletriinsurface.Triangles)
{
msg.Append(GetTriangleInfo(tri));
}

CurrentEditor.WriteMessage(msg.ToString());
}
}

stringGetTriangleInfo(TinSurfaceTriangletriangle)
{
StringBuildersb=newStringBuilder();
sb.Append("\n");
sb.Append("\nPoint1:"+triangle.Vertex1.Location.ToString());
sb.Append("\nPoint2:"+triangle.Vertex2.Location.ToString());
sb.Append("\nPoint3:"+triangle.Vertex3.Location.ToString());
sb.Append("\nNormal:"+GetNormal2(triangle).ToString());

returnsb.ToString();
}

Vector3dGetNormal(TinSurfaceTriangletriangle)
{
Point3dpoint1=triangle.Vertex1.Location;
Point3dpoint2=triangle.Vertex2.Location;
Point3dpoint3=triangle.Vertex3.Location;

Vector3dnormal;
using(Planeplan=newPlane(
point1,
point2.GetVectorTo(point1),
point3.GetVectorTo(point1)))
{
normal=plan.Normal;
};

returnnormal;
}

ObjectIdPromptForTinSurface()
{
stringpromptMsg="\nSelectaTinSurface";
stringrejectMsg="\nThesurfaceyouselectedisnotTinSurface";
PromptEntityOptionsopts=newPromptEntityOptions(promptMsg);
opts.SetRejectMessage(rejectMsg);
opts.AddAllowedClass(typeof(TinSurface),false);
PromptEntityResultentRes=CurrentEditor.GetEntity(opts);
if(entRes.Status==PromptStatus.OK)
{
returnentRes.ObjectId;
}
returnObjectId.Null;
}

CivilDocumentCivilDoc{
get{
returnCivilApplication.ActiveDocument;
}
}

EditorCurrentEditor{
get{
returnApplication.DocumentManager.MdiActiveDocument.Editor;
}
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: