using System;
using System.Collections.Generic;
using FeatureMapType = System.Collections.Generic.SortedDictionary<
cadex.MTKBase_Feature, uint>;
namespace feature_group
{
class FeatureComparer : IComparer<MTKBase_Feature>
{
public int Compare(MTKBase_Feature theA, MTKBase_Feature theB)
{
MTKBase_FeatureComparator aComparator = new MTKBase_FeatureComparator();
bool anALessThanB = aComparator.Apply(theA, theB);
if (anALessThanB)
{
return -1;
}
bool aBLessThanA = aComparator.Apply(theB, theA);
if (aBLessThanA)
{
return 1;
}
return 0;
}
}
public struct Pair
{
public Pair(double theFirst, double theSecond)
{
First = theFirst;
Second = theSecond;
}
public double First { get; }
public double Second { get; }
public override string ToString() => $"{First} x {Second}";
}
public struct Dimension
{
public Dimension(double theL, double theW, double theD)
{
L = theL;
W = theW;
D = theD;
}
public double L { get; }
public double W { get; }
public double D { get; }
public override string ToString() => $"{L} x {W} x {D}";
}
public struct Direction
{
public Direction(double theX, double theY, double theZ)
{
X = theX;
Y = theY;
Z = theZ;
}
public double X { get; }
public double Y { get; }
public double Z { get; }
public override string ToString() => $"({FormattedString(X)}, {FormattedString(Y)}, {FormattedString(Z)})";
private string FormattedString(double theValue)
{
System.Globalization.CultureInfo aCI = new System.Globalization.CultureInfo("en-US");
return string.Format(aCI, "{0:0.00}", theValue);
}
}
class FeatureGroupManager
{
public FeatureGroupManager()
{
myGroups = new List<FeatureGroup>();
}
private class FeatureGroup
{
public FeatureGroup(string theName, string theSubgroupName, bool theHasParameters)
{
myName = theName;
mySubgroupName = theSubgroupName;
myHasParameters = theHasParameters;
myFeatureSubgroups = new FeatureMapType(new FeatureComparer());
}
public uint FeatureCount()
{
uint aCount = 0;
foreach (var i in myFeatureSubgroups)
{
aCount += i.Value;
}
return aCount;
}
public string myName;
public string mySubgroupName;
public bool myHasParameters;
public FeatureMapType myFeatureSubgroups;
}
private class FeatureGroupComparer : IComparer<FeatureGroup>
{
public int Compare(FeatureGroup theA, FeatureGroup theB)
{
string anAName = theA.myName;
string aBName = theB.myName;
if (anAName == aBName)
{
return 0;
}
FeatureMapType anAFeatureSubgroups = theA.myFeatureSubgroups;
FeatureMapType aBFeatureSubgroups = theB.myFeatureSubgroups;
if (anAFeatureSubgroups.Count == 0 || aBFeatureSubgroups.Count == 0)
{
return anAName.CompareTo(aBName);
}
MTKBase_Feature anAFeature = new MTKBase_Feature();
MTKBase_Feature aBFeature = new MTKBase_Feature();
foreach (var i in anAFeatureSubgroups)
{
anAFeature = i.Key;
break;
}
foreach (var i in aBFeatureSubgroups)
{
aBFeature = i.Key;
break;
}
FeatureComparer aFeatureComparator = new FeatureComparer();
return aFeatureComparator.Compare(anAFeature, aBFeature);
}
}
private List<FeatureGroup> myGroups;
public void AddFeature(string theGroupName, string theSubgroupName, bool theHasParameters, MTKBase_Feature theFeature)
{
int aRes = myGroups.FindIndex(theGroup => theGroup.myName == theGroupName);
if (aRes == -1)
{
myGroups.Add(new FeatureGroup(theGroupName, theSubgroupName, theHasParameters));
aRes = myGroups.Count - 1;
}
FeatureGroup aGroup = myGroups[aRes];
FeatureMapType aSubgroups = aGroup.myFeatureSubgroups;
if (aSubgroups.ContainsKey(theFeature))
{
++aSubgroups[theFeature];
}
else
{
aSubgroups[theFeature] = 1;
}
}
public void Print(string theFeatureType, Action<MTKBase_Feature> thePrintFeatureParameters)
{
myGroups.Sort(new FeatureGroupComparer());
uint aTotalCount = 0;
foreach (var i in myGroups)
{
uint aFeatureCount = i.FeatureCount();
aTotalCount += aFeatureCount;
Console.WriteLine($" {i.myName}: {aFeatureCount}");
if (!i.myHasParameters)
{
continue;
}
string aSubgroupName = i.mySubgroupName;
foreach (var j in i.myFeatureSubgroups)
{
Console.WriteLine($" {j.Value} {aSubgroupName} with");
thePrintFeatureParameters(j.Key);
}
}
Console.WriteLine($"\n Total {theFeatureType}: {aTotalCount}\n");
}
public static void PrintFeatureParameter<T>(string theName, T theValue, string theUnits)
{
Console.WriteLine($" {theName}: {theValue} {theUnits}");
}
}
}
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.
using feature_group;
using shape_processor;
using System;
using System.Collections.Generic;
namespace dfm_analyzer
{
class Program
{
static int Main(string[] args)
{
string aKey = MTKLicenseKey.Value();
if (!LicenseManager.Activate(aKey))
{
Console.WriteLine("Failed to activate Manufacturing Toolkit license.");
return 1;
}
if (args.Length != 1)
{
Console.WriteLine("Usage: " +
$"{System.Reflection.Assembly.GetExecutingAssembly().Location} <input_file>, where:");
Console.WriteLine($" <input_file> is a name of the file to be read");
Console.WriteLine($"");
return 1;
}
string aSource = args[0];
var aModel = new Model();
var aReader = new ModelReader();
if (!aReader.Read(new UTF16String(aSource), aModel))
{
Console.WriteLine($"Failed to read the file {aSource}");
return 1;
}
Console.WriteLine($"Model: {aModel.Name()}\n");
var aPartProcessor = new PartProcessor();
var aVisitor = new ModelElementUniqueVisitor (aPartProcessor);
aModel.Accept (aVisitor);
return 0;
}
class PartProcessor : SolidProcessor
{
public PartProcessor()
{}
public override void ProcessSolid(Solid theSolid)
{
var aRecognizerParameters = new Molding_FeatureRecognizerParameters();
aRecognizerParameters.SetMaxRibThickness(30.0);
aRecognizerParameters.SetMaxRibDraftAngle(0.2);
aRecognizerParameters.SetMaxRibTaperAngle(0.1);
var aRecognizer = new Molding_FeatureRecognizer(aRecognizerParameters);
var anAnalyzer = new Molding_Analyzer();
anAnalyzer.AddTool (aRecognizer);
var aData = anAnalyzer.Perform (theSolid);
var aParameters = new DFMMolding_AnalyzerParameters();
var aDFMAnalyzer = new DFMMolding_Analyzer (aParameters);
var anIssueList = aDFMAnalyzer.Perform(aData);
PrintIssues(anIssueList);
}
}
static void PrintIssues (MTKBase_FeatureList theIssueList)
{
FeatureGroupManager aManager = new FeatureGroupManager();
for (uint i = 0; i < theIssueList.Size(); ++i)
{
MTKBase_Feature anIssue = theIssueList.Feature (i);
if (DFMMolding_IrregularCoreDepthScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("Irregular Core Depth Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
}
else if (DFMMolding_IrregularCoreDiameterScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("Irregular Core Diameter Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
}
else if (DFMMolding_IrregularWallThicknessScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("Irregular Wall Thickness Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
}
else if (DFMMolding_HighScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("High Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
}
else if (DFMMolding_SmallBaseRadiusScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Base Radius Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
}
else if (DFMMolding_SmallDraftAngleScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Draft Angle Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
}
else if (DFMMolding_HighRibIssue.CompareType(anIssue))
{
aManager.AddFeature("High Rib Issue(s)", "Rib(s)", true, anIssue);
}
else if (DFMMolding_IrregularThicknessRibIssue.CompareType(anIssue))
{
aManager.AddFeature("Irregular Thickness Rib Issue(s)", "Rib(s)", true, anIssue);
}
else if (DFMMolding_SmallBaseRadiusRibIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Base Radius Rib Issue(s)", "Rib(s)", true, anIssue);
}
else if (DFMMolding_SmallDraftAngleRibIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Draft Angle Rib Issue(s)", "Rib(s)", true, anIssue);
}
else if (DFMMolding_SmallDistanceBetweenRibsIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Distance Between Ribs Issue(s)", "Rib(s)", true, anIssue);
}
else if (DFMMolding_SmallHoleBaseRadiusScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Hole Base Radius Screw Boss Issue(s)", "Screw Boss(es)", true, anIssue);
}
else if (DFMMolding_NonChamferedScrewBossIssue.CompareType(anIssue))
{
aManager.AddFeature("Non Chamfered Screw Boss Issue(s)", "Screw Boss(es)", false, anIssue);
}
else if (DFMMolding_IrregularWallThicknessIssue.CompareType(anIssue))
{
aManager.AddFeature("Irregular Wall Thickness Issue(s)", "Wall(s)", true, anIssue);
}
else if (DFMMolding_LargeWallThicknessIssue.CompareType(anIssue))
{
aManager.AddFeature("Large Wall Thickness Issue(s)", "Wall(s)", true, anIssue);
}
else if (DFMMolding_SmallWallThicknessIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Wall Thickness Issue(s)", "Wall(s)", true, anIssue);
}
else if (DFMMolding_SmallDraftAngleWallIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Draft Angle Wall Thickness Issue(s)", "Wall(s)", true, anIssue);
}
else if (DFMMolding_SmallDistanceBetweenBossesIssue.CompareType(anIssue))
{
aManager.AddFeature("Small Distance Between Bosses Issue(s)", "Boss(es)", true, anIssue);
}
}
Action<MTKBase_Feature> PrintFeatureParameters = theIssue =>
{
if (DFMMolding_IrregularCoreDepthScrewBossIssue.CompareType (theIssue))
{
DFMMolding_IrregularCoreDepthScrewBossIssue aICDSBIssue = DFMMolding_IrregularCoreDepthScrewBossIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("actual height", aICDSBIssue.ActualCoreDepth(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual core depth", aICDSBIssue.ActualHeight(), "mm");
}
else if (DFMMolding_IrregularCoreDiameterScrewBossIssue.CompareType (theIssue))
{
DFMMolding_IrregularCoreDiameterScrewBossIssue aICDSBIssue = DFMMolding_IrregularCoreDiameterScrewBossIssue.Cast (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 (DFMMolding_IrregularWallThicknessScrewBossIssue.CompareType (theIssue))
{
DFMMolding_IrregularWallThicknessScrewBossIssue aIWTSBIssue = DFMMolding_IrregularWallThicknessScrewBossIssue.Cast (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 (DFMMolding_HighScrewBossIssue.CompareType(theIssue))
{
DFMMolding_HighScrewBossIssue aHSBIssue = DFMMolding_HighScrewBossIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected max height", aHSBIssue.ExpectedMaxHeight(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual height", aHSBIssue.ActualHeight(), "mm");
}
else if (DFMMolding_SmallBaseRadiusScrewBossIssue.CompareType(theIssue))
{
DFMMolding_SmallBaseRadiusScrewBossIssue aSBRSBIssue = DFMMolding_SmallBaseRadiusScrewBossIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min base radius", aSBRSBIssue.ExpectedMinBaseRadius(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual base radius", aSBRSBIssue.ActualBaseRadius(), "mm");
}
else if (DFMMolding_SmallDraftAngleScrewBossIssue.CompareType(theIssue))
{
DFMMolding_SmallDraftAngleScrewBossIssue aSDASBIssue = DFMMolding_SmallDraftAngleScrewBossIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min draft angle", ToDegrees(aSDASBIssue.ExpectedMinDraftAngle()), "deg");
FeatureGroupManager.PrintFeatureParameter ("actual draft angle", ToDegrees(aSDASBIssue.ActualDraftAngle()), "deg");
}
else if (DFMMolding_HighRibIssue.CompareType (theIssue))
{
DFMMolding_HighRibIssue aHRIssue = DFMMolding_HighRibIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected max height", aHRIssue.ExpectedMaxHeight(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual height", aHRIssue.ActualHeight(), "mm");
}
else if (DFMMolding_IrregularThicknessRibIssue.CompareType (theIssue))
{
DFMMolding_IrregularThicknessRibIssue aITRIssue = DFMMolding_IrregularThicknessRibIssue.Cast (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 (DFMMolding_SmallBaseRadiusRibIssue.CompareType(theIssue))
{
DFMMolding_SmallBaseRadiusRibIssue aSBRRIssue = DFMMolding_SmallBaseRadiusRibIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min base radius", aSBRRIssue.ExpectedMinBaseRadius(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual base radius", aSBRRIssue.ActualBaseRadius(), "mm");
}
else if (DFMMolding_SmallDraftAngleRibIssue.CompareType(theIssue))
{
DFMMolding_SmallDraftAngleRibIssue aSDARIssue = DFMMolding_SmallDraftAngleRibIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min draft angle", ToDegrees(aSDARIssue.ExpectedMinDraftAngle()), "deg");
FeatureGroupManager.PrintFeatureParameter ("actual draft angle", ToDegrees(aSDARIssue.ActualDraftAngle()), "deg");
}
else if (DFMMolding_SmallDistanceBetweenRibsIssue.CompareType(theIssue))
{
DFMMolding_SmallDistanceBetweenRibsIssue aSDBRIssue = DFMMolding_SmallDistanceBetweenRibsIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min distance", aSDBRIssue.ExpectedMinDistanceBetweenRibs(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual distance", aSDBRIssue.ActualDistanceBetweenRibs(), "mm");
}
else if (DFMMolding_SmallHoleBaseRadiusScrewBossIssue.CompareType(theIssue))
{
DFMMolding_SmallHoleBaseRadiusScrewBossIssue aSHBRSBIssue = DFMMolding_SmallHoleBaseRadiusScrewBossIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min hole base radius", aSHBRSBIssue.ExpectedMinHoleBaseRadius(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual hole base radius", aSHBRSBIssue.ActualHoleBaseRadius(), "mm");
}
else if (DFMMolding_NonChamferedScrewBossIssue.CompareType(theIssue))
{
}
else if (DFMMolding_IrregularWallThicknessIssue.CompareType(theIssue))
{
DFMMolding_IrregularWallThicknessIssue aIWTIIssue = DFMMolding_IrregularWallThicknessIssue.Cast (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 (DFMMolding_LargeWallThicknessIssue.CompareType(theIssue))
{
DFMMolding_LargeWallThicknessIssue aLWTIIssue = DFMMolding_LargeWallThicknessIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected max thickness", aLWTIIssue.ExpectedMaxThickness(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual thickness", aLWTIIssue.ActualThickness(), "mm");
}
else if (DFMMolding_SmallWallThicknessIssue.CompareType(theIssue))
{
DFMMolding_SmallWallThicknessIssue aSWTIIssue = DFMMolding_SmallWallThicknessIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min thickness", aSWTIIssue.ExpectedMinThickness(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual thickness", aSWTIIssue.ActualThickness(), "mm");
}
else if (DFMMolding_SmallDraftAngleWallIssue.CompareType(theIssue))
{
DFMMolding_SmallDraftAngleWallIssue aSDAWIssue = DFMMolding_SmallDraftAngleWallIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min draft angle", ToDegrees(aSDAWIssue.ExpectedMinDraftAngle()), "deg");
FeatureGroupManager.PrintFeatureParameter ("actual draft angle", ToDegrees(aSDAWIssue.ActualDraftAngle()), "deg");
}
else if (DFMMolding_SmallDistanceBetweenBossesIssue.CompareType(theIssue))
{
DFMMolding_SmallDistanceBetweenBossesIssue aSDBBIssue = DFMMolding_SmallDistanceBetweenBossesIssue.Cast (theIssue);
FeatureGroupManager.PrintFeatureParameter ("expected min distance", aSDBBIssue.ExpectedMinDistanceBetweenBosses(), "mm");
FeatureGroupManager.PrintFeatureParameter ("actual distance", aSDBBIssue.ActualDistanceBetweenBosses(), "mm");
}
};
aManager.Print ("issues", PrintFeatureParameters);
}
static double ToDegrees(double theAngleRad)
{
return theAngleRad * 180 / Math.PI;
}
}
}