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

📄 readxdatacommands.cpp

📁 自己编写的CAD二次开发程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		acutPrintf("\nappName匹配不成功!");
		acutRelRb(pRb);
		return 1;
	}
	acutRelRb(pRb);
	return 0;
}

void  On2d(double nx,double ny,int num,int ntt)//选择表格左上角的标注点的(x坐标,y坐标,自定义houseID,比例系数)
{
	int  tableH=cmax[num]+4;//表格横线数cmax[num]+4;竖线10条

	AcDbLine *pLn[100],*pL[11];
	AcDbObjectId lineId[101],line[11];
	AcGePoint3d ap[102],bp[102],cp[102],dp[102],ep[102],fp[102],gp[102],hp[102],ip[102],jp[102];
	//	AcDbEntity *pEnt1; 
	//楼层数+4〈 102   
 
	for(int i=1;i<tableH+1;i++)//确定表格顶点坐标点
	{
		ap[i].x=nx;	
		bp[i].x=nx+6*ntt;
		cp[i].x=nx+20*ntt;
		dp[i].x=nx+34*ntt;
		ep[i].x=nx+48*ntt;
		fp[i].x=nx+62*ntt;
		gp[i].x=nx+76*ntt;
		hp[i].x=nx+90*ntt;
		ip[i].x=nx+104*ntt;
		jp[i].x=nx+118*ntt;	
	}	                      //根据比例尺判断表格宽
	for(int a=1;a<tableH+1;a++)
	{
		ap[a].y=ny-4*a*ntt;	
		bp[a].y=ny-4*a*ntt;
		cp[a].y=ny-4*a*ntt;
		dp[a].y=ny-4*a*ntt;
		ep[a].y=ny-4*a*ntt;
		fp[a].y=ny-4*a*ntt;
		gp[a].y=ny-4*a*ntt;
		hp[a].y=ny-4*a*ntt;
		ip[a].y=ny-4*a*ntt;
		jp[a].y=ny-4*a*ntt;
	}
	
    for(int m=1;m<tableH+1;m++)
	{
		pLn[m]=new AcDbLine(ap[m],jp[m]);//表格横线
        //pLn[b]->setColorIndex(1);
	}
	
	for(int d=1;d<tableH+1;d++)
	{
		lineId[d]=AddEntityToDbs(1,pLn[d]);
	}//画结束行
	
	pL[1]=new AcDbLine(ap[1],ap[tableH]);
    pL[2]=new AcDbLine(bp[1],bp[tableH]);
	pL[3]=new AcDbLine(cp[1],cp[tableH-1]);
	pL[4]=new AcDbLine(dp[1],dp[tableH-1]);
	pL[5]=new AcDbLine(ep[1],ep[tableH-1]);
	pL[6]=new AcDbLine(fp[1],fp[tableH-1]);
	pL[7]=new AcDbLine(gp[1],gp[tableH-1]);
	pL[8]=new AcDbLine(hp[1],hp[tableH-1]);
	pL[9]=new AcDbLine(ip[1],ip[tableH-1]);
	pL[10]=new AcDbLine(jp[1],jp[tableH]);
	for(int e=1;e<11;e++)
	{
		line[e]=AddEntityToDbs(1,pL[e]);
	}//lie
	
	for(int f=1;f<11;f++)
	{		//pL[f]->setColorIndex(1);
		pL[f]->close();
	}
    for(int mm=1;mm<tableH+1;mm++)
	{
		pLn[mm]->close();
	}
	
	//面积赋给表格!
	char ss[64] = "第";
	char s1[12];
	int iarea=Lnum[num];
	strcat(ss, itoa(iarea, s1, 10));
	strcat(ss, "幢楼  建筑功能层表" );
	double mx=(ap[1].x+jp[1].x)/2;
	double my=ap[1].y+2*ntt;
	txtcaption(mx,my,ss,2.5*ntt);


	double yy=ap[1].y-2*ntt;
    double dx=(ap[1].x+bp[1].x)/2;
	txtcaption(dx,yy,"层数",2*ntt);
	double Lx[11],Ly[11];
	for(int L=1;L<9;L++)
	{
		Lx[L]=ap[1].y-2*ntt;
        Ly[L]=bp[1].x+14*(L-1)+7;
	}//居住","商业","办公","阳台","车库","阁楼","配套","其他
    txtcaption(Ly[1],Lx[1],"居住",2*ntt);
    txtcaption(Ly[2],Lx[2],"商业",2*ntt);
    txtcaption(Ly[3],Lx[3],"办公",2*ntt);
	txtcaption(Ly[4],Lx[4],"阳台",2*ntt);
	txtcaption(Ly[5],Lx[5],"车库",2*ntt);
	txtcaption(Ly[6],Lx[6],"阁楼",2*ntt);
	txtcaption(Ly[7],Lx[7],"配套",2*ntt);
	txtcaption(Ly[8],Lx[8],"其他",2*ntt);
    if(qsc[num]==1)
	{	
		for(int nm=1;nm<cmax[num]+1;nm++)  
		{
			AcGePoint3d  numpoint;
			numpoint.x=(ap[1].x+bp[1].x)/2;
			numpoint.y=(ap[nm+1].y+ap[nm+2].y)/2;
			numtable(nm,numpoint,ntt);//(标志数字内容,坐标点,比例系数)
		} 
	}
	else if (qsc[num]<0)
	{
		for (int nm1=qsc[num];nm1<0;nm1++)
		{
			AcGePoint3d  numpointx;
			numpointx.x=(ap[1].x+bp[1].x)/2;
			numpointx.y=(ap[nm1+2-qsc[num]].y+ap[nm1+3-qsc[num]].y)/2;
			numtable(nm1,numpointx,ntt);//(标志数字内容,坐标点,比例系数)
		}

		for (int nm=1;nm<cmax[num]+qsc[num]+1;nm++)
		{
			AcGePoint3d  numpoint;
			numpoint.x=(ap[1].x+bp[1].x)/2;
			numpoint.y=(ap[nm+1-qsc[num]].y+ap[nm+2-qsc[num]].y)/2;
			numtable(nm,numpoint,ntt);//(标志数字内容,坐标点,比例系数)
		}
		
	}
	else if(qsc[num]>1)
	{
	    for(int nm=qsc[num];nm<cmax[num]+qsc[num];nm++)  
		{
			AcGePoint3d  numpoint;
			numpoint.x=(ap[1].x+bp[1].x)/2;
			numpoint.y=(ap[nm+1-qsc[num]].y+ap[nm+2-qsc[num]].y)/2;
			numtable(nm,numpoint,ntt);//(标志数字内容,坐标点,比例系数)
		} 
	}	
	
	double ally1=ap[tableH].y+6*ntt;
    double allx1=(ap[1].x+bp[1].x)/2;
	txtcaption(allx1,ally1,"统计",2*ntt);/////
	double ally2=(ap[tableH-1].y+ap[tableH].y)/2;
    double allx2=(ap[1].x+bp[1].x)/2;
	txtcaption(allx2,ally2,"总面积",1.75*ntt);
	double areaxx[9]={0.000};
	double n[9];

	for(int k=1;k<cmax[num]+1;k++)  //标注居住面积  y坐标//
	{ 
		n[1]=j[num][k];areaxx[1]=areaxx[1]+j[num][k];
		n[2]=s[num][k];areaxx[2]=areaxx[2]+s[num][k];
		n[3]=b[num][k];areaxx[3]=areaxx[3]+b[num][k];
		n[4]=y[num][k];areaxx[4]=areaxx[4]+y[num][k];
		n[5]=c[num][k];areaxx[5]=areaxx[5]+c[num][k];
		n[6]=g[num][k];areaxx[6]=areaxx[6]+g[num][k];
		n[7]=p[num][k];areaxx[7]=areaxx[7]+p[num][k];
		n[8]=q[num][k];areaxx[8]=areaxx[8]+q[num][k];   //统计面积内容			
		AcGePoint3d  numpoint[9];   //标注坐标
		numpoint[1].x=(bp[1].x+cp[1].x)/2;
		numpoint[2].x=(cp[1].x+dp[1].x)/2;
        numpoint[3].x=(dp[1].x+ep[1].x)/2;
		numpoint[4].x=(ep[1].x+fp[1].x)/2;
		numpoint[5].x=(fp[1].x+gp[1].x)/2;
		numpoint[6].x=(gp[1].x+hp[1].x)/2;
		numpoint[7].x=(hp[1].x+ip[1].x)/2;
		numpoint[8].x=(ip[1].x+jp[1].x)/2;
		numpoint[1].y=numpoint[2].y=numpoint[3].y=numpoint[4].y=numpoint[5].y=numpoint[6].y=numpoint[7].y=numpoint[8].y=(ap[k+1].y+ap[k+2].y)/2;
		for(int mb=1;mb<9;mb++)
		{
			coordinate(n[mb],numpoint[mb],ntt);//标注居住(等各属性)面积(标志数字内容/y坐标,坐标点/比例系数)		
		}
	}
	for(int mbb=1;mbb<9;mbb++)
	{
		AcGePoint3d  allarea[9];
		allarea[mbb].x=bp[1].x+14*(mbb-1)+7;
		allarea[mbb].y=(ap[tableH-1].y+ap[tableH-2].y)/2;
		coordinate(areaxx[mbb],allarea[mbb],ntt);//单项统计面积标注
	}


	double allareaall=areaxx[1]+areaxx[2]+areaxx[3]+areaxx[4]+areaxx[5]+areaxx[6]+areaxx[7]+areaxx[8];//总面积--合计
//	AcGePoint3d  allareain;
//	allareain.x=bp[1].x+jp[1].x;
//	allareain.y=(ap[tableH-1].y+ap[tableH-2].y)/2;
// 	coordinate(allareaall,allareain,ntt);//总面积标注
		//面积赋给表格!
	char sss[100] = "合计总面积";
	char  ss1[12];
	int iiarea=allareaall;
	strcat(sss, itoa(iiarea, ss1, 10));
	strcat(sss, "平方米" );
 	double allx=(bp[1].x+jp[1].x)/2;
    double	ally=(ap[tableH-1].y+ap[tableH].y)/2;
	txtcaption(allx,ally,sss,2.5*ntt);
	
}
void numtable(int  n,AcGePoint3d  pt,int nt)//坐标->表格
{
	AcDbBlockTable *pBlockTablee;
	acdbHostApplicationServices()->workingDatabase()
		->getSymbolTable(pBlockTablee, AcDb::kForRead);
	AcDbBlockTableRecord *pBlockTableRecorde;
	pBlockTablee->getAt(ACDB_MODEL_SPACE, pBlockTableRecorde,AcDb::kForWrite);
	pBlockTablee->close();	
	////////////////////////////////////////////////////////////////////////////////////////
	char s1[64];
	// sprintf(s1, "%d", n);//强制转换类型	
	itoa(n,s1,10);
	double textHeight = nt*1.5;
	double textWidthFactor = 2.000;
	double textRotation = 0.0;
	//AcGePoint3d atextPosition(pt[0], pt[1], 0.0);
	AcDbText *pText=new AcDbText(pt,s1, AcDbObjectId::kNull , textHeight, textRotation);
	pText->setHorizontalMode(AcDb::kTextMid);
	pText->setAlignmentPoint(pt);
	pText->setColorIndex(1); 
	
	AcDbObjectId textId;
	pBlockTableRecorde->appendAcDbEntity(textId, pText); 
	pBlockTableRecorde->close();
	pText->close(); 
}

void coordinate(double n,AcGePoint3d  pt,int nt)//调用填充表格(填充内容:数字/填充坐标点/填充比例)
{
	
	AcDbBlockTable *pBlockTablee;
	acdbHostApplicationServices()->workingDatabase()
		->getSymbolTable(pBlockTablee, AcDb::kForRead);
	AcDbBlockTableRecord *pBlockTableRecorde;
	pBlockTablee->getAt(ACDB_MODEL_SPACE, pBlockTableRecorde,AcDb::kForWrite);
	pBlockTablee->close();	
	////////////////////////////////////////////////////////////////////////////////////////
	
	CString aa;
	aa.Format("%.2f", n);
	
	double textHeight = nt*1.5;
	double textWidthFactor = 0.8000;
	double textRotation = 0.0;
	//AcGePoint3d atextPosition(pt[0], pt[1], 0.0);
	AcDbText *pText=new AcDbText(pt,(LPCTSTR)aa, AcDbObjectId::kNull , textHeight, textRotation);
	pText->setHorizontalMode(AcDb::kTextMid);
	pText->setAlignmentPoint(pt);
	pText->setColorIndex(1); 
	
	AcDbObjectId textId;
	pBlockTableRecorde->appendAcDbEntity(textId, pText); 
	pBlockTableRecorde->close();
	pText->close(); 
	
}
void txtcaption(double mx,double my,char CScaption[512],double ndb)//在指定坐标点进行文本标注:坐标点X/Y/标注内容/标注比例
{
	AcDbBlockTable *pBlockTablew;
	acdbHostApplicationServices()->workingDatabase()
		->getSymbolTable(pBlockTablew, AcDb::kForRead);
	AcDbBlockTableRecord *pBlockTableRecorde;
	pBlockTablew->getAt(ACDB_MODEL_SPACE, 
		pBlockTableRecorde, AcDb::kForWrite);
	pBlockTablew->close();//关闭块表
	
	   AcGePoint3d textPosition(mx, my, 0.0);
	   AcGePoint3d atextPosition(mx,my, 0.0);
	   
	   double textHeight =ndb;//1:500时为2.5   1:1000时为5
	   double textWidthFactor = 1.0;
	   double textRotation = 0.0;
	   
	   AcDbText *pText=new AcDbText(textPosition, CScaption, AcDbObjectId::kNull , textHeight, textRotation);
	   pText->setHorizontalMode(AcDb::kTextMid);
	   pText->setAlignmentPoint(atextPosition);
	   pText->setColorIndex (1); 
	   AcDbObjectId textId;
	   pBlockTableRecorde->appendAcDbEntity(textId, pText); //*
	   pBlockTableRecorde->close();
	   pText->close(); 
}
AcDbObjectId AddEntityToDbs(int i,AcDbEntity* pEnt)//绘制 形
{
	AcDbDatabase *pCurDb;
	AcDbBlockTable *pBlkTable;
	Acad::ErrorStatus es;
	AcDbBlockTableRecord *pBlkTableRecord;
	AcDbObjectId entityId;
	
	pCurDb=acdbHostApplicationServices()->workingDatabase();
	es=pCurDb->getBlockTable(pBlkTable,AcDb::kForRead);
	if(es != Acad::eOk)
	{
		acutPrintf("\n以只读方式打开块表操作失败!");
		return NULL;
	}
	es=pBlkTable->getAt(ACDB_MODEL_SPACE,pBlkTableRecord,AcDb::kForWrite);
	if(es != Acad::eOk)
	{
		acutPrintf("\n以写方式打开块表记录操作失败!");
		pBlkTable->close();
		return NULL;
	}
	es=pBlkTableRecord->appendAcDbEntity(entityId,pEnt);
	if(es!=Acad::eOk)
	{	
		if (i==1)
			acutPrintf("\n绘制表格出现错误!");
		if (i==2)
			acutPrintf("\n标注出现错误!");
		if(pEnt!=NULL)
			delete pEnt;
	}
	pBlkTable->close();
	pBlkTableRecord->close();
	pEnt->close();
	return entityId;
}

⌨️ 快捷键说明

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