KOMPAS-3D APIを操作する→レッスン8→タイトルブロックに書き込むためのより複雑なメソッド

VNII Signal JSCのソフトウェアエンジニアであるKOMPAS-3D CAD API Sergey Norseevの使用に関する一連の記事を続けています。DelphiでのKOMPASのアプリケーション開発の著者です。 使用される環境はC ++ Builderです。 一連の記事の第4部で、主な碑文を使用した作業を既に検討しました。 この記事では、タイトルブロックに書き込むためのより複雑な手法を検討します。 しかし、最初に、多くの新しいインターフェースに慣れる必要があります。







レッスンシリーズ「COMPASS-3D APIの操作」の内容



1. 基本

2. 図面デザイン

3. COMPASSへの正しい接続

4. 主な碑文

5. グラフィックプリミティブ

6. ドキュメントをさまざまな形式で保存する

7. 設定を知る

8. タイトルブロックに書き込むより複雑な方法



動的配列( ksDynamicArray



KOMPASシステムの動的配列は、 ksDynamicArrayインターフェイスによって記述されます。 KompasObjectインターフェイスのGetDynamicArrayメソッドを使用して取得できます。 唯一のパラメーターとして、配列の整数型を取ります。これは、配列に格納される要素の型を決定します。 原則として、他のインターフェイスがそこに保存されます。 多くの配列があるので、すべての可能なタイプの配列を提供するわけではありません。



ksDynamicArrayインターフェースにプロパティ 1つしかありません。 reference-インターフェイスへのポインター。 インターフェイスメソッドを検討します。



ksAddArrayItem-配列に要素を追加します。 以下は、このメソッドのプロトタイプです。



long ksAddArrayItem ( long index, //   LPDISPATCH item //  );
      
      





indexパラメーターは、新しい要素を挿入する前の要素のシリアル番号を設定します。 要素には最初から番号が付けられます。 このパラメーターの値が-1の場合、新しい要素が配列の最後に挿入されます。



成功した場合、このメソッドは値1を返し、エラーの場合はゼロを返します



ksClearArray() -配列のすべての要素を削除しますが、配列自体は削除しません。 入力パラメーターはありません。 成功した場合は1を返し、エラーの場合はゼロを返します



ksDeleteArray() -配列を削除します。 配列が空でない場合、その要素はすべて自動的に削除されます。 入力パラメーターはありません。 成功した場合は1を返し、エラーの場合はゼロを返します



ksExcludeArrayItem-配列要素を削除します。 削除されたアイテムのインデックスを唯一のパラメーターとして使用します。 成功の場合は1を返し、エラーの場合はゼロを返します



ksGetArrayCount() -配列内の要素の数を返します。



ksGetArrayItem-配列の指定された要素を返します。 以下は、このメソッドのプロトタイプです。



 long ksGetArrayItem ( long index, //   LPDISPATCH item //  );
      
      





indexパラメーターは、要求された配列要素のシーケンス番号を設定します(番号は最初から付けられます)。



itemパラメーターには、配列の読み取り可能な要素が書き込まれるインターフェイスが含まれます。 このインターフェイスのタイプは、配列のタイプによって異なります。



成功した場合、 ksGetArrayItemメソッドは1を返し、エラーの場合はゼロを返します 。 注:要求されたアイテムは、 アイテムパラメータで返されます。



ksGetArrayType() -配列のタイプを返します。



ksSetArrayItem-指定された配列要素を変更します。 以下は、このメソッドのプロトタイプです。



 long ksSetArrayItem( long index, //   LPDISPATCH item //  );
      
      





itemパラメーターには、インデックス番号indexを持つ要素の場所に書き込まれたインターフェイスが含まれます (番号は最初から付けられます)。 このインターフェイスのタイプは、配列のタイプによって異なります。



成功した場合、 ksSetArrayItemメソッドは1を返し、エラーの場合はゼロを返します



文字列パラメーター( ksTextLineParam



ksTextLineParamインターフェースは、テキストの行を記述します。 KompasObjectインターフェースのGetParamStructメソッドを使用して取得できます。 そのためには、定数ko_TextLineParam29 )を唯一のパラメーターとしてこのメ​​ソッドに渡す必要があります。 ksTextLineParamインターフェースにプロパティ 1つしかありません

スタイル -テキストスタイル(サイクルの次の記事で説明します)。



ksTextLineParamインターフェースのメソッドを検討してください。 それらは3つだけです。



GetTextItemArr() - ksTextItemParamインターフェイスの動的配列( ksDynamicArray )を返します。 この配列のタイプはTEXT_ITEM_ARR4 )です。



Init() -すべてのインターフェイスプロパティをリセットします。 成功した場合、 trueを返します



SetTextItemArr - ksTextItemParamインターフェイスの動的配列を設定します。 配列を唯一のパラメーターとしてインストールする必要があります( ksDynamicArrayインターフェース)。 成功した場合はtrueを返し、エラーの場合はfalseを返します



この説明から、 ksTextLineParamインターフェースが本質的にksTextItemParamインターフェースの動的配列のラッパーであることが容易にわかります。



例1



以下は、 ksTextLineParamインターフェイスを使用してタイトルブロックに入力する方法を示すプログラムの例です。



 //     TextItemParamPtr TextItemParam; TextItemParam = (TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); TextLineParamPtr TextLineParam; TextLineParam = (TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); //    DynamicArrayPtr DynamicArray; DynamicArray = (DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); //    StampPtr Stamp; Stamp = (StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); //   TextItemParam->set_s(SysAllocString(L"")); DynamicArray->ksAddArrayItem(-1, TextItemParam); TextLineParam->SetTextItemArr(DynamicArray); //     Stamp->ksColumnNumber(ksStPartNumber); Stamp->ksTextLine(TextLineParam); //     DynamicArray->ksClearArray(); //     TextItemParam->set_s(SysAllocString(L" ")); DynamicArray->ksAddArrayItem(-1, TextItemParam); //     TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(51); DynamicArray->ksAddArrayItem(-1, TextItemParam); //     TextItemParam->set_type(0);; TextItemParam->set_s(SysAllocString(L" ")); DynamicArray->ksAddArrayItem(-1, TextItemParam); //      TextLineParam->SetTextItemArr(DynamicArray); Stamp->ksColumnNumber(ksStMaterial); Stamp->ksTextLine(TextLineParam); //     Stamp->ksCloseStamp();
      
      





この例を単純化するために、KOMPASへの接続、ドキュメントの作成と処理、およびリソースの解放を担当するコードは省略されました(これらの問題は、シリーズの以前の記事で議論されました)。 次の図は、このプログラムによって形成されるメインラベルを示しています。







いくつかの点に注意してください。



1.この例では、 KompasObjectインターフェースからksDynamicArrayインターフェースを取得します。 しかし、 ksTextLineParamインターフェイスから取得するのを妨げるものは何もありません。 さらに、 ksDynamicArrayインターフェースがGetTextItemArray()メソッドによって取得された場合 、配列はすでにksTextLineParamインターフェースに関連付けられているため、 SetTextItemArrayメソッドを呼び出すことはできません。



2.セル番号を示すために、定数ksStPartNumberおよびksStMaterialを使用します。 これらの定数は、最も頻繁に使用されるセルに対してKOMPASによって導入されます。 KOMPASのドキュメントの「パラメーター構造と定数/定数/設計オブジェクトの定数/ ksStampEnum-スタンプセルの識別子」セクションでそれらをよく理解できます。



3.タイトルブロックに行を書き込むには、 ksStampインターフェイスのksTextLineメソッドを使用します。 同じ方法がサイクルの4番目の部分で使用され、 ksTextItemParamインターフェイスを調べました。 このメソッドは、パラメーターとしてksTextLineParamインターフェースとより単純なksTextItemParamの両方を取ることができます。



4.タイトルブロックに2行入力します。 最初の行は単純で、1つのコンポーネントのみで構成されています。 2行目は3つのコンポーネントで構成されています。 次の図では、垂直の赤い線で区切られています。 原則として、最後の2つのコンポーネントを1つにまとめることができます。 しかし、 ksTextLineParamインターフェースがどのように機能するかをより明確に示すために、3つのコンポーネントを使用しました。







KsSetStampColumnTextメソッド



ksStampインターフェイスのksSetStampColumnTextメソッドは、指定されたタイトルブロックセルにテキストを設定します。 以下は、このメソッドのプロトタイプです。



 long ksSetStampColumnText ( long numb, //  LPDISPATCH textArr //  );
      
      





設定されたテキストは、動的配列ksDynamicArrayとして設定されます。 成功した場合、 ksSetStampColumnTextメソッドは1を返し、エラーの場合はゼロを返します



ksSetStampColumnTextメソッドタイトルブロックの編集モードでのみ使用されることに注意してください。 つまり、 ksOpenStamp()メソッドを呼び出した後、 ksStampインターフェイスのksCloseStamp()メソッドを呼び出す前です。



textArr配列のタイプはTEXT_LINE_ARR3 )です。 これは、配列の要素がksTextLineParamインターフェースであり、それぞれに動的配列も含まれているが、すでにksTextItemParamインターフェースが含まれていることを意味します。 次の図は、 textArrパラメーターの構造を示しています。









上の図の配列要素の数は3つですが、実際には任意の数にすることができます。 textArr配列が複数の要素で構成されている場合、すべてのksTextLineParam接着されて無感覚なセルに表示されます。



例2



以下は、 ksSetStampColumnTextメソッドを使用してタイトルブロック入力する方法を示すプログラムの例です。



 //     TextItemParamPtr TextItemParam; TextItemParam = (TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam); TextLineParamPtr TextLineParam; TextLineParam = (TextLineParamPtr)kompas->GetParamStruct(ko_TextLineParam); //    ksTextItemParam DynamicArrayPtr DynamicArrayItems; DynamicArrayItems = (DynamicArrayPtr)kompas->GetDynamicArray(TEXT_ITEM_ARR); DynamicArrayItems->ksClearArray(); //    ksTextLineParam DynamicArrayPtr DynamicArrayLines; DynamicArrayLines = (DynamicArrayPtr)kompas->GetDynamicArray(TEXT_LINE_ARR); DynamicArrayLines->ksClearArray(); //    StampPtr Stamp; Stamp = (StampPtr)Document2D->GetStamp(); //     Stamp->ksOpenStamp(); //   TextItemParam->set_s(SysAllocString(L"")); DynamicArrayItems->ksAddArrayItem(-1, TextItemParam); TextLineParam->SetTextItemArr(DynamicArrayItems); //     DynamicArrayLines->ksAddArrayItem(-1, TextLineParam); //     Stamp->ksSetStampColumnText(ksStPartNumber, DynamicArrayLines); //     DynamicArrayLines->ksClearArray(); DynamicArrayItems->ksClearArray(); //     TextItemParam->set_s(SysAllocString(L" ")); DynamicArrayItems->ksAddArrayItem(-1, TextItemParam); //     TextItemParam->Init(); TextItemParam->set_type(SPECIAL_SYMBOL); TextItemParam->set_iSNumb(51); DynamicArrayItems->ksAddArrayItem(-1, TextItemParam); //     TextItemParam->set_type(0); TextItemParam->set_s(SysAllocString(L" ")); DynamicArrayItems->ksAddArrayItem(-1, TextItemParam); //    TextLineParam->SetTextItemArr(DynamicArrayItems); DynamicArrayLines->ksAddArrayItem(-1, TextLineParam); //      Stamp->ksSetStampColumnText(ksStMaterial, DynamicArrayLines); //     Stamp->ksCloseStamp();
      
      





このプログラムの結果は、前の例の結果に似ています。

注意:行が書き込まれるセルの番号はすでにksSetStampColumnTextメソッドに渡されているため、 ksColumnNumberメソッドを呼び出す必要はありません。



おわりに



タイトルブロックセルに文字列を記述する3つの方法を検討しました。ksTextItemParamインターフェイス( 記事シリーズの第4部で説明 )、 ksTextLineParamインターフェイス、およびksSetStampColumnTextメソッドを使用します。



最初の方法が最も簡単です。 動的配列を操作する必要はありません。 行を書くのに最適です。 これを使用して、複雑な文字列を形成することもできます。 これを行うには、制御文字が使用されます。これについては、サイクルの次の記事で説明します。

2番目のメソッド( ksTextLineParamインターフェイス)は、最初のメソッドほど複雑ではありません。 3番目のメソッドでは、 ksTextLineParamインターフェイスも使用されます。 したがって、3番目の方法を理解するには、理解する必要があります。



3番目のメソッド( ksSetStampColumnTextメソッド)は実装が最も困難です。 最初の2つのメソッドに対する唯一の本当の利点は、 ksColumnNumberメソッドを呼び出す必要がないことです。 ただし、このメソッドで使用されるアプローチは、タイトルブロックのセルの内容を読み取るときに使用されます(サイクルの次の記事で詳しく説明します)。



これらの方法のいずれかを使用できます。 個人的には、通常は最初のものを使用します。



継続するには、ブログのニュースに従ってください。



Sergey Norseev、「DelphiでのCOMPASのアプリケーション開発」の著者。



All Articles