using System;
using System.Collections.Generic;
namespace bom
{
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];
Model aModel = new Model();
if (!new ModelReader().Read(new UTF16String(aSource), aModel))
{
Console.WriteLine("Failed to read the file " + aSource);
return 1;
}
SceneGraphVisitor aCounter = new SceneGraphVisitor();
aModel.Accept(aCounter);
aCounter.PrintCounts();
return 0;
}
}
class ModelElementHash : IEqualityComparer<ModelElement>
{
public bool Equals (ModelElement theFirst, ModelElement theSecond)
{
return theFirst.Id() == theSecond.Id();
}
public int GetHashCode (ModelElement theElement)
{
return (int)theElement.Id();
}
}
class SceneGraphVisitor : ModelElementVisitor
{
public SceneGraphVisitor()
{
myNestingLevel = 0;
margin = 0;
}
public void PrintCounts()
{
Console.WriteLine("Total:");
Console.WriteLine("\t{0,8:c}", "name".PadRight(margin, ' ') + " | " + "type".PadRight(margin, ' ') + " | count");
foreach (KeyValuePair<ModelElement, int> i in mySGEMap)
{
Console.WriteLine("\t{0,8:c}", i.Key.Name().ToString().PadRight(margin, ' ') + " | " + PrintSGEType(i.Key).PadRight(margin, ' ') + " | " + i.Value);
}
}
public override void Apply(Part thePart)
{
PrintName("Part", thePart.Name());
UpdateTable(thePart);
}
public override bool VisitEnter(Assembly theAssembly)
{
PrintName("Assembly", theAssembly.Name());
UpdateTable(theAssembly);
++myNestingLevel;
return true;
}
public override bool VisitEnter(Instance theInstance)
{
PrintName("Instance", theInstance.Name());
++myNestingLevel;
return true;
}
public override void VisitLeave(Assembly theAssembly)
{
--myNestingLevel;
}
public override void VisitLeave(Instance theInstance)
{
--myNestingLevel;
}
private void PrintName(string theModelElement, UTF16String theName)
{
for (int i = 0; i < myNestingLevel; ++i)
{
Console.Write("--- ");
}
if (!theName.IsEmpty())
{
Console.WriteLine(theModelElement + ": " + theName);
}
else
{
Console.WriteLine(theModelElement + ": <noname>");
}
margin = Math.Max(margin, (int)theName.Length());
}
private void UpdateTable(ModelElement theModelElement)
{
if (!mySGEMap.ContainsKey(theModelElement))
{
mySGEMap.Add(theModelElement, 1);
}
else
{
++mySGEMap[theModelElement];
}
}
private string PrintSGEType(ModelElement theElement)
{
if (Part.CompareType(theElement))
{
return "Part";
}
else if (Assembly.CompareType(theElement))
{
return "Assembly";
}
else if (Instance.CompareType(theElement))
{
return "Instance";
}
return "Undefined";
}
private int margin;
private Dictionary<ModelElement, int> mySGEMap = new Dictionary<ModelElement, int>(new ModelElementHash());
private int myNestingLevel;
}
}
Defines classes, types, enums, and functions related to topological entities and scene graph elements...
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.