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);