CAD二次开发学习笔记四(得到选中的实体,修改实体,如等分线段)
AcGeVector3d是点阵的集合,通过等分点的差集得到。
新的点可以通过点与点阵相差得到。
1.移动命令的使用
输入m然后选择线段,或者线段的端点,就出现移动的辅助线。
2.ap可以加载也可以卸载,选中要卸载的。
新的点可以通过点与点阵相差得到。
大气象
public:
// - ArxProject2.partLine command (do not rename)
static void ArxProject2partLine(void)
{
// Add your code for command ArxProject2.partLine here
ads_name entName;
ads_point pt;
acedEntSel( _T("\n选择:"),entName,pt);//得到选中的实体
AcDbObjectId ObjId;//得到实体ID
if( acdbGetObjectId(ObjId,entName) != Acad::eOk )//如果没有选中的实体则返回
{
acutPrintf( _T("\nno"));
return;
}
AcDbEntity* pEnt;//得到实体
if( acdbOpenObject(pEnt,ObjId,AcDb::kForRead) == Acad::eOk)
{
acutPrintf( _T("\nok"));
AcDbLine* pLine = (AcDbLine* )pEnt;//强制转换
AcGePoint3d ptStart = pLine->startPoint();//得到起点
AcGePoint3d ptEnd = pLine->endPoint();
pEnt->close();
//根据点和线的方向生成点组,绘制线段
int nPart = 5;//五等分
AcGeVector3d Vect = (ptEnd - ptStart)/nPart;//矩阵,点与点的差集平分可得到
for (int n=0; n<nPart; n++)
{
AcDbObjectId ObjIdNew;
MakeLine(ptStart+n*Vect,ptStart+(n+1)*Vect,ObjIdNew);//等分线段的方法
}
//将选中的线段删除,
if( acdbOpenObject(pEnt,ObjId,AcDb::kForWrite) == Acad::eOk )
{
pEnt->erase();
pEnt->close();
}
}
}
//将实体添加到数据库
//cad中的实体最终都要添加到数据库中才能被显示(图纸其实是一个数据库格式的),所以它的作用就是添加实体到数据库中
static Acad::ErrorStatus AddToDb(AcDbEntity* ent, AcDbObjectId& objId)
{
Acad::ErrorStatus es;
AcDbBlockTable* pBlockTable;
AcDbBlockTableRecord* pSpaceRecord;
if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead))
!= Acad::eOk) {
return es;
}
if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,
pSpaceRecord,
AcDb::kForWrite)) != Acad::eOk) {
return es;
}
if ((es = pBlockTable->close()) != Acad::eOk) {
return es;
}
if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) {
return es;
}
return pSpaceRecord->close();
}
private://画线函数
static void MakeLine(AcGePoint3d ptStart,AcGePoint3d ptEnd,AcDbObjectId lineId)
{
AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);
if(AddToDb(pLine,lineId)!=Acad::eOk)//传入指针,传出id
AfxMessageBox( _T("加入实体到数据库失败!"));
pLine->close();
}
// - ArxProject2.partLine command (do not rename)
static void ArxProject2partLine(void)
{
// Add your code for command ArxProject2.partLine here
ads_name entName;
ads_point pt;
acedEntSel( _T("\n选择:"),entName,pt);//得到选中的实体
AcDbObjectId ObjId;//得到实体ID
if( acdbGetObjectId(ObjId,entName) != Acad::eOk )//如果没有选中的实体则返回
{
acutPrintf( _T("\nno"));
return;
}
AcDbEntity* pEnt;//得到实体
if( acdbOpenObject(pEnt,ObjId,AcDb::kForRead) == Acad::eOk)
{
acutPrintf( _T("\nok"));
AcDbLine* pLine = (AcDbLine* )pEnt;//强制转换
AcGePoint3d ptStart = pLine->startPoint();//得到起点
AcGePoint3d ptEnd = pLine->endPoint();
pEnt->close();
//根据点和线的方向生成点组,绘制线段
int nPart = 5;//五等分
AcGeVector3d Vect = (ptEnd - ptStart)/nPart;//矩阵,点与点的差集平分可得到
for (int n=0; n<nPart; n++)
{
AcDbObjectId ObjIdNew;
MakeLine(ptStart+n*Vect,ptStart+(n+1)*Vect,ObjIdNew);//等分线段的方法
}
//将选中的线段删除,
if( acdbOpenObject(pEnt,ObjId,AcDb::kForWrite) == Acad::eOk )
{
pEnt->erase();
pEnt->close();
}
}
}
//将实体添加到数据库
//cad中的实体最终都要添加到数据库中才能被显示(图纸其实是一个数据库格式的),所以它的作用就是添加实体到数据库中
static Acad::ErrorStatus AddToDb(AcDbEntity* ent, AcDbObjectId& objId)
{
Acad::ErrorStatus es;
AcDbBlockTable* pBlockTable;
AcDbBlockTableRecord* pSpaceRecord;
if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead))
!= Acad::eOk) {
return es;
}
if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,
pSpaceRecord,
AcDb::kForWrite)) != Acad::eOk) {
return es;
}
if ((es = pBlockTable->close()) != Acad::eOk) {
return es;
}
if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) {
return es;
}
return pSpaceRecord->close();
}
private://画线函数
static void MakeLine(AcGePoint3d ptStart,AcGePoint3d ptEnd,AcDbObjectId lineId)
{
AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);
if(AddToDb(pLine,lineId)!=Acad::eOk)//传入指针,传出id
AfxMessageBox( _T("加入实体到数据库失败!"));
pLine->close();
}
另外是几个CAD用法:
1.移动命令的使用
输入m然后选择线段,或者线段的端点,就出现移动的辅助线。
2.ap可以加载也可以卸载,选中要卸载的。
我这个博客废弃不用了,今天想寻找外链的时候,突然想到这个博客权重很高。
有需要免费外链的,留言即可,我准备把这个博客变成免费的友情链接站点。