static AcBr::ErrorStatus faceToTrimmedSurface(AcBrFace& faceEntity) { AcBr::ErrorStatus returnValue = AcBr::eOk; // This is the full trimmed face, which may split to multiple surfaces. Adesk::UInt32 numNurbs = 0; AcGeExternalBoundedSurface** nurbs = NULL; returnValue = faceEntity.getSurfaceAsTrimmedNurbs(numNurbs, nurbs); if (returnValue != AcBr::eOk) { acutPrintf(ACRX_T("\n Error in AcBrFace::getSurfaceAsTrimmedNurbs:")); errorReport(returnValue); return returnValue; } acutPrintf(ACRX_T("\nSurface As Trimmed Nurbs\n")); for (Adesk::UInt32 i = 0; i < numNurbs; i++) { AcGeInterval uParam, vParam; nurbs[i]->getEnvelope(uParam, vParam); int numBoundaries = 0; AcGeCurveBoundary* pBoundaries = NULL; nurbs[i]->getContours(numBoundaries, pBoundaries); if ((numBoundaries == 0) || (pBoundaries == NULL)) return AcBr::eMissingGeometry; acutPrintf(ACRX_T("\n*Trimmed Surface No. %d\n"), i+1); acutPrintf(ACRX_T(" Parameter space bounds are ((")); if (uParam.isBoundedBelow()) { acutPrintf(ACRX_T("%lf, "), uParam.lowerBound()); } else { acutPrintf(ACRX_T("-INF, ")); } if (uParam.isBoundedAbove()) { acutPrintf(ACRX_T("%lf "), uParam.upperBound()); } else { acutPrintf(ACRX_T("INF ")); } acutPrintf(ACRX_T("), (\n")); if (vParam.isBoundedBelow()) { acutPrintf(ACRX_T("%lf, "), vParam.lowerBound()); } else { acutPrintf(ACRX_T("-INF, ")); } if (vParam.isBoundedAbove()) { acutPrintf(ACRX_T("%lf "), vParam.upperBound()); } else { acutPrintf(ACRX_T("INF ")); } acutPrintf(ACRX_T("))\n")); for (int j = 0; j < numBoundaries; j++) { int numCurveElements = 0; AcGeEntity3d** ppCurves = NULL; AcGeCurve2d** ppPcurves = NULL; Adesk::Boolean* pOrient3d = NULL; Adesk::Boolean* pOrient2d = NULL; pBoundaries[j].getContour(numCurveElements, &ppCurves, &ppPcurves, &pOrient3d, &pOrient2d); if ((numCurveElements == 0) || (ppCurves == NULL) || (pOrient3d == NULL)) return AcBr::eMissingGeometry; acutPrintf(ACRX_T("\n**Surface Boundary Contour No. %d\n"), j+1); for (int k = 0; k < numCurveElements; k++) { acutPrintf(ACRX_T("\n***Contour Curve Element No. %d\n"), k+1); switch (ppCurves[k]->type()) { case(AcGe::kPosition3d): { AcGePoint3d pt(*(AcGePosition3d*)ppCurves[k]); acutPrintf(ACRX_T("\n****Contour Curve Degenerate Point is (")); acutPrintf (ACRX_T("%lf, "), pt.x); acutPrintf (ACRX_T("%lf, "), pt.y); acutPrintf (ACRX_T("%lf"), pt.z); acutPrintf(ACRX_T(")\n")); break; } case(AcGe::kExternalCurve3d): { // Make sure the interval is legal and bounded AcGeInterval intrvl; ((AcGeExternalCurve3d*)ppCurves[k])->getInterval(intrvl); if ((!intrvl.isBounded()) || (intrvl.length() < 0.0)) return (AcBr::ErrorStatus)Acad::eAmbiguousOutput; AcGePoint3d startPt = ((AcGeExternalCurve3d*)ppCurves[k])->evalPoint(intrvl.lowerBound()); AcGePoint3d endPt = ((AcGeExternalCurve3d*)ppCurves[k])->evalPoint(intrvl.upperBound()); acutPrintf(ACRX_T("\n****Contour Curve Start Point is (")); acutPrintf (ACRX_T("%lf , "), startPt.x); acutPrintf (ACRX_T("%lf , "), startPt.y); acutPrintf (ACRX_T("%lf "), startPt.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T("\n****Contour Curve End Point is (")); acutPrintf (ACRX_T("%lf , "), endPt.x); acutPrintf (ACRX_T("%lf , "), endPt.y); acutPrintf (ACRX_T("%lf "), endPt.z); acutPrintf(ACRX_T(")\n")); pOrient3d[k] ? acutPrintf(ACRX_T("\n****Contour Curve Orientation is Positive\n")) : acutPrintf(ACRX_T("\n****Contour Curve Orientation is Negative\n")); break; } default: acutPrintf(ACRX_T("\nfaceToTrimmedSurface: Illegal Contour Entity Type\n")); return (AcBr::ErrorStatus)Acad::eAmbiguousOutput; } delete ppCurves[k]; if (ppPcurves[k]->type() == AcGe::kExternalCurve2d) { // Dump the start and end points in UV space to locate gaps AcGePoint2d startPt, endPt, lastEndPt; ((AcGeExternalCurve2d*)ppPcurves[k])->hasStartPoint(startPt); ((AcGeExternalCurve2d*)ppPcurves[k])->hasEndPoint(endPt); if (k) ((AcGeExternalCurve2d*)ppPcurves[k-1])->hasEndPoint(lastEndPt); else ((AcGeExternalCurve2d*)ppPcurves[numCurveElements-1])->hasEndPoint(lastEndPt); acutPrintf(ACRX_T("\n****Contour Curve UV-Dist from last is (")); ACHAR s[80] = ACRX_T(""); _stprintf(s, ACRX_T("%g)\n"), (startPt-lastEndPt).length()); acutPrintf(s); acutPrintf(ACRX_T("\n****Contour Parameter Curve Start Point is (")); acutPrintf (ACRX_T("%lf , "), startPt.x); acutPrintf (ACRX_T("%lf "), startPt.y); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T("\n****Contour Parameter Curve End Point is (")); acutPrintf (ACRX_T("%lf , "), endPt.x); acutPrintf (ACRX_T("%lf "), endPt.y); acutPrintf(ACRX_T(")\n")); pOrient2d[k] ? acutPrintf(ACRX_T("\n****Contour Parameter Curve Orientation is Positive\n")) : acutPrintf(ACRX_T("\n****Contour Parameter Curve Orientation is Negative\n")); } else { acutPrintf(ACRX_T("\nfaceToTrimmedSurface: Illegal Contour Entity Type\n")); return (AcBr::ErrorStatus)Acad::eAmbiguousOutput; } //delete ppPcurves[k]; } delete[] ppCurves; delete[] ppPcurves; delete[] pOrient3d; delete[] pOrient2d; } delete[] pBoundaries; delete nurbs[i]; } delete[] nurbs; return returnValue; }
AcBr::ErrorStatus faceDump(const AcBrFace& faceEntity) { AcBr::ErrorStatus returnValue = AcBr::eOk; // Verify that AcBr was explicitly and not implicitly loaded, // by testing ObjectARX functions (which are unavailable unless // explicitly loaded) if (faceEntity.isA() == NULL) { acutPrintf(ACRX_T("\n faceDump: AcBrEntity::isA() failed\n")); return returnValue; } if (!faceEntity.isKindOf(AcBrFace::desc())) { acutPrintf(ACRX_T("\n faceDump: AcBrEntity::isKindOf() failed\n")); return returnValue; } AcBrEntity* entClass = (AcBrEntity*)&faceEntity; AcBrEdge* pEdge = AcBrEdge::cast(entClass); if (pEdge != NULL) { acutPrintf(ACRX_T("\n faceDump: AcBrEntity::cast() failed\n")); return (AcBrErrorStatus)Acad::eNotThatKindOfClass; } AcGe::EntityId entId; returnValue = faceEntity.getSurfaceType(entId); if (returnValue != AcBr::eOk) { acutPrintf(ACRX_T("\n Error in AcBrFace::getSurfaceType:")); errorReport(returnValue); return returnValue; } AcGeSurface* surfaceGeometry = NULL; AcGeSurface* nativeGeometry = NULL; // NOTE: ignore unsupported geometry types for now, since we already know // that elliptic cylinders and elliptic cones are rejected by AcGe, but we // can still perform useful evaluations on the external bounded surface. returnValue = getNativeSurface(faceEntity, surfaceGeometry, nativeGeometry); if ((returnValue != AcBr::eOk) && (returnValue != (AcBrErrorStatus)Acad::eInvalidInput)) { acutPrintf(ACRX_T("\n Error in getNativeSurface:")); errorReport(returnValue); delete surfaceGeometry; delete nativeGeometry; return returnValue; } switch (entId) { case(kPlane): { acutPrintf(ACRX_T("\nSurface Type: Plane\n")); AcGePlane* planeGeometry = (AcGePlane*)nativeGeometry; AcGePoint3d pt = planeGeometry->pointOnPlane(); AcGeVector3d normal = planeGeometry->normal(); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" Point on Plane is (")); acutPrintf (ACRX_T("%lf , "), pt.x); acutPrintf (ACRX_T("%lf , "), pt.y); acutPrintf (ACRX_T("%lf "), pt.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Plane normal direction is (")); acutPrintf (ACRX_T("%lf , "), normal.x); acutPrintf (ACRX_T("%lf , "), normal.y); acutPrintf (ACRX_T("%lf "), normal.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } case(kSphere): { acutPrintf(ACRX_T("\nSurface Type: Sphere\n")); AcGeSphere* sphereGeometry = (AcGeSphere*)nativeGeometry; AcGePoint3d centre = sphereGeometry->center(); double ang1, ang2, ang3, ang4; sphereGeometry->getAnglesInU(ang1, ang2); sphereGeometry->getAnglesInV(ang3, ang4); AcGePoint3d north = sphereGeometry->northPole(); AcGePoint3d south = sphereGeometry->southPole(); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" Sphere centre is (")); acutPrintf (ACRX_T("%lf , "), centre.x); acutPrintf (ACRX_T("%lf , "), centre.y); acutPrintf (ACRX_T("%lf "), centre.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Sphere radius is %lf\n"), sphereGeometry->radius()); acutPrintf(ACRX_T(" Sphere start angle in U is %lf\n"), ang1); acutPrintf(ACRX_T(" Sphere end angle in U is %lf\n"), ang2); acutPrintf(ACRX_T(" Sphere start angle in V is %lf\n"), ang3); acutPrintf(ACRX_T(" Sphere end angle in V is %lf\n"), ang4); acutPrintf(ACRX_T(" Sphere north pole is (")); acutPrintf (ACRX_T("%lf , "), north.x); acutPrintf (ACRX_T("%lf , "), north.y); acutPrintf (ACRX_T("%lf "), north.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Sphere south pole is (")); acutPrintf (ACRX_T("%lf , "), south.x); acutPrintf (ACRX_T("%lf , "), south.y); acutPrintf (ACRX_T("%lf "), south.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } case(kTorus): { acutPrintf(ACRX_T("\nSurface Type: Torus\n")); AcGeTorus* torusGeometry = (AcGeTorus*)nativeGeometry; AcGePoint3d centre = torusGeometry->center(); double ang1, ang2, ang3, ang4; torusGeometry->getAnglesInU(ang1, ang2); torusGeometry->getAnglesInV(ang3, ang4); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" Torus centre is (")); acutPrintf (ACRX_T("%lf , "), centre.x); acutPrintf (ACRX_T("%lf , "), centre.y); acutPrintf (ACRX_T("%lf "), centre.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Torus major radius is %lf\n"), torusGeometry->majorRadius()); acutPrintf(ACRX_T(" Torus minor radius is %lf\n"), torusGeometry->minorRadius()); acutPrintf(ACRX_T(" Torus start angle in U is %lf\n"), ang1); acutPrintf(ACRX_T(" Torus end angle in U is %lf\n"), ang2); acutPrintf(ACRX_T(" Torus start angle in V is %lf\n"), ang3); acutPrintf(ACRX_T(" Torus end angle in V is %lf\n"), ang4); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } case(kCylinder): { acutPrintf(ACRX_T("\nSurface Type: Circular Cylinder\n")); AcGeCylinder* cylinderGeometry = (AcGeCylinder*)nativeGeometry; AcGePoint3d origin = cylinderGeometry->origin(); double ang1, ang2; cylinderGeometry->getAngles(ang1, ang2); AcGeInterval ht; cylinderGeometry->getHeight(ht); double height = ht.upperBound() - ht.lowerBound(); AcGeVector3d refAxis = cylinderGeometry->refAxis(); AcGeVector3d symAxis = cylinderGeometry->axisOfSymmetry(); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" Circular Cylinder origin is (")); acutPrintf (ACRX_T("%lf , "), origin.x); acutPrintf (ACRX_T("%lf , "), origin.y); acutPrintf (ACRX_T("%lf "), origin.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Circular Cylinder radius is %lf\n"), cylinderGeometry->radius()); acutPrintf(ACRX_T(" Circular Cylinder start angle is %lf\n"), ang1); acutPrintf(ACRX_T(" Circular Cylinder end angle is %lf\n"), ang2); if (cylinderGeometry->isClosedInU()) acutPrintf(ACRX_T(" Circular Cylinder height is %lf\n"), height); else acutPrintf(ACRX_T(" Circular Cylinder is not closed in U\n")); acutPrintf(ACRX_T(" Circular Cylinder reference axis is (")); acutPrintf (ACRX_T("%lf , "), refAxis.x); acutPrintf (ACRX_T("%lf , "), refAxis.y); acutPrintf (ACRX_T("%lf "), refAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Circular Cylinder axis of symmetry is (")); acutPrintf (ACRX_T("%lf , "), symAxis.x); acutPrintf (ACRX_T("%lf , "), symAxis.y); acutPrintf (ACRX_T("%lf "), symAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } case(kCone): { acutPrintf(ACRX_T("\nSurface Type: Circular Cone\n")); AcGeCone* coneGeometry = (AcGeCone*)nativeGeometry; AcGePoint3d centre = coneGeometry->baseCenter(); double ang1, ang2; coneGeometry->getAngles(ang1, ang2); AcGeVector3d axis1 = coneGeometry->axisOfSymmetry(); AcGeVector3d axis2 = coneGeometry->refAxis(); AcGePoint3d apex = coneGeometry->apex(); double cosAng, sinAng; coneGeometry->getHalfAngle(cosAng, sinAng); AcGeInterval ht; coneGeometry->getHeight(ht); double height = ht.upperBound() - ht.lowerBound(); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" Circular Cone base centre is (")); acutPrintf (ACRX_T("%lf , "), centre.x); acutPrintf (ACRX_T("%lf , "), centre.y); acutPrintf (ACRX_T("%lf "), centre.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Circular Cone base radius is %lf\n"), coneGeometry->baseRadius()); acutPrintf(ACRX_T(" Circular Cone start angle is %lf\n"), ang1); acutPrintf(ACRX_T(" Circular Cone end angle is %lf\n"), ang2); acutPrintf(ACRX_T(" Circular Cone axis of symmetry is (")); acutPrintf (ACRX_T("%lf , "), axis1.x); acutPrintf (ACRX_T("%lf , "), axis1.y); acutPrintf (ACRX_T("%lf "), axis1.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Circular Cone reference axis is (")); acutPrintf (ACRX_T("%lf , "), axis2.x); acutPrintf (ACRX_T("%lf , "), axis2.y); acutPrintf (ACRX_T("%lf "), axis2.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Circular Cone apex is (")); acutPrintf (ACRX_T("%lf , "), apex.x); acutPrintf (ACRX_T("%lf , "), apex.y); acutPrintf (ACRX_T("%lf "), apex.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Circular Cone cosine of major half-angle is %lf\n"), cosAng); acutPrintf(ACRX_T(" Circular Cone sine of major half-angle is %lf\n"), sinAng); if (coneGeometry->isClosedInU()) acutPrintf(ACRX_T(" Circular Cone height is %lf\n"), height); else acutPrintf(ACRX_T(" Circular Cone is not closed in U\n")); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } case(kNurbSurface): { acutPrintf(ACRX_T("\nSurface Type: NURB Surface\n")); AcGeNurbSurface* nurbGeometry = (AcGeNurbSurface*)nativeGeometry; int nCtrlPtsU = nurbGeometry->numControlPointsInU(); int nCtrlPtsV = nurbGeometry->numControlPointsInV(); int nKnotsU = nurbGeometry->numKnotsInU(); int nKnotsV = nurbGeometry->numKnotsInV(); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" NURB Surface degree in U is %d\n"), nurbGeometry->degreeInU()); acutPrintf(ACRX_T(" NURB Surface degree in V is %d\n"), nurbGeometry->degreeInV()); acutPrintf(ACRX_T(" NURB Surface number of control points in U is %d\n"), nCtrlPtsU); acutPrintf(ACRX_T(" NURB Surface number of control points in V is %d\n"), nCtrlPtsV); acutPrintf(ACRX_T(" NURB Surface number of knots in U is %d\n"), nKnotsU); acutPrintf(ACRX_T(" NURB Surface number of knots in V is %d\n"), nKnotsV); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } // NOTE: This surface is not yet supported in AcGe, so we infer the definition // data by analysing evaluated data on the external bounded surface. case(kEllipCylinder): { acutPrintf(ACRX_T("\nSurface Type: Elliptic Cylinder\n")); AcGePoint3d p0 = surfaceGeometry->evalPoint(AcGePoint2d(0.0, 0.0)); AcGePoint3d p1 = surfaceGeometry->evalPoint(AcGePoint2d(0.0, kPi)); AcGePoint3d p2 = surfaceGeometry->evalPoint(AcGePoint2d(0.0, kHalfPi)); AcGePoint3d origin(((p0.x + p1.x) / 2.0), ((p0.y + p1.y) / 2.0), ((p0.z + p1.z) / 2.0)); AcGeVector3d majAxis = p0 - origin; AcGeVector3d minAxis = p2 - origin; AcGeVector3d symAxis = (majAxis.crossProduct(minAxis)).normalize(); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" Elliptic Cylinder origin is (")); acutPrintf (ACRX_T("%lf , "), origin.x); acutPrintf (ACRX_T("%lf , "), origin.y); acutPrintf (ACRX_T("%lf "), origin.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Elliptic Cylinder major radius is %lf\n"), majAxis.length()); acutPrintf(ACRX_T(" Elliptic Cylinder minor radius is %lf\n"), minAxis.length()); acutPrintf(ACRX_T(" Elliptic Cylinder major axis is (")); acutPrintf (ACRX_T("%lf , "), majAxis.x); acutPrintf (ACRX_T("%lf , "), majAxis.y); acutPrintf (ACRX_T("%lf "), majAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Elliptic Cylinder minor axis is (")); acutPrintf (ACRX_T("%lf , "), minAxis.x); acutPrintf (ACRX_T("%lf , "), minAxis.y); acutPrintf (ACRX_T("%lf "), minAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Elliptic Cylinder axis of symmetry is (")); acutPrintf (ACRX_T("%lf , "), symAxis.x); acutPrintf (ACRX_T("%lf , "), symAxis.y); acutPrintf (ACRX_T("%lf "), symAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } // NOTE: This surface is not yet supported in AcGe, so we infer the definition // data by analysing evaluated data on the external bounded surface. case(kEllipCone): { acutPrintf(ACRX_T("\nSurface Type: Elliptic Cone\n")); AcGePoint3d p0 = surfaceGeometry->evalPoint(AcGePoint2d(0.0, 0.0)); AcGePoint3d p1 = surfaceGeometry->evalPoint(AcGePoint2d(0.0, kPi)); AcGePoint3d p2 = surfaceGeometry->evalPoint(AcGePoint2d(0.0, kHalfPi)); AcGePoint3d p3 = surfaceGeometry->evalPoint(AcGePoint2d(1.0, 0.0)); AcGePoint3d centre(((p0.x + p1.x) / 2.0), ((p0.y + p1.y) / 2.0), ((p0.z + p1.z) / 2.0)); AcGeVector3d majAxis = p0 - centre; AcGeVector3d minAxis = p2 - centre; AcGeVector3d symAxis = (majAxis.crossProduct(minAxis)).normalize(); double halfAng = kHalfPi - majAxis.angleTo(p3 - p0); acutPrintf(ACRX_T("\nSurface Definition Data Begin:\n")); acutPrintf(ACRX_T(" Elliptic Cone base centre is (")); acutPrintf (ACRX_T("%lf , "), centre.x); acutPrintf (ACRX_T("%lf , "), centre.y); acutPrintf (ACRX_T("%lf "), centre.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Elliptic Cone base major radius is %lf\n"), majAxis.length()); acutPrintf(ACRX_T(" Elliptic Cone base minor radius is %lf\n"), minAxis.length()); acutPrintf(ACRX_T(" Elliptic Cone major axis is (")); acutPrintf (ACRX_T("%lf , "), majAxis.x); acutPrintf (ACRX_T("%lf , "), majAxis.y); acutPrintf (ACRX_T("%lf "), majAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Elliptic Cone minor axis is (")); acutPrintf (ACRX_T("%lf , "), minAxis.x); acutPrintf (ACRX_T("%lf , "), minAxis.y); acutPrintf (ACRX_T("%lf "), minAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Elliptic Cone axis of symmetry is (")); acutPrintf (ACRX_T("%lf , "), symAxis.x); acutPrintf (ACRX_T("%lf , "), symAxis.y); acutPrintf (ACRX_T("%lf "), symAxis.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Elliptic Cone cosine of major half-angle is %lf\n"), cos(halfAng)); acutPrintf(ACRX_T(" Elliptic Cone sine of major half-angle is %lf\n"), sin(halfAng)); acutPrintf(ACRX_T("Surface Definition Data End\n")); break; } default: acutPrintf(ACRX_T("\nSurface Type: Unexpected Non Surface\n")); return (AcBrErrorStatus)Acad::eInvalidInput; } // end switch(entId) delete nativeGeometry; // Evaluate the surface - note that the u,v bounds will not consider any // holes in the surface. To compute a u,v zone of exclusion for evaluation, // check for additional (i.e., inner) loops and get the bounding boxes for // the loops, then convert those to parameter space boxes. There is no // particular guarantee that outer loop(s) are the first in the face-loop // list, however, and we currently have no way to query a loop to find out // which type it is. Still, the maximal u,v parameter range will be useful // for most surfaces and most evaluation purposes. AcGeInterval uParam; AcGeInterval vParam; ((AcGeExternalBoundedSurface*)surfaceGeometry)->getEnvelope(uParam, vParam); // Make sure the u,v values are legal and the envelope is bounded if ((uParam.isBounded()) && (vParam.isBounded())) { AcGePoint2d midRange; midRange.x = uParam.lowerBound() + (uParam.length() / 2.0); midRange.y = vParam.lowerBound() + (vParam.length() / 2.0); AcGePoint3d pointOnSurface = ((AcGeExternalBoundedSurface*)surfaceGeometry)->evalPoint(midRange); acutPrintf(ACRX_T("\nSurface Evaluation Begin:\n")); acutPrintf(ACRX_T(" Parameter space bounds are ((")); acutPrintf(ACRX_T("%lf, "), uParam.lowerBound()); acutPrintf(ACRX_T("%lf "), uParam.upperBound()); acutPrintf(ACRX_T("), (\n")); acutPrintf(ACRX_T("%lf, "), vParam.lowerBound()); acutPrintf(ACRX_T("%lf "), vParam.upperBound()); acutPrintf(ACRX_T("))\n")); acutPrintf(ACRX_T(" Parameter space mid-range is (")); acutPrintf(ACRX_T(" %lf, "), midRange.x); acutPrintf(ACRX_T("%lf "), midRange.y); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T(" Point on surface is (")); acutPrintf (ACRX_T("%lf , "), pointOnSurface.x); acutPrintf (ACRX_T("%lf , "), pointOnSurface.y); acutPrintf (ACRX_T("%lf "), pointOnSurface.z); acutPrintf(ACRX_T(")\n")); acutPrintf(ACRX_T("Surface Evaluation End\n")); } delete surfaceGeometry; Adesk::Boolean oriented; returnValue = faceEntity.getOrientToSurface(oriented); if (returnValue != AcBr::eOk) { acutPrintf(ACRX_T("\n Error in AcBrFace::getOrientToSurface:")); errorReport(returnValue); return returnValue; } oriented ? acutPrintf(ACRX_T("\nSurface Orientation is Positive\n")) : acutPrintf(ACRX_T("\nSurface Orientation is Negative\n")); return returnValue; }
static AcBr::ErrorStatus brepDumpDown(const AcBrBrep& brepEntity) { AcBr::ErrorStatus returnValue = AcBr::eOk; // make a global complex traverser AcBrBrepComplexTraverser brepComplexTrav; returnValue = brepComplexTrav.setBrep(brepEntity); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrBrepComplexTraverser::setBrep:"); errorReport(returnValue); return returnValue; } // dump the complexes int complexCount = 0; while (!brepComplexTrav.done() && (returnValue == AcBr::eOk)) { complexCount++; acutPrintf("\n *Complex No: %d \n", complexCount); // make a complex shell traverser AcBrComplexShellTraverser complexShellTrav; returnValue = complexShellTrav.setComplex(brepComplexTrav); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrComplexShellTraverser::setComplex:"); errorReport(returnValue); return returnValue; } // dump the shells int shellCount = 0; while (!complexShellTrav.done() && (returnValue == AcBr::eOk)) { shellCount++; acutPrintf("\n **Shell No: %d \n", shellCount); AcBrShell shell; returnValue = complexShellTrav.getShell(shell); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrComplexShellTraverser::getShell:"); errorReport(returnValue); return returnValue; } AcBr::ShellType stype; shell.getType(stype); shellTypeReport(stype); // make a shell face traverser AcBrShellFaceTraverser shellFaceTrav; returnValue = shellFaceTrav.setShell(complexShellTrav); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrShellFaceTraverser::setShell:"); errorReport(returnValue); return returnValue; } // count the faces int faceCount = 0; while (!shellFaceTrav.done() && (returnValue == AcBr::eOk)) { faceCount++; acutPrintf("\n ***Face No: %d \n", faceCount); AcBrFace currentFace; returnValue = shellFaceTrav.getFace(currentFace); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrShellFaceTraverser::getFace:"); errorReport(returnValue); return returnValue; } // make sure that comparing different types returns kFalse // rather than crashing! if (currentFace.isEqualTo(&brepEntity)) { acutPrintf("\n Brep and face have the same contents (impossible!)"); return (AcBr::ErrorStatus)eAmbiguousOutput; } int loopCount = 0; AcBrFaceLoopTraverser faceLoopTrav; returnValue = faceLoopTrav.setFace(shellFaceTrav); if (returnValue != AcBr::eOk) { // eDegenerateTopology means intrinsically bounded (e.g., sphere, torus) if (returnValue != AcBr::eDegenerateTopology) { acutPrintf("\n Error in AcBrFaceLoopTraverser::setFace:"); errorReport(returnValue); return returnValue; } else returnValue = AcBr::eOk; } else while (!faceLoopTrav.done() && (returnValue == AcBr::eOk)) { loopCount++; acutPrintf("\n ****Loop No: %d \n", loopCount); AcBrLoop loop; returnValue = faceLoopTrav.getLoop(loop); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrFaceLoopTraverser::getLoop:"); errorReport(returnValue); return returnValue; } AcBr::LoopType ltype; loop.getType(ltype); loopTypeReport(ltype); int edgeCount = 0; AcBrLoopEdgeTraverser loopEdgeTrav; returnValue = loopEdgeTrav.setLoop(faceLoopTrav); if ((returnValue != AcBr::eOk) && (returnValue != AcBr::eDegenerateTopology)) { // eDegenerateTopology means this edge is a singularity (loop-vertex) acutPrintf("\n Error in AcBrLoopEdgeTraverser::setLoop:"); errorReport(returnValue); return returnValue; } else while (!loopEdgeTrav.done() && (returnValue == AcBr::eOk)) { edgeCount++; acutPrintf("\n *****Edge No: %d \n", edgeCount); AcBrEdge edgeEntity; returnValue = loopEdgeTrav.getEdge(edgeEntity); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrLoopEdgeTraverser::getEdge:"); errorReport(returnValue); return returnValue; } // validate the 3d model space curve associated with this edge AcGeCurve3d* curveGeometry = NULL; AcGeCurve3d* nativeGeometry = NULL; returnValue = getNativeOrientedCurve(loopEdgeTrav, curveGeometry, nativeGeometry); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in getNativeOrientedCurve:"); errorReport(returnValue); delete curveGeometry; delete nativeGeometry; return returnValue; } // validate the 2d parameter space curve associated with this edge AcGeCurve2d* pcurveGeometry = NULL; AcGeNurbCurve2d nurbGeometry; returnValue = getNativeParamCurve(loopEdgeTrav, pcurveGeometry, nurbGeometry); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in getNativeParamCurve:"); errorReport(returnValue); delete pcurveGeometry; return returnValue; } if (pcurveGeometry != NULL) { // Determine if the model space curve and parameter space curve // agree in their orientation (2d curves are presented in loop perspective) AcGeInterval crvIntrvl; ((AcGeExternalCurve3d*)curveGeometry)->getInterval(crvIntrvl); AcGeInterval pcrvIntrvl; ((AcGeExternalCurve2d*)pcurveGeometry)->getInterval(pcrvIntrvl); if (crvIntrvl != pcrvIntrvl) { if ((crvIntrvl.upperBound() == -pcrvIntrvl.lowerBound()) && (crvIntrvl.lowerBound() == -pcrvIntrvl.upperBound())) { acutPrintf("\n ******Edge No. %d: Curve and Pcurve Orientations Oppose\n", edgeCount); } else { acutPrintf("\n ******Edge No. %d: Curve and Pcurve Parameter Bounds Differ\n", edgeCount); acutPrintf(" *******Curve Parameterisation is ("); acutPrintf("%lf, ", crvIntrvl.lowerBound()); acutPrintf("%lf ", crvIntrvl.upperBound()); acutPrintf(")\n"); acutPrintf(" *******Parameter Curve Parameterisation is ("); acutPrintf("%lf, ", pcrvIntrvl.lowerBound()); acutPrintf("%lf ", pcrvIntrvl.upperBound()); acutPrintf(")\n"); } } } delete pcurveGeometry; delete curveGeometry; delete nativeGeometry; // Inform of any negated orientations, since the model space curve // is returned as is (no curve reversal for usage by surface boundary) Adesk::Boolean edgeOriented, loopOriented; returnValue = loopEdgeTrav.getEdgeOrientToLoop(loopOriented); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrLoopEdgeTraverser::getEdgeOrientToLoop:"); errorReport(returnValue); return returnValue; } returnValue = edgeEntity.getOrientToCurve(edgeOriented); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrEdge::getOrientToCurve:"); errorReport(returnValue); return returnValue; } if (!loopOriented ^ !edgeOriented) { acutPrintf("\n ******Edge No. %d: Curve Orientation in Loop is Negative\n", edgeCount); } returnValue = loopEdgeTrav.next(); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrLoopEdgeTraverser::next:"); errorReport(returnValue); return returnValue; } } // end edge while acutPrintf("\n *****Loop No. %d has %d edges\n", loopCount, edgeCount); int vtxCount = 0; AcBrLoopVertexTraverser loopVtxTrav; returnValue = loopVtxTrav.setLoop(faceLoopTrav); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrLoopVertexTraverser::setLoop:"); errorReport(returnValue); return returnValue; } else while (!loopVtxTrav.done() && (returnValue == AcBr::eOk)) { vtxCount++; acutPrintf("\n *****Vertex No: %d \n", vtxCount); AcBrVertex loopPoint; returnValue = loopVtxTrav.getVertex(loopPoint); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrLoopVertexTraverser::getVertex:"); errorReport(returnValue); return returnValue; } acutPrintf("\nCoordinate of loop vertex: "); returnValue = vertexDump(loopPoint); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in vertexDump:"); errorReport(returnValue); return returnValue; } returnValue = loopVtxTrav.next(); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrLoopVertexTraverser::next:"); errorReport(returnValue); return returnValue; } } // end vertex while acutPrintf("\n *****Loop No. %d has %d vertices\n", loopCount, vtxCount); returnValue = faceLoopTrav.next(); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrFaceLoopTraverser::next:"); errorReport(returnValue); return returnValue; } } // end loop while acutPrintf("\n ****Face No. %d has %d loops\n", faceCount, loopCount); returnValue = shellFaceTrav.next(); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrShellFaceTraverser::next:"); errorReport(returnValue); return returnValue; } } // end face while acutPrintf("\n ***Shell No. %d has %d faces\n", shellCount, faceCount); returnValue = complexShellTrav.next(); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrComplexShellTraverser::next:"); errorReport(returnValue); return returnValue; } } // end shell while acutPrintf("\n **Complex No. %d has %d shells\n", complexCount, shellCount); returnValue = brepComplexTrav.next(); if (returnValue != AcBr::eOk) { acutPrintf("\n Error in AcBrBrepComplexTraverser::next:"); errorReport(returnValue); return returnValue; } } // end complex while acutPrintf("\n *Brep has %d complexes\n", complexCount); return returnValue; }