Hide menu
Loading...
Searching...
No Matches
exploring/bom/Program.cs

Refer to the Bill of Materials (BOM) Example.

// ****************************************************************************
// $Id$
//
// Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
// Copyright (C) 2014-2025, CADEX. All rights reserved.
//
// This file is part of the Manufacturing Toolkit software.
//
// You may use this file under the terms of the BSD license as follows:
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// ****************************************************************************
using cadex;
using System;
using System.Collections.Generic;
namespace bom
{
class Program
{
static int Main(string[] args)
{
string aKey = MTKLicenseKey.Value();
// Activate the license (aKey must be defined in mtk_license.cs)
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];
// Load the model
Model aModel = new Model();
if (!new ModelReader().Read(new UTF16String(aSource), aModel))
{
Console.WriteLine("Failed to read the file " + aSource);
return 1;
}
// Create a Counter
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>");
}
// Calculating spacing for output table columns
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; // This variable used only for formating output table
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.