使用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 ***** 看看这个pline示例,看看它是否对您有帮助。
哦耶!欢迎来到沼泽 完美,我做了一些改变,它工作了!
很高兴来到这里!
顺便说一句,页脚上的捐赠链接不起作用!
试试这个.. http://www.theswamp.org/donate.html
,欢迎来到Swamp 我可以在顶部找到捐赠链接,&我已经做到了!
仅供参考,用于更正!
感谢您的捐赠。
我相信Mark(网站管理员)会很感激的。
页:
[1]