⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compublic.cpp

📁 在AUTOCAD环境下沿路线插入图块
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/**********************************************************************************
*
* 文件: <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 + -