找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 996|回复: 12

[求助]:自定义类数据的问题

[复制链接]
发表于 2006-6-24 11:42:44 | 显示全部楼层 |阅读模式

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

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

×
请问大家,在自定义类中如何使用字符串数组:
Adesk::Boolean m_IsEnable;
  Adesk::Int32 m_ObjNum;
  AcArray[AcDbSoftPointerId] m_ObjIds;
  AcArray[double] m_ObjVals;
  AcArray[Adesk::Int32] m_ObjStys;
  AcArray[Adesk::Int32] m_ObjSecStys;
  AcArray[Adesk::Int32]m_ObjCtrs;
********************************************************************************
  AcArray[char*] m_ObjNames; 就这个无法正常使用
********************************************************************************
这个该死的论坛在编辑器中不能使用尖括号所以用方括号来代替

这个数据在读入和读出函数中很特殊,不知道是否有人在自定义类使用过这样的数据,以下是我的两个Dwg编出编入函数:
//从DWG文件中读入数据到内存中
Acad::ErrorStatus WJRedTableObject::dwgInFields(AcDbDwgFiler* pFiler)
{
        assertWriteEnabled();
        Acad::ErrorStatus es;

        // Call dwgInFields from AcDbObject
        if ((es = AcDbObject::dwgInFields(pFiler)) != Acad::eOk) {
                return es;
        }

        // Read version number.
        Adesk::UInt16 version;
        pFiler->readItem(&version);
        if (version > VERSION_WJREDTABLEOBJECT)
                return Acad::eMakeMeProxy;

        // Read the data members.
  int i;
  Adesk::Int32 temSty;
  Adesk::Int32 temCtr;
  double temVal;
  AcDbSoftPointerId temId;
  char* mChr;
        switch (version)
        {
        case (1):
                pFiler->readItem(&m_ObjNum);
    pFiler->readItem(&m_IsEnable);
                // TODO: here you can file datamembers not
                //       created by the ObjectARX Add-In.   
    for(i=0;i<m_ObjNum;i++)
    {
      pFiler->readItem(&temSty);
      m_ObjStys.append(temSty);
    }
    for(i=0;i<m_ObjNum;i++)
    {
      pFiler->readItem(&temSty);
      m_ObjSecStys.append(temSty);
    }
    for(i=0;i<m_ObjNum;i++)
    {
      pFiler->readItem(&temVal);
      m_ObjVals.append(temVal);
    }
    for(i=0;i<m_ObjNum;i++)
    {
      pFiler->readItem(&temCtr);
      m_ObjCtrs.append(temCtr);
    }
    for(i=0;i<m_ObjNum;i++)
    {
      pFiler->readItem(&temId);
      m_ObjIds.append(temId);
    }
*************************************************************
大家看看这里是否正确,m_ObjNum是这个动态数组的长度
    for(i=0;i<m_ObjNum;i++)
    {
      pFiler->readItem(&mChr);
      m_ObjNames.append(mChr);
    }
                break;
        }
**********************************************************
        return pFiler->filerStatus();
}

//从内存中将数据写入到DWG文件中
Acad::ErrorStatus WJRedTableObject::dwgOutFields(AcDbDwgFiler* pFiler) const
{
        assertReadEnabled();
        Acad::ErrorStatus es;

        // Call dwgOutFields from AcDbObject
        if ((es = AcDbObject::dwgOutFields(pFiler)) != Acad::eOk) {
                return es;
        }

        // Write version number.
        pFiler->writeItem((Adesk::UInt16) VERSION_WJREDTABLEOBJECT);

        // Write the data members.
        pFiler->writeItem(m_ObjNum);
  pFiler->writeItem(m_IsEnable);
        // TODO: here you can file datamembers not
        //       created by the ObjectARX Add-In.
  
  int i;
  for(i=0;i<m_ObjNum;i++)
  {
    pFiler->writeItem(m_ObjStys);
  }
  for(i=0;i<m_ObjNum;i++)
  {
    pFiler->writeItem(m_ObjSecStys);
  }
  for(i=0;i<m_ObjNum;i++)
  {
    pFiler->writeItem(m_ObjVals);
  }
  for(i=0;i<m_ObjNum;i++)
  {
    pFiler->writeItem(m_ObjCtrs);
  }
  for(i=0;i<m_ObjNum;i++)
  {
    pFiler->writeItem(m_ObjIds);
  }
*************************************************************
大家看看这里是否正确,m_ObjNum是这个动态数组的长度
  for(i=0;i<m_ObjNum;i++)
  {
    pFiler->writeItem(m_ObjNames);
  }
        return pFiler->filerStatus();
***************************************************************
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-6-24 11:57:02 | 显示全部楼层
直接有cstringarray,让你的dbx支持mfc就行了,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-24 12:24:48 | 显示全部楼层
嗨,每次在我最困难的时候你总是雪中送碳,真是万分感谢。你对我的帮助真是太大了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2006-6-24 17:23:51 | 显示全部楼层
也可以使用ObjectArx自己的AcString:
AcArray< AcString > acstrArray;
在wdgInField/dwdOutField的时候,先输入/输出数组的长度,然后在通过迭代处理数组中所有的元素。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-24 21:13:20 | 显示全部楼层
谢谢各位,我解决了,还是采用我原来的char*类型,其实就是其中的一行代码写得不妥当:
修改如下:
if(m_ObjNames.logicalLength()==0) m_ObjNames.setLogicalLength(m_ObjNum);
    for(i=0;i<m_ObjNum;i++)
    {
      pFiler->readItem(&mChr);
      m_ObjNames=strdup(mChr);
    }
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-25 21:35:06 | 显示全部楼层
bin bin 是高手 帮忙看看我的撒 我想做一个三维地形建模的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2006-6-26 12:40:17 | 显示全部楼层
for(i=0;i<m_ObjNum;i++)
  {
    pFiler->readItem(&rb);
          if (rb.restype == AcDb::kDxfSubclass) {
                  if (m_ObjNames != NULL)
                          free(m_ObjNames);
                  m_ObjNames = strdup(rb.resval.rstring);
          } else {
                  pFiler->pushBackItem();
                  pFiler->setError(Acad::eInvalidDxfCode,
                                  "nError: expected group code %d",
                                  AcDb::kDxfSubclass);
                  return pFiler->filerStatus();
          }
  }


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

使用道具 举报

发表于 2006-6-27 08:43:33 | 显示全部楼层
谢谢!还有问题请教:这些代码用arx的向导自动添加,是不是不能实现?我觉得那个向导不方便,还容易出错,但那些dxf组码掌握不够,自己写担心出错。比如
        pFiler->writeItem(AcDb::kDxfXTextString, m_Name);
        pFiler->writeItem(AcDb::kDxfXInt16 + 1, m_No);
        pFiler->writeItem(AcDb::kDxfXInt16 + 2, m_Seg);
        pFiler->writeItem(AcDb::kDxfXInt16 + 3, m_PRI);
        pFiler->writeItem(AcDb::kDxfXReal, m_dS);
        pFiler->writeItem(AcDb::kDxfXReal + 1, m_dE);
在向导中,每种类型的变量是有个数限制的,自己写代码应该注意什么?再次感谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-6-27 09:39:09 | 显示全部楼层
每种类型的变量是有个数限制的
在DWG中我没有发现有任何问题,DXF文件我还没测试过,以前搞LISP的时候发现DXF的数据确实是这样。这个我要到以后才进行考虑。至于使用向导我觉得很方便,没有任何问题呀。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-27 12:11:16 | 显示全部楼层
你贴出来的代码用向导能创建吗?再次感谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-21 23:24 , Processed in 0.387897 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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