找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1610|回复: 8

[求助]:如何分配不确定数的缓冲区?

[复制链接]
发表于 2002-7-7 16:23:30 | 显示全部楼层 |阅读模式

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

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

×
 各位高手,我必须要用acdbEntMake()来生成实体。例如,多段线或样条曲线,在构造结果缓冲区遇到的麻烦是:样条曲线的点数目不确定,如何用程序控制构成缓冲区表呢?已知函数:acutBuildList()、acutNewRb()、acutRelRb()。请赐教。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-7-14 12:44:55 | 显示全部楼层
别用acutBuildList,这个是构造知道长度的resbuf的,你用ads_newrb来在循环里面,动态构造resbuf链。

如:
  

  1. [FONT=courier new]

  2. resbuf *head=NULL,*trvalPtr=NULL,*node=NULL;
  3. while (.....)   //你的循环控制条件
  4.   ......
  5.     node=ads_newrb(RTREAL);//拿实数为例,建立一个节点
  6.   node->resval.rreal=100;
  7.     node->rbnext=NULL;

  8. -------;下面把这个节点加入到链表中
  9.   if (!head){
  10.         head=node;//链表空,头指针执行当前node
  11.     }
  12.     else {
  13.         trvalPtr=head; //遍历指针,用下面循环找最后位置,插入node
  14.         while (trvalPtr->rbnext!=NULL)
  15.            trvalPtr=trvalPtr->rbnext;
  16.        trvalPtr->rbnext=node;
  17.     }
  18. ----------
  19. }


  20. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-15 01:22:23 | 显示全部楼层
我早已解决,在帮助和样例文件中找到灵咸的。思路是这样:首先声明两个缓冲区变量,一个用来动态移动,用acutNewRb()申请。最后用acutRelRb()释放另一个变量。对否请指教。
程序片断:
struct resbuf *rb,*rbtmp;
AcGePoint3dArray knots1;
rb=acutNewRb(0);
rbtmp=rb;
acutNewString("AcDbPolyline",rbtmp->resval.rstring);
rbtmp->rbnext=acutNewRb(100);
rbtmp=rbtmp->rbnext;
acutNewString("AcDbEntity",rbtmp->resval.rstring);
...
for (i=0;i<knots1.length();++i)
{
        rbtmp->rbnext=acutNewRb(10);
        rbtmp=rbtmp->rbnext;
        rbtmp->resval.rreal=knots1.at(i);
}
...
acutRelRb(rb);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-7-15 02:38:04 | 显示全部楼层
最初由 冰斌 发布
[B]我早已解决,在帮助和样例文件中找到灵咸的。思路是这样:首先声明两个缓冲区变量,一个用来动态移动,用acutNewRb()申请。最后用acutRelRb()释放另一个变量。对否请指教。
程序片断:
struct resbuf *rb,*rbtmp;
... [/B]


acutNewRb(..)的参数是restype类型,如RTREAL等,你用10,100等不知道是什么意思?

另外你要保存什么样的数据?ARX和MFC里面都有动态数组,比如AcGeDoubleArray、AcGeIntArray、AcGeVoidPointerArray 等等对象,他们可以动态生成,自动释放,利用他们远比低效的resbuf要方便。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-20 12:30:38 | 显示全部楼层
我必须要用acdbEntMake()来生成实体的,要用缓冲区来表达象autolisp中entget函数返回的那样的表一样,所以出现DXF中的代码。10为点坐标...
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-20 12:32:35 | 显示全部楼层
为何搜索功能禁用?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-7-20 12:40:55 | 显示全部楼层
最初由 冰斌 发布
[B]我必须要用acdbEntMake()来生成实体的,要用缓冲区来表达象autolisp中entget函数返回的那样的表一样,所以出现DXF中的代码。10为点坐标... [/B]


刚才访问慢,临时关闭搜索,现在打开了。

能跟大家说说,是什么限制,要求你必须使用entmake来生成实体吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-7-26 09:59:09 | 显示全部楼层
填充问题。
    一种方法是:已知填充边界临时实体的相关数据,用acdbEntMake()来做,成功。
    另一种方法:把临时实体放入库中,得到IDs表,再用AcDbHatch()来做,然后把库中的临时实体删除。最近做完,成功。
    奇怪的是:第一种方法的速度优于第二种方法!!!。我的cpu主频1G,内存128M,运行VC.NET,CAD2004,3000个填充,每个填充有4 个实体(两条样条曲线,两条直线),第一种方法花了6分钟多,第二种方法8分钟多。都进行了大量的磁盘交换。
    据自我分析:第二种方法主要是先要把临时实体放进库中,然后又要删除,花费了大量时间。
    晓东:能对第二种方法提出点建设性意见吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

发表于 2016-10-6 12:41:35 | 显示全部楼层

                vector<CString> vecstr;
                for(int i=0;i<100;i++)
                {
                        CString tmp;
                        tmp.Format(_T("%d"),i+5);
                        vecstr.push_back(tmp);
                }
如何将这100个CString创建成一个缓冲列表?以下代码
        static void YTMsupportt3(void)
        {
                // Add your code for command YTMsupport.t3 here
                vector<CString> vecstr;
                for(int i=0;i<100;i++)
                {
                        CString tmp;
                        tmp.Format(_T("%d"),i+5);
                        vecstr.push_back(tmp);
                }
                struct resbuf *head=NULL,*trvalPtr=NULL,*node=NULL;
                for(int i=0;i<vecstr.size();i++)
                {
                        node=ads_newrb(RTSTR);//拿实数为例,建立一个节点
                        char *tmp=vecstr.at(i).GetBuffer(vecstr.at(i).GetLength());
                        node->resval.rstring=tmp;
                        node->rbnext=NULL;

                        //下面把这个节点加入到链表中
                        if (!head)
                        {
                                head=node;//链表空,头指针执行当前node
                        }
                        else
                        {
                                trvalPtr=head; //遍历指针,用下面循环找最后位置,插入node
                                while (trvalPtr->rbnext!=NULL)
                                {
                                        trvalPtr=trvalPtr->rbnext;
                                }
                                trvalPtr->rbnext=node;
                        }
                }
                while(trvalPtr!=NULL)
                {
                        if(trvalPtr->restype==RTSTR)
                        {
                                acutPrintf(_T("\n%s"),trvalPtr->resval.rstring);
                        }
                        trvalPtr=trvalPtr->rbnext;
                }
                acutRelRb(trvalPtr);
        }

上述代码运行后输出103、104之后就没有了
2016-10-06_124048.png

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-24 18:23 , Processed in 0.357511 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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