// SPDX-License-Identifier: LGPL-2.1-or-later /*************************************************************************** * Copyright (c) Juergen Riegel 2007 * * LGPL * ***************************************************************************/ #include #include #include #include #include #include #include #include using std::string; using std::strstream; using std::vector; #include "JtReader.h" int my_level = 0; bool want_details = false; int iLod = 0; strstream InfoOut; vector result; vector::const_iterator resultIt; #define indent(i) \ { \ for (int l = 0; l < i; l++) \ InfoOut << " "; \ } void printXform(JtkTransform* partXform, int level) { float* elements = NULL; indent(level); InfoOut << "JtkTRANSFORM\n"; partXform->getTElements(elements); if (elements) { indent(level + 1); InfoOut << elements[0] << ", " << elements[1] << ", " << elements[2] << ", " << elements[3] << "\n"; indent(level + 1); InfoOut << elements[4] << ", " << elements[5] << ", " << elements[6] << ", " << elements[7] << "\n"; indent(level + 1); InfoOut << elements[8] << ", " << elements[9] << ", " << elements[10] << ", " << elements[11] << "\n"; indent(level + 1); InfoOut << elements[12] << ", " << elements[13] << ", " << elements[14] << ", " << elements[15] << "\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(elements); #else delete[] elements; #endif } } void printMaterial(JtkMaterial* partMaterial, int level) { float *ambient = NULL, *diffuse = NULL, *specular = NULL, *emission = NULL, shininess = -999.0; indent(level); InfoOut << "JtkMATERIAL\n"; partMaterial->getAmbientColor(ambient); if (ambient) { indent(level + 1); InfoOut << "ambient = ( " << ambient[0] << ", " << ambient[1] << ", " << ambient[2] << ", " << ambient[3] << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(ambient); #else delete[] ambient; #endif } partMaterial->getDiffuseColor(diffuse); if (diffuse) { indent(level + 1); InfoOut << "diffuse = ( " << diffuse[0] << ", " << diffuse[1] << ", " << diffuse[2] << ", " << diffuse[3] << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(diffuse); #else delete[] diffuse; #endif } partMaterial->getSpecularColor(specular); if (specular) { indent(level + 1); InfoOut << "specular = ( " << specular[0] << ", " << specular[1] << ", " << specular[2] << ", " << specular[3] << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(specular); #else delete[] specular; #endif } partMaterial->getEmissionColor(emission); if (emission) { indent(level + 1); InfoOut << "emission = ( " << emission[0] << ", " << emission[1] << ", " << emission[2] << ", " << emission[3] << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(emission); #else delete[] emission; #endif } partMaterial->getShininess(shininess); if (shininess != -999.0) { indent(level + 1); InfoOut << "shininess = " << shininess << "\n"; } } void printBrep(JtkBrep* partBrep, int level) { indent(level); InfoOut << "JtkBREP\n"; } void printWrep(JtkWrep* partWrep, int level) { indent(level); InfoOut << "JtkWREP\n"; } void printShape(JtkShape* partShape, int level) { indent(level); InfoOut << "JtkSHAPE\n"; for (int set = 0; set < partShape->numOfSets(); set++) { indent(level + 1); InfoOut << "geom set #" << set << ":\n"; float *vertex = NULL, *normal = NULL, *color = NULL, *texture = NULL; int vertexCount = -1, normCount = -1, colorCount = -1, textCount = -1; partShape->getInternal( vertex, vertexCount, normal, normCount, color, colorCount, texture, textCount, set ); if (vertex && (vertexCount > 0)) { indent(level + 2); InfoOut << "vertices = ( "; for (int elems = 0; elems < vertexCount * 3; elems++) { InfoOut << ((elems != 0) ? ", " : "") << vertex[elems]; } InfoOut << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(vertex); #else delete[] vertex; #endif } if (normal && (normCount > 0)) { indent(level + 2); InfoOut << "normals = ( "; for (int elems = 0; elems < normCount * 3; elems++) { InfoOut << ((elems != 0) ? ", " : "") << normal[elems]; } InfoOut << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(normal); #else delete[] normal; #endif } if (color && (colorCount > 0)) { indent(level + 2); InfoOut << "color = ( "; for (int elems = 0; elems < colorCount * 3; elems++) { InfoOut << ((elems != 0) ? ", " : "") << color[elems]; } InfoOut << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(color); #else delete[] color; #endif } if (texture && (textCount > 0)) { indent(level + 2); InfoOut << "texture = ( "; for (int elems = 0; elems < textCount; elems++) { InfoOut << ((elems != 0) ? ", " : "") << texture[elems]; } InfoOut << " )\n"; #ifdef _DEBUG JtkEntityFactory::deleteMemory(texture); #else delete[] texture; #endif } } } int myPreactionCB_PrintName(JtkHierarchy* CurrNode, int level, JtkClientData*) { indent(level); my_level++; switch (CurrNode->typeID()) { case JtkEntity::JtkNONE: InfoOut << "JtkNONE\n"; break; case JtkEntity::JtkBREP: InfoOut << "JtkBREP\n"; break; case JtkEntity::JtkREGION: InfoOut << "JtkREGION\n"; break; case JtkEntity::JtkSHELL: InfoOut << "JtkSHELL\n"; break; case JtkEntity::JtkLOOP: InfoOut << "JtkLOOP\n"; break; case JtkEntity::JtkCOEDGE: InfoOut << "JtkCOEDGE\n"; break; case JtkEntity::JtkEDGE: InfoOut << "JtkEDGE\n"; break; case JtkEntity::JtkVERTEX: InfoOut << "JtkVERTEX\n"; break; case JtkEntity::JtkNURBSSURFACE: InfoOut << "JtkNURBSSURFACE\n"; break; case JtkEntity::JtkUVCURVE: InfoOut << "JtkUVCURVE\n"; break; case JtkEntity::JtkXYZCURVE: InfoOut << "JtkXYZCURVE\n"; break; case JtkEntity::JtkTRISTRIPSET: InfoOut << "JtkTRISTRIPSET\n"; break; case JtkEntity::JtkPOINTSET: InfoOut << "JtkPOINTSET\n"; break; case JtkEntity::JtkLINESTRIPSET: InfoOut << "JtkLINESTRIPSET\n"; break; case JtkEntity::JtkPOLYGONSET: InfoOut << "JtkPOLYGONSET\n"; break; case JtkEntity::JtkPOINT: InfoOut << "JtkPOINT\n"; break; case JtkEntity::JtkMATERIAL: InfoOut << "JtkMATERIAL\n"; break; case JtkEntity::JtkTRANSFORM: InfoOut << "JtkTRANSFORM\n"; break; case JtkEntity::JtkPROPERTY: InfoOut << "JtkPROPERTY\n"; break; case JtkEntity::JtkPART: { InfoOut << "JtkPART: "; InfoOut << CurrNode->name() << "\n"; if (want_details) { JtkTransform* partXform = NULL; ((JtkPart*)CurrNode)->getTransform(partXform); if (partXform) { printXform(partXform, level + 1); } JtkMaterial* partMaterial = NULL; ((JtkPart*)CurrNode)->getMaterial(partMaterial); if (partMaterial) { printMaterial(partMaterial, level + 1); } JtkBrep* partBrep = NULL; ((JtkPart*)CurrNode)->getBrep(partBrep); if (partBrep) { printBrep(partBrep, level + 1); } JtkWrep* partWrep = NULL; ((JtkPart*)CurrNode)->getWrep(partWrep); if (partWrep) { printWrep(partWrep, level + 1); } int partNumShapeLODs = -1; partNumShapeLODs = ((JtkPart*)CurrNode)->numPolyLODs(); for (int lod = 0; lod < partNumShapeLODs; lod++) { indent(level + 1); InfoOut << "LOD#" << lod << ":\n"; int partNumShapes = -1; partNumShapes = ((JtkPart*)CurrNode)->numPolyShapes(lod); for (int shNum = 0; shNum < partNumShapes; shNum++) { indent(level + 2); InfoOut << "Shape#" << shNum << ":\n"; JtkShape* partShape = NULL; ((JtkPart*)CurrNode)->getPolyShape(partShape, lod, shNum); if (partShape) { printShape(partShape, level + 3); } } } } } break; case JtkEntity::JtkASSEMBLY: { InfoOut << "JtkASSEMBLY: "; InfoOut << CurrNode->name() << "(" << ((JtkAssembly*)CurrNode)->numChildren() << " children)\n"; if (want_details) { JtkTransform* partXform = NULL; ((JtkPart*)CurrNode)->getTransform(partXform); if (partXform) { printXform(partXform, level + 1); } JtkMaterial* partMaterial = NULL; ((JtkPart*)CurrNode)->getMaterial(partMaterial); if (partMaterial) { printMaterial(partMaterial, level + 1); } } } break; case JtkEntity::JtkINSTANCE: { InfoOut << "JtkINSTANCE: "; InfoOut << CurrNode->name() << "\n"; if (want_details) { JtkTransform* partXform = NULL; ((JtkPart*)CurrNode)->getTransform(partXform); if (partXform) { printXform(partXform, level + 1); } JtkMaterial* partMaterial = NULL; ((JtkPart*)CurrNode)->getMaterial(partMaterial); if (partMaterial) { printMaterial(partMaterial, level + 1); } } } break; case JtkEntity::JtkCLIENTDATA: InfoOut << "JtkCLIENTDATA\n"; break; case JtkEntity::JtkWIRE: InfoOut << "JtkWIRE\n"; break; } return (Jtk_OK); } void insertShapeFaces(JtkShape* partShape) { for (int set = 0; set < partShape->numOfSets(); set++) { float *vertex = NULL, *normal = NULL, *color = NULL, *texture = NULL; int vertexCount = -1, normCount = -1, colorCount = -1, textCount = -1; partShape->getInternal( vertex, vertexCount, normal, normCount, color, colorCount, texture, textCount, set ); if (normCount < 3) { return; } if (vertex && (vertexCount > 0) && normal && (normCount > 0)) { for (int i = 0; i < vertexCount - 2; i++) { SimpleMeshFacet temp; temp.n[0] = normal[i * 3 + 0]; temp.n[1] = normal[i * 3 + 1]; temp.n[2] = normal[i * 3 + 2]; temp.p1[0] = vertex[i * 3 + 0]; temp.p1[1] = vertex[i * 3 + 1]; temp.p1[2] = vertex[i * 3 + 2]; temp.p2[0] = vertex[i * 3 + 3]; temp.p2[1] = vertex[i * 3 + 4]; temp.p2[2] = vertex[i * 3 + 5]; temp.p3[0] = vertex[i * 3 + 6]; temp.p3[1] = vertex[i * 3 + 7]; temp.p3[2] = vertex[i * 3 + 8]; result.push_back(temp); } } #ifdef _DEBUG if (vertex) { JtkEntityFactory::deleteMemory(vertex); } if (vertex) { JtkEntityFactory::deleteMemory(normal); } if (color) { JtkEntityFactory::deleteMemory(color); } if (texture) { JtkEntityFactory::deleteMemory(texture); } #else if (vertex) { delete[] vertex; } if (vertex) { delete[] normal; } if (color) { delete[] color; } if (texture) { delete[] texture; } #endif } } int myPreactionCB_CollectFacets(JtkHierarchy* CurrNode, int level, JtkClientData*) { switch (CurrNode->typeID()) { case JtkEntity::JtkPART: { JtkTransform* partXform = NULL; ((JtkPart*)CurrNode)->getTransform(partXform); if (partXform) { printXform(partXform, level + 1); } int partNumShapeLODs = -1; partNumShapeLODs = ((JtkPart*)CurrNode)->numPolyLODs(); for (int lod = 0; lod < partNumShapeLODs; lod++) { indent(level + 1); InfoOut << "LOD#" << lod << ":\n"; if (iLod != lod && iLod != -1) { continue; } int partNumShapes = -1; partNumShapes = ((JtkPart*)CurrNode)->numPolyShapes(lod); for (int shNum = 0; shNum < partNumShapes; shNum++) { indent(level + 2); InfoOut << "Shape#" << shNum << ":\n"; JtkShape* partShape = NULL; ((JtkPart*)CurrNode)->getPolyShape(partShape, lod, shNum); if (partShape) { insertShapeFaces(partShape); } } } } break; case JtkEntity::JtkASSEMBLY: { InfoOut << "JtkASSEMBLY: "; InfoOut << CurrNode->name() << "(" << ((JtkAssembly*)CurrNode)->numChildren() << " children)\n"; JtkTransform* partXform = NULL; ((JtkPart*)CurrNode)->getTransform(partXform); } break; case JtkEntity::JtkINSTANCE: { { JtkTransform* partXform = NULL; ((JtkPart*)CurrNode)->getTransform(partXform); } } break; } return (Jtk_OK); } /* Interface functions */ void testLicence(void) { // Try to create a JtkCADExporter to test for JT write/general licensing JtkCADExporter* jtwriter = NULL; jtwriter = JtkEntityFactory::createCADExporter(); if (!jtwriter) { cerr << "No export license found.\n"; exit(1); } else { jtwriter->ref(); jtwriter->unref(); jtwriter = NULL; } // Try to create a JtkCADImporter to test for JT read licensing JtkCADImporter* jtreader = NULL; jtreader = JtkEntityFactory::createCADImporter(); if (!jtreader) { cerr << "No import license found.\n"; exit(1); } else { jtreader->ref(); jtreader->unref(); jtreader = NULL; } } void readFile(const char* FileName, int iLods) { iLod = iLods; testLicence(); JtkCADImporter* importer = NULL; importer = JtkEntityFactory::createCADImporter(); if (importer) { importer->ref(); importer->setShapeLoadOption(JtkCADImporter::JtkALL_LODS); importer->setBrepLoadOption(JtkCADImporter::JtkTESS_AND_BREP); JtkHierarchy* root = NULL; root = importer->import(FileName); if (root) { root->ref(); JtkTraverser* trav = JtkEntityFactory::createTraverser(); trav->setupPreActionCallback(myPreactionCB_CollectFacets); if (trav) { trav->ref(); trav->traverseGraph(root); trav->unref(); trav = NULL; } else { throw "Unable to create JtkTraverser.\n"; } root->unref(); root = NULL; } else { throw "Unable in find root node. Check file...\n"; } importer->unref(); importer = NULL; } else { throw "Unable to create JtkCADImporter. Check license...\n"; } } const SimpleMeshFacet* iterStart(void) { resultIt = result.begin(); if (resultIt != result.end()) { return &(*(resultIt)); } else { return 0; } } const SimpleMeshFacet* iterGetNext(void) { if (++resultIt != result.end()) { return &(*(resultIt)); } else { return 0; } } unsigned int iterSize(void) { return (unsigned int)result.size(); } /** clears the internal structure */ void clearData(void) { result.clear(); resultIt = result.begin(); InfoOut.clear(); my_level = 0; }