This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/api/Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.html
T
2026-09-13 19:45:24 +08:00

729 lines
31 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Class PivotTransformationSyntax | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Class PivotTransformationSyntax | HiAPI-C# 2025 ">
<meta name="description" content="ISO/Fanuc-family pivot gate: writes the entry into on blocks where the controller is interpreting commanded XYZ in a frame that needs the Pn→MC kinematic rigid transform — namely active RTCP (G43.4) or active tilted plane (G68/G68.2). On plain-mode blocks (no RTCP, no tilted plane), the controller treats commanded XYZ as machine-frame directly, so the indexed rotary angle is a positioning value only and must not fold into the linear axes; this syntax skips those blocks and leaves the chain at identity (or whatever non-kinematic offsets earlier syntaxes contributed). Brand variants with their own modal vocabulary gate the same shared engine (): Siemens TRAORI/CYCLE800 → ; Heidenhain M128/PLANE SPATIAL would follow the same pattern. Mirrors real Fanuc semantics: plain G43 offsets along the active tilted-plane normal (or machine Z when no tilt is active), and plain XYZ moves map directly to machine axis registers regardless of indexed table/head rotary position. Only G43.4 follows the live tool vector and only G68.2 redefines the work-plane orientation — both of which this guard detects via the existing chain markers. Chain position: must run after all Pn-frame writers (, , , , brand-specific coord offset syntaxes) so the guard sees the finalised mode markers and the PivotTransform entry — when emitted — naturally lands as the last chain element. Must run before / so they see the completed chain. Silently no-ops when is absent (3-axis configurations without rotary kinematics).">
<link rel="icon" href="../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../public/docfx.min.css">
<link rel="stylesheet" href="../public/main.css">
<meta name="docfx:navrel" content="../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="ManagedReference">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax">
<h1 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax" class="text-break">
Class PivotTransformationSyntax
</h1>
<div class="facts text-secondary">
<dl><dt>Namespace</dt><dd><a class="xref" href="Hi.html">Hi</a>.<a class="xref" href="Hi.NcParsers.html">NcParsers</a>.<a class="xref" href="Hi.NcParsers.LogicSyntaxs.html">LogicSyntaxs</a></dd></dl>
<dl><dt>Assembly</dt><dd>HiMech.dll</dd></dl>
</div>
<div class="markdown summary"><p>ISO/Fanuc-family pivot gate: writes the
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_PivotTransformSource">PivotTransformSource</a> entry
into <a class="xref" href="Hi.NcParsers.Keywords.ITransformationDef.html#Hi_NcParsers_Keywords_ITransformationDef_ProgramToMcTransform">ProgramToMcTransform</a> on blocks
where the controller is interpreting commanded XYZ in a frame that
needs the Pn→MC kinematic rigid transform — namely active RTCP
(G43.4) or active tilted plane (G68/G68.2). On plain-mode blocks
(no RTCP, no tilted plane), the controller treats commanded XYZ as
machine-frame directly, so the indexed rotary angle is a positioning
value only and must <b>not</b> fold into the linear axes; this
syntax skips those blocks and leaves the chain at identity (or
whatever non-kinematic offsets earlier syntaxes contributed).
Brand variants with their own modal vocabulary gate the same shared
engine (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html">PivotTransformUtil</a>): Siemens TRAORI/CYCLE800 →
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.Siemens.SiemensPivotTransformationSyntax.html">SiemensPivotTransformationSyntax</a>; Heidenhain
M128/PLANE SPATIAL would follow the same pattern.</p>
<p>
Mirrors real Fanuc semantics: plain G43 offsets along the active
tilted-plane normal (or machine Z when no tilt is active), and
plain XYZ moves map directly to machine axis registers regardless
of indexed table/head rotary position. Only G43.4 follows the live
tool vector and only G68.2 redefines the work-plane orientation —
both of which this guard detects via the existing chain markers.
</p>
<p>
Chain position: must run <b>after</b> all Pn-frame writers
(<a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a>, <a class="xref" href="Hi.NcParsers.LogicSyntaxs.ToolHeightOffsetSyntax.html">ToolHeightOffsetSyntax</a>,
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a>, <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoCoordinateOffsetSyntax.html">IsoCoordinateOffsetSyntax</a>,
brand-specific coord offset syntaxes) so the guard sees the
finalised mode markers and the <code>PivotTransform</code> entry — when
emitted — naturally lands as the <b>last</b> chain element. Must
run <b>before</b> <a class="xref" href="Hi.NcParsers.LogicSyntaxs.McXyzSyntax.html">McXyzSyntax</a> /
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.ProgramXyzSyntax.html">ProgramXyzSyntax</a> so they see the completed chain.
</p>
<p>
Silently no-ops when <a class="xref" href="Hi.Numerical.Xyzabc.IMachineKinematics.html">IMachineKinematics</a> is absent
(3-axis configurations without rotary kinematics).
</p>
</div>
<div class="markdown conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public class PivotTransformationSyntax : ISituNcSyntax, INcSyntax, IMakeXmlSource</code></pre>
</div>
<dl class="typelist inheritance">
<dt>Inheritance</dt>
<dd>
<div><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object">object</a></div>
<div><span class="xref">PivotTransformationSyntax</span></div>
</dd>
</dl>
<dl class="typelist implements">
<dt>Implements</dt>
<dd>
<div><a class="xref" href="Hi.NcParsers.Syntaxs.ISituNcSyntax.html">ISituNcSyntax</a></div>
<div><a class="xref" href="Hi.NcParsers.Syntaxs.INcSyntax.html">INcSyntax</a></div>
<div><a class="xref" href="Hi.Common.XmlUtils.IMakeXmlSource.html">IMakeXmlSource</a></div>
</dd>
</dl>
<dl class="typelist inheritedMembers">
<dt>Inherited Members</dt>
<dd>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object)">object.Equals(object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals(system-object-system-object)">object.Equals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gethashcode">object.GetHashCode()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.gettype">object.GetType()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone">object.MemberwiseClone()</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.referenceequals">object.ReferenceEquals(object, object)</a>
</div>
<div>
<a class="xref" href="https://learn.microsoft.com/dotnet/api/system.object.tostring">object.ToString()</a>
</div>
</dd></dl>
<dl class="typelist extensionMethods">
<dt>Extension Methods</dt>
<dd>
<div>
<a class="xref" href="Hi.Common.DuplicateUtil.html#Hi_Common_DuplicateUtil_TryDuplicate__1___0_System_Object___">DuplicateUtil.TryDuplicate&lt;TSelf&gt;(TSelf, params object[])</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__1___0_System_Action___0__">InvokeUtil.SelfInvoke&lt;TSrc&gt;(TSrc, Action&lt;TSrc&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Common.InvokeUtil.html#Hi_Common_InvokeUtil_SelfInvoke__2___0_System_Func___0___1__">InvokeUtil.SelfInvoke&lt;TSrc, TDst&gt;(TSrc, Func&lt;TSrc, TDst&gt;)</a>
</div>
<div>
<a class="xref" href="Hi.Coloring.ColorUtil.html#Hi_Coloring_ColorUtil_GetGloomyColor_System_Object_System_Double_System_Double_">ColorUtil.GetGloomyColor(object, double, double)</a>
</div>
<div>
<a class="xref" href="Hi.Common.NameUtil.html#Hi_Common_NameUtil_GetSelectionName_System_Object_">NameUtil.GetSelectionName(object)</a>
</div>
<div>
<a class="xref" href="Hi.Common.StringUtil.html#Hi_Common_StringUtil_GetPropertyStringIfToStringNotOverloaded_System_Object_System_Boolean_System_Boolean_">StringUtil.GetPropertyStringIfToStringNotOverloaded(object, bool, bool)</a>
</div>
<div>
<a class="xref" href="Hi.Parallels.LockUtil.html#Hi_Parallels_LockUtil_Lock_System_Object_">LockUtil.Lock(object)</a>
</div>
</dd></dl>
<h2 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_examples">Examples</h2>
<p>Real-kinematics cases below wire <code>TestDeps.CodeKinematics</code>
with the default chain code <code>[O][Z][A][w];[O][Y][X][B][S][t]</code>
— a <b>table-A / head-B 5-axis</b> machine. A is on the table side
(rotates the workpiece around -X); B is on the head side (rotates
the spindle around +Y). Both rotary pivot axes pass through the
origin <code>(0,0,0)</code> of the chain root frame because
<a class="xref" href="Hi.Numerical.Xyzabc.CodeXyzabcChain.html">CodeXyzabcChain</a> uses zero-offset
<code>Branch.Attach</code> between components — a real table-head
machine usually has the spindle-B pivot offset from origin, but
for the corpus the zero-offset chain keeps the matrices
hand-verifiable. Realistic <code>MachineCoordinateState</code> carries
A and/or B only; there is no C axis in this chain (5-axis
machines have at most two rotary axes).</p>
<p>
Verification cue specific to this syntax: the zero-offset chain
puts the machine-zero attacher at the origin, so the entry's
translation anchor <code>T(McToPn(0).Point)</code> vanishes and the
matrix reduces to <code>K(abc)⁻¹</code> alone. Table-A rotation moves
the workpiece's coordinate frame around the X axis through
origin, so the four-basis probe of
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_MakePivotTransformMat_Hi_Numerical_Xyzabc_IMachineKinematics_Hi_Geom_Vec3d_">MakePivotTransformMat(IMachineKinematics, Vec3d)</a> returns
a pure rotation around X — case 3 below pulls out exactly Rx(45°)
(no translation column) for table-A=45°. Head-B rotation maps
every probe point through the same head-chain rotation, but
because everything on the head side downstream of B is at origin
before B applies, the rotation reduces to the identity on the
probe set: <code>K(abc) == K(0) == I</code> and the entry collapses to
identity. That is the symmetry the plain-mode bug fix relies on —
head-side rotary was harmlessly writing identity matrices, while
table-side rotary was silently rotating linear axes into MC.
</p>
<p>
Plain-mode skip — kinematics dep is present but the block has no
active tilted plane and no RTCP, so <code>ShouldFoldKinematicPivot</code>
returns false and the syntax leaves the block untouched. This is
the "no work to do" guard that prevents over-application of the
kinematic transform on indexed-rotary plain XYZ moves:
</p>
#BeforeBuild:
<pre><code class="lang-csharp">{}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{}</code></pre>
Plain-mode skip with indexed rotary — same guard, but the block
already carries a <code>MachineCoordinateState.A = 45</code> indexed
table angle (as a prior <code>McAbcSyntax</code> would have written).
In a real Fanuc controller, commanded XYZ on this block goes
straight to the machine axis registers regardless of A; the
kinematic rotation must <b>not</b> be folded into the chain.
Real <a class="xref" href="Hi.Numerical.Xyzabc.XyzabcSolver.html">XyzabcSolver</a> dep is wired in so the guard is
what stops the write (not the dep-guard at the top of
<code>Build</code>):
#BeforeBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "A": 45 } }</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{ "MachineCoordinateState": { "A": 45 } }</code></pre>
Active RTCP signalled by a pre-existing Dynamic chain entry (as
<a class="xref" href="Hi.NcParsers.LogicSyntaxs.G43p4RtcpSyntax.html">G43p4RtcpSyntax</a> would have written when RTCP is
active and ABC changes across the block).
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_HasDynamicEntry_System_Text_Json_Nodes_JsonObject_">HasDynamicEntry(JsonObject)</a> returns true, so
the guard passes and the PivotTransform entry is written and
tagged <a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_KindDynamic">KindDynamic</a>. The
<code>TestDeps.Kinematics</code> stub makes
<a class="xref" href="Hi.NcParsers.Syntaxs.TransformationUtil.html#Hi_NcParsers_Syntaxs_TransformationUtil_MakePivotTransformMat_Hi_Numerical_Xyzabc_IMachineKinematics_Hi_Geom_Vec3d_">MakePivotTransformMat(IMachineKinematics, Vec3d)</a> collapse to
identity:
#BeforeBuild:
<pre><code class="lang-csharp">{
"ProgramToMcTransform": [
{
"Source": "ToolHeightCompensation",
"Kind": "Dynamic",
"Mat4d": [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
}
]
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"ProgramToMcTransform": [
{
"Source": "ToolHeightCompensation",
"Kind": "Dynamic",
"Mat4d": [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
},
{
"Source": "PivotTransform",
"Kind": "Dynamic",
"Mat4d": [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
}
]
}</code></pre>
Active G68.2 tilted plane — the current block carries the modal
<a class="xref" href="Hi.NcParsers.Keywords.TiltTransform.html">TiltTransform</a> snapshot plus an existing Static
TiltTransform chain entry (as <a class="xref" href="Hi.NcParsers.LogicSyntaxs.IsoG68p2TiltSyntax.html">IsoG68p2TiltSyntax</a>
would have written) and <code>MachineCoordinateState.A = 45</code>. The
guard reads <code>TiltTransform.Term = "G68.2"</code> and passes; with
real <a class="xref" href="Hi.Numerical.Xyzabc.XyzabcSolver.html">XyzabcSolver</a> kinematics (table-A / head-B
5-axis), <code>MakePivotTransformMat</code> at <code>abc = (π/4, 0, 0)</code>
produces the table-A Rx(45°) rigid matrix. No Dynamic entries in
the chain so the new entry stays Static:
#BeforeBuild:
<pre><code class="lang-csharp">{
"TiltTransform": { "Term": "G68.2", "X": 0, "Y": 0, "Z": 0, "I": 0, "J": 30, "K": 0 },
"ProgramToMcTransform": [
{
"Source": "TiltTransform",
"Kind": "Static",
"Mat4d": [
1, 0, 0, 0,
0, 0.8660254037844387, 0.49999999999999994, 0,
0, -0.49999999999999994, 0.8660254037844387, 0,
0, 0, 0, 1
]
}
],
"MachineCoordinateState": { "A": 45 }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"TiltTransform": { "Term": "G68.2", "X": 0, "Y": 0, "Z": 0, "I": 0, "J": 30, "K": 0 },
"ProgramToMcTransform": [
{
"Source": "TiltTransform",
"Kind": "Static",
"Mat4d": [
1, 0, 0, 0,
0, 0.8660254037844387, 0.49999999999999994, 0,
0, -0.49999999999999994, 0.8660254037844387, 0,
0, 0, 0, 1
]
},
{
"Source": "PivotTransform",
"Kind": "Static",
"Mat4d": [
1, 0, 0, 0,
0, 0.7071067811865475, -0.7071067811865475, 0,
0, 0.7071067811865475, 0.7071067811865475, 0,
0, 0, 0, 1
]
}
],
"MachineCoordinateState": { "A": 45 }
}</code></pre>
<p>
Active G68.2 across a rotary word — the feature frame stays pinned
in machine space (<a class="xref" href="Hi.NcParsers.LogicSyntaxs.PivotTransformUtil.html#Hi_NcParsers_LogicSyntaxs_PivotTransformUtil_PinTiltInMachineSpaceAcrossRotaryWords_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__System_Text_Json_Nodes_JsonObject_System_Collections_Generic_List_Hi_NcParsers_Dependencys_INcDependency__">PinTiltInMachineSpaceAcrossRotaryWords(LazyLinkedListNode&lt;SyntaxPiece&gt;, JsonObject, List&lt;INcDependency&gt;)</a>).
<code>#Previous:</code> had the tilt Rx(30°) composed with the pivot at
table-A = 0 (identity on this chain); the current block spoke
<code>A45.</code> (one-shot <code>RotaryWords</code>, root MC A = 45) and
arrived with the carried Rx(30°) tilt. The tilt entry is rewritten to
<code>Tilt·Pivot(prev)·Pivot(cur)⁻¹</code> = Rx(30°)·Rx(45°) = Rx(75°) —
so that composed with the new pivot Rx(−45°) the chain still maps the
feature frame exactly where the previous block had it — and the
pivot entry is written for A = 45 as in the case above. No tool
height entry is present, so nothing else is re-aimed:
</p>
#Previous:
<pre><code class="lang-csharp">{
"TiltTransform": { "Term": "G68.2" },
"ProgramToMcTransform": [
{
"Source": "TiltTransform",
"Kind": "Static",
"Mat4d": [
1, 0, 0, 0,
0, 0.8660254037844387, 0.49999999999999994, 0,
0, -0.49999999999999994, 0.8660254037844387, 0,
0, 0, 0, 1
]
},
{
"Source": "PivotTransform",
"Kind": "Static",
"Mat4d": [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
}
],
"MachineCoordinateState": { "X": 0, "Y": 0, "Z": 0, "A": 0, "B": 0 }
}</code></pre>
#BeforeBuild:
<pre><code class="lang-csharp">{
"TiltTransform": { "Term": "G68.2" },
"ProgramToMcTransform": [
{
"Source": "TiltTransform",
"Kind": "Static",
"Mat4d": [
1, 0, 0, 0,
0, 0.8660254037844387, 0.49999999999999994, 0,
0, -0.49999999999999994, 0.8660254037844387, 0,
0, 0, 0, 1
]
}
],
"MachineCoordinateState": { "A": 45, "B": 0 },
"RotaryWords": { "A": 45 }
}</code></pre>
#AfterBuild:
<pre><code class="lang-csharp">{
"TiltTransform": { "Term": "G68.2" },
"ProgramToMcTransform": [
{
"Source": "TiltTransform",
"Kind": "Static",
"Mat4d": [
1, 0, 0, 0,
0, 0.25881904510252085, 0.9659258262890683, 0,
0, -0.9659258262890683, 0.25881904510252085, 0,
0, 0, 0, 1
]
},
{
"Source": "PivotTransform",
"Kind": "Static",
"Mat4d": [
1, 0, 0, 0,
0, 0.7071067811865475, -0.7071067811865475, 0,
0, 0.7071067811865475, 0.7071067811865475, 0,
0, 0, 0, 1
]
}
],
"MachineCoordinateState": { "A": 45, "B": 0 },
"RotaryWords": { "A": 45 }
}</code></pre>
<h2 class="section" id="constructors">Constructors
</h2>
<a id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax__ctor_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.#ctor*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax__ctor" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.#ctor">
PivotTransformationSyntax()
</h3>
<div class="markdown level1 summary"><p>Initializes a new instance with default settings.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public PivotTransformationSyntax()</code></pre>
</div>
<a id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax__ctor_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.#ctor*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax__ctor_System_Xml_Linq_XElement_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.#ctor(System.Xml.Linq.XElement)">
PivotTransformationSyntax(XElement)
</h3>
<div class="markdown level1 summary"><p>Initializes a new instance by deserializing from the given XML element.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public PivotTransformationSyntax(XElement src)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>src</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.xml.linq.xelement">XElement</a></dt>
<dd><p>Source XML element.</p>
</dd>
</dl>
<h2 class="section" id="properties">Properties
</h2>
<a id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_Name_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.Name*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_Name" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.Name">
Name
</h3>
<div class="markdown level1 summary"><p>Syntax kind name (typically the concrete type name).</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public string Name { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_XName_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.XName*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_XName" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.XName">
XName
</h3>
<div class="markdown level1 summary"><p>XML element name used to register this syntax with <a class="xref" href="Hi.Common.XmlUtils.XFactory.html">XFactory</a>.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static string XName { get; }</code></pre>
</div>
<h4 class="section">Property Value</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd></dd>
</dl>
<h2 class="section" id="methods">Methods
</h2>
<a id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_Build_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.Build*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_Build_Hi_Common_Collections_LazyLinkedListNode_Hi_NcParsers_Syntaxs_SyntaxPiece__System_Collections_Generic_List_Hi_NcParsers_Dependencys_INcDependency__Hi_NcParsers_NcDiagnosticProgress_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.Build(Hi.Common.Collections.LazyLinkedListNode{Hi.NcParsers.Syntaxs.SyntaxPiece},System.Collections.Generic.List{Hi.NcParsers.Dependencys.INcDependency},Hi.NcParsers.NcDiagnosticProgress)">
Build(LazyLinkedListNode&lt;SyntaxPiece&gt;, List&lt;INcDependency&gt;, NcDiagnosticProgress)
</h3>
<div class="markdown level1 summary"><p>Build syntax arrangement into the
<code class="paramref">syntaxPieceNode</code> in-place.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public void Build(LazyLinkedListNode&lt;SyntaxPiece&gt; syntaxPieceNode, List&lt;INcDependency&gt; ncDependencyList, NcDiagnosticProgress ncDiagnosticProgress)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>syntaxPieceNode</code> <a class="xref" href="Hi.Common.Collections.LazyLinkedListNode-1.html">LazyLinkedListNode</a>&lt;<a class="xref" href="Hi.NcParsers.Syntaxs.SyntaxPiece.html">SyntaxPiece</a>&gt;</dt>
<dd></dd>
<dt><code>ncDependencyList</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1">List</a>&lt;<a class="xref" href="Hi.NcParsers.Dependencys.INcDependency.html">INcDependency</a>&gt;</dt>
<dd></dd>
<dt><code>ncDiagnosticProgress</code> <a class="xref" href="Hi.NcParsers.NcDiagnosticProgress.html">NcDiagnosticProgress</a></dt>
<dd></dd>
</dl>
<a id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_MakeXmlSource_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.MakeXmlSource*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_MakeXmlSource_System_String_System_String_System_Boolean_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.MakeXmlSource(System.String,System.String,System.Boolean)">
MakeXmlSource(string, string, bool)
</h3>
<div class="markdown level1 summary"><p>Creates an XML representation of the object.
This method may also generate additional resources such as related files.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public XElement MakeXmlSource(string baseDirectory, string relFile, bool exhibitionOnly)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>baseDirectory</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>The base directory for resolving relative paths</p>
</dd>
<dt><code>relFile</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.string">string</a></dt>
<dd><p>The relative file path for the XML source</p>
</dd>
<dt><code>exhibitionOnly</code> <a class="xref" href="https://learn.microsoft.com/dotnet/api/system.boolean">bool</a></dt>
<dd><p>if true, the extended file creation is suppressed.</p>
</dd>
</dl>
<h4 class="section">Returns</h4>
<dl class="parameters">
<dt><a class="xref" href="https://learn.microsoft.com/dotnet/api/system.xml.linq.xelement">XElement</a></dt>
<dd><p>An XML element representing the object's state</p>
</dd>
</dl>
<h4 class="section" id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_MakeXmlSource_System_String_System_String_System_Boolean__remarks">Remarks</h4>
<div class="markdown level1 remarks"><p>For the demand of easy moving source folder (especially project folder) without configuration file path corruption, the relative file path is applied.
The <code class="paramref">baseDirectory</code> is typically the folder at the nearest configuration file folder.
Since the folder can be moving with the configuration file.</p>
</div>
<a id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_Reg_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.Reg*"></a>
<h3 id="Hi_NcParsers_LogicSyntaxs_PivotTransformationSyntax_Reg_Hi_Common_XmlUtils_XFactory_" data-uid="Hi.NcParsers.LogicSyntaxs.PivotTransformationSyntax.Reg(Hi.Common.XmlUtils.XFactory)">
Reg(XFactory)
</h3>
<div class="markdown level1 summary"><p>Registers this type's deserializer with the given <a class="xref" href="Hi.Common.XmlUtils.XFactory.html">XFactory</a>
(or <a class="xref" href="Hi.Common.XmlUtils.XFactory.html#Hi_Common_XmlUtils_XFactory_Default">Default</a> when <code class="paramref">factory</code> is
<code>null</code>). Idempotent.</p>
</div>
<div class="markdown level1 conceptual"></div>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public static void Reg(XFactory factory = null)</code></pre>
</div>
<h4 class="section">Parameters</h4>
<dl class="parameters">
<dt><code>factory</code> <a class="xref" href="Hi.Common.XmlUtils.XFactory.html">XFactory</a></dt>
<dd></dd>
</dl>
</article>
<div class="contribution d-print-none">
</div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>