?? compublic.cpp
字號:
/**********************************************************************************
*
* 文件: <ComPublic.cpp>
*
* 功用: 通用程序接口實(shí)現(xiàn)文件
* 環(huán)境: AutoCAD20000
* 版本: 1.0 (2002)
* 編寫: 孔繁星 2002-07-08( 09:59:59 )
*
* E-mail:kfx2002@163.com
*
***********************************************************************************/
#include "StdAfx.h"
#include "ComPublic.h"
/*##############################################
# #
# 擴(kuò)展數(shù)據(jù)函數(shù) Modify 2002.4.10 by KFX #
# #
/*##############################################*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 從RESBUF中讀取變量
//| rbSeek()
//|
//| 輸入?yún)?shù): struct resbuf *rb 鏈表
//| int id 組碼
//| 返回: struct resbuf
//| 說明: 返回鏈表
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
struct resbuf *rbSeek(struct resbuf *rb, int id)
{
if( rb == NULL) return NULL;
do
{
rb = rb->rbnext;
} while(rb && rb->restype != id);
return rb;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 從實(shí)體中讀取實(shí)體屬性擴(kuò)展數(shù)據(jù)
//| GetAppXdata()
//|
//| 輸入?yún)?shù): ads_name ent 實(shí)體名
//| char *apps 注冊應(yīng)用程序名
//| struct resbuf **entdata 返回的實(shí)體屬性鏈表
//| struct resbuf **xdata 返回的實(shí)體擴(kuò)展數(shù)據(jù)鏈表
//| 返回: BOOL
//| 說明: 鏈表
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetAppXdata(ads_name ent, char *apps, struct resbuf **entdata, struct resbuf **xdata)
{
struct resbuf *apps_rb = NULL;
apps_rb = ads_newrb(RTSTR);
if ((apps == NULL) || (apps[0] == '\0'))
apps_rb->resval.rstring = strdup("*"); //獲取所有
else
apps_rb->resval.rstring = strdup(apps);
*entdata = ads_entgetx(ent, apps_rb);
if (*entdata == NULL) {
ads_relrb(apps_rb);
return FALSE;
}
ads_relrb(apps_rb);
*xdata = *entdata;
while ((*xdata) && ((*xdata)->restype != -3))
*xdata = (*xdata)->rbnext; //找到擴(kuò)展數(shù)據(jù)標(biāo)志
if (*xdata)
*xdata = (*xdata)->rbnext; //指針移到擴(kuò)展數(shù)據(jù)頭
return TRUE;
}
void CpAdsName(ads_name Sname, ads_name &Rname)
{
Rname[0] = Sname[0];
Rname[1] = Sname[1];
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 從實(shí)體中讀取實(shí)體句柄
//| GetHandle()
//|
//| 輸入?yún)?shù): ads_name name 實(shí)體
//| char *handle 返回的句柄
//| 返回: BOOL
//| 說明: 獲取實(shí)體句柄
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetNameHandle(ads_name name,char *handle)
{
struct resbuf *rb = NULL;
rb = ads_entget(name);
if (rb == NULL) {
ads_relrb(rb);
return FALSE;
}
strcpy(handle,rbSeek(rb,5)->resval.rstring);
if (strlen(handle) == 0) {
ads_relrb(rb);
return FALSE;
}
ads_relrb(rb);
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 從實(shí)體中讀取實(shí)體句柄
//| GetHandle()
//|
//| 輸入?yún)?shù): AcDbObjectId entId 實(shí)體ID號
//| 返回: char
//| 說明: 獲取實(shí)體句柄
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char* GetIdHandle(AcDbObjectId entId)
{
char *handle;
ads_name ent;
struct resbuf *rb = NULL;
handle = (char *) malloc (10); //分配內(nèi)存空間
if (acdbGetAdsName(ent,entId) != Acad::eOk) {
ads_relrb(rb);
return " ";
}
rb = ads_entget(ent); //獲取實(shí)體鏈表
strcpy(handle,rbSeek(rb,5)->resval.rstring); //從鏈表獲取實(shí)體句柄
ads_relrb(rb);
return handle;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 獲取實(shí)體實(shí)型
//| GetEntType()
//|
//| 輸入?yún)?shù): ads_name name 實(shí)體名
//| int *type 返回實(shí)體類型
//| 返回: BOOL
//| 說明: 獲取實(shí)體實(shí)型
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetEntType(ads_name name,int *type)
{
struct resbuf *rb = NULL;
*type = 0;
rb = ads_entget(name);
if (rb == NULL) return FALSE;
if(strcmp("POINT",rbSeek(rb,0)->resval.rstring)==0) *type=4;
if(strcmp("LINE",rbSeek(rb,0)->resval.rstring)==0) *type=1;
if(strcmp("ARC",rbSeek(rb,0)->resval.rstring)==0) *type=2;
if((strcmp("LWPOLYLINE",rbSeek(rb,0)->resval.rstring)==0)||
(strcmp("POLYLINE",rbSeek(rb,0)->resval.rstring)==0)) *type=3;
if(strcmp("CIRCLE",rbSeek(rb,0)->resval.rstring)==0) *type=5;
ads_relrb(rb);
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 從直線實(shí)體中返回兩個端點(diǎn)
//| GetLineEP()
//|
//| 輸入?yún)?shù): ads_name ent 直線實(shí)體名
//| ads_point bp
//| ads_point ep
//| 返回: BOOL
//| 說明: 填加擴(kuò)展數(shù)據(jù)
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetLineEP(ads_name entName,ads_point poStart,ads_point poEnd)
{
struct resbuf *rb1 = NULL;
rb1 = ads_entget(entName);
if (rb1 == NULL) return FALSE;
if(!strcmp("LINE",rbSeek(rb1,0)->resval.rstring)==0)
return FALSE; //判斷是否為直線
Cpoint(poStart,rbSeek(rb1,10)->resval.rpoint);
Cpoint(poEnd,rbSeek(rb1,11)->resval.rpoint);
ads_relrb(rb1);
return(1);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 獲取屏幕高度
//| GetScreenH()
//|
//| 輸入?yún)?shù):
//| 返回: double
//| 說明:
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
double GetScreenH()
{
double screen_h;
struct resbuf rb;
ads_getvar("VIEWSIZE", &rb);
screen_h = rb.resval.rreal;
return screen_h;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 填加擴(kuò)展數(shù)據(jù)
//| AddXdata()
//|
//| 輸入?yún)?shù): AcDbObjectId ObjId 實(shí)體的ID
//| struct resbuf *rb1 注入的擴(kuò)展數(shù)據(jù)鏈表
//| 返回: BOOL
//| 說明: 填加擴(kuò)展數(shù)據(jù)
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL AddXdata(AcDbObjectId ObjId, struct resbuf *rb1)
{
AcDbObject *pObj;
if (acdbOpenObject(pObj, ObjId, AcDb::kForWrite) != Acad::eOk){
ads_printf("\n警告: 添加擴(kuò)展數(shù)據(jù)時(shí), 無法打開實(shí)體對象!\n");
return FALSE;
}
if (pObj->setXData(rb1) != Acad::eOk){
ads_printf("\n警告: 添加擴(kuò)展數(shù)據(jù)時(shí)出錯!\n");
pObj->close();
return FALSE;
}
pObj->close();
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 將給定的實(shí)體編成組
//| MakeGroup()
//|
//| 輸入?yún)?shù): AcDbObjectIdArray& objIds 成組的實(shí)體ID號
//| char* pGroupName 組名
//| 返回: BOOL
//| 說明: 將給定的實(shí)體編成組
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL MakeGroup(AcDbObjectIdArray& objIds, char* pGroupName)
{
AcDbGroup *pGroup = new AcDbGroup(pGroupName);
for (int i = 0; i < objIds.length(); i++) {
pGroup->append(objIds[i]); //將所有實(shí)體填加進(jìn)組
}
AcDbDictionary *pGroupDict;
if (acdbCurDwg()
->getGroupDictionary(pGroupDict, AcDb::kForWrite) != Acad::eOk) {
ads_printf("\n錯誤:獲取組字典出錯!\n");
return FALSE;
}
AcDbObjectId pGroupId;
pGroupDict->setAt(pGroupName, pGroup, pGroupId);
pGroupDict->close();
pGroup->close();
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 將結(jié)果緩沖區(qū)數(shù)據(jù)寫入擴(kuò)展記錄
//| SetXRecord()
//|
//| 輸入?yún)?shù): char *SXRecordName 對象字典記錄名
//| struct resbuf *eb 注入對應(yīng)的數(shù)據(jù)鏈表
//| 返回: BOOL
//| 說明: 肖老師提供
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL SetXRecord(CString strDictName, CString SXRecordName, struct resbuf *eb) {
//1.獲取數(shù)據(jù)庫中指向有名對象字典的指針
struct resbuf *rbTmp;
AcDbDictionary *pNamedObj;
if (acdbCurDwg()->
getNamedObjectsDictionary(pNamedObj, AcDb::kForRead) != Acad::eOk) {
return FALSE;
}
//2.建立一個新的對象字典,并加入有名對象字典中
AcDbDictionary *pDict;//定義對象字典指針
pDict = new AcDbDictionary;
AcDbObjectId DictId;
if (pNamedObj->has(strDictName) == TRUE) {
if (pNamedObj->getAt(strDictName, (AcDbObject * &)pDict,
AcDb::kForWrite) != Acad::eOk) {
pNamedObj->close(); //關(guān)閉有名對象字典
return FALSE;
}
pDict->upgradeOpen();
}
else{
if (pNamedObj->upgradeOpen() != Acad::eOk) {
//將對象字典的讀方式轉(zhuǎn)為寫方式
pNamedObj->close(); //關(guān)閉有名對象字典
return FALSE;
}
if (pNamedObj->setAt(strDictName, pDict, DictId) != Acad::eOk){
pNamedObj->close(); //關(guān)閉有名對象字典
return FALSE;
}
}
pNamedObj->close(); //關(guān)閉有名對象字典
AcDbXrecord *pXrec = new AcDbXrecord;
AcDbObjectId XrecordObjectId;
if (pDict->setAt(SXRecordName, pXrec, XrecordObjectId) != Acad::eOk){
pDict->close(); //關(guān)閉對象字典
return FALSE;
}
pDict->close(); //關(guān)閉對象字典
rbTmp = eb;
//3.寫入結(jié)果緩沖區(qū)數(shù)據(jù)
if (pXrec->setFromRbChain(*rbTmp) != Acad::eOk){
pXrec->close(); //關(guān)閉擴(kuò)展記錄
return FALSE;
}
pXrec->close(); //關(guān)閉擴(kuò)展記錄
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 從擴(kuò)展記錄中,讀取數(shù)據(jù)到結(jié)果緩沖區(qū)
//| GetXRecord()
//|
//| 輸入?yún)?shù): char *SXRecordName 對象字典記錄名
//| struct resbuf **eb 讀出對應(yīng)的數(shù)據(jù)鏈表
//| 返回: BOOL
//| 說明: 肖老師提供
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetXRecord(CString strDictName, CString SXRecordName, struct resbuf **eb) {
//1.獲取數(shù)據(jù)庫中指向有名對象字典的指針
AcDbDictionary *pNamedObj;
if (acdbCurDwg()->
getNamedObjectsDictionary(pNamedObj, AcDb::kForRead) != Acad::eOk) {
return FALSE;
}
//2.獲取指向ASDK_DICT的字典指針
AcDbDictionary *pDict; //定義對象字典指針
AcDbObjectId DictId;
if (pNamedObj->getAt(strDictName, (AcDbObject* &) pDict,
AcDb::kForRead) != Acad::eOk) {
pNamedObj->close(); //關(guān)閉有名對象字典
return FALSE;
}
pNamedObj->close(); //關(guān)閉有名對象字典
AcDbXrecord *pXrec;
if (pDict->getAt(SXRecordName, (AcDbObject* &) pXrec,
AcDb::kForRead) != Acad::eOk) {
pDict->close(); //關(guān)閉對象字典
return FALSE;
}
pDict->close(); //關(guān)閉對象字典
if (pXrec->rbChain(eb) != Acad::eOk) {
pXrec->close(); //關(guān)閉擴(kuò)展記錄
return FALSE;
}
pXrec->close(); //關(guān)閉擴(kuò)展記錄
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函數(shù)名: 刪除指定擴(kuò)展記錄
//| DelXRecord()
//|
//| 輸入?yún)?shù): char *SXRecordName 對象字典記錄名
//| 返回: BOOL
//| 說明: 肖老師提供
//| 舉例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL DelXRecord(CString strDictName, CString SXRecordName){
//1.獲取數(shù)據(jù)庫中指向有名對象字典的指針
AcDbDictionary *pNamedObj;
if (acdbCurDwg()->
getNamedObjectsDictionary(pNamedObj, AcDb::kForRead) != Acad::eOk) {
return FALSE;
}
//2.獲取指向ASDK_DICT的字典指針
AcDbDictionary *pDict;//定義對象字典指針
AcDbObjectId DictId;
if (pNamedObj->getAt(strDictName, (AcDbObject* &) pDict, AcDb::kForWrite) != Acad::eOk){
pNamedObj->close();//關(guān)閉有名對象字典
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -