📄 compublic.cpp
字号:
/**********************************************************************************
*
* 文件: <ComPublic.cpp>
*
* 功用: 通用程序接口实现文件
* 环境: AutoCAD20000
* 版本: 1.0 (2002)
* 编写: 孔繁星 2002-07-08( 09:59:59 )
*
* E-mail:kfx2002@163.com
*
***********************************************************************************/
#include "StdAfx.h"
#include "ComPublic.h"
/*##############################################
# #
# 扩展数据函数 Modify 2002.4.10 by KFX #
# #
/*##############################################*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 从RESBUF中读取变量
//| rbSeek()
//|
//| 输入参数: 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;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 从实体中读取实体属性扩展数据
//| GetAppXdata()
//|
//| 输入参数: ads_name ent 实体名
//| char *apps 注册应用程序名
//| struct resbuf **entdata 返回的实体属性链表
//| struct resbuf **xdata 返回的实体扩展数据链表
//| 返回: 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; //找到扩展数据标志
if (*xdata)
*xdata = (*xdata)->rbnext; //指针移到扩展数据头
return TRUE;
}
void CpAdsName(ads_name Sname, ads_name &Rname)
{
Rname[0] = Sname[0];
Rname[1] = Sname[1];
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 从实体中读取实体句柄
//| GetHandle()
//|
//| 输入参数: ads_name name 实体
//| char *handle 返回的句柄
//| 返回: BOOL
//| 说明: 获取实体句柄
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
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;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 从实体中读取实体句柄
//| GetHandle()
//|
//| 输入参数: AcDbObjectId entId 实体ID号
//| 返回: char
//| 说明: 获取实体句柄
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char* GetIdHandle(AcDbObjectId entId)
{
char *handle;
ads_name ent;
struct resbuf *rb = NULL;
handle = (char *) malloc (10); //分配内存空间
if (acdbGetAdsName(ent,entId) != Acad::eOk) {
ads_relrb(rb);
return " ";
}
rb = ads_entget(ent); //获取实体链表
strcpy(handle,rbSeek(rb,5)->resval.rstring); //从链表获取实体句柄
ads_relrb(rb);
return handle;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 获取实体实型
//| GetEntType()
//|
//| 输入参数: ads_name name 实体名
//| int *type 返回实体类型
//| 返回: BOOL
//| 说明: 获取实体实型
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
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;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 从直线实体中返回两个端点
//| GetLineEP()
//|
//| 输入参数: ads_name ent 直线实体名
//| ads_point bp
//| ads_point ep
//| 返回: BOOL
//| 说明: 填加扩展数据
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
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);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 获取屏幕高度
//| GetScreenH()
//|
//| 输入参数:
//| 返回: double
//| 说明:
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
double GetScreenH()
{
double screen_h;
struct resbuf rb;
ads_getvar("VIEWSIZE", &rb);
screen_h = rb.resval.rreal;
return screen_h;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 填加扩展数据
//| AddXdata()
//|
//| 输入参数: AcDbObjectId ObjId 实体的ID
//| struct resbuf *rb1 注入的扩展数据链表
//| 返回: BOOL
//| 说明: 填加扩展数据
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL AddXdata(AcDbObjectId ObjId, struct resbuf *rb1)
{
AcDbObject *pObj;
if (acdbOpenObject(pObj, ObjId, AcDb::kForWrite) != Acad::eOk){
ads_printf("\n警告: 添加扩展数据时, 无法打开实体对象!\n");
return FALSE;
}
if (pObj->setXData(rb1) != Acad::eOk){
ads_printf("\n警告: 添加扩展数据时出错!\n");
pObj->close();
return FALSE;
}
pObj->close();
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 将给定的实体编成组
//| MakeGroup()
//|
//| 输入参数: AcDbObjectIdArray& objIds 成组的实体ID号
//| char* pGroupName 组名
//| 返回: BOOL
//| 说明: 将给定的实体编成组
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL MakeGroup(AcDbObjectIdArray& objIds, char* pGroupName)
{
AcDbGroup *pGroup = new AcDbGroup(pGroupName);
for (int i = 0; i < objIds.length(); i++) {
pGroup->append(objIds[i]); //将所有实体填加进组
}
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;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 将结果缓冲区数据写入扩展记录
//| SetXRecord()
//|
//| 输入参数: char *SXRecordName 对象字典记录名
//| struct resbuf *eb 注入对应的数据链表
//| 返回: BOOL
//| 说明: 肖老师提供
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL SetXRecord(CString strDictName, CString SXRecordName, struct resbuf *eb) {
//1.获取数据库中指向有名对象字典的指针
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(); //关闭有名对象字典
return FALSE;
}
pDict->upgradeOpen();
}
else{
if (pNamedObj->upgradeOpen() != Acad::eOk) {
//将对象字典的读方式转为写方式
pNamedObj->close(); //关闭有名对象字典
return FALSE;
}
if (pNamedObj->setAt(strDictName, pDict, DictId) != Acad::eOk){
pNamedObj->close(); //关闭有名对象字典
return FALSE;
}
}
pNamedObj->close(); //关闭有名对象字典
AcDbXrecord *pXrec = new AcDbXrecord;
AcDbObjectId XrecordObjectId;
if (pDict->setAt(SXRecordName, pXrec, XrecordObjectId) != Acad::eOk){
pDict->close(); //关闭对象字典
return FALSE;
}
pDict->close(); //关闭对象字典
rbTmp = eb;
//3.写入结果缓冲区数据
if (pXrec->setFromRbChain(*rbTmp) != Acad::eOk){
pXrec->close(); //关闭扩展记录
return FALSE;
}
pXrec->close(); //关闭扩展记录
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 从扩展记录中,读取数据到结果缓冲区
//| GetXRecord()
//|
//| 输入参数: char *SXRecordName 对象字典记录名
//| struct resbuf **eb 读出对应的数据链表
//| 返回: BOOL
//| 说明: 肖老师提供
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetXRecord(CString strDictName, CString SXRecordName, struct resbuf **eb) {
//1.获取数据库中指向有名对象字典的指针
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(); //关闭有名对象字典
return FALSE;
}
pNamedObj->close(); //关闭有名对象字典
AcDbXrecord *pXrec;
if (pDict->getAt(SXRecordName, (AcDbObject* &) pXrec,
AcDb::kForRead) != Acad::eOk) {
pDict->close(); //关闭对象字典
return FALSE;
}
pDict->close(); //关闭对象字典
if (pXrec->rbChain(eb) != Acad::eOk) {
pXrec->close(); //关闭扩展记录
return FALSE;
}
pXrec->close(); //关闭扩展记录
return TRUE;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名: 删除指定扩展记录
//| DelXRecord()
//|
//| 输入参数: char *SXRecordName 对象字典记录名
//| 返回: BOOL
//| 说明: 肖老师提供
//| 举例: 略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL DelXRecord(CString strDictName, CString SXRecordName){
//1.获取数据库中指向有名对象字典的指针
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();//关闭有名对象字典
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -