using System;
using System.Collections.Generic;
namespace bom
{
class Program
{
static int Main(string[] args)
{
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 aKey = MTKLicenseKey.Value();
if (!LicenseHelper.SetupRuntimeKey())
{
return 1;
}
try
{
LicenseManager.Activate(aKey);
}
catch (LicenseError theException)
{
LicenseManager.Deactivate();
Console.WriteLine("Failed to activate Manufacturing Toolkit license: " + theException.what());
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);
LicenseManager.Deactivate();
return 1;
}
SceneGraphVisitor aCounter = new SceneGraphVisitor();
aModel.Accept(aCounter);
aCounter.PrintCounts();
LicenseManager.Deactivate();
return 0;
}
}
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>();
private int myNestingLevel;
}
}
Defines classes, types, enums, and functions related to topological entities and scene graph elements...
The mtk namespace is intended to become the primary namespace for MTK and replace direct use of the c...
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.