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

📄 compublic.cpp

📁 在AUTOCAD环境下沿路线插入图块
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			return 0;
		}

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

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

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

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


		//===========加扩展数据===========
		pArc->upgradeOpen();

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

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

		pArc->close();
	}
	else {
		ads_point ptTemp1,ptTemp2, pt1, pt2;
		
		if (endAngle < startAngle) 	endAngle += PI * 2;


		ads_polar(pt, startAngle, r - GetScreenH() / 60, pt1);
		ads_polar(pt, startAngle, r + GetScreenH() / 60, pt2);
		ads_grdraw(pt1, pt2, 256, 0);

		ads_polar(pt, endAngle, r - GetScreenH() / 60, pt1);
		ads_polar(pt, endAngle, r + GetScreenH() / 60, pt2);
		ads_grdraw(pt1, pt2, 256, 0);

		for (i = startAngle; i < endAngle ; i += 0.1) {
			
			ads_polar(pt,i,r,ptTemp1);

			if (i != startAngle) ads_grdraw(ptTemp1,ptTemp2,256,0);

			Cpoint(ptTemp2,ptTemp1);
		}
		ads_polar(pt, endAngle, r, ptTemp1);
		ads_grdraw(ptTemp1,ptTemp2,256,0);
	}
	return arcId;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			区域填充
//|					FillInRegion()
//|						
//| 输入参数:		int No					区域点的个数
//|					ads_point pt[]			区域各点的坐标
//|					int color				颜色
//|					double Scale			比率
//|					char *lpszPatternName	样式
//|					char *strLayerName		层名
//|					struct resbuf *xData	附加扩展数据
//|
//| 返回:			AcDbObjectId
//| 说明:			指定层及区域的各点坐标,在区域中按指定样式和颜色填充
//| 举例:			略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInRegion(AcGePoint3dArray pt,int color,double Scale,char *lpszPatternName,
					char *strLayerName,struct resbuf *xData)
{
	int No;
	AcGePoint2d temp;
	AcDbObjectId FillId;
	No = pt.logicalLength();
	AcGePoint2dArray External;
	for (int j = 0; j < No; j++) {
		temp.set(pt[j][0],pt[j][1]);
		External.append(temp);
	}	//填加区域点
	AcDbHatch * pHatch = new AcDbHatch;//创建图案填充对象

    AcDbBlockTable *pBlockTable;

    if (acdbCurDwg()->
		getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
		ads_printf("\n错误:无法打开块表!\n");
		pHatch->close();
		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");
		pBlockTableRecord->close();
		return 0;
	}

	AcGeVector3d normal(0.0,0.0,1.0);
	pHatch -> setNormal(normal);									//设置法线适量
	pHatch -> setElevation(0.5);									//设置绘图标高
	pHatch -> setAssociative(Adesk::kTrue);							
	pHatch -> setPatternScale(Scale);								//设置缩放比例
	pHatch -> setPattern(AcDbHatch::kPreDefined,lpszPatternName);	//设置填充图案
	pHatch -> setHatchStyle(AcDbHatch::kNormal);					//设置填充样式
	pHatch -> setColorIndex(color);									//设置剖面线颜色
	pHatch -> setLayer(strLayerName);								//设置所在图图层


	AcGeDoubleArray vertexBulges;
    vertexBulges.setPhysicalLength(0).setLogicalLength(No);
    for (int i = 0 ;i < No ;i++) vertexBulges[i] = 0.0;				//清零

	//边界生成:外边界
    if (pHatch->appendLoop(AcDbHatch::kExternal, External, vertexBulges) != Acad::eOk) {
		ads_printf("\n错误:无法形成填充外边界!\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}
 
	if (pHatch -> evaluateHatch() != Acad::eOk) {	//用设定的剖面线样式填充
		ads_printf("\n错误:无法用设定的剖面线样式填充!\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}

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

	if (pBlockTableRecord->close() != Acad::eOk) {			//将AcDbHatch对象添加到数据库中
		ads_printf("\n错误:无法关闭符号表!\n");
		pHatch->close();
		return 0;
	}

	//===========加扩展数据===========
	pHatch->upgradeOpen();

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

		ads_printf("\n警告: 实体(填充对象 ID=%d)添加扩展数据时出错!\n",FillId);
	}
	//================================
	pHatch->close();

	return FillId;
}




/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			区域填充
//|					FillInRegionEx()
//|						
//| 输入参数:		int No					区域点的个数
//|					ads_point pt[]			区域各点的坐标
//|					int color				颜色
//|					double Scale			比率
//|					char *lpszPatternName	样式
//|					char *strLayerName		层名
//|					struct resbuf *xData	附加扩展数据
//|
//| 返回:			AcDbObjectId
//| 说明:			指定层及区域的各点坐标,在区域中按指定样式和颜色填充
//| 举例:			略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInRegionEx(int No, ads_point pt[],int color,double Scale,char *lpszPatternName,
					char *strLayerName,struct resbuf *xData)
{
	AcGePoint2d temp;
	AcDbObjectId FillId;

	AcGePoint2dArray External;
	for (int j = 0; j < No; j++) {
		temp.set(pt[j][0],pt[j][1]);
		External.append(temp);
	}	//填加区域点
	AcDbHatch * pHatch = new AcDbHatch;//创建图案填充对象

    AcDbBlockTable *pBlockTable;

    if (acdbCurDwg()->
		getBlockTable(pBlockTable,AcDb::kForRead) != Acad::eOk) {
		ads_printf("\n错误:无法打开块表!\n");
		pHatch->close();
		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");
		pBlockTableRecord->close();
		return 0;
	}

	AcGeVector3d normal(0.0,0.0,1.0);
	pHatch -> setNormal(normal);									//设置法线适量
	pHatch -> setElevation(0.5);									//设置绘图标高
	pHatch -> setAssociative(Adesk::kTrue);							
	pHatch -> setPatternScale(Scale);								//设置缩放比例
	pHatch -> setPattern(AcDbHatch::kPreDefined,lpszPatternName);	//设置填充图案
	pHatch -> setHatchStyle(AcDbHatch::kNormal);					//设置填充样式
	pHatch -> setColorIndex(color);									//设置剖面线颜色
	pHatch -> setLayer(strLayerName);								//设置所在图图层


	AcGeDoubleArray vertexBulges;
    vertexBulges.setPhysicalLength(0).setLogicalLength(No);
    for (int i = 0 ;i < No ;i++) vertexBulges[i] = 0.0;				//清零

	//边界生成:外边界
    if (pHatch->appendLoop(AcDbHatch::kExternal, External, vertexBulges) != Acad::eOk) {
		ads_printf("\n错误:无法形成填充外边界!\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}
 
	if (pHatch -> evaluateHatch() != Acad::eOk) {	//用设定的剖面线样式填充
		ads_printf("\n错误:无法用设定的剖面线样式填充!\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}

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

	if (pBlockTableRecord->close() != Acad::eOk) {			//将AcDbHatch对象添加到数据库中
		ads_printf("\n错误:无法关闭符号表!\n");
		pHatch->close();
		return 0;
	}

	//===========加扩展数据===========
	pHatch->upgradeOpen();

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

		ads_printf("\n警告: 实体(填充对象 ID=%d)添加扩展数据时出错!\n",FillId);
	}
	//================================
	pHatch->close();

	return FillId;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			环形填充
//|					AnnulusFillIn()
//|						
//| 输入参数:		ads_point pt			环形圆心
//|					double r1				外环半径
//|					double r2				内环半径
//|					int color				颜色
//|					double Scale			比率
//|					char *lpszPatternName	样式
//|					char *strLayerName		层名
//|					struct resbuf *xData	附加扩展数据
//|
//| 返回:			AcDbObjectId
//| 说明:			指定层及区域的各点坐标,在区域中按指定样式和颜色填充
//| 举例:			略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInAnnulus(ads_point pt,double r1,double r2,int color,double Scale,
						   char *lpszPatternName,char *strLayerName,struct resbuf *xData)
{
	AcDbObjectId FillId;

    AcGePoint2d cenPt(pt[0], pt[1]);
    AcGeCircArc2d *cirArc1 = new AcGeCircArc2d();
	AcGeCircArc2d *cirArc2 = new AcGeCircArc2d();

    cirArc1->setCenter(cenPt);
    cirArc1->setRadius(r1);
    cirArc1->setAngles(0.0, 2 * PI);
	cirArc2->setCenter(cenPt);
	cirArc2->setRadius(r2);
	cirArc2->setAngles(0.0,2 * PI);

	AcDbHatch * pHatch = new AcDbHatch;//创建图案填充对象
	
    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");
		return 0;
	}

	AcGeVector3d normal(0.0,0.0,1.0);
	pHatch -> setNormal(normal);									//设置法线适量
	pHatch -> setElevation(0.5);									//设置绘图标高
	pHatch -> setAssociative(Adesk::kTrue);
	pHatch -> setPatternScale(Scale);								//设置缩放比例
	pHatch -> setPattern(AcDbHatch::kPreDefined,lpszPatternName);	//设置填充图案
	pHatch -> setHatchStyle(AcDbHatch::kNormal);					//设置填充样式

    AcGeIntArray edgeTypes1,edgeTypes2;
    AcGeVoidPointerArray edgePtrs1,edgePtrs2;

	//建立填充区域
    edgeTypes1.append(AcDbHatch::kCirArc);
	edgeTypes2.append(AcDbHatch::kCirArc);
    edgePtrs1.append((void*)cirArc1);
	edgePtrs2.append((void*)cirArc2);
	
	//区域并合计算
    if (pHatch->appendLoop(AcDbHatch::kExternal, edgePtrs1, edgeTypes1) != Acad::eOk) {	//加
		ads_printf("\n错误:无法创建外边界\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}

	if (pHatch->appendLoop(AcDbHatch::kDefault, edgePtrs2, edgeTypes2) != Acad::eOk) {	//减
		ads_printf("\n错误:无法创建内边界\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}

	//区域形成
    if (pHatch->evaluateHatch() != Acad::eOk) {
		ads_printf("\n错误:无法形成填充区域\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}

	pHatch -> setColorIndex(color);						//设置剖面线颜色
	pHatch -> setLayer(strLayerName);					//设置所在图图层
	
	if (pBlockTableRecord->appendAcDbEntity(FillId, pHatch) != Acad::eOk) {
		ads_printf("\n错误:无法将实体填加至数据库\n");
		pBlockTableRecord->close();
		pHatch->close();
		return 0;
	}

	if (pBlockTableRecord->close() != Acad::eOk) {		//将AcDbHatch对象添加到数据库中
		ads_printf("\n错误:无法关闭块表\n");
		pHatch->close();
		return 0;
	}
		
	//===========加扩展数据===========
	pHatch->upgradeOpen();

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

		ads_printf("\n警告: 实体(填充对象 ID=%d)添加扩展数据时出错!\n",FillId);
	}
	//================================
	pHatch->close();
	return FillId;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			自定义填充(求Region区域扣除Circle)
//|					DefineFillIn1()
//|						
//| 输入参数:		int No					Region区域顶点各数
//|					ads_point pt[]			Region区域各顶点坐标
//|					ads_point ptC			圆心坐标
//|					double r1				半径
//|					int color				颜色
//|					double Scale			比率
//|					char *lpszPatternName	样式
//|					char *strLayerName		层名
//|					struct resbuf *xData	附加扩展数据
//|
//| 返回:			AcDbObjectId
//| 说明:			Region中扣除circle的区域填充;pt[0]和pt[No-2]为两
//|					区域的公共交点坐标
//| 举例:			略
//|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
AcDbObjectId FillInDefine1(int No, ads_point pt[],ads_point ptC,double r1,int color,double Scale,
				char *lpszPatternName,char *strLayerName,struct resbuf *xData)
{
	AcDbObjectId FillId;
	ads_point ptmp,ptmp1;
	double aa;
	AcGePoint2d temp,temp1;
	AcGePoint2dArray External,External1;

	for (int j = 0; j < No; j++) {
		temp.set(pt[j][0],pt[j][1]);
		External.append(temp);

⌨️ 快捷键说明

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