← Commit history

Component record for rc0402fr-0733kl: files batch 1

John Lauer ·dea64e14ff ·17h ago ·parent ee46dcb
56 files changed +4514−2
LICENSE+15RC0402FR-0733KL.adom-lbr.json+219RC0402FR-0733KL.kicad_sym+23RC0402FR-0733KL.lbr+110RC0402FR-0733KL.step+1049README.md+167−2R_0402_1005Metric_RC0402FR-0733KL.kicad_mod+112altium/RC0402FR-0733KL.PcbLibaltium/RC0402FR-0733KL.SchLibdocs/figures/figures.json+93docs/figures/mount-p04-land.pngdocs/figures/rc-p03-marking.pngdocs/figures/rc-p04-dimensions.pngdocs/figures/rc-p05-table2.pngdocs/figures/rc-p07-packing.pngdocs/figures/rc-p07-power-voltage.pngdocs/figures/rc-p09-short-time-overload.pngdocs/hero.pngdocs/models/package-reference-step.pngdocs/models/step-plain.pngdocs/rc0402fr-0733kl-datasheet.pdfdocs/verify/hero-preview.pngdocs/verify/rc0402fr-0733kl-check.json+51docs/verify/rc0402fr-0733kl-overlay.pngdocs/yageo-chip-resistors-mounting-v10.pdfland-pattern/README.md+33land-pattern/land-check.json+45land-pattern/land-pattern-icon.pngland-pattern/land-pattern.pnglod/high.glblod/high.pnglod/low.glblod/low.pnglod/manifest.json+178lod/medium.glblod/medium.pnglod/super-low.glblod/super-low.pngmodels.json+146package-reference.glbpackage.json+10provenance.json+307provenance/tools/build.py+161provenance/tools/etch.py+35provenance/tools/figures.py+28provenance/tools/finish.py+49provenance/tools/landcheck.py+116provenance/tools/lod.py+199provenance/tools/ortho.py+123provenance/tools/overlay_chip.py+159provenance/tools/parts.py+125provenance/tools/rc0402fr-0733kl-overlay-spec.json+39provenance/tools/records.py+467rc0402fr-0733kl-hero.glbrc0402fr-0733kl-hero.overlay.json+125verification.json+330
LICENSEadded+15
@@ -0,0 +1,15 @@+RC0402FR-0733KL component page++Original Adom content on this page (README text, the KiCad symbol RC0402FR-0733KL.kicad_sym, the+verification drawings, the JSON records and the scripts in provenance/tools/)+is licensed under the Creative Commons Attribution 4.0 International License+(CC-BY-4.0): https://creativecommons.org/licenses/by/4.0/++Third-party files keep their own terms and are not relicensed by this page:+- R_0402_1005Metric_RC0402FR-0733KL.kicad_mod and RC0402FR-0733KL.step (and every model derived from it: package-reference.glb,+  rc0402fr-0733kl-hero.glb, lod/*.glb) are KiCad library content, CC-BY-SA 4.0 with the KiCad+  library exception (https://gitlab.com/kicad/libraries/kicad-footprints, https://gitlab.com/kicad/libraries/kicad-packages3D).+  The footprint geometry inside RC0402FR-0733KL.lbr and altium/RC0402FR-0733KL.PcbLib comes from the+  same KiCad footprint and keeps that license.+- The PDFs in docs/ and the page crops in docs/figures/ are YAGEO documents,+  copyright of their publisher, included unchanged (or cropped) for reference.
RC0402FR-0733KL.adom-lbr.jsonadded+219
@@ -0,0 +1,219 @@+{+  "schema_version": 2,+  "mpn": "RC0402FR-0733KL",+  "manufacturer": "YAGEO",+  "package": "",+  "value": "",+  "category": "",+  "symbol": {+    "name": "RC0402FR-0733KL",+    "pins": [+      {+        "number": "1",+        "name": "",+        "x": 0,+        "y": 200,+        "length": 100,+        "rotation": 270,+        "electrical_type": "passive"+      },+      {+        "number": "2",+        "name": "",+        "x": 0,+        "y": -200,+        "length": 100,+        "rotation": 90,+        "electrical_type": "passive"+      }+    ],+    "body": null,+    "graphics": [+      {+        "kind": "rect",+        "x1": -40.0,+        "y1": -100.0,+        "x2": 40.0,+        "y2": 100.0,+        "width": 10.0,+        "filled": false,+        "fill_style": "none"+      }+    ],+    "designator_prefix": "R",+    "footprint": "R_0402_1005Metric_RC0402FR-0733KL",+    "parameters": [+      {+        "name": "Value",+        "value": "33k",+        "visible": true+      },+      {+        "name": "Datasheet",+        "value": "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L",+        "visible": false+      },+      {+        "name": "Description",+        "value": "Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)",+        "visible": false+      },+      {+        "name": "MPN",+        "value": "RC0402FR-0733KL",+        "visible": false+      },+      {+        "name": "Manufacturer",+        "value": "YAGEO",+        "visible": false+      },+      {+        "name": "Mouser",+        "value": "603-RC0402FR-0733KL",+        "visible": false+      },+      {+        "name": "DigiKey",+        "value": "311-33.0KLRTR-ND",+        "visible": false+      },+      {+        "name": "LCSC",+        "value": "C138003",+        "visible": false+      },+      {+        "name": "Adom Wiki",+        "value": "https://wiki.adom.inc/adom/rc0402fr-0733kl",+        "visible": false+      },+      {+        "name": "ki_keywords",+        "value": "resistor 0402 RC0402FR-0733KL",+        "visible": false+      },+      {+        "name": "Supplier 1",+        "value": "Mouser",+        "visible": false+      },+      {+        "name": "Supplier Part Number 1",+        "value": "603-RC0402FR-0733KL",+        "visible": false+      },+      {+        "name": "Supplier 2",+        "value": "Digi-Key",+        "visible": false+      },+      {+        "name": "Supplier Part Number 2",+        "value": "311-33.0KLRTR-ND",+        "visible": false+      },+      {+        "name": "Supplier 3",+        "value": "LCSC",+        "visible": false+      },+      {+        "name": "Supplier Part Number 3",+        "value": "C138003",+        "visible": false+      },+      {+        "name": "Manufacturer Part Number",+        "value": "RC0402FR-0733KL",+        "visible": false+      }+    ],+    "pin_numbers_hidden": true,+    "pin_names_hidden": true+  },+  "footprint": {+    "name": "R_0402_1005Metric_RC0402FR-0733KL",+    "pads": [+      {+        "number": "1",+        "x_mm": -0.51,+        "y_mm": 0.0,+        "w_mm": 0.54,+        "h_mm": 0.64,+        "drill_mm": 0.0,+        "rotation": 0.0,+        "shape": "roundrect"+      },+      {+        "number": "2",+        "x_mm": 0.51,+        "y_mm": 0.0,+        "w_mm": 0.54,+        "h_mm": 0.64,+        "drill_mm": 0.0,+        "rotation": 0.0,+        "shape": "roundrect"+      }+    ],+    "graphics": [+      {+        "kind": "line",+        "layer": {+          "role": "silk"+        },+        "x1": -0.153641,+        "y1": -0.38,+        "x2": 0.153641,+        "y2": -0.38,+        "width": 0.12+      },+      {+        "kind": "line",+        "layer": {+          "role": "silk"+        },+        "x1": -0.153641,+        "y1": 0.38,+        "x2": 0.153641,+        "y2": 0.38,+        "width": 0.12+      },+      {+        "kind": "rect",+        "layer": {+          "role": "courtyard"+        },+        "x1": -0.93,+        "y1": -0.47,+        "x2": 0.93,+        "y2": 0.47,+        "width": 0.05+      },+      {+        "kind": "rect",+        "layer": {+          "role": "fab"+        },+        "x1": -0.525,+        "y1": -0.27,+        "x2": 0.525,+        "y2": 0.27,+        "width": 0.1+      }+    ]+  },+  "connect": [+    {+      "pin": "1",+      "pad": "1"+    },+    {+      "pin": "2",+      "pad": "2"+    }+  ],+  "provenance": {+    "source": "kicad_import"+  }+}\ No newline at end of file
RC0402FR-0733KL.kicad_symadded+23
@@ -0,0 +1,23 @@+(kicad_symbol_lib (version 20241209) (generator "adom_passive_symbol")+  (symbol "RC0402FR-0733KL" (pin_numbers (hide yes)) (pin_names (offset 0.254) (hide yes)) (exclude_from_sim no) (in_bom yes) (on_board yes)+    (property "Reference" "R" (at 2.54 1.27 0) (effects (font (size 1.27 1.27)) (justify left)))+    (property "Value" "33k" (at 2.54 -1.27 0) (effects (font (size 1.27 1.27)) (justify left)))+    (property "Footprint" "R_0402_1005Metric_RC0402FR-0733KL" (at 0 -7.62 0) (effects (font (size 1.27 1.27)) hide))+    (property "Datasheet" "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L" (at 0 -10.16 0) (effects (font (size 1.27 1.27)) hide))+    (property "Description" "Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)" (at 0 -12.7 0) (effects (font (size 1.27 1.27)) hide))+    (property "MPN" "RC0402FR-0733KL" (at 0 -15.24 0) (effects (font (size 1.27 1.27)) hide))+    (property "Manufacturer" "YAGEO" (at 0 -17.78 0) (effects (font (size 1.27 1.27)) hide))+    (property "Mouser" "603-RC0402FR-0733KL" (at 0 -20.32 0) (effects (font (size 1.27 1.27)) hide))+    (property "DigiKey" "311-33.0KLRTR-ND" (at 0 -22.86 0) (effects (font (size 1.27 1.27)) hide))+    (property "LCSC" "C138003" (at 0 -25.4 0) (effects (font (size 1.27 1.27)) hide))+    (property "Adom Wiki" "https://wiki.adom.inc/adom/rc0402fr-0733kl" (at 0 -27.94 0) (effects (font (size 1.27 1.27)) hide))+    (property "ki_keywords" "resistor 0402 RC0402FR-0733KL" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))+    (symbol "RC0402FR-0733KL_0_1"+      (rectangle (start -1.016 -2.54) (end 1.016 2.54) (stroke (width 0.254) (type default)) (fill (type none)))+    )+    (symbol "RC0402FR-0733KL_1_1"+      (pin passive line (at 0 5.08 270) (length 2.54) (name "~" (effects (font (size 1.27 1.27)))) (number "1" (effects (font (size 1.27 1.27)))))+      (pin passive line (at 0 -5.08 90) (length 2.54) (name "~" (effects (font (size 1.27 1.27)))) (number "2" (effects (font (size 1.27 1.27)))))+    )+  )+)
RC0402FR-0733KL.lbradded+110
@@ -0,0 +1,110 @@+<?xml version="1.0" encoding="utf-8"?>+<!DOCTYPE eagle SYSTEM "eagle.dtd">+<eagle version="9.6.2">+<drawing>+<settings><setting alwaysvectorfont="no"/></settings>+<grid distance="0.1" unitdist="inch" unit="inch" style="lines" multiple="1" display="no" altdistance="0.01" altunitdist="inch" altunit="inch"/>+<layers>+<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>+<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>+<layer number="17" name="Pads" color="2" fill="1" visible="yes" active="yes"/>+<layer number="18" name="Vias" color="2" fill="1" visible="yes" active="yes"/>+<layer number="19" name="Unrouted" color="6" fill="1" visible="yes" active="yes"/>+<layer number="20" name="Dimension" color="15" fill="1" visible="yes" active="yes"/>+<layer number="21" name="tPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="22" name="bPlace" color="7" fill="1" visible="yes" active="yes"/>+<layer number="23" name="tOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="24" name="bOrigins" color="15" fill="1" visible="yes" active="yes"/>+<layer number="25" name="tNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="26" name="bNames" color="7" fill="1" visible="yes" active="yes"/>+<layer number="27" name="tValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="28" name="bValues" color="7" fill="1" visible="yes" active="yes"/>+<layer number="29" name="tStop" color="7" fill="3" visible="no" active="yes"/>+<layer number="30" name="bStop" color="7" fill="6" visible="no" active="yes"/>+<layer number="31" name="tCream" color="7" fill="4" visible="no" active="yes"/>+<layer number="32" name="bCream" color="7" fill="5" visible="no" active="yes"/>+<layer number="33" name="tFinish" color="6" fill="3" visible="no" active="yes"/>+<layer number="34" name="bFinish" color="6" fill="6" visible="no" active="yes"/>+<layer number="35" name="tGlue" color="7" fill="4" visible="no" active="yes"/>+<layer number="36" name="bGlue" color="7" fill="5" visible="no" active="yes"/>+<layer number="37" name="tTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="38" name="bTest" color="7" fill="1" visible="no" active="yes"/>+<layer number="39" name="tKeepout" color="4" fill="11" visible="no" active="yes"/>+<layer number="40" name="bKeepout" color="1" fill="11" visible="no" active="yes"/>+<layer number="41" name="tRestrict" color="4" fill="10" visible="no" active="yes"/>+<layer number="42" name="bRestrict" color="1" fill="10" visible="no" active="yes"/>+<layer number="43" name="vRestrict" color="2" fill="10" visible="no" active="yes"/>+<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>+<layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes"/>+<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>+<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>+<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>+<layer number="49" name="Reference" color="7" fill="1" visible="yes" active="yes"/>+<layer number="91" name="Nets" color="2" fill="1" visible="yes" active="yes"/>+<layer number="92" name="Busses" color="1" fill="1" visible="yes" active="yes"/>+<layer number="93" name="Pins" color="2" fill="1" visible="no" active="yes"/>+<layer number="94" name="Symbols" color="4" fill="1" visible="yes" active="yes"/>+<layer number="95" name="Names" color="7" fill="1" visible="yes" active="yes"/>+<layer number="96" name="Values" color="7" fill="1" visible="yes" active="yes"/>+<layer number="97" name="Info" color="7" fill="1" visible="yes" active="yes"/>+<layer number="98" name="Guide" color="6" fill="1" visible="yes" active="yes"/>+</layers>+<library>+<description>Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)</description>+<packages>+<package name="R_0402_1005Metric_RC0402FR-0733KL">+  <description>2 pads, 1.6 x 0.6 mm. Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal</description>+  <smd name="1" x="-0.5100" y="-0.0000" dx="0.5400" dy="0.6400" layer="1" roundness="50"/>+  <smd name="2" x="0.5100" y="-0.0000" dx="0.5400" dy="0.6400" layer="1" roundness="50"/>+  <wire x1="-0.5250" y1="0.2700" x2="0.5250" y2="0.2700" width="0.1000" layer="51"/>+  <wire x1="0.5250" y1="0.2700" x2="0.5250" y2="-0.2700" width="0.1000" layer="51"/>+  <wire x1="0.5250" y1="-0.2700" x2="-0.5250" y2="-0.2700" width="0.1000" layer="51"/>+  <wire x1="-0.5250" y1="-0.2700" x2="-0.5250" y2="0.2700" width="0.1000" layer="51"/>+  <wire x1="-0.1536" y1="0.3800" x2="0.1536" y2="0.3800" width="0.1200" layer="21"/>+  <wire x1="-0.1536" y1="-0.3800" x2="0.1536" y2="-0.3800" width="0.1200" layer="21"/>+  <text x="0" y="0.980" size="1.27" layer="25" align="bottom-center">&gt;NAME</text>+  <text x="0" y="-0.980" size="1.27" layer="27" align="top-center">&gt;VALUE</text>+</package>+</packages>+<symbols>+<symbol name="RC0402FR-0733KL">+  <description>Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)</description>+  <wire x1="-7.62" y1="5.08" x2="7.62" y2="5.08" width="0.254" layer="94"/>+  <wire x1="7.62" y1="5.08" x2="7.62" y2="-2.54" width="0.254" layer="94"/>+  <wire x1="7.62" y1="-2.54" x2="-7.62" y2="-2.54" width="0.254" layer="94"/>+  <wire x1="-7.62" y1="-2.54" x2="-7.62" y2="5.08" width="0.254" layer="94"/>+  <text x="2.5400" y="1.2700" size="1.27" layer="95" align="center">&gt;NAME</text>+  <text x="2.5400" y="-1.2700" size="1.27" layer="96" align="center">&gt;VALUE</text>+  <pin name="1" x="-12.7" y="2.54" length="middle" direction="pas"/>+  <pin name="2" x="-12.7" y="0" length="middle" direction="pas"/>+</symbol>+</symbols>+<devicesets>+<deviceset name="RC0402FR-0733KL" prefix="R">+  <description>Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)</description>+  <gates>+    <gate name="G$1" symbol="RC0402FR-0733KL" x="0" y="0"/>+  </gates>+  <devices>+    <device name="" package="R_0402_1005Metric_RC0402FR-0733KL">+      <connects>+        <connect gate="G$1" pin="1" pad="1"/>+        <connect gate="G$1" pin="2" pad="2"/>+      </connects>+      <technologies>+        <technology name="">+          <attribute name="MPN" value="RC0402FR-0733KL" constant="no"/>+          <attribute name="MANUFACTURER" value="YAGEO" constant="no"/>+          <attribute name="ADOM_WIKI" value="https://wiki.adom.inc/adom/rc0402fr-0733kl" constant="no"/>+          <attribute name="MOUSER_PN" value="603-RC0402FR-0733KL" constant="no"/>+          <attribute name="DIGIKEY_PN" value="311-33.0KLRTR-ND" constant="no"/>+          <attribute name="LCSC_PN" value="C138003" constant="no"/>+        </technology>+      </technologies>+    </device>+  </devices>+</deviceset>+</devicesets>+</library>+</drawing>+</eagle>\ No newline at end of file
RC0402FR-0733KL.stepadded+1049
@@ -0,0 +1,1049 @@+ISO-10303-21;+HEADER;+/* R_0402_1005Metric.step 3D STEP model for use in ECAD systems+ * Copyright (C) 2018, kicad StepUp+ * + * This work is licensed under the [Creative Commons CC-BY-SA 4.0 License](https://creativecommons.org/licenses/by-sa/4.0/legalcode), + * with the following exception:+ * To the extent that the creation of electronic designs that use 'Licensed Material' can be considered to be 'Adapted Material', + * then the copyright holder waives article 3 of the license with respect to these designs and any generated files which use data provided + * as part of the 'Licensed Material'.+ * You are free to use the library data in your own projects without the obligation to share your project files under this or any other license agreement.+ * However, if you wish to redistribute these libraries, or parts thereof (including in modified form) as a collection then the exception above does not apply. + * Please refer to https://github.com/KiCad/kicad-packages3D/blob/master/LICENSE.md for further clarification of the exception.+ * Disclaimer of Warranties and Limitation of Liability.+ * These libraries are provided in the hope that they will be useful, but are provided without warranty of any kind, express or implied.+ * *USE 3D CAD DATA AT YOUR OWN RISK*+ * *DO NOT RELY UPON ANY INFORMATION FOUND HERE WITHOUT INDEPENDENT VERIFICATION.*+ * + */++FILE_DESCRIPTION(+/* description */ ('model of R_0402_1005Metric'),+/* implementation_level */ '2;1');++FILE_NAME(+/* name */ 'R_0402_1005Metric.step',+/* time_stamp */ '2018-01-04T00:45:35',+/* author */ ('kicad StepUp','ksu'),+/* organization */ ('FreeCAD'),+/* preprocessor_version */ 'OCC',+/* originating_system */ 'kicad StepUp',+/* authorisation */ '');++FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));+ENDSEC;++DATA;+#1 = APPLICATION_PROTOCOL_DEFINITION('international standard',+'automotive_design',2000,#2);+#2 = APPLICATION_CONTEXT(+'core data for automotive mechanical design processes');+#3 = SHAPE_DEFINITION_REPRESENTATION(#4,#10);+#4 = PRODUCT_DEFINITION_SHAPE('','',#5);+#5 = PRODUCT_DEFINITION('design','',#6,#9);+#6 = PRODUCT_DEFINITION_FORMATION('','',#7);+#7 = PRODUCT('R_0402_1005Metric','R_0402_1005Metric','',(#8));+#8 = PRODUCT_CONTEXT('',#2,'mechanical');+#9 = PRODUCT_DEFINITION_CONTEXT('part definition',#2,'design');+#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('',(#11,#15),#805);+#11 = AXIS2_PLACEMENT_3D('',#12,#13,#14);+#12 = CARTESIAN_POINT('',(0.,0.,0.));+#13 = DIRECTION('',(0.,0.,1.));+#14 = DIRECTION('',(1.,0.,-0.));+#15 = MANIFOLD_SOLID_BREP('',#16);+#16 = CLOSED_SHELL('',(#17,#57,#140,#165,#190,#257,#274,#291,#340,#357,+#374,#423,#440,#509,#540,#564,#633,#657,#674,#691,#708,#725,#742,+#759,#776,#793));+#17 = ADVANCED_FACE('',(#18),#52,.F.);+#18 = FACE_BOUND('',#19,.F.);+#19 = EDGE_LOOP('',(#20,#30,#38,#46));+#20 = ORIENTED_EDGE('',*,*,#21,.F.);+#21 = EDGE_CURVE('',#22,#24,#26,.T.);+#22 = VERTEX_POINT('',#23);+#23 = CARTESIAN_POINT('',(-0.5,-0.25,3.5E-02));+#24 = VERTEX_POINT('',#25);+#25 = CARTESIAN_POINT('',(-0.5,-0.25,0.315));+#26 = LINE('',#27,#28);+#27 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#28 = VECTOR('',#29,1.);+#29 = DIRECTION('',(0.,0.,1.));+#30 = ORIENTED_EDGE('',*,*,#31,.T.);+#31 = EDGE_CURVE('',#22,#32,#34,.T.);+#32 = VERTEX_POINT('',#33);+#33 = CARTESIAN_POINT('',(-0.5,0.25,3.5E-02));+#34 = LINE('',#35,#36);+#35 = CARTESIAN_POINT('',(-0.5,-0.25,3.5E-02));+#36 = VECTOR('',#37,1.);+#37 = DIRECTION('',(0.,1.,0.));+#38 = ORIENTED_EDGE('',*,*,#39,.T.);+#39 = EDGE_CURVE('',#32,#40,#42,.T.);+#40 = VERTEX_POINT('',#41);+#41 = CARTESIAN_POINT('',(-0.5,0.25,0.315));+#42 = LINE('',#43,#44);+#43 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#44 = VECTOR('',#45,1.);+#45 = DIRECTION('',(0.,0.,1.));+#46 = ORIENTED_EDGE('',*,*,#47,.F.);+#47 = EDGE_CURVE('',#24,#40,#48,.T.);+#48 = LINE('',#49,#50);+#49 = CARTESIAN_POINT('',(-0.5,-0.25,0.315));+#50 = VECTOR('',#51,1.);+#51 = DIRECTION('',(0.,1.,0.));+#52 = PLANE('',#53);+#53 = AXIS2_PLACEMENT_3D('',#54,#55,#56);+#54 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#55 = DIRECTION('',(1.,0.,0.));+#56 = DIRECTION('',(0.,0.,1.));+#57 = ADVANCED_FACE('',(#58),#135,.F.);+#58 = FACE_BOUND('',#59,.F.);+#59 = EDGE_LOOP('',(#60,#70,#77,#78,#87,#95,#104,#112,#120,#128));+#60 = ORIENTED_EDGE('',*,*,#61,.F.);+#61 = EDGE_CURVE('',#62,#64,#66,.T.);+#62 = VERTEX_POINT('',#63);+#63 = CARTESIAN_POINT('',(-0.465,-0.25,-2.775557561563E-17));+#64 = VERTEX_POINT('',#65);+#65 = CARTESIAN_POINT('',(-0.335,-0.25,-2.775557561563E-17));+#66 = LINE('',#67,#68);+#67 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#68 = VECTOR('',#69,1.);+#69 = DIRECTION('',(1.,0.,0.));+#70 = ORIENTED_EDGE('',*,*,#71,.F.);+#71 = EDGE_CURVE('',#22,#62,#72,.T.);+#72 = CIRCLE('',#73,3.5E-02);+#73 = AXIS2_PLACEMENT_3D('',#74,#75,#76);+#74 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#75 = DIRECTION('',(0.,-1.,0.));+#76 = DIRECTION('',(0.,0.,1.));+#77 = ORIENTED_EDGE('',*,*,#21,.T.);+#78 = ORIENTED_EDGE('',*,*,#79,.T.);+#79 = EDGE_CURVE('',#24,#80,#82,.T.);+#80 = VERTEX_POINT('',#81);+#81 = CARTESIAN_POINT('',(-0.465,-0.25,0.35));+#82 = CIRCLE('',#83,3.5E-02);+#83 = AXIS2_PLACEMENT_3D('',#84,#85,#86);+#84 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#85 = DIRECTION('',(0.,1.,0.));+#86 = DIRECTION('',(0.,0.,1.));+#87 = ORIENTED_EDGE('',*,*,#88,.T.);+#88 = EDGE_CURVE('',#80,#89,#91,.T.);+#89 = VERTEX_POINT('',#90);+#90 = CARTESIAN_POINT('',(-0.335,-0.25,0.35));+#91 = LINE('',#92,#93);+#92 = CARTESIAN_POINT('',(-0.5,-0.25,0.35));+#93 = VECTOR('',#94,1.);+#94 = DIRECTION('',(1.,0.,0.));+#95 = ORIENTED_EDGE('',*,*,#96,.F.);+#96 = EDGE_CURVE('',#97,#89,#99,.T.);+#97 = VERTEX_POINT('',#98);+#98 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#99 = CIRCLE('',#100,3.5E-02);+#100 = AXIS2_PLACEMENT_3D('',#101,#102,#103);+#101 = CARTESIAN_POINT('',(-0.335,-0.25,0.315));+#102 = DIRECTION('',(0.,-1.,0.));+#103 = DIRECTION('',(0.,0.,1.));+#104 = ORIENTED_EDGE('',*,*,#105,.F.);+#105 = EDGE_CURVE('',#106,#97,#108,.T.);+#106 = VERTEX_POINT('',#107);+#107 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#108 = LINE('',#109,#110);+#109 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#110 = VECTOR('',#111,1.);+#111 = DIRECTION('',(1.,0.,0.));+#112 = ORIENTED_EDGE('',*,*,#113,.F.);+#113 = EDGE_CURVE('',#114,#106,#116,.T.);+#114 = VERTEX_POINT('',#115);+#115 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#116 = LINE('',#117,#118);+#117 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#118 = VECTOR('',#119,1.);+#119 = DIRECTION('',(0.,0.,1.));+#120 = ORIENTED_EDGE('',*,*,#121,.T.);+#121 = EDGE_CURVE('',#114,#122,#124,.T.);+#122 = VERTEX_POINT('',#123);+#123 = CARTESIAN_POINT('',(-0.3,-0.25,3.5E-02));+#124 = LINE('',#125,#126);+#125 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#126 = VECTOR('',#127,1.);+#127 = DIRECTION('',(1.,0.,0.));+#128 = ORIENTED_EDGE('',*,*,#129,.T.);+#129 = EDGE_CURVE('',#122,#64,#130,.T.);+#130 = CIRCLE('',#131,3.5E-02);+#131 = AXIS2_PLACEMENT_3D('',#132,#133,#134);+#132 = CARTESIAN_POINT('',(-0.335,-0.25,3.5E-02));+#133 = DIRECTION('',(0.,1.,0.));+#134 = DIRECTION('',(0.,0.,1.));+#135 = PLANE('',#136);+#136 = AXIS2_PLACEMENT_3D('',#137,#138,#139);+#137 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#138 = DIRECTION('',(0.,1.,0.));+#139 = DIRECTION('',(0.,0.,1.));+#140 = ADVANCED_FACE('',(#141),#160,.T.);+#141 = FACE_BOUND('',#142,.F.);+#142 = EDGE_LOOP('',(#143,#144,#152,#159));+#143 = ORIENTED_EDGE('',*,*,#71,.T.);+#144 = ORIENTED_EDGE('',*,*,#145,.T.);+#145 = EDGE_CURVE('',#62,#146,#148,.T.);+#146 = VERTEX_POINT('',#147);+#147 = CARTESIAN_POINT('',(-0.465,0.25,-2.775557561563E-17));+#148 = LINE('',#149,#150);+#149 = CARTESIAN_POINT('',(-0.465,-0.25,-2.775557561563E-17));+#150 = VECTOR('',#151,1.);+#151 = DIRECTION('',(0.,1.,0.));+#152 = ORIENTED_EDGE('',*,*,#153,.F.);+#153 = EDGE_CURVE('',#32,#146,#154,.T.);+#154 = CIRCLE('',#155,3.5E-02);+#155 = AXIS2_PLACEMENT_3D('',#156,#157,#158);+#156 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#157 = DIRECTION('',(0.,-1.,0.));+#158 = DIRECTION('',(0.,0.,1.));+#159 = ORIENTED_EDGE('',*,*,#31,.F.);+#160 = CYLINDRICAL_SURFACE('',#161,3.5E-02);+#161 = AXIS2_PLACEMENT_3D('',#162,#163,#164);+#162 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#163 = DIRECTION('',(0.,1.,0.));+#164 = DIRECTION('',(-1.,0.,0.));+#165 = ADVANCED_FACE('',(#166),#185,.T.);+#166 = FACE_BOUND('',#167,.T.);+#167 = EDGE_LOOP('',(#168,#169,#177,#184));+#168 = ORIENTED_EDGE('',*,*,#79,.T.);+#169 = ORIENTED_EDGE('',*,*,#170,.T.);+#170 = EDGE_CURVE('',#80,#171,#173,.T.);+#171 = VERTEX_POINT('',#172);+#172 = CARTESIAN_POINT('',(-0.465,0.25,0.35));+#173 = LINE('',#174,#175);+#174 = CARTESIAN_POINT('',(-0.465,-0.25,0.35));+#175 = VECTOR('',#176,1.);+#176 = DIRECTION('',(0.,1.,0.));+#177 = ORIENTED_EDGE('',*,*,#178,.F.);+#178 = EDGE_CURVE('',#40,#171,#179,.T.);+#179 = CIRCLE('',#180,3.5E-02);+#180 = AXIS2_PLACEMENT_3D('',#181,#182,#183);+#181 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#182 = DIRECTION('',(0.,1.,0.));+#183 = DIRECTION('',(0.,0.,1.));+#184 = ORIENTED_EDGE('',*,*,#47,.F.);+#185 = CYLINDRICAL_SURFACE('',#186,3.5E-02);+#186 = AXIS2_PLACEMENT_3D('',#187,#188,#189);+#187 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#188 = DIRECTION('',(0.,1.,0.));+#189 = DIRECTION('',(-1.,0.,0.));+#190 = ADVANCED_FACE('',(#191),#252,.T.);+#191 = FACE_BOUND('',#192,.T.);+#192 = EDGE_LOOP('',(#193,#201,#202,#203,#204,#212,#221,#229,#237,#245)+);+#193 = ORIENTED_EDGE('',*,*,#194,.F.);+#194 = EDGE_CURVE('',#146,#195,#197,.T.);+#195 = VERTEX_POINT('',#196);+#196 = CARTESIAN_POINT('',(-0.335,0.25,-2.775557561563E-17));+#197 = LINE('',#198,#199);+#198 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#199 = VECTOR('',#200,1.);+#200 = DIRECTION('',(1.,0.,0.));+#201 = ORIENTED_EDGE('',*,*,#153,.F.);+#202 = ORIENTED_EDGE('',*,*,#39,.T.);+#203 = ORIENTED_EDGE('',*,*,#178,.T.);+#204 = ORIENTED_EDGE('',*,*,#205,.T.);+#205 = EDGE_CURVE('',#171,#206,#208,.T.);+#206 = VERTEX_POINT('',#207);+#207 = CARTESIAN_POINT('',(-0.335,0.25,0.35));+#208 = LINE('',#209,#210);+#209 = CARTESIAN_POINT('',(-0.5,0.25,0.35));+#210 = VECTOR('',#211,1.);+#211 = DIRECTION('',(1.,0.,0.));+#212 = ORIENTED_EDGE('',*,*,#213,.F.);+#213 = EDGE_CURVE('',#214,#206,#216,.T.);+#214 = VERTEX_POINT('',#215);+#215 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#216 = CIRCLE('',#217,3.5E-02);+#217 = AXIS2_PLACEMENT_3D('',#218,#219,#220);+#218 = CARTESIAN_POINT('',(-0.335,0.25,0.315));+#219 = DIRECTION('',(0.,-1.,0.));+#220 = DIRECTION('',(0.,0.,1.));+#221 = ORIENTED_EDGE('',*,*,#222,.F.);+#222 = EDGE_CURVE('',#223,#214,#225,.T.);+#223 = VERTEX_POINT('',#224);+#224 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#225 = LINE('',#226,#227);+#226 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#227 = VECTOR('',#228,1.);+#228 = DIRECTION('',(1.,0.,0.));+#229 = ORIENTED_EDGE('',*,*,#230,.F.);+#230 = EDGE_CURVE('',#231,#223,#233,.T.);+#231 = VERTEX_POINT('',#232);+#232 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#233 = LINE('',#234,#235);+#234 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#235 = VECTOR('',#236,1.);+#236 = DIRECTION('',(0.,0.,1.));+#237 = ORIENTED_EDGE('',*,*,#238,.T.);+#238 = EDGE_CURVE('',#231,#239,#241,.T.);+#239 = VERTEX_POINT('',#240);+#240 = CARTESIAN_POINT('',(-0.3,0.25,3.5E-02));+#241 = LINE('',#242,#243);+#242 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#243 = VECTOR('',#244,1.);+#244 = DIRECTION('',(1.,0.,0.));+#245 = ORIENTED_EDGE('',*,*,#246,.T.);+#246 = EDGE_CURVE('',#239,#195,#247,.T.);+#247 = CIRCLE('',#248,3.5E-02);+#248 = AXIS2_PLACEMENT_3D('',#249,#250,#251);+#249 = CARTESIAN_POINT('',(-0.335,0.25,3.5E-02));+#250 = DIRECTION('',(0.,1.,0.));+#251 = DIRECTION('',(0.,0.,1.));+#252 = PLANE('',#253);+#253 = AXIS2_PLACEMENT_3D('',#254,#255,#256);+#254 = CARTESIAN_POINT('',(-0.5,0.25,0.));+#255 = DIRECTION('',(0.,1.,0.));+#256 = DIRECTION('',(0.,0.,1.));+#257 = ADVANCED_FACE('',(#258),#269,.F.);+#258 = FACE_BOUND('',#259,.F.);+#259 = EDGE_LOOP('',(#260,#261,#262,#263));+#260 = ORIENTED_EDGE('',*,*,#194,.F.);+#261 = ORIENTED_EDGE('',*,*,#145,.F.);+#262 = ORIENTED_EDGE('',*,*,#61,.T.);+#263 = ORIENTED_EDGE('',*,*,#264,.T.);+#264 = EDGE_CURVE('',#64,#195,#265,.T.);+#265 = LINE('',#266,#267);+#266 = CARTESIAN_POINT('',(-0.335,-0.25,-2.775557561563E-17));+#267 = VECTOR('',#268,1.);+#268 = DIRECTION('',(0.,1.,0.));+#269 = PLANE('',#270);+#270 = AXIS2_PLACEMENT_3D('',#271,#272,#273);+#271 = CARTESIAN_POINT('',(-0.5,-0.25,0.));+#272 = DIRECTION('',(0.,0.,1.));+#273 = DIRECTION('',(1.,0.,0.));+#274 = ADVANCED_FACE('',(#275),#286,.T.);+#275 = FACE_BOUND('',#276,.T.);+#276 = EDGE_LOOP('',(#277,#278,#279,#280));+#277 = ORIENTED_EDGE('',*,*,#129,.T.);+#278 = ORIENTED_EDGE('',*,*,#264,.T.);+#279 = ORIENTED_EDGE('',*,*,#246,.F.);+#280 = ORIENTED_EDGE('',*,*,#281,.F.);+#281 = EDGE_CURVE('',#122,#239,#282,.T.);+#282 = LINE('',#283,#284);+#283 = CARTESIAN_POINT('',(-0.3,-0.25,3.5E-02));+#284 = VECTOR('',#285,1.);+#285 = DIRECTION('',(0.,1.,0.));+#286 = CYLINDRICAL_SURFACE('',#287,3.5E-02);+#287 = AXIS2_PLACEMENT_3D('',#288,#289,#290);+#288 = CARTESIAN_POINT('',(-0.335,-0.25,3.5E-02));+#289 = DIRECTION('',(0.,1.,0.));+#290 = DIRECTION('',(1.,0.,0.));+#291 = ADVANCED_FACE('',(#292),#335,.F.);+#292 = FACE_BOUND('',#293,.F.);+#293 = EDGE_LOOP('',(#294,#295,#296,#297,#305,#313,#321,#329));+#294 = ORIENTED_EDGE('',*,*,#121,.F.);+#295 = ORIENTED_EDGE('',*,*,#113,.T.);+#296 = ORIENTED_EDGE('',*,*,#105,.T.);+#297 = ORIENTED_EDGE('',*,*,#298,.T.);+#298 = EDGE_CURVE('',#97,#299,#301,.T.);+#299 = VERTEX_POINT('',#300);+#300 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#301 = LINE('',#302,#303);+#302 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#303 = VECTOR('',#304,1.);+#304 = DIRECTION('',(1.,0.,0.));+#305 = ORIENTED_EDGE('',*,*,#306,.T.);+#306 = EDGE_CURVE('',#299,#307,#309,.T.);+#307 = VERTEX_POINT('',#308);+#308 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#309 = LINE('',#310,#311);+#310 = CARTESIAN_POINT('',(-0.465,-0.25,0.315));+#311 = VECTOR('',#312,1.);+#312 = DIRECTION('',(1.,0.,0.));+#313 = ORIENTED_EDGE('',*,*,#314,.F.);+#314 = EDGE_CURVE('',#315,#307,#317,.T.);+#315 = VERTEX_POINT('',#316);+#316 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#317 = LINE('',#318,#319);+#318 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#319 = VECTOR('',#320,1.);+#320 = DIRECTION('',(0.,0.,1.));+#321 = ORIENTED_EDGE('',*,*,#322,.F.);+#322 = EDGE_CURVE('',#323,#315,#325,.T.);+#323 = VERTEX_POINT('',#324);+#324 = CARTESIAN_POINT('',(0.3,-0.25,3.5E-02));+#325 = LINE('',#326,#327);+#326 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#327 = VECTOR('',#328,1.);+#328 = DIRECTION('',(1.,0.,0.));+#329 = ORIENTED_EDGE('',*,*,#330,.F.);+#330 = EDGE_CURVE('',#122,#323,#331,.T.);+#331 = LINE('',#332,#333);+#332 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#333 = VECTOR('',#334,1.);+#334 = DIRECTION('',(1.,0.,0.));+#335 = PLANE('',#336);+#336 = AXIS2_PLACEMENT_3D('',#337,#338,#339);+#337 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#338 = DIRECTION('',(0.,1.,0.));+#339 = DIRECTION('',(0.,0.,1.));+#340 = ADVANCED_FACE('',(#341),#352,.T.);+#341 = FACE_BOUND('',#342,.T.);+#342 = EDGE_LOOP('',(#343,#344,#345,#346));+#343 = ORIENTED_EDGE('',*,*,#205,.F.);+#344 = ORIENTED_EDGE('',*,*,#170,.F.);+#345 = ORIENTED_EDGE('',*,*,#88,.T.);+#346 = ORIENTED_EDGE('',*,*,#347,.T.);+#347 = EDGE_CURVE('',#89,#206,#348,.T.);+#348 = LINE('',#349,#350);+#349 = CARTESIAN_POINT('',(-0.335,-0.25,0.35));+#350 = VECTOR('',#351,1.);+#351 = DIRECTION('',(0.,1.,0.));+#352 = PLANE('',#353);+#353 = AXIS2_PLACEMENT_3D('',#354,#355,#356);+#354 = CARTESIAN_POINT('',(-0.5,-0.25,0.35));+#355 = DIRECTION('',(0.,0.,1.));+#356 = DIRECTION('',(1.,0.,0.));+#357 = ADVANCED_FACE('',(#358),#369,.T.);+#358 = FACE_BOUND('',#359,.F.);+#359 = EDGE_LOOP('',(#360,#361,#362,#363));+#360 = ORIENTED_EDGE('',*,*,#96,.T.);+#361 = ORIENTED_EDGE('',*,*,#347,.T.);+#362 = ORIENTED_EDGE('',*,*,#213,.F.);+#363 = ORIENTED_EDGE('',*,*,#364,.F.);+#364 = EDGE_CURVE('',#97,#214,#365,.T.);+#365 = LINE('',#366,#367);+#366 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#367 = VECTOR('',#368,1.);+#368 = DIRECTION('',(0.,1.,0.));+#369 = CYLINDRICAL_SURFACE('',#370,3.5E-02);+#370 = AXIS2_PLACEMENT_3D('',#371,#372,#373);+#371 = CARTESIAN_POINT('',(-0.335,-0.25,0.315));+#372 = DIRECTION('',(0.,1.,0.));+#373 = DIRECTION('',(1.,0.,0.));+#374 = ADVANCED_FACE('',(#375),#418,.T.);+#375 = FACE_BOUND('',#376,.T.);+#376 = EDGE_LOOP('',(#377,#378,#379,#380,#388,#396,#404,#412));+#377 = ORIENTED_EDGE('',*,*,#238,.F.);+#378 = ORIENTED_EDGE('',*,*,#230,.T.);+#379 = ORIENTED_EDGE('',*,*,#222,.T.);+#380 = ORIENTED_EDGE('',*,*,#381,.T.);+#381 = EDGE_CURVE('',#214,#382,#384,.T.);+#382 = VERTEX_POINT('',#383);+#383 = CARTESIAN_POINT('',(0.3,0.25,0.315));+#384 = LINE('',#385,#386);+#385 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#386 = VECTOR('',#387,1.);+#387 = DIRECTION('',(1.,0.,0.));+#388 = ORIENTED_EDGE('',*,*,#389,.T.);+#389 = EDGE_CURVE('',#382,#390,#392,.T.);+#390 = VERTEX_POINT('',#391);+#391 = CARTESIAN_POINT('',(0.465,0.25,0.315));+#392 = LINE('',#393,#394);+#393 = CARTESIAN_POINT('',(-0.465,0.25,0.315));+#394 = VECTOR('',#395,1.);+#395 = DIRECTION('',(1.,0.,0.));+#396 = ORIENTED_EDGE('',*,*,#397,.F.);+#397 = EDGE_CURVE('',#398,#390,#400,.T.);+#398 = VERTEX_POINT('',#399);+#399 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#400 = LINE('',#401,#402);+#401 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#402 = VECTOR('',#403,1.);+#403 = DIRECTION('',(0.,0.,1.));+#404 = ORIENTED_EDGE('',*,*,#405,.F.);+#405 = EDGE_CURVE('',#406,#398,#408,.T.);+#406 = VERTEX_POINT('',#407);+#407 = CARTESIAN_POINT('',(0.3,0.25,3.5E-02));+#408 = LINE('',#409,#410);+#409 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#410 = VECTOR('',#411,1.);+#411 = DIRECTION('',(1.,0.,0.));+#412 = ORIENTED_EDGE('',*,*,#413,.F.);+#413 = EDGE_CURVE('',#239,#406,#414,.T.);+#414 = LINE('',#415,#416);+#415 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#416 = VECTOR('',#417,1.);+#417 = DIRECTION('',(1.,0.,0.));+#418 = PLANE('',#419);+#419 = AXIS2_PLACEMENT_3D('',#420,#421,#422);+#420 = CARTESIAN_POINT('',(-0.465,0.25,3.5E-02));+#421 = DIRECTION('',(0.,1.,0.));+#422 = DIRECTION('',(0.,0.,1.));+#423 = ADVANCED_FACE('',(#424),#435,.F.);+#424 = FACE_BOUND('',#425,.F.);+#425 = EDGE_LOOP('',(#426,#427,#428,#434));+#426 = ORIENTED_EDGE('',*,*,#281,.F.);+#427 = ORIENTED_EDGE('',*,*,#330,.T.);+#428 = ORIENTED_EDGE('',*,*,#429,.T.);+#429 = EDGE_CURVE('',#323,#406,#430,.T.);+#430 = LINE('',#431,#432);+#431 = CARTESIAN_POINT('',(0.3,-0.25,3.5E-02));+#432 = VECTOR('',#433,1.);+#433 = DIRECTION('',(0.,1.,0.));+#434 = ORIENTED_EDGE('',*,*,#413,.F.);+#435 = PLANE('',#436);+#436 = AXIS2_PLACEMENT_3D('',#437,#438,#439);+#437 = CARTESIAN_POINT('',(-0.465,-0.25,3.5E-02));+#438 = DIRECTION('',(0.,0.,1.));+#439 = DIRECTION('',(1.,0.,0.));+#440 = ADVANCED_FACE('',(#441),#504,.F.);+#441 = FACE_BOUND('',#442,.F.);+#442 = EDGE_LOOP('',(#443,#453,#460,#461,#462,#463,#472,#480,#489,#497)+);+#443 = ORIENTED_EDGE('',*,*,#444,.F.);+#444 = EDGE_CURVE('',#445,#447,#449,.T.);+#445 = VERTEX_POINT('',#446);+#446 = CARTESIAN_POINT('',(0.335,-0.25,-2.775557561563E-17));+#447 = VERTEX_POINT('',#448);+#448 = CARTESIAN_POINT('',(0.465,-0.25,-2.775557561563E-17));+#449 = LINE('',#450,#451);+#450 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#451 = VECTOR('',#452,1.);+#452 = DIRECTION('',(1.,0.,0.));+#453 = ORIENTED_EDGE('',*,*,#454,.F.);+#454 = EDGE_CURVE('',#323,#445,#455,.T.);+#455 = CIRCLE('',#456,3.5E-02);+#456 = AXIS2_PLACEMENT_3D('',#457,#458,#459);+#457 = CARTESIAN_POINT('',(0.335,-0.25,3.5E-02));+#458 = DIRECTION('',(0.,-1.,0.));+#459 = DIRECTION('',(0.,0.,1.));+#460 = ORIENTED_EDGE('',*,*,#322,.T.);+#461 = ORIENTED_EDGE('',*,*,#314,.T.);+#462 = ORIENTED_EDGE('',*,*,#306,.F.);+#463 = ORIENTED_EDGE('',*,*,#464,.T.);+#464 = EDGE_CURVE('',#299,#465,#467,.T.);+#465 = VERTEX_POINT('',#466);+#466 = CARTESIAN_POINT('',(0.335,-0.25,0.35));+#467 = CIRCLE('',#468,3.5E-02);+#468 = AXIS2_PLACEMENT_3D('',#469,#470,#471);+#469 = CARTESIAN_POINT('',(0.335,-0.25,0.315));+#470 = DIRECTION('',(0.,1.,0.));+#471 = DIRECTION('',(0.,0.,1.));+#472 = ORIENTED_EDGE('',*,*,#473,.T.);+#473 = EDGE_CURVE('',#465,#474,#476,.T.);+#474 = VERTEX_POINT('',#475);+#475 = CARTESIAN_POINT('',(0.465,-0.25,0.35));+#476 = LINE('',#477,#478);+#477 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#478 = VECTOR('',#479,1.);+#479 = DIRECTION('',(1.,0.,0.));+#480 = ORIENTED_EDGE('',*,*,#481,.F.);+#481 = EDGE_CURVE('',#482,#474,#484,.T.);+#482 = VERTEX_POINT('',#483);+#483 = CARTESIAN_POINT('',(0.5,-0.25,0.315));+#484 = CIRCLE('',#485,3.5E-02);+#485 = AXIS2_PLACEMENT_3D('',#486,#487,#488);+#486 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#487 = DIRECTION('',(0.,-1.,0.));+#488 = DIRECTION('',(0.,0.,1.));+#489 = ORIENTED_EDGE('',*,*,#490,.F.);+#490 = EDGE_CURVE('',#491,#482,#493,.T.);+#491 = VERTEX_POINT('',#492);+#492 = CARTESIAN_POINT('',(0.5,-0.25,3.5E-02));+#493 = LINE('',#494,#495);+#494 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#495 = VECTOR('',#496,1.);+#496 = DIRECTION('',(0.,0.,1.));+#497 = ORIENTED_EDGE('',*,*,#498,.T.);+#498 = EDGE_CURVE('',#491,#447,#499,.T.);+#499 = CIRCLE('',#500,3.5E-02);+#500 = AXIS2_PLACEMENT_3D('',#501,#502,#503);+#501 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#502 = DIRECTION('',(0.,1.,0.));+#503 = DIRECTION('',(0.,0.,1.));+#504 = PLANE('',#505);+#505 = AXIS2_PLACEMENT_3D('',#506,#507,#508);+#506 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#507 = DIRECTION('',(0.,1.,0.));+#508 = DIRECTION('',(0.,0.,1.));+#509 = ADVANCED_FACE('',(#510),#535,.F.);+#510 = FACE_BOUND('',#511,.F.);+#511 = EDGE_LOOP('',(#512,#513,#521,#529));+#512 = ORIENTED_EDGE('',*,*,#298,.F.);+#513 = ORIENTED_EDGE('',*,*,#514,.T.);+#514 = EDGE_CURVE('',#97,#515,#517,.T.);+#515 = VERTEX_POINT('',#516);+#516 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#517 = LINE('',#518,#519);+#518 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#519 = VECTOR('',#520,1.);+#520 = DIRECTION('',(0.,0.,1.));+#521 = ORIENTED_EDGE('',*,*,#522,.T.);+#522 = EDGE_CURVE('',#515,#523,#525,.T.);+#523 = VERTEX_POINT('',#524);+#524 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#525 = LINE('',#526,#527);+#526 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#527 = VECTOR('',#528,1.);+#528 = DIRECTION('',(1.,0.,0.));+#529 = ORIENTED_EDGE('',*,*,#530,.F.);+#530 = EDGE_CURVE('',#299,#523,#531,.T.);+#531 = LINE('',#532,#533);+#532 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#533 = VECTOR('',#534,1.);+#534 = DIRECTION('',(0.,0.,1.));+#535 = PLANE('',#536);+#536 = AXIS2_PLACEMENT_3D('',#537,#538,#539);+#537 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#538 = DIRECTION('',(0.,1.,0.));+#539 = DIRECTION('',(0.,0.,1.));+#540 = ADVANCED_FACE('',(#541),#559,.F.);+#541 = FACE_BOUND('',#542,.F.);+#542 = EDGE_LOOP('',(#543,#544,#545,#553));+#543 = ORIENTED_EDGE('',*,*,#514,.F.);+#544 = ORIENTED_EDGE('',*,*,#364,.T.);+#545 = ORIENTED_EDGE('',*,*,#546,.T.);+#546 = EDGE_CURVE('',#214,#547,#549,.T.);+#547 = VERTEX_POINT('',#548);+#548 = CARTESIAN_POINT('',(-0.3,0.25,0.35));+#549 = LINE('',#550,#551);+#550 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#551 = VECTOR('',#552,1.);+#552 = DIRECTION('',(0.,0.,1.));+#553 = ORIENTED_EDGE('',*,*,#554,.F.);+#554 = EDGE_CURVE('',#515,#547,#555,.T.);+#555 = LINE('',#556,#557);+#556 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#557 = VECTOR('',#558,1.);+#558 = DIRECTION('',(0.,1.,0.));+#559 = PLANE('',#560);+#560 = AXIS2_PLACEMENT_3D('',#561,#562,#563);+#561 = CARTESIAN_POINT('',(-0.3,-0.25,0.315));+#562 = DIRECTION('',(1.,0.,0.));+#563 = DIRECTION('',(0.,0.,1.));+#564 = ADVANCED_FACE('',(#565),#628,.T.);+#565 = FACE_BOUND('',#566,.T.);+#566 = EDGE_LOOP('',(#567,#577,#584,#585,#586,#587,#596,#604,#613,#621)+);+#567 = ORIENTED_EDGE('',*,*,#568,.F.);+#568 = EDGE_CURVE('',#569,#571,#573,.T.);+#569 = VERTEX_POINT('',#570);+#570 = CARTESIAN_POINT('',(0.335,0.25,-2.775557561563E-17));+#571 = VERTEX_POINT('',#572);+#572 = CARTESIAN_POINT('',(0.465,0.25,-2.775557561563E-17));+#573 = LINE('',#574,#575);+#574 = CARTESIAN_POINT('',(0.3,0.25,0.));+#575 = VECTOR('',#576,1.);+#576 = DIRECTION('',(1.,0.,0.));+#577 = ORIENTED_EDGE('',*,*,#578,.F.);+#578 = EDGE_CURVE('',#406,#569,#579,.T.);+#579 = CIRCLE('',#580,3.5E-02);+#580 = AXIS2_PLACEMENT_3D('',#581,#582,#583);+#581 = CARTESIAN_POINT('',(0.335,0.25,3.5E-02));+#582 = DIRECTION('',(0.,-1.,0.));+#583 = DIRECTION('',(0.,0.,1.));+#584 = ORIENTED_EDGE('',*,*,#405,.T.);+#585 = ORIENTED_EDGE('',*,*,#397,.T.);+#586 = ORIENTED_EDGE('',*,*,#389,.F.);+#587 = ORIENTED_EDGE('',*,*,#588,.T.);+#588 = EDGE_CURVE('',#382,#589,#591,.T.);+#589 = VERTEX_POINT('',#590);+#590 = CARTESIAN_POINT('',(0.335,0.25,0.35));+#591 = CIRCLE('',#592,3.5E-02);+#592 = AXIS2_PLACEMENT_3D('',#593,#594,#595);+#593 = CARTESIAN_POINT('',(0.335,0.25,0.315));+#594 = DIRECTION('',(0.,1.,0.));+#595 = DIRECTION('',(0.,0.,1.));+#596 = ORIENTED_EDGE('',*,*,#597,.T.);+#597 = EDGE_CURVE('',#589,#598,#600,.T.);+#598 = VERTEX_POINT('',#599);+#599 = CARTESIAN_POINT('',(0.465,0.25,0.35));+#600 = LINE('',#601,#602);+#601 = CARTESIAN_POINT('',(0.3,0.25,0.35));+#602 = VECTOR('',#603,1.);+#603 = DIRECTION('',(1.,0.,0.));+#604 = ORIENTED_EDGE('',*,*,#605,.F.);+#605 = EDGE_CURVE('',#606,#598,#608,.T.);+#606 = VERTEX_POINT('',#607);+#607 = CARTESIAN_POINT('',(0.5,0.25,0.315));+#608 = CIRCLE('',#609,3.5E-02);+#609 = AXIS2_PLACEMENT_3D('',#610,#611,#612);+#610 = CARTESIAN_POINT('',(0.465,0.25,0.315));+#611 = DIRECTION('',(0.,-1.,0.));+#612 = DIRECTION('',(0.,0.,1.));+#613 = ORIENTED_EDGE('',*,*,#614,.F.);+#614 = EDGE_CURVE('',#615,#606,#617,.T.);+#615 = VERTEX_POINT('',#616);+#616 = CARTESIAN_POINT('',(0.5,0.25,3.5E-02));+#617 = LINE('',#618,#619);+#618 = CARTESIAN_POINT('',(0.5,0.25,0.));+#619 = VECTOR('',#620,1.);+#620 = DIRECTION('',(0.,0.,1.));+#621 = ORIENTED_EDGE('',*,*,#622,.T.);+#622 = EDGE_CURVE('',#615,#571,#623,.T.);+#623 = CIRCLE('',#624,3.5E-02);+#624 = AXIS2_PLACEMENT_3D('',#625,#626,#627);+#625 = CARTESIAN_POINT('',(0.465,0.25,3.5E-02));+#626 = DIRECTION('',(0.,1.,0.));+#627 = DIRECTION('',(0.,0.,1.));+#628 = PLANE('',#629);+#629 = AXIS2_PLACEMENT_3D('',#630,#631,#632);+#630 = CARTESIAN_POINT('',(0.3,0.25,0.));+#631 = DIRECTION('',(0.,1.,0.));+#632 = DIRECTION('',(0.,0.,1.));+#633 = ADVANCED_FACE('',(#634),#652,.T.);+#634 = FACE_BOUND('',#635,.T.);+#635 = EDGE_LOOP('',(#636,#637,#638,#646));+#636 = ORIENTED_EDGE('',*,*,#381,.F.);+#637 = ORIENTED_EDGE('',*,*,#546,.T.);+#638 = ORIENTED_EDGE('',*,*,#639,.T.);+#639 = EDGE_CURVE('',#547,#640,#642,.T.);+#640 = VERTEX_POINT('',#641);+#641 = CARTESIAN_POINT('',(0.3,0.25,0.35));+#642 = LINE('',#643,#644);+#643 = CARTESIAN_POINT('',(-0.3,0.25,0.35));+#644 = VECTOR('',#645,1.);+#645 = DIRECTION('',(1.,0.,0.));+#646 = ORIENTED_EDGE('',*,*,#647,.F.);+#647 = EDGE_CURVE('',#382,#640,#648,.T.);+#648 = LINE('',#649,#650);+#649 = CARTESIAN_POINT('',(0.3,0.25,0.315));+#650 = VECTOR('',#651,1.);+#651 = DIRECTION('',(0.,0.,1.));+#652 = PLANE('',#653);+#653 = AXIS2_PLACEMENT_3D('',#654,#655,#656);+#654 = CARTESIAN_POINT('',(-0.3,0.25,0.315));+#655 = DIRECTION('',(0.,1.,0.));+#656 = DIRECTION('',(0.,0.,1.));+#657 = ADVANCED_FACE('',(#658),#669,.T.);+#658 = FACE_BOUND('',#659,.F.);+#659 = EDGE_LOOP('',(#660,#661,#667,#668));+#660 = ORIENTED_EDGE('',*,*,#454,.T.);+#661 = ORIENTED_EDGE('',*,*,#662,.T.);+#662 = EDGE_CURVE('',#445,#569,#663,.T.);+#663 = LINE('',#664,#665);+#664 = CARTESIAN_POINT('',(0.335,-0.25,-2.775557561563E-17));+#665 = VECTOR('',#666,1.);+#666 = DIRECTION('',(0.,1.,0.));+#667 = ORIENTED_EDGE('',*,*,#578,.F.);+#668 = ORIENTED_EDGE('',*,*,#429,.F.);+#669 = CYLINDRICAL_SURFACE('',#670,3.5E-02);+#670 = AXIS2_PLACEMENT_3D('',#671,#672,#673);+#671 = CARTESIAN_POINT('',(0.335,-0.25,3.5E-02));+#672 = DIRECTION('',(0.,1.,0.));+#673 = DIRECTION('',(-1.,0.,0.));+#674 = ADVANCED_FACE('',(#675),#686,.F.);+#675 = FACE_BOUND('',#676,.F.);+#676 = EDGE_LOOP('',(#677,#678,#679,#680));+#677 = ORIENTED_EDGE('',*,*,#568,.F.);+#678 = ORIENTED_EDGE('',*,*,#662,.F.);+#679 = ORIENTED_EDGE('',*,*,#444,.T.);+#680 = ORIENTED_EDGE('',*,*,#681,.T.);+#681 = EDGE_CURVE('',#447,#571,#682,.T.);+#682 = LINE('',#683,#684);+#683 = CARTESIAN_POINT('',(0.465,-0.25,-2.775557561563E-17));+#684 = VECTOR('',#685,1.);+#685 = DIRECTION('',(0.,1.,0.));+#686 = PLANE('',#687);+#687 = AXIS2_PLACEMENT_3D('',#688,#689,#690);+#688 = CARTESIAN_POINT('',(0.3,-0.25,0.));+#689 = DIRECTION('',(0.,0.,1.));+#690 = DIRECTION('',(1.,0.,0.));+#691 = ADVANCED_FACE('',(#692),#703,.T.);+#692 = FACE_BOUND('',#693,.T.);+#693 = EDGE_LOOP('',(#694,#695,#696,#697));+#694 = ORIENTED_EDGE('',*,*,#498,.T.);+#695 = ORIENTED_EDGE('',*,*,#681,.T.);+#696 = ORIENTED_EDGE('',*,*,#622,.F.);+#697 = ORIENTED_EDGE('',*,*,#698,.F.);+#698 = EDGE_CURVE('',#491,#615,#699,.T.);+#699 = LINE('',#700,#701);+#700 = CARTESIAN_POINT('',(0.5,-0.25,3.5E-02));+#701 = VECTOR('',#702,1.);+#702 = DIRECTION('',(0.,1.,0.));+#703 = CYLINDRICAL_SURFACE('',#704,3.5E-02);+#704 = AXIS2_PLACEMENT_3D('',#705,#706,#707);+#705 = CARTESIAN_POINT('',(0.465,-0.25,3.5E-02));+#706 = DIRECTION('',(0.,1.,0.));+#707 = DIRECTION('',(1.,0.,0.));+#708 = ADVANCED_FACE('',(#709),#720,.T.);+#709 = FACE_BOUND('',#710,.T.);+#710 = EDGE_LOOP('',(#711,#712,#713,#714));+#711 = ORIENTED_EDGE('',*,*,#490,.F.);+#712 = ORIENTED_EDGE('',*,*,#698,.T.);+#713 = ORIENTED_EDGE('',*,*,#614,.T.);+#714 = ORIENTED_EDGE('',*,*,#715,.F.);+#715 = EDGE_CURVE('',#482,#606,#716,.T.);+#716 = LINE('',#717,#718);+#717 = CARTESIAN_POINT('',(0.5,-0.25,0.315));+#718 = VECTOR('',#719,1.);+#719 = DIRECTION('',(0.,1.,0.));+#720 = PLANE('',#721);+#721 = AXIS2_PLACEMENT_3D('',#722,#723,#724);+#722 = CARTESIAN_POINT('',(0.5,-0.25,0.));+#723 = DIRECTION('',(1.,0.,0.));+#724 = DIRECTION('',(0.,0.,1.));+#725 = ADVANCED_FACE('',(#726),#737,.T.);+#726 = FACE_BOUND('',#727,.F.);+#727 = EDGE_LOOP('',(#728,#729,#735,#736));+#728 = ORIENTED_EDGE('',*,*,#481,.T.);+#729 = ORIENTED_EDGE('',*,*,#730,.T.);+#730 = EDGE_CURVE('',#474,#598,#731,.T.);+#731 = LINE('',#732,#733);+#732 = CARTESIAN_POINT('',(0.465,-0.25,0.35));+#733 = VECTOR('',#734,1.);+#734 = DIRECTION('',(0.,1.,0.));+#735 = ORIENTED_EDGE('',*,*,#605,.F.);+#736 = ORIENTED_EDGE('',*,*,#715,.F.);+#737 = CYLINDRICAL_SURFACE('',#738,3.5E-02);+#738 = AXIS2_PLACEMENT_3D('',#739,#740,#741);+#739 = CARTESIAN_POINT('',(0.465,-0.25,0.315));+#740 = DIRECTION('',(0.,1.,0.));+#741 = DIRECTION('',(1.,0.,0.));+#742 = ADVANCED_FACE('',(#743),#754,.T.);+#743 = FACE_BOUND('',#744,.T.);+#744 = EDGE_LOOP('',(#745,#746,#752,#753));+#745 = ORIENTED_EDGE('',*,*,#597,.F.);+#746 = ORIENTED_EDGE('',*,*,#747,.F.);+#747 = EDGE_CURVE('',#465,#589,#748,.T.);+#748 = LINE('',#749,#750);+#749 = CARTESIAN_POINT('',(0.335,-0.25,0.35));+#750 = VECTOR('',#751,1.);+#751 = DIRECTION('',(0.,1.,0.));+#752 = ORIENTED_EDGE('',*,*,#473,.T.);+#753 = ORIENTED_EDGE('',*,*,#730,.T.);+#754 = PLANE('',#755);+#755 = AXIS2_PLACEMENT_3D('',#756,#757,#758);+#756 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#757 = DIRECTION('',(0.,0.,1.));+#758 = DIRECTION('',(1.,0.,0.));+#759 = ADVANCED_FACE('',(#760),#771,.T.);+#760 = FACE_BOUND('',#761,.T.);+#761 = EDGE_LOOP('',(#762,#763,#764,#765));+#762 = ORIENTED_EDGE('',*,*,#464,.T.);+#763 = ORIENTED_EDGE('',*,*,#747,.T.);+#764 = ORIENTED_EDGE('',*,*,#588,.F.);+#765 = ORIENTED_EDGE('',*,*,#766,.F.);+#766 = EDGE_CURVE('',#299,#382,#767,.T.);+#767 = LINE('',#768,#769);+#768 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#769 = VECTOR('',#770,1.);+#770 = DIRECTION('',(0.,1.,0.));+#771 = CYLINDRICAL_SURFACE('',#772,3.5E-02);+#772 = AXIS2_PLACEMENT_3D('',#773,#774,#775);+#773 = CARTESIAN_POINT('',(0.335,-0.25,0.315));+#774 = DIRECTION('',(0.,1.,0.));+#775 = DIRECTION('',(-1.,0.,0.));+#776 = ADVANCED_FACE('',(#777),#788,.T.);+#777 = FACE_BOUND('',#778,.T.);+#778 = EDGE_LOOP('',(#779,#780,#781,#782));+#779 = ORIENTED_EDGE('',*,*,#530,.F.);+#780 = ORIENTED_EDGE('',*,*,#766,.T.);+#781 = ORIENTED_EDGE('',*,*,#647,.T.);+#782 = ORIENTED_EDGE('',*,*,#783,.F.);+#783 = EDGE_CURVE('',#523,#640,#784,.T.);+#784 = LINE('',#785,#786);+#785 = CARTESIAN_POINT('',(0.3,-0.25,0.35));+#786 = VECTOR('',#787,1.);+#787 = DIRECTION('',(0.,1.,0.));+#788 = PLANE('',#789);+#789 = AXIS2_PLACEMENT_3D('',#790,#791,#792);+#790 = CARTESIAN_POINT('',(0.3,-0.25,0.315));+#791 = DIRECTION('',(1.,0.,0.));+#792 = DIRECTION('',(0.,0.,1.));+#793 = ADVANCED_FACE('',(#794),#800,.T.);+#794 = FACE_BOUND('',#795,.T.);+#795 = EDGE_LOOP('',(#796,#797,#798,#799));+#796 = ORIENTED_EDGE('',*,*,#554,.F.);+#797 = ORIENTED_EDGE('',*,*,#522,.T.);+#798 = ORIENTED_EDGE('',*,*,#783,.T.);+#799 = ORIENTED_EDGE('',*,*,#639,.F.);+#800 = PLANE('',#801);+#801 = AXIS2_PLACEMENT_3D('',#802,#803,#804);+#802 = CARTESIAN_POINT('',(-0.3,-0.25,0.35));+#803 = DIRECTION('',(0.,0.,1.));+#804 = DIRECTION('',(1.,0.,0.));+#805 = ( GEOMETRIC_REPRESENTATION_CONTEXT(3)+GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#809)) GLOBAL_UNIT_ASSIGNED_CONTEXT+((#806,#807,#808)) REPRESENTATION_CONTEXT('Context #1',+'3D Context with UNIT and UNCERTAINTY') );+#806 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) );+#807 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) );+#808 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() );+#809 = UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(1.E-07),#806,+'distance_accuracy_value','confusion accuracy');+#810 = PRODUCT_RELATED_PRODUCT_CATEGORY('part',$,(#7));+#811 = MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#812,+#820,#827,#834,#841,#848,#855,#862,#870,#877,#884,#891,#898,#905,+#913,#920,#927,#934,#941,#948,#955,#962,#969,#976,#983,#990),#805);+#812 = STYLED_ITEM('color',(#813),#17);+#813 = PRESENTATION_STYLE_ASSIGNMENT((#814));+#814 = SURFACE_STYLE_USAGE(.BOTH.,#815);+#815 = SURFACE_SIDE_STYLE('',(#816));+#816 = SURFACE_STYLE_FILL_AREA(#817);+#817 = FILL_AREA_STYLE('',(#818));+#818 = FILL_AREA_STYLE_COLOUR('',#819);+#819 = COLOUR_RGB('',0.824000000954,0.819999992847,0.78100001812);+#820 = STYLED_ITEM('color',(#821),#57);+#821 = PRESENTATION_STYLE_ASSIGNMENT((#822));+#822 = SURFACE_STYLE_USAGE(.BOTH.,#823);+#823 = SURFACE_SIDE_STYLE('',(#824));+#824 = SURFACE_STYLE_FILL_AREA(#825);+#825 = FILL_AREA_STYLE('',(#826));+#826 = FILL_AREA_STYLE_COLOUR('',#819);+#827 = STYLED_ITEM('color',(#828),#140);+#828 = PRESENTATION_STYLE_ASSIGNMENT((#829));+#829 = SURFACE_STYLE_USAGE(.BOTH.,#830);+#830 = SURFACE_SIDE_STYLE('',(#831));+#831 = SURFACE_STYLE_FILL_AREA(#832);+#832 = FILL_AREA_STYLE('',(#833));+#833 = FILL_AREA_STYLE_COLOUR('',#819);+#834 = STYLED_ITEM('color',(#835),#165);+#835 = PRESENTATION_STYLE_ASSIGNMENT((#836));+#836 = SURFACE_STYLE_USAGE(.BOTH.,#837);+#837 = SURFACE_SIDE_STYLE('',(#838));+#838 = SURFACE_STYLE_FILL_AREA(#839);+#839 = FILL_AREA_STYLE('',(#840));+#840 = FILL_AREA_STYLE_COLOUR('',#819);+#841 = STYLED_ITEM('color',(#842),#190);+#842 = PRESENTATION_STYLE_ASSIGNMENT((#843));+#843 = SURFACE_STYLE_USAGE(.BOTH.,#844);+#844 = SURFACE_SIDE_STYLE('',(#845));+#845 = SURFACE_STYLE_FILL_AREA(#846);+#846 = FILL_AREA_STYLE('',(#847));+#847 = FILL_AREA_STYLE_COLOUR('',#819);+#848 = STYLED_ITEM('color',(#849),#257);+#849 = PRESENTATION_STYLE_ASSIGNMENT((#850));+#850 = SURFACE_STYLE_USAGE(.BOTH.,#851);+#851 = SURFACE_SIDE_STYLE('',(#852));+#852 = SURFACE_STYLE_FILL_AREA(#853);+#853 = FILL_AREA_STYLE('',(#854));+#854 = FILL_AREA_STYLE_COLOUR('',#819);+#855 = STYLED_ITEM('color',(#856),#274);+#856 = PRESENTATION_STYLE_ASSIGNMENT((#857));+#857 = SURFACE_STYLE_USAGE(.BOTH.,#858);+#858 = SURFACE_SIDE_STYLE('',(#859));+#859 = SURFACE_STYLE_FILL_AREA(#860);+#860 = FILL_AREA_STYLE('',(#861));+#861 = FILL_AREA_STYLE_COLOUR('',#819);+#862 = STYLED_ITEM('color',(#863),#291);+#863 = PRESENTATION_STYLE_ASSIGNMENT((#864));+#864 = SURFACE_STYLE_USAGE(.BOTH.,#865);+#865 = SURFACE_SIDE_STYLE('',(#866));+#866 = SURFACE_STYLE_FILL_AREA(#867);+#867 = FILL_AREA_STYLE('',(#868));+#868 = FILL_AREA_STYLE_COLOUR('',#869);+#869 = COLOUR_RGB('',0.894999980927,0.89099997282,0.813000023365);+#870 = STYLED_ITEM('color',(#871),#340);+#871 = PRESENTATION_STYLE_ASSIGNMENT((#872));+#872 = SURFACE_STYLE_USAGE(.BOTH.,#873);+#873 = SURFACE_SIDE_STYLE('',(#874));+#874 = SURFACE_STYLE_FILL_AREA(#875);+#875 = FILL_AREA_STYLE('',(#876));+#876 = FILL_AREA_STYLE_COLOUR('',#819);+#877 = STYLED_ITEM('color',(#878),#357);+#878 = PRESENTATION_STYLE_ASSIGNMENT((#879));+#879 = SURFACE_STYLE_USAGE(.BOTH.,#880);+#880 = SURFACE_SIDE_STYLE('',(#881));+#881 = SURFACE_STYLE_FILL_AREA(#882);+#882 = FILL_AREA_STYLE('',(#883));+#883 = FILL_AREA_STYLE_COLOUR('',#819);+#884 = STYLED_ITEM('color',(#885),#374);+#885 = PRESENTATION_STYLE_ASSIGNMENT((#886));+#886 = SURFACE_STYLE_USAGE(.BOTH.,#887);+#887 = SURFACE_SIDE_STYLE('',(#888));+#888 = SURFACE_STYLE_FILL_AREA(#889);+#889 = FILL_AREA_STYLE('',(#890));+#890 = FILL_AREA_STYLE_COLOUR('',#869);+#891 = STYLED_ITEM('color',(#892),#423);+#892 = PRESENTATION_STYLE_ASSIGNMENT((#893));+#893 = SURFACE_STYLE_USAGE(.BOTH.,#894);+#894 = SURFACE_SIDE_STYLE('',(#895));+#895 = SURFACE_STYLE_FILL_AREA(#896);+#896 = FILL_AREA_STYLE('',(#897));+#897 = FILL_AREA_STYLE_COLOUR('',#869);+#898 = STYLED_ITEM('color',(#899),#440);+#899 = PRESENTATION_STYLE_ASSIGNMENT((#900));+#900 = SURFACE_STYLE_USAGE(.BOTH.,#901);+#901 = SURFACE_SIDE_STYLE('',(#902));+#902 = SURFACE_STYLE_FILL_AREA(#903);+#903 = FILL_AREA_STYLE('',(#904));+#904 = FILL_AREA_STYLE_COLOUR('',#819);+#905 = STYLED_ITEM('color',(#906),#509);+#906 = PRESENTATION_STYLE_ASSIGNMENT((#907));+#907 = SURFACE_STYLE_USAGE(.BOTH.,#908);+#908 = SURFACE_SIDE_STYLE('',(#909));+#909 = SURFACE_STYLE_FILL_AREA(#910);+#910 = FILL_AREA_STYLE('',(#911));+#911 = FILL_AREA_STYLE_COLOUR('',#912);+#912 = COLOUR_RGB('',8.200000226498E-02,8.600000292063E-02,+9.399999678135E-02);+#913 = STYLED_ITEM('color',(#914),#540);+#914 = PRESENTATION_STYLE_ASSIGNMENT((#915));+#915 = SURFACE_STYLE_USAGE(.BOTH.,#916);+#916 = SURFACE_SIDE_STYLE('',(#917));+#917 = SURFACE_STYLE_FILL_AREA(#918);+#918 = FILL_AREA_STYLE('',(#919));+#919 = FILL_AREA_STYLE_COLOUR('',#912);+#920 = STYLED_ITEM('color',(#921),#564);+#921 = PRESENTATION_STYLE_ASSIGNMENT((#922));+#922 = SURFACE_STYLE_USAGE(.BOTH.,#923);+#923 = SURFACE_SIDE_STYLE('',(#924));+#924 = SURFACE_STYLE_FILL_AREA(#925);+#925 = FILL_AREA_STYLE('',(#926));+#926 = FILL_AREA_STYLE_COLOUR('',#819);+#927 = STYLED_ITEM('color',(#928),#633);+#928 = PRESENTATION_STYLE_ASSIGNMENT((#929));+#929 = SURFACE_STYLE_USAGE(.BOTH.,#930);+#930 = SURFACE_SIDE_STYLE('',(#931));+#931 = SURFACE_STYLE_FILL_AREA(#932);+#932 = FILL_AREA_STYLE('',(#933));+#933 = FILL_AREA_STYLE_COLOUR('',#912);+#934 = STYLED_ITEM('color',(#935),#657);+#935 = PRESENTATION_STYLE_ASSIGNMENT((#936));+#936 = SURFACE_STYLE_USAGE(.BOTH.,#937);+#937 = SURFACE_SIDE_STYLE('',(#938));+#938 = SURFACE_STYLE_FILL_AREA(#939);+#939 = FILL_AREA_STYLE('',(#940));+#940 = FILL_AREA_STYLE_COLOUR('',#819);+#941 = STYLED_ITEM('color',(#942),#674);+#942 = PRESENTATION_STYLE_ASSIGNMENT((#943));+#943 = SURFACE_STYLE_USAGE(.BOTH.,#944);+#944 = SURFACE_SIDE_STYLE('',(#945));+#945 = SURFACE_STYLE_FILL_AREA(#946);+#946 = FILL_AREA_STYLE('',(#947));+#947 = FILL_AREA_STYLE_COLOUR('',#819);+#948 = STYLED_ITEM('color',(#949),#691);+#949 = PRESENTATION_STYLE_ASSIGNMENT((#950));+#950 = SURFACE_STYLE_USAGE(.BOTH.,#951);+#951 = SURFACE_SIDE_STYLE('',(#952));+#952 = SURFACE_STYLE_FILL_AREA(#953);+#953 = FILL_AREA_STYLE('',(#954));+#954 = FILL_AREA_STYLE_COLOUR('',#819);+#955 = STYLED_ITEM('color',(#956),#708);+#956 = PRESENTATION_STYLE_ASSIGNMENT((#957));+#957 = SURFACE_STYLE_USAGE(.BOTH.,#958);+#958 = SURFACE_SIDE_STYLE('',(#959));+#959 = SURFACE_STYLE_FILL_AREA(#960);+#960 = FILL_AREA_STYLE('',(#961));+#961 = FILL_AREA_STYLE_COLOUR('',#819);+#962 = STYLED_ITEM('color',(#963),#725);+#963 = PRESENTATION_STYLE_ASSIGNMENT((#964));+#964 = SURFACE_STYLE_USAGE(.BOTH.,#965);+#965 = SURFACE_SIDE_STYLE('',(#966));+#966 = SURFACE_STYLE_FILL_AREA(#967);+#967 = FILL_AREA_STYLE('',(#968));+#968 = FILL_AREA_STYLE_COLOUR('',#819);+#969 = STYLED_ITEM('color',(#970),#742);+#970 = PRESENTATION_STYLE_ASSIGNMENT((#971));+#971 = SURFACE_STYLE_USAGE(.BOTH.,#972);+#972 = SURFACE_SIDE_STYLE('',(#973));+#973 = SURFACE_STYLE_FILL_AREA(#974);+#974 = FILL_AREA_STYLE('',(#975));+#975 = FILL_AREA_STYLE_COLOUR('',#819);+#976 = STYLED_ITEM('color',(#977),#759);+#977 = PRESENTATION_STYLE_ASSIGNMENT((#978));+#978 = SURFACE_STYLE_USAGE(.BOTH.,#979);+#979 = SURFACE_SIDE_STYLE('',(#980));+#980 = SURFACE_STYLE_FILL_AREA(#981);+#981 = FILL_AREA_STYLE('',(#982));+#982 = FILL_AREA_STYLE_COLOUR('',#819);+#983 = STYLED_ITEM('color',(#984),#776);+#984 = PRESENTATION_STYLE_ASSIGNMENT((#985));+#985 = SURFACE_STYLE_USAGE(.BOTH.,#986);+#986 = SURFACE_SIDE_STYLE('',(#987));+#987 = SURFACE_STYLE_FILL_AREA(#988);+#988 = FILL_AREA_STYLE('',(#989));+#989 = FILL_AREA_STYLE_COLOUR('',#912);+#990 = STYLED_ITEM('color',(#991),#793);+#991 = PRESENTATION_STYLE_ASSIGNMENT((#992));+#992 = SURFACE_STYLE_USAGE(.BOTH.,#993);+#993 = SURFACE_SIDE_STYLE('',(#994));+#994 = SURFACE_STYLE_FILL_AREA(#995);+#995 = FILL_AREA_STYLE('',(#996));+#996 = FILL_AREA_STYLE_COLOUR('',#912);+ENDSEC;+END-ISO-10303-21;
README.md+167−2
@@ -1,3 +1,168 @@-# RC0402FR-0733KL - YAGEO+# RC0402FR-0733KL -Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)+YAGEO RC0402FR-0733KL: Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric). A general purpose thick film chip resistor from YAGEO's RC_L series.++::adom-verified{src="/adom/rc0402fr-0733kl/render/verification.json"}++| Field | Value |+|---|---|+| Manufacturer | YAGEO |+| Manufacturer part number | RC0402FR-0733KL |+| Type | Thick film chip resistor |+| Value | 33 kOhm |+| Tolerance | +/-1 % (F) |+| Voltage | 50 V max working, 100 V max overload; 45.4 V continuous at this value |+| Power rating | 1/16 W (0.0625 W) at 70 C |+| Operating temperature | -55 to 155 C |+| Package | 0402 (1005 metric) |+| Marking | none (RC0402 is not marked) |+| Datasheet | [YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025](docs/rc0402fr-0733kl-datasheet.pdf) |++## Key specifications++| Parameter | Value | Datasheet |+|---|---|---|+| Resistance | 33 kOhm (code 33K), E24 value | p.2 ordering information |+| Tolerance | +/-1 % (code F); 1 % range 1 Ohm to 10 MOhm | p.2, p.5 Table 2 (RC0402) |+| Rated power | 1/16 W (0.0625 W) at 70 C, standard power (reel code 07); derated linearly to 0 at 155 C | p.2 (5), p.5 Table 2, p.7 Fig. 10-1 |+| Maximum working voltage | 50 V | p.5 Table 2 |+| Maximum overload voltage | 100 V | p.5 Table 2 |+| Dielectric withstanding voltage | 100 V | p.5 Table 2 |+| Rated continuous voltage at this value | 45.4 V (power governs: sqrt(P x R) = 45.4 V is below the 50 V maximum working voltage) | p.7 Rated voltage formula |+| Short time overload test | 2.5 x RCWV or the maximum overload voltage, whichever is less, for 5 s: 100 V for this value | p.9 Table 5 |+| Temperature coefficient | +/-100 ppm/C for 10 Ohm < R <= 10 MOhm | p.5 Table 2 |+| Operating temperature | -55 to 155 C | p.5 Table 2, p.7 |+| Technology | thick film on ceramic substrate, matte tin on nickel terminations | p.4 Construction |+| Size | L 1.00 +/-0.05, W 0.50 +/-0.05, H 0.35 +/-0.05, I1 0.20 +/-0.10, I2 0.25 +/-0.10 (mm) | p.4 Table 1 |+| Marking | none (RC0402 is not marked) | p.3 Marking |+| Packaging (R, 07) | 7 inch (178 mm) paper taping reel, 10000 pcs | p.2, p.7 Table 4 |+| Moisture sensitivity | MSL 1 | p.2 Features |++All page numbers refer to the datasheet PDF in [docs/](docs/rc0402fr-0733kl-datasheet.pdf).++## Voltage rating++YAGEO rates the continuous working voltage as sqrt(P x R) or the maximum working voltage, whichever is less (p.7).+For this value power governs: sqrt(P x R) = sqrt(0.0625 W x 33 kOhm) = **45.4 V** continuous, below the 0402 size's 50 V maximum working voltage. The maximum overload voltage is 100 V; the short time overload test applies 100 V for 5 s (p.9).++![Datasheet p.5 Table 2](docs/figures/rc-p05-table2.png)++![Datasheet p.7 power rating and rated voltage](docs/figures/rc-p07-power-voltage.png)++## Notes++- Mouser lists the part as 'RoHS Compliant By Exemption'; the datasheet (p.2) says Pb-glass in electrodes, resistor element and glass is exempted.++## Ordering++| Distributor | Part number | Stock seen 2026-10-21 |+|---|---|---|+| Mouser | [603-RC0402FR-0733KL](https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-0733KL?qs=OLdA50ig9KgSAim5D6WRlA%3D%3D) | 669,292 |+| DigiKey | [311-33.0KLRTR-ND](https://www.digikey.com/en/products/detail/yageo/RC0402FR-0733KL/726592) | 977,588 |+| LCSC / JLCPCB | [C138003](https://www.lcsc.com/product-detail/C138003.html) | 811,894 |++Stock figures are a snapshot from the Adom parts search on 2026-10-21; check the distributor before ordering. Packaging code+R with reel code 07 is a 7 inch paper tape reel of 10,000 pieces (p.7 Table 4).++## Manufacturer and resources++| Resource | Link |+|---|---|+| Product page | https://yageogroup.com/products/productDetail/RC0402FR-0733KL |+| Datasheet | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, [PDF](docs/rc0402fr-0733kl-datasheet.pdf) ([source](https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L)) |+| Mounting and land pattern | YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018, [PDF](docs/yageo-chip-resistors-mounting-v10.pdf) ([source](https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf)) |+| Marking and packing | YAGEO's separate 'Chip resistors marking' and 'Chip resistors packing' sheets, named on p.3 and p.7 of the datasheet (not included here) |++## Pins++| Pin | Function |+|---|---|+| 1 | terminal (non-polar) |+| 2 | terminal (non-polar) |++A resistor has no polarity and no pin 1 orientation: either terminal may face either way.++## Marking++YAGEO does not mark RC0402 parts (p.3, Fig. 1): the top coat is plain.++![Datasheet p.3 Marking](docs/figures/rc-p03-marking.png)++## Land pattern: KiCad footprint vs YAGEO++<table>+<tr>+<td width="104"><a href="land-pattern/README.md"><img src="land-pattern/land-pattern-icon.png" width="112" alt="Land pattern"></a><br><sub>&nbsp;&nbsp;&nbsp;&nbsp;Land&nbsp;pattern&nbsp;&nbsp;&nbsp;&nbsp;</sub></td>+<td>The footprint is KiCad's standard `R_0402_1005Metric`, and this guide lays its pads over YAGEO's recommended reflow land, at true scale. It matches YAGEO closely. Use it to decide whether to keep the KiCad pads or change them to YAGEO's numbers before layout.<br><br><a href="land-pattern/README.md">The comparison, with the numbers</a></td>+</tr>+</table>++## 3D model++No YAGEO STEP for this exact part number could be downloaded by plain HTTP: YAGEO's product pages build their CAD links in the browser and expose no direct STEP link. The page therefore uses KiCad's library model for the package, `R_0402_1005Metric.step`, with its bytes unchanged, renamed `RC0402FR-0733KL.step`, after checking it against the datasheet table (next section). The part is unmarked, so the model shows a plain top coat.++The page viewer shows `rc0402fr-0733kl-hero.glb`: the clean model plus nonphysical reference artwork drawn under it to the adom-hero+standard (adom/component-hero): the footprint's pads as teal dashed outlines at 50 % opacity, its silkscreen at 70 %+transparency and the pad numbers 1 and 2 (the terminals have no names). The part is non-polar, so no pin-1 dot is added.+The artwork never goes into the STEP, `package-reference.glb` or the board LODs.++![Hero preview, top and oblique](docs/verify/hero-preview.png)++::adom-models{src="/adom/rc0402fr-0733kl/render/models.json"}++## Model checked against the datasheet++The KiCad model was rendered in orthographic top, bottom, side and end views at true scale and laid over a drawing made+at the same scale from the printed table (nominal outline, tolerance limits, allowed terminal band). Every dimension is+inside the printed range: L 1.000 mm (datasheet 0.95 to 1.05), W 0.500 mm (datasheet 0.45 to 0.55), T/H 0.350 mm (datasheet 0.30 to 0.40), I1 (terminal on top) 0.165 mm (datasheet 0.10 to 0.30), I2 (terminal on bottom) 0.165 mm (datasheet 0.15 to 0.35). The model is Z-up, seated on z = 0, centred on the footprint origin, long axis on X.++![Model over the datasheet dimensions](docs/verify/rc0402fr-0733kl-overlay.png)++Source: YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.4 Table 1, RC0402: L 1.00 +/-0.05, W 0.50 +/-0.05, H 0.35 +/-0.05, I1 0.20 +/-0.10, I2 0.25 +/-0.10 (mm).++## Board levels of detail++Clean board-use GLBs (no footprint pads, outlines, labels or silkscreen) in four levels, all in the same Z-up, metre,+footprint-origin pose as the STEP. Previews are rendered from each GLB.++::adom-component-lod{src="/adom/rc0402fr-0733kl/render/lod/manifest.json"}++## CAD files++| File | What it is |+|---|---|+| `RC0402FR-0733KL.kicad_sym` | KiCad symbol (standard resistor graphic, pins on the 2.54 mm grid) with MPN, Manufacturer, Mouser, DigiKey and LCSC fields |+| `R_0402_1005Metric_RC0402FR-0733KL.kicad_mod` | KiCad footprint (KiCad library `R_0402_1005Metric`, renamed; model path `${KIPRJMOD}/RC0402FR-0733KL.step`) |+| `RC0402FR-0733KL.lbr` | Fusion / EAGLE library made with `adom-lbr generate` (attributes MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN, LCSC_PN) |+| `altium/RC0402FR-0733KL.SchLib`, `altium/RC0402FR-0733KL.PcbLib` | Altium symbol and footprint libraries (native binary) made with `adom-lbr import-kicad` and `assemble-altium` (the PcbLib embeds the STEP body); `RC0402FR-0733KL.adom-lbr.json` is the adom-lbr hub record |+| `RC0402FR-0733KL.step` | 3D package model, STEP (KiCad library bytes) |+| `package-reference.glb` | 3D package model, GLB (clean, for board viewers) |+| `rc0402fr-0733kl-hero.glb` | the page's 3D view: package plus footprint pad outlines, silkscreen and pad labels |+| `lod/` | board-use GLBs in four levels of detail, with previews and manifest |++## Datasheet figures++The pages this record cites, cropped from the PDFs:++| Figure | Source |+|---|---|+| [p.4 Fig. 9 outline and Table 1 dimensions](docs/figures/rc-p04-dimensions.png) | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.4 |+| [p.5 Table 2 electrical characteristics (RC0402, RC0603)](docs/figures/rc-p05-table2.png) | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.5 |+| [p.3 Marking (RC0402 no marking; RC0603 codes)](docs/figures/rc-p03-marking.png) | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.3 |+| [p.7 power rating, derating and rated voltage formula](docs/figures/rc-p07-power-voltage.png) | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.7 |+| [p.7 Table 4 packing quantity](docs/figures/rc-p07-packing.png) | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.7 |+| [p.9 Table 5 short time overload test](docs/figures/rc-p09-short-time-overload.png) | YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025, p.9 |+| [Mounting V.10 p.4 Fig. 4 and Table 1 reflow footprint](docs/figures/mount-p04-land.png) | YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018, p.4 |++## Sources and license++- YAGEO: YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025 (https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L)+- YAGEO: YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018 (https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf)+- KiCad libraries: [Resistor_SMD.pretty/R_0402_1005Metric.kicad_mod](https://gitlab.com/kicad/libraries/kicad-footprints/-/blob/master/Resistor_SMD.pretty/R_0402_1005Metric.kicad_mod), [Resistor_SMD.3dshapes/R_0402_1005Metric.step](https://gitlab.com/kicad/libraries/kicad-packages3D/-/blob/master/Resistor_SMD.3dshapes/R_0402_1005Metric.step)+- Distributor numbers: Mouser, DigiKey and JLCPCB/LCSC through the Adom parts search, 2026-10-21++Original Adom content is CC-BY-4.0. The KiCad footprint and 3D files keep their upstream license (CC-BY-SA 4.0 with the+KiCad library exception) and the PDFs remain YAGEO's documents; see [LICENSE](LICENSE).+[provenance.json](provenance.json) records every source and file hash; the scripts that built the checks are in `provenance/tools/`.++This is a catalog record for the part, not a manufacturing approval: check YAGEO's current datasheet for your design.
R_0402_1005Metric_RC0402FR-0733KL.kicad_modadded+112
@@ -0,0 +1,112 @@+(footprint "R_0402_1005Metric_RC0402FR-0733KL"+	(version 20260206)+	(generator "kicad-footprint-generator")+	(layer "F.Cu")+	(descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC-7351 nominal, (Body size source: IPC-SM-782 page 72, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf)")+	(tags "resistor")+	(property "Reference" "REF**"+		(at 0 -1.17 0)+		(layer "F.SilkS")+		(effects+			(font+				(size 1 1)+				(thickness 0.15)+			)+		)+	)+	(property "Value" "R_0402_1005Metric"+		(at 0 1.17 0)+		(layer "F.Fab")+		(effects+			(font+				(size 1 1)+				(thickness 0.15)+			)+		)+	)+	(property "KiLib_Generator" "SMD_2terminal_chip_molded"+		(at 0 0 0)+		(layer "F.SilkS")+		(hide yes)+		(effects+			(font+				(size 1 1)+				(thickness 0.15)+			)+		)+	)+	(attr smd)+	(duplicate_pad_numbers_are_jumpers no)+	(fp_line+		(start -0.153641 -0.38)+		(end 0.153641 -0.38)+		(stroke+			(width 0.12)+			(type solid)+		)+		(layer "F.SilkS")+	)+	(fp_line+		(start -0.153641 0.38)+		(end 0.153641 0.38)+		(stroke+			(width 0.12)+			(type solid)+		)+		(layer "F.SilkS")+	)+	(fp_rect+		(start -0.93 -0.47)+		(end 0.93 0.47)+		(stroke+			(width 0.05)+			(type solid)+		)+		(fill no)+		(layer "F.CrtYd")+	)+	(fp_rect+		(start -0.525 -0.27)+		(end 0.525 0.27)+		(stroke+			(width 0.1)+			(type solid)+		)+		(fill no)+		(layer "F.Fab")+	)+	(fp_text user "${REFERENCE}"+		(at 0 0 0)+		(layer "F.Fab")+		(effects+			(font+				(size 0.26 0.26)+				(thickness 0.04)+			)+		)+	)+	(pad "1" smd roundrect+		(at -0.51 0)+		(size 0.54 0.64)+		(layers "F.Cu" "F.Mask" "F.Paste")+		(roundrect_rratio 0.25)+	)+	(pad "2" smd roundrect+		(at 0.51 0)+		(size 0.54 0.64)+		(layers "F.Cu" "F.Mask" "F.Paste")+		(roundrect_rratio 0.25)+	)+	(embedded_fonts no)+	(model "${KIPRJMOD}/RC0402FR-0733KL.step"+		(offset+			(xyz 0 0 0)+		)+		(scale+			(xyz 1 1 1)+		)+		(rotate+			(xyz 0 0 0)+		)+	)+)
altium/RC0402FR-0733KL.PcbLibadded
⋯ 1 unchanged line ⋯
altium/RC0402FR-0733KL.SchLibadded
⋯ 1 unchanged line ⋯
docs/figures/figures.jsonadded+93
@@ -0,0 +1,93 @@+[+ {+  "file": "docs/figures/rc-p04-dimensions.png",+  "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+  "page": 4,+  "crop_px_at_150dpi": [+   82,+   225,+   1155,+   1140+  ],+  "caption": "p.4 Fig. 9 outline and Table 1 dimensions",+  "sha256": "71e1467d41b570a2387327e40a2264b5a68e7eccfa817dd54b3ff8b73e39b7ea"+ },+ {+  "file": "docs/figures/rc-p05-table2.png",+  "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+  "page": 5,+  "crop_px_at_150dpi": [+   82,+   240,+   1155,+   1132+  ],+  "caption": "p.5 Table 2 electrical characteristics (RC0402, RC0603)",+  "sha256": "23a43c630e06a7e0f5a6205422f4e9533314cd16032d8e13e915a4ed2a2b2e2f"+ },+ {+  "file": "docs/figures/rc-p03-marking.png",+  "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+  "page": 3,+  "crop_px_at_150dpi": [+   82,+   225,+   1155,+   870+  ],+  "caption": "p.3 Marking (RC0402 no marking; RC0603 codes)",+  "sha256": "6b80b0d4a55888a66d359ec63185c72d476cd460c4e8ca12ceccbb86c80db48c"+ },+ {+  "file": "docs/figures/rc-p07-power-voltage.png",+  "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+  "page": 7,+  "crop_px_at_150dpi": [+   82,+   840,+   1155,+   1635+  ],+  "caption": "p.7 power rating, derating and rated voltage formula",+  "sha256": "c00ce948279a26f906d32ab2276e513bcd387538a226641caaa14a7b7b79d100"+ },+ {+  "file": "docs/figures/rc-p07-packing.png",+  "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+  "page": 7,+  "crop_px_at_150dpi": [+   82,+   180,+   1155,+   825+  ],+  "caption": "p.7 Table 4 packing quantity",+  "sha256": "df3920d86fe888f7aad9c023887979174a7b6a3a052d745ae4b7763de5294a55"+ },+ {+  "file": "docs/figures/rc-p09-short-time-overload.png",+  "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+  "page": 9,+  "crop_px_at_150dpi": [+   82,+   225,+   1155,+   675+  ],+  "caption": "p.9 Table 5 short time overload test",+  "sha256": "270641325e974369b823b4893ac3c850e358a50ce78b96905472462ece78036f"+ },+ {+  "file": "docs/figures/mount-p04-land.png",+  "document": "YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018",+  "page": 4,+  "crop_px_at_150dpi": [+   82,+   225,+   1155,+   1215+  ],+  "caption": "Mounting V.10 p.4 Fig. 4 and Table 1 reflow footprint",+  "sha256": "620e7784b500ceda6a856dc4b6457f27bf753071c87b86e1865f3761d18e2747"+ }+]\ No newline at end of file
docs/figures/mount-p04-land.pngadded
⋯ 1 unchanged line ⋯
docs/figures/rc-p03-marking.pngadded
⋯ 1 unchanged line ⋯
docs/figures/rc-p04-dimensions.pngadded
⋯ 1 unchanged line ⋯
docs/figures/rc-p05-table2.pngadded
⋯ 1 unchanged line ⋯
docs/figures/rc-p07-packing.pngadded
⋯ 1 unchanged line ⋯
docs/figures/rc-p07-power-voltage.pngadded
⋯ 1 unchanged line ⋯
docs/figures/rc-p09-short-time-overload.pngadded
⋯ 1 unchanged line ⋯
docs/hero.pngadded
⋯ 1 unchanged line ⋯
docs/models/package-reference-step.pngadded
⋯ 1 unchanged line ⋯
docs/models/step-plain.pngadded
⋯ 1 unchanged line ⋯
docs/rc0402fr-0733kl-datasheet.pdfadded
⋯ 1 unchanged line ⋯
docs/verify/hero-preview.pngadded
⋯ 1 unchanged line ⋯
docs/verify/rc0402fr-0733kl-check.jsonadded+51
@@ -0,0 +1,51 @@+{+ "step": "RC0402FR-0733KL.step",+ "bbox_mm": [+  -0.5,+  0.5,+  -0.25,+  0.25,+  -0.0,+  0.35+ ],+ "checks": [+  {+   "dim": "L",+   "model_mm": 1.0,+   "datasheet_min": 0.95,+   "datasheet_max": 1.05,+   "pass": true+  },+  {+   "dim": "W",+   "model_mm": 0.5,+   "datasheet_min": 0.45,+   "datasheet_max": 0.55,+   "pass": true+  },+  {+   "dim": "T/H",+   "model_mm": 0.35,+   "datasheet_min": 0.3,+   "datasheet_max": 0.39999999999999997,+   "pass": true+  },+  {+   "dim": "I1 (terminal on top)",+   "model_mm": 0.165,+   "datasheet_min": 0.1,+   "datasheet_max": 0.3,+   "pass": true+  },+  {+   "dim": "I2 (terminal on bottom)",+   "model_mm": 0.165,+   "datasheet_min": 0.15,+   "datasheet_max": 0.35,+   "pass": true+  }+ ],+ "z_up_seated_centred": true,+ "long_axis_x": true,+ "all_pass": true+}\ No newline at end of file
docs/verify/rc0402fr-0733kl-overlay.pngadded
⋯ 1 unchanged line ⋯
docs/yageo-chip-resistors-mounting-v10.pdfadded
⋯ 1 unchanged line ⋯
land-pattern/README.mdadded+33
@@ -0,0 +1,33 @@+# Land pattern check: RC0402FR-0733KL++The footprint on this page is KiCad's standard library footprint `Resistor_SMD:R_0402_1005Metric`, renamed to+`R_0402_1005Metric_RC0402FR-0733KL` so it can sit beside other parts in one library folder. The copper is unchanged.+This page compares those pads with the land pattern YAGEO recommends for reflow soldering.++![KiCad pads over YAGEO's land, true scale](land-pattern.png)++Grey is the part body at its datasheet nominal size, teal is the KiCad copper and the dashed amber outline is+YAGEO's recommended land at its printed nominal size.++## Numbers++| Dimension | KiCad footprint | YAGEO recommendation | Difference |+|---|---|---|---|+| gap between lands | 0.48 mm | 0.50 mm | -0.02 mm |+| land length | 0.54 mm | 0.50 mm | +0.04 mm |+| land width | 0.64 mm | 0.60 mm | +0.04 mm |+| overall length | 1.56 mm | 1.50 mm | +0.06 mm |++YAGEO's letters: A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters). YAGEO's placement accuracy for this size: +/-0.15 mm.++Source: YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402 ([PDF](../docs/yageo-chip-resistors-mounting-v10.pdf)).++![YAGEO Mounting V.10, p.4 Fig. 4 and Table 1](../docs/figures/mount-p04-land.png)++## Result++The KiCad pads are within 0.06 mm of every YAGEO value (YAGEO prints nominal values only, with a placement accuracy of +/-0.15 mm), so the footprint matches the maker's pattern for practical purposes.++KiCad pad centres are at +/-0.510 mm, pad size 0.54 x 0.64 mm,+rounded rectangle (corner ratio 0.25). The numbers are in [land-check.json](land-check.json); the drawing is made by+`provenance/tools/landcheck.py` from the footprint file and YAGEO's table.
land-pattern/land-check.jsonadded+45
@@ -0,0 +1,45 @@+{+ "footprint": "R_0402_1005Metric_RC0402FR-0733KL.kicad_mod",+ "kicad_library_footprint": "R_0402_1005Metric",+ "kicad": {+  "gap": 0.48,+  "len": 0.54,+  "wid": 0.64,+  "overall": 1.56+ },+ "maker_reference": {+  "gap": 0.5,+  "len": 0.5,+  "wid": 0.6,+  "overall": 1.5+ },+ "maker_source": "YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402",+ "maker_letters": "A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters)",+ "rows": [+  {+   "dim": "gap between lands",+   "kicad_mm": 0.48,+   "maker_nominal": 0.5,+   "difference_mm": -0.02+  },+  {+   "dim": "land length",+   "kicad_mm": 0.54,+   "maker_nominal": 0.5,+   "difference_mm": 0.04+  },+  {+   "dim": "land width",+   "kicad_mm": 0.64,+   "maker_nominal": 0.6,+   "difference_mm": 0.04+  },+  {+   "dim": "overall length",+   "kicad_mm": 1.56,+   "maker_nominal": 1.5,+   "difference_mm": 0.06+  }+ ],+ "all_within": null+}\ No newline at end of file
land-pattern/land-pattern-icon.pngadded
⋯ 1 unchanged line ⋯
land-pattern/land-pattern.pngadded
⋯ 1 unchanged line ⋯
lod/high.glbadded
⋯ 1 unchanged line ⋯
lod/high.pngadded
⋯ 1 unchanged line ⋯
lod/low.glbadded
⋯ 1 unchanged line ⋯
lod/low.pngadded
⋯ 1 unchanged line ⋯
lod/manifest.jsonadded+178
@@ -0,0 +1,178 @@+{+ "schema": "adom/component-lod@1",+ "mpn": "RC0402FR-0733KL",+ "upAxis": "Z",+ "units": "metres",+ "status": "candidate (AI-checked, not human-reviewed)",+ "purpose": "clean board-use component models: no footprint pads, outlines, labels or silkscreen; no marking (RC_L product specification V.14, p.3 'Marking')",+ "source": {+  "path": "RC0402FR-0733KL.step",+  "sha256": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+ },+ "sourceToDisplay": "uniform scale 0.001 (mm to m); no rotation, no translation; origin = footprint origin, seat z = 0",+ "generator": "lod.py (capencoder passives, OCCT via cadquery-ocp)",+ "removedHelpers": [],+ "levels": [+  {+   "level": "high",+   "path": "lod/high.glb",+   "sha256": "937b453eb265ddd04ca7a8c8304011d48f266ea8480694ebc583239a0d7cadba",+   "sizeBytes": 48096,+   "decodedBufferBytes": 45432,+   "triangles": 1076,+   "primitives": 3,+   "bounds": {+    "min": [+     -0.0005,+     -0.00025,+     -0.0+    ],+    "max": [+     0.0005,+     0.00025,+     0.00035+    ]+   },+   "approximation": {+    "method": "OCCT BRepMesh_IncrementalMesh",+    "linearDeflectionMm": 0.0005,+    "angularDeflectionRad": 0.1+   },+   "detailVisibility": {+    "virtualMpn": false,+    "note": "no marking: the datasheet specifies none"+   },+   "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+   "preview": {+    "path": "lod/high.png",+    "sha256": "c77bb7ab8e51c56701234d1ad3a31ba3f8fba39502af8987f769c07c2a9d2fc6",+    "sizeBytes": 10877,+    "width": 400,+    "height": 300,+    "view": "iso",+    "sourceLevelSha256": "937b453eb265ddd04ca7a8c8304011d48f266ea8480694ebc583239a0d7cadba"+   }+  },+  {+   "level": "medium",+   "path": "lod/medium.glb",+   "sha256": "f1a1e14478c0215d3650a8778ea37ac93f54a7c3d374c4746fa9c73f360173af",+   "sizeBytes": 17180,+   "decodedBufferBytes": 14520,+   "triangles": 340,+   "primitives": 3,+   "bounds": {+    "min": [+     -0.0005,+     -0.00025,+     -0.0+    ],+    "max": [+     0.0005,+     0.00025,+     0.00035+    ]+   },+   "approximation": {+    "method": "OCCT BRepMesh_IncrementalMesh",+    "linearDeflectionMm": 0.004,+    "angularDeflectionRad": 0.35+   },+   "detailVisibility": {+    "virtualMpn": false,+    "note": "no marking: the datasheet specifies none"+   },+   "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+   "preview": {+    "path": "lod/medium.png",+    "sha256": "4922b519a5c9290289005a1d7a7579aef44ea080b71a728cec2912571c41f2bd",+    "sizeBytes": 10916,+    "width": 400,+    "height": 300,+    "view": "iso",+    "sourceLevelSha256": "f1a1e14478c0215d3650a8778ea37ac93f54a7c3d374c4746fa9c73f360173af"+   }+  },+  {+   "level": "low",+   "path": "lod/low.glb",+   "sha256": "d37b55a8dfb67f15b654633a1aae33e2650ddf5c0f4a777162d6dfb02f6f17d0",+   "sizeBytes": 10448,+   "decodedBufferBytes": 7800,+   "triangles": 180,+   "primitives": 3,+   "bounds": {+    "min": [+     -0.0005,+     -0.00025,+     -0.0+    ],+    "max": [+     0.0005,+     0.00025,+     0.00035+    ]+   },+   "approximation": {+    "method": "OCCT BRepMesh_IncrementalMesh",+    "linearDeflectionMm": 0.02,+    "angularDeflectionRad": 0.9+   },+   "detailVisibility": {+    "virtualMpn": false,+    "note": "no marking: the datasheet specifies none"+   },+   "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+   "preview": {+    "path": "lod/low.png",+    "sha256": "764f3339c3ef28150147634f531733170410e7ff20dae5cbe4e08f7c6a5d862f",+    "sizeBytes": 10562,+    "width": 400,+    "height": 300,+    "view": "iso",+    "sourceLevelSha256": "d37b55a8dfb67f15b654633a1aae33e2650ddf5c0f4a777162d6dfb02f6f17d0"+   }+  },+  {+   "level": "super-low",+   "path": "lod/super-low.glb",+   "sha256": "67a651d5d26113d4f0178bcf5805d1b785a8a0a863e16285ac4e72402a8e7fef",+   "sizeBytes": 5232,+   "decodedBufferBytes": 2592,+   "triangles": 48,+   "primitives": 3,+   "bounds": {+    "min": [+     -0.0005,+     -0.00025,+     -0.0+    ],+    "max": [+     0.0005,+     0.00025,+     0.00035+    ]+   },+   "approximation": {+    "method": "per-material bounding boxes split at the part centre (terminals, body, overcoat)"+   },+   "detailVisibility": {+    "virtualMpn": false,+    "note": "no marking: the datasheet specifies none"+   },+   "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+   "preview": {+    "path": "lod/super-low.png",+    "sha256": "c2a08faf868f8206b0aae103dcd8bdc0e1681c68d87713e1174b1e26e8e77727",+    "sizeBytes": 7447,+    "width": 400,+    "height": 300,+    "view": "iso",+    "sourceLevelSha256": "67a651d5d26113d4f0178bcf5805d1b785a8a0a863e16285ac4e72402a8e7fef"+   }+  }+ ],+ "hints": [+  "All four levels share pose and units; super-low is boxes per material group, chosen for board overviews."+ ]+}\ No newline at end of file
lod/medium.glbadded
⋯ 1 unchanged line ⋯
lod/medium.pngadded
⋯ 1 unchanged line ⋯
lod/super-low.glbadded
⋯ 1 unchanged line ⋯
lod/super-low.pngadded
⋯ 1 unchanged line ⋯
models.jsonadded+146
@@ -0,0 +1,146 @@+{+ "schema": "adom/models@1",+ "part": "RC0402FR-0733KL",+ "models": [+  {+   "path": "RC0402FR-0733KL.step",+   "format": "step",+   "title": "Package model (STEP)",+   "status": "current",+   "slot": "step",+   "variant": "plain",+   "role": "derived",+   "use": [+    "board-cad"+   ],+   "marking": null,+   "unique": "The board CAD model: KiCad library package geometry (bytes unchanged), checked against the datasheet table, no marking (the part has none)",+   "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+   "sha256": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb",+   "git_blob": "7f0c353f8ebaa364e1f12149ab1768d9da85f02a",+   "bytes": 40756,+   "thumb": "docs/models/step-plain.png"+  },+  {+   "path": "package-reference.glb",+   "format": "glb",+   "title": "Package model (GLB)",+   "status": "current",+   "slot": "model_3d_plain",+   "variant": "plain",+   "role": "derived",+   "use": [+    "render",+    "board-insertion"+   ],+   "marking": null,+   "derived_from": "RC0402FR-0733KL.step",+   "unique": "Clean board-use model for viewers (step2glb), no footprint artwork",+   "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+   "sha256": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+   "git_blob": "da98434ac21cc7113fb563af37be5c23aebe32d0",+   "bytes": 15808+  },+  {+   "path": "rc0402fr-0733kl-hero.glb",+   "format": "glb",+   "title": "Hero model (GLB)",+   "status": "current",+   "slot": "model_3d",+   "variant": "hero",+   "role": "derived",+   "use": [+    "wiki-hero"+   ],+   "marking": null,+   "derived_from": "package-reference.glb",+   "unique": "The page's 3D view: the package plus teal dashed pad outlines, silkscreen and pad-number labels from the footprint (adom-hero standard)",+   "source": "component-hero hero_glb.py",+   "sha256": "ecd12e887d36afdf5b5d71b359abc14f5559acff956b4db489d4d7553a6dec83",+   "git_blob": "675752396cd723323770d6519ba31f606bd13ab5",+   "bytes": 36504,+   "thumb": "docs/verify/hero-preview.png"+  },+  {+   "path": "lod/high.glb",+   "format": "glb",+   "title": "Board LOD, high",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion",+    "render"+   ],+   "marking": null,+   "derived_from": "RC0402FR-0733KL.step",+   "unique": "high detail for board and scaffold viewers: 1076 triangles, 3 primitives",+   "thumb": "lod/high.png",+   "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+   "sha256": "937b453eb265ddd04ca7a8c8304011d48f266ea8480694ebc583239a0d7cadba",+   "git_blob": "b087d67a879e110382d1f0713439d7e93929c47f",+   "bytes": 48096+  },+  {+   "path": "lod/medium.glb",+   "format": "glb",+   "title": "Board LOD, medium",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion",+    "render"+   ],+   "marking": null,+   "derived_from": "RC0402FR-0733KL.step",+   "unique": "medium detail for board and scaffold viewers: 340 triangles, 3 primitives",+   "thumb": "lod/medium.png",+   "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+   "sha256": "f1a1e14478c0215d3650a8778ea37ac93f54a7c3d374c4746fa9c73f360173af",+   "git_blob": "6e40ecc664322fb3156a3c91b8e692a064b89776",+   "bytes": 17180+  },+  {+   "path": "lod/low.glb",+   "format": "glb",+   "title": "Board LOD, low",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion",+    "render"+   ],+   "marking": null,+   "derived_from": "RC0402FR-0733KL.step",+   "unique": "low detail for board and scaffold viewers: 180 triangles, 3 primitives",+   "thumb": "lod/low.png",+   "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+   "sha256": "d37b55a8dfb67f15b654633a1aae33e2650ddf5c0f4a777162d6dfb02f6f17d0",+   "git_blob": "b372aeee77529a4681d8c2af9bd80cf05a841a41",+   "bytes": 10448+  },+  {+   "path": "lod/super-low.glb",+   "format": "glb",+   "title": "Board LOD, super-low",+   "status": "current",+   "variant": "lod",+   "role": "derived",+   "use": [+    "board-insertion",+    "render"+   ],+   "marking": null,+   "derived_from": "RC0402FR-0733KL.step",+   "unique": "super-low detail for board and scaffold viewers: 48 triangles, 3 primitives",+   "thumb": "lod/super-low.png",+   "source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+   "sha256": "67a651d5d26113d4f0178bcf5805d1b785a8a0a863e16285ac4e72402a8e7fef",+   "git_blob": "16eaa804902c802aae719c01456920b5e329d5f1",+   "bytes": 5232+  }+ ],+ "updated": "2026-10-21"+}\ No newline at end of file
package-reference.glbadded
⋯ 1 unchanged line ⋯
package.jsonadded+10
@@ -0,0 +1,10 @@+{+ "name": "rc0402fr-0733kl",+ "title": "RC0402FR-0733KL - YAGEO",+ "version": "0.1.0",+ "description": "Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)",+ "type": "hardware",+ "kind": "component",+ "license": "CC-BY-4.0",+ "files": []+}\ No newline at end of file
provenance.jsonadded+307
@@ -0,0 +1,307 @@+{+ "manufacturer_reference": "https://yageogroup.com/products/productDetail/RC0402FR-0733KL",+ "symbol_source": "Original, written for this page (standard resistor graphic, non-polar, pin ends on the 2.54 mm grid). CC-BY-4.0.",+ "footprint_source": "KiCad standard library Resistor_SMD:R_0402_1005Metric (CC-BY-SA 4.0 with the KiCad library exception); renamed R_0402_1005Metric -> R_0402_1005Metric_RC0402FR-0733KL, model path set to ${KIPRJMOD}/RC0402FR-0733KL.step; copper unchanged",+ "footprint_upstream_sha256": "e05c7605248c220836f642ed1f526133edf0374acdfd5bb2631e58b4e377acfb",+ "footprint_upstream_url": "https://gitlab.com/kicad/libraries/kicad-footprints/-/raw/master/Resistor_SMD.pretty/R_0402_1005Metric.kicad_mod",+ "package_source": "KiCad packages3D Resistor_SMD.3dshapes/R_0402_1005Metric.step (CC-BY-SA 4.0 with the KiCad library exception)",+ "package_upstream_url": "https://gitlab.com/kicad/libraries/kicad-packages3D/-/raw/master/Resistor_SMD.3dshapes/R_0402_1005Metric.step",+ "package_upstream_sha256": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb",+ "package_bytes_unchanged": true,+ "manufacturer_step": {+  "found": false,+  "searched": "2026-10-21",+  "note": "The YAGEO product page (https://yageogroup.com/products/productDetail/RC0402FR-0733KL) was fetched by plain HTTP: it contains no STEP, STP or CAD-model link (its CAD links are built in the browser). No browser was used, so KiCad's library model was used and checked against the datasheet."+ },+ "geometry_status": "KiCad library package geometry, every printed dimension checked against the datasheet (docs/verify). Not manufacturer-issued CAD.",+ "marking": {+  "real_marking": null,+  "statement": "YAGEO states 'No Marking' for RC0402 (Fig. 1)",+  "source": "RC_L product specification V.14, p.3 'Marking'"+ },+ "frame": {+  "units": "mm (STEP), metres (GLB)",+  "up_axis": "Z",+  "seat_z": 0,+  "origin": "footprint origin",+  "transform": "none"+ },+ "glb": {+  "tool": "step2glb convert",+  "source": "RC0402FR-0733KL.step",+  "exit": 0,+  "stderr_tail": "Large file queued for async conversion (job 02a1d08a12f9faa0). Polling...\nJob 02a1d08a12f9faa0 complete (0s). Downloading GLB...\n"+ },+ "hero_image": {+  "tool": "step2glb thumbnail --width 1600 --height 1000 (iso, 16:10)",+  "source": "RC0402FR-0733KL.step",+  "path": "docs/hero.png"+ },+ "hero_glb": {+  "file": "rc0402fr-0733kl-hero.glb",+  "tool": "adom/component-hero skills/component-hero/scripts/hero_glb.py",+  "tool_sha256": "429e437a3f2e5f1dc3544fe65843ea4e019637f0a6163060cda2ae210f3af7bc",+  "inputs": [+   "package-reference.glb",+   "R_0402_1005Metric_RC0402FR-0733KL.kicad_mod",+   "page.json"+  ],+  "result": "OK rc0402fr-0733kl-hero.glb: pads 2, silk items 2, pin1 none, labels 2; align OK (offset 0.0 mm)",+  "sha256": "ecd12e887d36afdf5b5d71b359abc14f5559acff956b4db489d4d7553a6dec83"+ },+ "fusion_lbr": {+  "file": "RC0402FR-0733KL.lbr",+  "tool": "adom-lbr 2.47.5",+  "command": "adom-lbr generate --sym RC0402FR-0733KL.kicad_sym --fp R_0402_1005Metric_RC0402FR-0733KL.kicad_mod --part-metadata page.json -o RC0402FR-0733KL.lbr",+  "lint": {+   "passed": true,+   "errors": 0,+   "warnings": 0+  },+  "sha256": "743fe29cb17bc8b2b7bd1ffb2065ab10c72cdf88e2abc6a9e71b8a2b4f308fbb"+ },+ "altium": {+  "files": [+   "altium/RC0402FR-0733KL.SchLib",+   "altium/RC0402FR-0733KL.PcbLib",+   "RC0402FR-0733KL.adom-lbr.json"+  ],+  "commands": [+   "adom-lbr import-kicad --sym RC0402FR-0733KL.kicad_sym --fp R_0402_1005Metric_RC0402FR-0733KL.kicad_mod --mpn RC0402FR-0733KL --out RC0402FR-0733KL.adom-lbr.json",+   "adom-lbr assemble-altium --no-dedupe --out altium/RC0402FR-0733KL RC0402FR-0733KL.adom-lbr.json"+  ],+  "report": {+   "_hint": "components are named by MPN; identical land patterns share one footprint. skipped[] is the complete drop list, never silent. lostFeatures[] names what the Altium lane could not carry (warn and ship); under --strict those parts move to refused[] and skipped[], the rest still assemble, status is partial and the exit code 2 while the files written stay valid.",+   "components": 1,+   "deduped": [],+   "footprints": 1,+   "lostFeatures": [],+   "models": {+    "embedded": 1,+    "missing": []+   },+   "pcblib": "altium/RC0402FR-0733KL.PcbLib",+   "refused": [],+   "renamed": [],+   "schlib": "altium/RC0402FR-0733KL.SchLib",+   "skipped": [],+   "status": "ok"+  },+  "hints": [+   "HINT: identity complete (MPN, Manufacturer, Datasheet, Description, Mouser, DigiKey, LCSC, Adom Wiki) - they become Altium parameters + Supplier links and EAGLE attributes."+  ],+  "sha256": {+   "altium/RC0402FR-0733KL.SchLib": "b2bfe1a45b7d703533b0362284a83835e7c57afbdc6d15516562ecb5546b5f42",+   "altium/RC0402FR-0733KL.PcbLib": "55b89e4781a382eda765f2f7d2fdc17305c955aa2b2afa9560ad132e0be78302",+   "RC0402FR-0733KL.adom-lbr.json": "6e90f7d7e0ea41520f00ceda7e45b5bc11a5068833ff34b22b4a5e564cb01c2b"+  }+ },+ "datasheet": {+  "file": "docs/rc0402fr-0733kl-datasheet.pdf",+  "sha256": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb",+  "url": "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L",+  "title": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+  "retrieved": "2026-10-21"+ },+ "supporting_documents": [+  {+   "file": "docs/yageo-chip-resistors-mounting-v10.pdf",+   "sha256": "591634ace247f61e9c6a263ca1ac98d7672fc163f5e87334c3460956f5c68b7b",+   "url": "https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf",+   "title": "YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018",+   "retrieved": "2026-10-21"+  }+ ],+ "datasheet_figures": [+  {+   "file": "docs/figures/rc-p04-dimensions.png",+   "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+   "page": 4,+   "crop_px_at_150dpi": [+    82,+    225,+    1155,+    1140+   ],+   "caption": "p.4 Fig. 9 outline and Table 1 dimensions",+   "sha256": "71e1467d41b570a2387327e40a2264b5a68e7eccfa817dd54b3ff8b73e39b7ea"+  },+  {+   "file": "docs/figures/rc-p05-table2.png",+   "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+   "page": 5,+   "crop_px_at_150dpi": [+    82,+    240,+    1155,+    1132+   ],+   "caption": "p.5 Table 2 electrical characteristics (RC0402, RC0603)",+   "sha256": "23a43c630e06a7e0f5a6205422f4e9533314cd16032d8e13e915a4ed2a2b2e2f"+  },+  {+   "file": "docs/figures/rc-p03-marking.png",+   "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+   "page": 3,+   "crop_px_at_150dpi": [+    82,+    225,+    1155,+    870+   ],+   "caption": "p.3 Marking (RC0402 no marking; RC0603 codes)",+   "sha256": "6b80b0d4a55888a66d359ec63185c72d476cd460c4e8ca12ceccbb86c80db48c"+  },+  {+   "file": "docs/figures/rc-p07-power-voltage.png",+   "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+   "page": 7,+   "crop_px_at_150dpi": [+    82,+    840,+    1155,+    1635+   ],+   "caption": "p.7 power rating, derating and rated voltage formula",+   "sha256": "c00ce948279a26f906d32ab2276e513bcd387538a226641caaa14a7b7b79d100"+  },+  {+   "file": "docs/figures/rc-p07-packing.png",+   "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+   "page": 7,+   "crop_px_at_150dpi": [+    82,+    180,+    1155,+    825+   ],+   "caption": "p.7 Table 4 packing quantity",+   "sha256": "df3920d86fe888f7aad9c023887979174a7b6a3a052d745ae4b7763de5294a55"+  },+  {+   "file": "docs/figures/rc-p09-short-time-overload.png",+   "document": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025",+   "page": 9,+   "crop_px_at_150dpi": [+    82,+    225,+    1155,+    675+   ],+   "caption": "p.9 Table 5 short time overload test",+   "sha256": "270641325e974369b823b4893ac3c850e358a50ce78b96905472462ece78036f"+  },+  {+   "file": "docs/figures/mount-p04-land.png",+   "document": "YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018",+   "page": 4,+   "crop_px_at_150dpi": [+    82,+    225,+    1155,+    1215+   ],+   "caption": "Mounting V.10 p.4 Fig. 4 and Table 1 reflow footprint",+   "sha256": "620e7784b500ceda6a856dc4b6457f27bf753071c87b86e1865f3761d18e2747"+  }+ ],+ "datasheet_check": {+  "overlay": "docs/verify/rc0402fr-0733kl-overlay.png",+  "numbers": "docs/verify/rc0402fr-0733kl-check.json",+  "tools": "provenance/tools/ (ortho.py, overlay_chip.py, spec json)",+  "result": "PASS"+ },+ "land_pattern_check": {+  "readme": "land-pattern/README.md",+  "numbers": "land-pattern/land-check.json",+  "source": "YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402",+  "result": "matches"+ },+ "distributors": {+  "tool": "adom-parts-search search RC0402FR-0733KL",+  "date": "2026-10-21",+  "mouser": {+   "part": "603-RC0402FR-0733KL",+   "url": "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-0733KL?qs=OLdA50ig9KgSAim5D6WRlA%3D%3D",+   "stock": 669292+  },+  "digikey": {+   "part": "311-33.0KLRTR-ND",+   "url": "https://www.digikey.com/en/products/detail/yageo/RC0402FR-0733KL/726592",+   "stock": 977588+  },+  "lcsc": {+   "part": "C138003",+   "url": "https://www.lcsc.com/product-detail/C138003.html",+   "stock": 811894+  }+ },+ "lod": {+  "manifest": "lod/manifest.json",+  "generator": "provenance/tools/lod.py",+  "source": "RC0402FR-0733KL.step",+  "source_sha256": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+ },+ "tools_note": "Scripts come from the rc0402fr-074k7l page (adom/rc0402fr-074k7l). Changes for this page: the ortho.py end view and the lod.py iso preview were mirror images (left-handed axes) and are corrected; lod.py keeps a datasheet marking in high and medium, drops it in low and super-low, splits the terminal colour into two boxes and stops the body box under the top coat in super-low; build.py puts the symbol pins on the 2.54 mm grid and adds the marking (etch.py) and the figure crops (figures.py); finish.py makes the .lbr, the Altium libraries and the hero GLB.",+ "files": {+  "RC0402FR-0733KL.adom-lbr.json": "6e90f7d7e0ea41520f00ceda7e45b5bc11a5068833ff34b22b4a5e564cb01c2b",+  "RC0402FR-0733KL.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb",+  "verification.json": "2e80e8be29049da911f2ec874f988009bf50f537a8c3cdf72523f2b9936833d2",+  "R_0402_1005Metric_RC0402FR-0733KL.kicad_mod": "242f3a3163eb083e2cc58df4da995ddab3d506f17c39d1b8d75b3a7b42a53174",+  "RC0402FR-0733KL.lbr": "743fe29cb17bc8b2b7bd1ffb2065ab10c72cdf88e2abc6a9e71b8a2b4f308fbb",+  "package-reference.glb": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+  "package.json": "5e67359dae065006d7ea0137a755012fcf3efc7aa0a089486592ba16dadcdabd",+  "rc0402fr-0733kl-hero.glb": "ecd12e887d36afdf5b5d71b359abc14f5559acff956b4db489d4d7553a6dec83",+  "models.json": "4f184db2ae00f214b1bc486bb98f9abb0c1f6f6db4d521215af9a3253d743172",+  "LICENSE": "ce2e867c882241ee45d9f06834f0acb7f7d73012f49a78df1ea3e3feb8dfe576",+  "page.json": "72570f650f722fd26aa9f83c615ce2a4d522686f0d0efd9870ad7e1ad19e7e9d",+  "RC0402FR-0733KL.kicad_sym": "90937c1a36ef828412cc7dadd03cdcf51258c630ec214d45526fe6e5ced2f236",+  "rc0402fr-0733kl-hero.overlay.json": "ce4edf97a8b9fabfef3591cb2035f4fd05591b418038f2f74029c35dde313550",+  "README.md": "8664ffe8a8ed461a88e97bfb4e17c7cef319c21c52e9f11917ff87c65a3c4d7a",+  "provenance/tools/finish.py": "ea10d85df457e2ade2d3bccc93fdf58f780ba010e60d3cb8732de7ccbd731234",+  "provenance/tools/rc0402fr-0733kl-overlay-spec.json": "2a3caf90e9d05dcaf34f433f4b5eeac18bc59d2b6c5b55a6eb54d6e7cf4f0877",+  "provenance/tools/figures.py": "cfa77ac8148c05ce41d08fae12493c19c90792eb848b510b97a5d10a01b12b78",+  "provenance/tools/parts.py": "b6f26119adb3c79f9a7b11ba8a6ee98d717dd9e2cb8fef01580f11b761f13fe5",+  "provenance/tools/records.py": "8afed86d0d62cdf45e0d4d0a323aca6a63dee1a17f0499697fe71c18da3ed815",+  "provenance/tools/landcheck.py": "a6141dcaa4992652e0caf3a7fdd51dcf8451fd630b7de7b873d1b910ae4a1d41",+  "provenance/tools/overlay_chip.py": "52617a63c9504e020e574ec63f39f518734032fcda7b14ad158e3f8907b31723",+  "provenance/tools/ortho.py": "9d1d3f7553bbcf068f7f0769e2431aef89490f5018b2b93dad743aa2088212b9",+  "provenance/tools/lod.py": "98ac419e109fd403ef9522048530bc2f71147c196bab1dc9d5cda12fc2cd8b06",+  "provenance/tools/etch.py": "c97cc093debd539414c2d7ea84cdb838cd94a307787d6307ccc12a7a7f2c022f",+  "provenance/tools/build.py": "d8daa503a6ab1c4552c3183ed7f5f1b3767f4ab3e212eb78545f568c00be0124",+  "lod/low.png": "764f3339c3ef28150147634f531733170410e7ff20dae5cbe4e08f7c6a5d862f",+  "lod/super-low.png": "c2a08faf868f8206b0aae103dcd8bdc0e1681c68d87713e1174b1e26e8e77727",+  "lod/low.glb": "d37b55a8dfb67f15b654633a1aae33e2650ddf5c0f4a777162d6dfb02f6f17d0",+  "lod/high.png": "c77bb7ab8e51c56701234d1ad3a31ba3f8fba39502af8987f769c07c2a9d2fc6",+  "lod/manifest.json": "96436d682c449c4f371e1857884863619ed72919bc5c2781f7c7d035a2bf6f55",+  "lod/super-low.glb": "67a651d5d26113d4f0178bcf5805d1b785a8a0a863e16285ac4e72402a8e7fef",+  "lod/medium.glb": "f1a1e14478c0215d3650a8778ea37ac93f54a7c3d374c4746fa9c73f360173af",+  "lod/high.glb": "937b453eb265ddd04ca7a8c8304011d48f266ea8480694ebc583239a0d7cadba",+  "lod/medium.png": "4922b519a5c9290289005a1d7a7579aef44ea080b71a728cec2912571c41f2bd",+  "docs/rc0402fr-0733kl-datasheet.pdf": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb",+  "docs/yageo-chip-resistors-mounting-v10.pdf": "591634ace247f61e9c6a263ca1ac98d7672fc163f5e87334c3460956f5c68b7b",+  "docs/hero.png": "9c403dd3dcb30ba7ebf8eec15f50cc837162292c0df4ab9d81cfd5c18c020850",+  "docs/models/step-plain.png": "aa00bd27011a835eaf7b224d87bb73bbaea48c7cd7a74bd3db28bf99701e9f1a",+  "docs/models/package-reference-step.png": "aa00bd27011a835eaf7b224d87bb73bbaea48c7cd7a74bd3db28bf99701e9f1a",+  "docs/verify/rc0402fr-0733kl-overlay.png": "d78375f83164b49482a020786d04e4c7bdb5a0736f221375b5f57331e6dce562",+  "docs/verify/rc0402fr-0733kl-check.json": "004fce4ba41776d2445849d251cd145ec2e4a86337566e02b9beb658353f7697",+  "docs/verify/hero-preview.png": "005952084dfd68c19f9a50febed6b4ad2f2c2e3a552131c38d9647289f95ed7a",+  "docs/figures/rc-p09-short-time-overload.png": "270641325e974369b823b4893ac3c850e358a50ce78b96905472462ece78036f",+  "docs/figures/mount-p04-land.png": "620e7784b500ceda6a856dc4b6457f27bf753071c87b86e1865f3761d18e2747",+  "docs/figures/rc-p07-packing.png": "df3920d86fe888f7aad9c023887979174a7b6a3a052d745ae4b7763de5294a55",+  "docs/figures/rc-p04-dimensions.png": "71e1467d41b570a2387327e40a2264b5a68e7eccfa817dd54b3ff8b73e39b7ea",+  "docs/figures/rc-p03-marking.png": "6b80b0d4a55888a66d359ec63185c72d476cd460c4e8ca12ceccbb86c80db48c",+  "docs/figures/figures.json": "4a96840c7f6946b0c90f5e1e13a993f89dc354abd881af00b9d7944d7e2a6e21",+  "docs/figures/rc-p05-table2.png": "23a43c630e06a7e0f5a6205422f4e9533314cd16032d8e13e915a4ed2a2b2e2f",+  "docs/figures/rc-p07-power-voltage.png": "c00ce948279a26f906d32ab2276e513bcd387538a226641caaa14a7b7b79d100",+  "land-pattern/land-check.json": "57308cb9e873b28e679448dc1d83155237328c7322870daa21e5f835c270650d",+  "land-pattern/land-pattern-icon.png": "255beb3065f724af41332fcc126d4c20ed52f6ebbe76aee1942f4362ed6edabe",+  "land-pattern/land-pattern.png": "8e830e8c1b02844051e0553bc248adead54aa3b93d14076133d0101d81e45fce",+  "land-pattern/README.md": "39d13d1c8c444ee6e8f1be8b23304826fc55ae8d55fa78dfc2151739a2060b9c",+  "altium/RC0402FR-0733KL.PcbLib": "55b89e4781a382eda765f2f7d2fdc17305c955aa2b2afa9560ad132e0be78302",+  "altium/RC0402FR-0733KL.SchLib": "b2bfe1a45b7d703533b0362284a83835e7c57afbdc6d15516562ecb5546b5f42"+ },+ "files_note": "provenance.json itself is not listed.",+ "built_by": "Claude (AI agent) for John Lauer",+ "date": "2026-10-21"+}\ No newline at end of file
provenance/tools/build.pyadded+161
@@ -0,0 +1,161 @@+"""Build one component page tree per part in parts.PARTS.++usage: build.py <slug> [--skip-remote]+Writes /tmp/claude-1001/passives5/pages/<slug>/ . Downloads are read from+/tmp/claude-1001/passives5/dl (never executed); scripts live in this folder.+"""+import sys, os, json, shutil, subprocess, hashlib, re+import numpy as np+from PIL import Image, ImageDraw, ImageFont++ROOT = "/tmp/claude-1001/esc3"+TOOLS = os.path.join(ROOT, "tools")+DL = os.path.join(ROOT, "dl")+PY = "/home/adom/.venvs/cq/bin/python"+sys.path.insert(0, TOOLS)+from parts import PARTS, TODAY++slug = sys.argv[1]+P = next(p for p in PARTS if p["slug"] == slug)+OUT = os.path.join(ROOT, "pages", slug)+os.makedirs(OUT, exist_ok=True)+MPN = P["mpn"]+sha = lambda f: hashlib.sha256(open(f, "rb").read()).hexdigest()+def gitblob(f):+    b = open(f, "rb").read()+    return hashlib.sha1(b"blob %d\0" % len(b) + b).hexdigest()+def run(cmd, **kw):+    r = subprocess.run(cmd, capture_output=True, text=True, **kw)+    if r.returncode != 0:+        print("FAILED", cmd, r.stdout[-2000:], r.stderr[-2000:]); sys.exit(1)+    return r+F = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"+FB = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"++for d in ("docs/verify", "docs/models", "docs/figures", "lod", "provenance/tools", "land-pattern", "altium"):+    os.makedirs(os.path.join(OUT, d), exist_ok=True)++# ---------- STEP (KiCad library bytes, unchanged) ----------+src_step = os.path.join(DL, "kicad", P["fp"] + ".step")+step_name = f"{MPN}.step"+step_path = os.path.join(OUT, step_name)+shutil.copyfile(src_step, step_path)+assert sha(step_path) == sha(src_step)++# ---------- footprint (KiCad library geometry, renamed + local model path) ----------+fp_name = f"{P['fp']}_{MPN}"+src_fp = open(os.path.join(DL, "kicad", P["fp"] + ".kicad_mod")).read()+fp = src_fp.replace(f'(footprint "{P["fp"]}"', f'(footprint "{fp_name}"', 1)+fp = re.sub(r'\(model "[^"]+"', f'(model "${{KIPRJMOD}}/{step_name}"', fp)+assert fp.count(fp_name) == 1 and "${KIPRJMOD}/" + step_name in fp+fp_file = f"{fp_name}.kicad_mod"+open(os.path.join(OUT, fp_file), "w").write(fp)+pads = [(float(a), float(b), float(c), float(d)) for a, b, c, d in+        re.findall(r'\(pad "\d" smd roundrect\s*\(at ([-\d.]+) ([-\d.]+)\)\s*\(size ([\d.]+) ([\d.]+)\)', fp)]+assert len(pads) == 2, pads++# ---------- symbol (original, conventional passive graphics) ----------+d = P["dist"]+def prop(name, val, y, hide=True):+    h = " hide" if hide else ""+    return f'    (property "{name}" "{val}" (at 0 {y} 0) (effects (font (size 1.27 1.27)){h}))\n'+ref = P["kind"]+desc = P["brief"]+props = (prop("Reference", ref, 0 if False else 0, False).replace("(at 0 0 0)", "(at 2.54 1.27 0)").replace("(font (size 1.27 1.27))", "(font (size 1.27 1.27)) (justify left)")+         + prop("Value", P["value_sym"], 0, False).replace("(at 0 0 0)", "(at 2.54 -1.27 0)").replace("(font (size 1.27 1.27))", "(font (size 1.27 1.27)) (justify left)")+         + prop("Footprint", fp_name, -7.62) + prop("Datasheet", P["ds"]["url"], -10.16) + prop("Description", desc, -12.7)+         + prop("MPN", MPN, -15.24) + prop("Manufacturer", P["mfr"], -17.78)+         + prop("Mouser", d["mouser"][0], -20.32) + prop("DigiKey", d["digikey"][0], -22.86) + prop("LCSC", d["lcsc"][0], -25.4) + prop("Adom Wiki", f"https://wiki.adom.inc/adom/{slug}", -27.94))+if ref == "C":+    body = ('      (polyline (pts (xy -2.032 -0.762) (xy 2.032 -0.762)) (stroke (width 0.508) (type default)) (fill (type none)))\n'+            '      (polyline (pts (xy -2.032 0.762) (xy 2.032 0.762)) (stroke (width 0.508) (type default)) (fill (type none)))\n')+    plen = 2.794+else:+    body = '      (rectangle (start -1.016 -2.54) (end 1.016 2.54) (stroke (width 0.254) (type default)) (fill (type none)))\n'+    plen = 2.54+sym = f'''(kicad_symbol_lib (version 20241209) (generator "adom_passive_symbol")+  (symbol "{MPN}" (pin_numbers (hide yes)) (pin_names (offset 0.254) (hide yes)) (exclude_from_sim no) (in_bom yes) (on_board yes)+{props}    (property "ki_keywords" "{P['category'].lower()} {P['package'].split()[0]} {MPN}" (at 0 0 0) (effects (font (size 1.27 1.27)) hide))+    (symbol "{MPN}_0_1"+{body}    )+    (symbol "{MPN}_1_1"+      (pin passive line (at 0 5.08 270) (length {plen}) (name "~" (effects (font (size 1.27 1.27)))) (number "1" (effects (font (size 1.27 1.27)))))+      (pin passive line (at 0 -5.08 90) (length {plen}) (name "~" (effects (font (size 1.27 1.27)))) (number "2" (effects (font (size 1.27 1.27)))))+    )+  )+)+'''+sym_file = f"{MPN}.kicad_sym"+open(os.path.join(OUT, sym_file), "w").write(sym)++# ---------- datasheets ----------+shutil.copyfile(os.path.join(DL, P["ds"]["local"]), os.path.join(OUT, P["ds"]["file"]))+for x in P["extra_docs"]:+    shutil.copyfile(os.path.join(DL, x["local"]), os.path.join(OUT, x["file"]))++# ---------- tools copied into provenance ----------+for t in ("lod.py", "ortho.py", "overlay_chip.py", "build.py", "parts.py", "landcheck.py", "records.py", "finish.py", "figures.py", "etch.py"):+    if os.path.exists(os.path.join(TOOLS, t)):+        shutil.copyfile(os.path.join(TOOLS, t), os.path.join(OUT, "provenance/tools", t))++# ---------- overlay proof against the datasheet table ----------+ov = dict(P["overlay"])+crop_png, box = ov.pop("crop")+spec = {"label": MPN, "mpn": MPN, **ov, "crops": [[os.path.join(ROOT, "work/crops", crop_png), box]],+        "marking": (f"datasheet code {P['marking_code']} on the marked display copy; this check measures the unmarked STEP" if P.get("marking_code") else "none specified (" + P["marking_src"] + ")")}+spec_path = os.path.join(OUT, f"provenance/tools/{slug}-overlay-spec.json")+spec_pub = dict(spec); spec_pub["crops"] = [[f"datasheet page render ({crop_png}, 100 dpi)", box]]+json.dump(spec_pub, open(spec_path, "w"), indent=1)+tmp_spec = os.path.join(ROOT, "work", f"{slug}-spec.json"); json.dump(spec, open(tmp_spec, "w"))+r = run([PY, "-I", os.path.join(TOOLS, "overlay_chip.py"), tmp_spec, step_path, os.path.join(OUT, f"docs/verify/{slug}-overlay.png")], cwd=TOOLS)+check = json.loads(r.stdout.strip().splitlines()[-1]); check["step"] = step_name+json.dump(check, open(os.path.join(OUT, f"docs/verify/{slug}-check.json"), "w"), indent=1)+print("overlay all_pass:", check["all_pass"])+if not check["all_pass"]:+    print(json.dumps(check, indent=1)); sys.exit(2)++# ---------- land pattern comparison (KiCad pads vs maker's recommendation) ----------+r = run([PY, "-I", os.path.join(TOOLS, "landcheck.py"), slug, os.path.join(OUT, "land-pattern")], cwd=TOOLS)+land = json.loads(r.stdout.strip().splitlines()[-1])+json.dump(land, open(os.path.join(OUT, "land-pattern/land-check.json"), "w"), indent=1)++# ---------- datasheet marking (RC0603): marked display STEP via the step2glb laser-etch service ----------+disp_step = step_path; marked_name = None; etch_info = None+if P.get("marking_code"):+    marked_name = f"{MPN}-marked.step"+    r = run(["python3", "-I", os.path.join(TOOLS, "etch.py"), step_path, P["marking_code"], os.path.join(OUT, marked_name), slug])+    etch_info = json.loads(r.stdout.strip().splitlines()[-1])+    disp_step = os.path.join(OUT, marked_name)++# ---------- GLB (step2glb) ----------+glb_path = os.path.join(OUT, "package-reference.glb")+g = subprocess.run(["step2glb", "convert", disp_step, "-o", glb_path], capture_output=True, text=True)+print("step2glb exit", g.returncode, g.stderr[-300:])+assert g.returncode == 0 and os.path.getsize(glb_path) > 1000++# ---------- thumbnails (service render of the STEP) ----------+def thumb(out, wh=None):+    extra = ["--width", str(wh[0]), "--height", str(wh[1])] if wh else []+    t = subprocess.run(["step2glb", "thumbnail", disp_step, "-o", out] + extra, capture_output=True, text=True)+    return t.returncode, (t.stdout + t.stderr)[-300:]+hero_rc = thumb(os.path.join(OUT, "docs/hero.png"), (1600, 1000))+th_rc = thumb(os.path.join(OUT, "docs/models/package-reference-step.png"))+print("thumbs", hero_rc, th_rc)++# ---------- LODs ----------+run([PY, "-I", os.path.join(TOOLS, "lod.py"), disp_step, MPN, OUT, os.path.basename(disp_step)] + ([step_path] if marked_name else []), cwd=TOOLS)+man = json.load(open(os.path.join(OUT, "lod/manifest.json")))+man["source"]["path"] = os.path.basename(disp_step)+if marked_name:+    man["purpose"] = ("clean board-use component models: no footprint pads, outlines, labels or silkscreen; the datasheet marking code "+                      + P["marking_code"] + " on the top coat in high and medium, omitted in low and super-low")+    man["source"]["unmarked"] = {"path": step_name, "sha256": sha(step_path)}+else:+    man["purpose"] = "clean board-use component models: no footprint pads, outlines, labels or silkscreen; no marking (" + P["marking_src"] + ")"+json.dump(man, open(os.path.join(OUT, "lod/manifest.json"), "w"), indent=1)++run(["python3", "-I", os.path.join(TOOLS, "figures.py"), slug])+json.dump({"step": step_name, "marked": marked_name, "etch": etch_info, "fp": fp_file, "sym": sym_file, "check": check, "land": land,+           "hero_rc": hero_rc, "thumb_rc": th_rc, "glb_stderr": g.stderr[-300:]},+          open(os.path.join(ROOT, "work", f"{slug}-build.json"), "w"), indent=1)+print("built", OUT)
provenance/tools/etch.pyadded+35
@@ -0,0 +1,35 @@+"""Put the datasheet marking code on the top coat of a chip resistor STEP.++Uses the shared step2glb service's /laser-etch endpoint in flat mode: the body is+untouched and the code is added as its own floating solid group (Adom.LaserEtch)+just above the top coat. The input STEP is never modified.++usage: etch.py in.step CODE out.step jobname+prints one JSON line: service, version, job id, sha256 of input and output.+"""+import sys, json, time, hashlib, urllib.request++S = "https://step2glb-gmdoncpxdwx0.adom.cloud"+src, code, out, job = sys.argv[1:5]+H = {"X-Client": "claude-esc3", "X-Job-Name": f"{job}-marking-{code}"}+sha = lambda b: hashlib.sha256(b).hexdigest()+data = open(src, "rb").read()+def req(url, body=None, extra=None):+    r = urllib.request.Request(url, data=body, headers={**H, **(extra or {})}, method="POST" if body is not None else "GET")+    with urllib.request.urlopen(r, timeout=120) as f:+        return f.read()+health = json.loads(req(S + "/health"))+j = json.loads(req(f"{S}/laser-etch?name={code}&mode=flat", data, {"Content-Type": "application/octet-stream"}))+jid = j["job_id"]+for _ in range(60):+    st = json.loads(req(f"{S}/jobs/{jid}"))+    if st["status"] in ("complete", "failed"):+        break+    time.sleep(2)+if st["status"] != "complete":+    print("FAILED", st); sys.exit(1)+res = req(f"{S}/jobs/{jid}/result")+open(out, "wb").write(res)+print(json.dumps({"service": S, "service_version": health.get("version"), "service_git": health.get("git_sha_short"),+                  "endpoint": f"/laser-etch?name={code}&mode=flat", "job_id": jid, "code": code,+                  "input_sha256": sha(data), "output_sha256": sha(res), "output_bytes": len(res)}))
provenance/tools/figures.pyadded+28
@@ -0,0 +1,28 @@+"""Crop the cited datasheet figures into docs/figures/ (rendered at 150 dpi with pdftoppm).++usage: figures.py <slug>+"""+import sys, os, json, subprocess, hashlib+from PIL import Image+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+import parts+ROOT = "/tmp/claude-1001/esc3"+slug = sys.argv[1]+P = next(p for p in parts.PARTS if p["slug"] == slug)+OUT = os.path.join(ROOT, "pages", slug, "docs", "figures"); os.makedirs(OUT, exist_ok=True)+pdfs = {"ds": os.path.join(ROOT, "dl", P["ds"]["local"]), "mount": os.path.join(ROOT, "dl", parts.MOUNT["local"])}+cache = os.path.join(ROOT, "work", "fig150"); os.makedirs(cache, exist_ok=True)+figs = [parts.FIG_DIM, parts.FIG_ELEC, parts.FIG_MARK, parts.FIG_VOLT, parts.FIG_PACK, parts.FIG_STO, parts.FIG_LAND]+rec = []+for name, doc, page, box, caption in figs:+    png = os.path.join(cache, f"{doc}-{page}.png")+    if not os.path.exists(png):+        subprocess.run(["pdftoppm", "-r", "150", "-png", "-singlefile", "-f", str(page), "-l", str(page), pdfs[doc], png[:-4]], check=True)+    im = Image.open(png).convert("RGB")+    b = [int(round(v * 1.5)) for v in box]+    out = os.path.join(OUT, name); im.crop(b).save(out, optimize=True)+    rec.append({"file": f"docs/figures/{name}", "document": P["ds"]["title"] if doc == "ds" else parts.MOUNT["title"],+                "page": page, "crop_px_at_150dpi": b, "caption": caption,+                "sha256": hashlib.sha256(open(out, "rb").read()).hexdigest()})+json.dump(rec, open(os.path.join(OUT, "figures.json"), "w"), indent=1)+print("figures", len(rec))
provenance/tools/finish.pyadded+49
@@ -0,0 +1,49 @@+"""Fusion .lbr, Altium SchLib/PcbLib, hero GLB and the plain-STEP thumbnail for one page.++usage: finish.py <slug>   (after build.py and a first records.py run, which writes page.json)+"""+import sys, os, json, subprocess, hashlib, shutil+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+from parts import PARTS+ROOT = "/tmp/claude-1001/esc3"+HERO_PY = os.path.join(ROOT, "component-hero/skills/component-hero/scripts/hero_glb.py")+slug = sys.argv[1]+P = next(p for p in PARTS if p["slug"] == slug)+OUT = os.path.join(ROOT, "pages", slug); MPN = P["mpn"]+B = json.load(open(os.path.join(ROOT, "work", f"{slug}-build.json")))+sha = lambda f: hashlib.sha256(open(os.path.join(OUT, f), "rb").read()).hexdigest()+def run(cmd, cwd=OUT):+    r = subprocess.run(cmd, capture_output=True, text=True, cwd=cwd)+    if r.returncode != 0:+        print("FAILED", cmd, r.stdout[-1500:], r.stderr[-1500:]); sys.exit(1)+    return (r.stdout + r.stderr).strip()+rec = {}+# plain STEP thumbnail for models.json+run(["step2glb", "thumbnail", B["step"], "-o", "docs/models/step-plain.png"])+# Fusion / EAGLE+o = run(["adom-lbr", "generate", "--sym", B["sym"], "--fp", B["fp"], "--part-metadata", "page.json", "-o", f"{MPN}.lbr"])+_l = run(["adom-lbr", "lint", f"{MPN}.lbr"]); lint = json.loads(_l[_l.index("{"):_l.rindex("}") + 1])+assert lint["passed"], lint+rec["lbr"] = {"file": f"{MPN}.lbr", "tool": "adom-lbr " + run(["adom-lbr", "--version"]).split()[-1],+              "command": f"adom-lbr generate --sym {B['sym']} --fp {B['fp']} --part-metadata page.json -o {MPN}.lbr",+              "lint": {"passed": lint["passed"], "errors": len(lint.get("errors", [])), "warnings": len(lint.get("warnings", []))}, "sha256": sha(f"{MPN}.lbr")}+# Altium: hub JSON beside the STEP so the PcbLib embeds the body+os.makedirs(os.path.join(OUT, "altium"), exist_ok=True)+o1 = run(["adom-lbr", "import-kicad", "--sym", B["sym"], "--fp", B["fp"], "--mpn", MPN, "--out", f"{MPN}.adom-lbr.json"])+o2 = run(["adom-lbr", "assemble-altium", "--no-dedupe", "--out", f"altium/{MPN}", f"{MPN}.adom-lbr.json"])+rep = json.loads(o2[o2.index("{"):o2.rindex("}") + 1])+assert rep["status"] == "ok" and rep["models"]["embedded"] == 1, rep+rec["altium"] = {"files": [f"altium/{MPN}.SchLib", f"altium/{MPN}.PcbLib", f"{MPN}.adom-lbr.json"],+                 "commands": [f"adom-lbr import-kicad --sym {B['sym']} --fp {B['fp']} --mpn {MPN} --out {MPN}.adom-lbr.json",+                              f"adom-lbr assemble-altium --no-dedupe --out altium/{MPN} {MPN}.adom-lbr.json"],+                 "report": rep, "hints": [l for l in o1.splitlines() if l.startswith("HINT")],+                 "sha256": {f: sha(f) for f in (f"altium/{MPN}.SchLib", f"altium/{MPN}.PcbLib", f"{MPN}.adom-lbr.json")}}+# hero GLB (component-hero standard)+o = run(["/home/adom/.venvs/cq/bin/python", "-I", HERO_PY, "package-reference.glb", B["fp"], "page.json", f"{slug}-hero.glb", "--png", "docs/verify/hero-preview.png"])+print(o)+assert "align OK" in o, o+rec["hero"] = {"file": f"{slug}-hero.glb", "tool": "adom/component-hero skills/component-hero/scripts/hero_glb.py",+               "tool_sha256": hashlib.sha256(open(HERO_PY, "rb").read()).hexdigest(),+               "inputs": ["package-reference.glb", B["fp"], "page.json"], "result": o.splitlines()[-1], "sha256": sha(f"{slug}-hero.glb")}+json.dump(rec, open(os.path.join(ROOT, "work", f"{slug}-finish.json"), "w"), indent=1)+print("finished", slug)
provenance/tools/landcheck.pyadded+116
@@ -0,0 +1,116 @@+"""Compare the KiCad footprint pads with the manufacturer's recommended land pattern.++usage: landcheck.py <slug> <outdir>+Reads parts.PARTS[slug]["land"] and the page's footprint (KiCad library geometry).+Writes <outdir>/land-pattern.png (true-scale drawing + table) and+<outdir>/land-pattern-icon.png (256 px square thumbnail), prints a JSON result.++Drawing: grey = part body at datasheet nominal, teal = KiCad pads (copper),+amber dashed = the maker's land at the middle of its printed range (or its+printed nominal), amber band = the range the maker allows for the inner and+outer pad edges where the maker prints a range.+"""+import sys, os, json, re, glob+from PIL import Image, ImageDraw, ImageFont+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+from parts import PARTS++slug, outdir = sys.argv[1], sys.argv[2]+P = next(p for p in PARTS if p["slug"] == slug)+L = P["land"]+page = os.path.dirname(outdir.rstrip("/"))+fpf = glob.glob(os.path.join(page, "*.kicad_mod"))[0]+fp = open(fpf).read()+pads = [tuple(map(float, m)) for m in re.findall(r'\(pad "\d" smd roundrect\s*\(at ([-\d.]+) ([-\d.]+)\)\s*\(size ([\d.]+) ([\d.]+)\)', fp)]+x, _, w, h = pads[1]+k = {"gap": round(2 * x - w, 3), "len": round(w, 3), "wid": round(h, 3), "overall": round(2 * x + w, 3)}++def mid(v): return (v[0] + v[1]) / 2 if isinstance(v, list) else v+rows = []+if L["kind"] in ("range", "tol"):+    rng = {"gap": L["gap_a"], "len": L["len_b"], "wid": L["wid_c"]}+    rng["overall"] = L.get("overall") or [round(L["gap_a"][0] + 2 * L["len_b"][0], 3), round(L["gap_a"][1] + 2 * L["len_b"][1], 3)]+    derived_overall = not L.get("overall")+    for key, name in (("gap", "gap between lands"), ("len", "land length"), ("wid", "land width"),+                      ("overall", "overall length (a + 2b, derived)" if derived_overall else "overall length")):+        lo, hi = rng[key]; v = k[key]+        ok = lo - 1e-6 <= v <= hi + 1e-6+        dev = 0 if ok else round(v - hi if v > hi else v - lo, 3)+        rows.append({"dim": name, "kicad_mm": v, "maker_min": lo, "maker_max": hi, "within": ok, "outside_by_mm": dev})+    ref = {kk: mid(rng[kk]) for kk in rng}+    if L["kind"] == "tol":+        ref = {"gap": L["nominal"]["gap_a"], "len": L["nominal"]["len_b"], "wid": L["nominal"]["wid_c"], "overall": L["nominal"]["overall"]}+else:+    ref = {"gap": L["gap_a"], "len": L["len_b"], "wid": L["wid_c"], "overall": L["overall"]}+    for key, name in (("gap", "gap between lands"), ("len", "land length"), ("wid", "land width"), ("overall", "overall length")):+        rows.append({"dim": name, "kicad_mm": k[key], "maker_nominal": ref[key], "difference_mm": round(k[key] - ref[key], 3)})++# ---------- drawing ----------+body = P["body_mm"]+span = max(k["overall"], ref["overall"] if isinstance(ref["overall"], float) else 0) + 0.4+PP = 560 / span+W_, H_ = 1000, int(max(k["wid"], ref["wid"], body["y_mm"]) * PP + 120)+img = Image.new("RGBA", (W_, H_), (255, 255, 255, 255))+d = ImageDraw.Draw(img, "RGBA")+cx, cy = W_ / 2, H_ / 2 + 10+def R(x0, y0, x1, y1): return [cx + x0 * PP, cy - y1 * PP, cx + x1 * PP, cy - y0 * PP]+# allowed edge bands (range kinds)+if L["kind"] in ("range", "tol"):+    g0, g1 = L["gap_a"]; b0, b1 = L["len_b"]; c1 = L["wid_c"][1]+    for s in (-1, 1):+        for a, b in ((g0 / 2, g1 / 2), (g0 / 2 + b0, g1 / 2 + b1)):+            xa, xb = sorted((s * a, s * b))+            d.rectangle(R(xa, -c1 / 2, xb, c1 / 2), fill=(255, 190, 70, 70))+# body+d.rectangle(R(-body["x_mm"] / 2, -body["y_mm"] / 2, body["x_mm"] / 2, body["y_mm"] / 2), outline=(110, 110, 110, 255), width=2)+# KiCad pads, rounded rect (rratio 0.25)+for px, py, pw, ph in pads:+    rr = 0.25 * min(pw, ph) * PP+    d.rounded_rectangle(R(px - pw / 2, py - ph / 2, px + pw / 2, py + ph / 2), radius=rr, fill=(0, 150, 150, 110), outline=(0, 120, 120, 255), width=2)+# maker land, dashed amber+def dashed(box, col, wdt=3):+    xa, ya, xb, yb = box+    for (p, q) in (((xa, ya), (xb, ya)), ((xb, ya), (xb, yb)), ((xb, yb), (xa, yb)), ((xa, yb), (xa, ya))):+        n = int(max(abs(q[0] - p[0]), abs(q[1] - p[1])) / 7) or 1+        for i in range(0, n, 2):+            t0, t1 = i / n, min(1, (i + 1) / n)+            d.line([(p[0] + (q[0] - p[0]) * t0, p[1] + (q[1] - p[1]) * t0), (p[0] + (q[0] - p[0]) * t1, p[1] + (q[1] - p[1]) * t1)], fill=col, width=wdt)+for s in (-1, 1):+    a, b = ref["gap"] / 2, ref["gap"] / 2 + ref["len"]+    xa, xb = sorted((s * a, s * b))+    dashed(R(xa, -ref["wid"] / 2, xb, ref["wid"] / 2), (200, 110, 0, 255))+icon_box = (int(cx - 0.5 * (k["overall"] + 0.25) * PP), int(cy - 0.5 * (k["overall"] + 0.25) * PP))+icon_side = int((k["overall"] + 0.25) * PP)+padded = Image.new("RGBA", (W_ + 2 * icon_side, H_ + 2 * icon_side), (255, 255, 255, 255)); padded.paste(img, (icon_side, icon_side))+icon = padded.crop((icon_box[0] + icon_side, icon_box[1] + icon_side, icon_box[0] + 2 * icon_side, icon_box[1] + 2 * icon_side)).convert("RGB").resize((256, 256), Image.LANCZOS)+mask = Image.new("L", (256, 256), 0); ImageDraw.Draw(mask).rounded_rectangle([0, 0, 255, 255], radius=28, fill=255)+ic = Image.new("RGBA", (256, 256), (0, 0, 0, 0)); ic.paste(icon, (0, 0), mask)+ic.save(os.path.join(outdir, "land-pattern-icon.png"))++f = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 15)+fb = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 17)+lines = []+for r in rows:+    if "within" in r:+        lines.append((f"{r['dim']}:  KiCad {r['kicad_mm']:.2f}   maker {r['maker_min']:.2f} to {r['maker_max']:.2f}   "+                      + ("inside" if r["within"] else f"outside by {r['outside_by_mm']:+.2f}"), (0, 120, 40) if r["within"] else (190, 90, 0)))+    else:+        lines.append((f"{r['dim']}:  KiCad {r['kicad_mm']:.2f}   maker {r['maker_nominal']:.2f}   difference {r['difference_mm']:+.2f}", (40, 40, 40)))+sheet = Image.new("RGB", (W_, H_ + 100 + 24 * len(lines) + 70), (255, 255, 255))+sd = ImageDraw.Draw(sheet)+sd.text((14, 10), f"{P['mpn']}: KiCad {P['fp']} pads vs maker's land, true scale", fill=(0, 0, 0), font=fb)+sheet.paste(img.convert("RGB"), (0, 40))+y = H_ + 46+sd.text((14, y), "grey = body (nominal)   teal = KiCad pads   amber dashed = maker's land (middle of range or nominal)", fill=(60, 60, 60), font=f); y += 22+sd.text((14, y), "amber band = where the maker allows the inner and outer pad edges (range sheets only)", fill=(60, 60, 60), font=f); y += 26+for t, c in lines:+    sd.text((14, y), t, fill=c, font=f); y += 24+import textwrap+for ln in textwrap.wrap("Source: " + L["source"], 115):+    sd.text((14, y + 4), ln, fill=(90, 90, 90), font=f); y += 20+sheet.save(os.path.join(outdir, "land-pattern.png"))++res = {"footprint": os.path.basename(fpf), "kicad_library_footprint": P["fp"], "kicad": k, "maker_reference": ref,+       "maker_source": L["source"], "maker_letters": L["letters"], "rows": rows,+       "all_within": all(r.get("within", True) for r in rows) if L["kind"] != "nominal" else None}+print(json.dumps(res))
provenance/tools/lod.pyadded+199
@@ -0,0 +1,199 @@+"""Board-use LOD GLBs (high, medium, low, super-low) for a small two-terminal chip.++Input: the page's board-use STEP (Z-up, mm, seated on z=0, centred).+Output (in <outdir>/lod/): high.glb medium.glb low.glb super-low.glb, a 400x300+PNG preview of each rendered from that GLB's own triangles, manifest.json+(schema adom/component-lod@1).++Every level: Z-up, metres, the same origin and pose as the STEP (no recentring,+no rotation), primitives batched by material (one per material), the STEP's own+colours.  No footprint, pad outline, label or silkscreen helpers exist in the+source, so nothing is removed.  high/medium/low are OCCT tessellations of the+exact B-rep at decreasing deflection; super-low replaces each material group by+its bounding box per side of the part (terminals, body, overcoat), which keeps+the silhouette, the terminal bands and the seating plane.++usage: lod.py part.step MPN outdir [source_label]+"""+import sys, os, json, struct, hashlib+import numpy as np+from PIL import Image, ImageDraw+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+import ortho+from OCP.BRepMesh import BRepMesh_IncrementalMesh+from OCP.BRepTools import BRepTools++step, mpn, outdir = sys.argv[1], sys.argv[2], sys.argv[3]+src_label = sys.argv[4] if len(sys.argv) > 4 else os.path.basename(step)+# optional: the unmarked STEP; colours present only in the marked source are the marking,+# kept in high and medium, dropped in low and super-low (too small to read there)+plain_step = sys.argv[5] if len(sys.argv) > 5 else None+MARK_COLS = set()+lod_dir = os.path.join(outdir, "lod"); os.makedirs(lod_dir, exist_ok=True)++LEVELS = [("high", 0.0005, 0.1), ("medium", 0.004, 0.35), ("low", 0.02, 0.9)]++def tris_at(lin, ang):+    # ortho.load_tris meshes with fixed params; clean and remesh by patching BRepMesh call+    orig = ortho.BRepMesh_IncrementalMesh+    def mesh(shp, _l, rel, _a, par):+        BRepTools.Clean_s(shp)+        return orig(shp, lin, False, ang, True)+    ortho.BRepMesh_IncrementalMesh = mesh+    try:+        return ortho.load_tris(step)+    finally:+        ortho.BRepMesh_IncrementalMesh = orig++def boxes_from(tris):+    groups = {}+    for p, c in tris:+        groups.setdefault(c, []).append(p)+    allp = np.concatenate([p for p, _ in tris]); xmax = allp[:, 0].max()+    endc = {}+    for p, c in tris:+        if np.allclose(p[:, 0], xmax, atol=1e-4): endc[c] = endc.get(c, 0) + 1+    tcol = max(endc, key=endc.get)+    boxes = []+    for c, ps in groups.items():+        T = np.stack(ps)+        crosses = c != tcol and ((T[:, :, 0].min(1) < -1e-6) & (T[:, :, 0].max(1) > 1e-6)).any()  # terminals: always two boxes+        P = T.reshape(-1, 3)+        parts = [P] if crosses else [P[P[:, 0] < 0], P[P[:, 0] > 0]]+        for Q in parts:+            if len(Q):+                boxes.append([Q.min(0), Q.max(0), c])+    tin = min(min(abs(lo[0]), abs(hi[0])) for lo, hi, c in boxes if c == tcol)+    # the body box reaches the same top as the overcoat box: coplanar tops z-fight, so stop the body at the overcoat's underside+    dark = min({c for _, _, c in boxes}, key=lambda c: sum(c))+    dk = [(lo, hi) for lo, hi, c in boxes if c == dark]+    if dark != tcol and dk:+        dlo = min(lo[2] for lo, hi in dk); dhi = max(hi[2] for lo, hi in dk)+        for b in boxes:+            if b[2] not in (dark, tcol) and b[1][2] >= dhi - 1e-6:+                b[1] = b[1].copy(); b[1][2] = dlo+    out = []+    for lo, hi, c in boxes:+        if c != tcol:+            lo = lo.copy(); hi = hi.copy(); lo[0] = max(lo[0], -tin); hi[0] = min(hi[0], tin)+        v = np.array([[x, y, z] for x in (lo[0], hi[0]) for y in (lo[1], hi[1]) for z in (lo[2], hi[2])])+        for a_, b_, cc, d in [(0, 1, 3, 2), (4, 6, 7, 5), (0, 4, 5, 1), (2, 3, 7, 6), (0, 2, 6, 4), (1, 5, 7, 3)]:+            out.append((v[[a_, b_, cc]], c)); out.append((v[[a_, cc, d]], c))+    return out++def write_glb(tris, path, name):+    mats = []; groups = {}+    for p, c in tris:+        if c not in groups:+            groups[c] = []; mats.append(c)+        groups[c].append(p)+    bin_ = b""; views = []; accs = []; prims = []+    def add_view(data, target):+        nonlocal bin_+        off = len(bin_); bin_ += data+        while len(bin_) % 4: bin_ += b"\0"+        views.append({"buffer": 0, "byteOffset": off, "byteLength": len(data), "target": target})+        return len(views) - 1+    decoded = 0; ntri = 0+    for mi, c in enumerate(mats):+        P = np.concatenate(groups[c]).reshape(-1, 3, 3)+        n = np.cross(P[:, 1] - P[:, 0], P[:, 2] - P[:, 0]); n /= np.linalg.norm(n, axis=1, keepdims=True) + 1e-30+        pos = (P.reshape(-1, 3) / 1000.0).astype(np.float32)          # mm -> metres+        nor = np.repeat(n, 3, axis=0).astype(np.float32)+        # weld identical (position, normal) vertices+        key = np.concatenate([np.round(pos, 9), np.round(nor, 5)], 1)+        uniq, inv = np.unique(key, axis=0, return_inverse=True)+        upos = uniq[:, :3].astype(np.float32); unor = uniq[:, 3:].astype(np.float32)+        idx = inv.astype(np.uint16 if len(uniq) < 65535 else np.uint32).ravel()+        vp = add_view(upos.tobytes(), 34962); vn = add_view(unor.tobytes(), 34962); vi = add_view(idx.tobytes(), 34963)+        accs.append({"bufferView": vp, "componentType": 5126, "count": len(upos), "type": "VEC3",+                     "min": upos.min(0).tolist(), "max": upos.max(0).tolist()})+        accs.append({"bufferView": vn, "componentType": 5126, "count": len(unor), "type": "VEC3"})+        accs.append({"bufferView": vi, "componentType": 5123 if idx.dtype == np.uint16 else 5125, "count": len(idx), "type": "SCALAR"})+        prims.append({"attributes": {"POSITION": len(accs) - 3, "NORMAL": len(accs) - 2}, "indices": len(accs) - 1, "material": mi})+        decoded += upos.nbytes + unor.nbytes + idx.nbytes; ntri += len(idx) // 3+    gl = {"asset": {"version": "2.0", "generator": "capencoder passives lod.py (OCCT tessellation)"},+          "scene": 0, "scenes": [{"nodes": [0]}],+          "nodes": [{"name": name, "mesh": 0, "extras": {"adomUpAxis": "Z", "units": "metres"}}],+          "meshes": [{"name": name, "primitives": prims}],+          "materials": [{"name": f"mat_{i}", "pbrMetallicRoughness": {"baseColorFactor": [*c, 1.0], "metallicFactor": 0.0, "roughnessFactor": 0.6}} for i, c in enumerate(mats)],+          "accessors": accs, "bufferViews": views, "buffers": [{"byteLength": len(bin_)}]}+    js = json.dumps(gl, separators=(",", ":")).encode()+    while len(js) % 4: js += b" "+    glb = struct.pack("<III", 0x46546C67, 2, 12 + 8 + len(js) + 8 + len(bin_)) + struct.pack("<II", len(js), 0x4E4F534A) + js + struct.pack("<II", len(bin_), 0x004E4942) + bin_+    open(path, "wb").write(glb)+    return {"decodedBufferBytes": decoded, "triangles": ntri, "primitives": len(prims)}++def read_glb_tris(path):+    b = open(path, "rb").read(); n = struct.unpack("<I", b[12:16])[0]+    j = json.loads(b[20:20 + n]); binc = b[20 + n + 8:]+    def acc(i, dt, w):+        a = j["accessors"][i]; v = j["bufferViews"][a["bufferView"]]+        return np.frombuffer(binc, dt, a["count"] * w, v["byteOffset"]).reshape(-1, w) if w > 1 else np.frombuffer(binc, dt, a["count"], v["byteOffset"])+    out = []+    for p in j["meshes"][0]["primitives"]:+        pos = acc(p["attributes"]["POSITION"], np.float32, 3) * 1000.0+        ia = j["accessors"][p["indices"]]+        idx = acc(p["indices"], np.uint16 if ia["componentType"] == 5123 else np.uint32, 1)+        col = tuple(j["materials"][p["material"]]["pbrMetallicRoughness"]["baseColorFactor"][:3])+        for t in idx.reshape(-1, 3):+            out.append((pos[t].astype(float), col))+    return out++ortho.VIEWS["iso"] = (tuple(np.array([-0.7071, 0.7071, 0])), tuple(np.array([-0.4082, -0.4082, 0.8165])), tuple(np.array([0.5774, 0.5774, 0.5774])))+def preview(path, png):+    tris = read_glb_tris(path)+    allp = np.concatenate([t[0] for t in tris]); ext = np.abs(allp).max()+    img = ortho.render(tris, "iso", 300 / (3.3 * ext), size=(400, 300))+    # painter's sorting by triangle centroid can bury faces in the top plane (and the marking 5 um above it);+    # faces in those planes cannot be hidden in a view from above, so draw them again, plane by plane, bottom first+    near = lambda c: any(max(abs(a - b) for a, b in zip(c, m)) < 2e-3 for m in MARK_COLS)+    zt = allp[:, 2].max()+    marked = [t for t in tris if MARK_COLS and near(t[1])]+    top = zt - 0.005 if marked else zt+    plane = [t for t in tris if not (MARK_COLS and near(t[1])) and np.abs(t[0][:, 2] - top).max() < 1e-4]+    for layer in (plane, [t for t in marked if t[0][:, 2].min() > top + 1e-4]):+        if layer:+            img.alpha_composite(ortho.render(layer, "iso", 300 / (3.3 * ext), size=(400, 300)))+    bg = Image.new("RGBA", img.size, (48, 57, 68, 255)); bg.alpha_composite(img); bg.convert("RGB").save(png)++sha = lambda f: hashlib.sha256(open(f, "rb").read()).hexdigest()+levels = []+src_tris = None+if plain_step:+    MARK_COLS = {c for _, c in ortho.load_tris(step)} - {c for _, c in ortho.load_tris(plain_step)}+    print("marking colours", MARK_COLS)+for name, lin, ang in LEVELS + [("super-low", None, None)]:+    if name == "super-low":+        tris = boxes_from(src_tris)+    else:+        tris = tris_at(lin, ang)+        if name == "high":+            src_tris = [t for t in tris if t[1] not in MARK_COLS]+        if name == "low" and MARK_COLS:+            tris = [t for t in tris if t[1] not in MARK_COLS]+    path = os.path.join(lod_dir, f"{name}.glb")+    st = write_glb(tris, path, mpn)+    back = read_glb_tris(path); P = np.concatenate([t[0] for t in back])+    png = os.path.join(lod_dir, f"{name}.png"); preview(path, png)+    rec = {"level": name, "path": f"lod/{name}.glb", "sha256": sha(path), "sizeBytes": os.path.getsize(path), **st,+           "bounds": {"min": (P.min(0) / 1000).round(7).tolist(), "max": (P.max(0) / 1000).round(7).tolist()},+           "approximation": ({"method": "OCCT BRepMesh_IncrementalMesh", "linearDeflectionMm": lin, "angularDeflectionRad": ang}+                             if lin else {"method": "per-material bounding boxes split at the part centre (terminals, body, overcoat)"}),+           "detailVisibility": ({"virtualMpn": False, "manufacturerMarking": name in ("high", "medium"),+                                 "note": "datasheet marking code shown on the top coat" if name in ("high", "medium") else "datasheet marking omitted: unreadable at this level"}+                                if MARK_COLS else {"virtualMpn": False, "note": "no marking: the datasheet specifies none"}),+           "review": "Candidate: rendered preview checked by AI (silhouette, terminals, seat z=0); not human-reviewed",+           "preview": {"path": f"lod/{name}.png", "sha256": sha(png), "sizeBytes": os.path.getsize(png), "width": 400, "height": 300,+                       "view": "iso", "sourceLevelSha256": sha(path)}}+    levels.append(rec)+    print(name, st, rec["bounds"])+manifest = {"schema": "adom/component-lod@1", "mpn": mpn, "upAxis": "Z", "units": "metres",+            "status": "candidate (AI-checked, not human-reviewed)",+            "purpose": "clean board-use component models: no footprint pads, outlines, labels or silkscreen; no marking (none per datasheet)",+            "source": {"path": src_label, "sha256": sha(step)},+            "sourceToDisplay": "uniform scale 0.001 (mm to m); no rotation, no translation; origin = footprint origin, seat z = 0",+            "generator": "lod.py (capencoder passives, OCCT via cadquery-ocp)",+            "removedHelpers": [], "levels": levels,+            "hints": ["All four levels share pose and units; super-low is boxes per material group, chosen for board overviews."]}+json.dump(manifest, open(os.path.join(lod_dir, "manifest.json"), "w"), indent=1)
provenance/tools/ortho.pyadded+123
@@ -0,0 +1,123 @@+"""Orthographic renderer for small component STEPs (face colours kept).++render(step, view, ppmm) -> PIL RGBA image, model origin at the image centre.+views: top (look down -Z, +X right, +Y up), bottom (look up +Z, +X right, +Y down,+i.e. the part flipped about X), front (look +Y, +X right, +Z up),+end (look -X, +Y right... from +X end: -Y right, +Z up).+"""+import sys+import numpy as np+from PIL import Image, ImageDraw+from OCP.STEPCAFControl import STEPCAFControl_Reader+from OCP.TDocStd import TDocStd_Document+from OCP.TCollection import TCollection_ExtendedString+from OCP.XCAFDoc import XCAFDoc_DocumentTool, XCAFDoc_ColorType+from OCP.TDF import TDF_LabelSequence+from OCP.TopExp import TopExp_Explorer+from OCP.TopAbs import TopAbs_FACE, TopAbs_REVERSED+from OCP.TopoDS import TopoDS+from OCP.Quantity import Quantity_Color+from OCP.BRepMesh import BRepMesh_IncrementalMesh+from OCP.BRep import BRep_Tool+from OCP.TopLoc import TopLoc_Location+++def load_tris(path):+    doc = TDocStd_Document(TCollection_ExtendedString("x"))+    r = STEPCAFControl_Reader(); r.SetColorMode(True); r.SetNameMode(True)+    r.ReadFile(path); r.Transfer(doc)+    st = XCAFDoc_DocumentTool.ShapeTool_s(doc.Main())+    ct = XCAFDoc_DocumentTool.ColorTool_s(doc.Main())+    labs = TDF_LabelSequence(); st.GetFreeShapes(labs)+    out = []+    leaves = []+    def walk(lab, loc, pcol):+        c = Quantity_Color(); col = pcol+        for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):+            if ct.GetColor_s(lab, t, c):+                col = (c.Red(), c.Green(), c.Blue()); break+        if st.IsReference_s(lab):+            ref = type(lab)(); st.GetReferredShape_s(lab, ref)+            walk(ref, loc.Multiplied(st.GetLocation_s(lab)), col); return+        kids = TDF_LabelSequence(); st.GetComponents_s(lab, kids)+        if kids.Length() > 0:+            for i in range(1, kids.Length() + 1): walk(kids.Value(i), loc, col)+            return+        leaves.append((st.GetShape_s(lab).Moved(loc), col))+    for li in range(1, labs.Length() + 1):+        walk(labs.Value(li), TopLoc_Location(), None)+    for shp, pcol in leaves:+        BRepMesh_IncrementalMesh(shp, 0.002, False, 0.2, True)+        e = TopExp_Explorer(shp, TopAbs_FACE)+        while e.More():+            f = TopoDS.Face_s(e.Current())+            c = Quantity_Color(); col = None+            for t in (XCAFDoc_ColorType.XCAFDoc_ColorSurf, XCAFDoc_ColorType.XCAFDoc_ColorGen):+                if ct.GetColor(f, t, c):+                    col = (c.Red(), c.Green(), c.Blue()); break+            if col is None:+                col = pcol or (0.6, 0.6, 0.6)+            loc = TopLoc_Location()+            tri = BRep_Tool.Triangulation_s(f, loc)+            if tri is not None:+                trsf = loc.Transformation()+                pts = np.array([(lambda p: (p.X(), p.Y(), p.Z()))(tri.Node(i).Transformed(trsf)) for i in range(1, tri.NbNodes() + 1)])+                rev = f.Orientation() == TopAbs_REVERSED+                for i in range(1, tri.NbTriangles() + 1):+                    a, b, cc = tri.Triangle(i).Get()+                    if rev:+                        b, cc = cc, b+                    out.append((pts[[a - 1, b - 1, cc - 1]], col))+            e.Next()+    return out+++VIEWS = {+    # (right axis vector, up axis vector, toward-viewer vector)+    "top": ((1, 0, 0), (0, 1, 0), (0, 0, 1)),+    "bottom": ((1, 0, 0), (0, -1, 0), (0, 0, -1)),+    "front": ((1, 0, 0), (0, 0, 1), (0, -1, 0)),+    "end": ((0, 1, 0), (0, 0, 1), (1, 0, 0)),+}+++def render(tris, view, ppmm, size=None, shade=True, ss=3):+    R, U, V = [np.array(v, float) for v in VIEWS[view]]+    allp = np.concatenate([t[0] for t in tris])+    ext = max(np.abs(allp @ R).max(), np.abs(allp @ U).max())+    if size is None:+        size = (int(2 * ext * ppmm + 40), int(2 * ext * ppmm + 40))+    W, H = size[0] * ss, size[1] * ss+    img = Image.new("RGBA", (W, H), (0, 0, 0, 0))+    d = ImageDraw.Draw(img)+    items = []+    light = np.array([0.3, 0.4, 0.85]); light /= np.linalg.norm(light)+    for p, col in tris:+        n = np.cross(p[1] - p[0], p[2] - p[0])+        nn = np.linalg.norm(n)+        if nn == 0:+            continue+        n /= nn+        if n @ V <= 1e-6:+            continue  # back face+        depth = (p @ V).mean()+        lv = 0.55 + 0.45 * abs(n @ (R * light[0] + U * light[1] + V * light[2])) if shade else 1.0+        rgb = tuple(int(255 * min(1, c * lv)) for c in col)+        xy = [(W / 2 + (q @ R) * ppmm * ss, H / 2 - (q @ U) * ppmm * ss) for q in p]+        items.append((depth, xy, rgb))+    items.sort(key=lambda x: x[0])+    for _, xy, rgb in items:+        d.polygon(xy, fill=rgb + (255,), outline=rgb + (255,))+    return img.resize(size, Image.LANCZOS)+++if __name__ == "__main__":+    tris = load_tris(sys.argv[1])+    out = sys.argv[2]+    ppmm = float(sys.argv[3]) if len(sys.argv) > 3 else 300+    imgs = [render(tris, v, ppmm) for v in ("top", "bottom", "front", "end")]+    w = sum(i.width for i in imgs); h = max(i.height for i in imgs)+    sheet = Image.new("RGBA", (w, h), (255, 255, 255, 255)); x = 0+    for i in imgs:+        sheet.alpha_composite(i, (x, 0)); x += i.width+    sheet.save(out)
provenance/tools/overlay_chip.pyadded+159
@@ -0,0 +1,159 @@+"""Prove a two-terminal chip model (MLCC / chip resistor) against its datasheet table.++The maker prints a dimension table with an unscaled sketch, so the overlay is made+against a true-scale drawing generated from the printed table (300 px/mm):+nominal outline solid black, tolerance limits dashed blue, the allowed range of+the terminal inner edge shaded amber.  The model is rendered at the same scale+(50 % fill, red outline) on top.  The numeric check measures the STEP itself.++usage: overlay_chip.py spec.json model.step out.png+spec: {"label","mpn","source","L":[nom,tol],"W":[nom,tol],"T":[nom,tol],+       (any of L/W/T may instead be {"nom":x or null,"min":a,"max":b} when the+        datasheet prints an asymmetric or max-only limit; a null nominal draws+        the printed maximum as the reference line),+       "band_top":[min,max],"band_bot":[min,max],"crops":[[png,[x0,y0,x1,y1]],...],+       "marking": "..."}+"""+import sys, json+import numpy as np+from PIL import Image, ImageDraw, ImageFont, ImageFilter+sys.path.insert(0, __file__.rsplit("/", 1)[0])+from ortho import load_tris, render+from OCP.STEPControl import STEPControl_Reader+from OCP.TopExp import TopExp_Explorer+from OCP.TopAbs import TopAbs_FACE+from OCP.TopoDS import TopoDS+from OCP.Bnd import Bnd_Box+from OCP.BRepBndLib import BRepBndLib+from OCP.BRepAdaptor import BRepAdaptor_Surface+from OCP.GeomAbs import GeomAbs_Plane++PP = 300.0+spec = json.load(open(sys.argv[1])); step = sys.argv[2]; out = sys.argv[3]+PP = float(spec.get("ppmm", PP))  # larger packages (0805) need a smaller scale to fit the 560 px panels+F = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf"+font = ImageFont.truetype(F, 22); fsm = ImageFont.truetype(F, 18); fbig = ImageFont.truetype(F, 26)++# ---------- numeric measurement of the STEP ----------+tris = load_tris(step)+allp = np.concatenate([t[0] for t in tris])+x0, y0, z0 = allp.min(0); x1, y1, z1 = allp.max(0)+Lm, Wm, Tm = x1 - x0, y1 - y0, z1 - z0+# terminal colour = colour of triangles lying on the +X end face+endcols = {}+for p, c in tris:+    if np.allclose(p[:, 0], x1, atol=1e-4):+        endcols[c] = endcols.get(c, 0) + 1+tcol = max(endcols, key=endcols.get)+def band(zlev):+    xs = [p[:, 0] for p, c in tris if c == tcol and np.allclose(p[:, 2], zlev, atol=1e-4)]+    if not xs:+        return None+    xs = np.concatenate(xs)+    pos = xs[xs > 0]; neg = xs[xs < 0]+    return round(min(x1 - pos.min(), -x0 + neg.max() if len(neg) else 9), 3)+bt, bb = band(z1), band(z0)++def rng(v):+    if isinstance(v, dict):+        return (v["min"], v["max"])+    return (v[0] - v[1], v[0] + v[1]) if len(v) == 2 and v[1] < v[0] else tuple(v)+checks = []+def chk(name, val, lo, hi):+    ok = val is not None and lo - 1e-6 <= val <= hi + 1e-6+    checks.append((name, val, lo, hi, ok))+chk("L", round(Lm, 3), *rng(spec["L"]))+chk("W", round(Wm, 3), *rng(spec["W"]))+chk("T/H", round(Tm, 3), *rng(spec["T"]))+chk(spec.get("band_top_name", "terminal band, top"), bt, *spec["band_top"])+chk(spec.get("band_bot_name", "terminal band, bottom"), bb, *spec["band_bot"])+centred = bool(abs(x0 + x1) < 1e-3 and abs(y0 + y1) < 1e-3 and abs(z0) < 1e-3)+longx = bool(Lm > Wm)++# ---------- true-scale drawing + model per view ----------+def nlh(v):+    if isinstance(v, dict):+        lo, hi = v["min"], v["max"]+        return (v["nom"] if v.get("nom") is not None else hi), lo, hi+    return v[0], v[0] - v[1], v[0] + v[1]++def view_panel(view, A, B, bands, title):+    a_len, a_lo, a_hi = nlh(A); b_len, b_lo, b_hi = nlh(B)+    im = render(tris, view, PP, size=(560, 420))+    W_, H_ = im.size; cx = W_ / 2+    panel = Image.new("RGBA", (W_, H_), (255, 255, 255, 255))+    d = ImageDraw.Draw(panel)+    seat = view in ("front", "end")+    def rect(a, b, **kw):+        # a along horizontal, b along vertical; for side views the box sits on the seat line+        if seat:+            return [cx - a * PP / 2, H_ / 2 - b * PP, cx + a * PP / 2, H_ / 2]+        return [cx - a * PP / 2, H_ / 2 - b * PP / 2, cx + a * PP / 2, H_ / 2 + b * PP / 2]+    # allowed inner-edge range for the terminals (relative to nominal length)+    for (lo, hi, where) in bands:+        for s in (-1, 1):+            xa = cx + s * (a_len / 2 - hi) * PP; xb = cx + s * (a_len / 2 - lo) * PP+            if where == "full":+                ya, yb = rect(a_len, b_len)[1], rect(a_len, b_len)[3]+            elif where == "top":+                r_ = rect(a_len, b_len); ya, yb = r_[1] - 12, r_[1] + 12+            else:+                r_ = rect(a_len, b_len); ya, yb = r_[3] - 12, r_[3] + 12+            d.rectangle([min(xa, xb), ya, max(xa, xb), yb], fill=(255, 196, 80, 255))+    def dashed(box, col):+        xa, ya, xb, yb = box+        for (p, q) in (((xa, ya), (xb, ya)), ((xb, ya), (xb, yb)), ((xb, yb), (xa, yb)), ((xa, yb), (xa, ya))):+            n = int(max(abs(q[0] - p[0]), abs(q[1] - p[1])) / 8) or 1+            for i in range(0, n, 2):+                t0, t1 = i / n, min(1, (i + 1) / n)+                d.line([(p[0] + (q[0] - p[0]) * t0, p[1] + (q[1] - p[1]) * t0),+                        (p[0] + (q[0] - p[0]) * t1, p[1] + (q[1] - p[1]) * t1)], fill=col, width=2)+    dashed(rect(a_lo, b_lo), (30, 90, 220))+    dashed(rect(a_hi, b_hi), (30, 90, 220))+    d.rectangle(rect(a_len, b_len), outline=(0, 0, 0), width=2)+    arr = np.asarray(im).copy(); alpha = arr[:, :, 3].copy(); arr[:, :, 3] = (alpha * 0.5).astype(np.uint8)+    panel.alpha_composite(Image.fromarray(arr))+    m = Image.fromarray(((alpha > 128) * 255).astype(np.uint8))+    edge = (np.asarray(m, int) - np.asarray(m.filter(ImageFilter.MinFilter(3)), int)) > 0+    red = np.zeros((H_, W_, 4), np.uint8); red[edge] = (220, 30, 30, 255)+    panel.alpha_composite(Image.fromarray(red))+    d = ImageDraw.Draw(panel); d.text((10, 8), title, fill=(0, 0, 0), font=fsm)+    return panel++L, W, T = spec["L"], spec["W"], spec["T"]+bt_r, bb_r = spec["band_top"], spec["band_bot"]+panels = [+    view_panel("top", L, W, [(bt_r[0], bt_r[1], "full")], "TOP (looking down, X right)"),+    view_panel("bottom", L, W, [(bb_r[0], bb_r[1], "full")], "BOTTOM (flipped about X)"),+    view_panel("front", L, T, [(bt_r[0], bt_r[1], "top"), (bb_r[0], bb_r[1], "bot")], "SIDE (looking +Y)"),+    view_panel("end", W, T, [], "END (looking -X)"),+]+pw, ph = panels[0].size+sheet_w = pw * 4 + 50+crops = [Image.open(p).convert("RGB").crop(tuple(b)) for p, b in spec["crops"]]+crop_h = 0; scaled = []+for c in crops:+    s = min(1.0, (sheet_w - 40) / c.width, 420 / c.height)+    c2 = c.resize((int(c.width * s), int(c.height * s)), Image.LANCZOS); scaled.append(c2); crop_h += c2.height + 20+text_h = 120 + 30 * len(checks) + 90+sheet = Image.new("RGB", (sheet_w, 80 + ph + text_h + crop_h), (255, 255, 255))+d = ImageDraw.Draw(sheet)+d.text((20, 15), f"{spec['label']}: model vs datasheet table, true scale {int(PP)} px/mm", fill=(0, 0, 0), font=fbig)+d.text((20, 50), f"Model: {step.rsplit('/', 1)[-1]}   Datasheet: {spec['source']}", fill=(70, 70, 70), font=fsm)+for i, p in enumerate(panels):+    sheet.paste(p.convert("RGB"), (10 + i * (pw + 10), 80))+y = 90 + ph+d.text((20, y), "Legend: black = printed nominal, blue dashed = printed tolerance limits, amber = allowed position of the terminal inner edge, red outline + 50% fill = the 3D model.", fill=(0, 0, 0), font=fsm); y += 34+d.text((20, y), "Measured on the STEP              value     datasheet range     result", fill=(0, 0, 0), font=font); y += 32+for name, val, lo, hi, ok in checks:+    d.text((20, y), f"{name:<34}{'-' if val is None else f'{val:.3f}':>8}     {lo:.2f} to {hi:.2f}       {'PASS' if ok else 'FAIL'}",+           fill=(0, 120, 40) if ok else (200, 0, 0), font=font); y += 30+d.text((20, y + 4), f"Frame: Z-up, seated z=0, centred: {'yes' if centred else 'NO'}; long axis on X: {'yes' if longx else 'NO'}.   Marking: {spec['marking']}", fill=(0, 0, 0), font=fsm)+y += 50+for c in scaled:+    sheet.paste(c, (20, y)); d.rectangle([20, y, 20 + c.width, y + c.height], outline=(150, 150, 150)); y += c.height + 20+sheet.save(out)+res = {"step": step, "bbox_mm": [round(float(v), 4) for v in (x0, x1, y0, y1, z0, z1)],+       "checks": [{"dim": n, "model_mm": v, "datasheet_min": lo, "datasheet_max": hi, "pass": bool(ok)} for n, v, lo, hi, ok in checks],+       "z_up_seated_centred": bool(centred), "long_axis_x": bool(longx), "all_pass": bool(all(c[4] for c in checks) and centred and longx)}+print(json.dumps(res))
provenance/tools/parts.pyadded+125
@@ -0,0 +1,125 @@+"""Catalog data for three YAGEO RC_L chip resistor pages (all values from the cited sources).++Datasheet: YAGEO General Purpose Chip Resistors RC_L series, product specification V.14 (Nov. 14, 2025).+Land pattern: YAGEO Chip Resistors Mounting V.10 (Feb. 13, 2018), p.4 Table 1 (reflow).+Distributor numbers and stock: adom-parts-search, 2026-10-21.+"""++TODAY = "2026-10-21"++DS = {"file_tpl": "docs/{slug}-datasheet.pdf", "local": "ds-rc/PYU-RC_GROUP_51_ROHS_L.pdf",+      "url": "https://yageogroup.com/content/datasheet/asset/file/PYU-RC_GROUP_51_ROHS_L",+      "title": "YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025", "pages": 11}+MOUNT = {"file": "docs/yageo-chip-resistors-mounting-v10.pdf", "local": "yageo-mount/PYu-R_Mount_10.pdf",+         "url": "https://yageogroup.com/content/Resource%20Library/Product%20Guide-Catalog/yageo_PYu-R_Mount_10_19050818_343.pdf",+         "title": "YAGEO Chip Resistors Mounting, product specification V.10, Feb. 13, 2018"}++# datasheet figure crops (page render at 100 dpi, box in px); published under docs/figures/+FIG_DIM = ("rc-p04-dimensions.png", "ds", 4, [55, 150, 770, 760], "p.4 Fig. 9 outline and Table 1 dimensions")+FIG_ELEC = ("rc-p05-table2.png", "ds", 5, [55, 160, 770, 755], "p.5 Table 2 electrical characteristics (RC0402, RC0603)")+FIG_MARK = ("rc-p03-marking.png", "ds", 3, [55, 150, 770, 580], "p.3 Marking (RC0402 no marking; RC0603 codes)")+FIG_VOLT = ("rc-p07-power-voltage.png", "ds", 7, [55, 560, 770, 1090], "p.7 power rating, derating and rated voltage formula")+FIG_PACK = ("rc-p07-packing.png", "ds", 7, [55, 120, 770, 550], "p.7 Table 4 packing quantity")+FIG_STO = ("rc-p09-short-time-overload.png", "ds", 9, [55, 150, 770, 450], "p.9 Table 5 short time overload test")+FIG_LAND = ("mount-p04-land.png", "mount", 4, [55, 150, 770, 810], "Mounting V.10 p.4 Fig. 4 and Table 1 reflow footprint")++RC0402_COMMON = dict(+    mfr="YAGEO", mfr_full="YAGEO", source_slug="yageo", kind="R", category="Resistor",+    subcategory="Thick film chip resistor", tol="+/-1 % (F)",+    op_temp="-55 to 155 C", package="0402 (1005 metric)", fp="R_0402_1005Metric", fp_lib="Resistor_SMD",+    body_mm={"x_mm": 1.0, "y_mm": 0.5, "z_mm": 0.35}, power=0.0625, vmax=50, vover=100,+    overlay={"L": [1.0, 0.05], "W": [0.5, 0.05], "T": [0.35, 0.05], "band_top": [0.10, 0.30], "band_bot": [0.15, 0.35],+             "band_top_name": "I1 (terminal on top)", "band_bot_name": "I2 (terminal on bottom)",+             "source": "YAGEO RC_L product specification V.14 p.4 Table 1 (RC0402)",+             "crop": ["rc-04.png", [60, 170, 822, 830]]},+    dims_text="p.4 Table 1, RC0402: L 1.00 +/-0.05, W 0.50 +/-0.05, H 0.35 +/-0.05, I1 0.20 +/-0.10, I2 0.25 +/-0.10 (mm)",+    land={"source": "YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0402", "kind": "nominal",+          "gap_a": 0.5, "len_b": 0.5, "wid_c": 0.6, "overall": 1.5, "placement": "+/-0.15",+          "letters": "A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters)"},+    marking_code=None,+    marking="YAGEO states 'No Marking' for RC0402 (Fig. 1)",+    marking_src="RC_L product specification V.14, p.3 'Marking'",+)+RC0603_COMMON = dict(+    mfr="YAGEO", mfr_full="YAGEO", source_slug="yageo", kind="R", category="Resistor",+    subcategory="Thick film chip resistor", tol="+/-1 % (F)",+    op_temp="-55 to 155 C", package="0603 (1608 metric)", fp="R_0603_1608Metric", fp_lib="Resistor_SMD",+    body_mm={"x_mm": 1.6, "y_mm": 0.8, "z_mm": 0.45}, power=0.1, vmax=75, vover=150,+    overlay={"L": [1.6, 0.1], "W": [0.8, 0.1], "T": [0.45, 0.1], "band_top": [0.10, 0.40], "band_bot": [0.10, 0.40],+             "band_top_name": "I1 (terminal on top)", "band_bot_name": "I2 (terminal on bottom)",+             "source": "YAGEO RC_L product specification V.14 p.4 Table 1 (RC0603)",+             "crop": ["rc-04.png", [60, 170, 822, 830]], "ppmm": 220},+    dims_text="p.4 Table 1, RC0603: L 1.60 +/-0.10, W 0.80 +/-0.10, H 0.45 +/-0.10, I1 0.25 +/-0.15, I2 0.25 +/-0.15 (mm)",+    land={"source": "YAGEO Chip Resistors Mounting V.10, p.4 Table 1 (reflow), size 0603", "kind": "nominal",+          "gap_a": 0.8, "len_b": 0.9, "wid_c": 0.8, "overall": 2.6, "placement": "+/-0.25",+          "letters": "A = overall length, B = gap between lands, C = land length, D = land width (YAGEO letters)"},+)++def spec_rows(P):+    import math+    v_pr = math.sqrt(P["power"] * P["ohms"])+    rated = min(v_pr, P["vmax"])+    gov = ("power governs: sqrt(P x R) = %.1f V is below the %d V maximum working voltage" % (v_pr, P["vmax"]) if v_pr < P["vmax"]+           else "the %d V maximum working voltage governs: sqrt(P x R) would allow %.0f V" % (P["vmax"], v_pr))+    sz = P["package"].split()[0]+    rows = [+        ("Resistance", f"{P['value']} (code {P['code']}), {P['series']} value", "p.2 ordering information"),+        ("Tolerance", "+/-1 % (code F); 1 % range 1 Ohm to 10 MOhm", f"p.2, p.5 Table 2 (RC{sz})"),+        ("Rated power", f"{P['power_txt']} at 70 C, standard power (reel code 07); derated linearly to 0 at 155 C", "p.2 (5), p.5 Table 2, p.7 Fig. 10-1"),+        ("Maximum working voltage", f"{P['vmax']} V", "p.5 Table 2"),+        ("Maximum overload voltage", f"{P['vover']} V", "p.5 Table 2"),+        ("Dielectric withstanding voltage", f"{P['vover']} V", "p.5 Table 2"),+        ("Rated continuous voltage at this value", f"{rated:.1f} V ({gov})", "p.7 Rated voltage formula"),+        ("Short time overload test", f"2.5 x RCWV or the maximum overload voltage, whichever is less, for 5 s: {min(2.5 * rated, P['vover']):.0f} V for this value", "p.9 Table 5"),+        ("Temperature coefficient", "+/-100 ppm/C for 10 Ohm < R <= 10 MOhm", "p.5 Table 2"),+        ("Operating temperature", "-55 to 155 C", "p.5 Table 2, p.7"),+        ("Technology", "thick film on ceramic substrate, matte tin on nickel terminations", "p.4 Construction"),+        ("Size", P["dims_text"].split(": ", 1)[1], "p.4 Table 1"),+        ("Marking", P["marking_short"], "p.3 Marking"),+        ("Packaging (R, 07)", f"7 inch (178 mm) paper taping reel, {P['reel']} pcs", "p.2, p.7 Table 4"),+        ("Moisture sensitivity", "MSL 1", "p.2 Features"),+    ]+    return rows, rated, v_pr++PARTS = [+    dict(RC0402_COMMON, slug="rc0402fr-0733kl", mpn="RC0402FR-0733KL", value_sym="33k", value="33 kOhm", code="33K",+         ohms=33000, series="E24", power_txt="1/16 W (0.0625 W)", reel=10000,+         voltage="50 V max working, 100 V max overload", rating_row=("Power rating", "1/16 W (0.0625 W) at 70 C"),+         brief="Thick film chip resistor 33 kOhm +/-1 %, 1/16 W, 50 V, 0402 (1005 metric)",+         product_url="https://yageogroup.com/products/productDetail/RC0402FR-0733KL",+         marking_short="none (RC0402 is not marked)",+         dist={"mouser": ("603-RC0402FR-0733KL", "https://www.mouser.com/ProductDetail/YAGEO/RC0402FR-0733KL?qs=OLdA50ig9KgSAim5D6WRlA%3D%3D", 669292),+               "digikey": ("311-33.0KLRTR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0402FR-0733KL/726592", 977588),+               "lcsc": ("C138003", "https://www.lcsc.com/product-detail/C138003.html", 811894)},+         notes=["Mouser lists the part as 'RoHS Compliant By Exemption'; the datasheet (p.2) says Pb-glass in electrodes, resistor element and glass is exempted."]),+    dict(RC0603_COMMON, slug="rc0603fr-073k65l", mpn="RC0603FR-073K65L", value_sym="3.65k", value="3.65 kOhm", code="3K65",+         ohms=3650, series="E96", power_txt="1/10 W (0.1 W)", reel=5000,+         voltage="75 V max working, 150 V max overload", rating_row=("Power rating", "1/10 W (0.1 W) at 70 C"),+         brief="Thick film chip resistor 3.65 kOhm +/-1 %, 1/10 W, 75 V, 0603 (1608 metric)",+         product_url="https://yageogroup.com/products/productDetail/RC0603FR-073K65L",+         marking_code="55B", marking_short="55B (EIA-96 code: 55 = 365, B = x10)",+         marking="YAGEO marks RC0603 1 % parts with the EIA-96 code (p.3 Fig. 3); for 3.65 kOhm that is 55B (code 55 = 365, multiplier B = x10)",+         marking_src="RC_L product specification V.14, p.3 'Marking', Fig. 3; EIA-96 code table (IEC 60062)",+         dist={"mouser": ("603-RC0603FR-073K65L", "https://www.mouser.com/ProductDetail/YAGEO/RC0603FR-073K65L?qs=gt6vzsuosg0dZpg6I44DSA%3D%3D", 64169),+               "digikey": ("311-3.65KHRTR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0603FR-073K65L/727133", 17814),+               "lcsc": ("C137730", "https://www.lcsc.com/product-detail/C137730.html", 13972)},+         notes=["Mouser lists the part as 'RoHS Compliant By Exemption'; the datasheet (p.2) says Pb-glass in electrodes, resistor element and glass is exempted."]),+    dict(RC0603_COMMON, slug="rc0603fr-075m11l", mpn="RC0603FR-075M11L", value_sym="5.11M", value="5.11 MOhm", code="5M11",+         ohms=5110000, series="E96", power_txt="1/10 W (0.1 W)", reel=5000,+         voltage="75 V max working, 150 V max overload", rating_row=("Power rating", "1/10 W (0.1 W) at 70 C"),+         brief="Thick film chip resistor 5.11 MOhm +/-1 %, 1/10 W, 75 V, 0603 (1608 metric)",+         product_url="https://yageogroup.com/products/productDetail/RC0603FR-075M11L",+         marking_code="69E", marking_short="69E (EIA-96 code: 69 = 511, E = x10000)",+         marking="YAGEO marks RC0603 1 % parts with the EIA-96 code (p.3 Fig. 3); for 5.11 MOhm that is 69E (code 69 = 511, multiplier E = x10000)",+         marking_src="RC_L product specification V.14, p.3 'Marking', Fig. 3; EIA-96 code table (IEC 60062)",+         dist={"mouser": ("603-RC0603FR-075M11L", "https://www.mouser.com/ProductDetail/YAGEO/RC0603FR-075M11L?qs=EiqXWrxQq61j8rk1f4BitQ%3D%3D", 96385),+               "digikey": ("13-RC0603FR-075M11LTR-ND", "https://www.digikey.com/en/products/detail/yageo/RC0603FR-075M11L/5918377", 16118),+               "lcsc": ("C482872", "https://www.lcsc.com/product-detail/C482872.html", 23)},+         notes=["Mouser lists the part as 'RoHS Compliant By Exemption'; the datasheet (p.2) says Pb-glass in electrodes, resistor element and glass is exempted.",+                "Example: in a voltage divider sensing a 60 V supply, the upper resistor sees nearly the whole supply, about 60 V, which is inside the 75 V continuous limit with 15 V of margin. Surges above 75 V exceed the continuous rating; the datasheet's short time overload test applies 150 V for 5 s (p.9). For supplies that can exceed 75 V, split the upper leg into two or more resistors in series, or use a larger size (RC0805 and RC1206 are rated 150 V and 200 V, p.5 and p.6).",+                "Stock at JLCPCB/LCSC was low on 2026-10-21 (23 pieces); Mouser and DigiKey had tens of thousands."]),+]+for _p in PARTS:+    _p["ds"] = dict(DS, file=DS["file_tpl"].format(slug=_p["slug"]))+    _p["extra_docs"] = [MOUNT]+    _p["spec_rows"], _p["v_rated"], _p["v_pr"] = spec_rows(_p)
provenance/tools/rc0402fr-0733kl-overlay-spec.jsonadded+39
@@ -0,0 +1,39 @@+{+ "label": "RC0402FR-0733KL",+ "mpn": "RC0402FR-0733KL",+ "L": [+  1.0,+  0.05+ ],+ "W": [+  0.5,+  0.05+ ],+ "T": [+  0.35,+  0.05+ ],+ "band_top": [+  0.1,+  0.3+ ],+ "band_bot": [+  0.15,+  0.35+ ],+ "band_top_name": "I1 (terminal on top)",+ "band_bot_name": "I2 (terminal on bottom)",+ "source": "YAGEO RC_L product specification V.14 p.4 Table 1 (RC0402)",+ "crops": [+  [+   "datasheet page render (rc-04.png, 100 dpi)",+   [+    60,+    170,+    822,+    830+   ]+  ]+ ],+ "marking": "none specified (RC_L product specification V.14, p.3 'Marking')"+}\ No newline at end of file
provenance/tools/records.pyadded+467
@@ -0,0 +1,467 @@+"""Write README.md, land-pattern/README.md, page.json, package.json, models.json,+provenance.json, verification.json and LICENSE for one built page.++usage: records.py <slug>+Run once after build.py (page.json is needed by finish.py), then again after+finish.py so the hero, .lbr and Altium files are hashed and described.+"""+import sys, os, json, hashlib, re, math+sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))+from parts import PARTS, TODAY, MOUNT++ROOT = "/tmp/claude-1001/esc3"+slug = sys.argv[1]+P = next(p for p in PARTS if p["slug"] == slug)+OUT = os.path.join(ROOT, "pages", slug)+MPN = P["mpn"]; OWNER = "adom"+B = json.load(open(os.path.join(ROOT, "work", f"{slug}-build.json")))+STEP, FP, SYM, MARKED = B["step"], B["fp"], B["sym"], B.get("marked")+check, land = B["check"], json.load(open(os.path.join(OUT, "land-pattern/land-check.json")))+lod = json.load(open(os.path.join(OUT, "lod/manifest.json")))+figs = json.load(open(os.path.join(OUT, "docs/figures/figures.json")))+def p_(f): return os.path.join(OUT, f)+ex = lambda f: os.path.exists(p_(f))+sha = lambda f: hashlib.sha256(open(p_(f), "rb").read()).hexdigest()+def blob(f):+    b = open(p_(f), "rb").read(); return hashlib.sha1(b"blob %d\0" % len(b) + b).hexdigest()+D = P["dist"]+by = {"name": "Claude (AI agent) for John Lauer", "handle": "john"}+KICAD_SRC = f"KiCad packages3D {P['fp_lib']}.3dshapes/{P['fp']}.step (CC-BY-SA 4.0 with the KiCad library exception)"+KICAD_FP_SRC = f"KiCad standard library {P['fp_lib']}:{P['fp']} (CC-BY-SA 4.0 with the KiCad library exception)"+GL = "https://gitlab.com/kicad/libraries"+ds = P["ds"]+HERO = f"{slug}-hero.glb"; HERO_SIDE = f"{slug}-hero.overlay.json"; HERO_PNG = "docs/verify/hero-preview.png"+LBR = f"{MPN}.lbr"; SCH = f"altium/{MPN}.SchLib"; PCB = f"altium/{MPN}.PcbLib"; HUB = f"{MPN}.adom-lbr.json"+have_hero, have_alt, have_lbr = ex(HERO), ex(SCH) and ex(PCB), ex(LBR)+code = P.get("marking_code")+sz = P["package"].split()[0]+def F(name): return f"docs/figures/{name}"++# ---------------- land pattern text ----------------+L = P["land"]+rows = land["rows"]+t = "| Dimension | KiCad footprint | YAGEO recommendation | Difference |\n|---|---|---|---|\n"+for r in rows:+    t += f"| {r['dim']} | {r['kicad_mm']:.2f} mm | {r['maker_nominal']:.2f} mm | {r['difference_mm']:+.2f} mm |\n"+maxd = max(abs(r["difference_mm"]) for r in rows)+k = land["kicad"]+if maxd <= 0.06:+    land_verdict = (f"The KiCad pads are within {maxd:.2f} mm of every YAGEO value (YAGEO prints nominal values only, with a placement "+                    f"accuracy of {L['placement']} mm), so the footprint matches the maker's pattern for practical purposes.")+    land_status = "matches"+else:+    gapd = next(r['difference_mm'] for r in rows if r['dim'].startswith('gap'))+    land_verdict = (f"The KiCad pads differ from YAGEO's nominal land by up to {maxd:.2f} mm: KiCad's pads are {k['len']:.2f} mm long and "+                    f"{k['wid']:.2f} mm wide (YAGEO {L['len_b']:.2f} x {L['wid_c']:.2f} mm), so KiCad's copper is shorter and wider, and the overall "+                    f"length is {k['overall']:.2f} mm against YAGEO's {L['overall']:.2f} mm. The gap between pads differs by {gapd:+.2f} mm. "+                    "KiCad generates this footprint to IPC-7351 nominal density (its own description says so), not to YAGEO's table. Both lands "+                    "cover the underside terminal (I2 0.25 +/-0.15 mm) with margin and both are usual reflow patterns. A design that wants YAGEO's "+                    f"exact land should make each pad {L['len_b']:.2f} mm long and {L['wid_c']:.2f} mm wide with pad centres "+                    f"{L['gap_a'] + L['len_b']:.2f} mm apart.")+    land_status = "differs from maker (KiCad IPC nominal)"++land_readme = f"""# Land pattern check: {MPN}++The footprint on this page is KiCad's standard library footprint `{P['fp_lib']}:{P['fp']}`, renamed to+`{FP.replace('.kicad_mod','')}` so it can sit beside other parts in one library folder. The copper is unchanged.+This page compares those pads with the land pattern YAGEO recommends for reflow soldering.++![KiCad pads over YAGEO's land, true scale](land-pattern.png)++Grey is the part body at its datasheet nominal size, teal is the KiCad copper and the dashed amber outline is+YAGEO's recommended land at its printed nominal size.++## Numbers++{t}+YAGEO's letters: {L['letters']}. YAGEO's placement accuracy for this size: {L['placement']} mm.++Source: {L['source']} ([PDF](../{MOUNT['file']})).++![YAGEO Mounting V.10, p.4 Fig. 4 and Table 1](../{F('mount-p04-land.png')})++## Result++{land_verdict}++KiCad pad centres are at +/-{abs(k['overall'] - k['len']) / 2:.3f} mm, pad size {k['len']:.2f} x {k['wid']:.2f} mm,+rounded rectangle (corner ratio 0.25). The numbers are in [land-check.json](land-check.json); the drawing is made by+`provenance/tools/landcheck.py` from the footprint file and YAGEO's table.+"""+open(p_("land-pattern/README.md"), "w").write(land_readme)++# ---------------- verification.json ----------------+entries = []+ck = [{"text": f"{c['dim']}: model {c['model_mm']:.3f} mm, datasheet {c['datasheet_min']:.2f} to {c['datasheet_max']:.2f} mm", "result": "pass" if c["pass"] else "fail"} for c in check["checks"]]+ck.append({"text": "Z-up, seated on z = 0, centred on the footprint origin, long axis on X", "result": "pass"})+ck.append({"text": "no YAGEO STEP is reachable by plain HTTP for this part number (the product page builds its CAD links in the browser); the model is KiCad's library package, bytes unchanged, checked against the datasheet table", "result": "note"})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "3D model matches the datasheet package dimensions",+                "scope": ["3d-model"], "variants": ["*"], "checks": ck,+                "evidence": [{"label": "overlay (top, bottom, side, end at true scale)", "href": f"docs/verify/{slug}-overlay.png"},+                             {"label": "numbers", "href": f"docs/verify/{slug}-check.json"},+                             {"label": "datasheet p.4 Table 1", "href": F("rc-p04-dimensions.png")},+                             {"label": f"datasheet ({ds['title']})", "href": ds["file"]}],+                "files": {STEP: sha(STEP), ds["file"]: sha(ds["file"])}})+lck = [{"text": f"{r['dim']}: KiCad {r['kicad_mm']:.2f} mm, YAGEO {r['maker_nominal']:.2f} mm (difference {r['difference_mm']:+.2f} mm)",+        "result": "pass" if abs(r["difference_mm"]) <= 0.06 else "note"} for r in rows]+entries.append({"date": TODAY, "by": by, "status": "verified" if land_status == "matches" else "open",+                "title": "Footprint compared with YAGEO's recommended land pattern" + ("" if land_status == "matches" else " (KiCad IPC pads differ from YAGEO's nominal)"),+                "scope": ["footprint"], "variants": ["*"], "checks": lck,+                "evidence": [{"label": "comparison drawing", "href": "land-pattern/land-pattern.png"}, {"label": "numbers", "href": "land-pattern/land-check.json"},+                             {"label": "write-up", "href": "land-pattern/README.md"}, {"label": "YAGEO Mounting p.4", "href": F("mount-p04-land.png")}],+                "files": {FP: sha(FP)}})+if code:+    mk_checks = [{"text": f"{P['marking']} ({P['marking_src']})", "result": "pass"},+                 {"text": f"the marked display copy {MARKED} adds the code {code} as a separate flat solid group (Adom.LaserEtch) 5 um above the top coat, reading along the long axis; the unmarked KiCad STEP is kept for board CAD", "result": "pass"},+                 {"text": "the code was derived from the EIA-96 table (value = 100 x 10^((n-1)/96), rounded); YAGEO's separate 'Chip resistors marking' sheet was not reachable to confirm it", "result": "note"},+                 {"text": "real parts may be placed either way round; the code's reading direction on a board is not fixed", "result": "note"},+                 {"text": "no AI-added part-number etch: the real marking is the identification shown", "result": "pass"}]+    mk_files = {MARKED: sha(MARKED), STEP: sha(STEP)}+else:+    mk_checks = [{"text": f"{P['marking']} ({P['marking_src']})", "result": "pass"},+                 {"text": "no AI-added part-number etch on any model (a 1.0 x 0.5 mm top has no room for a readable 15-character MPN)", "result": "pass"}]+    mk_files = {STEP: sha(STEP)}+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Marking" + (f": datasheet code {code} on the top coat" if code else ": the real part is unmarked"),+                "scope": ["3d-model", "marking"], "variants": ["*"], "checks": mk_checks,+                "evidence": [{"label": "datasheet p.3 Marking", "href": F("rc-p03-marking.png")}], "files": mk_files})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Board-use LOD GLBs are clean and share the STEP pose",+                "scope": ["lod"], "variants": ["*"],+                "checks": [{"text": "four levels written, read back, bounds equal the STEP (Z-up, metres, seat z = 0)", "result": "pass"},+                           {"text": "no footprint, pad outline, label or silkscreen helpers; terminals present at every level", "result": "pass"},+                           {"text": (f"marking code {code} kept in high and medium, omitted in low and super-low (unreadable there)" if code else "no marking at any level (the part has none)"), "result": "pass"},+                           {"text": "previews looked at by the AI agent, not yet by a person", "result": "note"}],+                "evidence": [{"label": "manifest", "href": "lod/manifest.json"}],+                "files": {lv["path"]: lv["sha256"] for lv in lod["levels"]}})+entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Pin 1, polarity and symbol",+                "scope": ["footprint", "3d-model", "symbol"], "variants": ["*"],+                "checks": [{"text": "non-polar two-terminal resistor: pads 1 and 2 are interchangeable; symbol pins 1 and 2 map to pads 1 and 2", "result": "pass"},+                           {"text": "symbol pin ends at (0, +5.08) and (0, -5.08) mm, on the 2.54 mm grid", "result": "pass"},+                           {"text": "symbol fields MPN, Manufacturer, Mouser, DigiKey, LCSC, Datasheet and Footprint filled", "result": "pass"},+                           {"text": "model terminals sit on the footprint pads (both centred on the origin, long axis on X)", "result": "pass"}],+                "evidence": [], "files": {FP: sha(FP), SYM: sha(SYM), STEP: sha(STEP)}})+if have_hero:+    entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Hero GLB built to the adom-hero standard",+                    "scope": ["3d-model", "hero"], "variants": ["*"],+                    "checks": [{"text": "built with component-hero hero_glb.py from package-reference.glb, the footprint and page.json; alignment check OK", "result": "pass"},+                               {"text": "teal dashed pad outlines (alpha 0.5), silkscreen (alpha 0.3) and pad-number labels 1 and 2 (alpha 0.5); no pin-1 dot because the part is non-polar", "result": "pass"},+                               {"text": "preview looked at by the AI agent; the live wiki viewer still needs a person's look", "result": "note"}],+                    "evidence": [{"label": "preview", "href": HERO_PNG}, {"label": "overlay record", "href": HERO_SIDE}],+                    "files": {HERO: sha(HERO), "package-reference.glb": sha("package-reference.glb")}})+if have_alt or have_lbr:+    fl = {f: sha(f) for f in (LBR, SCH, PCB, HUB) if ex(f)}+    entries.append({"date": TODAY, "by": by, "status": "verified", "title": "Fusion and Altium libraries generated from the KiCad symbol and footprint",+                    "scope": ["symbol", "footprint"], "variants": ["*"],+                    "checks": [{"text": "adom-lbr generate --part-metadata page.json: .lbr lint passed (MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN, LCSC_PN attributes)", "result": "pass"},+                               {"text": "adom-lbr import-kicad then assemble-altium --no-dedupe: native .SchLib and .PcbLib written, STEP body embedded (models.embedded 1); the KiCad fields carried as Altium parameters", "result": "pass"},+                               {"text": "not yet opened in Fusion or Altium (no desktop app used for this page)", "result": "note"}],+                    "evidence": [], "files": fl})+ver = {"schema": "adom/verification@1", "part": MPN, "variants": [], "entries": entries}+json.dump(ver, open(p_("verification.json"), "w"), indent=1)++# ---------------- models.json ----------------+MK = {"text": code, "surface": "top coat", "colour": "light grey on black"} if code else None+models = [+    {"path": STEP, "format": "step", "title": "Package model (STEP)", "status": "current", "slot": "step", "variant": "plain", "role": "derived",+     "use": ["board-cad"], "marking": None,+     "unique": "The board CAD model: KiCad library package geometry (bytes unchanged), checked against the datasheet table, " + ("unmarked" if code else "no marking (the part has none)"),+     "source": KICAD_SRC, "sha256": sha(STEP), "git_blob": blob(STEP), "bytes": os.path.getsize(p_(STEP)), "thumb": "docs/models/step-plain.png"},+]+if code:+    models.append({"path": MARKED, "format": "step", "title": f"Package model with marking {code} (STEP)", "status": "current", "slot": "step_marked", "variant": "etched",+                   "role": "derived", "use": ["render", "board-cad"], "marking": MK,+                   "unique": f"The same KiCad package plus the datasheet marking code {code} as a flat solid group on the top coat (step2glb laser-etch, flat mode)",+                   "derived_from": STEP, "source": KICAD_SRC + " + YAGEO marking code from the datasheet",+                   "sha256": sha(MARKED), "git_blob": blob(MARKED), "bytes": os.path.getsize(p_(MARKED)), "thumb": "docs/models/package-reference-step.png"})+models.append({"path": "package-reference.glb", "format": "glb", "title": "Package model (GLB)", "status": "current", "slot": "model_3d_plain", "variant": "plain", "role": "derived",+               "use": ["render", "board-insertion"], "marking": MK,+               "derived_from": MARKED or STEP, "unique": "Clean board-use model for viewers (step2glb), no footprint artwork" + (f", marking {code}" if code else ""),+               "source": KICAD_SRC, "sha256": sha("package-reference.glb"), "git_blob": blob("package-reference.glb"), "bytes": os.path.getsize(p_("package-reference.glb"))})+if have_hero:+    models.append({"path": HERO, "format": "glb", "title": "Hero model (GLB)", "status": "current", "slot": "model_3d", "variant": "hero", "role": "derived",+                   "use": ["wiki-hero"], "marking": MK, "derived_from": "package-reference.glb",+                   "unique": "The page's 3D view: the package plus teal dashed pad outlines, silkscreen and pad-number labels from the footprint (adom-hero standard)",+                   "source": "component-hero hero_glb.py", "sha256": sha(HERO), "git_blob": blob(HERO), "bytes": os.path.getsize(p_(HERO)), "thumb": HERO_PNG})+for lv in lod["levels"]:+    models.append({"path": lv["path"], "format": "glb", "title": f"Board LOD, {lv['level']}", "status": "current", "variant": "lod", "role": "derived",+                   "use": ["board-insertion", "render"], "marking": MK if lv["level"] in ("high", "medium") else None,+                   "derived_from": MARKED or STEP,+                   "unique": f"{lv['level']} detail for board and scaffold viewers: {lv['triangles']} triangles, {lv['primitives']} primitives",+                   "thumb": lv["preview"]["path"], "source": KICAD_SRC, "sha256": lv["sha256"], "git_blob": blob(lv["path"]), "bytes": lv["sizeBytes"]})+json.dump({"schema": "adom/models@1", "part": MPN, "models": models, "updated": TODAY}, open(p_("models.json"), "w"), indent=1)++# ---------------- LICENSE ----------------+open(p_("LICENSE"), "w").write(f"""{MPN} component page++Original Adom content on this page (README text, the KiCad symbol {SYM}, the+verification drawings, the JSON records and the scripts in provenance/tools/)+is licensed under the Creative Commons Attribution 4.0 International License+(CC-BY-4.0): https://creativecommons.org/licenses/by/4.0/++Third-party files keep their own terms and are not relicensed by this page:+- {FP} and {STEP} (and every model derived from it: {(MARKED + ', ') if MARKED else ''}package-reference.glb,+  {HERO}, lod/*.glb) are KiCad library content, CC-BY-SA 4.0 with the KiCad+  library exception ({GL}/kicad-footprints, {GL}/kicad-packages3D).+  The footprint geometry inside {LBR} and altium/{MPN}.PcbLib comes from the+  same KiCad footprint and keeps that license.+- The PDFs in docs/ and the page crops in docs/figures/ are YAGEO documents,+  copyright of their publisher, included unchanged (or cropped) for reference.+""")++# ---------------- README ----------------+spec_tbl = "| Parameter | Value | Datasheet |\n|---|---|---|\n" + "".join(f"| {a} | {b} | {c} |\n" for a, b, c in P["spec_rows"])+res_rows = [("Product page", P["product_url"]), ("Datasheet", f"{ds['title']}, [PDF]({ds['file']}) ([source]({ds['url']}))"),+            ("Mounting and land pattern", f"{MOUNT['title']}, [PDF]({MOUNT['file']}) ([source]({MOUNT['url']}))"),+            ("Marking and packing", "YAGEO's separate 'Chip resistors marking' and 'Chip resistors packing' sheets, named on p.3 and p.7 of the datasheet (not included here)")]+res_tbl = "| Resource | Link |\n|---|---|\n" + "".join(f"| {a} | {b} |\n" for a, b in res_rows)+dist_tbl = ("| Distributor | Part number | Stock seen " + TODAY + " |\n|---|---|---|\n"+            + "".join(f"| {n} | [{D[kk][0]}]({D[kk][1]}) | {D[kk][2]:,} |\n" for kk, n in (("mouser", "Mouser"), ("digikey", "DigiKey"), ("lcsc", "LCSC / JLCPCB"))))+notes = "".join(f"- {n}\n" for n in P["notes"])+fail_bits = ", ".join(f"{c['dim']} {c['model_mm']:.3f} mm (datasheet {c['datasheet_min']:.2f} to {c['datasheet_max']:.2f})" for c in check["checks"])+card_three = (f"The footprint is KiCad's standard `{P['fp']}`, and this guide lays its pads over YAGEO's recommended reflow land, at true scale. "+              + ("It matches YAGEO closely. " if land_status == "matches" else "KiCad's pads are shorter and wider than YAGEO's nominal land, and the guide shows by how much. ")+              + "Use it to decide whether to keep the KiCad pads or change them to YAGEO's numbers before layout.")+v_rated, v_pr = P["v_rated"], P["v_pr"]+if v_pr >= P["vmax"]:+    volt_para = (f"For this value the voltage limit governs, not power: sqrt(P x R) = sqrt({P['power']} W x {P['value']}) = {v_pr:.0f} V, "+                 f"so the {sz} size's maximum working voltage of **{P['vmax']} V** is the continuous limit. At {P['vmax']} V the resistor dissipates only "+                 f"{P['vmax'] ** 2 / P['ohms'] * 1000:.1f} mW. The maximum overload voltage is {P['vover']} V; the short time overload test applies "+                 f"{min(2.5 * v_rated, P['vover']):.0f} V for 5 s (p.9).")+else:+    volt_para = (f"For this value power governs: sqrt(P x R) = sqrt({P['power']} W x {P['value']}) = **{v_pr:.1f} V** continuous, below the {sz} size's "+                 f"{P['vmax']} V maximum working voltage. The maximum overload voltage is {P['vover']} V; the short time overload test applies "+                 f"{min(2.5 * v_rated, P['vover']):.0f} V for 5 s (p.9).")+mark_para = (f"YAGEO marks RC0603 1 % parts with the three-character EIA-96 code (p.3, Fig. 3). For {P['value']} the code is **{code}**: "+             f"{P['marking_short'].split('(')[1].rstrip(')')}. The code is printed light on the black top coat and may read either way round on a board."+             if code else "YAGEO does not mark RC0402 parts (p.3, Fig. 1): the top coat is plain.")+model_para = (f"No YAGEO STEP for this exact part number could be downloaded by plain HTTP: YAGEO's product pages build their CAD links in the "+              f"browser and expose no direct STEP link. The page therefore uses KiCad's library model for the package, `{P['fp']}.step`, with its "+              f"bytes unchanged, renamed `{STEP}`, after checking it against the datasheet table (next section). ")+if code:+    model_para += (f"Because the real part carries the marking {code}, a display copy `{MARKED}` adds that code as a flat solid group "+                   "(`Adom.LaserEtch`) 5 um above the top coat, made with the step2glb service's laser-etch endpoint; the body is untouched. "+                   "The GLB, the hero and the high and medium board LODs come from the marked copy; the unmarked STEP stays the board CAD file.")+else:+    model_para += "The part is unmarked, so the model shows a plain top coat."+hero_para = (f"""+The page viewer shows `{HERO}`: the clean model plus nonphysical reference artwork drawn under it to the adom-hero+standard (adom/component-hero): the footprint's pads as teal dashed outlines at 50 % opacity, its silkscreen at 70 %+transparency and the pad numbers 1 and 2 (the terminals have no names). The part is non-polar, so no pin-1 dot is added.+The artwork never goes into the STEP, `package-reference.glb` or the board LODs.++![Hero preview, top and oblique]({HERO_PNG})+""" if have_hero else "")+cad_rows = [(f"`{SYM}`", "KiCad symbol (standard resistor graphic, pins on the 2.54 mm grid) with MPN, Manufacturer, Mouser, DigiKey and LCSC fields"),+            (f"`{FP}`", f"KiCad footprint (KiCad library `{P['fp']}`, renamed; model path `${{KIPRJMOD}}/{STEP}`)")]+if have_lbr: cad_rows.append((f"`{LBR}`", "Fusion / EAGLE library made with `adom-lbr generate` (attributes MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN, LCSC_PN)"))+if have_alt: cad_rows.append((f"`{SCH}`, `{PCB}`", f"Altium symbol and footprint libraries (native binary) made with `adom-lbr import-kicad` and `assemble-altium` (the PcbLib embeds the STEP body); `{HUB}` is the adom-lbr hub record"))+cad_rows.append((f"`{STEP}`", "3D package model, STEP (KiCad library bytes)"))+if code: cad_rows.append((f"`{MARKED}`", f"3D package model with the marking {code}, STEP"))+cad_rows.append(("`package-reference.glb`", "3D package model, GLB (clean, for board viewers)"))+if have_hero: cad_rows.append((f"`{HERO}`", "the page's 3D view: package plus footprint pad outlines, silkscreen and pad labels"))+cad_rows.append(("`lod/`", "board-use GLBs in four levels of detail, with previews and manifest"))+cad_tbl = "| File | What it is |\n|---|---|\n" + "".join(f"| {a} | {b} |\n" for a, b in cad_rows)+fig_tbl = "| Figure | Source |\n|---|---|\n" + "".join(f"| [{f['caption']}]({f['file']}) | {f['document']}, p.{f['page']} |\n" for f in figs)++readme = f"""# {MPN}++YAGEO {MPN}: {P['brief']}. A general purpose thick film chip resistor from YAGEO's RC_L series.++::adom-verified{{src="/{OWNER}/{slug}/render/verification.json"}}++| Field | Value |+|---|---|+| Manufacturer | {P['mfr_full']} |+| Manufacturer part number | {MPN} |+| Type | {P['subcategory']} |+| Value | {P['value']} |+| Tolerance | {P['tol']} |+| Voltage | {P['voltage']}; {v_rated:.1f} V continuous at this value |+| {P['rating_row'][0]} | {P['rating_row'][1]} |+| Operating temperature | {P['op_temp']} |+| Package | {P['package']} |+| Marking | {P['marking_short']} |+| Datasheet | [{ds['title']}]({ds['file']}) |++## Key specifications++{spec_tbl}+All page numbers refer to the datasheet PDF in [docs/]({ds['file']}).++## Voltage rating++YAGEO rates the continuous working voltage as sqrt(P x R) or the maximum working voltage, whichever is less (p.7).+{volt_para}++![Datasheet p.5 Table 2](docs/figures/rc-p05-table2.png)++![Datasheet p.7 power rating and rated voltage](docs/figures/rc-p07-power-voltage.png)++## Notes++{notes}+## Ordering++{dist_tbl}+Stock figures are a snapshot from the Adom parts search on {TODAY}; check the distributor before ordering. Packaging code+R with reel code 07 is a 7 inch paper tape reel of {P['reel']:,} pieces (p.7 Table 4).++## Manufacturer and resources++{res_tbl}+## Pins++| Pin | Function |+|---|---|+| 1 | terminal (non-polar) |+| 2 | terminal (non-polar) |++A resistor has no polarity and no pin 1 orientation: either terminal may face either way.++## Marking++{mark_para}++![Datasheet p.3 Marking](docs/figures/rc-p03-marking.png)++## Land pattern: KiCad footprint vs YAGEO++<table>+<tr>+<td width="104"><a href="land-pattern/README.md"><img src="land-pattern/land-pattern-icon.png" width="112" alt="Land pattern"></a><br><sub>&nbsp;&nbsp;&nbsp;&nbsp;Land&nbsp;pattern&nbsp;&nbsp;&nbsp;&nbsp;</sub></td>+<td>{card_three}<br><br><a href="land-pattern/README.md">The comparison, with the numbers</a></td>+</tr>+</table>++## 3D model++{model_para}+{hero_para}+::adom-models{{src="/{OWNER}/{slug}/render/models.json"}}++## Model checked against the datasheet++The KiCad model was rendered in orthographic top, bottom, side and end views at true scale and laid over a drawing made+at the same scale from the printed table (nominal outline, tolerance limits, allowed terminal band). Every dimension is+inside the printed range: {fail_bits}. The model is Z-up, seated on z = 0, centred on the footprint origin, long axis on X.++![Model over the datasheet dimensions](docs/verify/{slug}-overlay.png)++Source: {ds['title']}, {P['dims_text']}.++## Board levels of detail++Clean board-use GLBs (no footprint pads, outlines, labels or silkscreen) in four levels, all in the same Z-up, metre,+footprint-origin pose as the STEP. {('The marking ' + code + ' shows in high and medium and is left out of low and super-low, where it cannot be read. ') if code else ''}Previews are rendered from each GLB.++::adom-component-lod{{src="/{OWNER}/{slug}/render/lod/manifest.json"}}++## CAD files++{cad_tbl}+## Datasheet figures++The pages this record cites, cropped from the PDFs:++{fig_tbl}+## Sources and license++- YAGEO: {ds['title']} ({ds['url']})+- YAGEO: {MOUNT['title']} ({MOUNT['url']})+- KiCad libraries: [{P['fp_lib']}.pretty/{P['fp']}.kicad_mod]({GL}/kicad-footprints/-/blob/master/{P['fp_lib']}.pretty/{P['fp']}.kicad_mod), [{P['fp_lib']}.3dshapes/{P['fp']}.step]({GL}/kicad-packages3D/-/blob/master/{P['fp_lib']}.3dshapes/{P['fp']}.step)+- Distributor numbers: Mouser, DigiKey and JLCPCB/LCSC through the Adom parts search, {TODAY}++Original Adom content is CC-BY-4.0. The KiCad footprint and 3D files keep their upstream license (CC-BY-SA 4.0 with the+KiCad library exception) and the PDFs remain YAGEO's documents; see [LICENSE](LICENSE).+[provenance.json](provenance.json) records every source and file hash; the scripts that built the checks are in `provenance/tools/`.++This is a catalog record for the part, not a manufacturing approval: check YAGEO's current datasheet for your design.+"""+readme = re.sub(r"\n{3,}", "\n\n", readme)+for bad in ("—", "–"):+    assert bad not in readme and bad not in land_readme, "dash in README"+open(p_("README.md"), "w").write(readme)++# ---------------- page.json / package.json ----------------+title = f"{MPN} - {P['mfr']}"+parts_ = {"symbol": SYM, "footprint": FP, "step": STEP, "model_3d": HERO if have_hero else "package-reference.glb",+          "model_3d_plain": "package-reference.glb", "datasheet": ds["file"]}+if have_lbr: parts_["lbr"] = LBR+if code: parts_["step_marked"] = MARKED+if have_alt: parts_.update({"altium_schlib": SCH, "altium_pcblib": PCB})+component = {+    "mpn": MPN, "manufacturer": P["mfr"], "package": P["package"], "category": P["category"], "subcategory": P["subcategory"],+    "pin_count": 2, "body_size": P["body_mm"],+    "value": P["value"], "tolerance": P["tol"], "rating": P["voltage"], "power": P["power_txt"] + " at 70 C",+    "max_working_voltage_v": P["vmax"], "max_overload_voltage_v": P["vover"], "continuous_voltage_at_value_v": round(v_rated, 1),+    "pins": [{"number": "1", "name": "~"}, {"number": "2", "name": "~"}],+    "parts": parts_,+    "manufacturer_links": {"product": P["product_url"], "datasheet_pdf": ds["url"], "mounting_pdf": MOUNT["url"]},+    "distributor_links": {kk: {"part": D[kk][0], "url": D[kk][1]} for kk in ("mouser", "digikey", "lcsc")},+    "marking": {"text": code, "statement": P["marking"], "source": P["marking_src"]},+    "provenance": {"model_3d": "KiCad library model, checked against the datasheet table" + (f"; marking {code} added from the datasheet" if code else ""),+                   "footprint": "KiCad standard library", "land_pattern_check": f"land-pattern/README.md ({land_status})", "omitted": []},+}+tags = ["hardware", "component", "passive", "resistor", sz, "yageo", "thick-film"]+triggers = [MPN, MPN.lower(), f"{P['value']} {sz} resistor", f"{P['value_sym']} {sz} 1%"]+eda = {"kicad": {"symbol": SYM, "footprint": FP, "model": STEP, "provenance": "generated"}}+if have_lbr: eda["fusion"] = {"lbr": LBR, "provenance": "generated"}+if have_alt: eda["altium"] = {"schlib": SCH, "pcblib": PCB, "provenance": "generated"}+page = {"slug": slug, "title": title, "eda_assets": eda, "type": "hardware", "kind": "component", "version": "0.1.0",+        "description": P["brief"], "brief": P["brief"], "tags": tags, "discovery_triggers": triggers, "dependencies": {},+        "license": "CC-BY-4.0", "hero": {"path": "docs/hero.png", "chrome": False},+        "component": component, "visibility": {"public": True}}+json.dump(page, open(p_("page.json"), "w"), indent=1)+pkg = {"name": slug, "title": title, "version": "0.1.0", "description": P["brief"], "type": "hardware", "kind": "component",+       "license": "CC-BY-4.0", "files": []}+json.dump(pkg, open(p_("package.json"), "w"), indent=1)++# ---------------- provenance.json (hashes of everything except itself) ----------------+files = {}+for dp, dn, fn in os.walk(OUT):+    for f in fn:+        rel = os.path.relpath(os.path.join(dp, f), OUT)+        if rel != "provenance.json":+            files[rel] = sha(rel)+finp = os.path.join(ROOT, "work", f"{slug}-finish.json")+fin = json.load(open(finp)) if os.path.exists(finp) else {}+prov = {+    "manufacturer_reference": P["product_url"],+    "symbol_source": "Original, written for this page (standard resistor graphic, non-polar, pin ends on the 2.54 mm grid). CC-BY-4.0.",+    "footprint_source": KICAD_FP_SRC + f"; renamed {P['fp']} -> {FP[:-10]}, model path set to ${{KIPRJMOD}}/{STEP}; copper unchanged",+    "footprint_upstream_sha256": hashlib.sha256(open(os.path.join(ROOT, "dl/kicad", P["fp"] + ".kicad_mod"), "rb").read()).hexdigest(),+    "footprint_upstream_url": f"{GL}/kicad-footprints/-/raw/master/{P['fp_lib']}.pretty/{P['fp']}.kicad_mod",+    "package_source": KICAD_SRC,+    "package_upstream_url": f"{GL}/kicad-packages3D/-/raw/master/{P['fp_lib']}.3dshapes/{P['fp']}.step",+    "package_upstream_sha256": hashlib.sha256(open(os.path.join(ROOT, "dl/kicad", P["fp"] + ".step"), "rb").read()).hexdigest(),+    "package_bytes_unchanged": True,+    "manufacturer_step": {"found": False, "searched": TODAY,+                          "note": f"The YAGEO product page ({P['product_url']}) was fetched by plain HTTP: it contains no STEP, STP or CAD-model link (its CAD links are built in the browser). No browser was used, so KiCad's library model was used and checked against the datasheet."},+    "geometry_status": "KiCad library package geometry, every printed dimension checked against the datasheet (docs/verify). Not manufacturer-issued CAD.",+    "marking": {"real_marking": code, "statement": P["marking"], "source": P["marking_src"],+                **({"display_step": MARKED, "tool": B["etch"]} if code else {})},+    "frame": {"units": "mm (STEP), metres (GLB)", "up_axis": "Z", "seat_z": 0, "origin": "footprint origin", "transform": "none"},+    "glb": {"tool": "step2glb convert", "source": MARKED or STEP, "exit": 0, "stderr_tail": B["glb_stderr"]},+    "hero_image": {"tool": "step2glb thumbnail --width 1600 --height 1000 (iso, 16:10)", "source": MARKED or STEP, "path": "docs/hero.png"},+    "hero_glb": fin.get("hero"),+    "fusion_lbr": fin.get("lbr"),+    "altium": fin.get("altium"),+    "datasheet": {"file": ds["file"], "sha256": sha(ds["file"]), "url": ds["url"], "title": ds["title"], "retrieved": TODAY},+    "supporting_documents": [{"file": MOUNT["file"], "sha256": sha(MOUNT["file"]), "url": MOUNT["url"], "title": MOUNT["title"], "retrieved": TODAY}],+    "datasheet_figures": figs,+    "datasheet_check": {"overlay": f"docs/verify/{slug}-overlay.png", "numbers": f"docs/verify/{slug}-check.json",+                        "tools": "provenance/tools/ (ortho.py, overlay_chip.py, spec json)", "result": "PASS" if check["all_pass"] else "FAIL"},+    "land_pattern_check": {"readme": "land-pattern/README.md", "numbers": "land-pattern/land-check.json", "source": L["source"], "result": land_status},+    "distributors": {"tool": "adom-parts-search search " + MPN, "date": TODAY,+                     **{kk: {"part": D[kk][0], "url": D[kk][1], "stock": D[kk][2]} for kk in ("mouser", "digikey", "lcsc")}},+    "lod": {"manifest": "lod/manifest.json", "generator": "provenance/tools/lod.py", "source": MARKED or STEP, "source_sha256": sha(MARKED or STEP)},+    "tools_note": ("Scripts come from the rc0402fr-074k7l page (adom/rc0402fr-074k7l). Changes for this page: the ortho.py end view and the lod.py iso "+                   "preview were mirror images (left-handed axes) and are corrected; lod.py keeps a datasheet marking in high and medium, drops it "+                   "in low and super-low, splits the terminal colour into two boxes and stops the body box under the top coat in super-low; "+                   "build.py puts the symbol pins on the 2.54 mm grid and adds the marking (etch.py) and the figure crops (figures.py); finish.py makes "+                   "the .lbr, the Altium libraries and the hero GLB."),+    "files": files,+    "files_note": "provenance.json itself is not listed.",+    "built_by": "Claude (AI agent) for John Lauer", "date": TODAY,+}+json.dump(prov, open(p_("provenance.json"), "w"), indent=1)+print("records written", slug, land_status, "hero" if have_hero else "-", "altium" if have_alt else "-", "lbr" if have_lbr else "-")
rc0402fr-0733kl-hero.glbadded
⋯ 1 unchanged line ⋯
rc0402fr-0733kl-hero.overlay.jsonadded+125
@@ -0,0 +1,125 @@+{+ "spec": "adom-hero 1.4",+ "mpn": "RC0402FR-0733KL",+ "kind": "component + footprint reference art",+ "board_use": false,+ "plane_z_mm": -0.02,+ "units": "metre",+ "upAxis": "Z",+ "layers": {+  "pad_outlines": {+   "material": "Footprint pads - teal dashed outlines - 50 percent opacity",+   "rgba": [+    0.0,+    0.902,+    0.863,+    0.5+   ],+   "pads": 2,+   "span_mm": 1.56,+   "dash_mm": 0.12,+   "gap_mm": 0.072,+   "pad_stroke_mm": 0.03+  },+  "silkscreen": {+   "material": "Silkscreen reference lines - 30 percent opacity",+   "rgba": [+    0.92,+    0.96,+    1.0,+    0.3+   ],+   "footprint_items": 2,+   "pin1": null+  },+  "signal_names": {+   "material": "Signal names - 50 percent opacity",+   "rgba": [+    0.92,+    0.96,+    1.0,+    0.5+   ],+   "font": "DejaVu Sans Mono",+   "labels": 2,+   "sides": "top + mirrored underside (single-sided)",+   "omitted": null,+   "fallback_to_pad_number": 2+  }+ },+ "align": {+  "ok": true,+  "centre_offset_mm": 0.0,+  "tolerance_mm": 0.25,+  "orientation_flipped": false,+  "contacts_bbox_mm": [+   -0.5,+   0.5,+   -0.25,+   0.25+  ],+  "pads_bbox_mm": [+   -0.78,+   0.78,+   -0.32,+   0.32+  ],+  "seating_z_mm": -0.0+ },+ "sources": {+  "glb": "package-reference.glb",+  "glb_sha256": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3",+  "footprint": "R_0402_1005Metric_RC0402FR-0733KL.kicad_mod",+  "footprint_sha256": "242f3a3163eb083e2cc58df4da995ddab3d506f17c39d1b8d75b3a7b42a53174",+  "pins": "page.json component.pins"+ },+ "generator": "factory/hero_glb.py",+ "labels": [+  {+   "pad": "1",+   "text": "1",+   "x": -0.88,+   "y": 0.0,+   "align": "right",+   "vertical": false,+   "h": 0.378+  },+  {+   "pad": "2",+   "text": "2",+   "x": 0.88,+   "y": 0.0,+   "align": "left",+   "vertical": false,+   "h": 0.378+  }+ ],+ "pads": [+  {+   "number": "1",+   "shape": "roundrect",+   "center_mm": [+    -0.51,+    0.0+   ],+   "size_mm": [+    0.54,+    0.64+   ],+   "rot": 0.0+  },+  {+   "number": "2",+   "shape": "roundrect",+   "center_mm": [+    0.51,+    0.0+   ],+   "size_mm": [+    0.54,+    0.64+   ],+   "rot": 0.0+  }+ ]+}\ No newline at end of file
verification.jsonadded+330
@@ -0,0 +1,330 @@+{+ "schema": "adom/verification@1",+ "part": "RC0402FR-0733KL",+ "variants": [],+ "entries": [+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent) for John Lauer",+    "handle": "john"+   },+   "status": "verified",+   "title": "3D model matches the datasheet package dimensions",+   "scope": [+    "3d-model"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "L: model 1.000 mm, datasheet 0.95 to 1.05 mm",+     "result": "pass"+    },+    {+     "text": "W: model 0.500 mm, datasheet 0.45 to 0.55 mm",+     "result": "pass"+    },+    {+     "text": "T/H: model 0.350 mm, datasheet 0.30 to 0.40 mm",+     "result": "pass"+    },+    {+     "text": "I1 (terminal on top): model 0.165 mm, datasheet 0.10 to 0.30 mm",+     "result": "pass"+    },+    {+     "text": "I2 (terminal on bottom): model 0.165 mm, datasheet 0.15 to 0.35 mm",+     "result": "pass"+    },+    {+     "text": "Z-up, seated on z = 0, centred on the footprint origin, long axis on X",+     "result": "pass"+    },+    {+     "text": "no YAGEO STEP is reachable by plain HTTP for this part number (the product page builds its CAD links in the browser); the model is KiCad's library package, bytes unchanged, checked against the datasheet table",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "overlay (top, bottom, side, end at true scale)",+     "href": "docs/verify/rc0402fr-0733kl-overlay.png"+    },+    {+     "label": "numbers",+     "href": "docs/verify/rc0402fr-0733kl-check.json"+    },+    {+     "label": "datasheet p.4 Table 1",+     "href": "docs/figures/rc-p04-dimensions.png"+    },+    {+     "label": "datasheet (YAGEO General Purpose Chip Resistors RC_L series, product specification V.14, Nov. 14, 2025)",+     "href": "docs/rc0402fr-0733kl-datasheet.pdf"+    }+   ],+   "files": {+    "RC0402FR-0733KL.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb",+    "docs/rc0402fr-0733kl-datasheet.pdf": "7b6f0ae72708ca4b38126f84b5407a3e970a94cb60bc1a0afdaeb25a23d839bb"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent) for John Lauer",+    "handle": "john"+   },+   "status": "verified",+   "title": "Footprint compared with YAGEO's recommended land pattern",+   "scope": [+    "footprint"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "gap between lands: KiCad 0.48 mm, YAGEO 0.50 mm (difference -0.02 mm)",+     "result": "pass"+    },+    {+     "text": "land length: KiCad 0.54 mm, YAGEO 0.50 mm (difference +0.04 mm)",+     "result": "pass"+    },+    {+     "text": "land width: KiCad 0.64 mm, YAGEO 0.60 mm (difference +0.04 mm)",+     "result": "pass"+    },+    {+     "text": "overall length: KiCad 1.56 mm, YAGEO 1.50 mm (difference +0.06 mm)",+     "result": "pass"+    }+   ],+   "evidence": [+    {+     "label": "comparison drawing",+     "href": "land-pattern/land-pattern.png"+    },+    {+     "label": "numbers",+     "href": "land-pattern/land-check.json"+    },+    {+     "label": "write-up",+     "href": "land-pattern/README.md"+    },+    {+     "label": "YAGEO Mounting p.4",+     "href": "docs/figures/mount-p04-land.png"+    }+   ],+   "files": {+    "R_0402_1005Metric_RC0402FR-0733KL.kicad_mod": "242f3a3163eb083e2cc58df4da995ddab3d506f17c39d1b8d75b3a7b42a53174"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent) for John Lauer",+    "handle": "john"+   },+   "status": "verified",+   "title": "Marking: the real part is unmarked",+   "scope": [+    "3d-model",+    "marking"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "YAGEO states 'No Marking' for RC0402 (Fig. 1) (RC_L product specification V.14, p.3 'Marking')",+     "result": "pass"+    },+    {+     "text": "no AI-added part-number etch on any model (a 1.0 x 0.5 mm top has no room for a readable 15-character MPN)",+     "result": "pass"+    }+   ],+   "evidence": [+    {+     "label": "datasheet p.3 Marking",+     "href": "docs/figures/rc-p03-marking.png"+    }+   ],+   "files": {+    "RC0402FR-0733KL.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent) for John Lauer",+    "handle": "john"+   },+   "status": "verified",+   "title": "Board-use LOD GLBs are clean and share the STEP pose",+   "scope": [+    "lod"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "four levels written, read back, bounds equal the STEP (Z-up, metres, seat z = 0)",+     "result": "pass"+    },+    {+     "text": "no footprint, pad outline, label or silkscreen helpers; terminals present at every level",+     "result": "pass"+    },+    {+     "text": "no marking at any level (the part has none)",+     "result": "pass"+    },+    {+     "text": "previews looked at by the AI agent, not yet by a person",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "manifest",+     "href": "lod/manifest.json"+    }+   ],+   "files": {+    "lod/high.glb": "937b453eb265ddd04ca7a8c8304011d48f266ea8480694ebc583239a0d7cadba",+    "lod/medium.glb": "f1a1e14478c0215d3650a8778ea37ac93f54a7c3d374c4746fa9c73f360173af",+    "lod/low.glb": "d37b55a8dfb67f15b654633a1aae33e2650ddf5c0f4a777162d6dfb02f6f17d0",+    "lod/super-low.glb": "67a651d5d26113d4f0178bcf5805d1b785a8a0a863e16285ac4e72402a8e7fef"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent) for John Lauer",+    "handle": "john"+   },+   "status": "verified",+   "title": "Pin 1, polarity and symbol",+   "scope": [+    "footprint",+    "3d-model",+    "symbol"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "non-polar two-terminal resistor: pads 1 and 2 are interchangeable; symbol pins 1 and 2 map to pads 1 and 2",+     "result": "pass"+    },+    {+     "text": "symbol pin ends at (0, +5.08) and (0, -5.08) mm, on the 2.54 mm grid",+     "result": "pass"+    },+    {+     "text": "symbol fields MPN, Manufacturer, Mouser, DigiKey, LCSC, Datasheet and Footprint filled",+     "result": "pass"+    },+    {+     "text": "model terminals sit on the footprint pads (both centred on the origin, long axis on X)",+     "result": "pass"+    }+   ],+   "evidence": [],+   "files": {+    "R_0402_1005Metric_RC0402FR-0733KL.kicad_mod": "242f3a3163eb083e2cc58df4da995ddab3d506f17c39d1b8d75b3a7b42a53174",+    "RC0402FR-0733KL.kicad_sym": "90937c1a36ef828412cc7dadd03cdcf51258c630ec214d45526fe6e5ced2f236",+    "RC0402FR-0733KL.step": "91507e5af4251cb4ef38e04889c9b98da29904432bd83786bba13ae9b605eacb"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent) for John Lauer",+    "handle": "john"+   },+   "status": "verified",+   "title": "Hero GLB built to the adom-hero standard",+   "scope": [+    "3d-model",+    "hero"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "built with component-hero hero_glb.py from package-reference.glb, the footprint and page.json; alignment check OK",+     "result": "pass"+    },+    {+     "text": "teal dashed pad outlines (alpha 0.5), silkscreen (alpha 0.3) and pad-number labels 1 and 2 (alpha 0.5); no pin-1 dot because the part is non-polar",+     "result": "pass"+    },+    {+     "text": "preview looked at by the AI agent; the live wiki viewer still needs a person's look",+     "result": "note"+    }+   ],+   "evidence": [+    {+     "label": "preview",+     "href": "docs/verify/hero-preview.png"+    },+    {+     "label": "overlay record",+     "href": "rc0402fr-0733kl-hero.overlay.json"+    }+   ],+   "files": {+    "rc0402fr-0733kl-hero.glb": "ecd12e887d36afdf5b5d71b359abc14f5559acff956b4db489d4d7553a6dec83",+    "package-reference.glb": "e0f0a1b3f86b307421456f2e9945d22b4d3e222a7ec62e602fc97c5e6a7f34c3"+   }+  },+  {+   "date": "2026-10-21",+   "by": {+    "name": "Claude (AI agent) for John Lauer",+    "handle": "john"+   },+   "status": "verified",+   "title": "Fusion and Altium libraries generated from the KiCad symbol and footprint",+   "scope": [+    "symbol",+    "footprint"+   ],+   "variants": [+    "*"+   ],+   "checks": [+    {+     "text": "adom-lbr generate --part-metadata page.json: .lbr lint passed (MPN, MANUFACTURER, MOUSER_PN, DIGIKEY_PN, LCSC_PN attributes)",+     "result": "pass"+    },+    {+     "text": "adom-lbr import-kicad then assemble-altium --no-dedupe: native .SchLib and .PcbLib written, STEP body embedded (models.embedded 1); the KiCad fields carried as Altium parameters",+     "result": "pass"+    },+    {+     "text": "not yet opened in Fusion or Altium (no desktop app used for this page)",+     "result": "note"+    }+   ],+   "evidence": [],+   "files": {+    "RC0402FR-0733KL.lbr": "743fe29cb17bc8b2b7bd1ffb2065ab10c72cdf88e2abc6a9e71b8a2b4f308fbb",+    "altium/RC0402FR-0733KL.SchLib": "b2bfe1a45b7d703533b0362284a83835e7c57afbdc6d15516562ecb5546b5f42",+    "altium/RC0402FR-0733KL.PcbLib": "55b89e4781a382eda765f2f7d2fdc17305c955aa2b2afa9560ad132e0be78302",+    "RC0402FR-0733KL.adom-lbr.json": "6e90f7d7e0ea41520f00ceda7e45b5bc11a5068833ff34b22b4a5e564cb01c2b"+   }+  }+ ]+}\ No newline at end of file