- UID
- 25991
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-1-16
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Select类定义:
#include "stdafx.h"
#include "resource.h"
#include "Select.h"
#include "math.h"
#include "afxtempl.h"
#include "dbid.h"
struct resbuf* TextList()
{
struct resbuf* List;
//建立所有Layer层高度为1.0的字体选择集
List = acutBuildList(
RTDXF0, "TEXT", // Entity type
40, 1.0, // Radius
8, "0", // Layer
0);
return List;
}
void ChangeObjectColor(AcDbObjectId ObjectId)
{
AcDbEntity *ant;
int yy=acdbOpenObject(ant, ObjectId, AcDb::kForWrite);
if(yy != 0)acutPrintf("\nerrorCode=%d",yy);
AcDbText *a=AcDbText::cast(ant);
a->setColorIndex(10);
a->close();
ant->close();
}
void Select::SelectObject(CArray <AcDbObjectId,AcDbObjectId&> &ObjectCArray)
//CArray类作为形参时变量前应加&才能正确传递值
{
ads_name SSName,ObjectName;
AcDbObjectId ObjectId;
AcGePoint3d start,end;
double Lengh = 0.0,CalLineLengh = 0.0;
long Number = 0,nNewSize = 0,nGrowBy = -1;
//搜索整个数据库建立选择集
if (LineList() != NULL)
{
acedSSGet("X", NULL, NULL, TextList(), SSName);
acedSSLength(SSName,&Number);
acutPrintf("所有符合条件的物体个数为:%d个\n",Number);
//建立存储选择体数组
ObjectCArray.SetSize(nNewSize,nGrowBy);
//把选择集中选择体存储到选择体数组
while (Number != 0)
{
Number=Number-1;
if (acedSSName(SSName,Number,ObjectName) == RTNORM)
{
acdbGetObjectId(ObjectId, ObjectName);
AcDbEntity* pnt;
acdbOpenObject(pnt, ObjectId, AcDb::kForRead);
ObjectCArray.Add(ObjectId);
pnt->close();
ChangeObjectColor(ObjectId);
ObjectId = NULL;
acedSSDel(ObjectName, SSName);
}
else
{
acdbFail("实体名选择集发生错误!\n");
Number=0;
}
}
}
else
{
acutPrintf("acutBuildList选择集时发生错误!");
}
return;
}
GetTextXYZ类定义:
#include "stdafx.h"
#include "resource.h"
#include "GetTextXYZ.h"
#include "dbapserv.h"
#include "AFX.h"
#include "dbents.h "
void GetTextXYZ::TextIdToXYZ(AcDbObjectId TextId,AcGePoint3d& XYZ,double& Text)
{
AcDbEntity *pEnt;//因此声明一个AcDbEntity类的指针
int yy=acdbOpenObject(pEnt, TextId, AcDb::kForRead);//它的功能是通过已知的对象的id用指定的打开
AcDbText *p=AcDbText::cast(pEnt);
XYZ=p->position();
Text=atof(p->textString());
//pEnt->setColorIndex(10);
pEnt->close();//打开了一个对象,对其操作完成之后,必须用close()函数将它关闭
p->close();
return;
}
WriteReadTextFile类定义:
#include "stdafx.h"
#include "resource.h"
#include "WriteReadTextFile.h"
#include "StdArx.h"
void WriteReadTextFile::OpenTextFile(char * &TextFile)
{
const char* filea ="请选择文件" ;
char buf[125];
TextFile=buf;
struct resbuf* result = acutNewRb(RTSTR);
int rc=acedGetFileD(filea, NULL, "txt", 1, result);
if(rc!=RTNORM )acedAlert("打开文件失败!");
else{TextFile=result->resval.rstring;}
}
void WriteReadTextFile::WriteTextFile(char* TextFile,char* Number,char* xx,char* yy,char* zz)
{
char* TZ = "23";//23为特征号
CStdioFile UserFile;
UserFile.Open(TextFile,CFile::modeReadWrite);
UserFile.SeekToEnd();
UserFile.WriteString(Number);
UserFile.WriteString("\n");
UserFile.WriteString(TZ);
UserFile.WriteString("\n");
UserFile.WriteString(xx);
UserFile.WriteString("\n");
UserFile.WriteString(yy);
UserFile.WriteString("\n");
UserFile.WriteString(zz);
UserFile.WriteString("\n");
UserFile.Close();
}
主函数定义:
#include "StdAfx.h"
#include "StdArx.h"
#include "Select.h"
#include "GetTextXYZ.h"
#include "afxtempl.h"
#include "gepent3d.h"
#include "dbdim.h"
#include "Plot.h"
#include "WriteReadTextFile.h"
// This is command 'PP'
void JZpp()
{
long nNewSize = 0,nGrowBy = -1,Size = 0,Number = 0;
AcDbObjectId TextId;
AcGePoint3d XYZ;
double Text = 0.0;
char NN[12],XX[12],YY[12],ZZ[12];
char* stringFile;
///////////定义存储ObjectID的数组Text//////////
CArray <AcDbObjectId,AcDbObjectId&> Textgroup;
Textgroup.SetSize(nNewSize,nGrowBy);
///////////////////////////////////////////////
Select SS;//定义一个选择的类
SS.SelectObject(Textgroup);
Size = Textgroup.GetSize();
GetTextXYZ LL;//定义一个转换ObjectID为坐标的类
//Plot PP;
WriteReadTextFile WW;//定义一个读写TextFile的类
WW.OpenTextFile(stringFile);
//////////////写入总点数///////////////////////
CStdioFile UserFile;
UserFile.Open(stringFile,CFile::modeReadWrite);
acdbRToS(Size, 2, 0, NN);
UserFile.WriteString(NN);
UserFile.WriteString("\n");
UserFile.Close();
///////////////////////////////////////////////
//////////////显示进度条///////////////////////
acedSetStatusBarProgressMeter("正在写入数据,请稍候...", 0, Size);//显示一个SIZE长度的进度条
///////////////////////////////////////////////
/////////写入各点的点号、特征号、坐标//////////
while (Number < Size)
{
TextId = Textgroup.GetAt(Number);
LL.TextIdToXYZ(TextId,XYZ,Text);
XYZ.z = Text;
//acutPrintf("\n%d",Size);
acutPrintf("\nNO.%D,%f,%f,%f",Number,XYZ.x,XYZ.y,XYZ.z);
acdbRToS((Number+1), 2, 0, NN);//将double类型变量转换为char[12]类型变量
acdbRToS(XYZ.x, 2, 2, XX);
acdbRToS(XYZ.y, 2, 2, YY);
acdbRToS(XYZ.z, 2, 2, ZZ);
WW.WriteTextFile(stringFile,NN,XX,YY,ZZ);
//PP.creatPoint(XYZ);
//////////////控制进度条的显示///////////////////////
Sleep(5);//产生5秒钟的停滞
acedSetStatusBarProgressMeterPos(Number);//根据Number来显示进度情况
/////////////////////////////////////////////////////
++ Number;
}
/////////////////////////////////////////////////
//////////////消毁进度条/////////////////////////
acedRestoreStatusBar();//消毁进度条
/////////////////////////////////////////////////
acedAlert("写入数据已完成,谢谢使用!");
} |
|