Оболочка (Shell)
Оболочка - список лиц, которые могли бы быть связаны и могут иметь отверстия в них.
Оболочка определена числом уникальной вершины, список вершины (pVertexList), число лиц (faceListSize), и списка лица, который состоит из числа точек в данном лице, сопровождаемом индексом в списке вершины каждой вершины для того лица. Cигнатура для Shell () функция
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;
Отрицательный индекс вершины указывает отверстие в оболочке. Отверстия должны быть в том же самом плане как лицо, в котором они постоянно находятся. Отверстия не должны коснуться друг друга и должны быть полностью внутри содержащего лица. Оболочка () функция - дорогостоящая операция, потому что это требует использования триангуляции, чтобы ломать{*нарушить*} содержащее лицо и отверстия вниз в составляющие треугольники.
AcGi многоугольники и оболочки с лицами пять или большим количеством сторон также разрушены в треугольники прежде, чем послались, чтобы быть отображенным. Наличие AcGi триангулирует многоугольник, или лицо оболочки может быть дорогостоящее в терминах памяти и скорости, так что это рекомендует, чтобы Вы использовали три - или четыре - sided лица в оболочках, чтобы создать лица или многоугольники с пять или большее количество сторон. Тем путем, примитив не будет помещен через медленный шаг триангуляции.
ОБРАТИТЕ ВНИМАНИЕ, что триангуляция используется только на многоугольниках пяти сторон или больше, лица оболочки пяти сторон или больше, лица оболочки с отверстиями, и заполнена текст.
Вершина в данном лице должна быть компланарна. Не имеется никакой подразумеваемой связности между лицами.
Данные Края для оболочки перечислены в порядке, подразумеваемом списком лица. Например, в первом лице, vertex0 к vertex1 определяет, первый край, vertex1 к vertex2 определяет второй край, и так далее до последней вершины лица, которое соединяется с первой вершиной, как показано ниже.
Если тот же самый край используется в двух различных лицах, свойства могут находиться в противоречии. В таких случаях, Вы можете заставлять одну из граней быть невидимыми или делать соответствие свойств для каждого края.
Порядок данных лица, если есть, следует за упорядочением списка лица для оболочки.
Следующее - пример оболочки с цветными данными, приложенными к граням и стоит и данным видимости, приложенным к граням. Оболочка составлена из двух треугольников в различных планах, которые совместно используют общий край. Общий край имеет видимость силуэта. Это означает, что, когда команда HIDE - в действительности и переменная AutoCAD DISPSILH равняется 1 (силуэты дисплея включены), общий край между лицами оттянут только, если оба лица в области просмотра находятся на той же самой стороне общего края. В этом случае, одно лицо - позади другой, так что это не рисует:
Adesk::Boolean
AsdkShellSamp::worldDraw(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 two faces.
//
Adesk::UInt32 faceListSize = 8;
Adesk::Int32 *pFaceList
= new Adesk::Int32[faceListSize];
// Assign vertices for face 1.
//
pFaceList[0] = 3; // Three 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; // Three 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 the common edge
// between two faces have silhouette visibility during
// the HIDE command with AutoCAD 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(AcGiOrientationType oflag);
virtual AcGiOrientationType
AcGiVertexData::orientationFlag() const;
Этот флажок не используется для сетей, потому что упорядочение вершины, определяющей сеть установлено. Значения для флажка
§ kAcGiClockwise
§ kAcGiCounterClockwise
§ kAcGiNoOrientation
Ориентация вершины в списке лица оболочки указывает видимую сторону лица. Например, если вершина определена как, по часовой стрелке и вершина для данного лица перечислена в по часовой стрелке порядке, то то лицо видимо. В этом случае, лица с вершиной в против часовой стрелки порядке невидимы.