Drawings SDK: エンティティの押し出し

この記事では、OdDbSubDMesh オブジェクトに適用できる押し出し機能について説明します。

1つまたは複数のサブエンティティ(頂点、エッジ、面)を特定の方向と長さに押し出すには、extrudeConnectedFaces() メソッドを使用します。

OdResult OdDbSubDMesh::extrudeConnectedFaces (const OdDbFullSubentPathArray & subentPaths, double length, const OdGeVector3d & dir, double taper)

このメソッドは、サブエンティティの配列、押し出しの長さ、および方向を受け入れます。テーパーを示す角度パラメータもありますが、現在はサポートされていません。

長さパラメータは負の値も受け入れることができ、その場合、押し出しは逆方向に実行されます。ただし、これは方向ベクトルdirの長さが0の場合にのみ当てはまります。押し出しの方向を指定しない場合(kIdentityのような長さ0のベクトルを渡す場合)、各サブエンティティにはデフォルトの方向が使用されます。

  • 面 — その法線が使用されます。
  • 頂点 — 頂点座標が正の場合、対応するベクトル座標は頂点座標と押し出しの長さの合計として計算されます。頂点座標が0または負の場合、押し出しの長さは減算されます。
  • エッジ — エッジは2つの頂点間の線であるため、各頂点に対して方向がカウントされ、頂点がシフトするにつれて線が移動します。

エッジを押し出す

この例では、面の辺を押し出す方法を示します。

押し出しを開始する前に、まずメッシュを取得します。以下に、メッシュを作成するコードフラグメントを示します。

OdDbDatabasePtr pDb = pHostApp->createDatabase();
OdGePoint3dArray vertexArray;
OdInt32Array faceArray;
// fill vertices
vertexArray.setLogicalLength(18);
vertexArray[0].set(33.327391024158516, 155.94111693551429, -70.00000000000000);
vertexArray[1].set(33.327391024158501, 110.94598425745652, -53.62311101832843);
vertexArray[2].set(33.327391024158487, 87.004574224659720, -12.15537243668508);
vertexArray[3].set(33.327391024158480, 95.319338670603599, 35.000000000000036);
vertexArray[4].set(33.327391024158473, 131.99970690271749, 65.778483455013600);
vertexArray[5].set(33.327391024158473, 179.88252696831111, 65.778483455013600);
vertexArray[6].set(33.327391024158480, 216.56289520042500, 34.999999999999993);
vertexArray[7].set(33.327391024158487, 224.87765964636884, -12.15537243668512);
vertexArray[8].set(33.327391024158501, 200.93624961357204, -53.62311101832845);
vertexArray[9].set(27.927391024158510, 155.94111693551429, -70.00000000000000);
vertexArray[10].set(27.927391024158496, 200.93624961357204, -53.62311101832845);
vertexArray[11].set(27.927391024158485, 224.87765964636884, -12.15537243668512);
vertexArray[12].set(27.927391024158474, 216.56289520042500, 34.999999999999993);
vertexArray[13].set(27.927391024158464, 179.88252696831111, 65.778483455013600);
vertexArray[14].set(27.927391024158464, 131.99970690271749, 65.778483455013600);
vertexArray[15].set(27.927391024158474, 95.319338670603599, 35.000000000000036);
vertexArray[16].set(27.927391024158485, 87.004574224659720, -12.15537243668509);
vertexArray[17].set(27.927391024158496, 110.94598425745652, -53.62311101832843);

// fill faces
faceArray.setLogicalLength(45);
faceArray[0] = 4;   faceArray[1] = 0;   faceArray[2] = 1;   faceArray[3] = 17;   faceArray[4] = 9;
faceArray[5] = 4;   faceArray[6] = 1;   faceArray[7] = 2;   faceArray[8] = 16;   faceArray[9] = 17;
faceArray[10] = 4;  faceArray[11] = 2;  faceArray[12] = 3;  faceArray[13] = 15;  faceArray[14] = 16;
faceArray[15] = 4;  faceArray[16] = 3;  faceArray[17] = 4;  faceArray[18] = 14;  faceArray[19] = 15;
faceArray[20] = 4;  faceArray[21] = 4;  faceArray[22] = 5;  faceArray[23] = 13;  faceArray[24] = 14;
faceArray[25] = 4;  faceArray[26] = 5;  faceArray[27] = 6;  faceArray[28] = 12;  faceArray[29] = 13;
faceArray[30] = 4;  faceArray[31] = 6;  faceArray[32] = 7;  faceArray[33] = 11;  faceArray[34] = 12;
faceArray[35] = 4;  faceArray[36] = 7;  faceArray[37] = 8;  faceArray[38] = 10;  faceArray[39] = 11;
faceArray[40] = 4;  faceArray[41] = 8;  faceArray[42] = 0;  faceArray[43] = 9;   faceArray[44] = 10;

// Open the Block Table Record
OdDbBlockTableRecordPtr bBTR = pDb->getModelSpaceId().safeOpenObject(OdDb::kForWrite);
// Create a SubDMesh
OdDbSubDMeshPtr pSubDMesh = OdDbSubDMesh::createObject();
pSubDMesh->setDatabaseDefaults(bBTR->database());
pSubDMesh->setSubDMesh(vertexArray, faceArray, 0);
bBTR->appendOdDbEntity(pSubDMesh);

結果のメッシュを以下に示します。

 

initial mesh

 

ここで、面がZ軸に沿って距離10だけ押し出されます。選択された面を以下に示します。

 

direction



次の画像は詳細をより詳しく示しており、矢印は押し出しの方向を示しています。


OdDbFullSubentPathArray subentPaths;
double dLength(10.);
OdGeVector3d vecDir(OdGeVector3d::kZAxis);
double dTaper(0.);
pSubDMesh->getSubentPathsAtGsMarker(OdDb::kEdgeSubentType, 2, OdGePoint3d(), OdGeMatrix3d(), subentPaths);
OdResult res = pSubDMesh->extrudeConnectedFaces(subentPaths.at(0), dLength, vecDir, dTaper);

操作が正常に完了すると、押し出されたエッジを持つメッシュが得られます。

 

extruded

 

ここでは、選択されたエッジが10単位上に移動していることがわかります。実際、このエッジの始点と終点を表す2つの点がZ軸に沿って10単位シフトしています。この例では、kZAxisが方向ベクトルとして使用されており、その長さは0ではないため、dLengthが正か負かは問題になりません。しかし、代わりにkIdentityが使用された場合、dLengthの符号が重要になります。

面を押し出す

OdDbSubDMesh::extrudeConnectedFaces() メソッドを使用すると、面だけでなく他のサブエンティティも押し出すことができます。この例では、以前に示した元のメッシュのいくつかの面を押し出す方法を示します。

元のメッシュの他のすべての面を押し出すには、次のコードを使用できます。


OdDbFullSubentPathArray subentPaths;
double dLength(10.);
double dTaper(0.);
OdGeVector2dArray arrNorms;
pSubDMesh->getSubentPath(-1, OdDb::kFaceSubentType, subentPaths);
for (int i = 0; i < subentPaths.length(); i+=2)
{
OdGePlane gePlane;
pSubDMesh->getFacePlane(subentPaths.at(i).subentId(), gePlane);
OdDbFullSubentPathArray subentCurr(1);
subentCurr.append(subentPaths.at(i));
OdResult res = pSubDMesh->extrudeConnectedFaces(subentCurr, dLength, gePlane.normal(), dTaper);
}

押し出された面の結果を以下に示します。

 

face 1

 

ここでは各面が個別に押し出されていることに注意してください。必要なすべての面を配列に入れ、この方法で押し出しを実行すると、結果は異なります(以下を参照)。

OdDbFullSubentPathArray subentPaths, subentPathsToExtrude;
double dLength(10.);
double dTaper(0.);
OdGeVector2dArray arrNorms;
pSubDMesh->getSubentPath(-1, OdDb::kFaceSubentType, subentPaths);
for (int i = 0; i < subentPaths.length(); i += 2) {
subentPathsToExtrude.append(subentPaths.at(i));
}
OdResult res = pSubDMesh->extrudeConnectedFaces(subentPathsToExtrude, dLength, OdGeVector3d::kIdentity, dTaper);

 

extruded entities - face 2

 

このメッシュには2つの接続された面があり、この場合、押し出しによって結合された押し出し面が生成されます。これは、各面が個別に押し出され、その結果、押し出された面も別々であった前の例とは対照的です。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す