更新属性选项板同步的命令 
调整命令处理程序以进行同步涉及对命令的 AutoCAD 注册及其执行代码的更改。 更新“属性”选项板同步的命令处理程序
 acedRegCmds->addCommand("SQUARE_COMMANDS", "ASDKADDSQUARE", 
    "ADDSQ", 
    ACRX_CMD_MODAL | ACRX_CMD_INTERRUPTIBLE,
    addSquare);
在已注册的 AutoCAD 命令的处理程序代码中,调用全局函数。此调用应在命令提示用户输入之前进行。acedSetIUnknownForCurrentCommand() 在出现提示时,轮询所有输入函数以获取返回值。RTMODELESS 如果返回,则放弃当前输入请求并继续执行下一个命令步骤。此调用是在同步的命令处理程序中进行的。RTMODELESS 在调用该函数之前,必须创建 COM 对象包装器和 COM 命令包装器的实例,然后通过连接点将两者关联起来。如果要将对象添加到 ,则通过调用 COM 对象包装器的函数实现来创建基础对象。使用返回的指针,可以调用函数的 COM 包装实现。acedSetIUnknownForCurrentCommand()AcDbDatabaseAcDbEntityIAcadBaseObject2Impl::CreateObject()IAcadBaseObject2::AddToDb() 下面是 com\AsdkSquareWrapper_dg\Square\squareui.cpp 的命令处理程序函数:addSquare() void addSquare()
{
    CComPtr<IAsdkSquareWrapper> pSquare;
    CComQIPtr<IAcadBaseObject2> pSquareBase;
    CComQIPtr<IConnectionPointContainer> pConnectionPts;
    CComPtr<IConnectionPoint> pConnection;
    CComObject<CAsdkSquareCmd> *pSquareCmdObj;
    CComPtr<IUnknown> pSquareCmd;
    DWORD connectionId = 0;
    HRESULT hr = S_OK;
    try {
        // Create the wrapper object which we will place into OPM
        // to display the square's properties
        if (FAILED(hr =
               pSquare.CoCreateInstance(CLSID_AsdkSquareWrapper)))
            throw hr;
        pSquareBase = pSquare;
        // Create the underlying square object
        if (FAILED(hr = pSquareBase->CreateObject()))
            throw hr;
        // Create the square modification listener which we use to
        // synchronize changes in OPM and the command line
        if (FAILED(hr =  CComObject<CAsdkSquareCmd>::CreateInstance(
	&pSquareCmdObj)))
            throw hr;
        pSquareCmdObj->QueryInterface(IID_IUnknown,
       (void **)&pSquareCmd);
        // Attach the square modification listener to the wrapper
        pConnectionPts = pSquare;
        if (!pConnectionPts)
            throw E_POINTER;
        if (FAILED(hr = pConnectionPts->FindConnectionPoint
            (IID_IPropertyNotifySink, &pConnection)))
            throw hr;
        if (FAILED(hr = pConnection->Advise(pSquareCmd,
            &connectionId)))
            throw hr;
    }
    catch (HRESULT) {
        acutPrintf("\n Error initializing command.");
        return;
    }
    // Set the square object up for OPM
    acedSetIUnknownForCurrentCommand(pSquare);
    // Now process the command line input by 
    // looping for all required parameters
   	ads_point pt0, pt1;
    ads_real size = 0.0;
	struct resbuf UCS, WCS;
    int retval;
	WCS.restype = RTSHORT;
	WCS.resval.rint = 0;
	UCS.restype = RTSHORT;
	UCS.resval.rint = 1;
    while (true) {
        if (!pSquareCmdObj->GotCenterPoint())
        {
            retval = acedGetPoint(NULL, "\nPick a point for the
                center: ", pt0);
            if (retval == RTCAN)
                break;
            else if (retval != RTNORM)
                continue;
            acedTrans(pt0, &UCS, &WCS, 0, pt1);
            AcAxPoint3d pnt3d(pt1[X], pt1[Y], pt1[Z]);
            pSquare->put_CenterPoint(*(pnt3d.asVariantPtr()));
        }
        if (!pSquareCmdObj->GotSquareSize())
        {
	retval = acedGetDist(pt0, "\nPick the square size : ",
                &size);
            if (retval == RTCAN)
                break;
            else if (retval != RTNORM)
                continue;
        		pSquare->put_SquareSize(size);
        }
        AcDbObjectId squareId;
        if (FAILED(hr = pSquareBase->AddToDb(squareId, 
               curDoc()->database()->currentSpaceId()))) 
        {
            acutPrintf("\n Error appending object to database.");
            break;
        }
        break;
    }
    // Unadvise the square modified listener
    pConnection->Unadvise(connectionId);
    return;
}
父主题: | 
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1   苏公网安备32011402011833)
GMT+8, 2025-11-4 19:55
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.