import cadex.Collections.*;
import java.util.HashSet;
public class brep_topology {
static {
try {
System.loadLibrary("CadExMTK");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load.\n" + e);
System.exit(1);
}
}
public static void main(String[] args) {
String aKey = MTKLicenseKey.Value();
if (!LicenseManager.Activate(aKey)) {
System.out.println("Failed to activate Manufacturing Toolkit license.");
System.exit(1);
}
if (args.length != 1) {
System.out.println("Usage: " + " <input_file>, where:");
System.out.println(" <input_file> is a name of the file to be read");
System.exit(1);
}
String aSource = args[0];
Model aModel = new Model();
if (!new ModelReader().Read(new UTF16String(aSource), aModel)) {
System.out.println("Failed to read the file");
System.exit(1);
}
PartBRepVisitor aVisitor = new PartBRepVisitor();
aModel.Accept(aVisitor);
aVisitor.PrintUniqueShapesCount();
}
}
class UnorientedShapeKey {
public UnorientedShapeKey(Shape theShape) {
this.myShape = theShape;
}
@Override
public int hashCode() {
UnorientedShapeHash aHasher = new UnorientedShapeHash();
return (int) aHasher.Apply(this.myShape);
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (o instanceof UnorientedShapeKey) {
UnorientedShapeKey aKey = (UnorientedShapeKey) o;
UnorientedShapeEqual anEqualityChecker = new UnorientedShapeEqual();
return anEqualityChecker.Apply(this.myShape, aKey.myShape);
}
return false;
}
private Shape myShape;
}
class PartBRepVisitor extends ModelElementVoidVisitor {
public void PrintUniqueShapesCount() {
System.out.println("Total unique shapes count: " + myShapeSet.size());
}
@Override
public void Apply(Part thePart) {
System.out.println("Part = \"" + thePart.Name() + "\"");
BodyList aBodies = thePart.Bodies();
if (!aBodies.isEmpty()) {
ExploreBRep(aBodies);
}
}
private void ExploreBRep(BodyList theBodies) {
myNestingLevel++;
for (int i = 0; i < theBodies.size(); ++i) {
PrintTabulation();
Body aBody = theBodies.get(i);
System.out.println("Body " + i + " : type " + PrintBodyType(aBody));
for (ShapeIterator j = new ShapeIterator(aBody); j.HasNext(); ) {
Shape aShape = j.Next();
ExploreShape(aShape);
}
}
myNestingLevel--;
}
private void ExploreShape(Shape theShape) {
myShapeSet.add(new UnorientedShapeKey(theShape));
++myNestingLevel;
ShapeIterator aShapeIt = new ShapeIterator(theShape);
while (aShapeIt.HasNext()) {
Shape aShape = aShapeIt.Next();
PrintShapeInfo(aShape);
ExploreShape(aShape);
}
--myNestingLevel;
}
String PrintBodyType(Body theBody) {
if (SheetBody.CompareType(theBody)) {
return "Sheet";
} else if (SolidBody.CompareType(theBody)) {
return "Solid";
} else if (WireframeBody.CompareType(theBody)) {
return "Wireframe";
}
return "Undefined";
}
void PrintShapeInfo(Shape theShape) {
PrintTabulation();
switch (theShape.Type()) {
case Solid:
System.out.println("Solid");
break;
case Shell:
System.out.println("Shell");
break;
case Wire:
System.out.print("Wire");
PrintWireInfo(Wire.Cast(theShape));
break;
case Face:
System.out.print("Face");
PrintFaceInfo(Face.Cast(theShape));
break;
case Edge:
System.out.print("Edge");
PrintEdgeInfo(Edge.Cast(theShape));
break;
case Vertex:
System.out.print("Vertex");
PrintVertexInfo(Vertex.Cast(theShape));
break;
default:
System.out.print("Undefined");
break;
}
}
private void PrintWireInfo(Wire theWire) {
System.out.print(". Orientation: " + PrintOrientation(theWire.Orientation()) + "\n");
}
private void PrintFaceInfo(Face theFace) {
++myNestingLevel;
System.out.print(". Orientation: " + PrintOrientation(theFace.Orientation()) + "\n");
Surface aSurface = theFace.Surface();
PrintTabulation();
System.out.print("Surface: " + PrintSurfaceType(aSurface) + "\n");
--myNestingLevel;
}
private String PrintSurfaceType(Surface theSurface) {
switch (theSurface.Type()) {
case Plane:
return "Plane";
case Cylinder:
return "Cylinder";
case Cone:
return "Cone";
case Sphere:
return "Sphere";
case Torus:
return "Torus";
case LinearExtrusion:
return "LinearExtrusion";
case Revolution:
return "Revolution";
case Bezier:
return "Bezier";
case BSpline:
return "BSpline";
case Offset:
return "Offset";
default:
break;
}
return "Undefined";
}
private void PrintEdgeInfo(Edge theEdge) {
++myNestingLevel;
if (theEdge.IsDegenerated()) {
System.out.print("(Degenerated)");
}
System.out.print(". Orientation: " + PrintOrientation(theEdge.Orientation()));
System.out.print(". Tolerance: " + theEdge.Tolerance() + "\n");
if (!theEdge.IsDegenerated()) {
double[] aFirstParameter = {0}, aLastParameter = {0};
Curve aCurve = theEdge.Curve(aFirstParameter, aLastParameter);
PrintTabulation();
System.out.print("Curve: " + PrintCurveType(aCurve) + "\n");
}
--myNestingLevel;
}
private String PrintCurveType(Curve theCurve) {
switch (theCurve.Type()) {
case Line:
return "Line";
case Circle:
return "Circle";
case Ellipse:
return "Ellipse";
case Hyperbola:
return "Hyperbola";
case Parabola:
return "Parabola";
case Bezier:
return "Bezier";
case BSpline:
return "BSpline";
case Offset:
return "Offset";
default:
break;
}
return "Undefined";
}
private void PrintVertexInfo(Vertex theVertex) {
System.out.print(". Orientation: " + PrintOrientation(theVertex.Orientation()));
System.out.print(". Tolerance " + theVertex.Tolerance() + "\n");
}
private String PrintOrientation(ShapeOrientation theOrientation) {
return "Forward";
return "Reversed";
} else {
return "Undefined";
}
}
private void PrintTabulation() {
for (int i = 0; i < myNestingLevel; ++i) {
System.out.print("- ");
}
}
private int myNestingLevel = 0;
private HashSet<UnorientedShapeKey> myShapeSet = new HashSet<>();
}
Contains classes, types, enums, and functions related to geometric entities.
Defines classes, types, enums, and functions related to topological entities and scene graph elements...
ShapeOrientation
Defines shape orientation.
Definition ShapeOrientation.hxx:27
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.
Definition LicenseManager_LicenseError.hxx:30