- UID
- 62871
- 积分
- 153
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-7-5
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Acad::ErrorStatus domProfileInput1()
{
//////////////////
ads_name ssName; //the name of selection
struct resbuf eb1/*, eb2, eb3*/;
char sbuf1[10]/*, sbuf2[10]*/; // Buffers to hold strings
eb1.restype = 0; // Entity type group
strcpy(sbuf1, "LINE");
eb1.resval.rstring = sbuf1; // Entity type is line.
eb1.rbnext = NULL;
if((acedSSGet(NULL, NULL, NULL, &eb1, ssName))!=RTNORM)// Retrieve all line.
return Acad::eInvalidInput;
//note add error check
//////////////////
long length;
AcDbObjectId objId;
AcDbEntity* pEntity;
acedSSLength(ssName, &length); //Returns the length of selection
//////////////显示进度条///////////////////////
acedSetStatusBarProgressMeter("正在写入数据,请稍候...", 0, length);//显示一个length长度的进度条
///////////////////////////////////////////////
for (int i = 0; i < length; i++)
{
ads_name ent;
acedSSName(ssName, i, ent);
//Returns the name of an entity in a selection set by index
acdbGetObjectId(objId, ent);//get ObjectId by ads_name
acdbOpenObject(pEntity, objId, AcDb::kForWrite);
addXdata1( pEntity) ;//add xdate to pEntity(一个加扩展数据的子程序,没贴出)
AcGePoint3d startpnt ,endpnt;
ReturnEntInfo(ent, startpnt, endpnt);
//acutPrintf("MaxBox[X] is %f ", startpnt[X]);//print
{
//下面的AcGePoint3d与ads_point觉得有点机械,有没有好的方法?(函数积累不够)
ads_point pt1,pt2;
pt1[X]=startpnt[X];
pt1[Y]=startpnt[Y];
pt2[X]=endpnt[X];
pt2[Y]=endpnt[Y];
ads_real angle=acutAngle(pt1,pt2);
ads_point a1, a2, a3, a4;
acutPolar(pt1,(angle+PI/2),150.0,a1 );
acutPolar(pt1,(angle-PI/2),150.0,a4 );
acutPolar(pt2,(angle+PI/2),150.0,a2 );
acutPolar(pt2,(angle-PI/2),150.0,a3 );
AcGePoint3dArray vertices;
AcDb2dPolyline *pNewPline;
vertices.append(asPnt3d(a1));
vertices.append(asPnt3d(a2));
vertices.append(asPnt3d(a3));
vertices.append(asPnt3d(a4));
//vertices.append(asPnt3d(a1));
pNewPline=new AcDb2dPolyline(AcDb::k2dSimplePoly,vertices,0,Adesk::kTrue,/*Width*/0,/*Width*/0);
// else pNewPline=new AcDb2dPolyline(AcDb::k2dSimplePoly,vertices,0,Adesk::kFalse,Width,Width);
AcDbObjectId id;
postToDatabase(pNewPline, id);//
}
pEntity->close();
acedSetStatusBarProgressMeterPos(i);//根据i来显示进度情况
}
acedSSFree(ssName); //release ssname
acedUpdateDisplay();//update Display
//////////////消毁进度条/////////////////////////
Sleep(5);//产生5秒钟的停滞
acedRestoreStatusBar();//消毁进度条
/////////////////////////////////////////////////
//acDocManager->unlockDocument(curDoc());
//acedPostCommandPrompt();
return Acad::eOk;
}
//下面的取得LINE的起点,终点函数老觉得不好。由于初学, 函数积累不够,我没找到其他方法。
int ReturnEntInfo(ads_name entity, AcGePoint3d &startpoint , AcGePoint3d &endpoint)
{
struct resbuf *rbEnt;
struct resbuf *rbTrav;
rbEnt = acdbEntGet(entity);
acedSSFree(ssName);
if(!rbEnt)
{
acutPrintf("\nFailed to get entities result buffer linked list. ");
return 0;
}
rbTrav = rbEnt;
while(rbTrav)
{
switch(rbTrav->restype)
{
case 10 : // startpoint
startpoint[X]=rbTrav->resval.rpoint[X];
startpoint[Y]=rbTrav->resval.rpoint[Y];
startpoint[Z]=rbTrav->resval.rpoint[Z];
break;
case 11 : // endpoint
endpoint[X]=rbTrav->resval.rpoint[X];
endpoint[Y]=rbTrav->resval.rpoint[Y];
endpoint[Z]=rbTrav->resval.rpoint[Z];
break;
default :
break;
} // switch
rbTrav = rbTrav->rbnext;
} // while
if(rbEnt)
{
acutRelRb(rbEnt);
}
}
上面程序实现:通过选择直线,添加扩展数据。然后根据扩展数据以直线为中心绘一框形多义线(本例中我直接取150),
功能实现了。但如果选择直线较多,我看内存就慢慢的上升。找了好久也没解决。
各位帮忙看看,同时对程序的书写给点意见。 |
|