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

📄 compublic.cpp

📁 在AUTOCAD环境下沿路线插入图块
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	else {
		ads_grdraw(pt1,pt2,col,0);
	}
	return PlineId;
}



/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			绘制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,struct resbuf *xData,BOOL draw)
{
	int i;
	AcDbObjectId PlineId;

	if (draw) {

		AcDb2dPolyline *pLine = new AcDb2dPolyline(AcDb::k2dSimplePoly,
			ptArr,0.0,Adesk::kTrue,wid,wid);

		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->upgradeOpen();
		if (pLine->setXData(xData) != Acad::eOk){

			ads_printf("\n警告: 实体(多义线 ID=%d)添加扩展数据时出错!\n",PlineId);

			pLine->close();
			return PlineId;
		}
		//================================

		pLine->close();
	}
	else {
		int n = ptArr.length();
		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;
}



/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			绘制PLine线
//|					MakePlineEx()
//|						
//| 输入参数:		int n					项点的各数
//|					char* lay				所在层
//|					ads_point pt[]			各项点坐标
//|					double wid				线宽
//|					int col					颜色
//|					struct resbuf *xData	附加扩展数据
//|					BOOL draw				是否绘制
//|
//| 返回:			AcDbObjectId
//| 说明:			指定层名,建立PLine线
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakePlineEx(int n,char* lay,ads_point pt[],double wid,
					   int col,struct resbuf *xData,BOOL draw)
{
	int i;
	AcDbObjectId PlineId;
	AcGePoint3dArray ptArr;//定义三维坐标数组
	ptArr.setLogicalLength(n);

	for (i = 0;i < n ;i++) 
		ptArr[i].set(pt[i][0],pt[i][1],0.0);	//转换坐标数组

	if (draw) {

		AcDb2dPolyline *pLine = new AcDb2dPolyline(AcDb::k2dSimplePoly,
			ptArr,0.0,Adesk::kTrue,wid,wid);

		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->upgradeOpen();
		if (pLine->setXData(xData) != Acad::eOk){

			ads_printf("\n警告: 实体(多义线 ID=%d)添加扩展数据时出错!\n",PlineId);

			pLine->close();
			return PlineId;
		}
		//================================

		pLine->close();
	}
	else {
		for (i = 0;i < n;i++) {
			if (i < n - 1) 
				ads_grdraw(pt[i],pt[i + 1],col,0);
		}
	}
	return PlineId;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			绘制圆
//|					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,
					  struct resbuf *xData,BOOL draw)
{
    AcDbObjectId circleId;
	AcGePoint3d center(pt[0],pt[1],0.0);

	if (draw) {
		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->upgradeOpen();

		if (pCirc->setXData(xData) != Acad::eOk){

			ads_printf("\n警告: 实体(圆 ID=%d)添加扩展数据时出错!\n",circleId);
			
			pCirc->close();
			return circleId;
		}
		//================================

		pCirc->close();
	}
	else {
		ads_point ptTemp1,ptTemp2;

		for (int i = 0;i < 101;i ++) {
			
			ads_polar(pt,2 * PI / 100 * i,r,ptTemp1);

			if (i) ads_grdraw(ptTemp1,ptTemp2,col,0);

			Cpoint(ptTemp2,ptTemp1);
		}
	}
	return circleId;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			绘制椭圆
//|					MakeEllipse()
//|						
//| 输入参数:		ads_point ptCenter		圆心
//|					ads_point ptNormal		椭圆法线
//|					ads_point ptMajor		椭圆长轴
//|					double rRatio			比率
//|					double rStartParam		起始角度
//|					double rEndParam		终止角度
//|					int col					颜色
//|					char* layname			所在层名
//|					struct resbuf *xData	附加扩展数据
//|					BOOL draw				是否绘制
//|
//| 返回:			AcDbObjectId
//| 说明:			指定层、圆心,半径、颜色、建立椭圆
//| 举例:			略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId MakeEllipse(ads_point ptCenter,ads_point ptNormal,ads_point ptMajor,
		double rRatio,double rStartParam,double rEndParam,int col,
		char* layname,struct resbuf *xData,BOOL draw)
{
    AcDbObjectId circleId;
	AcGePoint3d Center(ptCenter[0],ptCenter[1],0.0);

	if (draw) {

		AcGeVector3d normal(0.0,0.0,1.0);
		AcGeVector3d Major(100.0,58.0,100.0);

		AcDbEllipse *pCirc = new AcDbEllipse(Center,normal,Major,
			rRatio,rStartParam,rEndParam);

		AcDbBlockTable *pBlockTable;

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

		AcDbBlockTableRecord *pBlockTableRecord;

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

		if (pBlockTable->close() != Acad::eOk) {
			ads_printf("\n错误:无法关闭块表!\n");
			pBlockTable->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->upgradeOpen();

		if (pCirc->setXData(xData) != Acad::eOk){

			ads_printf("\n警告: 实体(椭圆 ID=%d)添加扩展数据时出错!\n",circleId);
			
			pCirc->close();
			return circleId;
		}
		//================================
		pCirc->close();
	}
	else {
	}
	return circleId;
}



AcDbObjectId MakeArc(ads_point pt,double r,double startAngle,double endAngle,
					 int col,char* layname,struct resbuf *xData,BOOL draw)
{
	double i;
    AcDbObjectId arcId;
	AcGePoint3d center(pt[0],pt[1],0.0);
	
	if (draw) {
		AcGeVector3d normal(0,0,1);

		AcDbArc *pArc = new AcDbArc(center, normal, r, startAngle, endAngle);
		AcDbBlockTable *pBlockTable;

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

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

⌨️ 快捷键说明

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