乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 101|回复: 6

使用MSpace例程的样条和折线构造中的问题!

[复制链接]

6

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
40
发表于 2009-12-12 08:41:54 | 显示全部楼层 |阅读模式
亲爱的成员们,
我同时经历了ARX编程和通用编程(was C++)板。最后我决定把这个问题贴在这里
我在C++中创建复杂结构(如样条线和多段线)时遇到问题,因为无法创建verticesList
我知道如何从ads_。它起作用了
我尝试从web上搜索与变体相关的各种可用帮助(包括MSDN),但没有任何地方(可能我没有找到正确的链接)
可以找到列表的变体
我知道如何使用AcDb*例程创建样条线和多段线。我对使用MSpace->AddPolyline例程感兴趣
  1.         VARIANT VerticesList;
  2. #error "help required, do not know how to come up with vertices list"
  3.         /* declaration
  4.          virtual HRESULT __stdcall AddPolyline (
  5.         /*[in]* / VARIANT VerticesList,
  6.         /*[out,retval]* / struct IAcadPolyline * * pPolyline ) = 0;
  7.                 */
  8.         hr = test->pMSpace->AddPolyline(/*VARIANT*/ VerticesList, &testPolyLine);
  9.         for creating a VARIANT type from ads_point i use following.
  10.         void fn_VARIANT_From_ads_point(VARIANT &ptVariant, ads_point pt)
  11.         {
  12.                 SAFEARRAYBOUND rgsaBound;
  13.                 rgsaBound.lLbound = 0L;
  14.                 rgsaBound.cElements = 3;
  15.                 long i;
  16.                 SAFEARRAY* pPoint = NULL;
  17.                 pPoint = SafeArrayCreate(VT_R8, 1, &rgsaBound);
  18.                 i = 0;
  19.                 double value = pt[X];
  20.                 SafeArrayPutElement(pPoint, &i, &value);
  21.                 i = 1;
  22.                 value = pt[Y];
  23.                 SafeArrayPutElement(pPoint, &i, &value);
  24.                 i = 2;
  25.                 value = pt[Z];
  26.                 SafeArrayPutElement(pPoint, &i, &value);
  27.                 ptVariant.vt = VT_ARRAY | VT_R8;
  28.                 ptVariant.parray = pPoint;
  29.         }       
  30.        

我还附上了我的可编译问题。cpp文件。应调用test_main()来调用此代码
  1.         //    acedRegCmds->addCommand(_T("AsdkComAccess_COMMANDS"), _T("test"), _T("test"), ACRX_CMD_MODAL, test_main);
  2.        

这是完整的.cpp文件
。cpp
  1. #if defined(_DEBUG) && !defined(AC_FULL_DEBUG)
  2. #error _DEBUG should not be defined except in internal Adesk debug builds
  3. #endif
  4. #pragma warning( disable : 4278 )
  5. #import "acax17ENU.tlb" no_implementation raw_interfaces_only named_guids
  6. #pragma warning( default : 4278 )
  7. #pragma warning ( disable : 4996 )
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include
  13. #include
  14. #include
  15. //copy the point
  16. #define SETPOINT(a,valX,valY,valZ) a[X]=valX; a[Y]=valY; a[Z]=valZ;
  17. typedef struct sTest_s{
  18.         //autocade related
  19.     AutoCAD::IAcadDocument *pDoc;
  20.     AutoCAD::IAcadModelSpace *pMSpace;
  21. }sTest_t;
  22. //open and close the doc
  23. HRESULT doc_open(sTest_t *test);
  24. HRESULT doc_close(sTest_t *test);
  25. //variant creation and destroy
  26. void fn_VARIANT_From_ads_point(VARIANT &ptVariant, ads_point pt);
  27. void fn_VARIANT_Destroy(VARIANT ptVariant);
  28. //function that draws polyline and spline
  29. AutoCAD::IAcadLine * test_DrawPolyLine(sTest_t *test);
  30. AutoCAD::IAcadSpline * test_DrawSpline(sTest_t *test);
  31. AutoCAD::IAcadLine * test_DrawPolyLine(sTest_t *test)
  32. {
  33.         AutoCAD::IAcadLine * testPolyLine;
  34.         HRESULT hr;
  35.         acutPrintf(_T("doc_close() exit!"));
  36.         ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
  37.         SETPOINT(startPoint,10,10,0);
  38.         SETPOINT(endPoint,20, 15,0);
  39.         SETPOINT(varPointInBetween1,12,13,0);
  40.         SETPOINT(varPointInBetween2,13,14,0);
  41.         //construct VARIANT type from ads_point
  42.         VARIANT startTangent, endTangent;
  43.        
  44.         fn_VARIANT_From_ads_point(startTangent, startPoint);
  45.         fn_VARIANT_From_ads_point(endTangent, endPoint);
  46.         //how to construct Vertices List VARIANT type for points ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
  47.         VARIANT VerticesList;
  48. #error "help required, do not know how to come up with vertices list"
  49.         /* declaration
  50.          virtual HRESULT __stdcall AddPolyline (
  51.         /*[in]* / VARIANT VerticesList,
  52.         /*[out,retval]* / struct IAcadPolyline * * pPolyline ) = 0;
  53.                 */
  54.         hr = test->pMSpace->AddPolyline(/*VARIANT*/ VerticesList, &testPolyLine);
  55.         if(FAILED(hr))
  56.                 acutPrintf(_T("Failed to draw polyline");
  57.         fn_VARIANT_Destroy(VerticesList);
  58.         return testPolyLine;
  59. }
  60. AutoCAD::IAcadSpline * test_DrawSpline(sTest_t *test)
  61. {
  62.         AutoCAD::IAcadLine * test_DrawSpline;
  63.         HRESULT hr;
  64. /*
  65.         (setq  startPoint (list 10 10))
  66.         (setq  endPoint (list 20 15))
  67.         (setq  varPointInBetween1 (list 12 13))
  68.         (setq  varPointInBetween2 (list 13 14))
  69.         (command "spline" startPoint varPointInBetween1 varPointInBetween2 endPoint "" startPoint endPoint)
  70. */
  71.         ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
  72.         SETPOINT(startPoint,10,10,0);
  73.         SETPOINT(endPoint,20, 15,0);
  74.         SETPOINT(varPointInBetween1,12,13,0);
  75.         SETPOINT(varPointInBetween2,13,14,0);
  76.         //construct VARIANT type from ads_point
  77.         VARIANT startTangent, endTangent;
  78.         fn_VARIANT_From_ads_point(startTangent, startPoint);
  79.         fn_VARIANT_From_ads_point(endTangent, endPoint);
  80.         //how to construct Vertices List VARIANT type for points ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
  81.         VARIANT VerticesList;
  82. #error "help required, do not know how to come up with vertices list"
  83.        
  84.         /*
  85.       virtual HRESULT __stdcall AddSpline (
  86.         /*[in]* / VARIANT PointsArray,
  87.         /*[in]* / VARIANT StartTangent,
  88.         /*[in]* / VARIANT EndTangent,
  89.         /*[out,retval]* / struct IAcadSpline * * pSpline ) = 0;
  90.         */
  91.         hr = test->pMSpace->AddSpline(/*VARIANT*/ VerticesList, startTangent, endTangent,&test_DrawSpline);
  92.         if(FAILED(hr))
  93.                 acutPrintf(_T("Failed to draw spline");
  94.         fn_VARIANT_Destroy(startTangent);
  95.         fn_VARIANT_Destroy(endTangent);
  96.         fn_VARIANT_Destroy(VerticesList);
  97.         return testPolyLine;
  98. }
  99. //    acedRegCmds->addCommand(_T("AsdkComAccess_COMMANDS"), _T("test"), _T("test"), ACRX_CMD_MODAL, test_main);
  100. void test_main()
  101. {
  102.         sTest_t *test = (sTest_t*) malloc(sizeof(sTest_t));
  103.         doc_open(test);
  104.         test_DrawPolyLine(test);
  105.         test_DrawSpline(test);
  106.         //doc_save_as_DWG(test);
  107.         //doc_save_as_PDF(test);
  108.         doc_close(test);
  109. }
  110. HRESULT doc_open(sTest_t *test)
  111. {
  112.     AutoCAD::IAcadApplication *pAcad;
  113.     AutoCAD::IAcadDocument *pDoc;
  114.     AutoCAD::IAcadModelSpace *pMSpace;
  115.     LPUNKNOWN pUnk = NULL;
  116.         HRESULT hr = NOERROR;
  117.         ULONG ret;
  118.     LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
  119.         acutPrintf(_T("doc_open()"));
  120.         if(pAcadDisp==NULL)
  121.                 return E_ABORT;
  122.         hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
  123.         ret = pAcadDisp->Release();
  124.         if (FAILED(hr))
  125.                 return E_ABORT;
  126.         hr = pAcad->get_ActiveDocument(&pDoc);
  127.         ret = pAcad->Release();
  128.         if (FAILED(hr))
  129.                 return E_ABORT;
  130.         hr = pDoc->get_ModelSpace(&pMSpace);
  131.         if (FAILED(hr))
  132.                 return E_ABORT;
  133.         test->pDoc = pDoc;
  134.         test->pMSpace = pMSpace;
  135.         acutPrintf(_T("doc_open() exit!"));
  136.         return hr;
  137. }
  138. HRESULT doc_close(sTest_t *test)
  139. {
  140.         HRESULT hr = NOERROR;
  141.         ULONG retVal;
  142.         acutPrintf(_T("ac_doc_close()"));
  143.         hr = test->pDoc->Close();
  144.         if (FAILED(hr))
  145.                 acutPrintf(_T("Error in pDoc->Release"));
  146.         else
  147.                 acutPrintf(_T("pDoc->Release"));
  148.         retVal = test->pDoc->Release();
  149.         if (retVal!=S_OK)
  150.                 acutPrintf(_T("Error in pDoc->Release"));
  151.         else
  152.                 acutPrintf(_T("pDoc->Release"));
  153.         hr = test->pMSpace->Delete();
  154.         retVal = test->pMSpace->Release();
  155.         if (retVal!=S_OK)
  156.                 acutPrintf(_T("Error in pMSpace->Release"));
  157.         else
  158.                 acutPrintf(_T("pMSpace->Release"));
  159.         acutPrintf(_T("doc_close() exit!"));
  160.         return hr;
  161. }
  162. void fn_VARIANT_From_ads_point(VARIANT &ptVariant, ads_point pt)
  163. {
  164.     SAFEARRAYBOUND rgsaBound;
  165.     rgsaBound.lLbound = 0L;
  166.     rgsaBound.cElements = 3;
  167.     long i;
  168.         SAFEARRAY* pPoint = NULL;
  169.     pPoint = SafeArrayCreate(VT_R8, 1, &rgsaBound);
  170.     i = 0;
  171.         double value = pt[X];
  172.     SafeArrayPutElement(pPoint, &i, &value);
  173.     i = 1;
  174.         value = pt[Y];
  175.     SafeArrayPutElement(pPoint, &i, &value);
  176.     i = 2;
  177.     value = pt[Z];
  178.     SafeArrayPutElement(pPoint, &i, &value);
  179.         ptVariant.vt = VT_ARRAY | VT_R8;
  180.     ptVariant.parray = pPoint;
  181. }
  182. void fn_VARIANT_Destroy(VARIANT ptVariant)
  183. {
  184.         SafeArrayDestroyData(ptVariant.parray);
  185.         SafeArrayDestroy(ptVariant.parray);
  186. }
  187.        

非常感谢您的帮助或链接。
谢谢,
P.
P。我知道在VB或.NET中很容易。我需要知道如何用C++来做。已经阅读了以下内容:
//http://www.roblocher.com/whitepapers/oletypes.aspx

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

6

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
40
发表于 2009-12-12 10:39:25 | 显示全部楼层
看看这个pline示例,看看它是否对您有帮助。
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-12-12 10:52:30 | 显示全部楼层
哦耶!欢迎来到沼泽
回复

使用道具 举报

6

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
40
发表于 2009-12-12 12:16:47 | 显示全部楼层
完美,我做了一些改变,它工作了!
很高兴来到这里!
顺便说一句,页脚上的捐赠链接不起作用!
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-12-12 16:31:15 | 显示全部楼层

试试这个.. http://www.theswamp.org/donate.html
,欢迎来到Swamp
回复

使用道具 举报

116

主题

996

帖子

9

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1466
发表于 2009-12-12 21:44:16 | 显示全部楼层
我可以在顶部找到捐赠链接,&我已经做到了!
仅供参考,用于更正!
回复

使用道具 举报

6

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
40
发表于 2009-12-12 21:51:27 | 显示全部楼层

感谢您的捐赠。
我相信Mark(网站管理员)会很感激的。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 21:55 , Processed in 0.215227 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表