サンプル図面のダウンロード

サンプルプログラム(VBとC#)のダウンロード

サンプル図面には、0画層のポリライン、画層1、画層2、画層3には線分と円が含まれています。

ユーザーに複数図形を選択させ、選択した図形の個数を表示します。

: (setq ss(ssget))
エンティティを指定» all 27 個検出 エンティティを指定» <Selection set: 158b> : (sslength ss) 27

選択セットフィルタを使って、画層2の図形のみ選択します。

: (setq ss (ssget "X" '(( 8 . "画層2"))))
<Selection set: 163b>
: (sslength ss)
10

"X" を指定することで、ユーザー入力を行わなくなります。

フィルタは 8 は画層を意味し、画層が画層2のものすべてを選択するという意味になります。

選択セットフィルタを使って、画層3の線分のみ選択します。

: (setq ss (ssget "X" '((0 . "LINE")( 8 . "画層3"))))
<Selection set: 1688>
: (sslength ss)
5

選択セットフィルタを使って、色が ByLayer の線分を選択します。

: (setq ss (ssget "X" '((0 . "LINE")( 62 . 256))))
<Selection set: 16c1>
: (sslength ss)
23

C# で選択セットフィルタを使う

選択セットフィルタを使って、画層2の線分のみ選択します。

using System;
using Teigha.ApplicationServices;
using Teigha.DatabaseServices;
using Teigha.EditorInput;
using Teigha.Runtime;
namespace netSampleCS
{
public class Class2
{
[CommandMethod("TESTFILTER")]
public void cmdTestFilter()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor; TypedValue[] condition = { new TypedValue((int)DxfCode.Start, "LINE"), new TypedValue((int)DxfCode.LayerName, "画層2") }; SelectionFilter filter = new SelectionFilter(condition); PromptSelectionResult ret = ed.SelectAll(filter); if (ret.Status == PromptStatus.OK) ed.WriteMessage("\n{0} 個選択しました。", ret.Value.Count); else ed.WriteMessage("\n選択されません"); } } }

これをビルドして、LOADDOTNETAPPLICATION (NETLOAD) コマンドでクラスライブラリをロードして、TESTFILTERコマンドを実行します。

: TESTFILTER
9 個選択しました。

やっていることは LISP と同じです。

図面からすべての図形を選択する関数は、Editor クラスの SelectAll () 関数で、引数なしと、選択セットフィルタを引数にとる2種類があります。

選択セットフィルタは SelectionFilter クラスで、SelectionFIlter のオブジェクトを作成するには、選択セットの各項目を示す TypedValue 構造体の配列が必要です。

上の例では TypedValue の配列の初期化は静的に行っています。

VBで選択セットフィルタを使う

選択セットフィルタを使って、画層3の線分のみ選択します。

Imports Teigha.ApplicationServices
Imports Teigha.DatabaseServices
Imports Teigha.EditorInput
Imports Teigha.Runtime
Public Class Class2
<CommandMethod("TESTFILTER")> Public Sub cmdTestFilter() Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As Editor = doc.Editor Dim condition(0 To 1) As TypedValue condition(0) = New TypedValue(DxfCode.Start, "LINE") condition(1) = New TypedValue(DxfCode.LayerName, "画層3") Dim filter As New SelectionFilter(condition) Dim ret As PromptSelectionResult = ed.SelectAll(filter) If ret.Status = PromptStatus.OK Then ed.WriteMessage(vbLf + "{0} 個選択しました。", ret.Value.Count) Else ed.WriteMessage(vbLf + "選択されません") End If End Sub End Class

これをビルドして、LOADDOTNETAPPLICATION (NETLOAD) コマンドでクラスライブラリをロードして、TESTFILTERコマンドを実行します。

: netload
LOADDOTNETAPPLICATION
netSampleVB.dll のロードに成功しました
: TESTFILTER
5 個選択しました。

やっていることはLISP, C#と同じです。

C++ (CFx)で選択セットフィルタを使う

サンプルプロジェクトのダウンロード

選択セットフィルタを使って、画層2の線分のみ選択します。

int CJTTestCmd::Execute(CFxCommandContext* pCmdCtx)
{
	CFxString prompt;
	CFxDocumentPtr pDoc = pCmdCtx->GetFxDocument();
	CFxUserIO* io = pDoc->GetFxUserIO();
	OdSharedPtr<CFxSelectionSet> pSet = pDoc->CreateSelectionSet(true);
	fdt_resbufW* pFilter = FXAPI()->fdt_buildlistW(
		RTDXF0, L"LINE",
		8, L"画層2",
		RTNONE
	);
	int ret = io->DoSSGet(CFxUserIO::eFilter, pSet,0,L"",L"",pFilter); 
FXAPI()->fdt_relrbW(pFilter); if (ret == RTNORM) { prompt.format(L"%d 個選択しました。", pSet->GetLength()); io->Write(prompt); } return ret; }

これをビルドして、LOADAPPLICATION (APPLOAD) コマンドでTXファイルをロードして、JTTESTコマンドを実行します。

: JTTEST
9 個選択しました。

やっていることは、LISP,C#,VB と同じです。

ドキュメント (CFxDocument) クラスのオブジェクトから、ユーザインタフェース (CFxUserIO) クラスのオブジェクトを取得し、複数図形選択 DoSSGet() 関数を呼び出します。

図形の選択条件は、図形フィルタ pFilter 変数に用意します。

図形の選択結果は、選択セット(CFxSelectionSet) クラスのオブジェクトに入ります。

選択セットは OdSharedPtr テンプレートを使っているので、コマンド関数終了時にクリアされます。

図形フィルタは、fdt_buildlist()関数で用意し、fdt_relrbW()関数で破棄します。

回答が見つかりましたか?