Hide menu
Loading...
Searching...
No Matches
exploring/bom/Program.cs
Refer to the Bill of Materials (BOM) Example.
// ****************************************************************************
//
// Copyright (C) 2008-2014, Roman Lygin. All rights reserved.
// Copyright (C) 2014-2026, 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 cadex.mtk;
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
{
}
catch (LicenseError theException)
{
Console.WriteLine("Failed to activate Manufacturing Toolkit license: " + theException.what());
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 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>();
private int myNestingLevel;
}
}
Defines a group of model elements.
Definition Assembly.hxx:31
static bool CompareType(const BaseObject &theObject)
Returns true if theObject is an assembly.
Definition Assembly.cxx:171
Defines an occurrence of an assembly or a part in a scene graph.
Definition Instance.hxx:29
static bool CompareType(const BaseObject &theObject)
Returns true if theObject is an instance.
Definition Instance.cxx:166
Base class for part, instance and assembly.
Definition ModelElement.hxx:37
UTF16String Name() const
Returns a name.
Definition ModelElement.cxx:54
Defines a visitor for scene graph elements.
Definition ModelElementVisitor.hxx:52
Provides MTK data model.
Definition Model.hxx:39
void Accept(ModelElementVisitor &theVisitor) const
Accepts a visitor.
Definition Model.cxx:275
Reads supported formats, see Import section.
Definition ModelReader.hxx:32
Defines a leaf node in the scene graph hierarchy.
Definition Part.hxx:32
Defines a Unicode (UTF-16) string wrapping a standard string.
Definition UTF16String.hxx:29
bool IsEmpty() const
Returns true if the string is empty.
Definition UTF16String.cxx:333
size_t Length() const
Returns a string length in UTF16 characters.
Definition UTF16String.cxx:328
Defines an exception thrown by a license manager when a valid license could not be acquired.
Definition LicenseError.hxx:37
const char * what() const noexcept override
Returns an error string.
Definition LicenseError.cxx:50
Provides MTK licensing activation and deactivation API.
Definition LicenseManager.hxx:33
static bool Deactivate()
Closes the active licensing session.
Definition LicenseManager.cxx:640
static bool Activate(const std::string &theDeveloperKey)
Activates MTK licensing using the development license key.
Definition LicenseManager.cxx:191
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...
Definition LicenseError.hxx:27
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.
Definition LicenseError.hxx:27