天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 74|回复: 0

ObjectARX创建一条直线并把该直线设置为某一新建图层

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
项目场景:绘制对线并设置图层
画一条线, 并且给这条线设置一个具有新名字的新图层,

但这里有个遗留问题: 如果设置的新的图层名字原本已经有了, 则会把这条线设置到0层, 而不是直接把这条直线设置到已经有重名的那个图层

这个遗留问题等后续再解决吧. 暂时记录下

解决方案:对张帆书中代码进行了修改
首先是创建一条直线
                AcGePoint3d ptStart(0, 0, 0);
                AcGePoint3d ptEnd(-100, 100, 0);
                AcDbObjectId lineId = CLineUtil::Add(ptStart, ptEnd);

创建后再用SetLayer函数进行图层设置

CEntityUtil::SetLayer(lineId, _T("站场图层"))
1
然后用设置图层的函数把这条直线设置上图层信息
void CEntityUtil::SetLayer(AcDbObjectId EntityId, const TCHAR* layerName)
{
        AcDbEntity* pEnt = NULL;
        if (acdbOpenObject(pEnt,EntityId, AcDb::kForWrite)==Acad::eOk)
        {
                AcDbLayerTable* pLayerTbl;
                acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTbl, AcDb::kForWrite);

                if (pLayerTbl->has(layerName))
                {
                        acedPrompt(_T("图层已经存在!"));
                        pEnt->setLayer(layerName);
                        pLayerTbl->close();
                        pEnt->close();
                        return;
                }
                else
                {
                        AcDbLayerTableRecord* pLayerTblRcd;
                        pLayerTblRcd = new AcDbLayerTableRecord;
                        pLayerTblRcd->setName(layerName);

                        AcDbObjectId layerTblRcdId;
                        pLayerTbl->add(layerTblRcdId, pLayerTblRcd);
                        acdbHostApplicationServices()->workingDatabase()->setClayer(layerTblRcdId);
                        pEnt->setLayer(layerTblRcdId);

                        pLayerTblRcd->close();
                        pLayerTbl->close();
                        pEnt->close();
                }
        }
        else
        {
                pEnt->close();
                acutPrintf(_T("实体对象有错误!"));
        }
}

上面的SetLayer函数中的缺陷等后续章节学习后再回头思考问题和解决

张帆书中的SetLayer代码是假设在dwg中已经有了要设置的图层了, 再把对象按照这个既有图层的名字来给对象设置,

如果在dwg中没有要设置的图层, 那么就会赋给对象一个0层作为默认

//张帆书中原版的设置图层代码:
void CEntityUtil::SetLayer(AcDbObjectId EntityId, const TCHAR* layerName)
{
        AcDbEntity* pEnt = NULL;
        if (acdbOpenObject(pEnt, EntityId, AcDb::kForWrite) == Acad::eOk)
        {
                pEnt->setLayer(layerName);
                pEnt->close();
        }
}

 

 

 

 

ObjectARX创建一条直线并把该直线设置为某一新建图层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:47 , Processed in 0.129316 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表