ObjectArx-C++实现设计起点里程绘制命令-选中图层中的线路实体
C++实现设计起点里程绘制命令-选中图层中的线路实体。
主要思路是:
- 先选择设计起点公里标插入点。
- 打开图层列表,选中线路。
- 绘制设计起点公里标。
图例如下:
示例如下:
- 选择设计起点公里标插入点
```c++
//zhaoanan 设计起点绘制
// - zndraw_thdskmpost command (do not rename)
//自定义设计起点绘制
static void zndraw_thdskmpost(void)
{
AcDbDatabase m_pDb = acdbHostApplicationServices()->workingDatabase() ;
CUserSystem mysys = new CUserSystem();
mysys->m_pDb = m_pDb;
acutPrintf(_T("\n设计起点绘制")) ;
//声明左边插入点
ads_point pt_insert;
AcGePoint3d pt_3d_insert;
ads_name en ;
ads_point pt ;
BOOL bReturn = false ;
while (bReturn == false)
{
int iReturn = acedGetPoint(NULL,_T("\n 指定设计起点的插入点:"),pt_insert) ;
//int iReturn = acedEntSel(_T("\n选择实体对象"), en, pt) ;
if(iReturn == RTNORM)
{
bReturn = true ;
pt_3d_insert =asPnt3d(pt_insert);
acutPrintf(_T("\n设计起点插入点坐标:x坐标为:%f,y坐标为:%f"), pt_3d_insert.x, pt_3d_insert.y);
//绘制设计起点公里标
AcDbObjectId objectId = getThdsLineObjectId();
// TODO: 在此添加设计起点绘制程序代码
try{
// 1.创建公里标
CthDimension *dimensionEntity = new CthDimension();
// 2.声明组件
CthComponent *lineCp = new CthComponent();
// 3.添加直线到组件中
CthLine *pl = lineCp->addLine( AcGePoint3d(), AcGePoint3d(20, 0, 0));
//添加文字
AcGeVector3d offsetText(0, 2, 0);
CthText *text = lineCp->addText(_T(""), offsetText, 2.5);
text->setName(_T("里程"));
text->setRotation(0);
text->setAlign(AcDbMText::kMiddleLeft);
//添加里程中的设备名称
// 4.添加设计起点标注到组件中
CString content = _T("设计起点");
AcGeVector3d offsetTextName(25, 2, 0);
text = lineCp->addText(content , offsetTextName, 2.5);
text->setName(_T("内容"));
text->setRotation(0);
text->setAlign(AcDbMText::kMiddleLeft);
dimensionEntity->appendComponent(lineCp);
//添加插入基点
dimensionEntity->setPosition(pt_3d_insert);
//添加旋转角度
dimensionEntity->setRotation(PI/2);
//设置关联
dimensionEntity->setDependencyId(objectId);
// 5.添加线路的objectid到里程实体的DependencyId中
// 6.保存新对象到数据库中 Save the new object to the database
//保存当前图层,设置要绘制的图层
AcDbObjectId ojbIdLayerOld = m_pDb->clayer() ;
//将里程实体加入到块表记录中
AcDbObjectId dimensionId = CDwgDatabaseUtil::PostToModelSpace(dimensionEntity, m_pDb);
}
catch (CMemoryException* e)
{
ads_printf(_T("CMemoryException in zhfzndraw_thdskmpost")) ;
}
catch (CFileException* e)
{
ads_printf(_T("CFileException in zhfzndraw_thdskmpost")) ;
}
catch (CException* e)
{
ads_printf(_T("CException in zhfzndraw_thdskmpost")) ;
}
catch (_com_error& e)
{
CString sBuff = CBlkUtility::GetErrorDescription(e) ;
ads_printf(sBuff) ;
}
catch (...)
{
ads_printf(_T("unknown CException in zhfzndraw_thdskmpost")) ;
}
// return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
else if (iReturn == RTERROR)
{
bReturn = false ;
}
else if (iReturn == RTCAN) {
bReturn = true ;
}
}
//保存当前图层,设置要绘制的图层
AcDbObjectId ojbIdLayerOld = m_pDb->clayer() ;
m_pDb->setClayer(ojbIdLayerOld) ; //恢复当前图层
//释放mysys空间
if (mysys != nullptr)
{
delete mysys;
}
}
2. **打开图层列表,选中线路**
/****/
/-------------------------getThdsLine------------------------------------------/
/*日期:2020-11-19**/
/*作者:zhaoanan****/
/*函数功能:绘制设计起点公里标**/
/*输入参数:void****/
/*输出参数:void**/
/*返回值: 无***/
/****/
static AcDbObjectId getThdsLineObjectId(){
//获取cad数据库对象地址
AcDbDatabase m_pDb = acdbHostApplicationServices()->workingDatabase();
//添加块定义
acutPrintf(_T("\n选择设计起点线路")) ;
//初始化CUserSystem
CUserSystem mysys = new CUserSystem();
//赋值cad数据库对象地址
mysys->m_pDb = m_pDb;
//声明选择集名称
ads_name en ;
//声明选择集坐标
ads_point pt ;
//设置循环布尔值
BOOL bReturn = false ;
//选择实体对象
while (bReturn == false)
{
//单个选择集
int iReturn = acedEntSel(_T("\n选择线路"), en, pt) ;
//如果选中实体
if(iReturn == RTNORM)
{
AcDbEntity pEnt = NULL ;
//打开选中的实体
if(mysys->OpenAcDbEntity(en, pEnt, AcDb::kForRead))
{
//设置高亮
pEnt->highlight();
acedUpdateDisplay();
//如果选中线路实体
if(pEnt->isKindOf(CthRailLine::desc()))
{
//设置循环布尔值true
bReturn = true ;
//转换选择对象为实体对象
CthRailLine pCthEnt = CthRailLine::cast(pEnt) ;
//返回实体地址
AcDbObjectId objectId = pCthEnt->id();
//返回之前关闭实体
if(pEnt!=NULL)
{
pEnt->unhighlight() ;
acedUpdateDisplay();
pEnt->close();
}
//返回之前关闭用户操作对象
if(mysys!=NULL)
{
delete mysys;
}
return objectId;
}
else
{
//如果选择的不是本工具支持的实体,重新选择
AfxMessageBox(_T("选择的不是本工具支持的实体!")) ;
//设置循环布尔值false
bReturn = false ;
}
//还原设置高亮
pEnt->unhighlight() ;
acedUpdateDisplay();
}
//关闭实体对象
if(pEnt!=NULL)
{
pEnt->close();
}
}
//其它错误按键
else if (iReturn == RTERROR)
{
bReturn = false ;
}
//按下ctrl+c按键
else if (iReturn == RTCAN) {
bReturn = true ;
}
}
if(mysys!=NULL)
{
delete mysys;
}
//返回空地址
return NULL;
}
3. **AcedCommand命令不能选中图层,修改命令调用方式,直接调用**
//zhaoanan 坡度编辑
DTEntityItem* pEntityItem = g_pGallery->GetCatalogByIndex(pPalette->m_iIndex)->GetEntityItemByIndex(g_pCtrlGsPreview->m_iIndex);
//设计起点需要选中图层中的线路,而acedCommand命令不能选中图层,add by zhao_anan 20201120 begin
if (pEntityItem->GetCommand() == _T("thdskmpost"))
{
zndraw_thdskmpost();
}
//设计起点需要选中图层中的线路,而acedCommand命令不能选中图层,add by zhao_anan 20201120 end
else
{
acedCommand(RTSTR, pEntityItem->GetCommand(), RTNONE);
}
4. 参考意见和网页地址:
1. 无