static AcBr::ErrorStatus TraverseFaces(const AcBrBrep& brepEntity, const AcGePoint3d& pointToTest)
{
AcBr::ErrorStatus returnValue = AcBr::eOk;
// make a global face traverser
AcBrBrepFaceTraverser brepFaceTrav;
returnValue = brepFaceTrav.setBrep(brepEntity);
if (returnValue != AcBr::eOk)
{
acutPrintf(ACRX_T("\n Error in AcBrBrepFaceTraverser::setBrep:"));
errorReport(returnValue);
return returnValue;
}
int faceCount = 0;
while (!brepFaceTrav.done() && (returnValue == AcBr::eOk))
{
++faceCount;
AcBrFace face;
if (brepFaceTrav.getFace(face) == AcBr::ErrorStatus::eOk)
{
AcGeSurface* pSurface;
if (face.getSurface(pSurface) == AcBr::ErrorStatus::eOk)
{
AcGePoint3d closestPoint = pSurface->closestPointTo(pointToTest);
double dist = AcGeVector3d(closestPoint.asVector() - pointToTest.asVector()).length();
acutPrintf(L"\n - Face[%d]: closest point [%f, %f, %f] Distance: %f", faceCount, closestPoint.x, closestPoint.y, closestPoint.z, dist);
delete pSurface;
}
}
returnValue = brepFaceTrav.next();
if (returnValue != AcBr::eOk) {
acutPrintf(ACRX_T("\n Error in AcBrBrepFaceTraverser::next:"));
errorReport(returnValue);
return returnValue;
}
}
return returnValue;
}
void TestClosestPoint(void)
{
AcBr::ErrorStatus returnValue = AcBr::eOk;
Acad::ErrorStatus acadReturnValue = eOk;
AcGePoint3d pointToTest;
// pick a point
acedGetPoint(NULL, L"\nPick a point: ", asDblArray(pointToTest));
// Get the subentity path for a brep
AcDbFullSubentPath subPath(kNullSubent);
acadReturnValue = selectEntity(AcDb::kNullSubentType, subPath);
if (acadReturnValue != eOk)
{
acutPrintf(ACRX_T("\n Error in getPath: %d"), acadReturnValue);
return;
}
// Make a brep entity to access the solid
AcBrBrep brepEntity;
returnValue = ((AcBrEntity*)&brepEntity)->set(subPath);
if (returnValue != AcBr::eOk)
{
acutPrintf(ACRX_T("\n Error in AcBrBrep::set:"));
errorReport(returnValue);
return;
}
returnValue = TraverseFaces(brepEntity, pointToTest);
if (returnValue != AcBr::eOk)
{
acutPrintf(ACRX_T("\n Error in TraverseFaces:"));
errorReport(returnValue);
return;
}
}