找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 434|回复: 0

[求助]:内存的问题

[复制链接]
发表于 2003-12-25 12:05:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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),
功能实现了。但如果选择直线较多,我看内存就慢慢的上升。找了好久也没解决。
各位帮忙看看,同时对程序的书写给点意见。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 04:39 , Processed in 0.317101 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表