外壳是可能连接且可能具有孔的面的列表。外壳由唯一顶点数、顶点列表 ()、面数 () 和面列表指定,面列表由给定面中的点数后跟该面的每个顶点的顶点列表中的索引组成。函数的签名是: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 对多边形或壳面进行三角化可能会在内存和速度方面产生高昂的成本,因此建议您在壳中使用三边或四边来构建具有五个或更多边的面或多边形。这样,基元就不会通过慢速三角测量器步骤。 注意:
三角测量器仅用于五个边或更多边的多边形、五个边或更多边的壳面、带孔的壳面和填充文本。 给定面中的顶点必须是共面的。人脸之间没有隐含的连接。 外壳的边缘数据按面列表所隐含的顺序列出。例如,在第一个面中,vertex0 到 vertex1 指定第一条边,vertex1 到 vertex2 指定第二条边,依此类推,直到面的最后一个顶点连接到第一个顶点,如下所示。 如果在两个不同的面中使用相同的边,则属性可能会发生冲突。在这种情况下,可以将其中一个边设置为不可见,或使每个边的属性匹配。 人脸数据的顺序(如果存在)遵循外壳的人脸列表的顺序。 下面是一个外壳示例,其中颜色数据附加到边缘和面,可见性数据附加到边缘。壳由两个位于不同平面上的三角形组成,它们共享一条共同的边。公共边具有轮廓可见性。这意味着,当 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; } 对象包含单个标志,用于指定外壳中顶点的排序方式。使用以下函数设置和查询此标志:AcGiVertexData virtual void AcGiVertexData::setOrientationFlag( const AcGiOrientationType oflag); virtual AcGiOrientationType AcGiVertexData::orientationFlag() const; 此标志不用于网格,因为指定网格的顶点顺序是固定的。标志的值为
壳体面列表中顶点的方向指示面的可见侧。例如,如果将顶点指定为顺时针,并且给定面的顶点按顺时针顺序列出,则该面可见。在这种情况下,顶点按逆时针顺序排列的面是不可见的。 |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-1-8 19:20
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.