📄 readxdatacommands.cpp
字号:
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 + -