#ifndef _FeatureGroup_HeaderFile
#define _FeatureGroup_HeaderFile
#include <cadex/Geom/Direction.hxx>
#include <cadex/MTKBase_Feature.hxx>
#include <cadex/MTKBase_FeatureComparator.hxx>
#include <algorithm>
#include <array>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <sstream>
#include <vector>
using namespace std;
typedef std::pair<double, double> PairType;
typedef std::array<double, 3> ArrayType;
inline std::ostream& operator<< (std::ostream& theStream, const PairType& thePair)
{
return theStream << thePair.first << " x " << thePair.second;
}
inline std::ostream& operator<< (std::ostream& theStream, const ArrayType& theArray)
{
return theStream << theArray[0] << " x " << theArray[1] << " x " << theArray[2];
}
inline std::ostream& operator<< (std::ostream& theStream, const Geom::Direction& theDir)
{
stringstream aStream;
aStream << setprecision(2) << fixed << "(" << theDir.X() << ", " << theDir.Y() << ", " << theDir.Z() << ")";
return theStream << aStream.str();
}
class FeatureGroupManager
{
public:
void AddFeature (const char* theGroupName,
const char* theSubgroupName,
bool theHasParameters,
const MTKBase_Feature& theFeature)
{
auto aRes = std::find_if (myGroups.begin(), myGroups.end(),
[&] (const FeatureGroup& theGroup) { return theGroup.myName == theGroupName; });
if (aRes == myGroups.end()) {
aRes = myGroups.insert (aRes, FeatureGroup (theGroupName, theSubgroupName, theHasParameters));
}
auto& aGroup = *aRes;
++aGroup.myFeatureSubgroups[theFeature];
}
void Print (const char* theFeatureType, function<void (MTKBase_Feature)> thePrintFeatureParameters)
{
sort (myGroups.begin(), myGroups.end(), FeatureGroupComparator());
cout << setprecision(6);
size_t aTotalCount = 0;
for (const auto& aFeatureGroup : myGroups) {
size_t aFeatureCount = aFeatureGroup.FeatureCount();
aTotalCount += aFeatureCount;
cout << " " << aFeatureGroup.myName << ": " << aFeatureCount << endl;
if (!aFeatureGroup.myHasParameters) {
continue;
}
const char* aSubgroupName = aFeatureGroup.mySubgroupName.c_str();
for (const auto& aFeatureSubgroup : aFeatureGroup.myFeatureSubgroups) {
cout << " " << aFeatureSubgroup.second << " " << aSubgroupName << " with" << endl;
thePrintFeatureParameters (aFeatureSubgroup.first);
}
}
cout << "\n Total " << theFeatureType << ": " << aTotalCount << "\n" << endl;
}
template <typename T>
static void PrintFeatureParameter (const char* theName, const T& theValue, const char* theUnits)
{
cout << " " << theName << ": " << theValue << " " << theUnits << endl;
}
private:
class FeatureGroup
{
public:
FeatureGroup (const std::string& theName, const std::string& theSubgroupName, bool theHasParameters) :
myName (theName), mySubgroupName (theSubgroupName), myHasParameters (theHasParameters)
{}
size_t FeatureCount() const
{
size_t aCount = 0;
for (const auto& aFeatureSubgroup : myFeatureSubgroups) {
aCount += aFeatureSubgroup.second;
}
return aCount;
}
string myName;
string mySubgroupName;
bool myHasParameters;
map<MTKBase_Feature, size_t, MTKBase_FeatureComparator> myFeatureSubgroups;
};
class FeatureGroupComparator
{
public:
bool operator() (const FeatureGroup& theA, const FeatureGroup& theB) const
{
const auto& anAName = theA.myName;
const auto& aBName = theB.myName;
if (anAName == aBName) {
return false;
}
const auto& anAFeatureSubgroups = theA.myFeatureSubgroups;
const auto& aBFeatureSubgroups = theB.myFeatureSubgroups;
if (anAFeatureSubgroups.empty() || aBFeatureSubgroups.empty()) {
return anAName < aBName;
}
return MTKBase_FeatureComparator() (anAFeatureSubgroups.begin()->first,
aBFeatureSubgroups.begin()->first);
}
};
vector<FeatureGroup> myGroups;
};
#endif
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.
#ifndef _ShapeProcessor_HeaderFile
#define _ShapeProcessor_HeaderFile
#include <cadex/Base/UTF16String.hxx>
#include <cadex/ModelData/Body.hxx>
#include <cadex/ModelData/Model.hxx>
#include <cadex/ModelData/Part.hxx>
#include <cadex/ModelData/Shell.hxx>
#include <cadex/ModelData/Solid.hxx>
#include <cadex/WallThickness_Data.hxx>
#include <iostream>
using namespace std;
class ShapeProcessor : public ModelData::ModelElementVoidVisitor
{
public:
void operator() (const ModelData::Part& thePart) override
{
auto aPartName = thePart.Name().IsEmpty() ? "noname" : thePart.Name();
size_t aBodyNumber = 0;
const auto& aBodies = thePart.Bodies();
for (const auto& aBody : aBodies) {
ModelData::ShapeIterator aShapeIt (aBody);
while (aShapeIt.HasNext()) {
const auto& aShape = aShapeIt.Next();
if (aShape.Type() == ModelData::ShapeType::Solid) {
cout << "Part #" << myPartIndex << " [\"" << aPartName << "\"] - solid #" << std::to_string (aBodyNumber) << " has:" << endl;
ProcessSolid (ModelData::Solid::Cast (aShape));
} else if (aShape.Type() == ModelData::ShapeType::Shell) {
cout << "Part #" << myPartIndex << " [\"" << aPartName << "\"] - shell #" << std::to_string (aBodyNumber) << " has:" << endl;
ProcessShell (ModelData::Shell::Cast (aShape));
}
}
++aBodyNumber;
}
++myPartIndex;
}
virtual void ProcessSolid (const ModelData::Solid& theSolid) = 0;
virtual void ProcessShell (const ModelData::Shell& theShell) = 0;
private:
size_t myPartIndex = 0;
};
class SolidProcessor : public ModelData::ModelElementVoidVisitor
{
public:
void operator() (const ModelData::Part& thePart) override
{
auto aPartName = thePart.Name().IsEmpty() ? "noname" : thePart.Name();
size_t aBodyNumber = 0;
const auto& aBodies = thePart.Bodies();
for (const auto& aBody : aBodies) {
ModelData::ShapeIterator aShapeIt (aBody);
while (aShapeIt.HasNext()) {
const auto& aShape = aShapeIt.Next();
if (aShape.Type() == ModelData::ShapeType::Solid) {
cout << "Part #" << myPartIndex << " [\"" << aPartName << "\"] - solid #" << std::to_string (aBodyNumber++) << " has:" << endl;
ProcessSolid (ModelData::Solid::Cast (aShape));
}
}
}
++myPartIndex;
}
virtual void ProcessSolid (const ModelData::Solid& theSolid) = 0;
private:
size_t myPartIndex = 0;
};
class SolidAndMeshProcessor : public ModelData::ModelElementVoidVisitor
{
public:
void operator() (const ModelData::Part& thePart) override
{
auto aPartName = thePart.Name().IsEmpty() ? "noname" : thePart.Name();
size_t aBodyNumber = 0;
const auto& aBodies = thePart.Bodies();
for (const auto& aBody : aBodies) {
ModelData::ShapeIterator aShapeIt (aBody);
while (aShapeIt.HasNext()) {
const auto& aShape = aShapeIt.Next();
if (aShape.Type() == ModelData::ShapeType::Solid) {
cout << "Part #" << myPartIndex << " [\"" << aPartName << "\"] - solid #" << std::to_string (aBodyNumber++) << " has:" << endl;
ProcessSolid (ModelData::Solid::Cast (aShape), aPartName, aBodyNumber);
}
}
}
++myPartIndex;
}
virtual void ProcessSolid (const ModelData::Solid& theSolid,
const UTF16String& thePartName, size_t theShapeIndex) = 0;
protected:
size_t myPartIndex = 0;
};
#endif
#include <cadex/DFMMolding_Analyzer.hxx>
#include <cadex/DFMMolding_AnalyzerParameters.hxx>
#include <cadex/DFMMolding_HighRibIssue.hxx>
#include <cadex/DFMMolding_HighScrewBossIssue.hxx>
#include <cadex/DFMMolding_IrregularCoreDepthScrewBossIssue.hxx>
#include <cadex/DFMMolding_IrregularCoreDiameterScrewBossIssue.hxx>
#include <cadex/DFMMolding_IrregularThicknessRibIssue.hxx>
#include <cadex/DFMMolding_IrregularWallThicknessIssue.hxx>
#include <cadex/DFMMolding_IrregularWallThicknessScrewBossIssue.hxx>
#include <cadex/DFMMolding_LargeWallThicknessIssue.hxx>
#include <cadex/DFMMolding_RibIssue.hxx>
#include <cadex/DFMMolding_ScrewBossIssue.hxx>
#include <cadex/DFMMolding_SmallBaseRadiusRibIssue.hxx>
#include <cadex/DFMMolding_SmallBaseRadiusScrewBossIssue.hxx>
#include <cadex/DFMMolding_SmallDistanceBetweenBossesIssue.hxx>
#include <cadex/DFMMolding_SmallDraftAngleRibIssue.hxx>
#include <cadex/DFMMolding_SmallDraftAngleScrewBossIssue.hxx>
#include <cadex/DFMMolding_SmallDraftAngleWallIssue.hxx>
#include <cadex/DFMMolding_SmallDistanceBetweenRibsIssue.hxx>
#include <cadex/DFMMolding_SmallHoleBaseRadiusScrewBossIssue.hxx>
#include <cadex/DFMMolding_SmallWallThicknessIssue.hxx>
#include <cadex/DFMMolding_NonChamferedScrewBossIssue.hxx>
#include <cadex/LicenseManager_Activate.h>
#include <cadex/Molding_Analyzer.hxx>
#include <cadex/Molding_Data.hxx>
#include <cadex/Molding_FeatureRecognizer.hxx>
#include <cadex/Molding_FeatureRecognizerParameters.hxx>
#include <cadex/Molding_Rib.hxx>
#include <cadex/Molding_ScrewBoss.hxx>
#include <cadex/ModelData/Model.hxx>
#include <cadex/ModelData/ModelReader.hxx>
#include <cadex/MTKBase_Feature.hxx>
#include <cadex/MTKBase_FeatureList.hxx>
#define _USE_MATH_DEFINES
#include <math.h>
#include <unordered_map>
#include "../../helpers/feature_group.hxx"
#include "../../helpers/shape_processor.hxx"
#include "../../mtk_license.cxx"
using namespace std;
double ToDegrees (double theAngleRad)
{
return theAngleRad * 180. / M_PI;
}
void PrintIssues (const MTKBase_FeatureList& theIssueList)
{
FeatureGroupManager aManager;
for (size_t i = 0; i < theIssueList.Size(); ++i) {
const auto& anIssue = theIssueList[i];
if (anIssue.IsOfType<DFMMolding_IrregularCoreDepthScrewBossIssue>()) {
aManager.AddFeature ("Irregular Core Depth Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_IrregularCoreDiameterScrewBossIssue>()) {
aManager.AddFeature ("Irregular Core Diameter Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_IrregularWallThicknessScrewBossIssue>()) {
aManager.AddFeature ("Irregular Wall Thickness Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_HighScrewBossIssue>()) {
aManager.AddFeature ("High Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallBaseRadiusScrewBossIssue>()) {
aManager.AddFeature ("Small Base Radius Boss Issue(s)", "Screw Boss(es)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallDraftAngleScrewBossIssue>()) {
aManager.AddFeature ("Small Draft Angle Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallHoleBaseRadiusScrewBossIssue>()) {
aManager.AddFeature ("Small Hole Base Radius Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_NonChamferedScrewBossIssue>()) {
aManager.AddFeature ("Non Chamfered Screw Boss Issue(s)", "Screw Boss(es)", false, anIssue);
} else if (anIssue.IsOfType<DFMMolding_HighRibIssue>()) {
aManager.AddFeature ("High Rib Issue(s)", "Rib(s)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_IrregularThicknessRibIssue>()) {
aManager.AddFeature ("Irregular Thickness Rib Issue(s)", "Rib(s)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallBaseRadiusRibIssue>()) {
aManager.AddFeature ("Small Base Radius Rib Issue(s)", "Rib(s)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallDraftAngleRibIssue>()) {
aManager.AddFeature ("Small Draft Angle Rib Issue(s)", "Rib(s)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallDistanceBetweenRibsIssue>()) {
aManager.AddFeature ("Small Distance Between Ribs Issue(s)", "Rib(s)", true, anIssue);
}
else if (anIssue.IsOfType<DFMMolding_IrregularWallThicknessIssue>()) {
aManager.AddFeature ("Irregular Wall Thickness Issue(s)", "Wall(s)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_LargeWallThicknessIssue>()) {
aManager.AddFeature ("Large Wall Thickness Issue(s)", "Wall(s)", true, anIssue);
} else if(anIssue.IsOfType<DFMMolding_SmallWallThicknessIssue>()) {
aManager.AddFeature ("Small Wall Thickness Issue(s)", "Wall(s)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallDraftAngleWallIssue>()) {
aManager.AddFeature ("Small Draft Angle Wall Issue(s)", "Wall(s)", true, anIssue);
} else if (anIssue.IsOfType<DFMMolding_SmallDistanceBetweenBossesIssue>()) {
aManager.AddFeature ("Small Distance Between Bosses Issue(s)", "Boss(es)", true, anIssue);
}
}
auto PrintFeatureParameters = [] (const MTKBase_Feature& theIssue)
{
if (theIssue.IsOfType<DFMMolding_IrregularCoreDepthScrewBossIssue>()) {
const auto& aICDSBIssue = static_cast<const DFMMolding_IrregularCoreDepthScrewBossIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("actual height", aICDSBIssue.ActualHeight(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual core depth", aICDSBIssue.ActualCoreDepth(), "mm");
} else if (theIssue.IsOfType<DFMMolding_IrregularCoreDiameterScrewBossIssue>()) {
const auto& aICDSBIssue = static_cast<const DFMMolding_IrregularCoreDiameterScrewBossIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min core diameter", aICDSBIssue.ExpectedMinCoreDiameter(), "mm");
FeatureGroupManager::PrintFeatureParameter ("expected max core diameter", aICDSBIssue.ExpectedMaxCoreDiameter(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual core diameter", aICDSBIssue.ActualCoreDiameter(), "mm");
} else if (theIssue.IsOfType<DFMMolding_IrregularWallThicknessScrewBossIssue>()) {
const auto& aIWTSBIssue = static_cast<const DFMMolding_IrregularWallThicknessScrewBossIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected max thickness", aIWTSBIssue.ExpectedMaxThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("expected min thickness", aIWTSBIssue.ExpectedMinThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual thickness", aIWTSBIssue.ActualThickness(), "mm");
} else if (theIssue.IsOfType<DFMMolding_HighScrewBossIssue>()) {
const auto& aHSBIssue = static_cast<const DFMMolding_HighScrewBossIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected max height", aHSBIssue.ExpectedMaxHeight(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual height", aHSBIssue.ActualHeight(), "mm");
} else if (theIssue.IsOfType<DFMMolding_SmallBaseRadiusScrewBossIssue>()) {
const auto& aSBRSBIssue = static_cast<const DFMMolding_SmallBaseRadiusScrewBossIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min base radius", aSBRSBIssue.ExpectedMinBaseRadius(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual base radius", aSBRSBIssue.ActualBaseRadius(), "mm");
} else if (theIssue.IsOfType<DFMMolding_SmallDraftAngleScrewBossIssue>()) {
const auto& aSDASBIssue = static_cast<const DFMMolding_SmallDraftAngleScrewBossIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min draft angle",
ToDegrees (aSDASBIssue.ExpectedMinDraftAngle()), "deg");
FeatureGroupManager::PrintFeatureParameter ("actual draft angle",
ToDegrees (aSDASBIssue.ActualDraftAngle()), "deg");
} else if (theIssue.IsOfType<DFMMolding_SmallHoleBaseRadiusScrewBossIssue>()) {
const auto& aSHBRSBIssue = static_cast<const DFMMolding_SmallHoleBaseRadiusScrewBossIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min hole base radius",
aSHBRSBIssue.ExpectedMinHoleBaseRadius(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual hole base radius",
aSHBRSBIssue.ActualHoleBaseRadius(), "mm");
} else if (theIssue.IsOfType<DFMMolding_NonChamferedScrewBossIssue>()) {
} else if (theIssue.IsOfType<DFMMolding_HighRibIssue>()) {
const auto& aHRIssue = static_cast<const DFMMolding_HighRibIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected max height", aHRIssue.ExpectedMaxHeight(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual height", aHRIssue.ActualHeight(), "mm");
} else if (theIssue.IsOfType<DFMMolding_IrregularThicknessRibIssue>()) {
const auto& aITRIssue = static_cast<const DFMMolding_IrregularThicknessRibIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min thickness", aITRIssue.ExpectedMinThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("expected max thickness", aITRIssue.ExpectedMaxThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual thickness", aITRIssue.ActualThickness(), "mm");
} else if (theIssue.IsOfType<DFMMolding_SmallBaseRadiusRibIssue>()) {
const auto& aSBRRIssue = static_cast<const DFMMolding_SmallBaseRadiusRibIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min base radius", aSBRRIssue.ExpectedMinBaseRadius(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual base radius", aSBRRIssue.ActualBaseRadius(), "mm");
} else if (theIssue.IsOfType<DFMMolding_SmallDraftAngleRibIssue>()) {
const auto& aSDARIssue = static_cast<const DFMMolding_SmallDraftAngleRibIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min draft angle", ToDegrees (aSDARIssue.ExpectedMinDraftAngle()), "deg");
FeatureGroupManager::PrintFeatureParameter ("actual draft angle", ToDegrees (aSDARIssue.ActualDraftAngle()), "deg");
} else if (theIssue.IsOfType<DFMMolding_SmallDistanceBetweenRibsIssue>()) {
const auto& aSDBRIssue = static_cast<const DFMMolding_SmallDistanceBetweenRibsIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min distance", aSDBRIssue.ExpectedMinDistanceBetweenRibs(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual distance", aSDBRIssue.ActualDistanceBetweenRibs(), "mm");
} else if (theIssue.IsOfType<DFMMolding_IrregularWallThicknessIssue>()) {
const auto& aIWTIIssue = static_cast<const DFMMolding_IrregularWallThicknessIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected max thickness", aIWTIIssue.ExpectedMaxThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("expected min thickness", aIWTIIssue.ExpectedMinThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual thickness", aIWTIIssue.ActualThickness(), "mm");
} else if (theIssue.IsOfType<DFMMolding_LargeWallThicknessIssue>()) {
const auto& aHWTIIssue = static_cast<const DFMMolding_LargeWallThicknessIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected max thickness", aHWTIIssue.ExpectedMaxThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual thickness", aHWTIIssue.ActualThickness(), "mm");
} else if (theIssue.IsOfType<DFMMolding_SmallWallThicknessIssue>()) {
const auto& aSWTIIssue = static_cast<const DFMMolding_SmallWallThicknessIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min thickness", aSWTIIssue.ExpectedMinThickness(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual thickness", aSWTIIssue.ActualThickness(), "mm");
} else if (theIssue.IsOfType<DFMMolding_SmallDraftAngleWallIssue>()) {
const auto& aSDAWIssue = static_cast<const DFMMolding_SmallDraftAngleWallIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min draft angle", ToDegrees (aSDAWIssue.ExpectedMinDraftAngle()), "deg");
FeatureGroupManager::PrintFeatureParameter ("actual draft angle", ToDegrees (aSDAWIssue.ActualDraftAngle()), "deg");
} else if (theIssue.IsOfType<DFMMolding_SmallDistanceBetweenBossesIssue>()) {
const auto& aSDBBIssue = static_cast<const DFMMolding_SmallDistanceBetweenBossesIssue&> (theIssue);
FeatureGroupManager::PrintFeatureParameter ("expected min distance", aSDBBIssue.ExpectedMinDistanceBetweenBosses(), "mm");
FeatureGroupManager::PrintFeatureParameter ("actual distance", aSDBBIssue.ActualDistanceBetweenBosses(), "mm");
}
};
aManager.Print ("issues", PrintFeatureParameters);
}
class PartProcessor : public SolidProcessor
{
public:
PartProcessor ()
{}
void ProcessSolid (const ModelData::Solid& theSolid) override
{
Molding_FeatureRecognizerParameters aRecognizerParameters;
aRecognizerParameters.SetMaxRibThickness (30.0);
aRecognizerParameters.SetMaxRibDraftAngle (0.2);
aRecognizerParameters.SetMaxRibTaperAngle (0.1);
Molding_FeatureRecognizer aRecognizer(aRecognizerParameters);
Molding_Analyzer anAnalyzer;
anAnalyzer.AddTool (aRecognizer);
Molding_Data aData = anAnalyzer.Perform (theSolid);
DFMMolding_AnalyzerParameters aParameters;
DFMMolding_Analyzer aDFMAnalyzer (aParameters);
auto anIssueList = aDFMAnalyzer.Perform (aData);
PrintIssues (anIssueList);
}
};
int main (int argc, char* argv[])
{
auto aKey = MTKLicenseKey::Value();
if (!CADExLicense_Activate (aKey)) {
cerr << "Failed to activate Manufacturing Toolkit license." << endl;
return 1;
}
if (argc != 2) {
cerr << "Usage: " << argv[0] << " <input_file>, where:" << endl;
cerr << " <input_file> is a name of the file to be read" << endl;
return 1;
}
const char* aSource = argv[1];
ModelData::Model aModel;
ModelData::ModelReader aReader;
if (!aReader.Read (aSource, aModel)) {
cerr << "Failed to read the file " << aSource << endl;
return 1;
}
cout << "Model: " << aModel.Name() << "\n" << endl;
PartProcessor aPartProcessor;
ModelData::ModelElementUniqueVisitor aVisitor (aPartProcessor);
aModel.Accept (aVisitor);
return 0;
}