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

📄 stdafx.cpp

📁 在AUTOCAD环境中
💻 CPP
字号:
// stdafx.cpp : source file that includes just the standard includes
//	MFCTemplate.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

// Check if the build is DEBUG version and it's intended
// to be used with Non-DEBUG AutoCAD.
// In this case, for MFC header files, we need to undefine
// _DEBUG symbol
// Read this project readme.txt for more detail
#if defined( _DEBUG) && !defined(DEBUG_AUTOCAD)
    #pragma message("Building debug version of dynamic.arx to be used with non-debug/Prod AutoCAD")
    #define _DEBUG_WAS_DEFINED
    #undef _DEBUG
#endif

#include "stdafx.h"

#ifdef _DEBUG_WAS_DEFINED
    #define _DEBUG
    #undef _DEBUG_WAS_DEFINED
#endif

BOOL MakeNewLayer(char* LayerName,int clor);
AcDbObjectId MakePoint(ads_point Pt1,char* layname);
AcDbObjectId MakeCircle(ads_point pt,double r,int col,char* layname);


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			创建新图层
//|					MakeNewLayer()
//|
//| 输入参数:		char* LayerName			创建图层名称
//|					int clor				层颜色
//|					char *cLineFile			线型文件
//|					char* cLineType			线型名
//| 返回:			BOOL
//| 说明:			创建新层
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL MakeNewLayer(char* LayerName,int clor)
{
	//1.获取数据库中指向有名层表指针
    AcDbLayerTable *pLayerTable;

    if (acdbCurDwg()->getLayerTable(pLayerTable,AcDb::kForWrite) != Acad::eOk) {
		pLayerTable->close();//关闭层表指针
		return FALSE;
	}

	//2.建立一个新的层表
	AcDbObjectId ltypeObjId;
	if (!pLayerTable->has(LayerName)) {
		AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
		pLayerTableRecord->setName(LayerName);

		AcCmColor color;			//定义层表颜色
		color.setColorIndex(clor);
		pLayerTableRecord->setColor(color);

		if (pLayerTable->add(pLayerTableRecord) !=Acad::eOk) {
			pLayerTable->close();
			pLayerTableRecord->close();
			return FALSE;
		}
		pLayerTable->close();							//关闭层表指针
		pLayerTableRecord->close();
	} 
	else {
		pLayerTable->close();
		return 0;
	}

	return TRUE;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			绘制点
//|					MakePoint()
//| 输入参数:		ads_point Pt1 点位置
//|                 char* layname 所在层
//| 返回:			AcDbObjectId
//| 说明:			指定层名,建立点实体
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakePoint(ads_point Pt1,char* layname)
{
	AcDbObjectId PointId;
	
	AcGePoint3d Pt((double)Pt1[0],(double)Pt1[1], (double)Pt1[2]);
	
	AcDbPoint *pPoint = new AcDbPoint(Pt);

	AcDbBlockTable *pBlockTable;
	
	if (acdbCurDwg()->getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
		ads_printf("\n错误:无法打开块表!\n");
		pPoint->close();
		return 0;
	}

	AcDbBlockTableRecord *pBlockTableRecord;

	if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
		AcDb::kForWrite) != Acad::eOk) {
		ads_printf("\n错误:无效块表!\n");
		pBlockTable->close();
		pPoint->close();
		return 0;
	}
   	if (pBlockTable->close() != Acad::eOk) {
		ads_printf("\n错误:不能关闭块表!\n");
		return 0;
	}

	if (pBlockTableRecord->appendAcDbEntity(PointId, pPoint) != Acad::eOk) {
		ads_printf("\n错误:不能填加实体至数据库!");
		pPoint->close();
		return 0;
	}

	if (pBlockTableRecord->close() != Acad::eOk) {
		ads_printf("\n错误:无法关闭符号表!\n");
		pPoint->close();
		return 0;
	}

	pPoint->setLayer(layname);
	pPoint->close();
    return PointId;
}



/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			绘制圆
//|					MakeCircle()
//|						
//| 输入参数:		ads_point pt			圆心坐标
//|					double r				半径
//|					int col					颜色
//|					char* layname			所在层名
//|					struct resbuf *xData	附加扩展数据
//|					BOOL draw				是否绘制
//|
//| 返回:			AcDbObjectId
//| 说明:			指定层、圆心,半径、颜色、建立圆
//| 举例:			略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakeCircle(ads_point pt,double r,int col,char* layname)
{
    AcDbObjectId circleId;
	AcGePoint3d center((double)pt[0],(double)pt[1],(double)pt[2]);

	AcGeVector3d normal(0.0,0.0,1.0);

	AcDbCircle *pCirc = new AcDbCircle(center,normal,r);
	AcDbBlockTable *pBlockTable;

	if (acdbCurDwg()->getBlockTable(pBlockTable,
		AcDb::kForRead) != Acad::eOk) {
		ads_printf("\n错误:无法打开块表!\n");
		pCirc->close();
		return 0;
	}

	AcDbBlockTableRecord *pBlockTableRecord;
	
	if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
		AcDb::kForWrite) != Acad::eOk) {
		ads_printf("\n错误:无法获取符号表!\n");
		pBlockTable->close();
		pCirc->close();
		return 0;
	}

	if (pBlockTable->close() != Acad::eOk) {
		ads_printf("\n错误:无法关闭块表!\n");
		pBlockTableRecord->close();
		pCirc->close();
		return 0;
	}

	if (pBlockTableRecord->appendAcDbEntity(circleId, pCirc) != Acad::eOk) {
		ads_printf("\n错误:无法填加实体至数据库!\n");
		pBlockTableRecord->close();
		pCirc->close();
		return 0;
	}

	pCirc->setColorIndex(col);
	pCirc->setLayer(layname);

	if (pBlockTableRecord->close() != Acad::eOk) {
		ads_printf("\n错误:无法关闭符号表!\n");
		pCirc->close();
		return 0;
	}

	pCirc->close();

	return circleId;
}




/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			文字输出
//|					MakeText()
//|						
//| 输入参数:		ads_point pt				基点坐标
//|					AcDb::TextHorzMode hm		水平对齐方式
//|					AcDb::TextVertMode vm		垂直对齐方式
//|					char* Testr					输出的文字
//|					char* Style					文字样式
//|					char* laname				层名
//|					double th					字高
//|					double Scale				字宽比递率
//|					int color					颜色
//|					double angle				角度
//|					struct resbuf *xData		附加扩展数据
//|					BOOL draw					是否绘制
//| 返回:			AcDbObjectId
//| 说明:			略
//|					
//| 举例:			略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakeText(ads_point pt,char* Testr,char* laname)
{

	AcGePoint3d ptt;
	AcDbObjectId styleId;
	AcDbObjectId entityId;


		AcDbTextStyleTable *pTextStyleTbl;
		ptt.set(pt[0],pt[1],pt[2]);

		if (acdbCurDwg()->
			getTextStyleTable(pTextStyleTbl,AcDb::kForRead) != Acad::eOk) {
			ads_printf("\n错误:无法打开块表!\n");
			pTextStyleTbl->close();
			return 0;
		}

		if (pTextStyleTbl->getAt("standard",styleId) != Acad::eOk) {
		/*  ads_printf("\n警告:指定的字体样式无效!\n");
			pTextStyleTbl->close();
			return 0;*/
		}

		if (pTextStyleTbl->close() != Acad::eOk) {

			ads_printf("\n错误:无法关闭文字样式表!\n");
			return 0;

		}

		AcGePoint3d loText(pt[0],pt[1],pt[2]);		//文字定位点

		AcDbText *pText = new AcDbText(loText,Testr,styleId,1.5,0.0);

		AcDbBlockTable *pBlockTable;

		if (acdbCurDwg()->
			getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {

			ads_printf("\n错误:打开模型空间块表出错!\n");
			pText->close();
			return 0;

		}

		AcDbBlockTableRecord *pBlockRecord;
		if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockRecord,
			AcDb::kForWrite) != Acad::eOk) {
			ads_printf("\n错误:获取模型空间块表出错!\n");
			pBlockTable->close();
			pText->close();
			return 0;
		}

		if (pBlockTable->close() != Acad::eOk) {
			ads_printf("\n错误:无法关闭块表!\n");
			pText->close();
			return 0;
		}
		if (pText->setHorizontalMode(AcDb::kTextLeft) != Acad::eOk) {pText->close();return 0;}	//设定文字水平对齐方式
		if (pText->setVerticalMode(AcDb::kTextBottom) != Acad::eOk) {pText->close();return 0;}		//设定文字垂直对齐方式
		if (pText->setAlignmentPoint(ptt) != Acad::eOk) {pText->close();return 0;}	//设定基点坐标
		if (pText->setLayer(laname) != Acad::eOk) {pText->close();return 0;}		//所在层
		if (pText->setColorIndex(3) != Acad::eOk) {pText->close();return 0;}	//颜色
		if (pText->setWidthFactor(0.8)!= Acad::eOk) {pText->close();return 0;}	//设定文字比例
		
		if (pBlockRecord->appendAcDbEntity(entityId,pText) != Acad::eOk) {
			ads_printf("\n错误:填加文字实体出错!\n");
			pText->close();
			return 0;
		}

		if (pBlockRecord->close() != Acad::eOk) {
			ads_printf("\n错误:无法关闭符号表!\n");
			pText->close();
			return 0;

		}
		pText->close();

	return entityId;

}



/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			绘制PLine线
//|					MakePline()
//|						
//| 输入参数:		AcGePoint3dArray ptArr	坐标数组
//|					char* lay				所在层
//|					double wid				线宽
//|					int col					颜色
//|					struct resbuf *xData	附加扩展数据
//|					BOOL draw				是否绘制
//|
//| 返回:			AcDbObjectId
//| 说明:			指定层名,建立PLine线
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakePline(AcGePoint3dArray ptArr,char* lay,double wid,int col,BOOL draw)
{
	int i;
	AcDbObjectId PlineId;

	if (draw) {

		AcDb3dPolyline *pLine = new AcDb3dPolyline(AcDb::k3dSimplePoly ,
			ptArr);

		AcDbBlockTable *pBlockTable;

		if (acdbCurDwg()->
			getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
			ads_printf("\n错误:无法打开块表!\n");
			pLine->close();
			return 0;
		}


		AcDbBlockTableRecord *pBlockTableRecord;

		if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
			AcDb::kForWrite) != Acad::eOk) {
			ads_printf("\n错误:无法获取符号表!\n");
			pBlockTable->close();
			pLine->close();
			return 0;
		}


		if (pBlockTable->close() != Acad::eOk) {
			ads_printf("\n错误:无法关闭块表!\n");
			pBlockTableRecord->close();
			pLine->close();
			return 0;
		}


		pLine->setColorIndex(col);

		if (pLine->makeOpen() != Acad::eOk) {
			ads_printf("\n错误:无法编辑PLine线!\n");
			pBlockTableRecord->close();
			pLine->close();
			return 0;
		}
			
		pLine->setLayer(lay);

	//将对象添加到数据库中

		if (pBlockTableRecord->appendAcDbEntity(PlineId,pLine) != Acad::eOk) {
			ads_printf("\n错误:无法填加实体至数据库!\n");
			pBlockTableRecord->close();
			pLine->close();
			return 0;
		}

					
		if (pBlockTableRecord->close() != Acad::eOk) {
			ads_printf("\n错误:无法关闭符号表!\n");
			pLine->close();
			return 0;
		}

		pLine->close();
	}
	else {
		int n = ptArr.length();
		ads_printf("*%d\n",n);
		ads_point poFrom,poTo;

		for (i = 0; i < n - 1; i++) {
			if (i < n - 1) {
				Spoint(poFrom, ptArr[i][0], ptArr[i][1], 0.0);
				Spoint(poTo, ptArr[i + 1][0],ptArr[i + 1][1], 0.0);
				ads_grdraw(poFrom,poTo,col,0);
			}
		}
	}
	return PlineId;
}




/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			实数转化为字符串
//|					RtoS()
//| 输入参数:		double rNumber		数字
//|					int iUnit			标志位
//|					int iPrec			精度(保留几位小数)
//| 返回:			char*
//| 说明:			略
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *RtoS (double rNumber,int iUnit,int iPrec)
{
	char strTmp[20],*strRe;

	if(ads_rtos(rNumber,iUnit,iPrec,strTmp) != RTNORM) return " ";

	strRe = (char *) malloc (strlen (strTmp)+1);

	if (strRe == NULL) {
		ads_printf ("\n错误:内存不足!\n") ; 
		return " ";
	}

	strcpy(&strRe[0],strTmp);

	return strRe;
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -