在CSCAD中,可以通过设置实体间的约束关系,实现实体关联。具体代码如下:
bool addConstraintsGroup(AcDbObjectIdArray &ids, AcConstraint::ConstraintType nType, AcDbDatabase *pDb)
{
if (!pDb) {
return false;
}
AcConstraintsGroupPtr pGroup = acdb3DCGetConstraintsGroup(pDb->currentSpaceId(), true);
if (pGroup.isNull()) {
return false;
}
if (ids.length() < 2) {
return false;
}
AcDbFullSubentPathArray paths;
for (int i = 0; i < ids.length(); i++) {
AcDbFullSubentPath path;
path.objectIds().append(ids[i]);
AcDbSubentId subentId;
subentId.setIndex(1);
subentId.setType(AcDb::kNullSubentType);
path.subentId() = subentId;
paths.append(path);
}
if (paths.length() < 2) {
return false;
}
AcString sName = ACRX_T("Unknown");
switch (nType) {
case AcConstraint::eAc3DAngle:
sName = ACRX_T("3DAngle");
break;
case AcConstraint::eAc3DCoincident:
sName = ACRX_T("3DCoincident");
break;
case AcConstraint::eAc3DConcentric:
sName = ACRX_T("3DConcentric");
break;
case AcConstraint::eAc3DDistance:
sName = ACRX_T("3DDistance");
break;
case AcConstraint::eAc3DFix:
sName = ACRX_T("3DFix");
break;
case AcConstraint::eAc3DMajorRadius:
sName = ACRX_T("3DMajorRadius");
break;
case AcConstraint::eAc3DMinorRadius:
sName = ACRX_T("3DMinorRadius");
break;
case AcConstraint::eAc3DParallel:
sName = ACRX_T("3DParallel");
break;
case AcConstraint::eAc3DPerpendicular:
sName = ACRX_T("3DPerpendicular");
break;
case AcConstraint::eAc3DPlanarAngle:
sName = ACRX_T("3DPlanarAngle");
break;
case AcConstraint::eAc3DRadius:
sName = ACRX_T("3DRadius");
break;
case AcConstraint::eAc3DRigidSet:
sName = ACRX_T("3DRigidSet");
break;
case AcConstraint::eAc3DTangent:
sName = ACRX_T("3DTangent");
break;
case AcConstraint::eAcCircularArray:
sName = ACRX_T("CircularArray");
break;
case AcConstraint::eAcObjectAngle:
sName = ACRX_T("ObjectAngle");
break;
case AcConstraint::eAcPath:
sName = ACRX_T("Path");
break;
}
AcConstraintPtr pConstraint = pGroup->addConstraint(nType, paths);
if (pConstraint.isNull()) {
acutPrintf(ACRX_T("\n ==> Err: addConstraint failed"));
return false;
} else {
if (pConstraint->setName(sName) != Acad::eOk) {
return false;
}
}
return true;
}