壳
shell 是可能连接的面列表,其中可能有孔。shell 由唯一顶点数、顶点列表 ()、面数 () 和面列表指定,面列表由给定面中的点数后跟该面的每个顶点的顶点列表中的索引组成。该函数的签名为:pVertexListfaceListSizeshell() virtual Adesk::Boolean AcGiWorldGeometry::shell( const Adesk::UInt32 nbVertex, const AcGePoint3d* pVertexList, const Adesk::UInt32 faceListSize, const Adesk::Int32* pFaceList, const AcGiEdgeData* pEdgeData = NULL, const AcGiFaceData* pFaceData = NULL, const AcGiVertexData* pVertexData = NULL const struct resbuf* pResBuf = NULL) const = 0; 负顶点计数表示壳体上有孔。孔必须与孔所在的面位于同一平面上。孔不得相互接触,并且必须完全位于包含面内。该功能是一项成本高昂的操作,因为它需要使用三角测量仪将包含面和孔分解为组件三角形。shell() 具有五条或更多边的面的 AcGi 多边形和壳在发送以供显示之前也会被分解为三角形。让 AcGi 对多边形或壳面进行三角测量在内存和速度方面可能代价高昂,因此建议您在壳中使用三边形或四边形来构建具有五条或更多边的面或面。这样,基元就不会通过缓慢的三角测量器步骤。 注意:
三角测量器仅用于五边或更多边的多边形、五条边或更多边的壳面、带孔的壳面和填充文本。 给定面中的顶点必须是共面的。人脸之间没有隐含的连通性。 shell 的边数据按面列表隐含的顺序列出。例如,在第一个面中,vertex0 到 vertex1 指定第一条边,vertex1 到 vertex2 指定第二条边,依此类推,直到面的最后一个顶点连接到第一个顶点,如下所示。 ![]() 如果在两个不同的面中使用相同的边,则属性可能会发生冲突。在这种情况下,可以将其中一条边设置为不可见,或者使每个边的属性匹配。 人脸数据的顺序(如果存在)遵循 shell 的人脸列表的顺序。 下面是将颜色数据附加到边和面以及将可见性数据附加到边的壳的示例。壳由不同平面中的两个三角形组成,它们共享一条共同的边。公共边缘具有剪影可见性。这意味着,当 HIDE 命令生效且 AutoCAD 变量 DISPSILH 等于 1(显示侧面影像处于打开状态)时,仅当视口中的两个面位于公共边的同一侧时,才会绘制面之间的公共边。在这种情况下,一张脸在另一张脸后面,因此不会绘制: Adesk::Boolean
AsdkShellSamp::subWorldDraw(AcGiWorldDraw* pW)
{
// Fill the faces with the current color.
//
pW->subEntityTraits().setFillType (kAcGiFillAlways);
// Create vertices.
//
Adesk::UInt32 numVerts = 4;
AcGePoint3d *pVerts = new AcGePoint3d[numVerts];
pVerts[0] = AcGePoint3d (0.0, 0.0, 0.0);
pVerts[1] = AcGePoint3d(0.0, 1.0, 0.0);
pVerts[2] = AcGePoint3d(1.0, 1.0, 0.0);
pVerts[3] = AcGePoint3d(1.0, 0.0, 2.0);
// Create 2 faces.
//
Adesk::UInt32 faceListSize = 8;
Adesk::Int32 *pFaceList
= new Adesk::Int32[faceListSize];
// Assign vertices for face #1.
//
pFaceList[0] = 3; // 3 vertices in the face
pFaceList[1] = 0; // pVerts[0]
pFaceList[2] = 1; // pVerts[1]
pFaceList[3] = 2; // pVerts[2]
// assign vertices for face #2.
//
pFaceList[4] = 3; // 3 vertices in the face
pFaceList[5] = 0; // pVerts[0]
pFaceList[6] = 2; // pVerts[2]
pFaceList[7] = 3; // pVerts[3]
// Apply colors to edges.
//
AcGiEdgeData edgeData;
int numEdges = 6;
short *pEdgeColorArray = new short[numEdges];
pEdgeColorArray[0] = kRed;
pEdgeColorArray[1] = kYellow;
pEdgeColorArray[2] = kGreen;
pEdgeColorArray[3] = kCyan;
pEdgeColorArray[4] = kBlue;
pEdgeColorArray[5] = kMagenta;
edgeData.setColors(pEdgeColorArray);
// Apply visibility to edges and make common edge
// between two faces have silhouette visibility during
// the HIDE command with ACAD variable DISPSILH = 1.
//
Adesk::UInt8 *pEdgeVisArray
= new Adesk::UInt8[numEdges];
edgeData.setVisibility(pEdgeVisArray);
pEdgeVisArray[0] = kAcGiVisible;
pEdgeVisArray[1] = kAcGiVisible;
pEdgeVisArray[2] = kAcGiSilhouette;
pEdgeVisArray[3] = kAcGiSilhouette;
pEdgeVisArray[4] = kAcGiVisible;
pEdgeVisArray[5] = kAcGiVisible;
// Apply colors to faces.
//
AcGiFaceData faceData;
int numFaces = 2;
short *pFaceColorArray = new short [numFaces];
pFaceColorArray[0] = kBlue;
pFaceColorArray[1] = kRed;
faceData.setColors(pFaceColorArray);
pW->geometry().shell (numVerts, pVerts, faceListSize,
pFaceList, &edgeData, &faceData);
delete [] pVerts;
delete [] pFaceList;
delete [] pEdgeColorArray;
delete [] pFaceColorArray;
return Adesk::kTrue;
}
对象包含一个标志,该标志指定 shell 中顶点的排序方式。使用以下函数设置和查询此标志:AcGiVertexData virtual void AcGiVertexData::setOrientationFlag( const AcGiOrientationType oflag); virtual AcGiOrientationType AcGiVertexData::orientationFlag() const; 此标志不用于网格,因为指定网格的顶点的顺序是固定的。标志的值为
壳的面列表中折点的方向指示面的可见面。例如,如果顶点指定为顺时针方向,并且给定面的顶点按顺时针顺序列出,则该面是可见的。在这种情况下,顶点按逆时针顺序排列的面是不可见的。 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-10-29 09:41
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.