using System;
using System.Collections.Generic;
using Hi.Disp;
using Hi.Geom;
using Hi.Mech.Topo;
namespace Sample.Mech
{
///
/// Demonstrates the creation and visualization of mechanical assemblies with kinematic linkages.
/// Shows how to build coordinate systems, establish kinematic relationships, and capture visual output.
///
///
/// ### Source Code
/// [!code-csharp[SampleCode](~/../Hi.Sample/Mech/DemoTopo1.cs)]
///
public static class DemoTopo1
{
///
/// Creates a demonstration assembly with kinematic linkages.
/// Builds a mechanical assembly with multiple anchors and branches, including both static and dynamic transformations.
///
/// A tuple containing the assembly and root anchor
static (Asmb asmb,Anchor root) GetDemoAsmb()
{
#region DocSite.DemoTopo1
//build coordinate systems and the assembly.
Asmb asmb = new Asmb { Name = "Mech" };
Anchor O = new Anchor(asmb, "O");
Anchor O1 = new Anchor(asmb, "O1");
Anchor X = new Anchor(asmb, "X");
Anchor Z = new Anchor(asmb, "Z");
Anchor B = new Anchor(asmb, "B");
//build kinematic link
Branch.Attach(O, O1, new StaticTranslation(new Vec3d(0, 0, 80)));
Branch brnX = Branch.Attach(O1, X, new DynamicTranslation(new Vec3d(1, 0, 0)));
Branch brnZ = Branch.Attach(X, Z, new DynamicTranslation(new Vec3d(0, 0, 1)));
Branch brnB = Branch.Attach(Z, B, new DynamicRotation(new Vec3d(0, 1, 0), 0, new Vec3d(-100, 0, 0)));
//drive the dynamic transformation by single value for each branch.
brnX.Step = 200;
brnZ.Step = 100;
brnB.Step = MathUtil.ToRad(-60);
//Get and show the transform matrices relative to O.
Dictionary matMap = asmb.GetMat4dMap(O);
Console.WriteLine("Transform Matrix relative to O:");
foreach (KeyValuePair keyValue in matMap)
Console.WriteLine($"{keyValue.Key.Name} : {keyValue.Value}");
#endregion
return (asmb,O);
}
///
/// Captures the assembly visualization and saves it to a file.
/// Initializes the display engine, sets up the assembly visualization with an isometric view, and saves a snapshot to a bitmap file.
///
/// A tuple containing the assembly and root anchor for visualization
static void SnapshotToFile((Asmb asmb, Anchor root) src)
{
//all the drawing function has to call DispEngine.Init() before using.
DispEngine.Init();
DispEngine.EnableSuppressDefaultLogo = true;
using (DispEngine dispEngine = new DispEngine(
src.asmb.GetAsmbDraw(src.root)))
{
dispEngine.SetViewToIsometricView();
dispEngine.Snapshot("DemoTopo1.bmp", 680, 480);
}
Console.WriteLine("Snapshot file output.");
DispEngine.FinishDisp();
}
static void Main()
{
SnapshotToFile(GetDemoAsmb());
}
}
}