前言
AutoCAD自从2010版本开始,就多了参数化约束的功能,这个功能在三维软件中是很常用的,而从事多年AutoCAD平面制图的人很少用到,对其功能不是很了解。与此同时,对于二次开发人员,操作约束的参考示例例子更是不多,本文抛砖引玉,简单介绍。
提示:首先截几个AutoCAD2014的图,然后上代码进行示例操作
一、操作约束的菜单
autocad2014中的约束分为几何约束和标注约束
1.几何约束:它控制的是对象彼此之间的关系,比如相切、平行、垂直、共线等等。
2.标注约束:它控制的是对象的具体尺寸,比如距离、长度、半径值等等。
一般情况下,我们建议大家先使用几何约束确定图形的形状,再使用标注约束,确定图形的尺寸。
约束可以设置成可见,也可以设置成不可见,具体还有很多自定义设置,如下图:
二、使用约束的意义
下述说明摘抄自网友:
由于传统的cad系统是面向具体的几何形状,属于交互式绘图,要想改变图形大小的尺寸,可能需要对原有的整个图形进行修改或重建,这就增加了设计人员的工作负担,大大降低了工作效率。
而使用参数化的图形,要绘制与该图结构相同,但是尺寸大小不同的图形时,只需根据需要更改对象的尺寸,整个图形将自动随尺寸参数而变化,但形状不变。参数化技术适合应用于绘制结构相似的图形而要绘制参数化图形,“约束”是不可少的要素,约束是应用于二维几何图形的一种关联和限制方法。
其实很多建模工作流都有异曲同工之妙,例如AutoCad的动态快、Revit的族参数化建模、ArchiCAD的GDL参数化建模等等。
三、遍历删除约束
//spaceId是当前workingDataSpace 的ID
Acad::ErrorStatus DeleteAllConstraints(const AcDbObjectId& spaceId)
{
AcDbObjectId networkId = AcDbAssocNetwork::getInstanceFromObject(spaceId, true);
if (networkId.isNull())
{
return Acad::eNullObjectId;
}
AcDbObjectPointer<AcDbAssocNetwork> pNetwork(networkId, kForRead);
if (pNetwork.openStatus() != Acad::eOk)
{
return Acad::eNullObjectId;
}
const AcDbObjectIdArray& actionsInNetwork = pNetwork->getActions();
for (int nCount = 0; nCount < actionsInNetwork.length(); ++nCount)
{
const AcDbObjectId& idAction = actionsInNetwork[nCount];
if (idAction == AcDbObjectId::kNull)
continue;
if ( actionsInNetwork[nCount].objectClass() == NULL ||
!actionsInNetwork[nCount].objectClass()->isDerivedFrom(
AcDbAssoc2dConstraintGroup::desc()))
continue;
AcDbObjectPointer<AcDbAssoc2dConstraintGroup> pAction(idAction, kForWrite);
if (pAction.openStatus() != Acad::eOk)
continue;
AcDbAssoc2dConstraintGroup* pConstGrp = static_cast<AcDbAssoc2dConstraintGroup*>(pAction.object());
if (!pConstGrp)
continue;
pConstGrp->erase();
}
return Acad::eOk;
}
## 2.关键说明
AcDbAssoc2dConstraintGroup:
所有的约束关系都保存在约束组(AcDbAssoc2dConstraintGroup)里面,怎样获得约束组即是关键所在。
总结
…