CyberChaos(さいばかおす)

プログラミング言語、トランスパイラ、RPA、ChatGPT、データマイニング、リバースエンジニアリングのための忘備録

C++を使ったCAAでCATIAのチャットボット式自動直線・円弧描画AIプログラム

2025-02-11 21:17:47 | C / Visual C++
CATIA V5のCAA(Component Application Architecture)を使用して、対話式の自動直線描画プログラムまたは自動円弧描画プログラムを作成するためのサンプルコードを以下に示します。このプログラムは、ユーザーに操作を尋ね、円または直線を描画します。

---

### 前提条件
1. **CAA開発環境**: CATIA V5のCAA SDKがインストールされ、開発環境がセットアップされていること。
2. **CATIA V5**: CATIA V5がインストールされ、実行可能な状態であること。
3. **C++コンパイラ**: CAAに対応したC++コンパイラ(Visual Studioなど)が利用可能であること。

---

### サンプルコード

```cpp
#include <iostream>
#include <string>
#include "CATIAApplication.h"
#include "CATDocument.h"
#include "CATPart.h"
#include "CATSketch.h"
#include "CAT2DCircle.h"
#include "CAT2DLine.h"
#include "CAT2DCoordinate.h"

// ユーザーに円または直線を選択させる関数
std::string getUserChoice() {
std::string choice;
std::cout << "何をしますか? (円または直線): ";
std::cin >> choice;
return choice;
}

// 円を描画する関数
void drawCircle(CATPart* pPart) {
double centerX, centerY, radius;
std::cout << "中心のX座標を入力してください: ";
std::cin >> centerX;
std::cout << "中心のY座標を入力してください: ";
std::cin >> centerY;
std::cout << "半径を入力してください: ";
std::cin >> radius;

// 2D座標を作成
CAT2DCoordinate center(centerX, centerY);

// 円を作成
CAT2DCircle* pCircle = NULL;
HRESULT hr = pPart->Create2DCircle(center, radius, &pCircle);
if (FAILED(hr)) {
std::cerr << "円の作成に失敗しました。" << std::endl;
return;
}

std::cout << "円が描画されました。" << std::endl;
}

// 直線を描画する関数
void drawLine(CATPart* pPart) {
double startX, startY, endX, endY;
std::cout << "始点のX座標を入力してください: ";
std::cin >> startX;
std::cout << "始点のY座標を入力してください: ";
std::cin >> startY;
std::cout << "終点のX座標を入力してください: ";
std::cin >> endX;
std::cout << "終点のY座標を入力してください: ";
std::cin >> endY;

// 2D座標を作成
CAT2DCoordinate start(startX, startY);
CAT2DCoordinate end(endX, endY);

// 直線を作成
CAT2DLine* pLine = NULL;
HRESULT hr = pPart->Create2DLine(start, end, &pLine);
if (FAILED(hr)) {
std::cerr << "直線の作成に失敗しました。" << std::endl;
return;
}

std::cout << "直線が描画されました。" << std::endl;
}

int main() {
// CATIAアプリケーションの初期化
CATIAApplication* pApplication = NULL;
HRESULT hr = ::CoInitialize(NULL);
hr = pApplication->Initialize("CATIA.Application");

if (FAILED(hr)) {
std::cerr << "CATIAアプリケーションの初期化に失敗しました。" << std::endl;
return -1;
}

// 新しいパートドキュメントを作成
CATDocument* pDocument = NULL;
hr = pApplication->Documents->Add("Part", &pDocument);
if (FAILED(hr)) {
std::cerr << "新しいパートドキュメントの作成に失敗しました。" << std::endl;
return -1;
}

CATPart* pPart = NULL;
hr = pDocument->GetPart(&pPart);
if (FAILED(hr)) {
std::cerr << "パートの取得に失敗しました。" << std::endl;
return -1;
}

// ユーザーに操作を選択させる
std::string choice = getUserChoice();

if (choice == "円") {
drawCircle(pPart);
} else if (choice == "直線") {
drawLine(pPart);
} else {
std::cerr << "無効な選択です。" << std::endl;
}

// ドキュメントを保存
hr = pDocument->SaveAs("C:\\Path\\To\\Your\\File.CATPart");
if (FAILED(hr)) {
std::cerr << "ドキュメントの保存に失敗しました。" << std::endl;
return -1;
}

// クリーンアップ
pApplication->Quit();
::CoUninitialize();

return 0;
}
```

---

### コードの説明
1. **ユーザー入力**: `getUserChoice` 関数で、ユーザーに円または直線を選択させます。
2. **円の描画**: `drawCircle` 関数で、ユーザーから中心座標と半径を入力させ、円を描画します。
3. **直線の描画**: `drawLine` 関数で、ユーザーから始点と終点の座標を入力させ、直線を描画します。
4. **CATIAの初期化**: CATIAアプリケーションを初期化し、新しいパートドキュメントを作成します。
5. **ドキュメントの保存**: 描画結果をCATPartファイルとして保存します。

---

### 実行手順
1. **CAA開発環境**: Visual StudioなどのC++開発環境でプロジェクトを作成し、CAAのヘッダーファイルとライブラリを設定します。
2. **コードのコンパイル**: 上記のコードをコンパイルします。
3. **CATIAの起動**: プログラムを実行すると、CATIAが起動し、ユーザーに操作を尋ねます。
4. **描画**: ユーザーが円または直線を選択し、必要なパラメータを入力すると、CATIA上に図形が描画されます。

---

### 注意点
- このコードは、CAAのAPIを使用してCATIA V5と連携します。CAAのAPIは非常に広範で、詳細なドキュメントはDassault Systèmesの公式ドキュメントを参照してください。
- エラーハンドリングやユーザー入力の検証は、実際の環境に合わせて強化してください。
- パスの指定やファイルの保存場所は、実際の環境に合わせて調整してください。

このサンプルコードを基に、CATIA V5の対話式自動描画プログラムを開発できます。

C++を使ったCATIA CAAで直方体から三角錐をくり抜くプログラムの例

2025-02-11 21:04:15 | C / Visual C++
CATIA V5は、Dassault Systèmesが提供する3D CADソフトウェアで、CAA (Component Application Architecture) というオープンアーキテクチャ・フレームワークを提供しています。CAAを使用することで、C++でCATIA V5の機能を拡張する独自のアプリケーションを開発することができます。

以下は、CAAを使用して、任意の直方体から任意の三角錐をくり抜くプログラムの例です。この例では、CATIA V5のAPIを使用して、直方体と三角錐を作成し、ブーリアン操作を行います。

### 前提条件
- CATIA V5がインストールされていること。
- CAA開発環境がセットアップされていること。
- CAAのヘッダーファイルとライブラリが利用可能であること。

### サンプルコード

```cpp
#include "CATIAApplication.h"
#include "CATDocument.h"
#include "CATPart.h"
#include "CATBody.h"
#include "CATGeoFactory.h"
#include "CATTopData.h"
#include "CATPrism.h"
#include "CATBox.h"
#include "CATBooleanOperation.h"

int main(int argc, char* argv[])
{
// CATIAアプリケーションの初期化
CATIAApplication* pApplication = NULL;
HRESULT hr = ::CoInitialize(NULL);
hr = pApplication->Initialize("CATIA.Application");

if (FAILED(hr))
{
std::cerr << "Failed to initialize CATIA application." << std::endl;
return -1;
}

// 新しいパートドキュメントを作成
CATDocument* pDocument = NULL;
hr = pApplication->Documents->Add("Part", &pDocument);
if (FAILED(hr))
{
std::cerr << "Failed to create a new part document." << std::endl;
return -1;
}

CATPart* pPart = NULL;
hr = pDocument->GetPart(&pPart);
if (FAILED(hr))
{
std::cerr << "Failed to get the part from the document." << std::endl;
return -1;
}

// ジオメトリファクトリの取得
CATGeoFactory* pFactory = NULL;
hr = pPart->GetGeoFactory(&pFactory);
if (FAILED(hr))
{
std::cerr << "Failed to get the geometry factory." << std::endl;
return -1;
}

// 直方体の作成
CATBox* pBox = NULL;
hr = pFactory->CreateBox(100.0, 50.0, 30.0, &pBox);
if (FAILED(hr))
{
std::cerr << "Failed to create a box." << std::endl;
return -1;
}

// 三角錐の作成
CATPrism* pPrism = NULL;
hr = pFactory->CreatePrism(3, 50.0, 50.0, &pPrism);
if (FAILED(hr))
{
std::cerr << "Failed to create a prism." << std::endl;
return -1;
}

// ブーリアン操作(直方体から三角錐をくり抜く)
CATBooleanOperation* pBooleanOp = NULL;
hr = pFactory->CreateBooleanOperation(pBox, pPrism, CATBooleanOperationType::CATSubtract, &pBooleanOp);
if (FAILED(hr))
{
std::cerr << "Failed to perform boolean operation." << std::endl;
return -1;
}

// 結果をパートに追加
CATBody* pResultBody = NULL;
hr = pBooleanOp->GetResult(&pResultBody);
if (FAILED(hr))
{
std::cerr << "Failed to get the result body." << std::endl;
return -1;
}

hr = pPart->AddBody(pResultBody);
if (FAILED(hr))
{
std::cerr << "Failed to add the result body to the part." << std::endl;
return -1;
}

// ドキュメントを保存
hr = pDocument->SaveAs("C:\\Path\\To\\Your\\File.CATPart");
if (FAILED(hr))
{
std::cerr << "Failed to save the document." << std::endl;
return -1;
}

// クリーンアップ
pApplication->Quit();
::CoUninitialize();

return 0;
}
```

### 説明
1. **CATIAアプリケーションの初期化**: `CATIAApplication` オブジェクトを作成し、CATIA V5アプリケーションを初期化します。
2. **新しいパートドキュメントの作成**: 新しいパートドキュメントを作成し、パートオブジェクトを取得します。
3. **ジオメトリファクトリの取得**: パートからジオメトリファクトリを取得します。
4. **直方体と三角錐の作成**: `CATBox` と `CATPrism` を使用して、直方体と三角錐を作成します。
5. **ブーリアン操作**: `CATBooleanOperation` を使用して、直方体から三角錐をくり抜きます。
6. **結果の保存**: 結果をパートに追加し、ドキュメントを保存します。

### 注意点
- このコードは、CAAのAPIを使用しており、CATIA V5の環境で動作します。
- パスの指定やエラーハンドリングは、実際の環境に合わせて調整してください。
- CAAのAPIは非常に広範で、詳細なドキュメントはDassault Systèmesの公式ドキュメントを参照してください。

このサンプルコードは、CAAを使用してCATIA V5で3Dモデルを操作する基本的な例です。実際の開発では、より複雑な操作やカスタマイズが必要になる場合があります。