Helios 发表于 2011-9-14 08:20:42

添加扩展数据

大家好,
我正在尝试通过BRX将扩展数据记录附加到实体,但做得不太好
除了所有不同的字符串风格(CString、ACHAR*、char buff[]),要获得有关如何创建结果缓冲区以传递给setXData()方法的信息还有点困难
我正在传递一个计数和两个cstringarray(键和值),以创建一个(私有成员)m_prbX(类型为struct resbuf*)
Acad::ErrorStatus CadDrawing::setXRecords(int count, const CStringArray& keys, const CStringArray& values)
{
   
   acdbRegApp(_T("myApp");//resval.rstring); //rbnext = acutNewRb(_ttoi(LPCTSTR(keys.GetAt(i))));
   m_prbX ->resval.rstring = CStringW(values.GetAt(i)).GetBuffer(0);
   }

   m_prbX = m_prbX->rbnext;
   m_prbX->rbnext = NULL;
   acutRelRb(newRB);
   
    m_XDataPending = true;
    return Acad::eOk;
}

我传递的密钥存储在CStringArray>>中。我转换为INT是否正确_ttoi(LPCTSTR(keys.GetAt(i))
传递值字符串对我来说似乎是一座太远的桥。>>CStringW(values.GetAt(i))。GetBuffer(0)
接下来我尝试设置扩展数据:
Acad::ErrorStatus CadDrawing::setEntityXRecords()
{
    Acad::ErrorStatus es = Acad::eOk;
    if (m_XDataPending)   //is some Xdata set in m_prxB?
    {
      AcDbObject* pObj;
      AcDbObjectId entID;
      ads_name ename;
      acdbEntLast(ename);
      acdbGetObjectId(entID, ename);
      
      if ((es = acdbOpenObject(pObj, entID, AcDb::kForWrite)) == Acad::eOk)//open object for write succeeds
      {
         if ((es = pObj->setXData(m_prbX)) == Acad::eOk)   //..but set Xdata fails with error code 126
      {
         //success..
         }
         es = pObj->close();                           //close onbject
       }
   
      acutRelRb(m_prbX);                                  //release the object's memory
   
       m_XDataPending = false;
    }
   
    return es;
}
SetXData返回126(eRegappIdNotFound)
有人能解释一下吗
TIA,
Arno van Eeuwen
**** Hidden Message *****

Draftek 发表于 2011-9-14 09:19:16

看起来不像您检查xdata应用程序名称是否已在应用程序字典中注册
请参见帮助文档中的“acdbRegApp()”。

owenwengerd 发表于 2011-9-14 09:47:30

这有效
static bool GetEnt(AcDbObjectId &id, AcGePoint3d &pnt)
    {
      ads_name name = {0L, 0L};
      bool flag = (acedEntSel(L"\nGet Entity",name,asDblArray(pnt)) == RTNORM);
      id = (AcDbStub*)name;
      return flag;
    }
    static void CStringArrayToResbulList(ResbufList &rList,
                                       const INT_PTR count,
                                       const CStringArray& keys,
                                       const CStringArray& values)
    {
      if(count setXData(rList)));
    }
} ;

如果你想使用它
,你可以在这里得到 resbuflist 类

Helios 发表于 2011-9-14 09:53:34


另请查看_tcsdup代码3]

Helios 发表于 2011-9-14 10:56:49

当您调用acutRelRb(newRB)时,您正在释放指向我的m_prbX的内存。

Helios 发表于 2011-9-15 09:27:30

感谢您的快速回复。
ResbufList看起来非常有用且很有前途,我已经下载了它并在代码中实现了它。
但是,
一旦我尝试构建代码,我就收到错误1189
错误6致命错误C1189:#error:您已经包含了一些C++ / C库头文件,其中定义了_DEBUG,有些_DEBUG未定义。这将无法正常工作。请始终如一地设置或清除_DEBUG。c:\program files\microsoft visual studio 8\vc\include\use_ansi.h 49
在 Bricscad 知识库中也提到了这个错误,并建议了一种改变 stdafx.h 的方法。但我已经在我现有的项目中做到了这一点。
将 ResbufList.cpp添加到我的项目中会导致弹出错误。
所以现在正在寻找一种方法来解决这个问题,因为C++仍然不是我的一杯茶,特别是这种错误。
会让你随时了解情况。

Helios 发表于 2011-9-15 09:47:17

您的项目中是否设置了_ DEBUG
我认为您无法做到这一点,因为BRX链接到MFC的发布版本。。。

Draftek 发表于 2011-9-15 09:59:26

是的,
也许你可以定义自己的,即MY_DEBUG你的调试代码。

Helios 发表于 2011-9-15 10:07:46

我的手提箱已经收拾好了等着。。。

owenwengerd 发表于 2011-9-15 10:46:01

我有机票,但我还没有预订房间,也许我应该留在最近的酒吧,
我带着空行李箱,这样我就可以带回巧克力
了。
页: [1] 2
查看完整版本: 添加扩展数据