ObjectARX_選擇集

acedEntSel 函數只能選擇一個實體,有時候不能知足用戶的需求,而選擇集容許用戶同時選擇多個圖形對象,也提供了豐富的手段用來選擇符合特定條件的實體。數組

頭文件<acedads.h>緩存

(1)建立選擇集函數

acedSSGet 函數的定義形式爲:ui

int acedSSGet (const char *str,const void *pt1,const void *pt2,const struct resbuf *entmask,ads_name ss);

第一個參數:str:建立選擇集的方法; 第二個參數:pt1:第三個參數:pt2:爲相關的建立方式提供了點參數,若是不須要指定能夠輸入 NULL 做爲參數值;第四個參數:entmask:選擇實體的過濾條件;第五個參數:ss:選擇集的圖元名。指針

頭文件:<acedads.h>rest

具體用法如例:code

//圖形中全部的圓
struct resbuf rb;
char sbuf[10];  // 存儲字符串的緩衝區
ads_name ssname;

rb.restype = 0;  // 實體名
strcpy(sbuf, "CIRCLE");
rb.resval.rstring = sbuf;
rb.rbnext = NULL; // 不須要設置其餘的屬性

acedSSGet("X", NULL, NULL, &rb, ssname);

acedSSFree(ssname);


// 選擇0圖層上的全部直線
struct resbuf *rb; // 結果緩衝區鏈表 
ads_name ssname; 

rb = acutBuildList(RTDXF0, "LINE", 8, "0",RTNONE);

acedSSGet("X", NULL, NULL, rb, ssname);

acutRelRb(rb);//釋放結果緩存區鏈表
acedSSFree(ssname);

結果緩衝區resbuf:對象

struct resbuf {
  struct resbuf * rbnext;//鏈表指針
  short restype;//數據類型碼或XDF組碼
  union ads_u_val resval;數據
};

第二個參數:restype:數據類型碼blog

聯合體ads_u_val:字符串

union ads_u_val {
  ads_real rreal;
  ads_real rpoint[3];
  short rint;
  ACHAR * rstring;
  __int64 rlname[2];
  __int64 mnLongPtr;
  long rlong;
  __int64 mnInt64;
  struct ads_binary rbinary;
  unsigned char ihandle[8];
};

acutBuildList(建立結果緩存區鏈表)的參數成對組成,第一個參數標識過濾器的類型(例如對象) ,第二個參數指定要過濾的值(例如圓) 。(0:對象類型(字符串) ,例如「Line」 、 「Arc」等(在標準的 DXF 組碼中,0 用於表示實體類型,可是在 acutBuildList 函數中 0 也能夠用於表示結束鏈表,所以用 RTDXF0 來代替 0。)。1:圖元的主文字值(字符串) ,例如文字、屬性的字符串內容。2:對象名(字符串) ,例如屬性標記、塊名等。8:圖層名 。10:主要點(直線或文字圖元的起點、圓的圓心等) ,用三個實數的數組來表示三維點。60:對象可見性(整數) ,0 表示可見,1 表示不可見。62: 顏色編號 (整數) , 可取 0~256 的整數值, 其中 0 表示 ByBlock, 256 表示 ByLayer。67:模型/圖紙空間標識符(整數) ,0(默認)表示在模型空間,1 表示在圖紙空間。1000:擴展數據中的 ASCII 字符串,最多能夠包含 255 個字節。1001:擴展數據的註冊應用程序名,最多能夠包含 31 個字節的 ASCII 字符串。1003:擴展數據圖層名。)

選擇集的具體用法:

void ZffCHAP5SelectEnt()
{
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;

// 若是已經選擇到了實體,就得到當前的PICKFIRST選擇集
// 不然提示用戶選擇實體
acedSSGet(NULL, NULL, NULL, NULL, ssname);

// 若是存在,就得到當前的PickFirst選擇集
acedSSGet("I", NULL, NULL, NULL, ssname);

// 選擇最近建立的選擇集
acedSSGet("P", NULL, NULL, NULL, ssname);

// 選擇最後一次建立的可見實體
acedSSGet("L", NULL, NULL, NULL, ssname);

// 選擇經過點(5,5)的全部實體
acedSSGet(NULL, pt2, NULL, NULL, ssname);

// 選擇位於角點(0,0)和(5,5)組成的窗口內全部的實體
acedSSGet("W", pt1, pt2, NULL, ssname);

// 選擇被指定的多邊形包圍的全部實體
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,RTPOINT, pt3, RTPOINT, pt4, 0);
acedSSGet("WP", pointlist, NULL, NULL, ssname);

// 選擇與角點(0,0)和(5,5)組成的區域相交的全部實體
acedSSGet("C", pt1, pt2, NULL, ssname);

// 選擇與指定多邊形區域相交的全部實體
acedSSGet("CP", pointlist, NULL, NULL, ssname);
acutRelRb(pointlist);

// 選擇與選擇欄相交的全部對象
pt4[Y] = 15.0; 
pt4[Z] = 0.0;
pointlist = acutBuildList(RTPOINT, pt1, RTPOINT, pt2,RTPOINT, pt3, RTPOINT, pt4, 0);
acedSSGet("F", pointlist, NULL, NULL, ssname);

acutRelRb(pointlist);
acedSSFree(ssname);
}

(2)添加到已經存在的選擇集

acedSSAdd 函數的定義形式爲:

int acedSSAdd(const ads_name ename, const ads_name sname, ads_name result);

第一個參數:ename:要添加到選擇集的實體的圖元名;第二個參數:sname:選擇集的圖元名;第三個參數:result:被建立或者更新的選擇集。(1.若是 ename 和 sname 都是空指針,則建立一個未包含任何成員的選擇集。2.若是 ename 指向一個有效的實體,但 sname 是空指針,則建立一個選擇集,該選擇集僅包含一個成員 ename。3.若是 ename 指向有效的實體,且 sname 指向有效的選擇集,則將 ename 所指向的實體添加到 sname 所指向的選擇集中。)

(3)刪除選擇集

acedSSDel 函數的定義形式爲:

int acedSSDel(const ads_name ename, const ads_name ss);

第一個參數:ename:要從選擇集中刪除的實體;第二個參數:所操做的選擇集。

(4)獲取選擇集中實體個數

acedSSLength函數的定義形式爲:

int acedSSLength(const ads_name sname, long * len);

第一個參數:sname:選擇集的圖元名,第二個參數:len:選擇集中含有的實體個數.

(5)獲取選擇集特定位置的實體

acedSSName函數的定義形式爲:

int acedSSName(const ads_name ss, long i, ads_name entres);

第一個參數:ss:選擇集的圖元名,第二個參數:i:實體在選擇集中的位置,第三個參數:entres:實體名

具體用法如例:

ads_name ssname;
ads_name ent;
long len = 0;
//獲取選擇集
acedSSGet(NULL,NULL,NULL,NULL,ssname);
//獲取選擇集的長度
if(RTNORM == acedSSLength(ssname,&len))
{
//遍歷選擇集
for(int i = 0; i < len; i++)
{
//獲取實體名
acedSSName(ssname,i,ent);
//其餘處理ent函數
}
}
//釋放選擇集
acedSSFree(ssname);
相關文章
相關標籤/搜索