[リストへもどる]
一括表示
タイトル範囲選択
記事No2200
投稿日: 2006/04/30(Sun) 18:32:44
投稿者たく
またまた、お世話になります。
久しぶりにARXに挑戦しようと思ったら、範囲選択の方法が良くわかりません。

acedGetPointで、2点を取得して
acedSSGetの第2、第3引数に2点を入れれば、できそうな気がするんですが

通常は、窓、クロス選択などの範囲選択にはどのような関数を使うのでしょうか?

よろしく、お願い致します。

タイトルRe: 範囲選択
記事No2201
投稿日: 2006/05/02(Tue) 09:43:49
投稿者WEBMASTER
> 通常は、窓、クロス選択などの範囲選択にはどのような関数を使うのでしょうか?
> 
> よろしく、お願い致します。

通常、acedSSGet() の第1引数に選択オプションを指定し、
第2・第3引数に座標、もしくは座標を格納したリザルトバッファを渡します。
選択オプションは、LISPの (SSGET) 関数と同じです。
より詳しく調べたければ、ARX デベロッパガイドを入手するといいでしょう。

以下、ObjectARX ヘルプからのサンプルの抜粋です。

ads_point pt1, pt2, pt3, pt4; 
struct resbuf *pointlist; 
ads_name ssname; 
pt1[X] = pt1[Y] = pt1[Z] = 0.0; 
pt2[X] = pt2[Y] = 5.0; pt2[Z] = 0.0; 

// Get the current PICKFIRST set, if there is one; 
// otherwise, ask the user for a general entity selection. 
acedSSGet(NULL, NULL, NULL, NULL, ssname); 
 
// Get the current PICKFIRST set, if there is one. 
acedSSGet("I", NULL, NULL, NULL, ssname); 
 
// Selects the most recently selected objects. 
acedSSGet("P", NULL, NULL, NULL, ssname); 
 
// Selects the last entity added to the database. 
acedSSGet("L", NULL, NULL, NULL, ssname); 
 
// Selects entity passing through point (5,5). 
acedSSGet(NULL, pt2, NULL, NULL, ssname); 
 
// Selects entities inside the window from (0,0) to (5,5). 
acedSSGet("W", pt1, pt2, NULL, ssname); 
 
// Selects entities enclosed by the specified polygon. 
pt3[X] = 10.0; pt3[Y] = 5.0; pt3[Z] = 0.0; 
pt4[X] = 5.0; pt4[Y] = pt4[Z] = 0.0; 
pointlist = acutBuildList(RTPOINT, pt1, RTPOINT, pt2, 
httpRTPOINT, pt3, RTPOINT, pt4, 0); 
acedSSGet("WP", pointlist, NULL, NULL, ssname); 
 
// Selects entities crossing the box from (0,0) to (5,5). 
acedSSGet("C", pt1, pt2, NULL, ssname); 
 
// Selects entities crossing the specified polygon. 
acedSSGet("CP", pointlist, NULL, NULL, ssname); 
acutRelRb(pointlist); 
 
// Selects the entities crossed by the specified fence. 
pt4[Y] = 15.0; pt4[Z] = 0.0; 
pointlist = acutBuildList(RTPOINT, pt1, RTPOINT, pt2, 
httpRTPOINT, pt3, RTPOINT, pt4, 0); 
acedSSGet("F", pointlist, NULL, NULL, ssname); 
acutRelRb(pointlist); 

The complement of acedSSGet() is acedSSFree(), which releases a 
selection set once the application has finished using it. The selection 
set is specified by name. The following code fragment uses the ads_name 
declaration from the previous example. 

acedSSFree(ssname); 

タイトルRe^2: 範囲選択
記事No2204
投稿日: 2006/05/04(Thu) 20:48:27
投稿者たく
WEBMASTERさま

レス有難うございます。 遅くなってすいません。

httpads_point Point1;
httpads_point Point2;
httpads_name ssname;
httplong nn;

httpchar Prom[] = "範囲を選択して下さい。";

httpacedGetPoint(NULL, Prom, Point1);
httpacedGetPoint(NULL, Prom, Point2);
http
httpacedSSGet("W", Point1, Point2, NULL, ssname);
httpacedSSLength(ssname, &nn);

確かに、acedSSGetで範囲内のオブジェクトを選択せきましたが、
これだと、やはりAutoCADの一般的な範囲選択時のラバーバンドは出ないんですね。

ラバーバンドを引っ張りながら、オブジェクトを選択する方法はないものでしょうか?

タイトルRe^3: 範囲選択
記事No2206
投稿日: 2006/05/05(Fri) 11:40:40
投稿者WEBMASTER
> ラバーバンドを引っ張りながら、オブジェクトを選択する方法はないものでしょうか?

質問の意味を勘違いしてみたいですね。
普通に選択するなら、領域選択したいなら以下で十分だと思います。

ads_name ssname;
acedSSGet( NULL, NULL, NULL, NULL, ssname ); 

タイトルRe^4: 範囲選択
記事No2211
投稿日: 2006/05/06(Sat) 19:01:53
投稿者たく
WABMASTERさま

有難うございました。
そうか、NULLでOKなんですね
どうもシングルセレクトだと思い込み、この状態で範囲選択が出来ないと
思い込んでいました。

要は、selectコマンドと同じなんですね。
いつも、へアクロス状態からオブジェクトを選択することが多いので、どうも
イメージが違っていました。

どうも、有難うございました。