Rengaでの3Dマウス統合

みなさんこんにちは! 私は、 BIMシステムを開発するRenga Software (ASCONと1Cのジョイントベンチャー)で働いています。RengaArchitecture-建築および構造設計、およびRenga Structure-建物および構造の構造部分の設計です。



この記事では、3DマウスをRengaシステムに統合した経験を共有したいと思います。

画像



Renga製品ファミリーの詳細(注意マーケティング!)
Renga Architecture-建築設計のためのシステム。 このプログラムは、設計者がタスクを解決する際に最大限の支援を提供するために作成されました。建物の建築外観、情報モデル、SPDSなどの標準に準拠した図面の迅速なレイアウトを作成します。



Renga Structure-建物/構造の構造部分を設計するためのシステム。 構造エンジニアおよび設計者が建物または構造の情報モデルを作成し、KR / KZh / KZhI / KM / ASブランドの図面を取得するためのプログラム。



Renga製品ファミリは 、BIM技術設計向けに設計されています。 高いシステムパフォーマンスにより、3Dモデルの作業品質を目に見えて低下させることなく、大規模なプロジェクトで作業できます。



オブジェクト設計

オブジェクト設計ツール(壁、柱、窓など)を使用したRengaの建物/構造の3Dモデルの作成



チームワーク

Exchangeストレージとデータ管理は、BIM-Server Pilotを使用して実行されます

推定システムとの相互作用

設計部門と推定部門の相互作用のための、推定システム1C推定およびABC推定によるAPIによるRengaの統合。



データ交換

Rengaでは、さまざまな形式(.ifc、.dwg、.dxf、.obj、.dae、.stl、.3ds、.lwo、および.csv)を介して他のシステムとデータを交換できます。



仕様とステートメントの自動化

Rengaには、仕様、ステートメント、および説明を生成するためのレポート機能があります。



図面の自動化

3Dモデルによると、ビュー(ファサード、セクション、および計画)は自動的に取得され、指定された縮尺で図面に配置されます。





3Dマニピュレーターは、ユーザーが3次元空間で直感的なナビゲーションを提供し、同時に両手で作業できるようにするソフトウェアとの対話の手段です。 3Dマニピュレータを実装した設計エンジニアと企業は、目覚しいパフォーマンスの向上を報告しています。



この記事では、3Donnnexionの3Dマウスに焦点を当てます。 これはどのように見えるかです(インターネットからの写真):



画像



3Dマウスには6自由度があります。X、Y、Z軸に沿った変位と、それぞれ軸、Roll、Pitch、Yawの周りの回転です。



画像



マウスの自由度:



画像



3DConnnexionは、3Dマウスをアプリケーションに統合するSDKを提供します。 登録後にメーカーのウェブサイトからダウンロードできます。



3DマウスをQt5ベースのアプリケーションに統合する方法を紹介します。

Visual Studioの新規プロジェクトウィザードを使用して、簡単なQtアプリケーションを作成します。



3Dマウスを使用するには、SDKからいくつかのヘッダーファイルを含める必要があります。



// Mouse 3D stuff #include <spwmacro.h> /* Common macros used by SpaceWare functions. */ #include <si.h> /* Required for any SpaceWare support within an app.*/ #include <siapp.h> /* Required for siapp.lib symbols */ #include "virtualkeys.hpp"
      
      





マウスが機能するためには、マウスがメッセージを送信するウィンドウのハンドルを渡す必要があります。 マウスの初期化コードを書きます。 次のようになります。



 bool init3DMouse() { SiOpenData oData; /*init the SpaceWare input library */ if (SiInitialize() == SPW_DLL_LOAD_ERROR) return false; SiOpenWinInit(&oData, (HWND)winId()); /* init Win. platform specific data */ SiSetUiMode(mouse3DHandle, SI_UI_ALL_CONTROLS); /* Config SoftButton Win Display */ /* open data, which will check for device type and return the device handle to be used by this function */ if ( (mouse3DHandle = SiOpen ("HabrahabrAnd3DMouse", SI_ANY_DEVICE, SI_NO_MASK, SI_EVENT, &oData)) == NULL) { SiTerminate(); /* called to shut down the SpaceWare input library */ return false; /* could not open device */ } else { return true; /* opened device succesfully */ } }
      
      





これで、マウスがアプリケーションに接続され、ウィンドウのメッセージループにメッセージが送信されます。 マウスからのメッセージの構造は次のとおりです。



 typedef struct /* 3DxWare event */ { int type; /* Event type */ union { SiSpwData spwData; /* Button, motion, or combo data */ SiSpwOOB spwOOB; /* Out of band message */ SiOrientation spwOrientation; /* Which hand orientation is the device */ char exData[SI_MAXBUF]; /* Exception data. Driver use only */ SiKeyboardData spwKeyData; /* String for keyboard data */ SiSyncPacket siSyncPacket; /* GUI SyncPacket sent to applications */ SiHWButtonData hwButtonEvent; /* V3DKey that goes with * * SI_BUTTON_PRESS/RELEASE_EVENT */ SiAppCommandData appCommandData; /* Application command event function data that * * goes with an SI_APP_EVENT event */ SiDeviceChangeEventData deviceChangeEventData; /* Data for connecting/disconnecting devices */ SiCmdEventData cmdEventData; /* V3DCMD_* function data that * * goes with an SI_CMD_EVENT event */ } u; } SiSpwEvent;
      
      





イベントのタイプ-SiSpwEvent :: typeに興味があります。 また、 SiSpwData :: spwData-押されたボタン、軸に沿った移動および回転に関する情報があります。



私たちのタスクは、マウスからのメッセージをフィルタリングすることです。 これを行うには、クラスをイベントフィルターとして設定します。 QAbstractNativeEventFilterを見て、nativeEventFilter関数をオーバーライドしましょう。



 bool HabrahabrAnd3DMouse::nativeEventFilter(const QByteArray &eventType, void *msg, long *) { if(!mouse3DHandle) return false; MSG* winMSG = (MSG*)msg; bool handled = SPW_FALSE; SiSpwEvent Event; /* SpaceWare Event */ SiGetEventData EData; /* SpaceWare Event Data */ /* init Window platform specific data for a call to SiGetEvent */ SiGetEventWinInit(&EData, winMSG->message, winMSG->wParam, winMSG->lParam); /* check whether msg was a 3D mouse event and process it */ if (SiGetEvent (mouse3DHandle, SI_AVERAGE_EVENTS, &EData, &Event) == SI_IS_EVENT) { if (Event.type == SI_MOTION_EVENT) { qDebug() << "delta by X coordinate = " << Event.u.spwData.mData[SI_TX] << "\n"; qDebug() << "delta by Y coordinate = " << Event.u.spwData.mData[SI_TY] << "\n"; qDebug() << "delta by Z coordinate = " << Event.u.spwData.mData[SI_TZ] << "\n"; qDebug() << "delta by Yaw = " << Event.u.spwData.mData[SI_RX] << "\n"; qDebug() << "delta by Pitch = " << Event.u.spwData.mData[SI_RY] << "\n"; qDebug() << "delta by Roll = " << Event.u.spwData.mData[SI_RZ] << "\n"; } else if (Event.type == SI_ZERO_EVENT) { // ZERO event } else if (Event.type == SI_BUTTON_EVENT) { // misc button events } handled = SPW_TRUE; /* 3D mouse event handled */ } return handled; }
      
      





これで、マウスとアプリケーションの接続が完了しました。 完全なサンプルコードへのリンク



All Articles