|
亲爱的成员们,
我同时经历了ARX编程和通用编程(was C++)板。最后我决定把这个问题贴在这里
我在C++中创建复杂结构(如样条线和多段线)时遇到问题,因为无法创建verticesList
我知道如何从ads_。它起作用了
我尝试从web上搜索与变体相关的各种可用帮助(包括MSDN),但没有任何地方(可能我没有找到正确的链接)
可以找到列表的变体
我知道如何使用AcDb*例程创建样条线和多段线。我对使用MSpace->AddPolyline例程感兴趣
- VARIANT VerticesList;
- #error "help required, do not know how to come up with vertices list"
- /* declaration
- virtual HRESULT __stdcall AddPolyline (
- /*[in]* / VARIANT VerticesList,
- /*[out,retval]* / struct IAcadPolyline * * pPolyline ) = 0;
- */
- hr = test->pMSpace->AddPolyline(/*VARIANT*/ VerticesList, &testPolyLine);
- for creating a VARIANT type from ads_point i use following.
- void fn_VARIANT_From_ads_point(VARIANT &ptVariant, ads_point pt)
- {
- SAFEARRAYBOUND rgsaBound;
- rgsaBound.lLbound = 0L;
- rgsaBound.cElements = 3;
- long i;
- SAFEARRAY* pPoint = NULL;
- pPoint = SafeArrayCreate(VT_R8, 1, &rgsaBound);
- i = 0;
- double value = pt[X];
- SafeArrayPutElement(pPoint, &i, &value);
- i = 1;
- value = pt[Y];
- SafeArrayPutElement(pPoint, &i, &value);
- i = 2;
- value = pt[Z];
- SafeArrayPutElement(pPoint, &i, &value);
- ptVariant.vt = VT_ARRAY | VT_R8;
- ptVariant.parray = pPoint;
- }
-
我还附上了我的可编译问题。cpp文件。应调用test_main()来调用此代码
- // acedRegCmds->addCommand(_T("AsdkComAccess_COMMANDS"), _T("test"), _T("test"), ACRX_CMD_MODAL, test_main);
-
这是完整的.cpp文件
。cpp
- #if defined(_DEBUG) && !defined(AC_FULL_DEBUG)
- #error _DEBUG should not be defined except in internal Adesk debug builds
- #endif
- #pragma warning( disable : 4278 )
- #import "acax17ENU.tlb" no_implementation raw_interfaces_only named_guids
- #pragma warning( default : 4278 )
- #pragma warning ( disable : 4996 )
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //copy the point
- #define SETPOINT(a,valX,valY,valZ) a[X]=valX; a[Y]=valY; a[Z]=valZ;
- typedef struct sTest_s{
- //autocade related
- AutoCAD::IAcadDocument *pDoc;
- AutoCAD::IAcadModelSpace *pMSpace;
- }sTest_t;
- //open and close the doc
- HRESULT doc_open(sTest_t *test);
- HRESULT doc_close(sTest_t *test);
- //variant creation and destroy
- void fn_VARIANT_From_ads_point(VARIANT &ptVariant, ads_point pt);
- void fn_VARIANT_Destroy(VARIANT ptVariant);
- //function that draws polyline and spline
- AutoCAD::IAcadLine * test_DrawPolyLine(sTest_t *test);
- AutoCAD::IAcadSpline * test_DrawSpline(sTest_t *test);
- AutoCAD::IAcadLine * test_DrawPolyLine(sTest_t *test)
- {
- AutoCAD::IAcadLine * testPolyLine;
- HRESULT hr;
- acutPrintf(_T("doc_close() exit!"));
- ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
- SETPOINT(startPoint,10,10,0);
- SETPOINT(endPoint,20, 15,0);
- SETPOINT(varPointInBetween1,12,13,0);
- SETPOINT(varPointInBetween2,13,14,0);
- //construct VARIANT type from ads_point
- VARIANT startTangent, endTangent;
-
- fn_VARIANT_From_ads_point(startTangent, startPoint);
- fn_VARIANT_From_ads_point(endTangent, endPoint);
- //how to construct Vertices List VARIANT type for points ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
- VARIANT VerticesList;
- #error "help required, do not know how to come up with vertices list"
- /* declaration
- virtual HRESULT __stdcall AddPolyline (
- /*[in]* / VARIANT VerticesList,
- /*[out,retval]* / struct IAcadPolyline * * pPolyline ) = 0;
- */
- hr = test->pMSpace->AddPolyline(/*VARIANT*/ VerticesList, &testPolyLine);
- if(FAILED(hr))
- acutPrintf(_T("Failed to draw polyline");
- fn_VARIANT_Destroy(VerticesList);
- return testPolyLine;
- }
- AutoCAD::IAcadSpline * test_DrawSpline(sTest_t *test)
- {
- AutoCAD::IAcadLine * test_DrawSpline;
- HRESULT hr;
- /*
- (setq startPoint (list 10 10))
- (setq endPoint (list 20 15))
- (setq varPointInBetween1 (list 12 13))
- (setq varPointInBetween2 (list 13 14))
- (command "spline" startPoint varPointInBetween1 varPointInBetween2 endPoint "" startPoint endPoint)
- */
- ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
- SETPOINT(startPoint,10,10,0);
- SETPOINT(endPoint,20, 15,0);
- SETPOINT(varPointInBetween1,12,13,0);
- SETPOINT(varPointInBetween2,13,14,0);
- //construct VARIANT type from ads_point
- VARIANT startTangent, endTangent;
- fn_VARIANT_From_ads_point(startTangent, startPoint);
- fn_VARIANT_From_ads_point(endTangent, endPoint);
- //how to construct Vertices List VARIANT type for points ads_point startPoint, endPoint, varPointInBetween1, varPointInBetween2;
- VARIANT VerticesList;
- #error "help required, do not know how to come up with vertices list"
-
- /*
- virtual HRESULT __stdcall AddSpline (
- /*[in]* / VARIANT PointsArray,
- /*[in]* / VARIANT StartTangent,
- /*[in]* / VARIANT EndTangent,
- /*[out,retval]* / struct IAcadSpline * * pSpline ) = 0;
- */
- hr = test->pMSpace->AddSpline(/*VARIANT*/ VerticesList, startTangent, endTangent,&test_DrawSpline);
- if(FAILED(hr))
- acutPrintf(_T("Failed to draw spline");
- fn_VARIANT_Destroy(startTangent);
- fn_VARIANT_Destroy(endTangent);
- fn_VARIANT_Destroy(VerticesList);
- return testPolyLine;
- }
- // acedRegCmds->addCommand(_T("AsdkComAccess_COMMANDS"), _T("test"), _T("test"), ACRX_CMD_MODAL, test_main);
- void test_main()
- {
- sTest_t *test = (sTest_t*) malloc(sizeof(sTest_t));
- doc_open(test);
- test_DrawPolyLine(test);
- test_DrawSpline(test);
- //doc_save_as_DWG(test);
- //doc_save_as_PDF(test);
- doc_close(test);
- }
- HRESULT doc_open(sTest_t *test)
- {
- AutoCAD::IAcadApplication *pAcad;
- AutoCAD::IAcadDocument *pDoc;
- AutoCAD::IAcadModelSpace *pMSpace;
- LPUNKNOWN pUnk = NULL;
- HRESULT hr = NOERROR;
|
|