err = acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pLayerTable, AcDb::kForRead);
if (err!= Acad::eOk)
return err;
// Get the ID of the layer with the name that str
// contains.
//
err = pLayerTable->getAt(str, id, Adesk::kTrue);
pLayerTable->close();
return err;
}
Примитивы
С сетью и примитивами оболочки, Вы можете определить черты для граней, лиц, или вершины в дополнение к основной геометрии. Следующие секции иллюстрируют использование этих примитивов.
Сеть
Сеть - эффективный способ сохранить parametrically прямоугольную сетку вершины. Геометрия для сети определена как число строк, число столбцов, и списка вершины, в порядке строки:
virtual Adesk::Boolean
AcGiWorldGeometry::mesh(
const Adesk::UInt32 rows,
const Adesk::UInt32 columns,
const AcGePoint3d* pVertexList,
const AcGiEdgeData* pEdgeData = NULL,
const AcGiFaceData* pFaceData = NULL,
const AcGiVertexData* pVertexData = NULL) const = 0;
Mesh() функция имеет три необязательных параметра для присоединяющихся данных свойства к граням, лицам, или вершине. Для граней в сети, Вы можете прикреплять цвет, уровень, linetype, GS маркер, и свойства видимости. Например, Вы могли использовать AcGiEdgeData:: setColors () чтобы прикрепить различный цвет к каждому краю сети. В цветном списке, сначала перечисляют цвета для всех граней строки, тогда цвета для всех граней столбца. Следующее рисунок показывает упорядочение данных свойства края для типовой сети:

Следующий типовой код создает сеть и назначает цвета, использующие данные края и данные лица. Это создает сеть " четыре четыре " с голубыми строками и зелеными столбцами.
Adesk::Boolean
AsdkMeshSamp::worldDraw(AcGiWorldDraw* pW)
{
Adesk::UInt32 i, j, k;
Adesk::UInt32 numRows = 4;
Adesk::UInt32 numCols = 4;
AcGePoint3d *pVerts =
new AcGePoint3d[numRows * numCols];
for (k = 0, i = 0; i < numRows; i++) {
for (j = 0; j < numCols; j++, k++) {
pVerts[k].x = (double)j;
pVerts[k].y = (double)i;
pVerts[k].z = 0.;
}
}
// Construct an array of colors to be applied to each
// edge of the mesh. In this example, the rows are cyan and
// the columns are green.
//
AcGiEdgeData edgeInfo;
Adesk::UInt32 numRowEdges = numRows * (numCols - 1);
Adesk::UInt32 numColEdges = (numRows - 1) * numCols;
Adesk::UInt32 numEdges = numRowEdges + numColEdges;
short *pEdgeColorArray = new short[numEdges];
for (i = 0; i < numEdges; i++) {
pEdgeColorArray[i] =
i < numRowEdges? kCyan : kGreen;
}
edgeInfo. setColors(pEdgeColorArray);
// Make the first face transparent and the rest
// different colors.
//
Adesk::UInt32 numFaces = (numRows - 1)
* (numCols - 1);
Adesk::UInt8 *pFaceVisArray =
new Adesk::UInt8[numFaces];
short *pFaceColorArray = new short[numFaces];
AcGiFaceData faceInfo;
faceInfo. setVisibility(pFaceVisArray);
for (i = 0; i < numFaces; i++) {
pFaceVisArray[i] =
i? kAcGiVisible : kAcGiInvisible;
pFaceColorArray[i] = (short)(i + 1);
}
faceInfo. setColors(pFaceColorArray);
// If the fill type is kAcGiFillAlways, then a shell,
// mesh, or polygon will be interpreted as faces;
// otherwise, they will be interpreted as edges.
//
// Output mesh as faces.
//
pW->subEntityTraits().setFillType(kAcGiFillAlways);
pW->geometry().mesh(numRows, numCols, pVerts, NULL, &faceInfo);
// Output mesh as edges over the faces.
//
pW->subEntityTraits().setFillType(kAcGiFillNever);
pW->geometry().mesh(numRows, numCols, pVerts, &edgeInfo);
delete [] pVerts;
delete [] pEdgeColorArray;
delete [] pFaceColorArray;
delete [] pFaceVisArray;
return Adesk::kTrue;
}
Для лиц в сети, Вы можете прикреплять цвет, уровень, GS маркер, нормаль, и черты видимости. Чтобы назначать свойства на лица в сети, Вы перечисляете значения для лиц в порядке строк, как обозначено следующим рисунком:

Данные Вершины для сети перечислены в том же самом порядке как в списке вершины. Свойства, которые могут быть установлены с AcGiVertexData - нормали и ориентация.
Видимость
AcGiEdgeData и классы AcGiFaceData позволяют Вам определять тип видимости для граней или лиц в примитиве оболочки или сети. Должен иметься точно один вход видимости в массиве для каждого края или лица в примитиве.
Прохождение в массиве неправильного размера вызывает непредсказуемых результатов.
Тип видимости для граней и лиц, AcGiVisibility, может иметь одно из следующих значений:
§ kAcGiInvisible
§ kAcGiVisible
§ kAcGiSilhouette
Если поверхность не изогнута, или край не требован для рассмотрения целей, определять kAcGiInvisible. Для жестких граней поверхностных или видимых складок, определите kAcGiVisible. Для граней или лиц, которые Вы можете видеть от некоторых точек зрения, определите kAcGiSilhouette. Тип видимости силуэта признан только командой HIDE; иначе, это интерпретируется как kAcGiVisible.
Например, в твердом цилиндре, показанном ниже, грани, которые формируются, оправы цилиндра - видимые грани. Грани latitudinal - невидимые грани, так как они никогда не используются для рассмотрения целей. Продольные грани - грани силуэта, так как они используются, когда цилиндр рассматривается от некоторых углов.

Оболочка (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;
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


