Hide menu
Loading...
Searching...
No Matches
exploring/pmi/Program.cs
Refer to the PMI Exploration 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.PMI;
using System;
namespace pmi
{
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];
var aModel = new Model();
var aReader = new ModelReader();
var aParams = new ModelReaderParameters();
aParams.SetReadPMI(true);
aReader.SetParameters(aParams);
// Reading the file
if (!aReader.Read(new UTF16String(aSource), aModel))
{
Console.WriteLine($"Failed to read the file {aSource}");
return 1;
}
Console.WriteLine($"Model: {aModel.Name()}\n");
// Create a PMI visitor
SceneGraphVisitor aVisitor = new SceneGraphVisitor();
aModel.Accept(aVisitor);
return 0;
}
}
class TabulatedOutput
{
public static void WriteLine(Object theObject)
{
PrintTabulation();
Console.WriteLine(theObject);
}
public static void IncreaseIndent() { ++myNestingLevel; }
public static void DecreaseIndent() { --myNestingLevel; }
private static void PrintTabulation()
{
if (myNestingLevel <= 0)
{
return;
}
// Emulate tabulation like tree.
for (int i = 0; i < myNestingLevel - 1; i++)
{
if (i < 2 || i == 3)
{
Console.Write("| ");
}
else
{
Console.Write(" ");
}
}
Console.Write("|__");
if (myNestingLevel > 3)
{
Console.Write(" ");
}
}
private static int myNestingLevel = 0;
}
class SceneGraphVisitor : ModelElementVisitor
{
public override void Apply(Part thePart)
{
PrintName("Part", thePart.Name());
ExplorePMI(thePart);
}
public override bool VisitEnter(Instance theInstance)
{
TabulatedOutput.IncreaseIndent();
PrintName("Instance", theInstance.Name());
ExplorePMI(theInstance);
return true;
}
public override bool VisitEnter(Assembly theAssembly)
{
TabulatedOutput.IncreaseIndent();
PrintName("Assembly", theAssembly.Name());
ExplorePMI(theAssembly);
return true;
}
public override void VisitLeave(Instance theInstance)
{
TabulatedOutput.DecreaseIndent();
}
public override void VisitLeave(Assembly theAssembly)
{
TabulatedOutput.DecreaseIndent();
}
private void ExplorePMI(ModelElement theSGE)
{
var aPMIData = theSGE.PMI();
if (aPMIData != null)
{
TabulatedOutput.WriteLine("PMI Data:");
TabulatedOutput.IncreaseIndent();
foreach (var anElement in aPMIData.Elements())
{
TabulatedOutput.WriteLine("PMI Data: " + anElement.Name());
TabulatedOutput.IncreaseIndent();
SemanticRepresentation aSemanticRepresentation = anElement.SemanticRepresentation();
if (aSemanticRepresentation != null)
{
TabulatedOutput.WriteLine("Semantic Representation:");
TabulatedOutput.IncreaseIndent();
PMISemanticVisitor aVisitor = new PMISemanticVisitor();
aSemanticRepresentation.Accept(aVisitor);
TabulatedOutput.DecreaseIndent();
}
GraphicalRepresentation aGraphicalRepresentation = anElement.GraphicalRepresentation();
if (aGraphicalRepresentation != null)
{
TabulatedOutput.WriteLine("Graphical Representation:");
TabulatedOutput.IncreaseIndent();
PMIGraphicalVisitor aVisitor = new PMIGraphicalVisitor();
aGraphicalRepresentation.Accept(aVisitor);
TabulatedOutput.DecreaseIndent();
}
TabulatedOutput.DecreaseIndent();
}
TabulatedOutput.DecreaseIndent();
}
}
private void PrintName(string theSGElement, UTF16String theName)
{
if (!theName.IsEmpty())
{
TabulatedOutput.WriteLine(theSGElement + ": " + theName);
}
else
{
TabulatedOutput.WriteLine(theSGElement + ": <noname>");
}
}
}
class PMISemanticVisitor : SemanticComponentVisitor
{
public override void Apply(DatumComponent theComponent)
{
TabulatedOutput.WriteLine("Datum");
TabulatedOutput.IncreaseIndent();
TabulatedOutput.WriteLine("Label: " + theComponent.Label());
printAttributes(theComponent);
TabulatedOutput.DecreaseIndent();
}
public override void Apply(DimensionComponent theComponent)
{
TabulatedOutput.WriteLine("Dimension");
TabulatedOutput.IncreaseIndent();
TabulatedOutput.WriteLine("Nominal Value: " + theComponent.NominalValue());
TabulatedOutput.WriteLine("Type of dimension: " + (int)theComponent.TypeOfDimension());
printAttributes(theComponent);
TabulatedOutput.DecreaseIndent();
}
public override void Apply(GeometricToleranceComponent theComponent)
{
TabulatedOutput.WriteLine("Geometric tolerance");
TabulatedOutput.IncreaseIndent();
TabulatedOutput.WriteLine("Magnitude: " + theComponent.Magnitude());
TabulatedOutput.WriteLine("Type of tolerance: " + (int)theComponent.TypeOfTolerance());
TabulatedOutput.WriteLine("Tolerance zone form: " + (int)theComponent.ToleranceZoneForm());
printAttributes(theComponent);
TabulatedOutput.DecreaseIndent();
}
public override void Apply(SurfaceFinishComponent theComponent)
{
TabulatedOutput.WriteLine("Surface Finish");
TabulatedOutput.IncreaseIndent();
TabulatedOutput.WriteLine("Material removal: " + (int)theComponent.MaterialRemoval());
TabulatedOutput.WriteLine("Lay direction: " + (int)theComponent.LayDirection());
TabulatedOutput.WriteLine("All around flag: " + theComponent.IsAllAround());
TabulatedOutput.WriteLine("Manufacturing method: " + theComponent.ManufacturingMethod());
printAttributes(theComponent);
TabulatedOutput.DecreaseIndent();
}
void printAttributes(SemanticComponent theComponent)
{
if (theComponent.HasAttributes())
{
PMISemanticAttributeVisitor aVisitor = new PMISemanticAttributeVisitor();
theComponent.Accept(aVisitor);
}
}
}
class PMISemanticAttributeVisitor : SemanticAttributeVisitor
{
public override void Apply(ModifierAttribute theAttribute)
{
TabulatedOutput.WriteLine("Modifier: " + theAttribute.Modifier());
}
public override void Apply(ModifierWithValueAttribute theAttribute)
{
TabulatedOutput.WriteLine("ModifierWithValue: modifier=" + theAttribute.Modifier() + ", value=" + theAttribute.Value());
}
public override void Apply(QualifierAttribute theAttribute)
{
TabulatedOutput.WriteLine("Qualifier: " + theAttribute.Qualifier());
}
public override void Apply(PlusMinusBoundsAttribute theAttribute)
{
TabulatedOutput.WriteLine("PlusMinusBounds: (" + theAttribute.LowerBound() + ", " + theAttribute.UpperBound() + ")");
}
public override void Apply(RangeAttribute theAttribute)
{
TabulatedOutput.WriteLine("Range: [" + theAttribute.LowerLimit() + ", " + theAttribute.UpperLimit() + "]");
}
public override void Apply(LimitsAndFitsAttribute theAttribute)
{
TabulatedOutput.WriteLine("LimitsAndFits: value=" + theAttribute.Value() + ", type=" + theAttribute.Type());
}
public override void Apply(DatumTargetAttribute theAttribute)
{
TabulatedOutput.WriteLine("DatumTarget: index=" + theAttribute.Index() + ", description=" + theAttribute.Description());
}
public override void Apply(DatumRefAttribute theAttribute)
{
TabulatedOutput.WriteLine("DatumRef: precedence=" + theAttribute.Precedence() + ", targetLabel=" + theAttribute.TargetLabel());
}
public override void Apply(DatumRefCompartmentAttribute theAttribute)
{
TabulatedOutput.WriteLine("DatumRefCompartment:");
TabulatedOutput.IncreaseIndent();
uint aNumberOfReferences = theAttribute.NumberOfReferences();
if (aNumberOfReferences > 0)
{
TabulatedOutput.WriteLine("References:");
TabulatedOutput.IncreaseIndent();
for (uint i = 0; i < aNumberOfReferences; i++)
{
theAttribute.Reference(i).Accept(this);
}
TabulatedOutput.DecreaseIndent();
}
uint aNumberOfModifierAttributes = theAttribute.NumberOfModifierAttributes();
if (aNumberOfModifierAttributes > 0)
{
TabulatedOutput.WriteLine("Modifiers:");
TabulatedOutput.IncreaseIndent();
for (uint i = 0; i < aNumberOfModifierAttributes; i++)
{
theAttribute.ModifierAttribute(i).Accept(this);
}
TabulatedOutput.DecreaseIndent();
}
TabulatedOutput.DecreaseIndent();
}
public override void Apply(MaximumValueAttribute theAttribute)
{
TabulatedOutput.WriteLine("MaximumValue: " + theAttribute.MaxValue());
}
public override void Apply(DisplacementAttribute theAttribute)
{
TabulatedOutput.WriteLine("Displacement: " + theAttribute.Displacement());
}
public override void Apply(LengthUnitAttribute theAttribute)
{
TabulatedOutput.WriteLine("LengthUnit: " + theAttribute.Unit());
}
public override void Apply(AngleUnitAttribute theAttribute)
{
TabulatedOutput.WriteLine("AngleUnit: " + theAttribute.Unit());
}
public override void Apply(MachiningAllowanceAttribute theAttribute)
{
TabulatedOutput.WriteLine("Machining allowance");
TabulatedOutput.IncreaseIndent();
TabulatedOutput.WriteLine("Value: " + theAttribute.Value());
TabulatedOutput.WriteLine("Upper bound: " + theAttribute.UpperBound());
TabulatedOutput.WriteLine("Lower bound: " + theAttribute.LowerBound());
TabulatedOutput.DecreaseIndent();
}
public override void Apply(SurfaceTextureRequirementAttribute theAttribute)
{
TabulatedOutput.WriteLine("Surface texture requirement #" + (int)theAttribute.Precedence());
TabulatedOutput.IncreaseIndent();
TabulatedOutput.WriteLine("Specification limit: " + (int)theAttribute.SpecificationLimit());
TabulatedOutput.WriteLine("Filter name: " + theAttribute.FilterName());
TabulatedOutput.WriteLine("Short wave filter: " + theAttribute.ShortWaveFilter());
TabulatedOutput.WriteLine("Long wave filter: " + theAttribute.LongWaveFilter());
TabulatedOutput.WriteLine("Surface parameter: " + (int)theAttribute.SurfaceParameter());
TabulatedOutput.WriteLine("Evaluation length: " + theAttribute.EvaluationLength());
TabulatedOutput.WriteLine("Comparison rule: " + (int)theAttribute.ComparisonRule());
TabulatedOutput.WriteLine("Limit value: " + theAttribute.LimitValue());
TabulatedOutput.DecreaseIndent();
}
}
class PMIGraphicalVisitor : GraphicalComponentVisitor
{
public override void Apply(OutlinedComponent theComponent)
{
TabulatedOutput.WriteLine("Outline");
TabulatedOutput.IncreaseIndent();
PMIOutlineVisitor aVisitor = new PMIOutlineVisitor();
theComponent.Outline().Accept(aVisitor);
TabulatedOutput.DecreaseIndent();
}
public override void Apply(TextComponent theComponent)
{
TabulatedOutput.WriteLine("Text [" + theComponent.Text() + "]");
}
public override void Apply(TriangulatedComponent theComponent)
{
TabulatedOutput.WriteLine("Triangulation [" + theComponent.TriangleSet().NumberOfTriangles() + " triangles]");
}
}
class PMIOutlineVisitor : OutlineVisitor
{
public override void Apply(PolyOutline theOutline)
{
TabulatedOutput.WriteLine("PolyLine set [" + theOutline.LineSet().NumberOfPolylines() + " polylines]");
}
public override void Apply(Poly2dOutline theOutline)
{
TabulatedOutput.WriteLine("PolyLine2d set [" + theOutline.LineSet().NumberOfPolylines() + " polylines]");
}
public override void Apply(CurveOutline theOutline)
{
TabulatedOutput.WriteLine("Curve set [" + theOutline.NumberOfCurves() + " curves]");
}
public override void Apply(Curve2dOutline theOutline)
{
TabulatedOutput.WriteLine("Curve2d set [" + theOutline.NumberOfCurves() + " curves]");
}
public override bool VisitEnter(CompositeOutline theOutline)
{
TabulatedOutput.WriteLine("Outline set:");
TabulatedOutput.IncreaseIndent();
return true;
}
public override void VisitLeave(CompositeOutline theOutline)
{
TabulatedOutput.DecreaseIndent();
}
}
}
Defines a group of model elements.
Definition Assembly.hxx:31
size_t NumberOfTriangles() const
Returns a number of triangles.
Definition IndexedTriangleSet.cxx:447
Defines an occurrence of an assembly or a part in a scene graph.
Definition Instance.hxx:29
Base class for part, instance and assembly.
Definition ModelElement.hxx:37
PMI::Data PMI() const
Returns the object PMI.
Definition ModelElement.cxx:95
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
Reads supported formats, see Import section.
Definition ModelReader.hxx:32
Defines parameters of the ModelReader.
Definition ModelReaderParameters.hxx:27
Defines a leaf node in the scene graph hierarchy.
Definition Part.hxx:32
size_t NumberOfPolylines() const
Returns a number of polylines in polyline set.
Definition Polyline2dSet.cxx:70
size_t NumberOfPolylines() const
Returns a number of polylines in polyline set.
Definition PolylineSet.cxx:72
Defines an angle unit.
Definition SemanticAttribute.hxx:272
ModelData::AngleUnit Unit() const
Returns the unit.
Definition SemanticAttribute.cxx:638
Defines a collection of outlines.
Definition Outline.hxx:124
Defines an outline consisting of 2D curves.
Definition Outline.hxx:104
size_t NumberOfCurves() const
Returns the number of added curves.
Definition Outline.cxx:304
Defines an outline consisting of curves.
Definition Outline.hxx:84
size_t NumberOfCurves() const
Returns the number of added curves.
Definition Outline.cxx:232
Defines a component represented by a datum, datum feature symbol or datum target.
Definition SemanticComponent.hxx:148
UTF16String Label() const
Returns the label of the datum.
Definition SemanticComponent.cxx:300
Defines a datum reference.
Definition SemanticAttribute.hxx:179
size_t Precedence() const
Returns the precedence value.
Definition SemanticAttribute.cxx:419
const UTF16String & TargetLabel() const
Returns the target label.
Definition SemanticAttribute.cxx:431
Defines a compartment of datum references or compartments.
Definition SemanticAttribute.hxx:199
size_t NumberOfReferences() const
Returns the number of the datum compartment references.
Definition SemanticAttribute.cxx:469
const PMI::ModifierAttribute & ModifierAttribute(size_t theIndex) const
Returns the specific modifier attribute.
Definition SemanticAttribute.cxx:493
size_t NumberOfModifierAttributes() const
Returns the number of the modifier attributes.
Definition SemanticAttribute.cxx:487
const SemanticAttribute & Reference(size_t theIndex) const
Returns the specific datum compartment reference.
Definition SemanticAttribute.cxx:475
Defines a datum target data.
Definition SemanticAttribute.hxx:159
size_t Index() const
Returns the index.
Definition SemanticAttribute.cxx:367
const UTF16String & Description() const
Returns the description.
Definition SemanticAttribute.cxx:379
Defines a component represented by a dimensional tolerance.
Definition SemanticComponent.hxx:53
double NominalValue() const
Returns the nominal value of the dimension.
Definition SemanticComponent.cxx:156
DimensionType TypeOfDimension() const
Returns the type of the dimension.
Definition SemanticComponent.cxx:172
Defines a displacement value for an unequally disposed geometric tolerance.
Definition SemanticAttribute.hxx:238
double Displacement() const
Returns the displacement value.
Definition SemanticAttribute.cxx:567
Defines a component represented by a geometric tolerance.
Definition SemanticComponent.hxx:91
double Magnitude() const
Returns the magnitude value of the tolerance.
Definition SemanticComponent.cxx:226
ToleranceZoneFormType ToleranceZoneForm() const
Returns the tolerance zone form.
Definition SemanticComponent.cxx:242
ToleranceType TypeOfTolerance() const
Returns the type of the tolerance.
Definition SemanticComponent.cxx:258
Defines a visitor for components.
Definition GraphicalComponentVisitor.hxx:31
Defines a PMI graphical element.
Definition GraphicalRepresentation.hxx:31
Defines a length unit.
Definition SemanticAttribute.hxx:255
ModelData::LengthUnit Unit() const
Returns the unit.
Definition SemanticAttribute.cxx:603
Defines a kind of a tolerance class dimension.
Definition SemanticAttribute.hxx:139
const UTF16String & Value() const
Returns the value.
Definition SemanticAttribute.cxx:326
const UTF16String & Type() const
Returns the type.
Definition SemanticAttribute.cxx:314
Defines a machining allowance and its bound (deviations).
Definition SemanticAttribute.hxx:289
double Value() const
Returns the machining allowance value.
Definition SemanticAttribute.cxx:678
double UpperBound() const
Returns the upper bound.
Definition SemanticAttribute.cxx:691
double LowerBound() const
Returns the lower bound.
Definition SemanticAttribute.cxx:704
Defines a maximum value.
Definition SemanticAttribute.hxx:221
double MaxValue() const
Returns the maximum value.
Definition SemanticAttribute.cxx:530
Defines a type of the modification.
Definition SemanticAttribute.hxx:48
Defines the type of the modification with additional value.
Definition SemanticAttribute.hxx:65
double Value() const
Returns the value.
Definition SemanticAttribute.cxx:137
Defines the visitor of the outline elements.
Definition OutlineVisitor.hxx:32
Defines a component represented by an outline.
Definition GraphicalComponent.hxx:49
PMI::Outline Outline() const
Returns the outline.
Definition GraphicalComponent.cxx:228
Defines plus and minus bounds (deviations) of a tolerance.
Definition SemanticAttribute.hxx:99
double UpperBound() const
Returns the upper bound.
Definition SemanticAttribute.cxx:212
double LowerBound() const
Returns the lower bound.
Definition SemanticAttribute.cxx:225
Defines an outline consisting of 2D polylines.
Definition Outline.hxx:67
ModelData::Polyline2dSet LineSet() const
Returns the line set.
Definition Outline.cxx:184
Defines an outline consisting of polylines.
Definition Outline.hxx:50
ModelData::PolylineSet LineSet() const
Returns the line set.
Definition Outline.cxx:141
Defines the type of a qualifier.
Definition SemanticAttribute.hxx:82
const UTF16String & Qualifier() const
Retruns the qualifier.
Definition SemanticAttribute.cxx:175
Defines the range of a value.
Definition SemanticAttribute.hxx:119
double UpperLimit() const
Returns the upper limit.
Definition SemanticAttribute.cxx:262
double LowerLimit() const
Returns the lower limit.
Definition SemanticAttribute.cxx:275
Defines a visitor for attributes.
Definition SemanticAttributeVisitor.hxx:43
The base class for various component types.
Definition SemanticComponent.hxx:31
void Accept(SemanticAttributeVisitor &theVisitor) const
Accepts an attribute visitor.
Definition SemanticComponent.cxx:100
bool HasAttributes() const
Returns true if semantic attributes were added and false otherwise.
Definition SemanticComponent.cxx:69
Defines a visitor for components.
Definition SemanticComponentVisitor.hxx:31
Defines a PMI semantic representation.
Definition SemanticRepresentation.hxx:29
void Accept(SemanticComponentVisitor &theVisitor) const
Accepts the visitor.
Definition SemanticRepresentation.cxx:117
Defines a component represented by a suface texture.
Definition SemanticComponent.hxx:160
LayDirectionType LayDirection() const
Returns the type of the lay direction.
Definition SemanticComponent.cxx:370
bool IsAllAround() const
Returns true if the same surface texture is required on all surfaces around a workpiece outline and f...
Definition SemanticComponent.cxx:385
MaterialRemovalType MaterialRemoval() const
Returns the type of the material removal.
Definition SemanticComponent.cxx:355
UTF16String ManufacturingMethod() const
Returns the manufacturing method.
Definition SemanticComponent.cxx:400
Defines a surface texture requirement.
Definition SemanticAttribute.hxx:313
double LongWaveFilter() const
Returns the long wave filter value.
Definition SemanticAttribute.cxx:821
SurfaceParameterType SurfaceParameter() const
Returns the surface parameter.
Definition SemanticAttribute.cxx:833
double LimitValue() const
Returns the limit value.
Definition SemanticAttribute.cxx:874
double EvaluationLength() const
Returns the evaluation length value.
Definition SemanticAttribute.cxx:846
size_t Precedence() const
Returns the precedence value.
Definition SemanticAttribute.cxx:769
SpecificationLimitType SpecificationLimit() const
Returns the specification limit.
Definition SemanticAttribute.cxx:781
ComparisonRuleType ComparisonRule() const
Returns the comparison rule.
Definition SemanticAttribute.cxx:859
const UTF16String & FilterName() const
Returns filter name.
Definition SemanticAttribute.cxx:795
double ShortWaveFilter() const
Returns short wave filter value.
Definition SemanticAttribute.cxx:808
Defines a component represented by text.
Definition GraphicalComponent.hxx:61
UTF16String Text() const
Returns the text component.
Definition GraphicalComponent.cxx:275
Defines a component represented by a triangulation.
Definition GraphicalComponent.hxx:82
ModelData::IndexedTriangleSet TriangleSet() const
Returns the triangle set.
Definition GraphicalComponent.cxx:371
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
Defines classes, types, enums, and functions related to topological entities and scene graph elements...
Contains classes, types, enums, and functions related to PMI entities.
Contains classes, namespaces, enums, types, and global functions related to Manufacturing Toolkit.
Definition LicenseManager_LicenseError.hxx:29