web.pawan 发表于 2009-12-12 08:41:54

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

亲爱的成员们,
我同时经历了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 (
      /** / VARIANT VerticesList,
      /** / 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;
                SafeArrayPutElement(pPoint, &i, &value);
                i = 1;
                value = pt;
                SafeArrayPutElement(pPoint, &i, &value);
                i = 2;
                value = pt;
                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=valX; a=valY; a=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 (
      /** / VARIANT VerticesList,
      /** / 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;
/*
        (setqstartPoint (list 10 10))
        (setqendPoint (list 20 15))
        (setqvarPointInBetween1 (list 12 13))
        (setqvarPointInBetween2 (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 (
      /** / VARIANT PointsArray,
      /** / VARIANT StartTangent,
      /** / VARIANT EndTangent,
      /** / 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;
        ULONG ret;
    LPDISPATCH pAcadDisp = acedGetIDispatch(TRUE);
        acutPrintf(_T("doc_open()"));
        if(pAcadDisp==NULL)
                return E_ABORT;
        hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
        ret = pAcadDisp->Release();
        if (FAILED(hr))
                return E_ABORT;
        hr = pAcad->get_ActiveDocument(&pDoc);
        ret = pAcad->Release();
        if (FAILED(hr))
                return E_ABORT;
        hr = pDoc->get_ModelSpace(&pMSpace);
        if (FAILED(hr))
                return E_ABORT;
        test->pDoc = pDoc;
        test->pMSpace = pMSpace;
        acutPrintf(_T("doc_open() exit!"));
        return hr;
}
HRESULT doc_close(sTest_t *test)
{
        HRESULT hr = NOERROR;
        ULONG retVal;
        acutPrintf(_T("ac_doc_close()"));
        hr = test->pDoc->Close();
        if (FAILED(hr))
                acutPrintf(_T("Error in pDoc->Release"));
        else
                acutPrintf(_T("pDoc->Release"));
        retVal = test->pDoc->Release();
        if (retVal!=S_OK)
                acutPrintf(_T("Error in pDoc->Release"));
        else
                acutPrintf(_T("pDoc->Release"));
        hr = test->pMSpace->Delete();
        retVal = test->pMSpace->Release();
        if (retVal!=S_OK)
                acutPrintf(_T("Error in pMSpace->Release"));
        else
                acutPrintf(_T("pMSpace->Release"));
        acutPrintf(_T("doc_close() exit!"));
        return hr;
}
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;
    SafeArrayPutElement(pPoint, &i, &value);
    i = 1;
        value = pt;
    SafeArrayPutElement(pPoint, &i, &value);
    i = 2;
    value = pt;
    SafeArrayPutElement(pPoint, &i, &value);
        ptVariant.vt = VT_ARRAY | VT_R8;
    ptVariant.parray = pPoint;
}
void fn_VARIANT_Destroy(VARIANT ptVariant)
{
        SafeArrayDestroyData(ptVariant.parray);
        SafeArrayDestroy(ptVariant.parray);
}
       
非常感谢您的帮助或链接。
谢谢,
P.
P。我知道在VB或.NET中很容易。我需要知道如何用C++来做。已经阅读了以下内容:
//http://www.roblocher.com/whitepapers/oletypes.aspx
**** Hidden Message *****

web.pawan 发表于 2009-12-12 10:39:25

看看这个pline示例,看看它是否对您有帮助。

Kerry 发表于 2009-12-12 10:52:30

哦耶!欢迎来到沼泽

web.pawan 发表于 2009-12-12 12:16:47

完美,我做了一些改变,它工作了!
很高兴来到这里!
顺便说一句,页脚上的捐赠链接不起作用!

Kerry 发表于 2009-12-12 16:31:15


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

Kerry 发表于 2009-12-12 21:44:16

我可以在顶部找到捐赠链接,&我已经做到了!
仅供参考,用于更正!

web.pawan 发表于 2009-12-12 21:51:27


感谢您的捐赠。
我相信Mark(网站管理员)会很感激的。
页: [1]
查看完整版本: 使用MSpace例程的样条和折线构造中的问题!