可以通过添加具有自定义行为的专用工具来使方法和自定义属性起作用。在上一过程中,您创建了一个启动 LINE 命令的命令工具。以下过程演示如何添加使用 ObjectARX 功能创建线条的工具。它还使用工具的属性来定义线的端点。New()
添加此工具的基本步骤包括
- 定义新属性以包含终结点数据
- 实现函数以定义工具的行为AcadToolImpl::executeCallback()
- 修改 CREATESIMPLE 命令以创建新的工具 UI。
添加新属性
- 使用 Visual Studio 的 ATL 向导,添加一个名为 newproperty 的 newproperty,该属性支持两者和函数。DOUBLEStartX
getput
- 在SimpleTool.h 中,将公共数据成员添加到 thecoclass 以表示新属性:CSimpleTool
double m_StartX;
- 如果 ATL 向导尚未这样做,请将公共方法声明添加到 coclass:getput
STDMETHOD(get_StartX)(/*out, retval*/ DOUBLE* pVal);
STDMETHOD(put_StartX)(/*in*/ DOUBLE newVal);
- 在SimpleTool.cpp 中,属性的实现和方法,如下所示:getput
STDMETHODIMP CSimpleTool:get_StartX(DOUBLE* pVal)
{
(*pVal) = m_StartX;
return S_OK;
}
STDMETHODIMP CSimpleTool:put_StartX(DOUBLE newVal)
{
m_StartX = newVal;
return S_OK;
}
- 对以下每个属性重复步骤 1 到 4,并注意根据需要修改新的成员变量名称和//方法名称:getput
StartY
StartZ
EndX
EndY
EndZ
现在新属性可用,可以使用相应的成员变量来实现行创建例程。
重写 executeCallback() 函数
- 在SimpleTool.cpp 中,添加以下项的空实现:executeCallback()
STDMETHODIMP CSimpleTool::executeCallback()
{
}
- 在语句上方,添加使用工具的起点和终结点属性值来创建实例的代码:returnAcGePoint3d
AcGePoint3d ptStart(m_StartX, m_StartY, m_StartZ);
AcGePoint3d ptEnd(m_EndX, m_EndY, m_EndZ);
- 使用 theand变量,构造一个新对象:ptStartptEndAcDbLine
AcDbLine* pLine = new AcDbLine(ptStart, ptEnd);
- 添加用于创建新的数据库驻留实体的代码:pLineAcDbLine
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId, pLine);
pBlockTableRecord->close();
pLine->close();
- 返回一个指示成功的值:
return S_OK;
- 重新生成应用程序。
这是完成的函数:executeCallback()
STDMETHODIMP CSimpleTool::executeCallback()
{
AcGePoint3d ptStart(m_StartX, m_StartY, m_StartZ);
AcGePoint3d ptEnd(m_EndX, m_EndY, m_EndZ);
AcDbLine* pLine = new AcDbLine(ptStart, ptEnd);
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
AcDb::kForWrite);
pBlockTable->close();
AcDbObjectId lineId;
pBlockTableRecord->appendAcDbEntity(lineId, pLine);
pBlockTableRecord->close();
pLine->close();
return S_OK;
}
若要将功能链接到工具,请在 CREATESIMPLE 命令中调用该方法。executeCallback()CreateToolATC()
- 在SimpleTool项目中,转到 CREATESIMPLE AutoCAD 命令的命令处理程序。
- 在函数调用之后立即将以下行添加到命令实现中:CreateCommandToolATC()
tool.CreateToolATC(pPalette);
- 重新构建应用程序并在 AutoCAD 的新实例中对其进行测试。
当新工具出现在“工具选项板”窗口中时,右键单击该工具并选择“特性”。请注意,将显示新添加的起点和终结点属性。如果在此 UI 中修改其值,则工具将在构造下一行时使用修改后的值。
|